0

i get this error Uncaught Error: Attempting to use a disconnected port object

when i opend my popup page after the first time, i have a long-lived connections between

content script<->background page<->popup page.

When i click on browser action icon , popup page will get some information from server through background page to initialize.

All things work fine at the first click, but if i close the popup and click it again, it just cant get the information from background page.

here is my code

popup page

window.onload = function() {

var port = chrome.runtime.connect({name: "stadium"});

chrome.tabs.query({ currentWindow: true, active: true }, function callback(tabs){
  console.log("send TabID to background page");
  port.postMessage({"method":"sendTabId","content": tabs[0].id});
});


port.postMessage({"method" : "initialPopup"});//initilaize request

port.onMessage.addListener(function(msg) {
  console.log("somthing");
    if (msg.method == "updatePage"){
               initialize....
             }
    else if(...){...}
 });

and background page

    var socket = io.connect('http://localhost:3700/');

    chrome.tabs.onRemoved.addListener(function(tabId,removeInfo){

      if(tabId==stadiumTabId){

        //change to the original style popup page
        chrome.browserAction.setPopup({"popup":"../pages/popup_out_guest.html"});  

      }

    });

    chrome.runtime.onConnect.addListener(function(port) {

      console.assert(port.name == "stadium"); 

      port.onMessage.addListener(function(msg) {  

        if (msg.method == "initialPopup"){  //get the initilaize request

            socket.emit('updateMatchInfo',"haha");

            socket.on('getUpdate',function(matchInfo){
                       console.log("background page get data from server");
                        port.postMessage({"method":"updatePage","content": matchInfo});                         
                      });
        }

        else if (msg.method == "something"){ 
           //insert content scripts
          chrome.tabs.executeScript({file: 'js/content_scripts.js', allFrames: true});

          //change to another popup page style
          chrome.browserAction.setPopup({"popup":"../pages/popup_in_guest.html"});               
        }
  });//port.onMessage.addListener

});//onConnect.addListener

the error occurs at this line in background page

 port.postMessage({"method":"updatePage","content": matchInfo}); 

i've checked that server send the data to background page correctly, but just can't figure out the error.

thanks for help !!

4

2 回答 2

5

顺便说一句,您使用的是Awesome Screenshot吗?我经常收到该错误消息,但是一旦我禁用该扩展程序,该消息就消失了:)

于 2015-01-29T23:14:12.393 回答
0

每当您关闭弹出窗口时,它显示的页面也会关闭/销毁,这与始终运行的背景页面不同。

因此,由于其中一方不复存在,长期存在的联系就中断了。

您应该从使用长期连接切换到简单消息。当它打开时,弹出窗口请求当前状态,后台页面广播状态更新。如果弹出窗口没有收听更新(因为它没有打开),则不会造成任何伤害。

于 2015-01-29T23:55:39.320 回答