Administra eventos con secuencias de comandos en segundo plano

Las extensiones son programas basados en eventos que se usan para modificar o mejorar la experiencia de navegación de Chrome. Los eventos son activadores del navegador, como navegar a una página nueva, quitar un favorito o cerrar una pestaña. Las extensiones supervisan estos eventos en su secuencia de comandos en segundo plano y, luego, reaccionan con instrucciones específicas.

Una página en segundo plano se carga cuando es necesaria y se descarga cuando queda inactiva. Estos son algunos ejemplos de eventos:

  • La extensión se instala primero o se actualiza a una nueva versión.
  • La página en segundo plano estaba escuchando un evento y el evento se despacha.
  • Una secuencia de comandos de contenido u otra extensión envía un mensaje.
  • Otra vista de la extensión, como una ventana emergente, llama a runtime.getBackgroundPage.

Una vez cargada, una página en segundo plano permanecerá activa mientras realice una acción, como llamar a una API de Chrome o emitir una solicitud de red. Además, la página en segundo plano no se descargará hasta que se cierren todas las vistas visibles y todos los puertos de mensajes. Ten en cuenta que abrir una vista no hace que se cargue la página del evento, sino que solo evita que se cierre una vez cargada.

Las secuencias de comandos eficaces en segundo plano permanecen inactivas hasta que un evento en el que se escucha un incendio, reacciona con instrucciones especificadas y luego se descarga.

Registra secuencias de comandos en segundo plano

Las secuencias de comandos en segundo plano se registran en el manifiesto, en el campo "background". Se muestran en un array después de la clave "scripts", y "persistent" deben especificarse como falsas.

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

Se pueden registrar varias secuencias de comandos en segundo plano para el código modularizado.

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

Si una extensión usa actualmente una página en segundo plano persistente, consulta la Guía de migración en segundo plano para obtener instrucciones sobre cómo cambiar a un modelo no persistente.

Inicializa la extensión

Escucha el evento runtime.onInstalled para inicializar una extensión durante la instalación. Usa este evento para establecer un estado o una inicialización única, como un menú contextual.

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

Configura objetos de escucha

Estructura las secuencias de comandos en segundo plano en torno a los eventos de los que depende la extensión. La definición de eventos funcionalmente relevantes permite que las secuencias de comandos en segundo plano permanezcan inactivas hasta que esos eventos se activen y evita que la extensión pierda activadores importantes.

Los objetos de escucha deben registrarse de forma síncrona desde el comienzo de la página.

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

No registres los objetos de escucha de forma asíncrona, ya que no se activarán correctamente.

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

Las extensiones pueden quitar objetos de escucha de sus secuencias de comandos en segundo plano llamando a removeListener. Si se quitan todos los objetos de escucha de un evento, Chrome ya no cargará la secuencia de comandos en segundo plano de la extensión para ese evento.

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

Filtrar eventos

Usa APIs que admitan filtros de eventos para restringir los objetos de escucha a los casos que les interesan a la extensión. Si una extensión detecta el evento tabs.onUpdated, intenta usar el evento webNavigation.onCompleted con filtros, ya que la API de pestañas no admite filtros.

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

Cómo reaccionar a los objetos de escucha

Los objetos de escucha existen para activar la funcionalidad una vez que se activa un evento. Para reaccionar a un evento, estructura la reacción deseada dentro del evento del objeto de escucha.

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

Descargar secuencias de comandos en segundo plano

Los datos deben conservarse de forma periódica para que no se pierda información importante si una extensión falla sin recibir onSuspend. Usa la API de storage para ayudarte con esto.

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

Si una extensión usa la transmisión de mensajes, asegúrate de que todos los puertos estén cerrados. La secuencia de comandos en segundo plano no se descargará hasta que todos los puertos de mensajes se cierren. Escuchar el evento runtime.Port.onDisconnect ofrece información sobre cuándo se cierran los puertos abiertos. Ciérralos 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 vida útil de una secuencia de comandos en segundo plano se puede observar mediante la supervisión cuando una entrada de la extensión aparece y desaparece del Administrador de tareas de Chrome.

ALT_TEXT_HERE

Para abrir el administrador de tareas, haz clic en el menú de Chrome, desplázate sobre más herramientas y selecciona "Administrador de tareas".

Las secuencias de comandos en segundo plano se descargan de forma automática después de unos segundos de inactividad. Si se requiere alguna limpieza de último minuto, escucha el evento runtime.onSuspend.

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

Sin embargo, es preferible usar datos persistentes en lugar de depender de runtime.onSuspend. No permite realizar todas las limpiezas necesarias y no ayudará en caso de falla.