Невозможно отправить сообщение из контекстного меню в скрипт контента - PullRequest
0 голосов
/ 12 июня 2018

Я хочу отправить сообщение в скрипт контента, когда пользователь выбирает пункт контекстного меню.Сценарий содержимого затем на основе сообщения отформатирует веб-страницу в соответствии с требованиями.

Мне не удалось это сделать, и я смог найти проблему в коде, отвечающем за отправку сообщения (в скрипте контекстного меню), или в коде, отвечающем за получение сообщения (в скрипте содержимого).

Ниже я попытаюсь представить упрощенную версию кода, которая пытается дублировать проблему:

manifest.json

{
    "manifest_version": 2,
    "name": "MCVE for SO",
    "version": "1",

    "description": "Demonstrate message passing from context menu to content script",

    "author": "Nityesh Agarwal",

    "permissions": [
        "tabs",
        "activeTab",
        "contextMenus"
    ],  

    "content_scripts": [
        {
            "matches": ["<all_urls>"],
            "js": ["markr.js"]
        }
    ],  

    "background": {
        "scripts": ["backgroundContextMenus.js"]
    }   
}

backgroundContextMenus.js:

chrome.runtime.onInstalled.addListener(function(){
    chrome.contextMenus.create({"title": "Testing",
                                "contexts": ["selection"],
                                "id": "testing"});
});
chrome.contextMenus.onClicked.addListener(function(info, tab){
    console.log("testing..");
    console.log("Before sending the bold message");
    chrome.tabs.sendMessage(tab.id, {changeParameter: "bold"});
    console.log("After sending the bold message");
});

markr.js:

chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse){
        console.log("Text toggled bold");
    }); 

При выборе пункта контекстного меню console показывает следующие сообщения:

backgroundContextMenus.js: 8 тестирование..
backgroundContextMenus.js: 9 Перед отправкой смелого сообщения
backgroundContextMenus.js: 11 После отправки смелого сообщения

Итак, как вы можете заметить, в журнале нет чего-то вроде

Текст переключен жирным шрифтом

Это означает, что код внутри файла markr.js не выполняется.Поэтому я подозреваю, что с кодом, ответственным за отправку сообщения, должно быть что-то не так: chrome.tabs.sendMessage(tabs[0].id, {changeParameter: "bold"});)

Вот еще один фрагмент кода, который я пытался продублировать, но он вызвал ту же проблему - https://stackoverflow.com/a/14473739/7082018


Я не могу понять, что именно с ним не так.Было бы очень полезно, если бы кто-то помог мне сказать, как я могу успешно передавать сообщения между контекстным меню и страницей содержимого.

1 Ответ

0 голосов
/ 13 июня 2018

Принимая подсказку от этого ответа Я изменил свой backgroundContextMenus.js следующим образом:

function ensureSendMessage(tabId, message, callback){ 
  chrome.tabs.sendMessage(tabId, {ping: true}, function(response){ 
    if(response && response.pong) { // Content script ready
      chrome.tabs.sendMessage(tabId, message, callback);
    } else { // No listener on the other end
      console.log("Injecting script programmatically");
      chrome.tabs.executeScript(tabId, {file: "markr.js"}, function(){
        if(chrome.runtime.lastError) {
          console.error(chrome.runtime.lastError);
          throw Error("Unable to inject script into tab " + tabId);
        }
        // OK, now it's injected and ready
        console.log("Sending msg now");
        chrome.tabs.sendMessage(tabId, message, callback);
      });
    }
  });
}

chrome.runtime.onInstalled.addListener(function(){
    chrome.contextMenus.create({"title": "Testing",
                                "contexts": ["selection"],
                                "id": "testing"});
});

chrome.contextMenus.onClicked.addListener(function(info, tab){
    ensureSendMessage(tab.id, {greeting: "hello"});
});

Затем я изменил markr.js следующим образом:

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse){
    if(request.ping){ 
        sendResponse({pong: true}); 
        return; 
    }   
    console.log("Text toggled bold");
}); 

Теперь журналы консоли точно соответствуют ожиданиям:

Журнал консоли:

markr.js:11 Текст переключен жирным шрифтом

Помните, что в этом журнале присутствует консольный журнал devtools веб-страницы, а не проверяемые представления фонового скрипта.

...