0

作成したばかりの新しいタブに接続しようとしましたが、ID を介してタブに接続しようとするたびに、開いているすべてのタブで html ウィジェットを更新することが最終的な使命であり、エラーで失敗します。バージョン23.0.1271.64 mを使用しています

var channelTabs = [];
  function isInclude(arr,obj) {
    return (arr.indexOf(obj) != -1);
}
    chrome.tabs.onCreated.addListener(function(tab) {

      // add tab when opened
     if (channelTabs.indexOf(tab.id) == -1) {
        channelTabs.push(tab.id);
     }

    chrome.windows.getCurrent(function(win)
    {
        // get an array of the tabs in the window
        chrome.tabs.getAllInWindow(win.id, function(tabs)
        {
            for (i in tabs) // loop over the tabs
            {
                // if the tab is not the selected one
                if(isInclude(channelTabs,tabs[i].id))
                {
                    if(/^(https?|file):/.test(tabs[i].url))
                    {
                        console.log('Debug Background sending update to open tab id:'+tabs[i].id);
                        var port = chrome.tabs.connect(tabs[i].id,{name: "content_tab_request"});
                        port.postMessage({resp: "tab_update",data:"some string song1"});
                    }
                }

            }
        });
    });


    chrome.tabs.onUpdated.addListener(function(tabId, changeInfo,tab) {
    // Example: allow http:, https: and file:
    if (/^(https?|file):/.test(tab.url)) {
            console.log('Debug Background sending onUpdated to open tab id:'+tabId);
            var port = chrome.tabs.connect(tabId,{name: "content_tab_request"});
            port.postMessage({resp: "tab_update",data:"some string song1"});
    }
    });


 });

しかし、それが chrome.tabs.connect を試みるたびに、それは私に与えます:

Port error: Could not establish connection. Receiving end does not exist. miscellaneous_bindings:235
chromeHidden.Port.dispatchOnDisconnect miscellaneous_bindings:235
chrome.Event.dispatch_ event_bindings:371
dispatchArgs event_bindings:249
chromeHidden.Event.dispatchEvent

およびコンテンツ スクリプト:

// Register this tab to the background script
  var port = chrome.extension.connect({name: "content_request"});
  port.postMessage({req: "Hello"});

  port.onMessage.addListener(function(msg) {

    if (msg.resp == "World")
    {      
      port.postMessage({answer: "good"});
    }
    else if(msg.answer == "bye")
    {
         console.log('Debug contentscript.js reciving answer from background msg.answer:'+msg.answer);
    }
    else
    {
         console.log('Debug contentscript.js reciving answer from background is wrong:'+msg);
    }

    if(port.name == "content_tab_request")
    {
        console.log('Debug contentscript.js reciving request from background Tab function:'+msg);
        if(msg.resp=="tab_update ")
        {
            var data_recive = msg.data;
            console.log('Debug contentscript.js reciving request data from background Tab to update page data_recive:'+data_recive);

        }
    }
  });

json ファイル:

{
   "background": {
      "page": "background.html" 
   },
   "content_scripts": [
    {
      "matches": ["<all_urls>"],       
      "js": ["contentscript.js"],
      "run_at": "document_start",
      "all_frames": true
    }
   ],
   "web_accessible_resources": [
    "script_inpage.js"
   ],
   "browser_action": {
      "default_icon": "icon19.png",
      "default_popup": "popup.html",
      "default_title": "Simple test"
   },
   "content_security_policy": "script-src 'self'; media-src *; object-src 'self'",
   "description": "Simple test.",
   "icons": {
      "128": "icon128.png",
      "16": "icon16.png",
      "32": "icon32.png",
      "48": "icon48.png"
   },

   "manifest_version": 2,
   "minimum_chrome_version": "20",
   "name": "Simple test",
   "permissions": [ 
        "unlimitedStorage",
        "http://*/",
        "<all_urls>",
        "tabs"
   ],

   "version": "2.6"
}

ちなみに、コンテンツ スクリプトからバックグラウンドへの接続は正常に機能しています。

4

2 に答える 2

3

わかりました、非同期イベントを同期しようとしているようです。コードを単純化した後、修正して実行し、機能要件を達成しましposting message to all tabs when a new tab is createdた。

Output:

このメッセージをすべてのタブで見ることができました

ここに画像の説明を入力

マニフェスト.json

{
"name":"Sample communication from content to background",
"description":"This is a sample for Simulating communication from content to background",
"manifest_version":2,
"version":"2",
"background":{
    "scripts":["background.js"]
},
"content_scripts": [
    {
      "matches": ["<all_urls>"],
      "js": ["myscript.js"],
      "run_at":"document_start"
    }
  ]
}

「背景.js」

chrome.tabs.onCreated.addListener(function(tab) {
     chrome.windows.getCurrent(function(win){
        chrome.tabs.getAllInWindow(win.id, function(tabs){
            for (i=0;i<tabs.length;i++){
                console.log(tabs[i]);
                chrome.tabs.sendMessage(tabs[i].id,{name: "content_tab_request"});
            }
        });
    });
});

「myscript.js」

chrome.extension.onMessage.addListener(function(msg) {
    console.log("Message Recieved   "+ msg); 
  });
于 2012-11-26T14:25:09.133 に答える
0

また、一部の chrome エクステンションでこのエラーが発生する場合があります。私はこの問題を抱えていて、問題はAside extension(記事をPocketに保存するため)でした。エラーは次のとおりです。

ポート エラー: 接続を確立できませんでした。受信側が存在しません。miscellaneous_bindings:235 chromeHidden.Port.dispatchOnDisconnect

于 2012-12-30T08:28:08.967 に答える