Chrome邮件传递错误:尝试使用已断开连接的端口对象

时间:2012-08-02 17:38:29

标签: google-chrome google-chrome-extension

我的Chrome扩展程序使用长寿命的“端口”对象在“内容脚本”和“弹出”页面之间传递消息。 “弹出窗口”能够向“内容脚本”事件监听器发送消息。但是,“内容脚本”中的“端口”对象无法向“弹出”页面发送消息。

var port = chrome.extension.connect({"name":"swap"});

// listener for incoming connections
chrome.extension.onConnect.addListener(function( incomingPort ){

    // listener on incoming messages
    incomingPort.onMessage.addListener(function( msg ){

        if( msg.command === 'get_scripts' ){
            //do work

        }

        var scrs = { 'scripts' : 'name' };
        var result = port.postMessage( scrs );

    });
});

执行'port.postMessage(Object obj)'时,插件会抛出以下错误,

Error in event handler for 'undefined': Attempting to use a disconnected port object   Error: Attempting to use a disconnected port object
at PortImpl.postMessage (miscellaneous_bindings:54:5)
at chrome-extension://loiamkgdhfjdlkcpehnebipeinpcicfj/swap.js:27:31
at [object Object].dispatch (event_bindings:203:41)
at Object.<anonymous> (miscellaneous_bindings:250:22) event_bindings:207

我尝试过使用'Port'对象和'incomingPort'对象,两者都抛出相同的'Error'。 感觉它与预先创建的“Port”对象的范围有关。

插件代码可在此git存储库https://github.com/snambi/chrome_plugin/tree/master/src/chrome

中找到

这个插件有什么问题?

1 个答案:

答案 0 :(得分:7)

我查看了你的代码,对我来说没有任何意义:

  • 您是否知道某个端口两侧都有onMessagepostMessage方法?一个端口就足以在两个方向上进行通信。
  • 以您的方式在弹出窗口和内容脚本之间进行通信将非常困难。很难同时启动内容脚本和弹出窗口。

由于您的扩展程序没有后台页面和相对无用的内容脚本,我假设您的扩展程序的核心是浏览器操作弹出窗口。您可以使用以下流程,而不是默认注入内容脚本:

  1. 用户点击浏览器操作
  2. popup.htmlpopup.js已执行。
  3. 我也看到你正在使用port == null检查端口是否有效。如果这样做,请确保通过在端口断开连接时使变量无效来进行比较:

    var port;
    chrome.runtime.onConnect.addListener(function(_port) {
        // ...optional validation of port.name...
    
        port = _port;
        port.onMessage.addListener(function(message) { /* .. logic .. */});
        port.onDisconnect.addListener(function() {
            port = null;
        });
    });