kur.jp

バイオリンと自転車をこよなく愛するkurのチラシの裏。たまには技術的なことを書いたりするかも知れません。

ページ読み込み完了前にgBrowserオブジェクトにアクセス出来てしまう

引き続き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初回起動時は以下のような結果になる。

image

ところが、二度目以降に起動すると、以下のような結果になる。gBrowserオブジェクトは存在しているが、gBrowser.selectedTabオブジェクトは定義されていない事がわかる。

image

実際、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
);