Gestire gli eventi con gli script in background

Le estensioni sono programmi basati sugli eventi utilizzati per modificare o migliorare l'esperienza di navigazione su Chrome. Eventi sono gli attivatori del browser, ad esempio l'accesso a una nuova pagina, la rimozione di un preferito o la chiusura di una scheda. Le estensioni monitorano questi eventi nello script in background, quindi reagiscono seguendo istruzioni specifiche.

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

  • L'estensione viene prima installata o aggiornata a una nuova versione.
  • La pagina in background stava ascoltando un evento, che 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 chiamare un'API Chrome o inviare una richiesta di rete. Inoltre, la pagina di sfondo non eseguire l'unload finché tutte le visualizzazioni visibili e tutte le porte dei messaggi non vengono chiuse. Tieni presente che l'apertura di una visualizzazione non causa il caricamento della pagina dell'evento, ma ne impedisce la chiusura una volta caricata.

Gli script in background efficaci rimangono inattivi fino a quando un evento sta ascoltando gli incendi. istruzioni specificate ed esegui l'unload.

Registra script in background

Gli script in background sono registrati nel file manifest nel campo "background". Sono elencato 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, fai riferimento a Migrazione in background Guida per istruzioni su come passare a un modello non persistente.

Inizializza l'estensione

Ascolta l'evento runtime.onInstalled per inizializzare un'estensione al momento dell'installazione. Usa questa per impostare uno stato o per un'inizializzazione una tantum, ad esempio un menu contestuale.

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

Configura i listener

Struttura gli script in background in base agli eventi da cui dipende l'estensione. Definizione di pertinenza funzionale consente agli script in background di rimanere inattivi fino a quando non vengono attivati dall'estensione mancante per gli 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 dagli script in background chiamando removeListener. Se tutte per 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 eventi per limitare i listener ai casi di interesse dell'estensione informazioni. Se un'estensione è in ascolto dell'evento tabs.onUpdated, prova a utilizzare lo webNavigation.onCompleted con filtri, in quanto l'API tabs non supporta filtri corretti.

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

Reagisci agli ascoltatori

I listener esistono 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 mantenuti periodicamente in modo che informazioni importanti non vadano perse se un'estensione si arresta in modo anomalo senza ricevere onSuspend. Per semplificare l'operazione, utilizza l'API storage.

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 eseguire l'unload finché tutte le porte dei messaggi non sono state chiuse. In ascolto dell'evento runtime.Port.onDisconnect. fornirà informazioni su quando le porte aperte verranno chiuse. 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 per l'estensione appare 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 "Attività responsabile".

Gli script in background vengono scaricati automaticamente dopo alcuni secondi di inattività. Se esegui una pulizia all'ultimo minuto rimanere in ascolto dell'evento runtime.onSuspend.

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

Tuttavia, è preferibile utilizzare i dati persistenti piuttosto che affidarsi a runtime.onSuspend. Non consentire tutta la pulizia necessaria e non sarà utile in caso di incidente.