В документации Chrome мы можем отправить сообщение со страницы параметров, используя:
chrome.runtime.sendMessage
Мы не можем использовать:
chrome.tabs.sendMessage
Я хочу отправить сообщение со страницы параметров в сценарий содержимого. Могу я сделать это напрямую? Это мой скрипт страницы опций:
document.addEventListener("DOMContentLoaded", function() {
var radio = document.querySelectorAll("input[type=radio][name=quality]");
for(i=0; i<radio.length; i++)
radio[i].addEventListener("change", function(){
val = this.id;
localStorage.setItem("youtube_filter_video_quality", val);
chrome.runtime.sendMessage({"youtube_filter_video_quality": val});
});
});
А вот сценарий содержимого:
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
if (request.youtube_filter_video_quality!==undefined){
console.info(request.youtube_filter_video_quality);
}
}
);
А вот и manifest.json:
{
"name": "__MSG_name__",
"short_name": "__MSG_short_name__",
"manifest_version": 2,
"version":"1.5.0.0",
"description": "__MSG_description__",
"default_locale": "en",
"browser_action": {
"default_icon": "48.png",
"default_title": "__MSG_default_title__",
"default_popup": "popup.html"
},
"background":{
"page":"background.html",
"persistent": false
},
"content_scripts":[
{
"matches": [ "*://*.youtube.com/*" ],
"css": ["app_player.css"],
"run_at": "document_end"
}
],
"permissions": [
"tabs",
"activeTab",
"storage",
"<all_urls>",
"webNavigation"
],
"icons": {
"64":"64.png",
"48": "48.png",
"32":"32.png",
"16": "16.png",
"128": "128.png"
},
"options_page": "options.html",
"options_ui": {
"chrome_style": true,
"page": "option.html"
}
}
console.info не может ничего записывать (пусто).
Примерно так: после настройки на странице параметров я нажимаю «Применить». Мое расширение будет обрабатывать действие с примененными параметрами. Я хочу отправить сообщение с этой страницы параметров на onclick. Это моя потребность. Вот из документации Chrome: «Если ваша страница параметров отправляет сообщение с использованием runtime.connect или runtime.sendMessage, вкладка отправителя не будет установлена, а URL-адрес отправителя будет URL-адресом вашей страницы параметров».
Эта цитата из документации не относится к chrome.tabs.sendMessage.
Я пробовал использовать как runtime.sendMessage, так и tabs.sendMessage, но результат тот же. В console.info ничего не может написать? Любая ошибка в моем коде?
Вы не показали свой код, использующий chrome.tabs.sendMessage. Он будет другим, потому что этой функции нужен идентификатор вкладки в качестве первого параметра.
chrome.tabs.query ({url: [': //.youtube.com/*']}, функция (вкладки) {for (i = 0; i <tabs.length; i ++) chrome.tabs.sendMessage (tabs [i ] .id, {"youtube_filter_video_quality": val});});
Работает :) Извините! Я не знаю, почему chrome.runtime.sendMessage не работал.
Нет. DOMContentLoaded находится на странице параметров. Сценарий содержимого не имеет этого слушателя.
Так работает сейчас или нет?
Работал с tabs.sendMessage, не работал с runtime.sendMessage



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


We cannot use- вы имеете в виду то, что не является страницей опций. Страница параметров расширения, которая отображается на странице chrome: // extensions, имеет URL-адрес chrome-extension: //, поэтому она может делать все, что может делать расширение, включая chrome.tabs.sendMessage.