Расширение Chrome, лучший способ отправки сообщений из внедренного скрипта в фоновый режим - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь создать расширение для Chrome, оно должно внедрить скрипт в веб-страницу, этот скрипт перехватывает ответы json и отправляет их в фоновый скрипт.

Имейте в виду, яЯ никогда не делал этого неправильно, поэтому в моем манифесте у меня есть:

"background": {
    "scripts": ["background.js"],
    "persistent": true
},
"content_scripts": [
{
  "matches": ["*://url*"],
  "run_at": "document_start",
  "js": ["inject.js"]
}
],
"web_accessible_resources": ["injected.js"],

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

 chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) {
    if (request.type) {
        switch(request.type) {
            case "THIS_REQUEST_TYPE":
            do_stuff(request.foo, request.bar);
            break;
            ...................

inject.Цель js - внедрить injected.js в веб-страницу, и теперь он также выполняет ретрансляцию сообщений, которые переходят из injected.js в background.js, я внедряю injected.js таким образом:

    var s = document.createElement('script');
s.src = chrome.extension.getURL('injected.js');
s.onload = function() {
    this.remove();
};
(document.head || document.documentElement).appendChild(s);

Теперь,чтобы получать сообщения из injected.js в фоновый скрипт, я в основном использую:

  window.postMessage(msgdata, "*");

Это отправляет сообщения из injected.js в inject.js, затем в inject.js я могу получить эти сообщения с:

 window.addEventListener("message", function(event) {

Тогда я наконец смогу отправить эти сообщения в свой фоновый скрипт, на этот раз используя:

chrome.runtime.sendMessage(

Я не нашел никакого способа напрямую отправлять сообщения из injected.js в фоновый режим.js, информация доступнаДокументация по chrome прекрасно подходит для отправки сообщений из inject.js в background.js, но в противном случае они не работают, я попробовал несколько онлайн-решений, и единственное, которое я смог использовать, - это то, что мне удалось получить.

В любом случае, это работает, я могу отправлять ответы json из injected.js в inject.js в background.js и анализировать их в моем фоновом скрипте.

Дело в том, что я ненавижусделать это таким образом, ответы json могут быть очень длинными, я уже фильтрую ответы в injected.js, так что отправляются только те, кто полезен, но все же иногда мне приходится отправлять копию ответов длиной 591109 символов!Итак, необходимость посылать дважды такие длинные ответы - это ужасно, я хочу, чтобы это было эффективно и быстро.

У кого-нибудь есть идеи по этому поводу?

1 Ответ

0 голосов
/ 14 ноября 2018

Ваш injected.js работает в элементе script DOM, поэтому это просто непривилегированный скрипт веб-страницы.Чтобы использовать chrome.runtime.sendMessage непосредственно из сценария веб-страницы, вам необходимо объявить разрешенные шаблоны URL в externally_connectable , но вы не можете разрешить все URL-адреса без разбора, поэтому я бы использовал ваш подход, хотя и с CustomEvent (и, скорее всего, случайное имя события) вместо message, которое может быть перехвачено скриптами страницы или другими расширениями - здесь меня беспокоит не безопасность, а скорее возможность взломать какой-то сайт, которыйпредполагается, что данные сообщения имеют определенный формат (например, строку), несовместимый с тем, который вы используете (например, объект).

Вы также можете использовать API chrome.debugger для присоединения к вкладке и перехвата ответа JSONв фоновом скрипте, но при этом над вкладкой будет отображаться уведомление об его отладке.

В любом случае, если вы не видите, как ваше расширение замедляет страницу (в профилировщике devtools или вручную измеряя время, проведенное в вашем коде), не нужно беспокоиться.

FWIW, в Firefox вы можете повторнообъявление ответа напрямую через browser.webRequest.filterResponseData .

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