Я пытаюсь манипулировать запросом 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
? Почему мои пользовательские функции ограничены? Могу ли я избежать этого? Почему он работает без проблем при установке прослушивателя событий в окне?