Chrome扩展程序:将数据发送到使用chrome.windows.create

时间:2016-02-29 17:46:26

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

我正在努力寻找与我的网络应用程序进行通信的最佳方式,我在扩展程序中使用chrome.windows.create打开。

我已经在内容脚本和后台脚本之间进行了连接。我可以右键单击一个元素并将其值发送到后台脚本,后台脚本创建一个包含我的webapp的窗口。但是从那里我无法弄清楚如何在我的webapp中访问和使用该值(它需要将值加载到编辑器中)。

我已经尝试在窗口和选项卡对象上设置fns和vars,但是一旦加载了Web应用程序,它们就会以某种方式从窗口对象中丢失。 使用chrome.tabs.executeScript,我可以摆弄dom,但不能在'window'上设置全局变量或任何东西。

如果没有更好的方法,我想我被迫添加到DOM并在我的网络应用程序加载后选择它,但它似乎很乱。我希望有一个更干净的方法,比如设置一个onLoadFromExtension fn,我的web应用程序可以执行它以获得它所需的值。

1 个答案:

答案 0 :(得分:1)

我找到了一种方法,经过多次试验和错误后才能运行,但它看起来仍然容易出错。并且它还取决于与已安装的扩展ID匹配的扩展ID,因此如果它不能被硬编码,那么它将是另一个需要通过另一个通道的消息(在读取之后,看起来像是可以硬编码,因为它是公钥的哈希,所以问题解决了)......开始认为操纵DOM不那么混乱......

<强> background.js

var selectedContent = null;
chrome.runtime.onMessageExternal.addListener(
  function(request, sender, sendResponse) {
    console.info("------------------------------- Got request", request);
    if (request.getSelectedContent) {
      sendResponse(selectedContent);        
    }
  });

网络应用

var extensionId = "naonkagfcedpnnhdhjahadkghagenjnc";
  chrome.runtime.sendMessage(extensionId, {getSelectedContent: "true"},
    response => {
      console.info("----------------- Got response", response);
      if(response) {
        this.text = response;
      }
    });

<强>的manifest.json

"externally_connectable": {
  "ids": ["naonkagfcedpnnhdhjahadkghagenjnc"],
  "matches": ["http://localhost:1338/*"]
},