2017-02-09 15 views
1

Я пытаюсь запустить код примера, указанный на tabs.sendMessage() MDN page. Так что мой код:browser.tabs.sendMessage(): Ошибка: дата получения не существует

manifest.json:

{ 
    "manifest_version": 2, 
    "name": "test1", 
    "version": "1.0", 
    "description": "test", 
    "icons": { 
     "48": "icons/Ruler48.png" 
    }, 
    "permissions": [ 
     "notifications", 
     "tabs", 
     "activeTab" 
    ], 
    "browser_action": { 
     "default_icon": "icons/Ruler48.png", 
     "default_title": "test" 
    }, 
    "content_scripts": [{ 
     "matches": ["*://*/"], 
     "js": ["content-script.js"] 
    }], 
    "background": { 
     "scripts": ["bgS.js"] 
    } 
} 

bgS.js:

function onError(error) { 
    console.error(`Error: ${error}`); 
} 

function sendMessageToTabs(tabs) { 
    for (let tab of tabs) { 
    console.log(tab.id); 
    browser.tabs.sendMessage(
     tab.id, 
     {greeting: "Hi from background script"} 
    ).then(response => { 
     console.log("Message from the content script:"); 
     console.log(response.response); 
    }).catch(onError); 
    } 
} 

browser.browserAction.onClicked.addListener(() => { 
    browser.tabs.query({ 
    currentWindow: true, 
    active: true 
    }).then(sendMessageToTabs).catch(onError); 
}); 

контент-script.js:

browser.runtime.onMessage.addListener(request => { 
    console.log("Message from the background script:"); 
    console.log(request.greeting); 
    return Promise.resolve({response: "Hi from content script"}); 
}); 

я запустить его с веб-внутр перспективе, после нажатия на кнопку браузера действий, в консоли я получаю сообщение: Error: Error: Could not establish connection. Receiving end does not exist.

Выход из web-ext run --verbose

web-ext run --verbose 
[program.js][debug] Getting the version from package.json 
[program.js][info] Version: 1.8.0 
[program.js][debug] Getting the version from package.json 
[cmd/run.js][info] Running web extension from C:\test 
[util/manifest.js][debug] Validating manifest at C:\test\manifest.json 
[cmd/run.js][debug] Creating new Firefox profile 
[cmd/run.js][debug] Deferring extension installation until after connecting to the remote debugger  
[firefox/index.js][debug] Checking if remote Firefox port 6005 is available 
[firefox/remote.js][debug] Connecting to Firefox on port 6005 
[firefox/index.js][debug] Executing Firefox binary: C:\Program Files\Mozilla Firefox\firefox.exe  
[firefox/index.js][info] Use --verbose or open Tools > Web Developer > Browser Console to see logging 
[cmd/run.js][debug] Connecting to the remote Firefox debugger 
[firefox/remote.js][debug] Connecting to Firefox on port 6005 
[cmd/run.js][debug] Retrying Firefox (0); connection error: Error: connect ECONNREFUSED 127.0.0.1:6005 
[firefox/remote.js][debug] Connecting to Firefox on port 6005 
[cmd/run.js][debug] Retrying Firefox (1); connection error: Error: connect ECONNREFUSED 127.0.0.1:6005 
[firefox/remote.js][debug] Connecting to Firefox on port 6005 
[cmd/run.js][debug] Retrying Firefox (2); connection error: Error: connect ECONNREFUSED 127.0.0.1:6005 
[firefox/remote.js][debug] Connecting to Firefox on port 6005 
[firefox/index.js][debug] Firefox stdout: Started debugger server on 6005 
[cmd/run.js][debug] Retrying Firefox (3); connection error: Error: connect ECONNREFUSED 127.0.0.1:6005 
[firefox/remote.js][debug] Connecting to Firefox on port 6005 
[firefox/remote.js][debug] Connected to the remote Firefox debugger 
[firefox/index.js][debug] Firefox stderr: JavaScript strict warning: resource://gre/modules/commonjs/toolkit/loader.js -> resource://devtools/shared/security/socket.js, line 778: ReferenceError: reference to undefined property this._handshakeTimeout 
[firefox/index.js][debug] Firefox stderr: JavaScript strict warning: chrome://browser/content/browser.js, line 6573: SyntaxError: applying the 'delete' operator to an unqualified name is deprecated 
[firefox/remote.js][debug] installTemporaryAddon: {"addon":{"id":"[email protected]","actor":false},"from":"server1.conn0.addonsActor3"} 
[firefox/remote.js][info] Installed C:\test as a temporary add-on 
[cmd/run.js][info] The extension will reload if any source file changes 
[util/file-filter.js][debug] Resolved path **/*.xpi with sourceDir C:\test to C:\test\**\*.xpi 
[util/file-filter.js][debug] Resolved path **/*.zip with sourceDir C:\test to C:\test\**\*.zip 
[util/file-filter.js][debug] Resolved path **/.* with sourceDir C:\test to C:\test\**\.* 
[util/file-filter.js][debug] Resolved path **/.*/**/* with sourceDir C:\test to C:\test\**\.*\**\* 
[util/file-filter.js][debug] Resolved path **/node_modules with sourceDir C:\test to C:\test\**\node_modules 
[util/file-filter.js][debug] Resolved path **/node_modules/**/* with sourceDir C:\test to C:\test\**\node_modules\**\* 
[util/file-filter.js][debug] Resolved path C:\test\web-ext-artifacts with sourceDir C:\test to C:\test\web-ext-artifacts 
[util/file-filter.js][debug] Resolved path C:\test\web-ext-artifacts\**\* with sourceDir C:\test to C:\test\web-ext-artifacts\**\* 
[watcher.js][debug] Watching for file changes in C:\test 
[firefox/index.js][debug] Firefox stderr: JavaScript strict warning: chrome://browser/content/tabbrowser.xml, line 640: ReferenceError: reference to undefined property this.mBrowser.initialPageLoadedFromURLBar 
[firefox/index.js][debug] Firefox stdout: 1486682957594 [email protected]porary-addon WARN Please specify whether you want browser_style or not in your browser_action options. 
[firefox/index.js][debug] Firefox stderr: JavaScript strict warning: chrome://global/content/bindings/browser.xml, line 385: ReferenceError: reference to undefined property tabBrowser.localName 
[firefox/index.js][debug] Firefox stderr: JavaScript strict warning: resource://gre/modules/commonjs/toolkit/loader.js -> resource://devtools/shared/node-properties/node-properties.js, line 134: ReferenceError: reference to undefined property control.resume 
[firefox/index.js][debug] Firefox stderr: JavaScript strict warning: resource://gre/modules/commonjs/toolkit/loader.js -> resource://devtools/shared/node-properties/node-properties.js, line 124: ReferenceError: reference to undefined property options._comments[c] 
[firefox/index.js][debug] Firefox stderr: JavaScript strict warning: resource://gre/modules/commonjs/toolkit/loader.js -> resource://devtools/shared/node-properties/node-properties.js, line 130: ReferenceError: reference to undefined property options._separators[c] 
[firefox/index.js][debug] Firefox stderr: JavaScript strict warning: resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/system/unload.js, line 31: ReferenceError: reference to undefined property observers[i].value 
[firefox/index.js][debug] Firefox stderr: JavaScript strict warning: resource://gre/modules/ProfileAge.jsm, line 202: ReferenceError: reference to undefined property times.reset 
[firefox/index.js][debug] Firefox stderr: JavaScript strict warning: resource://gre/modules/LoginStore.jsm, line 275: ReferenceError: reference to undefined property this.data.version 
[firefox/index.js][debug] Firefox stderr: JavaScript strict warning: chrome://global/content/bindings/browser.xml, line 385: ReferenceError: reference to undefined property tabBrowser.localName 

Это, то, что в консоли браузера, первое сообщение появляется перед установкой. Я имею в виду, что он был там перед установкой, поэтому он устанавливает молча. После нажатия на кнопку я получил два последних сообщений, первый из них дает tab.id от этой линии console.log(tab.id), а затем ошибка:

1486683758937 [email protected]porary-addon WARN Please specify whether you want browser_style or not in your browser_action options. 
10 bgS.js:8:3 
Error: Error: Could not establish connection. Receiving end does not exist. bgS.js:3:3 
+0

Что, * точно *, было показано в [Консоль браузера] (https://developer.mozilla.org/en-US/docs/Tools/Browser_Console) (Ctrl-Shift-J или Cmd-Shift- J на OSX), когда вы пытались установить и использовать расширение? – Makyen

+0

Когда вы нажимаете кнопку действия браузера, активная вкладка содержит страницу с URL-адресом, начинающимся с 'http: //' или 'https: //'? Вы делаете это при просмотре вкладки с URL-адресом, например 'about: addons',' about: debugging' и т. Д.? Вы пытаетесь использовать это на странице в [AMO] (https://addons.mozilla.org/)? – Makyen

+0

Не знаю, если это то, о чем вы просите, но когда я запускаю его с помощью web-ext run --verbose, я получаю это. Я обновил вопрос. – someNameJustToAnswer

ответ

1

Ошибка вы видите результаты, когда нет runtime.onMessage слушателя определяется сценарием контента для расширения на вкладке, которая была указана в вызове tabs.sendMessage(). Это может быть из-за отсутствия сценария содержимого или из-за того, что скрипты контента, которые были введены, не добавили слушателя для runtime.onMessage.

Вы должны иметь в виду, что вы не можете впрыснуть скрипты содержания на страницы, которые имеют URL-адреса, как about:newtab, about:debugging и т.д. Кроме того, Firefox не позволяет вам вводить скрипты в страницы на addons.mozilla.org.

Ваша проблема была усугублена тем, что ваш , вероятно, не такой, каким вы его предполагали. Вы, вероятно, предназначен ваш matches быть:

"matches": ["*://*/*"], 

Примечание задн * в конце картины матча. Образец, который вы используете в настоящее время "*://*/", будет соответствовать только верхней странице в любом домене, который загружается с использованием схемы http или https. Например, он не будет соответствовать https://www.google.com/?gws_rd=ssl, но будет соответствовать http://www.example.com/.

Учитывая, что ваш код выполняется непосредственно по нажатию кнопки браузера или действия с веб-сайтом, вам необходимо обработать эту ошибку каким-либо разумным способом, который обеспечивает обратную связь с пользователем, что то, что они запросили, не может быть выполнено, потому что пользователь будет нажмите кнопку на страницах, таких как about:newtab, что будет. Как вы справляетесь с этой ошибкой, будет зависеть от того, что делает ваш код. Вместо того, чтобы настраивать ситуацию, когда пользователь нажимает кнопку включения, которую они ожидают работать, лучшей альтернативой является отключение вашей кнопки действий (для действий браузера с использованием browserAction.disable()) на страницах, для которых вы не можете выполнить свой код.