diff options
Diffstat (limited to 'files/ja/xpcnativewrapper/index.html')
-rw-r--r-- | files/ja/xpcnativewrapper/index.html | 276 |
1 files changed, 0 insertions, 276 deletions
diff --git a/files/ja/xpcnativewrapper/index.html b/files/ja/xpcnativewrapper/index.html deleted file mode 100644 index 8bd0bddd11..0000000000 --- a/files/ja/xpcnativewrapper/index.html +++ /dev/null @@ -1,276 +0,0 @@ ---- -title: XPCNativeWrapper -slug: XPCNativeWrapper -tags: - - Add-ons - - DOM - - Extensions - - Security - - XPCNativeWrapper -translation_of: Mozilla/Tech/Xray_vision ---- -<p> -</p><p><code>XPCNativeWrapper</code> は、<a href="ja/Safely_accessing_content_DOM_from_chrome">特権コードから安全にアクセスする</a>ために、オブジェクトをラップする方法です。 -これは、全てのバージョンの Firefox で利用できますが、Firefox 1.5 (Gecko 1.8) からいくつかの{{ 訳語("挙動", "behavior") }}が変更されています。 -このページでは、Firefox の 1.5 以降の <code>XPCNativeWrapper</code> を前提に記述しています。 -Firefox のバージョンが 1.5 までの場合についての情報は、<a class="external" href="http://kb.mozillazine.org/XPCNativeWrapper">MozillaZine ナリッジベースの <code>XPCNativeWrapper</code> のエントリー</a>を参照してください。 -</p><p>{{ 英語版章題("What_XPCNativeWrapper_does") }} -</p> -<h3 id="XPCNativeWrapper_.E3.81.AF.E4.BD.95.E3.82.92.E3.81.99.E3.82.8B.E3.81.AE.E3.81.8B" name="XPCNativeWrapper_.E3.81.AF.E4.BD.95.E3.82.92.E3.81.99.E3.82.8B.E3.81.AE.E3.81.8B"> <code>XPCNativeWrapper</code> は何をするのか </h3> -<p><code>XPCNativeWrapper</code> は、ラップしたオブジェクトのメソッドとプロパティへのアクセスを制限します。 -<code>XPCNativeWrapper</code> を通した場合、そのプロパティとメソッドへのアクセスは、IDL で定義されているか、DOM レベル 0 で定義されているものに限定されます。 -(ただし、いくつかの DOM レベル 0 のプロパティとメソッドは、<a href="#Limitations_of_XPCNativeWrapper"><code>XPCNativeWrapper</code> 上では動作しません</a>) -特に、JavaScript によって、プロパティを追加した場合や、 -<code>__defineGetter__</code> と <code>__defineSetter__</code> によって、getter と setter を定義した場合には、 -そのオブジェクトに対する <code>XPCNativeWrapper</code> で公開されるようにはなりません。 -この制約によって、そのオブジェクトに対して IDL で定義されている安全なメソッドに確実にアクセスできるようにします。 -</p><p>コードの記述にかかる前に、<a href="#Known_Bugs">既知の問題</a>のセクションを読んで確認するようにしてください。 -Firefox リリース 1.5.0.x を対象にコードを対象にする場合は、特にそうです。 -</p><p>{{ 英語版章題("Types_of_XPCNativeWrapper") }} -</p> -<h3 id="XPCNativeWrapper_.E3.81.AE.E7.A8.AE.E9.A1.9E" name="XPCNativeWrapper_.E3.81.AE.E7.A8.AE.E9.A1.9E"> <code>XPCNativeWrapper</code> の種類 </h3> -<p>Firefox 1.5 の <code>XPCNativeWrapper</code> には、3 種類の異なる型があります。 -3 つの型は全て、{{ 訳語("安全でない可能性がある", "possibly-unsafe") }}オブジェクトをラップし、<a href="#What_XPCNativeWrapper_does">それらのプロパティやメソッドへの安全なアクセス方法</a>を提供します。 -</p><p>3 種類の <code>XPCNativeWrapper</code> の違いは、<code>XPCNativeWrapper</code> のラッパーが持つことができる 2 つの{{ 訳語("特性", "characteristics") }}から決定されます。 -<code>XPCNativeWrapper</code> は、<a href="#Explicit_vs._Implicit"><i>明示的 (explicit)</i></a> (または <i>暗黙的 (implicit)</i>) にでき、かつ <a href="#Deep_vs._Shallow"><i>徹底的 (deep)</i></a> (または <i>表面的 (shallow)</i>) に適用することができます。 -この作成されたラッパーの種類は、以下に示す<a href="#Creating_XPCNativeWrapper_objects">作成されたときの方法</a>により決定されます。 -</p> -<table class="standard-table"> -<tbody><tr> -<th> 作成元 -</th><th> 明示的/暗黙的 -</th><th> 徹底的/表面的 -</th></tr> -<tr> -<th> <a href="#Protected_script_accessing_an_untrusted_object">保護されたスクリプトが信頼できないオブジェクトにアクセスするとき</a> -</th><td> 暗黙的 -</td><td> 徹底的 -</td></tr> -<tr> -<th> <a href="#XPCNativeWrapper_constructor_call_with_string_arguments">文字列引数とともに、コンストラクタが呼び出されたとき</a> -</th><td> 明示的 -</td><td> 表面的 -</td></tr> -<tr> -<th> <a href="#XPCNativeWrapper_constructor_call_with_no_string_arguments">文字列以外の引数とともに、コンストラクタが呼び出されたとき</a> -</th><td> 明示的 -</td><td> 徹底的 -</td></tr></tbody></table> -<p>{{ 英語版章題("Explicit_vs._Implicit") }} -</p> -<h4 id=".E3.80.8C.E6.98.8E.E7.A4.BA.E7.9A.84.E3.80.8D.E3.81.8B.E3.80.8C.E6.9A.97.E9.BB.99.E7.9A.84.E3.80.8D.E3.81.8B" name=".E3.80.8C.E6.98.8E.E7.A4.BA.E7.9A.84.E3.80.8D.E3.81.8B.E3.80.8C.E6.9A.97.E9.BB.99.E7.9A.84.E3.80.8D.E3.81.8B"> 「明示的」か「暗黙的」か </h4> -<p><code>XPCNativeWrapper</code> の挙動が{{ 原語併記("明示的", "explicit") }}か{{ 原語併記("暗黙的", "implicit") }}かの違いは、 -<a href="#What_is_a_protected_script.3F">保護</a>されて<b>いない</b>スクリプトからの、暗黙的な <code>XPCNativeWrapper</code> 上のプロパティへのアクセスは、<b>安全ではない</b>という点です。 -このときのプロパティへのアクセスは、<code>XPCNativeWrapper</code> の <code>wrappedJSObject</code> を通して転送されます。 -</p><p>このことは、<a href="#What_is_a_protected_script.3F">保護</a>されていないスクリプトでは、 -暗黙の <code>XPCNativeWrapper</code> によって想定外のコードが渡されることで、バグが発生することを心配する必要はないことを意味します。 -また、そういったスクリプトからは、安全ではないオブジェクトへアクセスする場合は、用心する必要があることも意味します。 -</p><p>明示的な <code>XPCNativeWrapper</code> 上のプロパティにアクセスする場合は、呼び出し元が<a href="#What_is_a_protected_script.3F">保護</a>されているか否かにかかわらず安全です。 -</p><p>{{ 英語版章題("Deep_vs._Shallow") }} -</p> -<h4 id=".E3.80.8C.E5.BE.B9.E5.BA.95.E7.9A.84.E3.80.8D.E3.81.8B.E3.80.8C.E8.A1.A8.E9.9D.A2.E7.9A.84.E3.80.8D.E3.81.8B" name=".E3.80.8C.E5.BE.B9.E5.BA.95.E7.9A.84.E3.80.8D.E3.81.8B.E3.80.8C.E8.A1.A8.E9.9D.A2.E7.9A.84.E3.80.8D.E3.81.8B"> 「徹底的」か「表面的」か </h4> -<p><code>XPCNativeWrapper</code> の挙動が、{{ 原語併記("徹底的", "deep") }}であるか{{ 原語併記("表面的", "shallow") }}であるかの違いは、 -徹底的なラッパーの場合は、プロパティのアクセスやメソッドの呼び出しで得られた返り値にも、<code>XPCNativeWrapper</code> が作成されてラップされるという点になります。 -このとき、プロパティをアクセスされた <code>XPCNativeWrapper</code> が明示的であった場合には、 -新規の <code>XPCNativeWrapper</code> も、徹底的でかつ、<a href="#Explicit_vs._Implicit">明示的</a>になります。 -これと比較して、表面的なラッパーの場合は、プロパティのアクセスやメソッドの呼び出しで得られた返り値は、安全でないオブジェクトである可能性があります。 -</p><p>例えば、同一のウィンドウオブジェクトに対して、3 つの <code>XPCNativeWrapper</code> のインスタンスが与えられ、 -それらを <code>deepExplicitWindow</code>、<code>deepImplicitWindow</code>、<code>shallowWindow</code> とした場合: -</p> -<pre class="eval">var doc1 = deepExplicitWindow.document; -// これにより doc1 は、文書オブジェクトに対する -// 徹底的かつ明示的な <code>XPCNativeWrapper</code> になります。 -// doc1.open() にアクセスしたとしても安全です。 -</pre> -<pre class="eval">var doc2 = deepImplicitWindow.document; -// 呼び出し元に xpcnativewrappers=yes が設定されている場合、 -// doc2 は、文書オブジェクトに対する徹底的で暗黙的な -// <code>XPCNativeWrapper</code> になります。そうでない場合は、 -// プロパティへのアクセスは、単に安全でないウィンドウオブジェクトに -// 直接渡されるため、doc2 の文書オブジェクトも、安全ではありません。 -</pre> -<pre class="eval">// var doc3 = shallowWindow.document; -// この doc3 の文書オブジェクトは安全ではありません。 -</pre> -<p>{{ 英語版章題("Creating_XPCNativeWrapper_objects") }} -</p> -<h3 id="XPCNativeWrapper_.E3.82.AA.E3.83.96.E3.82.B8.E3.82.A7.E3.82.AF.E3.83.88.E3.81.AE.E7.94.9F.E6.88.90" name="XPCNativeWrapper_.E3.82.AA.E3.83.96.E3.82.B8.E3.82.A7.E3.82.AF.E3.83.88.E3.81.AE.E7.94.9F.E6.88.90"> <code>XPCNativeWrapper</code> オブジェクトの生成 </h3> -<p><code>XPCNativeWrapper</code> オブジェクトの生成には、3 つの異なる方法があり、 -それぞれ、前述の 3 つの型に対応しています。 -</p><p>{{ 英語版章題("Protected_script_accessing_an_untrusted_object") }} -</p> -<h4 id=".E4.BF.9D.E8.AD.B7.E3.81.95.E3.82.8C.E3.81.9F.E3.82.B9.E3.82.AF.E3.83.AA.E3.83.97.E3.83.88.E3.81.8B.E3.82.89.E5.AE.89.E5.85.A8.E3.81.A7.E3.81.AA.E3.81.84.E3.82.AA.E3.83.96.E3.82.B8.E3.82.A7.E3.82.AF.E3.83.88.E3.81.AB.E3.82.A2.E3.82.AF.E3.82.BB.E3.82.B9.E3.81.99.E3.82.8B" name=".E4.BF.9D.E8.AD.B7.E3.81.95.E3.82.8C.E3.81.9F.E3.82.B9.E3.82.AF.E3.83.AA.E3.83.97.E3.83.88.E3.81.8B.E3.82.89.E5.AE.89.E5.85.A8.E3.81.A7.E3.81.AA.E3.81.84.E3.82.AA.E3.83.96.E3.82.B8.E3.82.A7.E3.82.AF.E3.83.88.E3.81.AB.E3.82.A2.E3.82.AF.E3.82.BB.E3.82.B9.E3.81.99.E3.82.8B"> 保護されたスクリプトから安全でないオブジェクトにアクセスする </h4> -<p><a href="#What_is_a_protected_script.3F">保護されたスクリプト</a>が、<a href="#What_is_an_untrusted_object.3F">信頼できないオブジェクト</a>にアクセスするときは、常に<a href="#Explicit_vs._Implicit">暗黙</a>で、<a href="#Deep_vs._Shallow">徹底的</a>な <code>XPCNativeWrapper</code> が使用されます。 -<a href="#What_is_a_protected_script.3F">保護されたスクリプト</a>から、この <code>XPCNativeWrapper</code> のプロパティにアクセスする場合は安全です。 -</p><p>この方法で作成されたラッパーは、オブジェクトをラップしている間は、ラップするオブジェクトに紐付くことになるため、 -1 つの{{ 訳語("処理", "row") }}の中で、同じオブジェクトに 2 回アクセスした場合は、同じ <code>XPCNativeWrapper</code> が取得されることになります。 -</p><p>{{ 英語版章題("What_is_a_protected_script.3F") }} -</p> -<h5 id=".E4.BF.9D.E8.AD.B7.E3.81.95.E3.82.8C.E3.81.9F.E3.82.B9.E3.82.AF.E3.83.AA.E3.83.97.E3.83.88.E3.81.A8.E3.81.AF_.3F" name=".E4.BF.9D.E8.AD.B7.E3.81.95.E3.82.8C.E3.81.9F.E3.82.B9.E3.82.AF.E3.83.AA.E3.83.97.E3.83.88.E3.81.A8.E3.81.AF_.3F"> 保護されたスクリプトとは ? </h5> -<p>Firefox の バージョン 1.5 から 1.5.0.5 までは、スクリプトが保護されるか否かは、その URI だけが基準なっています。 -スクリプトの URI が、保護対象であることを示す既知の{{ 訳語("接頭辞", "prefix") }}で始まる場合のみ保護され、スクリプトが URI を利用して読み込まれない場合 (例: JavaScript で実装されたコンポーネント) は、保護されません。 -Firefox 1.5 では、保護対象を示す接頭辞は、Chrome レジストリで決定されます。 -</p><p>デフォルトでは、<b>全てのコンテントパッケージが保護されます</b>。 -これは、(任意のパッケージで)「<tt><a class=" external" rel="freelink">chrome://</a><package name>/content/</tt>」で始まる全ての URI が保護されるということを意味しています。 -個々のパッケージでは、chrome マニフェストファイルの<a href="ja/Chrome_Registration#xpcnativewrappers">フラグ</a>を使用して変更することが可能です。 -</p><p>Firefox 1.5.0.6 からは、JavaScript で実装されたコンポーネントは、保護されたスクリプトになります。 -このため、スクリプトは保護対象の接頭辞で始まる URI から読み込まれる場合も、JavaScript で実装されたコンポーネントの場合も、両方とも保護されることになります。 -</p><p>{{ 英語版章題("What_is_an_untrusted_object.3F") }} -</p> -<h5 id=".E4.BF.A1.E9.A0.BC.E3.81.A7.E3.81.8D.E3.81.AA.E3.81.84.E3.82.AA.E3.83.96.E3.82.B8.E3.82.A7.E3.82.AF.E3.83.88.E3.81.A8.E3.81.AF_.3F" name=".E4.BF.A1.E9.A0.BC.E3.81.A7.E3.81.8D.E3.81.AA.E3.81.84.E3.82.AA.E3.83.96.E3.82.B8.E3.82.A7.E3.82.AF.E3.83.88.E3.81.A8.E3.81.AF_.3F"> 信頼できないオブジェクトとは ? </h5> -<p>全てのオブジェクトは、{{ 訳語("信頼できる", "trusted") }}か、{{ 訳語("信頼できない", "untrusted") }}かのどちらかになります。 -オブジェクトが信頼できるのは、以下のいずれかに該当する場合です。 -</p> -<ol><li> 親 (JavaScript の <code>__parent__</code> プロパティ) が、信頼できるオブジェクトの場合 -</li><li> JavaScript コンポーネントの「root scope object」である場合 -</li><li> <a href="#What_is_a_trusted_window.3F">信頼できるウィンドウ</a>のウィンドウオブジェクトである場合 -</li></ol> -<p>ウィンドウにある全ての DOM オブジェクトは、そのウィンドウオブジェクトを <code>__parent__</code> チェインの中に含むことになります。 -このため、ウィンドウが信頼できる場合は そのウィンドウの DOM オブジェクトも信頼できます。 -かつ、ウィンドウ中の DOM オブジェクトが信頼できるのは、そのウィンドウオブジェクトが信頼できる場合のみになります。 -</p><p>{{ 英語版章題("What_is_a_trusted_window.3F") }} -</p> -<h5 id=".E4.BF.A1.E9.A0.BC.E3.81.A7.E3.81.8D.E3.82.8B.E3.82.A6.E3.82.A3.E3.83.B3.E3.83.89.E3.82.A6.E3.81.A8.E3.81.AF_.3F" name=".E4.BF.A1.E9.A0.BC.E3.81.A7.E3.81.8D.E3.82.8B.E3.82.A6.E3.82.A3.E3.83.B3.E3.83.89.E3.82.A6.E3.81.A8.E3.81.AF_.3F"> 信頼できるウィンドウとは ? </h5> -<p>ウィンドウが信頼できるかどうかは、そのコンテナに依存します。 -ウィンドウが信頼できるのは、以下のいずれかに該当する場合です。 -</p> -<ol><li> トップレベルウィンドウ (例: <code><xul:window></code>、<code><xul:dialog></code>、コマンドラインから URI に <tt>-chrome</tt> フラグを指定) の場合 -</li><li> 親が信頼でき、以下の 3 つのどれかに該当する場合 -<ol><li> <code><xul:iframe></code> または <code><xul:browser></code> を使用して読み込まれたものではない -</li><li> <code><xul:iframe></code> または <code><xul:browser></code> が読み込む際に type 属性を指定していない -</li><li> <code><xul:iframe></code> または <code><xul:browser></code> が読み込む際に指定された type 属性の値が「content」ではなく、かつ「content-」で始まるものではない。 -</li></ol> -</li></ol> -<p>ウィンドウが信頼できるかどうかは、ウィンドウに読み込まれた URI に依存するもの<b>ではない</b>ことに注意してください。 -したがって、以下に示す例が、既に信頼されているウィンドウの文書で使用された場合は、信頼できるウィンドウを作成します。 -</p> -<ul><li> <code><xul:browser></code> -</li><li> <code><xul:browser type="chrome"></code> -</li><li> <code><xul:browser type="rabid_dog"></code> -</li><li> <code><xul:iframe type="foofy"></code> -</li><li> <code><html:iframe></code> -</li><li> <code><html:iframe type="content"></code> -</li></ul> -<p>また、以下の例は信頼できるウィンドウを作成しません。 -</p> -<ul><li> <code><xul:browser type="content"></code> -</li><li> <code><xul:iframe type="content-primary"></code> -</li></ul> -<p>補足すれば、信頼できないウィンドウの任意の子ウィンドウは、自動的に信頼できないウィンドウになります。 -</p><p>{{ 英語版章題("What_happens_when_a_script_accesses_an_object.3F") }} -</p> -<h5 id=".E3.82.B9.E3.82.AF.E3.83.AA.E3.83.97.E3.83.88.E3.81.8C.E3.82.AA.E3.83.96.E3.82.B8.E3.82.A7.E3.82.AF.E3.83.88.E3.81.AB.E3.82.A2.E3.82.AF.E3.82.BB.E3.82.B9.E3.81.97.E3.81.9F.E9.9A.9B.E3.81.AB.E8.B5.B7.E3.81.93.E3.82.8B.E3.81.93.E3.81.A8.E3.81.AF_.3F" name=".E3.82.B9.E3.82.AF.E3.83.AA.E3.83.97.E3.83.88.E3.81.8C.E3.82.AA.E3.83.96.E3.82.B8.E3.82.A7.E3.82.AF.E3.83.88.E3.81.AB.E3.82.A2.E3.82.AF.E3.82.BB.E3.82.B9.E3.81.97.E3.81.9F.E9.9A.9B.E3.81.AB.E8.B5.B7.E3.81.93.E3.82.8B.E3.81.93.E3.81.A8.E3.81.AF_.3F"> スクリプトがオブジェクトにアクセスした際に起こることは ? </h5> -<p>以下のテーブルは、スクリプトがオブジェクトにアクセスした際に起こることと、ラッパーが{{ 訳語("介在", "involve") }}する方法について説明します。 -</p> -<table class="standard-table"> -<tbody><tr> -<th> スクリプト -</th><th> オブジェクト -</th><th> 効果 -</th></tr> -<tr> -<td> 保護されている </td><td> 信頼できる </td><td> ラッパーは生成されないため、スクリプトからはオブジェクトに完全にアクセス可能 -</td></tr> -<tr> -<td> 保護されている </td><td> 信頼できない </td><td> <a href="#Explicit_vs._Implicit">暗黙</a>で<a href="#Deep_vs._Shallow">徹底的</a>な <code>XPCNativeWrapper</code> が生成される -</td></tr> -<tr> -<td> 保護されない </td><td> 信頼できる </td><td> ラッパーは作成されず、保護 + 信頼の場合と同様になる -</td></tr> -<tr> -<td> 保護されない </td><td> 信頼できない </td><td> ラッパーは作成されず、保護 + 信頼の場合と同様になる -</td></tr></tbody></table> -<p>{{ 英語版章題("XPCNativeWrapper_constructor_call_with_string_arguments") }} -</p> -<h4 id="XPCNativeWrapper_.E3.81.AE.E3.82.B3.E3.83.B3.E3.82.B9.E3.83.88.E3.83.A9.E3.82.AF.E3.82.BF.E3.82.92.E6.96.87.E5.AD.97.E5.88.97.E5.BC.95.E6.95.B0.E3.81.A7.E5.91.BC.E3.81.B3.E5.87.BA.E3.81.99" name="XPCNativeWrapper_.E3.81.AE.E3.82.B3.E3.83.B3.E3.82.B9.E3.83.88.E3.83.A9.E3.82.AF.E3.82.BF.E3.82.92.E6.96.87.E5.AD.97.E5.88.97.E5.BC.95.E6.95.B0.E3.81.A7.E5.91.BC.E3.81.B3.E5.87.BA.E3.81.99"> <code>XPCNativeWrapper</code> のコンストラクタを文字列引数で呼び出す </h4> -<p>例: -</p> -<pre class="eval">var contentWinWrapper = new XPCNativeWrapper(content, - "document"); -</pre> -<p>この例は、<a href="#Explicit_vs._Implicit">明示的</a>で<a href="#Deep_vs._Shallow">表面的</a>な <code>XPCNativeWrapper</code> を作成します。 -この構文は、Firefox 1.5 より前のバージョンとの互換性を維持するために用意されています。 -<code>contentWinWrapper</code> オブジェクトの全てのプロパティにわたり、安全にアクセスすることは可能ですが、これらのプロパティの戻り値は (Firefox 1.5 までと同様に) 安全にアクセスすることはできません。 -このため、この <code>XPCNativeWrapper</code> は <a href="#Deep_vs._Shallow">表面的</a>ということになります。 -したがって、コンテントの文書タイトルと、現在の{{ 訳語("選択", "selection") }}を比較するためには、以下のようにする必要があります。 -</p> -<pre class="eval">var winWrapper = new XPCNativeWrapper(content, "document", - "getSelection()"); -var docWrapper = new XPCNativeWrapper(winWrapper.document, - "title"); -return docWrapper.title == winWrapper.getSelection(); -</pre> -<p>これは、Firefox 1.5 までのバージョンの場合と同様になります。 -この <code>"getSelection()"</code> 引数は、厳密にはここでは必要ないことに注意してください。 -もし、このコードを Firefox 1.5 より前のバージョンに使用するつもりがないのであれば、削除してもかまいません。 -Firefox 1.5 以降で、この型の <code>XPCNativeWrapper</code> を作成する場合は、 -ラップするオブジェクトのあとに置く引数は、文字列引数が 1 つだけ必要になります。 -</p><p>{{ 英語版章題("XPCNativeWrapper_constructor_call_with_no_string_arguments") }} -</p> -<h4 id="XPCNativeWrapper_.E3.81.AE.E3.82.B3.E3.83.B3.E3.82.B9.E3.83.88.E3.83.A9.E3.82.AF.E3.82.BF.E3.82.92.E6.96.87.E5.AD.97.E5.88.97.E5.BC.95.E6.95.B0.E3.81.AA.E3.81.97.E3.81.A7.E5.91.BC.E3.81.B3.E5.87.BA.E3.81.99" name="XPCNativeWrapper_.E3.81.AE.E3.82.B3.E3.83.B3.E3.82.B9.E3.83.88.E3.83.A9.E3.82.AF.E3.82.BF.E3.82.92.E6.96.87.E5.AD.97.E5.88.97.E5.BC.95.E6.95.B0.E3.81.AA.E3.81.97.E3.81.A7.E5.91.BC.E3.81.B3.E5.87.BA.E3.81.99"> <code>XPCNativeWrapper</code> のコンストラクタを文字列引数なしで呼び出す </h4> -<p>例: -</p> -<pre class="eval">var contentWinWrapper = new XPCNativeWrapper(content); -</pre> -<p>この例は、<a href="#Explicit_vs._Implicit">明示的</a>で、<a href="#Deep_vs._Shallow">徹底的</a>な <code>XPCNativeWrapper</code> を作成します。 -この <code>XPCNativeWrapper</code> のプロパティにアクセスした場合は安全で、かつ戻り値も<a href="#Explicit_vs._Implicit">明示的</a>で、<a href="#Deep_vs._Shallow">徹底的</a>な <code>XPCNativeWrapper</code> オブジェクトでラップされることになります。 -</p><p>{{ 英語版章題("Setting_.22expando.22_properties_on_XPCNativeWrapper") }} -</p> -<h3 id="XPCNativeWrapper_.E3.81.AE_.22expando.22_.E3.83.97.E3.83.AD.E3.83.91.E3.83.86.E3.82.A3.E3.82.92_on_.E3.81.AB.E3.81.99.E3.82.8B" name="XPCNativeWrapper_.E3.81.AE_.22expando.22_.E3.83.97.E3.83.AD.E3.83.91.E3.83.86.E3.82.A3.E3.82.92_on_.E3.81.AB.E3.81.99.E3.82.8B"> <code>XPCNativeWrapper</code> の "expando" プロパティを on にする </h3> -<p><code>XPCNativeWrapper</code> オブジェクトに対して、"expando" プロパティ (IDL で定義されたプロパティと関係しない名前を持つプロパティ) を設定することが可能です。 -設定した場合、chrome では、これらの expando プロパティを参照できますが、コンテントからは参照できません。 -<b>chrome から expando プロパティを設定し、それをコンテントから読み込めるようにする安全な方法は存在しません。</b> -</p><p>{{ 英語版章題("XPCNativeWrapper_lifetime") }} -</p> -<h3 id="XPCNativeWrapper_.E3.81.AE.E5.AF.BF.E5.91.BD" name="XPCNativeWrapper_.E3.81.AE.E5.AF.BF.E5.91.BD"> <code>XPCNativeWrapper</code> の寿命 </h3> -<p>明示的な <code>XPCNativeWrapper</code> オブジェクトは、参照されている間存在することになります。 -同じ信頼できない可能性があるオブジェクトに対して、新規に明示的な <code>XPCNativeWrapper</code> を作成した場合、新規のラッパーオブジェクトが作成されます。 -このことは、<a href="#Setting_.22expando.22_properties_on_XPCNativeWrapper">"expando" プロパティの設定</a>を行う場合には、気をつけておく必要があります。 -</p><p>また、暗黙の <code>XPCNativeWrapper</code> オブジェクトは、ラップしているオブジェクトと同じ寿命を持っています。 -</p><p>{{ 英語版章題("Accessing_unsafe_properties") }} -</p> -<h3 id=".E5.AE.89.E5.85.A8.E3.81.A7.E3.81.AA.E3.81.84.E3.83.97.E3.83.AD.E3.83.91.E3.83.86.E3.82.A3.E3.81.B8.E3.81.AE.E3.82.A2.E3.82.AF.E3.82.BB.E3.82.B9" name=".E5.AE.89.E5.85.A8.E3.81.A7.E3.81.AA.E3.81.84.E3.83.97.E3.83.AD.E3.83.91.E3.83.86.E3.82.A3.E3.81.B8.E3.81.AE.E3.82.A2.E3.82.AF.E3.82.BB.E3.82.B9"> 安全でないプロパティへのアクセス </h3> -<p>もし、何らかの利用によってプロパティへの安全でないアクセスが必要になった場合、ラッパーの <code>wrappedJSObject</code> プロパティを経由することで行うことができます。 -例えば、<code>docWrapper</code> が、<code>doc</code> のラッパーである場合、 -</p> -<pre class="eval">docWrapper.wrappedJSObject.prop -</pre> -<p>は、以下と同じです。 -</p> -<pre class="eval">doc.prop -</pre> -<p>{{ 英語版章題("Known_Bugs") }} -</p> -<h3 id=".E6.97.A2.E7.9F.A5.E3.81.AE.E3.83.90.E3.82.B0" name=".E6.97.A2.E7.9F.A5.E3.81.AE.E3.83.90.E3.82.B0"> 既知のバグ </h3> -<p>バージョンが 1.5.0.x のものに含まれる <code>XPCNativeWrapper</code> には、2 つの既知のバグがあります。 -</p> -<ol><li> Firefox のバージョン 1.5 から 1.5.0.4 には {{ Bug(337095) }} があり、 これによっていくつかの状況で保護されたスクリプトに対してラッパーが作成されないことがあります。 特に保護されたスクリプトがプロパティのアクセスや関数の呼び出しを行って信頼できないオブジェクトが戻される場合、ラッパーが生成されますが、 保護されたスクリプトにある関数が C++ から呼び出され、信頼できないオブジェクトが引数として関数に渡された場合、ラッパーは作成<b>されません</b>。 関数がこの方法で呼び出されることが想定される場合には、<a href="#XPCNativeWrapper_constructor_call_with_no_string_arguments">自身でラッピング</a>する必要があります。 このバグは Firefox 1.5.0.5 以降で解消されています。 -</li><li> Firefox のバージョン 1.5 から 1.5.0.5 には {{ Bug(345991) }} があり、これによって JavaScript で記述されたコンポーネントが保護されたスクリプトになりません。 このバグは Firefox 1.5.0.6 以降で解消されています。 -</li></ol> -<p>{{ 英語版章題("Limitations_of_XPCNativeWrapper") }} -</p> -<h3 id="XPCNativeWrapper_.E3.81.AE.E5.88.B6.E9.99.90.E4.BA.8B.E9.A0.85" name="XPCNativeWrapper_.E3.81.AE.E5.88.B6.E9.99.90.E4.BA.8B.E9.A0.85"> <code>XPCNativeWrapper</code> の制限事項 </h3> -<p><code>XPCNativeWrapper</code> を使用する場合、いくつかの一般的に使用されるプロパティやコーディングスタイルが使用できない場合があります。 特に注意すべき点を列挙します。 -</p> -<ol><li> DOM ノードや Window オブジェクトに設定された <code>XPCNativeWrapper</code> の、<code>on*</code> プロパティを設定したり読み込もうとすると例外が送出されます。 (addEventListener を代わりに使用し、もし以前に "return false;" を使用していた場合には、作成したハンドラの中で "event.preventDefault();" を行うようにしてください) -</li><li> ウィンドウ名によるフレームアクセス (例: <code>window.frameName</code>) は、<code>XPCNativeWrapper</code> 上では動作しません。 -</li><li> document に設定された <code>XPCNativeWrapper</code> では <code>document.all</code> は動作しません。 -</li><li> HTML の document に設定された <code>XPCNativeWrapper</code> では、名前付きのアイテムを名前でアクセスすることができません。 例えば、<code>doc</code> という HTML 文書 があり、そこに <code><form name="foo"></code> があって、<code>docWrapper</code> がこの文書に対するラッパーである場合、<code>doc.foo</code> は、<code>HTMLFormElement</code> になりますが、<code>docWrapper.foo</code> は <code>undefined</code> になってしまいます。 ラッパーを利用する場合は、代わりにコードとして <code>docWrapper.forms.namedItem("foo")</code> を使用すればうまくいきます。 -</li><li> HTML の document に設定された <code>XPCNativeWrapper</code> では、id によるノードアクセスは動作しません。 代わりに <code>getElementById</code> を使う必要があります。 -</li><li> HTML の form に設定された <code>XPCNativeWrapper</code> では、名前による入力項目へのアクセスは動作しません。 この場合は、コードとして <code>form.elements.namedItem("inputname")</code> を使用すればうまくいきます。 -</li><li> <code>HTMLCollection</code> に設定された <code>XPCNativeWrapper</code> では、名前による要素のアクセスが動作しません。 この場合は、コードとして <code>namedItem()</code> メソッドを使用する必要があります。 なお <code>namedItem</code> は、(例えばラジオボタンのように) フォームの中に同じ名前の要素が複数あったとしても、その名前に該当する最初の入力要素だけを戻すことに注意してください。 -</li><li> 関連するノードに設定された <code>XPCNativeWrapper</code> を通しての NPAPI プラグインによって実装されたメソッドの呼び出しは動作しません。 -</li><li> 関連するノードに設定された <code>XPCNativeWrapper</code> を通しての NPAPI プラグインによって実装されたプロパティの取得や設定は動作しません。 -</li><li> ノードに設定された <code>XPCNativeWrapper</code> を通して、そのノードに結びつけられた XBL バインディングによって実装されたメソッドの呼び出しは動作しません。 -</li><li> ノードに設定された <code>XPCNativeWrapper</code> を通して、そのノードに結びつけられた XBL バインディングによって実装されたプロパティの設定や取得は動作しません。 -</li><li> "<code>for (var p in wrapper)</code>" によって、<code>XPCNativeWrapper</code> のプロパティの{{ 訳語("列挙", "enumerate") }}を行った場合、IDL で定義されたプロパティは列挙されません。 -</li><li> Object.prototype は、<code>XPCNativeWrapper</code> の prototype チェインに含まれません。 そのため、<code>XPCNativeWrapper</code> では、いくつかの <code>Object.prototype</code> プロパティが undefined になります。 (正確には、<code>__proto__</code>, <code>__parent__</code>, <code>__count__</code>, <code>toSource</code>, <code>toLocaleString</code>, <code>valueOf</code>, <code>watch</code>, <code>unwatch</code>, <code>hasOwnProperty</code>, <code>isPrototypeOf</code>, <code>propertyIsEnumerable</code>, <code>__defineGetter__</code>, <code>__defineSetter__</code>, <code>__lookupGetter__</code>, and <code>__lookupSetter__</code> が該当します) -</li><li> 古い <code>XPCNativeWrapper</code> の実装に存在した <code>importXPCNative</code> メソッドは現在ではサポートされていません。 -</li><li> XPCNativeWrapper を通して、(<code>Function</code> のような) {{ 訳語("標準クラス", "standard classes") }}へのアクセスは動作しません。 特定のウィンドウの親を伴って、関数やオブジェクトを生成したい場合は、そのウィンドウの <code>eval</code> 関数を使用してください。 -</li></ol> -<p><a class="external" href="http://oreillynet.com/pub/a/network/2005/11/01/avoid-common-greasemonkey-pitfalls.html?page=3">Avoid Common Pitfalls in Greasemonkey</a> には、これらの制限事項のいくつかについての詳細な説明があります (Greasemonkey スクリプトから利用する観点です)。 -</p><p><br> -</p> -<div class="noinclude"> -</div> -{{ languages( { "en": "en/XPCNativeWrapper", "es": "es/XPCNativeWrapper", "fr": "fr/XPCNativeWrapper", "it": "it/XPCNativeWrapper", "pl": "pl/XPCNativeWrapper" } ) }} |