Agora há uma maneira de ter acesso persistente de leitura e gravação a arquivos e pastas sem precisar conceder permissões repetidamente. Esta postagem explica como isso funciona. Antes de entrar em detalhes, vamos fazer uma rápida recapitulação do status quo e do problema que está sendo resolvido.
Desafios com o método atual
A API File System Access permite que os desenvolvedores acessem arquivos no disco rígido local do usuário para leitura e (opcionalmente) gravação. Um app conhecido (entre muitos outros) que usa essa API é o Visual Studio Code (VS Code), o ambiente de desenvolvimento integrado da Microsoft que é executado diretamente no navegador. Ao abrir o VS Code, você encontra uma tela de Boas-vindas, em que é possível criar um novo arquivo ou abrir um arquivo ou uma pasta.
Se você clicar em Open Folder e escolher uma das pastas do disco rígido, o navegador vai perguntar se você quer que o VS Code tenha acesso de leitura a essa pasta.
Depois de conceder o acesso, você pode navegar pela hierarquia de pastas e abrir arquivos no editor do VS Code. Se você fizer uma modificação em qualquer um dos arquivos, o navegador vai perguntar se você quer conceder acesso de edição à pasta.
Se você permitir isso, o ícone de arquivo na barra de endereço vai mudar, e uma pequena seta para baixo vai ser adicionada, indicando que o app tem permissões de leitura e gravação. Para mudar as permissões, clique no ícone e em Remover acesso para que o app não possa mais editar arquivos.
O acesso dura até você fechar a última guia da origem. Se você fechar o app e abri-lo novamente, o VS Code permite que você continue de onde parou. Ao clicar em Open Recent, o VS Code oferece a pasta aberta anteriormente para ser reaberta.
No entanto, mesmo que você tenha concedido permissão de gravação à pasta antes, agora é necessário conceder o acesso novamente. Isso cansa muito rápido. Antes de mergulhar na solução, ou seja, permissões persistentes para a API File System Access, como o VS Code consegue lembrar das pastas recentes?
Na API File System Access, o acesso a arquivos e pastas é gerenciado por
objetos
FileSystemHandle
:
objetos
FileSystemFileHandle
para arquivos e
objetos
FileSystemDirectoryHandle
para pastas (diretórios). Ambos podem ser
armazenados no IndexedDB,
e isso é exatamente o que o VS Code faz. Para conferir isso, abra o Chrome
DevTools e, na guia Application, navegue até a seção IndexedDB e
selecione a tabela vscode-filehandles-store
relevante no banco de dados
vscode-web-db
.
A nova maneira: o que está mudando e quando
O Chrome está lançando um novo comportamento para permitir que os usuários concedam acesso permanente
a arquivos e pastas, evitando a necessidade de pedir permissão constantemente.
O novo comportamento pode ser observado a partir do Chrome 122. Para testar antes, a partir
do Chrome 120, mude as duas flags
chrome://flags/#file-system-access-persistent-permission
e
chrome://flags/#one-time-permission
para Ativado.
Em primeiro lugar, o novo comportamento consiste em uma nova solicitação de permissão de três vias que permite que os usuários concedam acesso a apps a arquivos e pastas selecionados em cada visita.
Esse novo aviso tem as seguintes opções:
- Permitir desta vez:permite que o app tenha acesso aos arquivos da sessão atual. Isso corresponde ao comportamento atual.
- Permitir em todos os acessos:permite que o app tenha acesso indefinido, a menos que o acesso seja revogado. Depois que o app receber acesso persistente, os arquivos e pastas recém-abertos também poderão ser acessados de forma persistente.
- Não permitir:o app não tem acesso aos arquivos. Isso corresponde ao comportamento atual.
Em segundo lugar, o novo comportamento envolve uma nova seção nas configurações do site, que os usuários podem acessar por um ícone de inicialização ao lado do botão Editar arquivo.
Quando clicado, esse ícone de inicialização abre as configurações de Privacidade e segurança do app em questão, onde o usuário encontra uma lista de itens de todos os arquivos e pastas a que o app tem acesso. O acesso pode ser revogado para cada item clicando no ícone de lixeira. A remoção do acesso por item significa que o app ainda pode receber acesso aos arquivos em geral. Para revogar o acesso em geral, o usuário pode clicar no ícone na barra de endereço, conforme descrito anteriormente.
Como acionar o novo comportamento
Não há mudanças na API File System Access voltadas para desenvolvedores. Para acionar o novo comportamento com permissões persistentes, há três maneiras com condições diferentes que precisam ser atendidas:
- O usuário precisa ter concedido permissão a um arquivo ou pasta (ou vários
arquivos ou pastas) durante a última visita a uma origem, e o app precisa ter
armazenado os objetos
FileSystemHandle
correspondentes no IndexedDB. Na próxima visita à origem, o app precisa ter recuperado qualquer um dos objetosFileSystemHandle
armazenados do IndexedDB e ter chamado o métodoFileSystemHandle.requestPermission()
. Se essas pré-condições forem cumpridas, o novo prompt de três vias será mostrado. - A origem precisa ter chamado o método
FileSystemHandle.requestPermission()
em umaFileSystemHandle
a que o acesso foi concedido antes, mas que foi revogado automaticamente devido à guia ter ficado em segundo plano por um tempo. A revogação automática de permissões funciona com base na mesma lógica descrita no artigo Permissões únicas no Chrome. Se essas pré-condições forem atendidas, o novo comando de três vias será mostrado. - O usuário precisa ter instalado o app. Os apps instalados vão manter as permissões automaticamente depois que o usuário conceder o acesso. Nesse caso, a mensagem de três vias não será mostrada. Em vez disso, o app vai receber o novo comportamento por padrão.
No primeiro e no segundo caso, a solicitação lista todos os objetos FileSystemHandle
a que o app tinha acesso anteriormente, não apenas aquele para o qual o
método requestPermission()
está sendo chamado. De acordo com a
maneira como ela funciona em permissões únicas,
se o usuário negar ou dispensar a solicitação mais de três vezes, ela não será
mais acionada. Em vez disso, a solicitação de permissão normal será mostrada.
Testar o novo comportamento
Se você tiver uma versão compatível do Chrome ou tiver as flags necessárias definidas, teste o novo comportamento no VS Code na Web. Abra uma pasta e conceda acesso, feche a guia e abra de novo. Em seguida, clique em Abrir recentes. Observe que a recarga imediata não funciona para acionar o comando. Todas as guias precisam ser fechadas. Escolha a pasta anterior, e o novo comando vai aparecer. Para um caso de teste mais reduzido, confira a demonstração de acesso persistente ao sistema de arquivos e confira o código-fonte dela.
Conclusões
Permissões persistentes para a API File System Access são uma das recursos mais solicitados da API e o bug de implementação é altamente popular também, com muitos desenvolvedores estrelando-o. Ao disponibilizar esse recurso para desenvolvedores e, principalmente, para usuários, uma lacuna importante em relação aos apps específicos da plataforma foi fechada.
Agradecimentos
Esta postagem foi revisada por Christine Hollingsworth, Austin Sullivan e Rachel Andrew.