Отправка данных между контентом-скриптом / фоном
Это мой текущий проект:
manifest.json:
{
"name": "Sample Commands Extension",
"description": "Press Ctrl+Shift+U to send an event (Command+Shift+U on a Mac).",
"homepage_url": "https://github.com/mdn/webextensions-examples/tree/master/commands",
"manifest_version": 2,
"version": "1.0",
"background": {
"scripts": ["background.js"]
},
"commands": {
"toggle-feature": {
"suggested_key": { "default": "Alt+Shift+U" },
"description": "Send a 'toggle-feature' event to the extension"
}
}
}
background.js:
/**
* Returns all of the registered extension commands for this extension
* and their shortcut (if active).
*
* Since there is only one registered command in this sample extension,
* the returned `commandsArray` will look like the following:
* [{
* name: "toggle-feature",
* description: "Send a 'toggle-feature' event to the extension"
* shortcut: "Ctrl+Shift+U"
* }]
*/
var gettingAllCommands = browser.commands.getAll();
gettingAllCommands.then((commands) => {
for (command of commands) {
console.log(command);
}
});
/**
* Fired when a registered command is activated using a keyboard shortcut.
*
* In this sample extension, there is only one registered command: "Ctrl+Shift+U".
* On Mac, this command will automatically be converted to "Command+Shift+U".
*/
browser.commands.onCommand.addListener((command) => {
console.log("onCommand event received for message: ", command);
// send to core.js the command?
});
core.js:
browser.runtime.onMessage.addListener(request => {
alert(request.greeting);
});
это работает с моим сочетанием клавиш, я получаю это сообщение, которое я регистрирую. Мой вопрос: как я могу отправить команду core.js
, и как я могу заставить его работать только с активной текущей вкладкой один, а не со всеми открытыми? Файлы находятся в одной папке.
1 ответ
Вы можете отправить сообщение из фонового сценария в сценарии содержимого на вкладке, используя tabs.sendMessage()
( Chrome docs), на который вы должны указать идентификатор вкладки, на которую хотите получить сообщение. Вы не можете транслировать сообщение на все вкладки одним вызовом API. Чтобы отправить только вкладку, которая является активной вкладкой в текущем окне, сначала необходимо выяснить, какая вкладка это. Вы можете сделать это с tabs.query({active:true,currentWindow:true}...)
( Chrome Docs).
Приведенный ниже код отправит сообщение скрипту содержимого на текущей вкладке. Версия обратного вызова работает либо в Firefox, либо в Chrome, версия Promises работает только в Firefox (Chrome не реализуется browser.*
).
Использование обратных вызовов (chrome.*
, можно использовать в Chrome или Firefox):
/* Callback based version (chrome.*)
* Send a message to the current tab. Arguments are the same as chrome.tabs.sendMessage(),
* except no tabId is provided.
*
* sendMessageToCurrentTab(
* message (any) message to send
* options (optional object) same as tabs.sendMessage():'frameId' prop is the frame ID.
* callback (optional callback for response)
* )
*/
function sendMessageToCurrentTab(){
var args = Array.prototype.slice.call(arguments); //Get arguments as an array
chrome.tabs.query({active:true,currentWindow:true},function(tabs){
args.unshift(tabs[0].id); //Add tab ID to be the new first argument.
chrome.tabs.sendMessage.apply(this,args);
});
}
Используя обещания (browser.*
, можете использовать в Firefox):
/* Promises based version (browser.*)
* Send a message to the current tab. Arguments are the same as browser.tabs.sendMessage(),
* except no tabId is provided.
*
* sendMessageToCurrentTab(
* message (any) message to send
* options (optional object) same as tabs.sendMessage():'frameId' prop is the frame ID.
* )
*/
function sendMessageToCurrentTab(){
var args = Array.prototype.slice.call(arguments); //Get arguments as an array
return browser.tabs.query({active:true,currentWindow:true}).then(function(tabs){
args.unshift(tabs[0].id); //Add tab ID to be the new first argument.
return browser.tabs.sendMessage.apply(this,args);
});
}
Нужно сначала вставить контентный скрипт
Однако, прежде чем отправлять сообщение в скрипт контента, скрипт контента должен быть внедрен на страницу. Вам нужно будет внедрить скрипт содержимого, используя content_scripts
запись в ваш manifest.json или используя chrome.tabs.executeScript()
, Например, вы можете внедрить скрипт и отправить сообщение (после того, как скрипт введен), используя:
chrome.tabs.executeScript({
file:'core.js'
}, function(){
sendMessageToCurrentTab("test");
});