Objects in JavaScript defined and undefined at the same time (in a FireFox extension)
Posted
by Alexey Romanov
on Stack Overflow
See other posts from Stack Overflow
or by Alexey Romanov
Published on 2010-02-22T23:03:11Z
Indexed on
2010/06/01
18:33 UTC
Read the original article
Hit count: 356
I am chasing down a bug in a FireFox extension. I've finally managed to see it for myself (I've only had reports before) and I can't understand how what I saw is possible.
One error message from my extension in the Error Console is "gBrowser is not defined". This by itself would be surprising enough, since the overlay is over browser.xul and navigator.xul, and I expect gBrowser
to be available from both. Even worse is the actual place where it happens: line 101 of nextplease.js. That is, inside the function isTopLevelDocument
, which is only called from onContentLoaded
, which is only called from onLoad
here:
gBrowser.addEventListener(this.loadType, function (event) {
nextplease.loadListener.onContentLoaded(event);
},
true);
So gBrowser
is defined in onLoad
, but somehow undefined in isTopLevelDocument
.
When I tried to actually use the extension, I got another error: "nextplease is not defined". The interesting thing is that it happened on lines 853 and 857. That is, inside the functions
nextplease.getNextLink = function () {
nextplease.getLink(window.content, nextplease.NextPhrasesMap, nextplease.NextImagesMap, nextplease.isNextRegExp, nextplease.NEXT_SEARCH_TYPE);
}
nextplease.getPrevLink = function () {
nextplease.getLink(window.content, nextplease.PrevPhrasesMap, nextplease.PrevImagesMap, nextplease.isPrevRegExp, nextplease.PREV_SEARCH_TYPE);
}
So nextplease
is somehow defined enough to call these functions, but isn't defined inside them.
Finally, executing typeof(nextplease)
in Execute JS returns "object". Same for gBrowser
.
How can this happen? Any ideas?
© Stack Overflow or respective owner