首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与后台页面通信的Chrome Devpanel扩展

与后台页面通信的Chrome Devpanel扩展
EN

Stack Overflow用户
提问于 2012-07-26 10:49:17
回答 1查看 12K关注 0票数 20

我有一个对chrome devtools面板的扩展。我可以使用chrome.devtools.inspectedWindow.eval向页面发送消息...但是如何在开发面板中接收消息呢?具体地说,我需要我的devpanel来连接页面上发生的事件。我不能让它监听我的内容脚本上的事件,也不能监听背景页面。

我在内容脚本中尝试了chrome.extension.sendMessage,在开发面板脚本中尝试了chrome.extension.onMessage.addListener。但是sendMessagePort error: Could not establish connection. Receiving end does not exist.抱怨

长期连接仍然存在此问题:

在内容脚本或背景页中:

代码语言:javascript
复制
var port = chrome.extension.connect({name: "test"});
port.postMessage({msg: "testing"});

在开发工具面板javascript中:

代码语言:javascript
复制
chrome.extension.onConnect.addListener(function(port) {
    port.onMessage.addListener(function(msg) {
         // never gets here
    });
 });

如何侦听在我的开发工具面板中的内容脚本中触发的事件?如果火狐的插件软件开发工具包中有这样的图表就更好了:https://addons.mozilla.org/en-US/developers/docs/sdk/latest/static-files/media/content-scripting-overview.png

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-27 04:44:45

目标是创建一个用于通信的通道(“端口”)。端口是如何创建的并不重要,只要正确维护连接即可。

devtools脚本必须启动端口,因为后台脚本不知道何时创建devtools面板。

下面是一个基本的例子,它展示了一种双向通信方法:

devtools.js

代码语言:javascript
复制
chrome.devtools.panels.create('Test', '/icon.png', '/panel.html', function(extensionPanel) {
    var _window; // Going to hold the reference to panel.html's `window`

    var data = [];
    var port = chrome.runtime.connect({name: 'devtools'});
    port.onMessage.addListener(function(msg) {
        // Write information to the panel, if exists.
        // If we don't have a panel reference (yet), queue the data.
        if (_window) {
            _window.do_something(msg);
        } else {
            data.push(msg);
        }
    });
    
    extensionPanel.onShown.addListener(function tmp(panelWindow) {
        extensionPanel.onShown.removeListener(tmp); // Run once only
        _window = panelWindow;

        // Release queued data
        var msg;
        while (msg = data.shift()) 
            _window.do_something(msg);
        // Just to show that it's easy to talk to pass a message back:
        _window.respond = function(msg) {
            port.postMessage(msg);
        };
    });
});

现在,该面板能够通过端口发送/接收消息。面板的脚本(外部脚本文件,因为CSP)可能如下所示:

panel.js

代码语言:javascript
复制
function do_something(msg) {
    document.body.textContent += '\n' + msg; // Stupid example, PoC
}
document.documentElement.onclick = function() {
    // No need to check for the existence of `respond`, because
    // the panel can only be clicked when it's visible...
    respond('Another stupid example!');
};

现在,背景页面的脚本:

background.js

代码语言:javascript
复制
var ports = [];
chrome.runtime.onConnect.addListener(function(port) {
    if (port.name !== "devtools") return;
    ports.push(port);
    // Remove port when destroyed (eg when devtools instance is closed)
    port.onDisconnect.addListener(function() {
        var i = ports.indexOf(port);
        if (i !== -1) ports.splice(i, 1);
    });
    port.onMessage.addListener(function(msg) {
        // Received message from devtools. Do something:
        console.log('Received message from devtools page', msg);
    });
});
// Function to send a message to all devtools.html views:
function notifyDevtools(msg) {
    ports.forEach(function(port) {
        port.postMessage(msg);
    });
}

要进行测试,只需在后台页面(例如via the console)上运行notifyDevtools('Foo');。在本演示中,消息将发送到所有devtools。收到后,devtools面板将包含收到的消息。

使用以下命令将扩展放在一起:

manifest.json

代码语言:javascript
复制
{
  "name": "Test",
  "manifest_version": 2,
  "version": "1",
  "devtools_page": "devtools.html",
  "background":{"scripts":["background.js"]}
}

panel.html

代码语言:javascript
复制
<script src="panel.js"></script> <!-- Doctype etc not added for conciseness-->

devtools.html

代码语言:javascript
复制
<script src="devtools.js"></script>

另请参阅

票数 52
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11661613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档