Я хотел бы отслеживать доступ к некоторым методам встроенных объектов браузера из дополнения Firefox. Примерный код, приведенный ниже, в основном работает, за исключением случаев, когда одним из аргументов метода является функция. Затем, я получаю следующее сообщение об ошибке: XrayWrapperОшибка XrayWrapper (значение вызываемого) при перезаписи метода прототипа в Firefox addon
XrayWrapper denied access to property 0 (reason: value is callable). See https://developer.mozilla.org/en-US/docs/Xray_vision for more information. Note that only the first denied property access from a given global object will be reported.
Я не понимаю, почему ошибка XrayWrapper бы бросить, как прототип инструментальными является объектом в unsafeWindow
(страница-скрипт) области. Содержание-скрипт, используемый для приборного:
function logCalls(object, objectName, methodName) {
var originalMethod = object[methodName];
object[methodName] = function() {
console.log(objectName + "." + methodName, "was called");
originalMethod.apply(this, arguments);
};
}
// 1. Works (expected)
logCalls(unsafeWindow.RTCPeerConnection.prototype,
"unsafeWindow.RTCPeerConnection", "createDataChannel");
// 2. Throws XrayWrapper Error (unexpected)
logCalls(unsafeWindow.RTCPeerConnection.prototype,
"unsafeWindow.RTCPeerConnection", "createOffer");
Образец страниц сценария:
var PeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection;
var connection = new PeerConnection({iceServers: []}, {optional: [{RtpDataChannels: !0}]});
// 1. Method call recorded
connection.createDataChannel("", {reliable: !1});
// 2. Method call recorded but causes XrayWrapper error
connection.createOffer(function(a) {
connection.setLocalDescription(a)
}, function(err) {})
Для (1), контрольно-измерительные приборы работает, как ожидалось. Вызов createDataChannel регистрируется на консоли и удаётся создать dataChannel.
Для (2) прибор успешно подключается к консоли. Однако строка 5 сценария контента (originalMethod.apply(this, arguments);
) вызывает ошибку XrayWrapper выше из-за списка аргументов, содержащего функцию.
Я попытался реализовать решения, которые добавляют дополнительную распаковку xray, как вы предполагали, но не могли решить проблему. Вместо этого я решил использовать подход eval, который оказался намного проще. Мое расширение предназначено только для тестирования, поэтому мне не нужно беспокоиться об отзывах. Спасибо! – englehardt