2010-06-26 12 views
7

Estoy buscando una manera de determinar el abridor de una pestaña determinada (pestaña principal) dentro de una extensión de Google Chrome.¿Es posible determinar el abridor de una pestaña dentro de una extensión de Google Chrome?

He revisado la documentación de Tab pero no parece haber nada que pueda proporcionar esta información. http://code.google.com/chrome/extensions/tabs.html

He intentado inyectar este script contenido en páginas (pensando que podía pasar el valor a mi página de fondo):

alert(window.opener); 

.. pero apenas produce nulo.

Lo mejor que he encontrado hasta ahora es hacer un seguimiento de la pestaña actualmente enfocada, y cada vez que se crea una nueva pestaña, asuma que la pestaña enfocada es el abridor/principal de la nueva pestaña. Creo que esto podría de facto identificar la pestaña padre correctamente la mayor parte del tiempo ya que las pestañas de segundo plano raramente (se les permite) abrir páginas nuevas. Sin embargo, a veces parece poco fiable y potencialmente inexacto; por ejemplo, si otra extensión abre una nueva pestaña, este método puede identificar erróneamente el abridor de la nueva pestaña.

+0

¿Puedo preguntar qué tipo de extensión estás construyendo? Estoy buscando uno muy simple que tendría esta funcionalidad exacta muy simple: cuando tengo dudas sobre "de dónde vengo" o qué abrió qué, me gustaría saber cuál es el padre de la pestaña actual. ¿Puede tu extensión por casualidad responder esa pregunta por mí? O incluso si no, ¿tal vez conoces una extensión similar? – Wizek

Respuesta

2

Chrome ha agregado una API de extensión experimental que puede lograr esto, específicamente webNavigation.onBeforeRetarget. http://code.google.com/chrome/extensions/experimental.webNavigation.html

Sin embargo ya que esta es todavía experimental (no utilizable en Chrome versiones estables o libere al momento de la Chrome Web Store) he terminado utilizando otro método.

Básicamente:

En content_script.js:

chrome.extension.sendRequest({ 
    request: { 
     op: "pageLoadStarted", 
     url: document.location.href, 
     referrer: document.referrer 
    } 
}); 

En background.html:

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) { 
    console.log('onRequest: ' + JSON.stringify(request)); 
    console.log(JSON.stringify(sender)); 
    }); 

Este enfoque me permite obtener el de referencia de una ficha, que me puede correlacionarse con la URL de una pestaña existente. Esto no siempre es un mapeo de uno a uno, entonces hago algo de magia adicional, como preferir la pestaña seleccionada actualmente como abridor si su url coincide con la referencia de la nueva pestaña.

Esto realmente es solo un truco para aproximar la funcionalidad que sería proporcionada de forma más simple y precisa por webNavigation.onBeforeRetarget o window.opener.

1

La posterior investigación ha revelado que onCreatedNavigationTarget() no hace siempre fuego cuando cree que sería para indicar una relación de apertura de sus puertas.

A veces se puede encontrar una sugerencia adicional en el objeto Tab devuelto por chrome.tabs.onCreated/onUpdated en el parámetro .openerTabId.

Una solución integral probablemente tendrá que depender de varios de los métodos descritos en estas respuestas.

1
port.onMessage.addListener(
    function(msg) { 
     var tabid = port.sender.tab.openerTabId; 
     console.log("Received message from tab that was opened by tab id : " + tabid); 
     // reliably shows the tab id of the tab that opened 
     // the tab sending the message 
    }); 
Cuestiones relacionadas