Hatena::Groupmoz-addon

hogezilla RSSフィード

当ページに書かれているコードは、修正BSDライセンスのもと、再頒布して頂いて構いません。

 | 

2012-09-13

“can’t access dead object” エラーを体験する

| 21:29 | はてなブックマーク - “can’t access dead object” エラーを体験する - hogezilla

Firefox 15 からコンテンツがアンロードされたとき、コンテンツ内のデータ(例えばDOM要素)へのリファレンスが強制的に削除されるようになった。これによりメモリに不用意に残り続けていたものが消えて省メモリ化しますよ、となったわけだ。

そして、削除されたオブジェクトのプロパティにアクセスしようとすると、“can’t access dead object”のエラーが出るようになった。

これをワザと出してみようと試みた。

体験するためにスクラッチパッドを使用する。

  1. about:config から devtools.chrome.enabledtrue にする。
  2. スクラッチパッドを起動する
  3. 実行環境メニューから「ブラウザ」を選ぶ
  4. 以下を記入して実行
var tab = gBrowser.loadOneTab("about:blank", { inBackground: false });
tab.linkedBrowser.addEventListener("load", function(e){
    this.removeEventListener("load", arguments.callee, true);
    var doc = this.contentDocument;
    gBrowser.removeTab(tab);
    setTimeout(function(){
        Cu.reportError(doc.title);
    }, 2 * 1000);
}, true);

エラーコンソールに以下の様にでるはず。

時刻: 2012/09/13 21:25:39
エラー: TypeError: can't access dead object
ソースファイル: Scratchpad
行: 7

上記では、var doc = this.contentDocument と Documentオブジェクトへの参照を保持するようにしたが、DOM要素以外でも、var obj = new this.contentWindow.wrappedJSObject.Array("a","b")等の普通のJSオブジェクトでも構わない。

 |