Join MDN and developers like you at Mozilla's View Source conference, 12-14 September in Berlin, Germany. Learn more at https://viewsourceconf.org

Working around the Firefox 1.0.3 DHTML regression

問題

以下の問題は FireFox 1.0.4 リリースで既にフィックスされています。この文書はバージョン 1.0.3 のみに適用されます。

FireFox 1.0.3 では変更され、これは前のバージョンで適切に動作していたページ上にあらわれる以下のエラーの原因となります:

Error: uncaught exception: [Exception... "Illegal operation
on WrappedNative prototype object" 
nsresult: "0x8057000c (NS_ERROR_XPC_BAD_OP_ON_WN_PROTO)" 
location: "JS frame :: file_url :: anonymous :: line 789"  data: no]

もし、あなたがこのエラーに遭遇した場合、解決法は 2 つあります。

変更は FireFox 1.0.3 で実施されました。それは、いかにしてクロームから DOM の内容にアクセスするかについての変更です。これらの変更とあなたが書く必要あるコードの変更について、 クロームからの DOM の内容への安全なアクセスについての概要に記載されています。

解決策/動作環境:"file_url"が"非クローム.js"または.html ファイルである場合

もしこの場合、FireFox 1.0.3 の主要なセキュリティをフィックスしている間、我々が不注意に紹介したバグの中で走らせることになります。これらのワークアラウンド(動作環境)は以下に記載します:

Geckoベースのブラウザ

var elementProto = Element.prototype;

elementProto.__proto__ = {
  get text() { return this.firstChild.nodeValue; },
  __proto__: elementProto.__proto__
};

Note: get text() {...} シンタックスは、非 Gecko ブラウザでは機能しません。

すべてのブラウザ

var elementProto = Element.prototype;
var elementGrandProto = elementProto.__proto__ = {
  __proto__: elementProto.__proto__
};

elementGrandProto.__defineGetter__('text',
  function () { return this.firstChild.nodeValue; }
);

注記: もしあなたが、あらかじめ定義されたプロトタイプの属性を上書きしようとするならば、これらの例で処理したように、その後の代わりに DOM のプロトタイプの先頭にそれらのバニラオブジェクトを置く必要があるかもしれません。この場合、すべてのブラウザに対して DOM のプロトタイプをリセットすることは注意して下さい。 ( FireFox 1.0.3 に対してだけは、ユーザエージェントと Element.prototype のリセットを検出する必要があります。他のブラウザは __proto__ をサポートしません。そのため、既存のプロトタイプチェインに挿入しないで下さい)

さらなる情報

追加情報は、 バグ 290777を参照して下さい。

ドキュメントのタグと貢献者

タグ: 
 このページの貢献者: ethertank, yoshitanaka
 最終更新者: ethertank,