Как слушать XMLHttpRequests - расширение браузера - PullRequest
0 голосов
/ 13 октября 2019

Мой скрипт

var origOpen = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function() {
    this.addEventListener('load', function() {
        //console.log(this.responseURL);        
        if(this.responseURL == "https://get.example.com/dashboard/summary")
        {
            // Run the function
            funMain();
        }
    });
    origOpen.apply(this, arguments);
};

function funMain() {
    // My codes
}

Это мой скрипт, и он работает как положено. То, что это делает, это слушает XMLHttpRequests, и когда XMLHttpRequest сделан для 'https://get.example.com/dashboard/summary',, он вызывает funMain функцию. Поскольку это событие, это не разовое событие. Это может случаться несколько раз. Этот запрос XMLHttpRequest создается веб-страницей https://example.com/dashboard.

Процесс: если запрос XMLHttpRequest сделан на 'https://get.example.com/dashboard/summary' с помощью https://example.com/dashboard веб-страницы, то вызовите функцию funMain.

Итак, я хочу создать расширение, используя этот рабочий скрипт.
Это то, что я пробовал до сих пор ...

Сценарий содержимого

function funMain() {
    // My codes
}

Примечание: я знаю, что должен использовать browser.runtime.sendMessage () для взаимодействия между фоновым скриптом и скриптом контента. Но на данный момент я пытаюсь заставить работать функцию события (в фоновом скрипте).

фоновый скрипт

console.log("Msg 01 - Background script is running.");
var origOpen = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function() {
    this.addEventListener('load', function() {
        console.log("Msg 02 - " + this.responseURL);        
        if(this.responseURL == "https://get.example.com/dashboard/summary")
        {
            // Run the function
            // funMain();
            console.log("Msg 03 - Hello! I am working as expected.");
        }
    });
    origOpen.apply(this, arguments);
};

манифест

{
  "manifest_version": 2,
  "name": "Beastify",
  "version": "1.0",

  "description": "des",
  "icons": {
    "48": "icons/beasts-48.png"
  },

  "permissions": [
        "webRequest",
        "<all_urls>"
    ],

  "content_scripts": [{
        "matches": [
            "*://*.example.com/dashboard"
        ],
        "js": [
            "content-script.js"
        ]
    }],

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

Проблема в том, что событие не работает, как ожидалось. Следовательно, funMain не может быть вызван. Когда я проверяю фоновую страницу, я вижу только Msg 01. Я не вижу Msg 02 или Msg 03.

Вывод: background.js

Msg 01 - Background script is running.

Что я делаю неправильно и какможно это исправить?

1 Ответ

1 голос
/ 16 октября 2019

Все зависит от реальной ситуации. Вот некоторые идеи, над которыми вы можете работать.

Лучше использовать стандартный JavaScript XMLHttpRequest вместо использования XMLHttpRequest.prototype.

Сценарий содержимого и браузер имеют различную область действияа для безопасности не взаимодействуйте напрямую.

Вы можете

  • Иметь XHR в скрипте контента и использовать webRequest API в фоновом скрипте для прослушивания HTTP-запросов.
  • Используйте runtime.sendMessage () из сценария содержимого в фоновый сценарий для запуска XHR в фоновом сценарии

Затем из фонового сценария

  • Используйте tabs.sendMessage () для отправки сообщения на contentcript
  • Используйте tabs.executeScript () для непосредственного запуска сценариев в области содержимого или запуска функцийв скрипте контента
...