私が提供するプラグイン API オブジェクト以外へのアクセスを許可することなく、アプリケーションのユーザーがその機能を拡張する Javascript でプラグインを作成できるようにしたいと考えています。たとえば、プラグインは次のようになります。
plugin.hookSomeUserAction(function() {
plugin.doSomethingWickedAwesome();
document.title = 'hacked!'; //shouldn't work
});
Caja は仕事を成し遂げることができるように見えますが、ドキュメンテーションはおそらく私が見たオープンソース プロジェクトの中で最悪です (かなりの成果です!)。システムをセットアップするのに助けが必要です。
私は、コマンド ラインで動作する cajoler を取得しました。また、そのようなプラグインの 1 つを、うまくいけばサニタイズされた Javascript に変換しました。だまされた Javascript は、「IMPORTS___」オブジェクトが提供されることを期待しているように見えます。これには、プラグインがアクセスできるすべてのものを含める必要があります。これまでのところかなり有望です!
残念ながら、その甘やかされた Javascript ファイルを実際にロードして実行するのは、本当に面倒なことになりました。関数 loadCaja は実際には google-caja の現在のトランクのどこにも表示されないため、ドキュメントのソース スニペットは残念ながら完全に間違っています。少なくとも何かを行うコードを追跡しました:
<div id="plugin"></div>
<script>
caja.configure({
cajaServer: "/js/caja"
}, function(frameGroup) {
frameGroup.makeES5Frame(document.getElementById('plugin'),
{ /* No network access */ },
function(frame) {
frame.url('/js/plugins/test.js')
.run({});
}
);
});
</script>
残念ながら、これが行うことは、私がすでに甘やかした JavaScript を再び甘やかすように加担しようとすることです。私は間違いなく、サーバーがすべてのリクエストですべてのプラグインを再呼び出しすることに興味がありません。アップロード時にそれを甘やかし、すぐに使えるように保管します。
IMPORTS___ に何が入るかを指定する方法や場所に関するドキュメントも見つかりません (それがセキュリティ モデル全体であることを考えると、ドキュメントの奇妙な見落としのようです)。それは .run() に渡されるオブジェクトですか?