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. 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 está inactiva. Algunos ejemplos de eventos incluyen:

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

Una vez que se carga, una página en segundo plano permanece en ejecución mientras realiza 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án hasta que se cierren todas las vistas y todos los puertos de mensajes visibles. Ten en cuenta que abrir una vista sí no hace que se cargue la página del evento, sino que solo impide que se cierre cuando se carga.

Los guiones efectivos en segundo plano permanecen inactivos hasta que escuchan en caso de incendio, reaccionan instrucciones especificadas y, luego, descargarlas.

Registra secuencias de comandos en segundo plano

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

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

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

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

Si una extensión actualmente usa una página en segundo plano persistente, consulta Migración en segundo plano con instrucciones para cambiar a un modelo no persistente.

Inicializa la extensión

Escucha el evento runtime.onInstalled para inicializar una extensión en la instalación. Usar esta para establecer un estado o para 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 secuencias de comandos en segundo plano en torno a eventos de los que depende la extensión. Una definición funcionalmente relevante eventos permite que las secuencias de comandos en segundo plano permanezcan inactivas hasta que esos eventos se activen y evita que extensión debido a la falta de activadores importantes.

Los objetos de escucha se deben registrar de forma síncrona desde el inicio 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 objetos de escucha de forma asíncrona, ya que no se activarán de forma correcta.

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 todas de eventos, 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 le importen a la extensión. sobre el tema. Si una extensión está detectando el evento tabs.onUpdated, intenta usar el Evento webNavigation.onCompleted con filtros, ya que la API de pestañas no es compatible 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 de receptor.

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

Descarga secuencias de comandos en segundo plano

Los datos deben conservarse de forma periódica para no perder la información importante si una extensión falla sin recibir onSuspend. Para ello, usa la API de storage.

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

Si una extensión usa el envío de mensajes, asegúrate de que todos los puertos estén cerrados. La secuencia de comandos en segundo plano y no se descargarán hasta que se cierren todos los puertos de mensajes. Escucha el evento runtime.Port.onDisconnect te dará una estadística de 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 cuando se supervisa una entrada para 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 "Tarea Administrador”.

Las secuencias de comandos en segundo plano se descargan por su cuenta después de unos segundos de inactividad. Si se realizó alguna limpieza de último minuto es obligatorio, escucha el evento runtime.onSuspend.

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

Sin embargo, se debe preferir los datos persistentes en lugar de runtime.onSuspend. No permiten toda la limpieza que sea necesaria y no ayuda en caso de una falla.