Объекты в JavaScript, определенные и неопределенные одновременно (в расширении FireFox) - PullRequest
16 голосов
/ 23 февраля 2010

Я ищу ошибку в расширении FireFox. Я наконец-то смог увидеть это сам (раньше у меня были только отчеты), и я не могу понять, как это возможно.

Одно сообщение об ошибке от моего расширения в консоли ошибок: «gBrowser не определен». Это само по себе было бы достаточно удивительно, так как оверлей перекрывает browser.xul и navigator.xul, и я ожидаю, что gBrowser будет доступен из обоих. Еще хуже фактическое место, где это происходит: строка 101 из nextplease.js . То есть внутри функции isTopLevelDocument, которая вызывается только из onContentLoaded, которая вызывается только из onLoad здесь:

gBrowser.addEventListener(this.loadType, function (event) {
    nextplease.loadListener.onContentLoaded(event);
},
true);

То есть gBrowser определено в onLoad, но как-то не определено в isTopLevelDocument.

Когда я попытался на самом деле использовать расширение, я получил еще одну ошибку: «nextplease не определен». Интересно, что это произошло в строках 853 и 857. То есть внутри функций

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

Так что nextplease так или иначе определено достаточно для вызова этих функций, но не определено внутри них.

Наконец, выполнение typeof(nextplease) в Execute JS возвращает «объект». То же самое для gBrowser.

Как это может произойти? Есть идеи?

Ответы [ 2 ]

2 голосов
/ 25 февраля 2010

Для второго случая:

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

Я бы попробовал это вместо:

nextplease.getNextLink = function () {
    this.getLink(window.content, this.NextPhrasesMap, this.NextImagesMap, this.isNextRegExp, this.NEXT_SEARCH_TYPE);
}

nextplease.getPrevLink = function () {
    this.getLink(window.content, this.PrevPhrasesMap, this.PrevImagesMap, this.isPrevRegExp, this.PREV_SEARCH_TYPE);
}
1 голос
/ 01 июня 2010

Я не уверен, что происходит (в каком контексте выполняется код и, следовательно, почему он не видит gbrowser и другие глобальные переменные), но простой обходной путь для неопределенности gbrowser - получить ссылку на главное окно получить доступ оттуда:

var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                     .getInterface(Components.interfaces.nsIWebNavigation)
                     .QueryInterface(Components.interfaces.nsIDocShellTreeItem)
                     .rootTreeItem
                     .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                     .getInterface(Components.interfaces.nsIDOMWindow);

mainWindow.gbrowser.addEventListener( ... )

Это должно работать независимо от контекста, в котором выполняется код, поскольку вы не будете полагаться на глобальные переменные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...