2010-08-02 16 views
14

Estoy desarrollando una extensión para Google Chrome. Mi script de fondo, siempre, autoriza en un servidor que usa la API XMPP, y se suscribe para un nodo PubSub. Necesito cancelar la suscripción en la salida, de lo contrario las suscripciones ficticias permanecerán en el servidor. ¿Hay algún evento onBrowserClose en las API de extensión de Google Chrome?Evento onBrowserCerrar para Google Chrome Extension?

+1

Tenga en cuenta que hay otras formas de que el navegador salga, incluidos los apagones y bloqueos. Incluso si hay una forma 100% confiable de verificar que el navegador salga normalmente, aún tendría agujeros. –

Respuesta

9

No existe tal evento en la API de extensión de Chrome. No hay chrome.windows.onRemoved evento que se dispara cada vez que se cierra una ventana. Pensé que podrías verificar este evento si cerraste la última ventana, pero desafortunadamente debido a la naturaleza asíncrona de Chrome esto no funciona.

Lo que probé fue ejecutar una simple solicitud de AJAX en el controlador de eventos onRemoved. La solicitud AJAX nunca llegó al servidor, ya que Chrome ya se había cerrado antes de ejecutar el evento (o simplemente lo descartó).

Haciendo la respuesta final sea: No, actualmente no puede, por lo que yo sé. Es posible que desee destacar el siguiente informe de errores en http://crbug.com/30885 para que se note en las actualizaciones.

+0

gracias por la respuesta, de hecho decidí seguir la vieja escuela. Solo guarde la información de suscripción anterior en el almacén local y anule la suscripción cuando se vuelva a cargar el script de fondo =) – simple

0

Agregar un evento de cierre del navegador es una solicitud bastante frecuente. Star http://crbug.com/30885 para actualizaciones. Y lea el informe de errores de un truco inteligente para detectar cuándo se cierra el navegador presionando una tecla.

4

Si detecta el caso cuando el número de pestañas abiertas es 0, puede tratarlo como un evento de Chrome onClose. En mi caso, tengo que cancelar una notificación de escritorio antes de que se cierre Chrome porque, de lo contrario, se bloqueaba. Esto es cómo lo hice:

1. inicializar una variable num_tabs mediante el uso de los siguientes:
chrome.tabs.getAllInWindow(null, function(tabs){ 
    console.log("Initial tab count: " + tabs.length); 
    num_tabs = tabs.length; 
}); 
2. num_tabs se incrementan cuando se crea una ficha:
chrome.tabs.onCreated.addListener(function(tab){ 
    num_tabs++; 
    console.log("Tab created event caught. Open tabs #: " + num_tabs); 
}); 
3. Disminuir num_tabs cuando se retira una ficha y ejecutar su navegador OnClose controlador de eventos si num_tabs = 0
chrome.tabs.onRemoved.addListener(function(tabId){ 
    num_tabs--; 
    console.log("Tab removed event caught. Open tabs #: " + num_tabs); 
    if(num_tabs == 0) 
     notification.cancel(); 
}); 
+0

¿Esto funciona incluso dada la naturaleza asincrónica de Chrome, como dice la respuesta de codingbug? –

+0

Si su navegador tiene una extensión, que tiene permiso para "fondo", refiérase a esto -> https://developer.chrome.com/extensions/declare_permissions, chrome no habría salido, incluso cuando usted lo cree. Tienes que finalizar explícitamente el proceso o dejar de fumar o algo así. – ankitG

3

Esta funciona para mí:

chrome.windows.onRemoved.addListener(function(windowId){ 
    alert("!! Exiting the Browser !!"); 
}); 

Toma chrome.windows más que chrome.tabs.

+2

Puede tener varias ventanas de Chrome y esto se activará cada vez que se cierre alguna ventana, no solo en la última ventana cerrada. – s3m3n

1

TL; DR: Probar window.onunload evento, funciona en algunos casos.

Como se mencionó antes, generalmente no podemos manejar algo como el evento onBrowserClose y evitar que el navegador se cierre. Pero en algunos casos podemos usar el evento window.onunload para hacer algo sincrónicamente, y si realmente funciona sincrónicamente.

Desde mi experiencia que puede al menos:

  • Ahorra un poco de información en (por ejemplo registros) en HTML5 localStorage (que es sincrónica).
  • Llame a asíncrona funciones de API de extensión de cromo, pero no puede obtener un resultado. (¡Funciona para mí! ¡Sí!)
  • Realiza síncrono XMLHTTPRequest (sí, a veces funciona).
Cuestiones relacionadas