Ahora hay una forma de obtener acceso de lectura y escritura persistente a archivos y carpetas sin tener que otorgar permisos de forma reiterada. En esta publicación, se explica cómo funciona. Antes de profundizar en los detalles, haz un breve resumen del statu quo y del problema que se resolverá.
Desafíos con el método actual
La API de File System Access permite que los desarrolladores accedan a los archivos del disco duro local del usuario de forma de lectura y, de manera opcional, de escritura. Una app popular (entre muchas otras) que usa esta API es Visual Studio Code (VS Code), el IDE de Microsoft que se ejecuta directamente en el navegador. Cuando abres VS Code, se muestra una pantalla de bienvenida en la que puedes crear un archivo nuevo o abrir un archivo o una carpeta existentes.
Si haces clic en Open Folder y eliges una de las carpetas de tu disco duro, el navegador te preguntará si quieres que VS Code tenga acceso de vista a esta carpeta.
Una vez que otorgues acceso, podrás navegar por la jerarquía de carpetas y abrir archivos en el editor de VS Code. Si realizas una modificación en alguno de los archivos, el navegador te preguntará si quieres otorgar acceso de edición a la carpeta.
Si lo permites, cambiará el ícono de archivo en la barra de direcciones y se agregará una pequeña flecha hacia abajo, lo que indica que la app tiene permisos de lectura y escritura. Para cambiar los permisos, haz clic en el ícono y, luego, en Quitar acceso, de modo que la app ya no pueda editar archivos.
El acceso dura hasta que cierras la última pestaña del origen. Si cierras la app y la vuelves a abrir, VS Code casi te permite continuar desde donde lo dejaste. Cuando haces clic en Open Recent, VS Code ofrece la carpeta abierta anteriormente para volver a abrirla.
Sin embargo, incluso si ya otorgaste permiso de escritura a la carpeta, ahora debes volver a otorgar acceso. Esto se vuelve agotador muy rápido. Antes de analizar la solución, es decir, los permisos persistentes para la API de File System Access, ¿cómo logra VS Code recordar las carpetas recientes?
En la API de File System Access, el acceso a los archivos y las carpetas se administra a través de objetos FileSystemHandle
: objetos FileSystemFileHandle
para archivos y objetos FileSystemDirectoryHandle
para carpetas (directorios). Ambos se pueden almacenar en IndexedDB, y eso es exactamente lo que hace VS Code. Para ver esto, abre las herramientas para desarrolladores de Chrome, en la pestaña Application, navega a la sección IndexedDB y selecciona la tabla relevante vscode-filehandles-store
en la base de datos vscode-web-db
.
La nueva forma de hacerlo: qué cambiará y cuándo
Chrome lanzará un nuevo comportamiento para permitir que los usuarios otorguen acceso permanente a sus archivos y carpetas de forma opcional, lo que evitará que se le solicite al usuario constantemente.
El nuevo comportamiento se puede observar a partir de Chrome 122. Para probarlo antes, a partir de Chrome 120, activa las dos marcas chrome://flags/#file-system-access-persistent-permission
y chrome://flags/#one-time-permission
en Habilitado.
En primer lugar, el nuevo comportamiento consiste en un nuevo mensaje de permiso de tres vías que, de manera opcional, permite que los usuarios otorguen a las apps acceso a archivos y carpetas seleccionados en cada visita.
Esta nueva instrucción de tres opciones tiene las siguientes opciones:
- Permitir esta vez: Permite que la app tenga acceso a los archivos de la sesión actual. (Esto corresponde al comportamiento existente).
- Permitir en cada visita: Permite que la app tenga acceso indefinido, a menos que se revoque. Una vez que se le otorgue acceso persistente a la app, también se podrá acceder de forma persistente a los archivos y carpetas que se abran recientemente.
- No permitir: No permite que la app tenga acceso a los archivos. (Esto corresponde al comportamiento existente).
En segundo lugar, el nuevo comportamiento implica una nueva sección en la configuración del sitio, a la que los usuarios pueden acceder a través de un ícono de inicio junto al botón de activación File editing.
Cuando se hace clic en este ícono de inicio, se abre la configuración de Privacidad y seguridad de la app en cuestión, en la que el usuario ve una lista de elementos de todos los archivos y carpetas a los que tiene acceso la app. Para revocar el acceso por elemento, haz clic en el ícono de la papelera. Quitar el acceso por elemento significa que la app aún puede obtener acceso a los archivos en general. Para revocar el acceso en general, el usuario puede hacer clic en el ícono de la barra de direcciones, como se describió anteriormente.
Cómo activar el nuevo comportamiento
No hay cambios para los desarrolladores en la API de File System Access. Para activar el comportamiento nuevo con permisos persistentes, hay tres formas con diferentes condiciones previas que se deben cumplir:
- El usuario debe haber otorgado permiso a un archivo o una carpeta (o varios archivos o carpetas) durante la última visita a un origen, y la app debe haber almacenado los objetos
FileSystemHandle
correspondientes en IndexedDB. En la próxima visita al origen, la app debe haber recuperado cualquiera de los objetosFileSystemHandle
almacenados de IndexedDB y, luego, haber llamado a su métodoFileSystemHandle.requestPermission()
. Si se cumplen estas condiciones previas, se mostrará el nuevo mensaje de tres opciones. - El origen debe haber llamado al método
FileSystemHandle.requestPermission()
en unFileSystemHandle
al que se le otorgó acceso antes, pero cuyo acceso se revocó automáticamente debido a que la pestaña se puso en segundo plano durante un tiempo. (La revocación automática de permisos funciona según la misma lógica que se describe en el artículo Permisos únicos en Chrome). Si se cumplen estas condiciones previas, se mostrará la nueva solicitud de tres opciones. - El usuario debe haber instalado la app. Las apps instaladas conservarán automáticamente los permisos una vez que el usuario otorgue acceso. En este caso, no se mostrará el mensaje de tres opciones, sino que la app obtendrá el comportamiento nuevo de forma predeterminada.
En el primer y el segundo caso, la instrucción enumera todos los objetos FileSystemHandle
a los que la app tenía acceso anteriormente, no solo el para el que se llama al método requestPermission()
. De acuerdo con la forma en que funciona en los permisos únicos, si el usuario rechaza o descarta la solicitud más de tres veces, ya no se activará y, en su lugar, se mostrará la solicitud de permiso normal.
Prueba el nuevo comportamiento
Si tienes una versión compatible de Chrome o tienes configuradas las marcas requeridas, puedes probar el nuevo comportamiento en VS Code en la Web. Abre una carpeta y otorga acceso. Luego, cierra la pestaña, vuelve a abrirla y haz clic en Abrir archivo reciente (ten en cuenta que la recarga inmediata no funciona para activar el mensaje, por lo que se deben cerrar todas las pestañas). Elige la carpeta anterior y se mostrará el mensaje nuevo. Para ver un caso de prueba más reducido, consulta la demo de acceso al sistema de archivos persistente y consulta su código fuente.
Conclusiones
Los permisos persistentes para la API de File System Access son una de las funciones más solicitadas de la API, y el error de implementación también es muy popular, y muchos desarrolladores lo marcan como favorito. Con la incorporación de esta función a las manos de los desarrolladores y, sobre todo, de los usuarios, se cerró una brecha importante en comparación con las apps específicas de la plataforma.
Agradecimientos
Esta publicación fue revisada por Christine Hollingsworth, Austin Sullivan y Rachel Andrew.