Невозможно получить сообщение на вкладке из фонового скрипта - PullRequest
0 голосов
/ 15 октября 2018

Я написал этот сценарий для отправки сообщения из фонового сценария в сценарий на новой вкладке, но по какой-то причине сценарий на вкладке не получает сообщение.Это проблема с моим скриптом или браузером (Firefox 62.0.3)

мой "манифест":

{
"manifest_version":2,
"name": "test",
"version": "1.0",
"description": "this is a test extension",

"background":{
"scripts": ["OnButtonClick.js"]
},

"permissions": [

 "tabs"

],

"content_scripts": [{

"matches": ["www.youtube.com"],
"js": ["input.js"]

}],

"browser_action": {

"default_icon": "button.png",
"default_title": "test button"
}

}

мой "OnButtonClick.js":

function action(){

  browser.tabs.create({
    url: "www.youtube.com"  
});

browser.tabs.sendMessage(1,{"message":"hi"})

}

browser.browserAction.onClicked.addListener(action);

и мой "input.js":

function handleMessage(msg){
    console.log(msg);

}

 browser.runtime.onMessage.addListener(handleMessage)

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

почему вы хотите использовать "sendMessage"?Вы можете использовать этот код

browser.tabs.executeScript(tabID, {    code: "func()" /* your function in content script*/,frameId:0 /* for send to all frame or put id for use a special frame id*/});

или этот код в виде файла

browser.tabs.executeScript(tabID, {    file: "/filename.js",frameId:0});
0 голосов
/ 16 октября 2018

browser.tabs.create() является асинхронным, поэтому browser.tabs.sendMessage() запускается даже до создания вкладки.

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

Вот некоторые предложения:

// first create the tab 
const newTab = browser.tabs.create({
  url: 'https://example.org'
});
newTAb.then(onCreated, onError);

// after tab is created 
function onCreated(tab) {
  browser.tabs.sendMessage(tab.id,{message: 'hi'});
}
// in case of error
function onError(error) {
  console.log(`Error: ${error}`);
}

// above can also be written as this
browser.tabs.create({
  url: 'https://example.org'
}).then(
  tab => browser.tabs.sendMessage(tab.id,{message: 'hi'}),
  error => console.log(error)
); 

// another alternative for above
browser.tabs.create({url: 'https://example.org'})
.then(tab => browser.tabs.sendMessage(tab.id,{message: 'hi'}))
.catch(error => console.log(error));

// Using chrome and callback function
chrome.tabs.create({url: 'https://example.org'}, tab =>
  browser.tabs.sendMessage(tab.id,{message: 'hi'})
);

// same as above, all with chrome
chrome.tabs.create({url: 'https://example.org'}, tab =>
  chrome.tabs.sendMessage(tab.id,{message: 'hi'})
);

Вы также можете использовать async/await, но в этом случае это может усложнить задачу.

Обновление комментария:
content_scripts по умолчаниюзапуск в "document_idle" (соответствует завершению. Документ и все его ресурсы закончили загрузку.)

"content_scripts": [{
  "matches": ["www.youtube.com"],
  "js": ["input.js"]
}],

Следовательно, input.js вводится после загрузки всего.Тем не менее, sendMessage() запускается, как только вкладка создана, и, таким образом, нет прослушивателя для прослушивания ее сообщения.

В вашем простом примере это можно исправить с помощью "run_at": "document_start"

"content_scripts": [{
  "matches": ["www.youtube.com"],
  "js": ["input.js"],
  "run_at": "document_start"
}],

Однако, если input.js требуется получить доступ к DOM после получения сообщения, вам необходимо добавить прослушиватель DOMContentLoaded или load и запустить его после загрузки документа.

...