Перехваченный XHR - запустить функцию до поднятия нагрузки - PullRequest
0 голосов
/ 21 марта 2019

На веб-странице с добавленным расширением пользовательским классом XMLHttpRequest мне нужно перехватить и изменить определенные ответы до того, как событие load будет вызвано в остальной части документа. Прямо сейчас мой код модификации реагирует на событие загрузки. Как бы я использовал функцию для изменения ответа до того, как произошло событие load?

Это код, который я использую:

let oldXHROpen = window.XMLHttpRequest.prototype.open;
window.XMLHttpRequest.prototype.open = function (method, url, async, user, password) {
    var originalresp = this;
    //Do something with the method, url and etc.
    originalresp.addEventListener('load', async function () {
        //Do something with the response text
        //***This function needs to execute before load is raised for the rest of the document***
        value = '<note><body>This is a test XML document.</body></note>';
        parser = new DOMParser();
        apiresponsexml = parser.parseFromString(value, 'application/xml');
        //Replace data in the response
        Object.defineProperties(originalresp, {
            'response': {
                value: value
            },
            'responseXML': {
                value: apiresponsexml,
            },
            'responseText': {
                value: value,
            }
        });
    });
    return oldXHROpen.apply(originalresp, arguments);
};

Этот вопрос является продолжением этой предыдущей темы .

1 Ответ

1 голос
/ 21 марта 2019

Переопределить onreadystatechange (запускается до загрузки / загрузки) внутри send():

function plantXhrHook() {
  let origStateChange;

  function modifyResponse(e) {
    if (this.readyState === 4) {
      const value = 'foo';
      let xml;
      Object.defineProperties(this, {
        response: {value},
        responseText: {value},
        responseXML: {
          get() {
            if (typeof xml === 'undefined')
              xml = new DOMParser().parseFromString(value, 'application/xml');
            return xml;
          },
        },
      });
    }
    if (origStateChange) {
      origStateChange.apply(this, arguments);
    }
  };

  const origSend = XMLHttpRequest.prototype.send;
  XMLHttpRequest.prototype.send = function () {
    origStateChange = this.onreadystatechange;
    this.onreadystatechange = modifyResponse;
    origSend.apply(this, arguments);
  };
}

const script = document.createElement('script');
script.textContent = `(${plantXhrHook})()`;
document.documentElement.appendChild(script);
script.remove();

Поскольку другие расширения или скрипты страниц также могут перехватывать XHR, имеет смысл запустить ваш код в контентескрипт с "run_at": "document_start" .

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