通过Chrome扩展程序页面操作弹出窗口与活动标签上的内容脚本进行通信

时间:2013-01-25 20:26:18

标签: google-chrome-extension popup

我没有得到如何在内容脚本和页面操作弹出窗口之间传递数据。

我开始使用以下简单的骨架,它显示了标题中包含减号的任何页面的页面操作:

  • 扩展清单(manifest.json):

    {
       …
       "permissions": ["http://example.org/*"],
       "background": {"scripts": ["background.js"]},
       "page_action": {"default_popup": "popup.html", …},
       "content_scripts": {
         "matches": ["http://example.org/*"],
         "js": ["content.js"]
       }
    }
    
  • 后台脚本(background.js):

    chrome.extension.onRequest.addListener(function (msg, sender, respond) {
      if (msg && msg.what === "match") {
        console.log("Match:", msg.title);
        chrome.pageAction.show(sender.tab.id);
      }
    }
    
  • 内容脚本(content.js),检查文档标题:

    var title = document.title;
    if (title.indexOf("-") >= 0) {
      chrome.extension.sendRequest({"what": "match", "title": title});
    }
    

现在,在页面操作的弹出窗口中,我想显示匹配页面的标题。不是最后加载的页面标题(使用this answer完成),而是活动标签的标题。

我的第一个问题是向内容脚本发送查询,但根据文档chrome.extension.sendMessage将其发送到所有侦听器(即所有选项卡上的所有内容脚本),我会收到回复的明确定义。此外,我无法使用chrome.tabs.sendMessage,因为需要 tabId。尝试使用chrome.tabs.getCurrent查找当前标签将返回null,因为查询来自非标签上下文(来自弹出窗口)。

我想我可能会使用chrome.tabs.executeScript进行沟通,但这只是感觉很脏。

但是,我相信,这是一个基本的事情应该很简单,我只是缺少一些东西。有人可以帮助我,最好是一个示例代码吗?

更新:我找到了Mappy example extension,并使用chrome.tabs.onUpdated来跟踪活动标签。不幸的是,这需要tabs许可。就个人而言,我想尽可能少地使用特权。

那么,是不是很糟糕的权限系统设计,我别无选择,只能这样做,或者有任何解决方法?如果chrome.pageAction.onClicked事件处理程序(提供我需要的Tab对象)允许我显示弹出窗口,我会很高兴...

2 个答案:

答案 0 :(得分:1)

我认为你需要在弹出窗口中添加onClick事件监听器:

chrome.pageAction.onClicked.addListener(function(tabs.Tab tab) {...});

请参阅文档here

事件监听器的回调将为您提供tabId,它肯定是活动标签。

答案 1 :(得分:1)

您的代码中存在多个问题

    {/ 1}}中
  • chrome.extension.sendRequest 已弃用
  • chrome.pageAction.onClicked 在您的清单中有chrome.extension.sendRequest({"what": "match", "title": title});时不会触发。
  • "page_action": {"default_popup": "popup.html", …},是一个无效的假设,它将发送到扩展页。

我试图多次阅读你的问题,但无法理解你想要达到的目标,你能解释一下吗?