ガジェットは、HTML、CSS、JavaScript に基づくウェブ ベースのソフトウェア コンポーネントです。ガジェットを使えば、デベロッパーは、ウェブ上のどのような場所でも変更なしで動作する便利なウェブ アプリケーションを簡単に作成できます。ガジェットは宣言型の XML 構文を使って定義されます。この XML 構文はガジェット サーバーで処理され、スタンドアロンのウェブ ページ、ウェブ アプリケーション、他のガジェットなど、さまざまなコンテキストに埋め込むことのできる形式に変換されます。ガジェットの埋め込み先であるコンテキストをガジェット コンテナと呼びます。コンテナはガジェットのレイアウトとコントロールを管理すると共に、ガジェットに代わってさまざまな機能をサポートします。ガジェットを使って簡単なウィジェット、再利用可能なコンポーネント、本格的なアプリケーションなどを作成できます。また、ガジェットは他のガジェットを使ったり他のガジェットとやり取りすることもできます。
ガジェットとその XML は同義です。ガジェットの XML には、ウェブ アプリケーションの識別と表示に必要なすべての情報が含まれます。
メタデータ。ガジェット デベロッパーはガジェットの XML 内にいくつかのメタデータを指定します。たとえば作成者の情報、ガジェットのタイトル、ガジェットの説明などを指定します。このデータによってガジェット コンテナにガジェットを識別するためのヒントが与えられるだけでなく、ガジェット ディレクトリにデータが提供されます。ガジェット ディレクトリはデータベースです。ユーザーはこのデータベースを使って、ニーズに応じた便利なガジェットを簡単に見つけることができます。
ガジェット機能。ガジェットのすべての機能を意味します。これには、ガジェットを動作させるために必要な機能、またはオプションで使用できる機能 (利用可能な場合) があります。ガジェット機能は、ガジェットが採用する主要な拡張性メカニズムです。通常は、ガジェット機能を使って、新しい JavaScript API をレンダリング コードで使用できるようにガジェット サーバーに指示します。ただし、拡張された構文を追加するなど、ガジェット機能を使ってガジェットのコンテンツを操作することもできます。ガジェット機能の例としては、OpenSocial (ガジェットに豊富なソーシャル API セットを提供する)、dynamic-height (ガジェットが自身を適切な高さに調整できるようにする)、タブ (表形式の操作を使用する UI ライブラリ) などがあります。
ユーザー設定。ユーザー設定はキーと値のペアです。これは、ガジェットの設定と永続性を確保するための基礎です。ほとんどの場合、ユーザー設定はガジェット ユーザーによって操作され、その後、ユーザーに代わって永続的に保持されます。これにより、ガジェットは複数のレンダリング要求にわたって、操作されたユーザー設定にアクセスできます。通常、ガジェット コンテナは、ユーザー設定データの永続性と、そのデータを編集するためのインターフェースを提供します。
メッセージ バンドル。メッセージ バンドルを使えば、デベロッパーはガジェットを簡単にグローバル化できます。方法は、サポート対象として選択した言語に応じて名前とメッセージのマッピングを追加するだけです。このメッセージには、すべてのガジェットに提供されているコア JavaScript API を通じてプログラム的にアクセスできます。また、簡単な構文を使ってこのメッセージをコードに静的に代入することもできます。
コンテンツ。ガジェットによってレンダリングされる実際の HTML、CSS、JavaScript を提供します。2 種類の配信メカニズムがサポートされます。
ガジェットの XML 内には複数のコンテンツ セクションを指定できます。それぞれのコンテンツ セクションは、1 つ以上のオプションのビュー ID を使ってラベル付けできます。これにより、レンダリングされるコンテンツに従ってガジェットの動作や表示を変えることができます。このコンテキストはガジェット コンテナにより提供されます。
このドキュメントでは、ガジェットの XML 構文と、互換性のあるガジェット サーバーでその XML 構文がどのように処理されるについて説明します。さらに、レンダリング時にすべてのガジェットで使用可能であるべき、コア JavaScript API について説明します。このコア API のみをサポートすることでコンプライアンスは達成できますが、これをサポートすることでガジェット サーバーの有用性が制限されます。ガジェット サーバーはできるだけ多くの機能をサポートする必要があります。このドキュメントの最後に、広く使用されている推奨機能を紹介します。
サーバーをガジェット準拠にするには、以下に説明するように、サーバーがガジェットのレンダリング要求と JavaScript 要求を満たすことができる必要があります。またサーバーは、以下に説明するように、ガジェットのメタデータ要求を満たすことができる必要があります。
コア Gadget API は、ガジェット XML を、ブラウザ (通常は IFRAME) 内でレンダリングできるコンテンツに変換します。
nocache という URL パラメータを使ってこの機能がサポートされる必要があります。__<TYPE>_<ID>__ です。この変数は文字列値で置き換えられます。Hangman 変数には次のように 4 つの種類があります。
__MSG_foo__ Hangman 変数に変換します。
foo で値が bar の各メッセージでは、Hangman 拡張 __MSG_foo__ = bar。foo で値が bar の、指定された各ユーザー設定では、Hangman 拡張 __UP_foo__ = bar。__MODULE_ID__ = <provided module
ID>。
mid という URL パラメータを使う必要があります。__BIDI_START_EDGE__ = "right"、__BIDI_END_EDGE__
= "left"、__BIDI_DIR__ = "rtl"、__BIDI_REVERSE_DIR__ = "ltr"。それ以外の場合は、__BIDI_START_EDGE__ = "left"、__BIDI_END_EDGE__ =
"right"、__BIDI_DIR__ = "ltr"、__BIDI_REVERSE_DIR__ = "rtl"。Module.ModulePrefs attributes、Module.Content@href、Module.Content、UserPref@display_name、UserPref@default_value、UserPref.EnumValue@display_value<Require> または <Optional> として指定されているガジェット機能を処理します。
<Require> ブロックにサポートされない機能が 1 つ以上指定されている場合、サーバーは標準のエラーメッセージを出力し、レンダリング要求を満たすことができないことを示す必要があります。
<Optional> 機能に適用されます。
gadgets.util.hasFeature(featureName)
featureName を満たすことができる場合に true を返し、そうでない場合に false を返します。ガジェット デベロッパーはこの機能性を使ってガジェットを拡張できます。機能が利用可能な場合は、その機能が欠落していてもガジェットを無効にする必要はありません。<html> タグと <body> タグで開始される標準 HTML ヘッダー。<head> 情報はオプションです。ガジェットはブラウザ固有のモードで動作します。 gadgets.util.runOnLoadHandlers(); の単独呼び出し。up_<name>=<value>。lang=<language> と country=<country>。libs=<jsLib>。<jsLib> は、サーバーの JavaScript リクエスト ハンドラのパスに対する相対的な URL パス フラグメントのカンマ区切りリストです。このフラグメントは、URL 型のターゲットによって JS パスに追加されます。これにより、Gadget API JavaScript が実行コンテキストに読み込まれます。
この API は、ガジェット コンテナに、ページでガジェットをレンダリングする方法を指示し、ガジェットの機能をサポートするために必要なコンテナ側の JavaScript を提供します。
ブラウザのセキュリティ モデルが原因で、Gadget API リクエストを満たすためにガジェット コンテナのサポートが必要になることはよくあります。たとえば dynamic-height 機能を使えば、ガジェットはコンテンツに応じて自身のサイズを変更するよう要求できます。これは特にガジェットが IFRAME で使用される場合に役立ちます。ほとんどの場合、ガジェットはそのコンテナとは異なるドメインでレンダリングされます。したがって、ガジェットは自身の高さを変更できません。その代わりに、ガジェットは、サイズ変更を要求するコンテナに対してドメイン間のプロシージャ呼び出しを実行します。このコミュニケーションは、コア gadgets.rpc.* API を使って実行されます。この API は、ブラウザ固有の技術を使って、同じブラウザ コンテキスト内に配置された異なるドメイン上のフレーム間でメッセージの受け渡しを行います。コンテナはこのリクエストを受け取り、そのリクエストに応答できるようにする必要があります。これが、コンテナ側の JavaScript の機能です。
ガジェットのレンダリング要求の URL ではなく、ガジェットのメタデータ要求の API では、セキュリティ上の理由でサニタイズされたガジェット出力のバージョンを返すことができます。Caja プロジェクト ではこのサニタイズが提供されます。そのサニタイズでは、静的な分析手法を使用して HTML、CSS、JavaScript が書き換えられて、危険な DOM やガジェット コンテンツへの危険な Cookie アクセスが排除される一方で、IFRAME 内で単純に実行されるコンテンツに近い表現力が維持されます。ただし、この機能は依然として試行段階であるため、現時点でコア仕様に含まれていません。
<Require> または <Optional> として指定されているガジェット機能を処理します。
URL 型ガジェットの JavaScript ライブラリ読み込み要求を満たすために、サーバーは、機能にリンクされたコア JavaScript を取得する HTTP サービスを提供する必要があります。
サーバーは、すべてのコア API を、Gadgets API リファレンスに準拠する方法で提供する必要があります。コンテナがすべてを自動で提供するので、ガジェット デベロッパーはこのいずれの機能も要求する必要はありません。
| ファイル | JsDoc |
|---|---|
| prefs.js | ドキュメント |
| io.js | ドキュメント |
| json.js | ドキュメント |
| util.js | ドキュメント |
ほとんどのガジェットに 1 つ以上の機能が含まれます。ガジェット サーバーがサポートする機能が増加するほど、ガジェット サーバーがサポートするガジェットも増加します。したがって、各ガジェット サーバーはできるだけ多くの機能をサポートする必要があります。特に、使用率の高い次の機能をサポートすることを強くお勧めします。各機能はガジェットで使用できるようにするための JavaScript API を提供します。機能名と関連する API を表に示します。
| 機能 | ファイル | JsDoc |
|---|---|---|
| tabs | tabs.js | ドキュメント |
| minimessage | minimessage.js | ドキュメント |
| flash | flash.js | ドキュメント |
| rpc | rpc.js | ドキュメント |
| views | views.js | ドキュメント |
| skins | skins.js | ドキュメント |
| dynamic-height | dynamic-height.js | ドキュメント |
| settitle | settitle.js | ドキュメント |