1

I'm trying to access Dojo within my webapp, and having issues getting what I need. Specifically, I have a webapp in an iframe with different versions of Dojo loaded:

In Firebug, I can do this:

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

(Note iframe is in same domain as parent)

In GreaseMonkey, I can't find either version of Dojo:

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

I started looking into unsafeWindow which supposedly I shouldn't use. It gives me access to the window'd Dojo, but not the iframe'd dojo I actually want.

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

I've tried withDoc but I suspect I'm using it incorrectly:

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);

Any suggestions on other things I can try to get access to Dojo 1.0 in the iframe? Or if not that, at least figure out how to get access to dojo widgets defined in the iframe using the Dojo I do have access to?

inanutshellus
  • 9,683
  • 9
  • 53
  • 71

1 Answers1

1

I would expect unsafeWindow.frames[0].window.dojo.version; to work when GM is running on the main page (see below). The fact that it doesn't is a bug in my opinion, but the lead GM dev might not agree. Consider filing a bug report.

However, Greasemonkey normally processes frames/iframes as though they were standalone pages (with some exceptions). This means that the script will fire once for the main page and once for each frame whose src matches the @include/@exclude/@match directives. This also means that things like window.frames[0] will not be defined in every pass.

You can tell you are in the right frame with code like this:

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.");
Community
  • 1
  • 1
Brock Adams
  • 90,639
  • 22
  • 233
  • 295
  • **The Fix:** GreaseMonkey 1.0 added the `@grant` modifier. In my case, stating `@grant none` fixed me up. See http://wiki.greasespot.net/@grant – inanutshellus Nov 19 '12 at 16:49
  • That didn't fix the bug, it just bypasses the sandbox. But it would work as long as you don't need to use some of the `GM_` functions. – Brock Adams Nov 19 '12 at 17:47
  • It was the only answer I was able to get out of the GreaseMonkey folks (https://github.com/greasemonkey/greasemonkey/issues/1625), and to their point, using a JS library from within an iframe is pretty smelly and highly specific to my needs. At that point, perhaps turning off the sandbox isn't really a horrible option. – inanutshellus Nov 19 '12 at 18:12
  • Yeah, sorry the lead GM dev didn't cop to the bug. I warned that he might not; he's made a lot of bad decisions. That's why several power-users switch to Scriptish or their own internal forks. (But GM is still a good tool overall -- with, by far, the largest install base.) – Brock Adams Nov 20 '12 at 02:01