2016-03-16 4 views
1

Я хотел бы отслеживать доступ к некоторым методам встроенных объектов браузера из дополнения 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 выше из-за списка аргументов, содержащего функцию.

ответ

1

Прежде всего, вы должны указать любой метод, назначенный в другой контекст безопасности, обработку exportFunction.

Это может быть недостаточно, поскольку сам объект метода по-прежнему выполняется в привилегированном контексте, что означает, что любые аргументы, которые он получает, также будут общими оболочками xray. Передача их обратно в менее привилегированную область, особенно с помощью тайной магии, например apply, и объект arguments может не делать то, что вы ожидаете от него. Возможно, потребуется дополнительная распаковка xray или использование параметров отдыха и .call.

В таких случаях может быть проще использовать логику перехвата вызова в целевой области и экспортировать только функцию регистрации, вызываемую оболочкой-перехватчиком. Таким образом, для аргументов не будет непривилегированного -> привилегированного -> непривилегированного перехода, this или возвращаемых значений, и только вызов журнала пересечет границу безопасности.

Поскольку eval обескуражен рекомендациями по пересмотру аддона, вы также можете обратиться к рецензентам по этому подходу.

+0

Я попытался реализовать решения, которые добавляют дополнительную распаковку xray, как вы предполагали, но не могли решить проблему. Вместо этого я решил использовать подход eval, который оказался намного проще. Мое расширение предназначено только для тестирования, поэтому мне не нужно беспокоиться об отзывах. Спасибо! – englehardt

 Смежные вопросы

  • Нет связанных вопросов^_^