Rhino Overview

はじめに

JavaScript を使用する多くの人たちは、ウェブ・ページの HTML にスクリプトを書き加えていました。しかしながら、Rhino は言語中核だけを実装したもので、HTML ドキュメントを操作するオブジェクトやメソッドは含んでいません。

Rhino が含んでいるものは

言語について

JavaScript 言語自体は、Standard ECMA-262 ECMAScript: 汎用的な、クロス・プラットフォームのプログラミング言語 で標準化されています。 Rhino 1.5 は JavaScript 1.5 の実装で、それは Standard 第 3 版 (3rd Edition) に適合したものです。

また、Rhino 1.6 では ECMA-357 ECMAScript for XML (E4X) を実装しました。標準についての詳細は 仕様書を、Rhino の実装についての詳細は Rhino バージョン 1.6R1 リリースノート を参照してください。

さらに、Rhino は JavaAdapter を実装しました。それは、 JavaScript に Java のインターフェースを実装 (implement) したり、 Java のクラスを拡張 (extend) して JavaScript のオブジェクトにしたりできるものです。詳しくは、enum.js の例を参照してください。

JavaScript が載った多数の本やチュートリアルが利用できます。JavaScript: The Definitive Guide is recommended, and contains a chapter on Rhino.

非推奨の機能

JavaScript 1.2 で採用されたいくつかの言語機能は、現在は使用を控えるべきです。これらの機能は "computational reflection" (自己反映計算) を許すものです。すなわち、スクリプトそれ自体に、スクリプトを評価する方法に対する決定権や影響力を与えるものです。これらの機能は一般に、広く役立つものではありません。さらに、それらは実装による制限に著しい制約を課したり、最適化を妨げたりします。非推奨の機能は、__proto__ 及び __parent__ プロパティ、そして WithClosureCall といったコンストラクタです。 言語バージョン 1.4 で、これらの構文の呼び出しを試みると、エラーになるはずです。他のバージョンについては、警告が表示されるでしょう。【訳注: 試してみてもエラーや警告は出なかった】

国際化

JavaScript エンジンからのメッセージ出力は、デフォルトではプロパティ・ファイル org/mozilla/javascript/resources/Messages.properties から検索されます。カレント・ロケールに対応している拡張のプロパティ・ファイルがあれば、その代わりに使用されるはずです。【訳注: 日本語環境において、Messages_ja.properties ファイルへ 該当するメッセージが登録されているときには、そちらが優先される。その場合、Unicode エスケープにて記述されている必要がある】

JavaScript 言語バージョン

JavaScript エンジンのいくつかの振る舞いは、言語のバージョンに依存します。ブラウザー内蔵のものでの この言語バージョンは、 SCRIPT タグの LANGUAGE 属性に、"JavaScript1.2" のような値を指定することで切り替えることができます。

バージョン 1.3 以上であれば ECMA に適合しています。

演算子の ==!=

バージョン 1.2 では、演算子の ==!= は、厳密な (不) 等価になります。バージョン 1.3 以上であれば、==!= は ECMA と同じ意味です。すべてのバージョンでの、厳密な (不) 等価演算子は、 ===!== です。

ブール値へ変換

バージョン 1.3 より前は、Boolean(new Boolean(false)) は偽 (false) でした。バージョン 1.3 以上では、それは真 (true) です (従って ECMA に適合しています)。【訳注: オブジェクトが存在するから true

Array.prototype.toString and Object.prototype.toString

バージョン 1.2 では、(このメソッドで) 配列またはオブジェクトのリテラル表記を返します ("[1]" とか "{a:1, b:2}" みたいな)。バージョン 1.3 以上では、これらの関数は ECMA に適合しています。

Array コンストラクタ

数値の引数 iArray(i) は、バージョン 1.2 では、i に等しいひとつの要素を持つ配列を構築します。他の、ECMA に適合したバージョンでは、(要素は無いが length プロパティが i である配列を構築する) ように使われます。

String.prototype.substring

バージョン 1.2 では、最初の引数が第二引数未満である場合、2 つの引数は交換されません。他のすべてのバージョンは ECMA に適合しています。【訳注: 正しくは、最初の引数が第二引数より大きいとそれらの引数は交換されるが、バージョン 1.2 では交換されない】

String.prototype.split

バージョン 1.2 では、引数に単一のスペース文字が与えられたとき、分割は Perl4 特殊ケースのように行われます (先行の空白文字 (whitespace) をスキップし、空白文字で分割)。他のすべてのバージョンの、スペース文字での分割は、ECMA 仕様に沿っています。【訳注: 】

セキュリティ

Rhino のセキュリティ機能は、コードの一部 (そして、次々生成されるかもしれないような、あらゆるコード) から、起源を追跡記録する能力を持っています。これらの機能は、Netscape Navigator の JavaScript での、従来の、URL ベース セキュリティポリシーの実装を可能にします。実行する JavaScript コードが信頼できるような、組み込み環境であれば、セキュリティ機能を無視してもよいでしょう。

信頼できない JavaScript コードを実行する (かもしれない) 環境に 組み込む場合、 セキュリティ機能を有効にするために、2 つのことを行わなければなりません。まず、生成されたすべての Context は、SecuritySupport インターフェースを実装したオブジェクトのインスタンスを提供しなければなりません。【訳注: Rhino 1.5R4 以降は, 新しいセキュリティ・インターフェースに置き換えられた】 これは、セキュリティ関連タスクを実行するのに必要なサポート機能を、Rhino に提供するでしょう。

次に、リソースバンドル org.mozilla.javascript.resources.Security 内の security.requireSecurityDomain プロパティの値を、true に変更すべきです。このプロパティの値は、ContextisSecurityDomainRequired メソッドを呼び出すことによって、実行時に判別することができます。このプロパティを true にセットすると、コンパイルあるいは JavaScript を評価 (evaluate) するどんな呼び出しも、 JavaScript コードを識別できるような何らかのオブジェクト・タイプのセキュリティ・ドメイン・オブジェクトを提供しなければなりません。代表的なクライアント環境への組み込みでは、このオブジェクトは、スクリプトを提供したサーバーの URL の文字列かもしれません。あるいは、証明書ベース (certificate-based) のセキュリティポリシーのためのコード部分の署名の表現を含んでいるオブジェクトかもしれません。

JavaScript コードが制限された動作を試みる場合に、セキュリティ・ドメインは次のような方法で獲得することができます。そのクラスのコンテキストは、セキュリティ・マネージャから取得すべきです (java.lang.SecurityManager.getClassContext() を参照してください)。それから、制限された動作の要求によって呼び出されたコードのクラスは、クラスのコンテキストの配列から 適切なインデックスによって取得することができます。呼び出し側が JavaScript ならば、取得したクラスは、たぶん 2 つのタイプのうちの 1 つです。まず、解釈モードが有効である場合、それはインタープリターのクラスかもしれません。次に、クラスファイル生成がサポートされている場合、それは生成されたクラスかもしれません。組み込んだ環境で、Context クラス内の isInterpreterClass() を呼び出して、2 つのケースを識別することができます。それがインタープリター・クラスである場合は、ContextgetInterpreterSecurityDomain() メソッドを呼び出すことで、現在解釈し実行中のスクリプトあるいは関数の、セキュリティ・ドメインを得ることができます。そうでなければ、それは生成されたクラスに違いありません。そして、組み込んだ環境で、SecuritySupport を実装したクラスの getSecurityDomain() を呼び出すことができます。クラスが定義され読み込まれた場合に、適切なセキュリティ・ドメインはそれに付随し、このメソッドを呼び出すことで獲得することができます。一旦セキュリティ・ドメインが決定されたならば、組み込んだ環境で、アクセス可能かどうか判断するのに、適切ないかなるチェックでも実行することができます。

Document Tags and Contributors

タグ:
Contributors to this page: Yoshino
最終更新者: Yoshino,