2013-07-07 2 views
0

Я пытаюсь перенести надстройку с chrome на firefox. Надстройка будет иметь современный стиль (bootstrapped/SDK), и я использую Add-On Builder.TypeError: Значение не реализует интерфейс WindowProxy

В сценарии контента, я пытаюсь синтезировать событие со следующим кодом:

var evt = document.createEvent('MouseEvents'); 
evt.initMouseEvent('mousedown', true, true, window, 
    1, 0, 0, 0, 0, false, false, false, false, 0, null); 
element.dispatchEvent(evt); 

Я получаю ошибку на вызове initMouseEvent:

TypeError: Value does not implement interface WindowProxy.

Глядя на переменные:

console.log("element:", ""+element); 
console.log("document:", ""+document); 
console.log("window:", ""+thewindow); 

У них есть странные обертки, но они имеют ожидаемый тип снизу. Любые идеи, как я могу получить призыв к успеху?

element: [object XrayWrapper [object HTMLDivElement]] 
document: [object XrayWrapper [object HTMLDocument]] 
window: [object XrayWrapper [object Window]] 

ответ

0

Решение было заменить window с unsafeWindow и document с unsafeWindow.document.

Я думал, что есть два типа скриптов, сценарии бэкэнда, которые живут в lib, и сценарии содержания, которые живут в data. Оказывается, что хотя скрипты контента могут изменять ваши страницы, они не являются фактически, введенными на страницу. Это не так, как будто вы просто повесили свой скрипт под источником страницы. Insead, скрипты содержимого и скрипты страниц живут в несколько разных контекстах. unsafeWindow - это код window из сценария реальной страницы. Я верю, что причина в том, что вредоносная страница может манипулировать методами ее window и, таким образом, изменять поведение вашего скрипта контента.

Я не знаю, есть ли способ эмулировать события, не используя unsafeWindow (страница может измениться document.createEvent, а что тогда?). Он работает в Chrome без unsafeWindow. Если кто-то указывает, как это сделать правильно, или уточняет, почему это нормально, использовать unsafeWindow, я мог бы принять этот ответ.

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