Gestire gli eventi con gli script in background

Le estensioni sono programmi basati su eventi utilizzati per modificare o migliorare l'esperienza di navigazione in Chrome. Gli eventi sono attivatori del browser, come la navigazione in una nuova pagina, la rimozione di un preferito o la chiusura di una scheda. Le estensioni monitorano questi eventi nel proprio script in background, quindi reagiscono con istruzioni specificate.

Una pagina in background viene caricata quando è necessaria e scaricata quando è inattiva. Alcuni esempi di eventi includono:

  • Inizialmente l'estensione viene installata o aggiornata a una nuova versione.
  • La pagina in background stava ascoltando un evento e l'evento viene inviato.
  • Uno script di contenuti o un'altra estensione invia un messaggio.
  • Un'altra visualizzazione dell'estensione, ad esempio un popup, chiama runtime.getBackgroundPage.

Una volta caricata, una pagina in background rimane in esecuzione finché esegue un'azione, ad esempio chiama un'API di Chrome o invia una richiesta di rete. Inoltre, l'unload della pagina in background non viene eseguito finché tutte le visualizzazioni visibili e tutte le porte dei messaggi non vengono chiuse. Tieni presente che l'apertura di una vista non causa il caricamento della pagina dell'evento, ma ne impedisce solo la chiusura una volta caricata.

Gli script in background efficaci rimangono inattivi finché un evento non ascolta incendi, reagisce con le istruzioni specificate, quindi viene annullato.

Registra script in background

Gli script in background sono registrati nel manifest nel campo "background". Sono elencate in un array dopo la chiave "scripts" e "persistent" deve essere specificato come false.

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

È possibile registrare più script in background per il codice modularizzato.

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

Se al momento un'estensione utilizza una pagina in background permanente, consulta la Guida alla migrazione in background per istruzioni su come passare a un modello non persistente.

Inizializzare l'estensione

Ascolta l'evento runtime.onInstalled per inizializzare un'estensione al momento dell'installazione. Utilizza questo evento per impostare uno stato o per l'inizializzazione una tantum, ad esempio un menu di contesto.

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

Configura i listener

Struttura gli script in background intorno agli eventi da cui dipende l'estensione. La definizione di eventi pertinenti dal punto di vista funzionale consente agli script in background di rimanere inattivi fino a quando questi eventi non vengono attivati e impedisce all'estensione di perdere attivatori importanti.

I listener devono essere registrati in modo sincrono dall'inizio della pagina.

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

Non registrare i listener in modo asincrono poiché non verranno attivati correttamente.

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

Le estensioni possono rimuovere i listener dai propri script in background chiamando removeListener. Se tutti gli ascoltatori di un evento vengono rimossi, Chrome non caricherà più lo script in background dell'estensione per quell'evento.

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

Filtra eventi

Utilizza le API che supportano i filtri di eventi per limitare i listener ai casi che interessano all'estensione. Se un'estensione è in ascolto dell'evento tabs.onUpdated, prova a utilizzare l'evento webNavigation.onCompleted con i filtri, poiché l'API tabs non supporta i filtri.

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

Reagisci agli ascoltatori

Esistono dei listener per attivare la funzionalità dopo l'attivazione di un evento. Per reagire a un evento, struttura la reazione desiderata all'interno dell'evento listener.

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"'});
  };
});

Scarica script in background

I dati devono essere salvati periodicamente in modo che le informazioni importanti non vadano perse in caso di arresto anomalo di un'estensione senza ricevere onSuspend. Utilizza l'API storage per facilitare questa operazione.

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

Se un'estensione utilizza la trasmissione di messaggi, assicurati che tutte le porte siano chiuse. Lo script in background non verrà scaricato finché tutte le porte dei messaggi non saranno state chiuse. L'ascolto dell'evento runtime.Port.onDisconnect fornirà insight sul momento della chiusura delle porte aperte. Chiudili manualmente con 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 durata di uno script in background è osservabile monitorando quando una voce dell'estensione viene visualizzata e scompare dal Task Manager di Chrome.

ALT_TEXT_HERE

Apri Task Manager facendo clic sul menu Chrome, passando il mouse sopra altri strumenti e selezionando "Task Manager".

Gli script in background vengono scaricati automaticamente dopo alcuni secondi di inattività. Se è necessaria una pulizia dell'ultimo minuto, ascolta l'evento runtime.onSuspend.

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

Tuttavia, è preferibile utilizzare i dati persistenti rispetto a runtime.onSuspend. Non consente di eseguire la pulizia necessaria e non è utile in caso di arresto anomalo.