LockerServiceについての所感

salesforce lightning lockerservice 2016/04/19 18:43:42

先日、LightningComponent上でサードパーティ製のライブラリを利用可能にするための仕組みとして、 LockerServiceがSalesforceのブログで発表された。

Introducing The LockerService For Lightning Components - Developer Relations

Lightning Locker Serviceのご紹介 | Salesforce Developers Japan Blog

リリースされていないけど、今回のブログをみたのとauraのソースを少しあさった事による所感。


auraのソースで見つけたLockerServiceで使われそうな各オブジェクトのラッパー実装。

Functionに文字列を渡すとコードとして実行できるが、その時にthisがグローバルオブジェクトになる。

JavaScriptではconsttuctorプロパティでオブジェクトのコンストラクタにアクセスできる。

コンストラクタは関数なのでFunctionのインスタンス。

つまり、あらゆるオブジェクトから.constructor.constructorでFunctionを取得できる。

単にアクセスするオブジェクトの名前でホワイトリスト作っても無駄。

あと根本的な問題として、ブラウザ側は多分そんな用途を想定してない。

試してみたら

with({window:{}, document:{}}){
  //...
}

の中に外部のコードを埋め込むことで一応挿げ替えはできそう。

と思って探したらそれっぽいことやってる部分あった。

https://github.com/forcedotcom/aura/blob/97735919d583080a81b4d0a5734f84559a0f121c/aura-resources/src/main/resources/aura/resources/lockerservice/safeEval.html#L35

上記のURLを返す ConfigAdapterImpl#getLockerWorkerURL() メソッド

https://github.com/forcedotcom/aura/blob/97735919d583080a81b4d0a5734f84559a0f121c/aura-impl/src/main/java/org/auraframework/impl/adapter/ConfigAdapterImpl.java#L455

このメソッドが返す値は以下のファイルでauraInitというMapにsafeEvalWorkerというキーで追加されている。

  • aura-impl/src/main/java/org/auraframework/impl/adapter/format/html/BaseComponentDefHTMLFormatAdapter.java
  • aura-impl/src/main/java/org/auraframework/impl/adapter/format/html/BaseComponentHTMLFormatAdapter.java
  • aura/src/main/java/org/auraframework/http/resource/TemplateResource.java
auraInit.put("safeEvalWorker", Aura.getConfigAdapter().getLockerWorkerURL());

たぶんこのマップがJSに渡るのだろう。safeEvalWorkerというキーがJSで使用されている。

https://github.com/forcedotcom/aura/blob/97735919d583080a81b4d0a5734f84559a0f121c/aura-impl/src/main/resources/aura/Aura.js#L645