Permettre aux applications Web installées de devenir gestionnaires de fichiers

Enregistrer une application en tant que gestionnaire de fichiers avec le système d'exploitation

Maintenant que les applications Web peuvent lire et écrire des fichiers, l'étape logique suivante consiste à permettre aux développeurs de déclarer ces applications Web en tant que gestionnaires de fichiers pour les fichiers que leurs applications peuvent créer et traiter. C'est exactement ce que permet l'API File Handling. Après avoir enregistré une application d'édition de texte en tant que gestionnaire de fichiers et l'avoir installée, vous pouvez effectuer un clic droit sur un fichier .txt sous macOS, puis sélectionner "Get Info" (Obtenir des informations) pour indiquer au système d'exploitation qu'il doit toujours ouvrir les fichiers .txt avec cette application par défaut.

Suggestions de cas d'utilisation de l'API File Handling

Voici quelques exemples de sites susceptibles d'utiliser cette API:

  • Applications bureautiques telles que les éditeurs de texte, les applications de feuilles de calcul et les créateurs de diaporamas
  • Éditeurs graphiques et outils de dessin
  • Outils d'édition de niveau de jeu vidéo

Utiliser l'API File Handling

amélioration progressive

L'API File Handling ne peut pas être émulée. Toutefois, la fonctionnalité d'ouverture de fichiers avec une application Web peut être obtenue par deux autres moyens:

  • L'API Web Share Target permet aux développeurs de spécifier leur application en tant que cible de partage afin que les fichiers puissent être ouverts à partir de la feuille de partage du système d'exploitation.
  • L'API File System Access peut être intégrée au glisser-déposer des fichiers, afin que les développeurs puissent gérer les fichiers déposés dans l'application déjà ouverte.

Prise en charge des navigateurs

Navigateurs pris en charge

  • 102
  • 102
  • x
  • x

Source

Détection de fonctionnalités

Pour vérifier si l'API File Handling est compatible, utilisez:

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

La partie déclarative de l'API File Handling

Dans un premier temps, les applications Web doivent décrire de manière déclarative dans leur fichier manifeste d'application Web les types de fichiers qu'elles peuvent gérer. L'API File Handling étend le fichier manifeste de l'application Web avec une nouvelle propriété appelée "file_handlers", qui accepte un tableau de gestionnaires de fichiers. Un gestionnaire de fichiers est un objet possédant les propriétés suivantes:

  • Une propriété "action" qui pointe vers une URL comprise dans le champ d'application de l'application comme valeur.
  • Une propriété "accept" avec un objet de type MIME en tant que clés et des listes d'extensions de fichier comme valeurs.
  • Une propriété "icons" avec un tableau d'icônes ImageResource. Certains systèmes d'exploitation autorisent une association de type de fichier pour afficher une icône qui n'est pas seulement l'icône de l'application associée, mais plutôt une icône spéciale liée à l'utilisation de ce type de fichier avec l'application.
  • Une propriété "launch_type" qui définit si plusieurs fichiers doivent être ouverts dans un seul client ou dans plusieurs clients. La valeur par défaut est "single-client". Si l'utilisateur ouvre plusieurs fichiers et si le gestionnaire de fichiers a été annoté avec "multiple-clients" comme "launch_type", plusieurs lancements d'applications auront lieu. Pour chaque lancement, le tableau LaunchParams.files ne contiendra qu'un seul élément.

L'exemple ci-dessous, qui n'affiche que l'extrait pertinent du fichier manifeste de l'application Web, devrait être plus clair:

{
  "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"
    }
  ]
}

Il s'agit d'une application hypothétique qui gère des fichiers de valeurs séparées par des virgules (.csv) dans /open-csv, des fichiers de graphiques vectoriels évolutifs (.svg) à /open-svg et un format de fichier Grafr inventé avec l'extension .grafr, .graf ou .graph comme extension à /open-graf. Les deux premiers s'ouvriront dans un seul client, et le dernier dans plusieurs clients si plusieurs fichiers sont traités.

La partie impérative de l'API File Handling

Maintenant que l'application a déclaré les fichiers qu'elle peut gérer et les URL couvertes en théorie, elle doit, dans la pratique, effectuer une action impérative avec les fichiers entrants. C'est là que launchQueue entre en jeu. Pour accéder aux fichiers lancés, un site doit spécifier un consommateur pour l'objet window.launchQueue. Les lancements sont mis en file d'attente jusqu'à ce qu'ils soient gérés par le client spécifié, qui est appelé exactement une fois pour chaque lancement. De cette manière, chaque lancement est géré, quelle que soit la date à laquelle le client a été spécifié.

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.
    }
  });
}

Compatibilité avec les outils de développement

Pour le moment, aucune assistance n'est proposée pour les outils de développement, mais j'ai envoyé une demande de fonctionnalité.

Démonstration

J'ai ajouté une assistance pour la gestion des fichiers dans Excalidraw, une application de dessin de style dessin animé. Pour la tester, vous devez d'abord installer Excalidraw. Lorsque vous créez ensuite un fichier avec ce fichier et que vous le stockez quelque part dans votre système de fichiers, vous pouvez l'ouvrir via un double-clic ou un clic droit, puis sélectionner "Excalidraw" dans le menu contextuel. Vous pouvez vérifier l'implémentation dans le code source.

Fenêtre de l'outil de recherche macOS avec un fichier Excalidraw.
Double-cliquez ou effectuez un clic droit sur un fichier dans l'explorateur de fichiers de votre système d'exploitation.
Menu contextuel qui s'affiche lorsque vous effectuez un clic droit sur un fichier avec l'élément "Ouvrir avec... Excalidraw" mis en évidence
Excalidraw est le gestionnaire de fichiers par défaut pour les fichiers .excalidraw.

Sécurité

L'équipe Chrome a conçu et mis en œuvre l'API File Handling en appliquant les principes fondamentaux définis dans le guide Contrôler l'accès aux fonctionnalités puissantes de la plate-forme Web, comme le contrôle utilisateur, la transparence et l'ergonomie.

Mises à jour des autorisations, persistance des autorisations et gestionnaires de fichiers

Pour garantir la confiance des utilisateurs et la sécurité de leurs fichiers, lorsque l'API File Handling ouvre un fichier, une invite d'autorisation s'affiche avant qu'une PWA ne puisse l'afficher. Cette invite d'autorisation s'affiche dès que l'utilisateur sélectionne la PWA pour ouvrir un fichier. L'autorisation est ainsi étroitement liée à l'ouverture d'un fichier à l'aide de la PWA, ce qui la rend plus compréhensible et pertinente.

Cette autorisation s'affiche à chaque fois que l'utilisateur clique sur Autoriser ou Bloquer pour le site, ou qu'il ignore l'invite trois fois (au-delà de ce délai, Chromium embargo et bloque cette autorisation). Le paramètre sélectionné sera conservé pendant la fermeture et la réouverture de la PWA.

Lorsque des mises à jour et des modifications du fichier manifeste dans la section "file_handlers" sont détectées, les autorisations sont réinitialisées.

Il existe une grande catégorie de vecteurs d'attaque qui sont ouverts en autorisant les sites Web à accéder aux fichiers. Celles-ci sont décrites dans l'article sur l'API File System Access. Par rapport à l'API File System Access, l'API File Handling offre une fonctionnalité pertinente en termes de sécurité. Elle permet d'accorder l'accès à certains fichiers via l'interface utilisateur intégrée au système d'exploitation, et non via un sélecteur de fichier affiché par une application Web.

Il existe toujours un risque que les utilisateurs puissent autoriser involontairement une application Web à accéder à un fichier en l'ouvrant. Cependant, il est communément admis que l'ouverture d'un fichier permet à l'application avec laquelle il est ouvert de le lire et/ou de le manipuler. Par conséquent, le choix explicite d'un utilisateur d'ouvrir un fichier dans une application installée, par exemple via un menu contextuel "Ouvrir avec", peut être considéré comme un signal suffisant de confiance dans l'application.

Questions d'authentification par défaut pour les gestionnaires

Il s'agit toutefois d'une exception à cette règle lorsqu'il n'existe aucune application sur le système hôte pour un type de fichier donné. Dans ce cas, certains systèmes d'exploitation hôtes peuvent automatiquement promouvoir le gestionnaire nouvellement enregistré en gestionnaire par défaut pour ce type de fichier en mode silencieux et sans aucune intervention de l'utilisateur. Cela signifie que si l'utilisateur double-clique sur un fichier de ce type, il s'ouvre automatiquement dans l'application Web enregistrée. Sur ces systèmes d'exploitation hôtes, lorsque le user-agent détermine qu'il n'existe pas de gestionnaire par défaut pour le type de fichier, une invite d'autorisation explicite peut être nécessaire pour éviter d'envoyer accidentellement le contenu d'un fichier à une application Web sans l'autorisation de l'utilisateur.

Contrôle des utilisateurs

La spécification indique que les navigateurs ne doivent pas enregistrer tous les sites pouvant gérer des fichiers en tant que gestionnaires de fichiers. L'enregistrement de la gestion des fichiers doit être restreint après l'installation et ne jamais avoir lieu sans confirmation explicite de l'utilisateur, en particulier si un site doit devenir le gestionnaire par défaut. Plutôt que de pirater des extensions existantes telles que .json pour lesquelles l'utilisateur a probablement déjà enregistré un gestionnaire par défaut, les sites devraient envisager de créer leurs propres extensions.

Transparence

Tous les systèmes d'exploitation permettent aux utilisateurs de modifier les associations de fichiers actuelles. Ceci est en dehors du champ d'application du navigateur.

Commentaires

L'équipe Chrome souhaite connaître votre avis sur votre expérience avec l'API File Handling.

Décrivez-nous la conception de l'API.

Y a-t-il quelque chose dans l'API qui ne fonctionne pas comme prévu ? Ou manque-t-il des méthodes ou des propriétés dont vous avez besoin pour mettre en œuvre votre idée ? Vous avez une question ou un commentaire sur le modèle de sécurité ?

  • Signalez un problème de spécification dans le dépôt GitHub correspondant ou ajoutez vos commentaires à un problème existant.

Signaler un problème d'implémentation

Avez-vous détecté un bug dans l'implémentation de Chrome ? Ou l'implémentation est-elle différente des spécifications ?

  • Signalez un bug sur new.crbug.com. Veillez à inclure autant de détails que possible, ainsi que des instructions simples pour reproduire le problème, puis saisissez UI>Browser>WebAppInstalls>FileHandling dans la zone Composants. Glitch est idéal pour partager des reproductions rapides et faciles.

Afficher la compatibilité avec l'API

Comptez-vous utiliser l'API File Handling ? Votre assistance publique aide l'équipe Chrome à prioriser les fonctionnalités et montre aux autres fournisseurs de navigateurs à quel point il est essentiel de les prendre en charge.

Liens utiles

Remerciements

L'API File Handling a été spécifiée par Eric Willigers, Jay Harris et Raymes Khoury. Cet article a été lu par Joe Medley.