WebOS Goodies

WebOS の未来を模索する、ゲームプログラマあがりの Web 開発者のブログ。

WebOS Goodies へようこそ! WebOS はインターネットの未来形。あらゆる Web サイトが繋がり、共有し、協力して創り上げる、ひとつの巨大な情報システムです。そこでは、あらゆる情報がネットワーク上に蓄積され、我々はいつでも、どこからでも、多彩なデバイスを使ってそれらにアクセスできます。 WebOS Goodies は、さまざまな情報提供やツール開発を通して、そんな世界の実現に少しでも貢献するべく活動していきます。
Subscribe       

Opera ウィジェットの設定ファイル (config.xml) 詳細

本日は再び Opera ウィジェットネタです。先日の「Opera ウィジェットの作り方」では開発方法全般のオーバービューをご紹介しましたが、個々の詳細についてはあまり触れられませんでした。そこで、本日は Opera ウィジェット開発の知識の中でも最も基本となる config.xml についてご紹介します。

config.xml の書式については Opera Widgets Specification 1.0 fourth edition で詳しく解説されていますが、英語ですし、デスクトップ版 Opera では未サポートの内容も含まれていますので、この記事ではそのあたりを整理してまとめています。

Opera ウィジェット開発に興味のある方は、ぜひご覧ください。

config.xml の概要

config.xml は Opera ウィジェットの各種設定を記述する XML ファイルです。 Opera ウィジェットについての詳細は「Opera Widgets の作り方」をご参照ください。基本的に、この config.xml と表示内容の HTML ファイルを記述するだけで、 Opera ウィジェット として機能します。

最低限の記述としては、以下のようにウィジェットの名前だけを指定すれば動作します。

<?xml version="1.0" encoding="utf-8"?>
<widget>
  <widgetname>Sample Widget</widgetname>
</widget>

しかし、 config.xml には追加機能を有効にしたり、デフォルトの制限を緩和したりする要素が多数あるので、それらを知ることで Opera ウィジェットの可能性を 100% 引き出すことができます。デスクトップ版 Opera で使えるほとんどの要素を記述した config.xml は、以下のようになります。

<?xml version="1.0" encoding="utf-8"?>
<widget defaultmode="application" network="public">
  <widgetname>Sample Widget</widgetname>

  <id>
    <host>webos-goodies.jp</host>
    <name>sample_widget</host>
    <revised>2009-11-01</revised>
  </id>

  <description>This is a sample opera widget.</description>
  <width>320</width>
  <height>200</width>
  <widgetfile>widget.html</widgetfile>

  <author>
    <name>Chihiro Ito</name>
    <organization>WebOS Goodies</organization>
    <email>operawidgets@webos-goodies.jp</email>
    <link>http://webos-goodies.jp/</link>
  </author>

  <icon>icons/icon128.png</icon>
  <icon>icons/icon64.png</icon>
  <icon>icons/icon32.png</icon>
  <icon>icons/icon16.png</icon>

  <feature name="http://xmlns.opera.com/fileio"></feature>

  <security>
    <access>
      <protocol>http</protocol>
      <protocol>https</protocol>
      <host>webos-goodies.jp</host>
      <port>80,8080</port>
    </access>
  </security>
</widget>

以降、それぞれの要素について個別にご紹介していきます。現時点のデスクトップ版 Opera がサポートしていない機能は割愛していますので、ご了承ください。

widget 要素

まずはルート要素である widget 要素から。この要素にはウィジェットの基本的な動作を決定する属性がいくつかあります。

defaultmode 属性

defaultmode はウィジェットの表示モードを指定する属性です。現行の Opera 10.10 では "widget" しか指定できませんが、 Opera 10.2 alpha以降 では "application" も指定できます。

widget
従来の表示モードです。ウィジェットの背景はデフォルトで透明になり、すべての表示要素をアプリケーションが描画します。以下のように、いかにもウィジェットという雰囲気の外観に適しています。
application
OS 標準のタイトルバーを表示するモードです。背景は透過できずデザインの自由度は下がりますが、他のデスクトップアプリケーションと一貫性のある外観を実現でき、リサイズのコードを書く手間が省けるというメリットがあります。

もしプラットフォームが指定されたモードをサポートしていない場合、 "fullscreen" -> "application" -> "widget" の順でフォールバックしていきます。属性を省略した際のデフォルトは "widget" です。

network 属性

XMLHttpRequest などでアクセスできる IP アドレスを限定するための属性です。以下の値のいずれか、もしくは両方をスペース区切りで指定します。

private
プライベート IP アドレスへのアクセスを可能にします。
public
プライベート IP アドレス以外へのアクセスを可能にします。

それぞれの具体的な IP アドレスの範囲は後述の「セキュリティーモデル」をご覧ください。この属性を省略するか、もしくは上記以外の値を指定すると、すべてのアドレスへのアクセスが禁止されますので、ご注意ください。

widget 要素内に記述する要素

widget 要素内には、以下の子要素が指定できます。 widgetname 要素以外は省略可能ですが、とくに widgets.opera.com に掲載申請するときは、なるべく多くの要素を記述するようにしたほうが良いでしょう。

widgetname 要素

ウィジェットの名前を指定する要素です。使える文字の制限はとくにありませんが、ウィジェットの実行ファイル名やスタートメニューに登録するショートカット名などにも使われるので、ファイル名に使えない文字は避けた方が無難です。

id 要素

ウィジェットを識別するための ID を指定する要素です。省略した場合はブラウザによってランダムな id が割り振られます。もし指定した場合は、以下の 3 つの子要素がすべて必須となります。

host 要素
ウィジェットがダウンロードできるホストの FQDN (完全修飾ドメイン名)を指定します。
name 要素
ウィジェットを特定する名前を指定します。これは host 要素で指定したホスト内でユニークでなければなりません。
revised 要素
ウィジェットのリビジョンを日付で指定します。 "YYYY-MM-DD" のような W3CDTF 形式です。

ただし、現在のところこの ID がなにかに使用されている形跡はありません。省略で問題ないのではないかと思います。

description 要素

ウィジェットの説明を記述する要素です。

width 要素, height 要素

ウィジェット起動時の幅・高さをピクセル数で指定します。省略した際のデフォルト値はいずれも 300 です。

widgetfile 要素

ウィジェットの表示内容として使用する HTML ファイルを、 config.xml があるディレクトリからの相対パスで指定します。パス名は URL エンコードしてください。省略時のデフォルトは "index.html" です。

author 要素

ウィジェット制作者の情報を記述する以下の子要素を格納するコンテナ要素です。

name 要素
ウィジェットの作者名を記述します。
organization 要素
作者が所属する組織を記述します。
email 要素
ウィジェット作者のメールアドレスを記述します。
link 要素
ウィジェットや作者に関連する Web ページの URL を記述します。

いずれの要素も省略可能ですが、 widgets.opera.com に登録申請する際はできるだけ多くの情報を書いておくようにしてください。

icon 要素

ウィジェットのアイコンとして用いられる画像のパス名を、 config.xml のあるディレクトリからの相対パスで指定します。画像形式は PNG, GIF, SVG がサポートされます。複数の icon 要素を記述することで、複数のサイズのアイコンを指定することもできます。その他、アイコン制作上の注意点などは Custom Opera Widget icons for varying resolutions を参照してください。

また、 width, height 属性でサイズを明示することも可能ですが、この属性がなくても自動でサイズを認識してくれるようです。

feature 要素

利用する拡張機能を指定する要素です。現時点で利用できる拡張機能は以下の 2 つです。

Opera ウィジェットで File I/O API を利用するための記述は以下のようになります。

<feature name="http://xmlns.opera.com/fileio"></feature>

Opera Unite では、デフォルトのアクセスディレクトリを指定する param 要素を指定できます。 value 属性には documents, home, pictures, music, video, downloads, desktop が指定できます。

<feature name="http://xmlns.opera.com/fileio">
  <param name="folderhint" value="documents" />
</feature>

Unite API を利用するには以下のように記述します。これは Opera Unite サービスでは必須になります。

<feature name="http://xmlns.opera.com/webserver">
  <param name="type" value="service"/>
  <param name="servicepath" value="servece_path"/>
</feature>

Opera Unite についての詳細は Opera Unite サービスの作り方 をご覧ください。

security 要素

非標準のポートに対するアクセスや、プラグインの利用などを許可するための要素です。詳細は後述の「セキュリティーモデル」をご参照ください。

セキュリティーモデル

Web 上のさまざまなリソースのマッシュアップを実現するため、 Opera ウィジェットではクロスドメインの XMLHttpRequest が可能です。しかし、無制限にそれを許可してしまうと、悪意あるウィジェットからユーザーを保護するのが難しくなりますし、ウィジェットに脆弱性があったときの影響範囲が非常に広くなってしまいます。

そこで、 Opera ウィジェットでは config.xml でアクセスする Web リソースの範囲などを記述するようになっています。詳細は Opera Widgets security model で解説されていますが、その概要を以下でご説明しようと思います。

とくに非標準のポートへのアクセスが必要なときは、以下の情報が役立つはずです。

widget 要素での指定

Opera ウィジェットのセキュリティーモデルの基本は widget 要素の network 属性による IP アドレスごとのアクセス制御です。前述のとおり "private" と "public" の範囲を個別にアクセス指定するようになっており、 "private" に所属するのは以下の IP アドレスの範囲です。

  • ローカルマシンに解決されるアドレス(127.0.0.1 など)
  • 10.0.0.0 〜 10.255.255.255
  • 172.16.0.0 〜 172.31.255.255
  • 192.168.0.0 〜 192.168.255.255
  • 169.254.0.0 〜 169.254.255.255

上記の範囲外の IP アドレスはすべて "public" に所属します。

ただし、 network 属性でアクセス許可した範囲のホストでも、以下の制限がかかります。

  • 利用可能なプロトコルは http, https のみです。
  • デフォルトポートを除く 1023 以下のポートにはアクセスできません。

上記の制限を回避するためには、 security 要素でアクセス先を明示する必要があります。

security 要素での指定

http, https 以外のプロトコル(ftp とか?)やデフォルト以外のポートにアクセスするためには、 security 要素でアクセス先を明示的に指定する必要があります。 security 要素の中には子要素として access 要素と content 要素が記述できますので、それぞれについてご説明します。

access 要素

XMLHttpRequest を発行できるアクセス先を指定する要素です。アクセス先は以下の子要素で指定します。

protocol 要素
アクセス先のプロトコル(http, https など)を指定します。ただし file プロトコルは許可されません。
host 要素
アクセス先のホスト名、もしくは IP アドレスを指定します。アクセス可能になるのは指定した名前に完全にマッチするホストのみで、サブドメインは許可されません。つまり、 "webos-goodies.jp" の指定では "sub.webos-goodies.jp" にはアクセスできません。
port 要素
アクセス先のポート番号を指定します。単体のポート番号、ポート番号の範囲(1024-2048 など)、複数のポートのコンマ区切り(80, 443 など)が指定できます。
path 要素
アクセス先のパスを指定します。

上記の要素を指定した場合、デフォルトのアクセス許可は無効になることにも注意してください。例えば protocol 要素をひとつでも指定すると、明示的に指定していないホストへの http, https アクセスは許可されなくなります。

例として、 webos-goodies.jp のポート 80 と 8080 への http, https によるアクセスを許可する security 要素の記述は以下のようになります。

<security>
  <access>
    <protocol>http</protocol>
    <protocol>https</protocol>
    <host>webos-goodies.jp</host>
    <port>80,8080</port>
  </access>
</security>

content 要素

Java アプレットや各種プラグインの利用を制御するための要素です。もっとも、 Opera 10 以降ではデフォルトで利用可能になっているので、記述する必要はほとんどありません。

plugin 属性に "yes", "true", "plugin" のいずれかを指定すればプラグインが利用でき、それ以外だと利用不可になります。

Opera 9 のセキュリティーモデル

Opera 9 のセキュリティーモデルは Opera 10 と大きく異なっており、デフォルトで以下のような制限がかかっています。

  • ネットワークアクセスはデフォルトで可能になっており、禁止することはできません。
  • Java アプレットやプラグインはデフォルトで禁止されています。
  • https へのアクセスはデフォルトで禁止されています。
  • "private" アドレスと "public" アドレスはいずれか一方しかアクセスできません。先にどちらか一方にアクセスすると、他方にはアクセスできなくなります。

最後の制限はおそらく回避できませんが、それ以外を Opera 10 のデフォルト状態と同じにするには、以下のように security 要素を記述します。

<secutity>
  <access>
    <protocol>http</protocol>
    <protocol>https</protocol>
  </access>
  <content plugins="yes" java="yes">
</security>

あとは、必要に応じて記述を追加していけば、 Opera 9 と Opera 10 の双方で動作するウィジェットが実現できます。

以上、本日は Opera ウィジェットの config.xml の書式について詳しくご紹介しました。 Opera ウィジェット開発のノウハウについては今後も書いていきたいと思っていますので、お楽しみに!

関連記事

この記事にコメントする

Recommendations
Books
「Closure Library」の入門書です。
詳しくはこちらの記事をどうぞ!
Categories
Recent Articles