Chrome扩展程序:无法向ID为-1的制表符发送消息

时间:2013-03-03 09:33:11

标签: javascript google-chrome google-chrome-extension google-chrome-devtools

我已经检查过很多关于Chrome扩展程序中邮件传递的问题,但我没有找到与此有关的具体内容。

我正在使用chrome.devtools * API,当开发人员工具栏停靠时,我在内容脚本之间发送邮件时遇到问题。当它没有停靠即浮动时,一切正常。

以下是我正在做的一个简短示例。

devtools.js

chrome.devtools.panels.create("myExtension", "img/icon.png", 
    "/panel.html", function(extensionPanel) {

         var myData;  //this variable gets manipulated before a user 
                      //clicks on the panel  

         extensionPanel.onShown.addListener(function(panelWindow) {
             chrome.extension.sendMessage({greeting: "update my data", data: myData}, function(response) {});
        });
});

然后在我的后台脚本(eventPage.js)中,我收听此消息并将其传递给panel.js

chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
    if (request.greeting == "update my data"){
        chrome.tabs.sendMessage(sender.tab.id, {greeting: "show data", showResource: request.data}, function(response) {});
    }
});

最后我在我的panel.js(从panel.html加载)中监听'show data'调用

chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
        if (request.greeting == "show data") {
            //do stuff with my data here

});

基本上,我需要将devtools.js之间的消息传递给panel.js,但唯一的方法是使用后台脚本作为中介。

devtools.js - > background.js - > panel.js。

只要开发工具面板没有停靠在窗口上,这实际上就可以正常工作。当它停靠时我得到一个错误,因为sendMessage()除了标签id为-1之外不会,这就是当dev工具停靠在窗口时sender.tab.id等于的内容。我也尝试使用chrome.tabs.connect - 持久连接 - 但遇到了同样的问题。

1 个答案:

答案 0 :(得分:1)

我最近也发现了如何做到这一点。

“Google Pagespeed”使用的一种技术是获取被检查窗口的标签ID,并使用端口在扩展和背景之间来回传递。

每当您想要向分机发送消息时,您都会查找标签ID并获取其端口。

panel.js

// get the inspected windows tab id from the panel
var tabId = chrome.devtools.inspectedWindow.tabId;

// create the port
var port = chrome.extension.connect({name: 'connection'});

// keep track of the port and tab id on the background by
// sending the inspected windows tab id
port.postMessage(['connect', tabId])

eventPage.js

var activeListeners = {};

chrome.extension.onConnect.addListener(function(port) {
  port.onMessage.addListener(function(message) {
    if (message[0] === 'connect') {
      // get the tab id
      var tabId = message[1];

      // save the reference to the port
      activeListeners[tabId] = port;

      // make sure we clean up after disconnecting (closing the panel)
      activeListeners[tabId].onDisconnect.addListener(function() {
        delete activeListeners[tabId];
      });
    }
  });
});

这不是一个非常彻底的解释,但我希望你明白这一点。