未调用内容脚本消息处理程序

时间:2014-05-28 15:36:53

标签: javascript google-chrome google-chrome-extension content-script

我有两个Chrome扩展程序,其中一个我需要在内容脚本中收到一条消息。另一个扩展名是在其后台页面中发送消息。我正在关注this question,但它无效。

我在监听器中将.extension更改为.runtime,但仍然无效。这是代码:

扩展名1,contentscript.js(这不是被解雇)

chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) {
  console.log("contentscript");
  if(sender.id !== "iknbmfmkhcilpbkobjafdhaloffobdbe") 
    return;
  if (document.getElementById("status").innerHTML === "1")
    sendResponse({farewell: "goodbye"});
});

扩展名2,background.js

chrome.browserAction.onClicked.addListener(function(tab) {
  chrome.tabs.query({active: true, currentWindow: true}, function(tabs){
    chrome.tabs.sendMessage(tabs[0].id, {pdf: "You a pdf?"}, function(response) {alert(response.farewell);});  
  });
});

1 个答案:

答案 0 :(得分:0)

你真的应该输入巨大的大胆字母,你的问题是关于两个单独的扩展。

您尝试实现的目标是不可能的,因为chrome.tabs.sendMessage不支持跨扩展消息传递。这实际上意味着内容脚本只能通过父扩展来发送消息。

要实现您的目标,您需要扩展程序1的后台页面才能像代理一样:

// Extension 1, background
chrome.runtime.onMessageExternal(message, sender, sendResponse){
  if(sender.id != extensionTwoId) return;
  if(message.tabId) {
    chrome.tabs.sendMessage(message.tabId, message, function(response){
      sendResponse(response);
    });
    return true; // Required if sendResponse will be called asynchronously
  } else {
    // It's not a message to be routed to a tab
  }
}

// Extension 2, background
chrome.browserAction.onClicked.addListener(function(tab) {
  chrome.runtime.sendMessage(
    extensionOneId,
    {tabId: tab.id, pdf: "You a pdf?"},
    function(response) {alert(response.farewell);}
  );
});