Gérer des événements à l'aide de scripts en arrière-plan

Les extensions sont des programmes basés sur des événements qui permettent de modifier ou d'améliorer l'expérience de navigation dans Chrome. Événements sont des déclencheurs du navigateur, tels que l'accès à une nouvelle page, la suppression d'un favori ou la fermeture d'un onglet. Les extensions surveillent ces événements dans leur script en arrière-plan, puis réagissent avec les instructions spécifiées.

Une page en arrière-plan est chargée lorsque cela est nécessaire, puis déchargée lorsqu'elle devient inactive. Quelques exemples de sont les suivants:

  • L'extension est d'abord installée ou mise à jour vers une nouvelle version.
  • La page en arrière-plan écoutait un événement, et celui-ci est envoyé.
  • Un script de contenu ou une autre extension envoie un message.
  • Une autre vue de l'extension, telle qu'un pop-up, appelle runtime.getBackgroundPage.

Une fois qu'elle a été chargée, une page en arrière-plan s'exécute tant qu'elle effectue une action, telles que l'appel d'une API Chrome ou l'émission d'une requête réseau. De plus, la page en arrière-plan ne déchargent pas tant que toutes les vues visibles et tous les ports de message ne sont pas fermés. Notez que l'ouverture d'une vue ne provoque pas le chargement de la page d'événement, mais l'empêche de se fermer après son chargement.

Les scripts efficaces en arrière-plan restent dormants jusqu'à ce qu'ils écoutent des incendies, réagissent les instructions spécifiées, puis décharger.

Enregistrer des scripts en arrière-plan

Les scripts d'arrière-plan sont enregistrés dans le fichier manifeste sous le champ "background". Il s'agit indiquée dans un tableau après la clé "scripts", et la valeur "persistent" doit être définie sur "false".

{
  "name": "Awesome Test Extension",
  ...
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  ...
}

Plusieurs scripts d'arrière-plan peuvent être enregistrés pour le code modularisé.

{
    "name": "Awesome Test Extension",
    ...
    "background": {
      "scripts": [
        "backgroundContextMenus.js",
        "backgroundOmniBox.js",
        "backgroundOauth.js"
      ],
      "persistent": false
    },
    ...
  }

Si une extension utilise actuellement une page persistante en arrière-plan, consultez la section Migration en arrière-plan Guide pour savoir comment passer à un modèle non persistant.

Initialiser l'extension

Écoutez l'événement runtime.onInstalled pour initialiser une extension lors de son installation. Utiliser ceci pour définir un état ou pour une initialisation unique, comme un menu contextuel.

chrome.runtime.onInstalled.addListener(function() {
  chrome.contextMenus.create({
    "id": "sampleContextMenu",
    "title": "Sample Context Menu",
    "contexts": ["selection"]
  });
});

Configurer des écouteurs

Structurez les scripts d'arrière-plan en fonction d'événements dont dépend l'extension. Définir la pertinence fonctionnelle permet aux scripts d'arrière-plan de rester inactifs jusqu'à ce que ces événements soient déclenchés et empêche des déclencheurs importants manquants.

Les écouteurs doivent être enregistrés de manière synchrone dès le début de la page.

chrome.runtime.onInstalled.addListener(function() {
  chrome.contextMenus.create({
    "id": "sampleContextMenu",
    "title": "Sample Context Menu",
    "contexts": ["selection"]
  });
});

// This will run when a bookmark is created.
chrome.bookmarks.onCreated.addListener(function() {
  // do something
});

N'enregistrez pas les écouteurs de manière asynchrone, car ils ne seront pas déclenchés correctement.

chrome.runtime.onInstalled.addListener(function() {
  // ERROR! Events must be registered synchronously from the start of
  // the page.
  chrome.bookmarks.onCreated.addListener(function() {
    // do something
  });
});

Les extensions peuvent supprimer des écouteurs de leurs scripts d'arrière-plan en appelant removeListener. Si tous d'un événement sont supprimés, Chrome ne charge plus le script d'arrière-plan de l'extension pour cet événement.

chrome.runtime.onMessage.addListener(function(message, sender, reply) {
    chrome.runtime.onMessage.removeListener(event);
});

Filtrer les événements

Utiliser des API compatibles avec les filtres d'événement pour limiter les écouteurs aux cas spécifiques traités par l'extension à propos. Si une extension écoute l'événement tabs.onUpdated, essayez d'utiliser la l'événement webNavigation.onCompleted avec des filtres, car l'API Tab n'est pas compatible avec des filtres.

chrome.webNavigation.onCompleted.addListener(function() {
    alert("This is my favorite website!");
}, {url: [{urlMatches : 'https://www.google.com/'}]});

Réagir aux auditeurs

Les écouteurs permettent de déclencher une fonctionnalité après le déclenchement d'un événement. Pour réagir à un événement, structurez la réaction souhaitée dans l'événement d'écouteur.

chrome.runtime.onMessage.addListener(function(message, callback) {
  if (message.data == "setAlarm") {
    chrome.alarms.create({delayInMinutes: 5})
  } else if (message.data == "runLogic") {
    chrome.tabs.executeScript({file: 'logic.js'});
  } else if (message.data == "changeColor") {
    chrome.tabs.executeScript(
        {code: 'document.body.style.backgroundColor="orange"'});
  };
});

Décharger les scripts en arrière-plan

Les données doivent être conservées régulièrement afin de ne pas perdre d'informations importantes en cas d'extension plante sans recevoir onSuspend. Pour vous faciliter la tâche, utilisez l'API storage.

chrome.storage.local.set({variable: variableInformation});

Si une extension utilise la transmission de messages, assurez-vous que tous les ports sont fermés. Le script en arrière-plan ne déchargent pas tant que tous les ports de message n'ont pas été fermés. Écouter l'événement runtime.Port.onDisconnect fournira des informations sur la fermeture des ports ouverts. Fermez-les manuellement avec runtime.Port.disconnect.

chrome.runtime.onMessage.addListener(function(message, callback) {
  if (message == 'hello') {
    sendResponse({greeting: 'welcome!'})
  } else if (message == 'goodbye') {
    chrome.runtime.Port.disconnect();
  }
});

La durée de vie d'un script en arrière-plan est observable en surveillant chaque entrée pour l'extension. s'affiche et disparaît du gestionnaire de tâches de Chrome.

ALT_TEXT_HERE

Ouvrez le gestionnaire de tâches en cliquant sur le menu Chrome, en pointant sur "Plus d'outils" et en sélectionnant "Tâche Gestionnaire".

Les scripts en arrière-plan se déchargent automatiquement après quelques secondes d'inactivité. Si un nettoyage de dernière minute est requis, écoutez l'événement runtime.onSuspend.

chrome.runtime.onSuspend.addListener(function() {
  console.log("Unloading.");
  chrome.browserAction.setBadgeText({text: ""});
});

Toutefois, il est préférable de conserver des données persistantes plutôt que d'utiliser runtime.onSuspend. Non permettre autant de nettoyage que nécessaire et ne vous aideront pas en cas de plantage.