Chrome расширение: sendResponse возвращает пустой объект - PullRequest
0 голосов
/ 07 апреля 2020

Я знаю, что есть много похожих вопросов: Chrome расширение сообщения: sendResponse возвращает пустой объект , et c., Но я прочитал и попробовал все из них, прежде чем задать свой вопрос. Моя проблема немного другая, поэтому я думаю, что именно поэтому их решения не работают для меня.

Я хочу обнаружить Ctrl + C от пользователя, поэтому, когда он нажимает на значок расширения, содержимое буфер обмена отображается во всплывающем окне.

Вот что я сделал: часть манифеста. json:

    "permissions": [
          "activeTab", "tabs", "<all_urls>", "clipboardRead"
        ],
        "content_scripts": [    
        {
        "matches": ["*://*/*"],
        "js": ["oncopy.js"]
        }
        ],
         "background": {
        "scripts": ["background.js"],
        "persistent": false
        }

oncopy. js (скрипт содержимого)

background. js (фоновый скрипт):

    var clipboardContents;

    // This part of the script receive the 'copy' event.
    chrome.extension.onMessage.addListener(
      function(request, sender, sendResponse) {
        if (request.event == "copy") {      
            // #### GET CLIPBOARD CONTENT #################################################
            bg = chrome.extension.getBackgroundPage();        // get the background page
            bg.document.body.innerHTML= "";                   // clear the background page

            // add a DIV, contentEditable=true, to accept the paste action
            var helperdiv = bg.document.createElement("div");
            document.body.appendChild(helperdiv);
            helperdiv.contentEditable = true;

            // focus the helper div's content
            helperdiv.innerHTML=""; // clear the buffer
            var range = document.createRange();
            range.selectNode(helperdiv);
            window.getSelection().removeAllRanges();
            window.getSelection().addRange(range);
            helperdiv.focus();

            // trigger the paste action
            bg.document.execCommand("Paste");

            clipboardContents = helperdiv.innerText;
            // ############################################################################
        }
        sendResponse({});
      });

    function send_response(callback){
        callback(clipboardContents);
    }

    chrome.runtime.onMessage.addListener(function(message,sender,sendResponse){
      // When we get a message from the popup
      send_response(function(clipboardContents) {
            sendResponse(clipboardContents.toString());
        });
        return true;

// I also tried sendResponse() only, wih and without the return true;
// I also tried sendResponse(clipboardContents) only and sendResponse({data: clipboardContents});
});

popup. js:

    chrome.runtime.sendMessage('popup_opened',function(response){
      document.getElementById('text').innerHTML = response;
    // I tried response.data
    });

Я всегда получаю:
response = объект empy
response.toString () = "[Object: object]"
response.data = undefined

Я не понимаю, что я делаю неправильно. Я надеюсь, что вы можете помочь, и что ответ еще не был объяснен в другом месте.

1 Ответ

1 голос
/ 07 апреля 2020

Фактическая причина проблемы заключается в том, что extension.onMessage является устаревшим псевдонимом для runtime.onMessage, поэтому у вас есть два прослушивателя для одного и того же события, но только первый зарегистрированный прослушиватель sendResponse передается вызывающей стороне, и это {}.

Тем не менее, весь рабочий процесс может быть чрезвычайно упрощен: нет необходимости в фоновом скрипте или скрипте контента, поэтому вы можете удалить "background" и "content_scripts" из манифеста. json. Нет необходимости в обмене сообщениями.

Вам нужно всплывающее окно browser_action и просто прочитайте буфер обмена во всплывающем скрипте.

manifest. json:

{
  "manifest_version": 2,
  "name": "test",
  "version": "1.0",
  "browser_action": {
    "default_popup": "popup.html"
  },
  "permissions": [
    "clipboardRead"
  ]
}

popup. html:

<!DOCTYPE html>
<body>
  <p id=text contenteditable=true></p>
  <script src=popup.js></script>
</body>

всплывающее окно. js:

document.getElementById('text').focus();
document.execCommand('paste');

Это все содержимое расширения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...