セキュアなラッパー
セキュリティ上の理由で、Lightning Locker は、オブジェクトを非表示にしたり、オブジェクトのセキュアなバージョンでオブジェクトをラップしたりして、グローバルオブジェクトの使用を制限します。たとえば、window のセキュアなバージョンは SecureWindow です。Locker は window へのコールをインターセプトし、代わりに SecureWindow を使用します。メソッドやプロパティによっては、動作が異なるものや、セキュアなオブジェクトで使用できないものがあります。
Lightning Locker では、他のオブジェクト (コンポーネントやイベントなど) のインスタンスも、ラップされたセキュアなバージョンで置き換えられます。最も一般的なラッパーのリストを次に示します。
- SecureAura
- $A のセキュアなラッパー。JavaScript コードのフレームワークを使用するためのエントリポイントです。
- SecureComponent
- 同じ名前空間内の Component オブジェクトのセキュアなラッパー。
- SecureComponentRef
- SecureComponentRef は、異なる名前空間のコンポーネントの外部 API を提供する SecureComponent のサブセットです。
- コントローラまたはヘルパーの使用中は、SecureComponent (基本的に this オブジェクト) にアクセスできます。異なる名前空間でコンポーネントを参照した場合、代わりに SecureComponentRef を取得します。たとえば、マークアップに lightning:button が含まれ、cmp.find("buttonAuraId") をコールすると、lightning:button はボタンマークアップを含むコンポーネントとは異なる名前空間にあるため、SecureComponentRef が返されます。
- SecureDocument
- document オブジェクトのセキュアなラッパー。HTML ドキュメントまたはページのルートノードを表します。document オブジェクトは、ページのコンテンツ (DOM ツリー) へのエントリポイントです。
- SecureElement
- さまざまな HTML 要素を表す Element オブジェクトのセキュアなラッパー。SecureElement は Proxy オブジェクトでラップされているため、そのデータにアクセスされたときに遅延絞り込みを実行できるようにパフォーマンスが最適化されます。したがって、ブラウザコンソールでデバッグしている場合、Proxy オブジェクトは HTML 要素を表します。
- SecureObject
- Lightning Locker によってラップされるオブジェクトのセキュアなラッパー。SecureObject がある場合、通常は基盤となるオブジェクトへのアクセス権がないため、そのプロパティは使用できません。
- SecureWindow
- window オブジェクトのセキュアなラッパー。DOM ドキュメントがあるウィンドウを表します。
Lightning Locker によって公開される DOM API と最も複雑なラッパー (SecureDocument、SecureElement、SecureWindow) の標準 DOM API との違いをすばやく確認しするには、Locker API ビューアを使用します。
例
いくつかのセキュアなラッパーを表すサンプルコンポーネントを見てみましょう。
1<!--c:secureWrappers-->
2<aura:component >
3 <div id="myDiv" aura:id="div1">
4 <p>See how Lightning Locker uses secure wrappers</p>
5 </div>
6 <lightning:button name="myButton" label="Peek in DOM"
7 aura:id="button1" onclick="{!c.peekInDom}"/>
8</aura:component>c:secureWrappers コンポーネントは、<div> HTML 要素と lightning:button コンポーネントを作成します。
次に、DOM 内でピークするクライアント側コントローラを示します。
1({ /* secureWrappersController.js */
2 peekInDom : function(cmp, event, helper) {
3 console.log("div1: ", cmp.find("div1").getElement());
4
5 console.log("button1: ", cmp.find("button1"));
6 console.log("button name: ", event.getSource().get("v.name"));
7 // add debugger statement for inspection
8 // always remove this from production code
9 debugger;
10 }
11})console.log() を使用して、<div> 要素とボタンを調べます。<div> SecureElement は Proxy オブジェクトでラップされているため、そのデータにアクセスされたときに遅延絞り込みを実行できるようにパフォーマンスが最適化されます。
ブラウザコンソールの要素を調べることができるように、コードに debugger ステートメントが追加されています。
ブラウザコンソールに次の式を入力し、結果を確認します。
1cmp
2cmp+""
3cmp.find("button1")
4cmp.find("button1")+""
5window
6window+""
7$A
8$A+""オブジェクトが String に変換されるように、いくつかの式に空の文字列が追加されています。toString() メソッドを使用することもできます。
出力は次のとおりです。
出力の一部を調べてみましょう。
- cmp+""
- c:secureWrappers コンポーネントを表す cmp の SecureComponent オブジェクトを返します。
- cmp.find("button1")+""
- 異なる名前空間のコンポーネントの外部 API を表す SecureComponentRef を返します。この例では、このコンポーネントは lightning:button です。
- window+""
- SecureWindow オブジェクトを返します。
- $A+""
- SecureAura オブジェクトを返します。