Перехват XMLHttpRequest из сценария Greasemonkey завершается неудачно - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь манипулировать запросом XMLHttpRequest, выполняемым веб-сайтом, используя Greasemonkey (установлена ​​версия 4.9)Перехват должен быть простым ( Как я могу перехватить XMLHttpRequests из скрипта Greasemonkey? ), но он не работает для меня. Может быть, что-то изменилось с более новыми версиями Greasemonkey?

Я явно пробовал примеры в связанном вопросе, но они не имеют никакого эффекта - ничего не напечатано в консоли, хотя у меня есть console.log(...) в моем настроенном открытииfunction.

Далее я дал unsafeWindow попытку. Это не должно быть необходимо. Мой скрипт пользователя работает с @grant none, а в документации ( см. здесь ) говорится, что мой скрипт должен работать в области содержимого.

С unsafeWindow Я получаю эффект, ноон полностью нарушает XMLHttpRequest

// ==UserScript==
// @name          Test
// @version       1
// @include       *
// @run-at        document-start
// @grant         none
// ==/UserScript==

"use strict";

let realOpen = unsafeWindow.XMLHttpRequest.prototype.open

console.log("Real: " + realOpen)

unsafeWindow.XMLHttpRequest.prototype.open = function() {
  console.log("Called for " + this + " with URL: " + arguments[0])

  //call original
  return realOpen.apply(this, arguments)
};

window.addEventListener ("load", function() {
  console.log ("Page loaded");
});

console.log("Unsafe: ", unsafeWindow.XMLHttpRequest.prototype.open.toString())
console.log("Normal: ", XMLHttpRequest.prototype.open.toString())

Это дает следующий вывод в консоли:

Real: function open() {
    [native code]
}

Unsafe:  function() {
    console.log("Called for " + this + " with URL: " + arguments[0])

    //call original
    return realOpen.apply(this, arguments)
  }

Normal:  function open(method, url) {
    // only include method and url parameters so the function length is set properly
    if (arguments.length >= 2) {
      let newUrl = new URL(arguments[1], document.location.href);
      arguments[1] = newUrl.toString();
    }
    return origOpen.apply(this, arguments);
  }

==> Page loaded

Как уже упоминалось, функция XMLHttpRequest нарушена. Когда я использую консоль разработчика Firefox для дальнейшего изучения, я получаю это

>> window.XMLHttpRequest.prototype.open
Restricted {  }

. Любые свойства, установленные на window (например, window.foobar = "foobar"), не существуют в консоли, но те, которые установлены на unsafeWindowделать. Я предполагаю, что это связано с песочницей Greasemonkey.

Почему существуют две версии XMLHttpRequest, даже когда я использую @grant none? Почему мои пользовательские функции ограничены? Могу ли я избежать этого? Почему он работает без проблем при установке прослушивателя событий в окне?

1 Ответ

0 голосов
/ 17 октября 2019

Далее я попробовал unsafeWindow. Это не должно быть необходимо. Мой скрипт пользователя работает с @grant none и в документации (см. Здесь) говорится, что мой скрипт должен работать в области содержимого.

Это неверно для Greasemonkey 4, как указано в объявлении :

Из-за более ограниченных возможностей, которые дает нам новая система расширений, в настоящее время мы не можем заставить @grant ни один из скриптов работать одинаково. Самое главное, они имеют другое соединение с unsafeWindow. По крайней мере, в краткосрочной перспективе рекомендуется принять cloneInto и exportFunction .

См. Также этот другой вопрос Firefox не относится к Object.defineProperty ()из сценария Greasemonkey?

Это изменение объясняет наблюдения, но не знает, зачем добавлять слушателя в работу окна.

...