mozilla

Revision 372861 of Working around the Firefox 1.0.3 DHTML regression

  • リビジョンの URL スラグ: Working_around_the_Firefox_1.0.3_DHTML_regression
  • リビジョンのタイトル: Working around the Firefox 1.0.3 DHTML regression
  • リビジョンの ID: 372861
  • 作成日:
  • 作成者: yoshitanaka
  • 現行リビジョン いいえ
  • コメント

このリビジョンの内容

問題

以下の問題はFireFox1.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]

もし、あなたがこのエラーを取得するならば、二つの可能な解決法があります。

変更は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; }
);

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

さらなる情報

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

このリビジョンのソースコード

<h3 id="The_Problem" name="The_Problem">問題</h3>
<p>以下の問題はFireFox1.0.4リリースでフィックスされていることを書き留めて下さい。この文書は厳密にブラウザのバージョン1.0.3に適用されます。</p>
<p>FireFox 1.0.3では変更され、これは前のバージョンで適切に動作していた ページ上にあらわれる以下のエラーの原因となります:</p>
<pre class="eval">
Error: uncaught exception: [Exception... "Illegal operation
on WrappedNative prototype object" 
nsresult: "0x8057000c (NS_ERROR_XPC_BAD_OP_ON_WN_PROTO)" 
location: "JS frame&nbsp;:: <i>file_url</i>&nbsp;:: anonymous&nbsp;:: line 789"  data: no]
</pre>
<p>もし、あなたがこのエラーを取得するならば、二つの可能な解決法があります。</p>
<h3 id="Solution:_If_.22file_url.22_is_a_Chrome-related_file" name="Solution:_If_.22file_url.22_is_a_Chrome-related_file">解決法:"file_url"はクロームに関連したファイルである場合</h3>
<p>変更はFireFox 1.0.3で実施されました。それは、いかにしてクロームからDOMの内容にアクセスするかについての変更です。これらの変更とあなたが書く必要あるコードの変更について、 <a href="en/Safely_accessing_content_DOM_from_chrome">クロームからのDOMの内容への安全なアクセス</a>についての概要に記載されています。</p>
<h3 id="Solution.2FWorkaround:_If_.22file_url.22_is_a_non-Chrome_.js_or_.html_file" name="Solution.2FWorkaround:_If_.22file_url.22_is_a_non-Chrome_.js_or_.html_file">解決策/動作環境:"file_url"が"非クローム.js"または.html ファイルである場合</h3>
<p>もしこの場合、FireFox 1.0.3の主要なセキュリティをフィックスしている間、我々が不注意に紹介したバグの中で走らせることになります。これらのワークアラウンド(動作環境)は以下に記載します:</p>
<h4 id="Gecko-based_browsers" name="Gecko-based_browsers">Geckoベースのブラウザ</h4>
<pre>
var elementProto = Element.prototype;
elementProto.__proto__ = {
  get text() { return this.firstChild.nodeValue; },
  __proto__: elementProto.__proto__
};
</pre>
<p><b>Note:</b>&nbsp;&nbsp;<code>get text() {...}</code> シンタックスは、非Geckoブラウザでは機能しません。</p>
<h4 id="All_browsers" name="All_browsers">すべてのブラウザ</h4>
<pre>
var elementProto = Element.prototype;
var elementGrandProto = elementProto.__proto__ = {
  __proto__: elementProto.__proto__
};
elementGrandProto.__defineGetter__('text',
  function () { return this.firstChild.nodeValue; }
);
</pre>
<p><b>Note:</b> もしあなたが、あらかじめ定義したプロトタイプの属性を上書きしようとするならば、これらの例で処理したように、その後の代わりにDOMのプロトタイプの先頭にそれらのバニラオブジェクトを置く必要があるかもしれません。この場合、すべてのブラウザに対してDOMのプロトタイプをリセットすることは注意して下さい。(FireFox 1.0.3に対してだけは、ユーザーエージェントとElement.prototypeのリセットを検出する必要があります。他のブラウザは__proto__をサポートしません。そのため、既存のプロトタイプチェインに挿入しないで下さい)</p>
<h3 id="For_more_information" name="For_more_information">さらなる情報</h3>
<p>追加情報は、 <a class="link-https" href="https://bugzilla.mozilla.org/show_bug.cgi?id=290777"> バグ 290777</a>を参照して下さい。</p>
このリビジョンへ戻す