Les service workers jouent un rôle essentiel dans l’architecture des applications modernes, en particulier pour les extensions de navigateurs et les applications web progressives (PWA). Leur capacité à fonctionner en arrière-plan permet de gérer efficacement des événements sans que l'utilisateur ait à interagir directement avec eux, offrant ainsi une expérience fluide et réactive.
Un service worker est un script autonome qui tourne en dehors du contexte d'une page web. Lorsqu'un événement se déclenche, le navigateur réveille le service worker, effectue un tour de boucle d'événements, puis envoie l'événement en file d'attente vers le worker. Si le gestionnaire d'événements n'est pas présent à la fin de ce tour, l'événement peut passer sans être traité. Ce fonctionnement asynchrone est crucial pour la gestion de la communication et des tâches en arrière-plan sans perturber l'interface utilisateur.
Les Différences entre les Service Workers pour Pages Web et Extensions
Bien que les service workers pour les pages web et ceux pour les extensions de navigateurs reposent sur la même infrastructure de base, leurs objectifs diffèrent largement. Les service workers de page web sont principalement conçus pour fonctionner comme un cache, permettant d'intercepter les requêtes réseau et de retourner des ressources mises en cache, optimisant ainsi la vitesse et les performances des applications web. Ils sont également indispensables pour la création d'applications web progressives (PWA), qui imitent le comportement des applications natives en offrant des fonctionnalités telles que l'installation, l'accès hors ligne et la réception de notifications push.
À l'inverse, les service workers pour les extensions de navigateur n'ont pas besoin de gérer des ressources à mettre en cache, car les scripts de l'extension sont toujours servis depuis le navigateur, sans passer par un serveur distant. Par conséquent, leur principale fonction réside dans la gestion des événements déclenchés par le navigateur et l'API WebExtensions. Cela inclut des événements relatifs à la gestion de l’interface utilisateur de l'extension ou des interactions avec d'autres parties du navigateur, comme les onglets et les fenêtres.
La Transition de Manifest V2 à Manifest V3
La mise à jour vers Manifest V3 a profondément modifié la manière dont les scripts de fond sont traités. Avant Manifest V3, les scripts de fond étaient des pages web "sans tête", fonctionnant en tant que pages JavaScript exécutées en continu dans le navigateur. Ces scripts pouvaient gérer des opérations longues et des requêtes web, et étaient capables de fonctionner de manière persistante tant que le navigateur était ouvert.
Avec Manifest V3, les scripts de fond ont été remplacés par des service workers, plus légers, mais également plus limités dans leurs capacités. En particulier, les service workers ne peuvent plus accéder au DOM, et de nombreuses API globales du navigateur sont désormais inaccessibles. Par exemple, l’absence d'accès au document et à l'objet window empêche toute interaction directe avec l’interface utilisateur, comme l’ouverture de nouvelles fenêtres ou la gestion du stockage local.
Limitations et Implications de la Nouvelle Architecture
Une des conséquences majeures du passage à Manifest V3 est la perte de la capacité de maintenir les service workers actifs indéfiniment. Auparavant, les pages de fond dans Manifest V2 pouvaient rester ouvertes tant que le navigateur était actif, mais cette fonctionnalité a été supprimée dans la nouvelle version. En conséquence, des méthodes telles que setTimeout() et setInterval() ne peuvent plus être utilisées de manière fiable, car si le service worker termine son exécution avant que la fonction programmée ne s'exécute, elle sera tout simplement ignorée.
De plus, les connexions réseau longues, telles que celles utilisées par les WebSockets ou les requêtes longues, risquent d’être interrompues si le service worker se termine avant que la connexion soit fermée. Ces limitations rendent nécessaire une révision des stratégies de gestion de l'arrière-plan, notamment l'utilisation de l'API chrome.alarms, bien que cette solution ne soit pas applicable pour des intervalles de temps de moins d'une minute.
Le Modèle de Service Worker pour les Extensions de Navigateur
Les extensions de navigateur sont de plus en plus basées sur des service workers pour exécuter des tâches en arrière-plan. Cependant, ces workers ne doivent pas gérer des ressources mises en cache comme c'est le cas pour les applications web. L'objectif principal est de répondre aux événements spécifiques de l'extension, comme les interactions avec les onglets, les messages entre les composants de l'extension, et la gestion des interactions avec le navigateur lui-même.
Les service workers sont désormais enregistrés via le manifeste de l'extension, sans avoir besoin d'être activés par un script de niveau page, contrairement aux service workers des pages web. Cette simplification a été rendue possible grâce à l’introduction de la configuration du fichier manifeste dans Manifest V3, où il suffit de définir le script background.service_worker.
Conclusion
Le passage à Manifest V3 a nécessité une adaptation importante des pratiques de développement, en particulier pour les extensions de navigateur. La transition d'un modèle de scripts de fond persistants à un modèle basé sur les service workers impose de repenser la manière dont les extensions gèrent les événements, les connexions réseau et les interactions avec l'interface utilisateur. Malgré les nouvelles limitations, cette architecture permet une gestion plus efficiente des ressources, tout en facilitant le développement d'applications modernes et performantes.
Comment fonctionnent les API des extensions de navigateur et pourquoi les permissions sont-elles essentielles ?
Les API des extensions de navigateur offrent un ensemble riche et varié de fonctionnalités permettant aux développeurs d’interagir profondément avec le navigateur et le système hôte. Par exemple, l’API Idle détecte l’état d’inactivité du système, offrant ainsi la possibilité d’adapter le comportement de l’extension en fonction de la disponibilité de l’utilisateur. Cette surveillance s’effectue par des requêtes périodiques (par exemple toutes les 30 secondes) et des écouteurs d’événements qui réagissent aux changements d’état.
L’API DevTools permet de créer des interfaces personnalisées directement intégrées aux outils de développement du navigateur. Ces interfaces disposent d’un accès privilégié à des API internes, offrant des capacités d’analyse avancée du trafic réseau ou de la structure des pages web. Par exemple, il est possible de construire des panneaux personnalisés qui surveillent les activités de navigation et permettent une interaction directe avec les données inspectées.
Les API d’introspection d’extension donnent accès aux informations internes de l’extension en cours, telles que ses vues ouvertes ou l’URL des composants, ce qui facilite la gestion dynamique des interfaces utilisateur. Parallèlement, l’API de gestion permet à une extension de contrôler son propre cycle de vie, incluant des opérations comme le rechargement automatique, la vérification des mises à jour, ou même sa propre désinstallation, tout en pouvant définir une URL à afficher à l’utilisateur après la suppression.
Les API système fournissent des informations détaillées sur l’ordinateur hôte, incluant la charge CPU, la mémoire disponible, l’état du stockage et les caractéristiques de l’affichage. Ces données, encapsulées dans des objets JavaScript, ouvrent la voie à des extensions capables d’adapter leur comportement en fonction des ressources système, optimisant ainsi la performance ou la consommation énergétique.
Il est important de noter que certaines API spécifiques sont restreintes à des environnements particuliers : les API « enterprise » pour les extensions installées par politique d’entreprise, celles réservées à Firefox, ou encore celles spécifiques à ChromeOS. Par ailleurs, certaines API sont désormais obsolètes et déconseillées à l’usage.
Un élément fondamental dans l’écosystème des extensions est la gestion des permissions. Tout comme les applications mobiles, les extensions doivent explicitement déclarer les permissions qu’elles requièrent dans leur manifeste. Cela vise à protéger l’utilisateur final en l’informant des capacités de l’extension et en limitant l’accès aux fonctionnalités sensibles. Les permissions triviales sont généralement accordées automatiquement, tandis que celles offrant un accès puissant exigent une approbation explicite de l’utilisateur.
Le choix des permissions influe directement sur la visibilité de l’extension dans les boutiques, sur le processus d’installation et de mise à jour, ainsi que sur le déroulement de la revue par les plateformes de distribution. Demander trop de permissions ou des permissions non justifiées peut entraîner un rejet ou un désintérêt des utilisateurs.
À titre d’exemple concret, une extension simple qui tente d’écrire dans le stockage synchronisé sans déclarer la permission adéquate provoquera une erreur d’exécution, car l’API correspondante ne sera pas accessible. L’extension continuera de charger, mais ses fonctionnalités dépendantes de cette API échoueront silencieusement, ce qui complique le débogage et dégrade l’expérience utilisateur.
Ainsi, la compréhension précise des API disponibles, de leurs restrictions d’usage et de la gestion rigoureuse des permissions est capitale pour développer des extensions robustes, respectueuses des utilisateurs et pleinement intégrées à leur environnement.
Il est essentiel de saisir que les permissions ne sont pas qu’une formalité technique : elles incarnent un compromis entre fonctionnalité et confiance. Une extension trop invasive perd rapidement sa crédibilité, tandis qu’une extension limitée par des permissions trop restrictives risque d’être inefficace. La maîtrise fine de ce paramètre est donc un art en soi, au cœur de la réussite d’un projet d’extension.
Comment l'authentification fonctionne dans les extensions Chrome et l'API WebRequest
L'authentification dans les extensions Chrome, en particulier lorsqu'elles interagissent avec des services tiers comme Firebase ou des fournisseurs OAuth tels que Google, Apple, ou SAML, implique des mécanismes spécifiques pour sécuriser les communications entre l'extension et les serveurs externes. Dans ce contexte, il est crucial que l'extension puisse charger des pages d'authentification dans un iframe invisible, permettant ainsi d'effectuer une authentification sans perturber l'expérience utilisateur.
Les documents hors écran (Offscreen Documents) sont essentiels pour cela, car ils permettent de charger une page d'authentification dans un iframe invisible, où le code externe est chargé et l'authentification est réalisée. Une fois l'authentification terminée, les résultats sont envoyés à l'extension. Cela signifie que l'extension doit disposer des autorisations appropriées pour accéder aux services externes comme Firebase, et la console Firebase doit être configurée en conséquence, en ajoutant l'ID de l'extension à la liste des domaines autorisés.
Dans le fichier manifest.json de l'extension, il est impératif d'ajouter des politiques de sécurité qui permettent à l'extension de communiquer avec les serveurs d'authentification Firebase, notamment par l'ajout des en-têtes de sécurité nécessaires dans le champ content_security_policy.
En ce qui concerne l'authentification avec des fournisseurs comme Google via OAuth, l'extension devra inclure des informations telles que l'ID client dans son manifest.json, et utiliser les API Firebase pour gérer le processus de connexion. Le code suivant, en utilisant l'API signInWithPopup, permet à l'extension de gérer l'authentification avec Google, par exemple, en déclenchant la connexion via une fenêtre contextuelle et en récupérant l'utilisateur connecté.
Cependant, il ne faut pas oublier que pour garantir que l'extension puisse fonctionner correctement avec Firebase et d'autres services d'authentification, l'extension doit d'abord être autorisée à interagir avec Firebase. Dans la console Firebase, il est nécessaire d'ajouter le domaine de l'extension à la section "Domaines autorisés". De plus, les politiques de sécurité de contenu (CSP) doivent être correctement configurées dans le fichier manifest.json pour permettre la communication avec les serveurs d'authentification externes.
En complément de l'authentification via OAuth, il est aussi possible d'implémenter des fonctionnalités avancées de gestion du réseau à l'aide de diverses API puissantes offertes aux extensions de navigateur. Ces API permettent d'intercepter et de modifier les requêtes réseau, ce qui peut être particulièrement utile pour des extensions de filtrage, telles que celles utilisées pour bloquer les publicités. Parmi les API les plus courantes, on trouve l'API webNavigation, qui permet de surveiller en détail les événements de navigation dans le navigateur, et l'API webRequest, qui offre la possibilité de modifier ou bloquer les requêtes réseau en temps réel.
L'API webNavigation permet aux extensions d'écouter et de réagir à des événements spécifiques du cycle de vie de la navigation dans le navigateur, tels que l'événement onBeforeNavigate ou onCompleted, qui peuvent être utilisés pour suivre les navigations dans les onglets du navigateur. Par exemple, une extension pourrait consigner chaque nouvelle URL visitée par un utilisateur dans la console de l'extension, ce qui est montré dans l'exemple suivant :
Et le fichier background.js suivant écoute les événements de navigation :
Le webRequest API va encore plus loin, permettant d'inspecter et de modifier les requêtes réseau. Cette API offre des événements comme onBeforeRequest, onSendHeaders, ou onCompleted, que l'on peut utiliser pour modifier ou bloquer des requêtes. Par exemple, une extension pourrait annuler une requête ou modifier les en-têtes de la requête avant qu'elle ne soit envoyée au serveur, offrant ainsi un contrôle total sur la communication réseau entre le navigateur et les sites web.
Cependant, il est important de noter que certaines fonctionnalités, comme le blocage des requêtes réseau via l'API webRequest, ne sont disponibles que dans les extensions Manifest V2. Avec l'introduction de Manifest V3, l'API webRequest a perdu certaines fonctionnalités, et des solutions alternatives comme declarativeNetRequest sont désormais utilisées, bien qu'elles soient moins puissantes.
Enfin, une compréhension approfondie des autorisations et des politiques de sécurité est essentielle pour garantir que l'extension respecte les meilleures pratiques en matière de sécurité, notamment la configuration des politiques de sécurité de contenu (CSP) dans le fichier manifest.json. Une erreur de configuration dans ce fichier pourrait exposer l'extension à des risques de sécurité, tels que des attaques par injection de scripts.
Quel impact la désinformation et les fake news ont-elles sur la démocratie ?
L’évaluation du TRL et les défis de l’adoption des technologies émergentes : le cas de l’hydrogène
Comment fonctionne une extension Chrome pour capturer des captures d'écran et gérer des mots de passe
Comment le savoir préalable des étudiants influence-t-il leur apprentissage ?

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский