引き続きFirefoxの機能拡張を作ってるんだけど、不思議な現象に遭遇した。
Firefoxを初回に起動したときにはgBrowserが定義されているのに、二度目に起動したときにはgBrowserが未定義となる。このことに気がつかずに、ちょっとハマってしまったのでメモ。
この現象に遭遇するためのコードはこんな感じ。
if(gBrowser){ Application.console.log("gBrowser is defined"); }else{ Application.console.log("gBrowser is not defined"); } if(gBrowser.selectedTab){ Application.console.log("gBrowser.selectedTab is defined"); }else{ Application.console.log("gBrowser.selectedTab is not defined"); } window.addEventListener( "load", function () { Application.console.log("Loaded"); }, false );
これを実行してみると、Firefox初回起動時は以下のような結果になる。
ところが、二度目以降に起動すると、以下のような結果になる。gBrowserオブジェクトは存在しているが、gBrowser.selectedTabオブジェクトは定義されていない事がわかる。
実際、mozillaのWebサイトを見て見ると、以下のように書いてあるので、挙動としては後者のほうが正しい気がする。
gBrowser
が未定義ならば、あなたのコードはブラウザウィンドウのスコープで実行されていないか、もしくは早い段階で実行されすぎています。gBrowser
にはブラウザウィンドウが完全にロードされた後でのみアクセス出来ます。
では、初回起動時にオブジェクトが存在するのは何故なんだろうか?不思議です。ちなみに、ブラウザウィンドウが完全にロードされた後でコードを実行するにはこんな感じでコードを書けばいい。
this.onPageLoad = function() { if(gBrowser){ Application.console.log("gBrowser is defined"); }else{ Application.console.log("gBrowser is not defined"); } if(gBrowser.selectedTab){ Application.console.log("gBrowser.selectedTab is defined"); }else{ Application.console.log("gBrowser.selectedTab is not defined"); } } var self = this; window.addEventListener( "load", function () { self.onPageLoad(); }, false );