Modules

Comparaison avec les extensions XUL/XPCOM

Cet article est une comparaison technique entre la technologie WebExtensions et les extensions "classiques" développées à l'aide de la manipulation XUL directe et de l'accès direct à XPCOM. Il est destiné à aider les personnes qui maintiennent un add-on comme celui-ci et qui envisagent de le porter en utilisant les API WebExtensions.

Cet article couvre à la fois les extensions de superposition et les extensions bootstrap, mais pas les extensions développées à l'aide du SDK Add-on. Pour le SDK Add-on, regarder la Comparaison avec les Add-on SDK.

A un niveau très basique, les extensions XUL/XPCOM sont similaires aux extensions développées avec WebExtensions. Ils incluent tous deux:

  • Les fichiers manifest définissant des métadonnées pour l'extension et certains aspects de son comportement.
  • Le code JavaScript qui accède à un ensemble d'API JavaScript privilégiées et qui reste chargé aussi longtemps que l'extension elle-même est activée.
  • La possibilité d'ajouter des éléments d'interface utilisateur spécifiques, tels que des boutons, au navigateur.

Cependant, au-delà de cela, les systèmes sont très différents. En particulier:

  • Par rapport aux extensions XUL/XPCOM, WebExtensions fournit des options beaucoup plus limitées pour l'interface utilisateur de l'extension, ainsi qu'un ensemble beaucoup plus restreint d'API JavaScript privilégiées.
  • WebExtensions ne peut accéder au contenu Web qu'en injectant des scripts distincts dans des pages Web et en les communiquant à l'aide d'une API de messagerie (notez que cela est également vrai des extensions XUL/XPCOM qui s'attendent à fonctionner avec le multiprocessus de Firefox).

Manifest

Les extensions XUL/XPCOM ont deux fichiers manifest :

  • l'install.rdf contient des métadonnées sur l'extension telles que son nom, ses icônes, etc.
  • Le chrome.manifest, qui indique à Firefox où trouver les composants de l'extension, y compris les superpositions XUL pour l'interface de l'extension, les scripts pour son comportement et les fichiers contenant des chaines localisées.

WebExtensions possède un fichier manifest unique appelé manifest.json, qui a un but similaire. Vous l'utilisez pour spécifier le nom de l'extension, la description, les icônes, etc., ainsi que pour spécifier les boutons ajoutés à Firefox et pour répertorier les scripts dont il a besoin pour son exécution. Pour obtenir un aperçu des composants d'une extension développée à l'aide des API WebExtensions, ainsi que la manière dont elles sont spécifiées dans le fichier manifest.json, voir "Anatomie d'une extension".

En apprendre plus

Interface Utilisateur

Les extensions XUL/XPCOM peuvent créer leur interface utilisateur en manipulant directement le XUL utilisé pour spécifier l'interface utilisateur du navigateur. Elles le font soit en utilisant des superpositions, soit via du code Javascript, dans le cas d'extensions bootstrapées/sans redémarrage, en modifiant le document XUL. Elles peuvent non seulement ajouter des éléments à l'interface utilisateur du navigateur, mais elles peuvent également modifier ou supprimer des éléments existants. De plus, elles peuvent utiliser des API telles que CustomizableUI.jsm pour créer leur interface utilisateur.

Les extensions construites avec les API WebExtensions n'obtiennent pas ce type d'accès direct. Au lieu de cela, une conbinaison de clés manifest.json et d'API JavaScript leur permet d'ajouter un ensemble limité de composants UI au navigateur. Les composants disponibles sont : 

Nom Description Utilisation spécifiée
Action du navigateur Bouton dans la barre d'outils du navigateur, avec un panneau contextuel facultatif

browser_action clé du  manifest

browserAction API

Action de la page Bouton dans la barre d'URL, avec un panneau contextuel facultatif.

page_action clé du manifest

pageAction API

Commandes Raccourcis clavier

commands clé du manifest

commands API

Menu contextuel Ajoute des éléments et des sous-menus au menu contextuel du navigateur contextMenus API

API Privilégiées

Les extensions XUL/XPCOM ainsi que celles créées avec les API WebExtensions peuvent contenir des scripts qui restent chargés tant que l'extension elle-même est activée et qui ont accès à un ensemble d'API privilgiées. Cependant, les extensions XUL/XPCOM accèdent à une gamme beaucoup plus large d'API.

Les scripts empaquetés avec les extensions XUL/XPCOM ont accès à l'ensemble complet des API XPCOM et des  modules de code JavaScript via l'objet Components. Ils ont également un accès direct aux éléments internes du navigateur à travers des globals comme gBrowser.

Les scripts WebExtensions équivalents sont appelés scripts d'arrière plan et ont accès à un ensemble beaucoup plus restreint d'API JavaScript de haut niveau. Pour voir toutes les API privilégiées disponibles pour les scripts d'arrière-plan, consultez la page d'API résumée. Les scripts d'arrière-plan disposent également d'un objet window global, avec tous les objets DOM disponibles dans une page Web normale.

Il y a bien plus d'API disponibles pour les extensions XUL/XPCOM que celles disponibles pour WebExtensions, et pour beaucoup d'API XUL/XPCOM, il n'y a pas de substitut WebExtensions. Le tableau ci-dessous répertorie l'ensemble des API populaires du module Services.jsm et décrit également ce que pourrait être l'équivalent d'API WebExtensions, s'il y en avait un.

Vous verrez que de nombreuses API n'ont pas encore d'équivalent WebExtensions. Cependant, nous avons l'intention d'étendre les API WebExtensions pour répondre aux besoins des développeurs de modules complémentaires, donc si vous avez des idées, nous aimerions les entendre. Vous pouvez nous joindre sur la liste de diffusion dev-addons ou  #webextensions sur IRC.

Services.jsm API WebExtensions equivalent
nsIAndroidBridge None
nsIXULAppInfo
nsIXULRuntime
None
nsIAppShellService None
nsIBlocklistService None
nsICacheService None
nsICacheStorageService None
nsIClipboard Partiel: voir l'API  clipboard, et  Interacting with the clipboard.
nsIConsoleService window.console
nsIContentPrefService None
nsICookieManager2 cookies
nsIMessageSender Content scripts
CrashManager.jsm None
nsIDirectoryService
nsIProperties
None
nsIDOMStorageManager None
nsIDOMRequestService None
nsIDownloadManager downloads
nsIDroppedLinkHandler None
nsIEventListenerService None
nsIEffectiveTLDService None
nsIFocusManager None
nsIIOService
nsIIOService2
None
nsILocaleService i18n
nsILoginManager None
nsIWinMetroUtils None
nsIMessageBroadcaster
nsIFrameScriptLoader
Content scripts
nsIObserverService None
nsIPermissionManager None
nsIMessageBroadcaster
nsIProcessScriptLoader
Content scripts
nsIPrefBranch
nsIPrefBranch2
nsIPrefService
See Settings.
nsIPromptService None
mozIJSSubScriptLoader None
nsIScriptSecurityManager None
nsIBrowserSearchService None
nsIAppStartup None
mozIStorageService storage
nsIStringBundleService i18n
nsIPropertyBag2 None
nsITelemetry None
nsIThreadManager None
nsIURIFixup None
nsIURLFormatter None
nsIVersionComparator None
nsIWindowMediator None
nsIWindowWatcher None

Apprendre encore plus

Intéragir avec le contenu web

Historiquement, les extensions XUL/XPCOM ont pu accéder directement au contenu Web. Par exemple, elles peuvent directement accéder et modifier la page DOM en utilisant gBrowser:

gBrowser.contentWindow.document.querySelector("h1").innerHTML = "yadda yadda";

Cependant, cela n'est possible que dans un seul processus Firefox. En multiprocesseur Firefox, le contenu Web et le code d'extension s'exécutent dans différents processus, donc cet accès direct n'est plus possible et les extensions qui s'appuient dessus ne vont plus fonctionner. Multiprocess Firefox arrive bientôt, et la compatibilité multiprocess sera une nécessité.

Les extensions XUL/XPCOM peuvent toujours interagir avec le contenu Web dans Firefox multiprocess en refactorant le code qui accède au contenu Web dans les scripts séparés appelés scripts de trame, et en utilisant le gestionnaire de messages pour communiquer avec les scripts. Mais ceci est complexe et peut impliquer des changements profonds au code de l'extension.

WebExtensions est compatible multiprocessus par défaut: le code qui interagit avec le contenu Web est factorisé en scripts distincts appelés scripts de conenu, qui peuvent communiquer avec le reste de l'extension à l'aide d'une API de messagerie.

Apprendre encore plus

Localisation

Dans une extension XUL/XPCOM, vous gérez la localisation en fournissant des DTD ou des propriétés pour chaque langue prise en charge et en vous y référant en utilisant des instructions locales dans le fichier chrome.manifest. Vous pouvez ensuite inclure des chaînes localisées dans les éléments de l'interface utilisateur ou dans le code.

L'approche générale avec WebExtensions est similaire, mais les détails sont tous différents. Avec WebExtensions, vous fournissez des chaînes localisées en tant que collection de fichiers JSON, une pour chaque paramètre régional.

Pour récupérer des chaînes localisées dans le code d'extension, utilisez l'API i18n.

WebExtensions n'a pas de support direct pour localiser les chaînes apparaissant en HTML, vous devez donc le faire vous-même, en utilisant JavaScript pour récupérer les chaînes localisées et remplacer le HTML par la version localisée.

Apprendre encore plus

Paramètres

Les extensions XUL/XPCOM stockent généralement les paramètres en utilisant le service de préférences XPCOM ou le système d'options inline.

Avec WebExtensions, vous écrivez un fichier HTML qui présente l'interface utilisateur des paramètres, qui peut inclure un script pour conserver les paramètres de votre extension. Le script accède à toutes les API WebExtensions et vous devez généralement utiliser l'API de stockage pour conserver les paramètres.

Vous affectez ensuite l'URL du fichier HTML à la clé options_ui dans  manifest.json. Votre page de paramètres apparaît ensuite dans l'entrée de l'extension dans le Gestionnaire de modules complémentaires. La page d'options peut également être ouverte par programmation avec un appel API à browser.runtime.openOptionsPage.

Notez que WebExtensions ne vous donne pas accès à l'API préférences, vous ne pouvez donc pas obtenir ou définir directement les préférences du navigateur.
Certaines préférences spécifiques au navigateur peuvent toutefois être contrôlées via l'API browser.browserSettings ou browser.privacy.

Apprendre encore plus

Étiquettes et contributeurs liés au document

Étiquettes : 
 Contributeurs à cette page : LaurentBarbareau, hellosct1
 Dernière mise à jour par : LaurentBarbareau,