Permissões persistentes para a API File System Access

Agora há uma maneira de ter acesso persistente de leitura e gravação a arquivos e pastas sem precisar conceder permissões repetidamente. Veja nesta postagem como esse recurso funciona. Antes de mergulhar nos detalhes, 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 como 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 executado diretamente no navegador. Ao abrir o VS Code, você recebe uma tela de boas-vindas, em que é possível criar um novo arquivo ou abrir um arquivo ou uma pasta existente.

Tela de boas-vindas do Visual Studio Code.

Se você clicar em Open Folder e escolher uma das pastas no seu disco rígido, o navegador vai perguntar se você quer que o VS Code tenha acesso de visualização a essa pasta.

Visual Studio Code solicitando acesso de leitura.

Depois de conceder 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.

Visual Studio Code solicitando acesso para editar.

Se você permitir isso, o ícone de arquivo na barra de endereço vai mudar e uma pequena seta para baixo 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. Assim, o app não poderá mais editar arquivos.

Visual Studio Code com solicitação de ícone na barra de endereço.

O acesso dura até você fechar a última guia da origem. Se você fechar o app e abri-lo novamente, o tipo do VS Code permitirá continuar de onde você parou. Ao clicar em Abrir Recentes, o VS Code oferece a pasta aberta anteriormente para reabertura.

O Visual Studio Code oferece os últimos arquivos abertos.

No entanto, mesmo que você já tenha concedido permissão de gravação à pasta anteriormente, agora é necessário conceder acesso novamente. Isso fica cansativo rápido demais. Antes de mergulhar na solução, ou seja, em permissões persistentes para a API File System Access, como o VS Code consegue lembrar as pastas recentes?

Visual Studio Code solicitando acesso para edição após recarregar.

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 é exatamente isso que o VS Code faz. Para isso, abra o Chrome DevTools. Na guia Aplicativo, navegue até a seção "IndexedDB" e selecione a tabela vscode-filehandles-store relevante no banco de dados vscode-web-db.

O Chrome DevTools depura o Visual Studio Code mostrando a seção IndexedDB com o FileSystemHandle armazenado.

A nova maneira: o que vai mudar e quando

O Chrome está lançando um novo comportamento para permitir que os usuários concedam acesso permanente aos arquivos e pastas, evitando a necessidade de perguntar novamente ao usuário constantemente. O novo comportamento pode ser observado a partir do Chrome 122. Para testar antes, a partir do Chrome 120, alterne as duas sinalizações chrome://flags/#file-system-access-persistent-permission e chrome://flags/#one-time-permission para Ativada.

Primeiro, o novo comportamento consiste em uma nova solicitação de permissão de três vias que permite que os usuários concedam aos apps acesso a arquivos e pastas selecionados em cada visita.

Visual Studio Code com solicitação de permissão de três vias.

Esse novo comando de três vias tem as seguintes opções:

  • Permitir este tempo:permite que o app tenha acesso aos arquivos da sessão atual. Isso corresponde ao comportamento existente.
  • Permitir em todos os acessos:permite que o app tenha acesso indefinido, a menos que o acesso seja revogado. Depois que o app recebe acesso persistente, os arquivos e as pastas recém-abertos também podem ser acessados de maneira permanente.
  • Não permitir:não permite que o app tenha acesso aos arquivos. Isso corresponde ao comportamento existente.

Em segundo lugar, o novo comportamento envolve uma nova seção nas configurações do site, que os usuários podem acessar usando um ícone de inicialização ao lado da opção Edição de arquivos.

Configurações do site do Visual Studio Code com o ícone de edição de arquivos.

Esse ícone de inicialização abre as configurações de Privacidade e segurança do app em questão. Nessa página, o usuário vê uma lista de itens de todos os arquivos e pastas a que o app tem acesso. O acesso pode ser revogado por item, clicando no ícone de lixeira. Remover o acesso por item significa que o app ainda pode receber acesso a arquivos em geral. Para revogar o acesso em geral, o usuário pode clicar no ícone na barra de endereço, conforme descrito anteriormente.

Configurações de privacidade e segurança do Chrome para o site vscode.dev.

Como acionar o novo comportamento

Não há mudanças para os desenvolvedores na API File System Access. Para acionar o novo comportamento com permissões persistentes, há três maneiras com diferentes condições prévias que precisam ser atendidas:

  1. O usuário precisa ter concedido permissão a um arquivo ou uma 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 objetos FileSystemHandle armazenados do IndexedDB e ter chamado o método FileSystemHandle.requestPermission(). Se essas condições prévias forem atendidas, a nova solicitação de três vias será exibida.
  2. A origem precisa ter chamado o método FileSystemHandle.requestPermission() em uma FileSystemHandle para a qual o acesso foi concedido antes, mas o acesso foi revogado automaticamente porque a guia está 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 condições prévias forem atendidas, a nova solicitação de três vias será exibida.
  3. O usuário precisa ter instalado o app. Os apps instalados vão manter as permissões automaticamente assim que o usuário conceder acesso. Nesse caso, o comando de três vias não será exibido. Em vez disso, o app receberá o novo comportamento por padrão.

No primeiro e no segundo casos, o prompt lista todos os objetos FileSystemHandle a que o app tinha acesso anteriormente, não apenas aquele a que o método requestPermission() está sendo chamado. De acordo com a forma como isso funciona nas permissões únicas, se o usuário negar ou dispensar a solicitação mais de três vezes, ela não mais será acionada, e a solicitação de permissão normal será exibida.

Testar o novo comportamento

Se você tiver uma versão com suporte do Chrome ou as sinalizações necessárias definidas, poderá testar o novo comportamento no VS Code na Web. Abra uma pasta e conceda acesso. Em seguida, feche a guia e a reabra e clique em Abrir recente. O recarregamento imediato não funciona para acionar o prompt. Todas as guias precisam ser fechadas. Escolha a pasta anterior para exibir o novo comando. Para um caso de teste mais reduzido, confira a demonstração do Acesso ao sistema de arquivos permanente e confira o código-fonte.

Conclusões

As permissões persistentes para a API File System Access são um dos recursos mais solicitados da API, e o bug de implementação também é altamente conhecido, e muitos desenvolvedores o marcam. Ao levar esse recurso às mãos dos desenvolvedores e principalmente dos usuários, uma lacuna de recursos importante em comparação com apps específicos da plataforma agora está resolvida.

Agradecimentos

Esta postagem foi revisada por Christine Hollingsworth, Austin Sullivan e Rachel Andrew.