Переопределение прототипа XMLHttpRequest для Chrome расширения - PullRequest
0 голосов
/ 13 февраля 2020

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

Inject. js

(function(){
    console.log("Injected Send")
    var proxiedSend = window.XMLHttpRequest.prototype.send;
    window.XMLHttpRequest.prototype.send = function() {
        console.log(this, arguments );
        return proxiedSend.apply(this, [].slice.call(arguments));
    }
})();
(function(){
    console.log("Injected Open")
    var proxiedOpen = window.XMLHttpRequest.prototype.open;
    window.XMLHttpRequest.prototype.open = function() {
        console.log(this, arguments );
        return proxiedOpen.apply(this, [].slice.call(arguments));
    };
})();

Внутри моего скрипта содержимого, и он будет регистрировать «Injected Send» и «Injected Open». Я проверил этот код, и он ведет себя странно.

Если вы запустите этот код ниже в консоли, вы увидите, что он работает при перехвате запроса, но не будет работать ни с какими XMLHttpRequests, запущенными на странице (старые и новые объекты). Он будет только перехватывать XMLHttpRequests, сделанные в консоли. Другой пример - это https://www.w3schools.com/code/tryit.asp?filename=GBUKE1JS7IFL. Это работает на веб-странице, но я не могу получить то же поведение, вводя его с расширением.

(function(){
    console.log("Injected Send")
    var proxiedSend = window.XMLHttpRequest.prototype.send;
    window.XMLHttpRequest.prototype.send = function() {
        console.log(this, arguments );
        return proxiedSend.apply(this, [].slice.call(arguments));
    }
})();
(function(){
    console.log("Injected Open")
    var proxiedOpen = window.XMLHttpRequest.prototype.open;
    window.XMLHttpRequest.prototype.open = function() {
        console.log(this, arguments );
        return proxiedOpen.apply(this, [].slice.call(arguments));
    };
})();

var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
        console.log("success")
    }
};
xhttp.open("GET", "/", true);
xhttp.send();

Эта проблема приводит к тому, что мой Inject. js не работает.

манифест. json

{
  "name": "test",
  "version": "0.0.1",
  "manifest_version": 2,
  "description": "testing xmlhttprequests",
  "homepage_url": "http://example.com",
  "icons": {
    "16": "icons/icon16.png",
    "48": "icons/icon48.png",
    "128": "icons/icon128.png"
  },
  "default_locale": "en",
  "background": {
    "scripts": [
      "src/bg/background.js"
    ],
    "persistent": true  
  },
  "page_action": {
    "default_icon": "icons/icon19.png",
    "default_title": "page action demo",
    "default_popup": "src/page_action/page_action.html"
  },
  "permissions": [
    "tabs",
    "*://*.google.com/"
  ],
  "content_scripts": [
    {
      "matches": [
        "https://*/*",
        "http://*/*"
      ],
      "run_at": "document_start",
      "js": [
        "src/inject/inject.js"
      ]
    }
  ]
}

1 Ответ

0 голосов
/ 13 февраля 2020

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

-wOxxOm

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