2010-02-22 6 views
16

Sto cercando uno bug in un'estensione FireFox. Sono finalmente riuscito a vederlo da solo (ho avuto solo rapporti prima) e non riesco a capire come sia possibile ciò che ho visto.Oggetti in JavaScript definiti e indefiniti allo stesso tempo (in un'estensione FireFox)

Un messaggio di errore dalla mia estensione nella console degli errori è "gBrowser non è definito". Questo di per sé sarebbe abbastanza sorprendente, poiché l'overlay è su browser.xul e navigator.xul, e mi aspetto che gBrowser sia disponibile da entrambi. Ancora peggio è il luogo in cui si verifica: riga 101 di nextplease.js. Cioè, all'interno della funzione isTopLevelDocument, che viene chiamato solo da onContentLoaded, che viene chiamato solo da onLoad qui:

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

Così gBrowser è definito in onLoad, ma in qualche modo indefinito in isTopLevelDocument.

Quando ho provato a utilizzare effettivamente l'estensione, ho ricevuto un altro errore: "nextplease non è definito". La cosa interessante è che è accaduto sulle linee 853 e 857. Cioè, all'interno le funzioni

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

Così nextplease è in qualche modo definito abbastanza per chiamare queste funzioni, ma non è definito al loro interno.

Infine, l'esecuzione di typeof(nextplease) in Esegui JS restituisce "oggetto". Lo stesso vale per gBrowser.

Come può accadere? Qualche idea?

+2

Variabili quantistiche? –

+7

Bene, il contesto in cui inizialmente il codice viene eseguito non è necessariamente uguale al contesto in cui vengono eseguite le varie funzioni definite. (Non sono uno sviluppatore XUL, quindi sto solo lavorando sui primi principi.) Che cosa succederebbe se nascondessi "gBrowser" e "nextplease" nell'oggetto "nextplease" stesso? O in una chiusura che circonda le definizioni? – Pointy

+4

@Pointy: ottimo punto in effetti. Questo potrebbe rivelarsi un buon esempio del perché le variabili globali sono cattive. Una chiusura potrebbe essere il modo per andare qui ... –

risposta

2

Per il secondo caso:

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

Mi piacerebbe provare questo, invece:

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

Potrebbe valere la pena provare. –

1

Non sono sicuro di quello che sta succedendo (in quale contesto il codice è in esecuzione e quindi il motivo per cui non è vedere gbrowser e altre variabili globali) ma una facile soluzione per gbrowser non definito sarebbe ottenere un riferimento alla finestra principale e accedervi da lì:

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(...) 

Questo dovrebbe funzionare indipendentemente dal contesto in cui il codice è in esecuzione poiché non si farebbe affidamento su variabili globali.

Problemi correlati