Доступ к библиотеке javascript в iframe в скрипте Greasemonkey

Я пытаюсь получить доступ к Dojo в своем веб-приложении, и у меня возникают проблемы с получением того, что мне нужно. В частности, у меня есть веб-приложение в iframe с загруженными разными версиями Dojo:

В Firebug я могу сделать это:

window.dojo.version; // 1.7
window.frames[0].window.dojo.version; // 1.0

(Обратите внимание, что iframe находится в том же домене, что и родитель)

В GreaseMonkey я не могу найти ни одну из версий Dojo:

dojo // undefined
window.dojo // undefined
window.frames[0].window.dojo // undefined 

Я начал изучать unsafeWindow, который якобы мне не следует использовать. Это дает мне доступ к додзё с окном, но не к додзё с iframe, которое я действительно хочу.

unsafeWindow.dojo.version // 1.7 (wrong version)
unsafeWindow.frames[0].dojo // undefined 
unsafeWindow.frames[0].window.dojo // undefined
window.frames[0].window.dojo // undefined
window.frames[0].unsafeWindow // undefined
window.frames[0].window.unsafeWindow // undefined

Я пробовал withDoc, но подозреваю, что использую его неправильно:

unsafeWindow.dojo.withDoc(window.frames[0].window, function(){
    var dijit = unsafeWindow.dijit; // seems wrong; doesn't work
    var widget = dijit.byId('someWidgetInsideIframe');
    console.log(widget); // undefined
}, this);

Любые предложения по другим вещам, которые я могу попытаться получить, чтобы получить доступ к Dojo 1.0 в iframe? Или, если это не так, по крайней мере, выясните, как получить доступ к виджетам додзё, определенным в iframe, используя додзё, к которому у меня есть доступ?


person inanutshellus    schedule 05.06.2012    source источник


Ответы (1)


Я ожидаю, что unsafeWindow.frames[0].window.dojo.version; будет работать, когда GM работает на главной странице (см. ниже). Тот факт, что это не так, на мой взгляд, является ошибкой, но ведущий разработчик GM может с этим не согласиться. Попробуйте подать отчет об ошибке.

Однако Greasemonkey обычно обрабатывает фреймы/iframe, как если бы они были отдельными страницами (за некоторыми исключениями) . Это означает, что скрипт сработает один раз для главной страницы и один раз для каждого кадра, src которого соответствует директивам @include/@exclude/@match. Это также означает, что такие вещи, как window.frames[0], не будут определяться при каждом проходе.

Вы можете сказать, что находитесь в правильном кадре с помощью такого кода:

if (window.self == window.top.frames[0]) {
    //-- Currently running in the target frame
    unsafeWindow.console.log ("dojo.version:", unsafeWindow.dojo.version);
}
else
    unsafeWindow.console.log ("These are not droids... Or, er something.");
person Brock Adams    schedule 05.06.2012
comment
Исправление. В GreaseMonkey 1.0 добавлен модификатор @grant. В моем случае указание @grant none помогло мне. См. wiki.greasespot.net/@grant. - person inanutshellus; 19.11.2012
comment
Это не исправило ошибку, просто обходит песочницу. Но это будет работать, если вам не нужно использовать некоторые функции GM_. - person Brock Adams; 19.11.2012
comment
Это был единственный ответ, который мне удалось получить от ребят из GreaseMonkey (github.com/greasemonkey/ Greasemonkey/issues/1625), и, по их мнению, использование библиотеки JS из iframe довольно вонюче и очень специфично для моих нужд. В этот момент, возможно, отключение песочницы на самом деле не является ужасным вариантом. - person inanutshellus; 19.11.2012
comment
Да, жаль, что ведущий разработчик GM не устранил ошибку. Я предупредил, что он не может; он принял много плохих решений. Вот почему некоторые опытные пользователи переключаются на Scriptish или свои собственные внутренние форки. (Но в целом GM по-прежнему является хорошим инструментом — с безусловно самой большой базой установок.) - person Brock Adams; 20.11.2012