Permitir que las aplicaciones web instaladas sean controladores de archivos

Registra una app como controlador de archivos en el sistema operativo.

Ahora que las aplicaciones web son capaces de leer y escribir archivos, la siguiente lógica paso es permitir que los desarrolladores declaren estas aplicaciones web como controladores de archivos para los archivos que sus aplicaciones pueden crear y procesar. La API de File Handling te permite hacer exactamente esto. Después de registrar un mensaje de texto editor de archivos como controlador de archivos y, después de instalarla, puedes hacer clic con el botón derecho en un archivo .txt en macOS y selecciona "Obtener información" para indicarle al SO que siempre debe abrir los archivos .txt con esta app como de forma predeterminada.

Casos de uso sugeridos para la API de File Handling

Estos son algunos ejemplos de sitios que pueden usar esta API:

  • Aplicaciones de Office, como editores de texto, aplicaciones de hojas de cálculo y creadores de presentaciones de diapositivas.
  • Editores de gráficos y herramientas de dibujo
  • Herramientas del editor de niveles del videojuego

Cómo utilizar la API de File Handling

Mejora progresiva

La API de File Handling no puede tener polyfill. La funcionalidad de abrir archivos con un aplicación, se puede lograr a través de otros dos medios:

  • La API de Web Share Target permite que los desarrolladores especifiquen su app como objetivo de uso compartido para que los archivos se puedan abrir desde la hoja para compartir del sistema operativo.
  • La API de File System Access se puede integrar para arrastrar y soltar archivos, así que los desarrolladores pueden controlar los archivos descartados en la app ya abierta.

Navegadores compatibles

Navegadores compatibles

  • Chrome: 102.
  • Edge: 102.
  • Firefox: No es compatible.
  • Safari: no es compatible.

Origen

Detección de funciones

Para verificar si se admite la API de File Handling, usa lo siguiente:

if ('launchQueue' in window && 'files' in LaunchParams.prototype) {
  // The File Handling API is supported.
}

La parte declarativa de la API de File Handling

Como primer paso, las aplicaciones web deben describir de forma declarativa en su manifiesto de aplicaciones web. qué tipo de archivos pueden manejar. La API de File Handling extiende el manifiesto de la aplicación web con un nuevo llamada "file_handlers", que acepta un array de controladores de archivos. Un controlador de archivos es un objeto con estas propiedades:

  • Una propiedad "action" que dirige a una URL dentro del alcance de la app como su valor.
  • Una propiedad "accept" con un objeto de tipos MIME como claves y listas de extensiones de archivo como su de salida.
  • Una propiedad "icons" con un array de ImageResource íconos. Algunos sistemas operativos permiten que una asociación de tipo de archivo muestre un ícono que no es solo el icono de la aplicación asociada, sino un icono especial relacionado con el uso de ese tipo de archivo con la aplicación.
  • Una propiedad "launch_type" que define si se deben abrir varios archivos en un solo archivo o en varios clientes. El valor predeterminado es "single-client". Si el usuario abre varios archivos y si el controlador de archivos se ha anotado con "multiple-clients" como su "launch_type", se iniciará más de un inicio de app y, para cada inicio, el Array LaunchParams.files (consulta más abajo) solo tendrá un elemento.

El siguiente ejemplo, en el que se muestra solo el extracto relevante del manifiesto de la aplicación web, debería hacer que más clara:

{
  "file_handlers": [
    {
      "action": "/open-csv",
      "accept": {
        "text/csv": [".csv"]
      },
      "icons": [
        {
          "src": "csv-icon.png",
          "sizes": "256x256",
          "type": "image/png"
        }
      ],
      "launch_type": "single-client"
    },
    {
      "action": "/open-svg",
      "accept": {
        "image/svg+xml": ".svg"
      },
      "icons": [
        {
          "src": "svg-icon.png",
          "sizes": "256x256",
          "type": "image/png"
        }
      ],
      "launch_type": "single-client"
    },
    {
      "action": "/open-graf",
      "accept": {
        "application/vnd.grafr.graph": [".grafr", ".graf"],
        "application/vnd.alternative-graph-app.graph": ".graph"
      },
      "icons": [
        {
          "src": "graf-icon.png",
          "sizes": "256x256",
          "type": "image/png"
        }
      ],
      "launch_type": "multiple-clients"
    }
  ]
}

Esto es para una aplicación hipotética que controla archivos de valores separados por comas (.csv) en /open-csv, archivos de gráficos vectoriales escalables (.svg) en /open-svg y un formato de archivo Grafr inventado con cualquiera de .grafr, .graf o .graph como la extensión en /open-graf. Las dos primeras se abrirán en un solo cliente, el último en varios clientes si se administran varios archivos.

La parte imperativa de la API de File Handling

Ahora que la app declaró, en teoría, qué archivos puede controlar y en qué URL dentro del alcance, en teoría, debe hacer algo con los archivos entrantes en la práctica. Aquí es donde aparece launchQueue. en juego. Para acceder a los archivos que se lanzaron, un sitio debe especificar un consumidor para el window.launchQueue . Los lanzamientos se ponen en cola hasta que los maneja el consumidor especificado, que se invoca. exactamente una vez para cada lanzamiento. De esta manera, se controla cada lanzamiento, sin importar cuándo consumidor.

if ('launchQueue' in window && 'files' in LaunchParams.prototype) {
  launchQueue.setConsumer((launchParams) => {
    // Nothing to do when the queue is empty.
    if (!launchParams.files.length) {
      return;
    }
    for (const fileHandle of launchParams.files) {
      // Handle the file.
    }
  });
}

Compatibilidad con Herramientas para desarrolladores

No se brinda asistencia para Herramientas para desarrolladores en el momento en que se redactó este documento, pero expliqué un mensaje solicitud de función para que la asistencia agregado.

Demostración

Agregué la compatibilidad con el manejo de archivos a Excalidraw, una app de dibujo con estilo de dibujos animados. Para probarlo, primero debes instalar Excalidraw. Cuando creas un archivo con él y lo almacenas en algún lugar tu sistema de archivos, puedes abrir el archivo haciendo doble clic o haciendo clic con el botón derecho y, luego, seleccionar "Excalidraw" en el menú contextual. Puedes consultar la implementación en la fuente código.

La ventana del buscador de macOS con un archivo Excalidraw.
Haz doble clic o haz clic con el botón derecho en un archivo del explorador de archivos del sistema operativo.
El menú contextual que aparece cuando haces clic con el botón derecho en un archivo con el elemento Open with... Excalidraw destacado.
. Excalidraw es el controlador de archivos predeterminado para los archivos .excalidraw.

Seguridad

El equipo de Chrome diseñó e implementó la API de File Handling con los principios básicos definidos. en Cómo controlar el acceso a funciones potentes de la plataforma web, incluido el control del usuario, transparencia y ergonomía.

Permisos, persistencia de permisos y actualizaciones del controlador de archivos

Para garantizar la confianza de los usuarios y la seguridad de sus cuando la API de File Handling abre un archivo, se mostrará una solicitud de permiso antes de que la AWP pueda ver un archivo. Se mostrará esta solicitud de permiso justo después de que el usuario selecciona la AWP para abrir un archivo, de modo que el permiso esté estrechamente vinculado al de abrir un archivo con la AWP y hacerlo más comprensible y relevante.

Este permiso se mostrará siempre hasta que el usuario haga clic en Permitir o Bloquear el manejo de archivos. para el sitio o ignora el mensaje tres veces (después de lo cual, Chromium aplicará un embargo y bloqueará permiso). El parámetro de configuración seleccionado persistirá cuando la AWP se cierre y se vuelva a abrir.

Cuando se detectan actualizaciones y cambios del manifiesto en la sección "file_handlers", los permisos se restablecerá.

Existe una gran categoría de vectores de ataque que se abre permitiendo que los sitios web accedan a los archivos. Estos se detallan en el artículo sobre la API de File System Access. El capacidad adicional de seguridad pertinente que la API de File Handling proporciona a través del sistema de archivos La API de acceso es la capacidad de otorgar acceso a determinados archivos a través de la clave a través de un selector de archivos que muestra una aplicación web.

Aún existe el riesgo de que los usuarios otorguen accidentalmente acceso a un archivo a una aplicación web abriéndola. Sin embargo, se sabe generalmente que abrir un archivo permite que la aplicación sea abierto para leer o manipular ese archivo. Por lo tanto, la elección explícita del usuario de abrir un archivo en una aplicación instalada, por ejemplo, mediante una ventana "Abrir con..." menú contextual, se puede leer como una cantidad suficiente una señal de confianza en la aplicación.

Desafíos de los controladores predeterminados

La excepción se da cuando no hay aplicaciones en el sistema host para un tipo de archivo determinado. En En este caso, algunos sistemas operativos del host pueden promover automáticamente el controlador recién registrado al para ese tipo de archivo de forma silenciosa y sin intervención del usuario. De esta forma, si el usuario hace doble clic en un archivo de ese tipo, este se abrirá automáticamente en la aplicación web. En los sistemas operativos host, cuando el usuario-agente determina que no hay predeterminado para el tipo de archivo, puede ser necesaria una solicitud de permiso explícito para evitar enviar accidentalmente el contenido de un archivo a una aplicación web sin el consentimiento del usuario.

Control de usuarios

Las especificaciones establecen que los navegadores no deben registrar todos los sitios que pueden manejar archivos como archivos controlador. En su lugar, el registro del manejo de archivos debe estar restringido detrás de la instalación y nunca debe ocurrir. sin la confirmación explícita del usuario, especialmente si un sitio se convertirá en el controlador predeterminado. Antes que que usurpar extensiones existentes como .json, ya que es probable que el usuario ya tenga un controlador predeterminado se registraron, los sitios deberían considerar crear sus propias extensiones.

Transparencia

Todos los sistemas operativos permiten a los usuarios cambiar las asociaciones de archivos actuales. Esto está fuera del alcance del navegador.

Comentarios

El equipo de Chrome quiere conocer tu experiencia con la API de File Handling.

Cuéntanos sobre el diseño de la API

¿Algo en la API no funciona como esperabas? ¿O faltan métodos o propiedades que necesitas para implementar tu idea? Haz una pregunta o comentario sobre la seguridad modelo?

  • Informa un problema de especificaciones en el repositorio de GitHub correspondiente o agrega lo que piensas a un archivo problema.

Informar un problema con la implementación

¿Encontraste un error en la implementación de Chrome? ¿O la implementación es diferente de la especificación?

  • Informa un error en new.crbug.com. Asegúrate de incluir todos los detalles que instrucciones sencillas para reproducir e ingresa UI>Browser>WebAppInstalls>FileHandling en en el cuadro Componentes. Glitch funciona muy bien para compartir contenido de forma rápida y sencilla. repros.

Demuestra compatibilidad con la API

¿Planeas usar la API de File Handling? Tu asistencia pública ayuda al equipo de Chrome a prioriza funciones y muestra a otros proveedores de navegadores la importancia de admitirlas.

Vínculos útiles

Agradecimientos

Eric Willigers especificó la API de File Handling, Jay Harris y Raymes Khoury. Este artículo fue revisado por Joe Medley.