aboutsummaryrefslogtreecommitdiff
path: root/files/zh-tw/orphaned/xpcnativewrapper
diff options
context:
space:
mode:
authorFlorian Merz <me@fiji-flo.de>2021-02-11 13:12:08 +0100
committerFlorian Merz <me@fiji-flo.de>2021-02-11 13:12:08 +0100
commit43a5cac2eff22c21071800e13bef12af9d3a37d0 (patch)
treef6e91f8aa958f15bd0b0aabf7b8dfc09063eceda /files/zh-tw/orphaned/xpcnativewrapper
parent8260a606c143e6b55a467edf017a56bdcd6cba7e (diff)
downloadtranslated-content-43a5cac2eff22c21071800e13bef12af9d3a37d0.tar.gz
translated-content-43a5cac2eff22c21071800e13bef12af9d3a37d0.tar.bz2
translated-content-43a5cac2eff22c21071800e13bef12af9d3a37d0.zip
unslug zh-tw: move
Diffstat (limited to 'files/zh-tw/orphaned/xpcnativewrapper')
-rw-r--r--files/zh-tw/orphaned/xpcnativewrapper/index.html237
1 files changed, 237 insertions, 0 deletions
diff --git a/files/zh-tw/orphaned/xpcnativewrapper/index.html b/files/zh-tw/orphaned/xpcnativewrapper/index.html
new file mode 100644
index 0000000000..dfd2d74d9d
--- /dev/null
+++ b/files/zh-tw/orphaned/xpcnativewrapper/index.html
@@ -0,0 +1,237 @@
+---
+title: XPCNativeWrapper
+slug: XPCNativeWrapper
+---
+<p><strong><code>XPCNativeWrapper</code></strong>是一種<a href="/en-US/docs/XPConnect_wrappers">包裝</a>物件讓他可以<a href="/en-US/docs/Safely_accessing_content_DOM_from_chrome">安全的存取特權程式</a>的方法。It can be used in all Firefox versions, though the behavior changed somewhat starting with Firefox 1.5 (Gecko 1.8)。請看<a href="http://kb.mozillazine.org/XPCNativeWrapper"><code>XPCNativeWrapper</code> at the Mozilla knowledgeBase</a>有更多在Firefox 1.5之前的版本的<code>XPCNativeWrapper</code>的行為。這個文件是對Firefox 版本1.5以上的。</p>
+
+
+
+<h2 id="XPCNativeWrapper做了什麼?"><code>XPCNativeWrapper</code>做了什麼?</h2>
+<p>一個<code>XPCNativeWrapper</code>限制他偽裝之屬性的存取以及物件的方法。惟一經由<code>XPCNativeWrapper</code>存取的屬性與方法是那些定義在IDL中,或是由DOM level 0所定義的(雖然有些DOM level 0的屬性跟方法不能在<code>XPCNativeWrapper</code>中作用)。實務上,經由Javascript所增加的屬性不會被<code>XPCNativeWrapper</code>顯露,and nor are getters and setters defined with <code>__defineGetter__</code> and <code>__defineSetter__</code>。這個目的是要允許對物件的IDL定義方法安全的存取。</p>
+
+
+<p>請確定閱讀know bugs章節,特別是當寫的程式是針對1.5.0.x的firefox版本。</p>
+
+
+<h2 id="Types_of_XPCNativeWrapper">Types of <code>XPCNativeWrapper</code></h2>
+
+<p>這裡有三種不同類型的<code>XPCNativeWrapper</code>在Firefox 1.5。三種類型都包裝一個可能不安全(possibly-unsafe)的物件以及提供對他的屬性及方法的安全存取。</p>
+
+<p>三種不同類型的<code>XPCNativeWrapper</code>的行為的差異是由兩個XPCNativeWrpper偽裝器所擁有的特色來決定。一個<code>XPCNativeWrapper</code>可以是明示的Explicit(或是相反的,暗示的Implicit),並且可以是徹底的deep(反之,表面的shallow)。偽裝器創造的類型是由他們被創造的方式所決定,如下:</p>
+
+
+<table>
+ <colgroup>
+ <col>
+ <col>
+ <col>
+ </colgroup>
+ <tbody>
+ <tr>
+ <td>
+ <p>創造</p>
+ </td>
+ <td>
+ <p>明示/暗示</p>
+ </td>
+ <td>
+ <p>徹底/表面</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>被保護的script存取未信任的物件</p>
+ </td>
+ <td>
+ <p>暗示</p>
+ </td>
+ <td>
+ <p>徹底</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>由字串參數呼叫的建構元</p>
+ </td>
+ <td>
+ <p>明示</p>
+ </td>
+ <td>
+ <p>表面</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>由非字串參數所呼叫的建構元</p>
+ </td>
+ <td>
+ <p>明示</p>
+ </td>
+ <td>
+ <p>徹底</p>
+ </td>
+ </tr>
+ </tbody>
+</table>
+
+
+
+<p><strong>Explicit vs. Implicit</strong></p>
+<p>介於explicit與Implicit的<code>XPCNativeWrapper</code>行為的不同是,由非保護的script對Implicit <code>XPCNativeWrapper</code>屬性的存取是不安全的。屬性的存取將經由<code>XPCNativeWrapper</code>的wrappedJSObject被轉交。</p>
+
+
+
+<p>這意味著非保護的script不需要擔心關於bug出現因為其他的code會把他們當作是Implicit來處理。換句話說,這些scripts確實需要注意不安全的物件存取。</p>
+
+
+
+<p>對explicit的<code>XPCNativeWrapper</code>的屬性存取不論是否由被保護的呼叫者呼叫,都是安全的。</p>
+
+
+<p><strong>Deep vs. Shallow</strong></p>
+
+
+<p>Deep和Shallow的<code>XPCNativeWrapper</code>行為的差異是在於一個deep wrapper的屬性被存取或是函式被呼叫時,傳回值也將會被以他自己的<code>XPCNativeWrapper</code>來包裝。新的<code>XPCNativeWrapper</code>也會是deep並且也會是explicit,若且為若屬性被存取的<code>XPCNativeWrapper</code>是explicit。反之,當被存取的屬性或是函式是用shallow wrapper來呼叫,回傳直也許會是不安全的物件。</p>
+
+
+<p>舉例來說,我們給3個<code>XPCNativeWrapper</code>的實例給同樣的<code>window</code>物件。讓我們叫他們做deepExplicit<code>window</code>,deepImplicit<code>window</code>和shallow<code>window</code>。那我們有:</p>
+
+<pre>var doc1 = deepExplicitwindow.<code>document</code>; // doc1現在是<code>document</code>物件的一個deep explicit XPCNativeWrapper //存取doc1.open()是安全的 var doc2 = deepImplicitwindow.<code>document</code>; //假如呼叫者有設定.XPCNativeWrappers=yes, 那doc2現在是<code>document</code> object的deep implicit XPCNativeWrapper //否則doc2現在是不安全的<code>document</code> object, 因為屬性存取是簡單的從不安全的window object被傳送 var doc3 = shallowwindow.<code>document</code>; //doc3現在是不安全的<code>document</code> object <strong>創造</strong><strong>XPCNativeWrapper</strong><strong>物件</strong> 有三種創造XPCNativeWrapper的方式;每種方法對應一種類型的XPCNativeWrapper <strong>被保護的</strong><strong>script</strong><strong>存取未信任的物件</strong> 任何時候一個保護的script存取存取一個未信任的物件將會得到一個implicit deep XPCNativeWrapper。從被保護的script存取這個XPCNativeWrapper的屬性是安全的。 一但物件被包裝,一個用這種方式建立的包裝將會逗留(stick around),另外在一行內存取物件兩次也會拿到相同的XPCNativeWrapper 什麼是被保護的script? 在firefox版本1.5到1.5.0.5, 一個script是被保護的或是不被保護是單獨基於他的URI。一個script是被保護的只有當他的URI由已知被保護的前綴開頭;不是由UR被讀取的script(e.g. 由javascript實作的元件)不是被保護的。在Firefox 1.5內被保護的前綴由Chrome Registry決定。 預設<strong>所有的</strong><strong>content package</strong><strong>是被保護的</strong>,這意味著所有的URI開頭是"chrome:// &lt;package name&gt;/content/"(對任何package)是被保護的。單獨的package用flag覆寫在他們的chrome manifest檔案。 從firefox 1.5.0.6開始,Javascript實作的元件是被保護的script。所以一個script不論是由被URI開頭是保護的前綴所讀取或者是Javascript實作的元件都是被保護的。 什麼是未信任的物件? 所有的物件都是信任或是未信任的。一個物件是被信任的假如有以下任何一項: 1.他的parent(Javascript中的_parent_屬性)是一個信任的物件。 2.他是Javascript元件的根範圍(root scope)物件。 3.他是信任的視窗的window物件。</pre>
+
+
+
+<p>因為所有的DOM物件有<code>window</code>物件在他的_parent_串裡面,所以他們是被信任的若且唯若他的<code>window</code>是被信任的。</p>
+<p>什麼是被信任的<code>window</code>?</p>
+<p>一個<code>window</code>物見是否被信任是依據他的容器。一個<code>window</code>是被信任的假如有以下任何一項:</p>
+<p>1.他是頂層<code>window</code>(e.g.&lt;xul:<code>window</code>&gt;, &lt;xul:dialog&gt;, 或是某些用命令列flag -chrome被傳送的URI)</p>
+<p>2.他的parent是被信任的,且符合以下三種之一:</p>
+<p style="margin-left: 1.25cm;">1.他不是在&lt;xul:iframe&gt;或是&lt;xul:browser&gt;中被讀取</p>
+<p style="margin-left: 1.25cm;">2.&lt;xul:iframe&gt;或&lt;xul:browser&gt;沒有用type屬性讀取他</p>
+<p style="margin-left: 1.25cm;">3.&lt;xul:iframe&gt;或&lt;xul:browser&gt;讀取他的type屬性執不是'content'且沒有用'content-'開頭</p>
+<p>注意一個視窗是否是被信任的<strong>不</strong>依據在<code>window</code>被讀取的URI。所以舉例來說,當在<code>window</code>已經是信任的<code>document</code>內,以下將會件創造信任的視窗</p>
+<p>&lt;xul:browser&gt;</p>
+<p>&lt;xul:browser type=”chrome”&gt;</p>
+<p>&lt;xul:browser type=”rabid_dog”&gt;</p>
+<p>&lt;xul:iframe type=”foofy”&gt;</p>
+<p>&lt;html:iframe&gt;</p>
+<p>&lt;html:iframe type=”content”&gt;</p>
+<p>以下不會建立信任的<code>window</code>s:</p>
+<p>&lt;xul:browser type=”content”&gt;</p>
+<p>&lt;html:iframe type=”content_primary”&gt;</p>
+<p>進一步注意任何未信任的<code>window</code>的child <code>window</code>自動是未信任的。</p>
+<p>當script存取物件時什麼會發生?</p>
+<p>下面這個表描述當一個script存取物件時會發生什麼,以及偽裝器是如何的參與。</p>
+<table>
+ <colgroup>
+ <col>
+ <col>
+ <col>
+ </colgroup>
+ <tbody>
+ <tr>
+ <td>
+ <p>Script</p>
+ </td>
+ <td>
+ <p>Object</p>
+ </td>
+ <td>
+ <p>Effects</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>保護的</p>
+ </td>
+ <td>
+ <p>信任的</p>
+ </td>
+ <td>
+ <p>沒有偽裝器被創造,所以script可以完全存取Object</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>保護的</p>
+ </td>
+ <td>
+ <p>未信任的</p>
+ </td>
+ <td>
+ <p>Implicit deep <code>XPCNativeWrapper</code>被建立</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>未保護的</p>
+ </td>
+ <td>
+ <p>信任的</p>
+ </td>
+ <td>
+ <p>沒有偽裝器被建立,就像protected/trusted的狀況</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>未保護的</p>
+ </td>
+ <td>
+ <p>未信任的</p>
+ </td>
+ <td>
+ <p>沒有偽裝器被建立,就像protected/trusted的狀況</p>
+ </td>
+ </tr>
+ </tbody>
+</table>
+<p><strong>使用<code>XPCNativeWrapper</code></strong><strong>建構元</strong></p>
+<p>以上描述,預設在新的Firefox版本<code>XPCNativeWrapper</code>被自動建立。你不需要使用<code>XPCNativeWrapper</code>建構元,除非你打算讓你的code用在舊版本的瀏覽器或者你關閉了<code>XPCNativeWrapper</code>。</p>
+<p>用字串參數呼叫<code>XPCNativeWrapper</code>建構元</p>
+<p>舉例來說:</p>
+<p>var contentWinWrapper = new <code>XPCNativeWrapper</code>(content, '<code>document</code>');</p>
+<p>這會創造出一個explicit shallow <code>XPCNativeWrapper</code>。這語法被保留為了Firefox 1.5之前的相容性。當contentWinWrapper所有的屬性可以被安全的存取,這些屬性的回傳值不是安全的去存取(就像在版本小於Firefox 1.5裡),因為<code>XPCNativeWrapper</code>是shallow。所以去比較內容文件標題到現在的內容區段,必須要:</p>
+<p>var winWrapper = new <code>XPCNativeWrapper</code>(content, '<code>document</code>', 'getSelection()');</p>
+<p>var docWrapper = new <code>XPCNativeWrapper</code>(winWrapper.<code>document</code>, 'title');</p>
+<p>return docWrapper.title == winWrapper.getSelection();</p>
+<p>沒有字串參數呼叫<code>XPCNativeWrapper</code>建構元</p>
+<p>舉例來說:</p>
+<p>var contentWinWrapper = new <code>XPCNativeWrapper</code>(content);</p>
+<p>這創造了explicit deep <code>XPCNativeWrapper</code>。<code>XPCNativeWrapper</code>存取屬性是安全的,並且回傳值也將會是用explicit deep <code>XPCNativeWrapper</code>包裝的物件。</p>
+<p>(譯注: 可參閱http://kb.mozillazine.org/<code>XPCNativeWrapper</code>)</p>
+<p><strong><code>XPCNativeWrapper</code>生命週期</strong></p>
+<p>Explicit <code>XPCNativeWrapper</code>物件存在當他們被參考到。建立一個新的explicit <code>XPCNativeWrapper</code>給一樣的可能不安全的物件將會建立一個新的偽裝器物件;當設定'expando'參數時,有時要注意。</p>
+<p>Implicit <code>XPCNativeWrapper</code>物件跟他包裝的物件有相同的生命週期。</p>
+<p><strong>設定<code>XPCNativeWrapper</code></strong><strong>的expando</strong><strong>屬性</strong></p>
+<p>為<code>XPCNativeWrapper</code>物件設定expando屬性是可能的。假如這樣做了,那chrome將可以看到他們expando屬性,但內容不行。沒有安全的方式從chrome去設定expando屬性並且讓他從content可讀取。</p>
+<p>存取不安全的屬性</p>
+<p>假如為了某些理由,不安全的屬性存取是必要的,這可以經由偽裝器的wrappedJSObject屬性去來完成。舉例,假如docWrapper是一個doc的偽裝器,那</p>
+<p>docWrapper.wrappedJSObject.prop</p>
+<p>等同於</p>
+<p>doc.prop</p>
+<p>就像這節的名稱,這樣做是<strong>不安全</strong>的。你不因該使用wrappedJSObject去傳遞<code>XPCNativeWrapper</code>在產品的code裡面。</p>
+<p>在firefox3,wrappedJSObject回傳另外一個包覆JS Object的偽裝器(XPCSafeJSObjectWrapper),這允許你安全的觀察內容物件。請見XPCSafeJSObjectWrapper。</p>
+<p>請見Interaction between privileged and non-priviledged pages有另外更好的。</p>
+<p><strong>已知Bugs</strong></p>
+<p>在1.5.0.x版本有兩個已知的bug在<code>XPCNativeWrapper</code></p>
+<p>1.Firefox versions 1.5 through 1.5.0.4 have <a class="link-https" href="https://bugzilla.mozilla.org/show_bug.cgi?id=337095">bug 337095</a>, which causes wrappers to not be created for protected scripts in some cases. Specifically, if a protected script makes a property access or function call that returns an untrusted object, a wrapper will be created. However, if a function in a protected script is called from C++ and an untrusted object is passed as an argument to this function, a wrapper will <strong>not</strong> be created. Functions that expect to be called in this way need to <a href="/en-US/docs/XPCNativeWrapper#XPCNativeWrapper_constructor_call_with_no_string_arguments">do their own wrapping</a>. This bug is fixed in Firefox 1.5.0.5 and later.</p>
+<p>2.Firefox versions 1.5 through 1.5.0.5 have <a class="link-https" href="https://bugzilla.mozilla.org/show_bug.cgi?id=345991">bug 345991</a>, which causes components written in JavaScript to not be protected scripts. This bug is fixed in Firefox 1.5.0.6 and later.</p>
+<p><strong><code>XPCNativeWrapper</code>的限制</strong></p>
+<p>這裡有一些不能被用在<code>XPCNativeWrapper</code>的一般使用的屬性跟程式風格。</p>
+<p>1.對一個DOM node或是<code>window</code>物件的<code>XPCNativeWrapper</code>給予或是讀取一個on*屬性將會丟出Exception。(使用addEventListener取代,並且用event.preventDefault();在你的處理器內假如你之前用了return false;)</p>
+<p>2.不能夠在<code>XPCNativeWrapper</code>內用<code>window</code>名稱存取iframe(e.g. <code>window</code>.framename)。</p>
+<p>3.<code>document</code>.all 在<code>XPCNativeWrapper</code>內不能用。</p>
+<p>4.在<code>XPCNativeWrapper</code>內不行對HTML文件用name存取命名的東西。舉例,假如你有&lt;form name=”foo”&gt;並且docWrapper是一個對HTML文件doc的偽裝器,那當docWrapper為定義時,doc.foo是一個HTMLFormElement。希望這樣做的程式能夠使用docWrapper.forms.namedItem('foo')取代。</p>
+<p>5.對HTML文件,在<code>XPCNativeWrapper</code>內用id存取node是不行的。因該用getElementById()取代。</p>
+<p>6.對HTML form,在<code>XPCNativeWrapper</code>內用name存取input是不行的。想這樣做的程式必須使用form.elements.namedItem('foo')取代。</p>
+<p>7.對HTMLCollection,在<code>XPCNativeWrapper</code>內用name存取元素是步行的。想這樣做的程式碼必須使用namedItem()方法。注意這個namedItem只回傳第一個有name的input元素,即使有很多個有相同名稱的元素(e.g. Radio buttons)。</p>
+<p>8.同樣的,對plugin、pluginArray、或是MimeTypeArray,在<code>XPCNativeWrapper</code>內用name存取items是不行的。你必須使用namedItem()取代。</p>
+<p>9.不能經由<code>XPCNativeWrapper</code>呼叫由NPAPI plugin實作的方法。</p>
+<p>10.不能夠經由<code>XPCNativeWrapper</code>取得(getting)或是設定(setting)由NPAPI plugin實作的屬性。</p>
+<p>11.不能夠經由<code>XPCNativeWrapper</code>呼叫經由XBL binding附加到node上的方法。</p>
+<p>12.不能夠經由<code>XPCNativeWrapper</code>取得(getting)或是設定(setting)經由XBL binding附加到node上的屬性。</p>
+<p>13.經由'for(var p in wrapper)'列舉<code>XPCNativeWrapper</code>的屬性不會列舉IDL定義的屬性。</p>
+<p>14.Object.prototype不在<code>XPCNativeWrapper</code>的原型鍊裡面。As a result,變異的Object.prototype被定義在<code>XPCNativeWrapper</code>(更準確一點,這裡有__proto__,__parent__,__count__,toSource,toLocalString,valueOf,watch,unwatch,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,<code>__defineGetter__</code>,<code>__defineSetter__</code>,__lookupGetter__,and__lookupSetter__)。</p>
+<p>15.沒有實作舊的<code>XPCNativeWrapper</code>有的importXPCNative,</p>
+<p>16.不能經由<code>XPCNativeWrapper</code>存取標準類別(例如Function)。要對特定的<code>window</code>的parent建立function和物件,使用<code>window</code>的eval() function。</p>
+<p>17.對'expando'的屬性使用刪除操作元在<code>XPCNativeWrapper</code>會丟出安全性Exceprion。</p>