是否可以在Google Chrome扩展程序中确定标签的开启者?

时间:2010-06-26 16:13:41

标签: google-chrome google-chrome-extension

我正在寻找一种方法来确定Google Chrome扩展程序中给定标签的开启者(父标签)。

我查看了Tab的文档,但似乎没有任何可以产生这些信息的东西。 http://code.google.com/chrome/extensions/tabs.html

我已尝试将此内容脚本注入页面(我认为可以将值传递到我的后台页面):

alert(window.opener);

..但它只是产生了空。

到目前为止,我提出的最好的方法是跟踪当前关注的选项卡,每当创建新选项卡时,只需假设关注选项卡是新选项卡的开启者/父级。我相信,由于背景标签很少(允许)打开新页面,所以事实上大部分时间都能正确识别父标签。但是,它似乎有点麻烦且有时可能不准确 - 例如,如果另一个扩展程序打开了一个新标签,此方法可能会错误地标识新标签的开启者。

4 个答案:

答案 0 :(得分:7)

更新:现在可以使用新添加的webNavigation API,特别是通过挂钩onCreatedNavigationTarget事件,可靠地确定Chrome扩展程序中的标签页面开启工具标签。

https://code.google.com/chrome/extensions/trunk/webNavigation.html

答案 1 :(得分:2)

Chrome已添加了一个实验性扩展API,可以实现此目的 - 特别是webNavigation.onBeforeRetarget。 http://code.google.com/chrome/extensions/experimental.webNavigation.html

然而,由于这仍然是实验性的(不能在Chrome稳定版本中使用或在Chrome网上应用店中可以发布),我最终还是采用了其他方法。

基本上:

在content_script.js中:

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

在background.html中:

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

此方法允许我获取标签的引荐来源,然后我可以将其与现有标签的网址相关联。这并不总是一对一的映射,所以我做了一些额外的魔术,比如如果它的url与新标签的引用者匹配,则首选当前选择的标签作为开启者。

通过webNavigation.onBeforeRetarget或window.opener,这实际上只是一个非常简单和准确的功能。

答案 2 :(得分:1)

进一步的调查显示,当您认为onCreatedNavigationTarget()不会始终时,它会指示开启者打开的关系。

有时可以在.openerTabId参数中的chrome.tabs.onCreated / onUpdated返回的Tab对象中找到其他提示。

全面的解决方案可能必须依赖于这些答案中描述的多种方法。

答案 3 :(得分: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
     });