idlリーディング webidl編
TRANSCRIPT
webidl を読む• webidl を読むのに気を付けるポイントがいくつかあります
– webidl が置かれる場所• gecko/dom/webidl に置かれます
– 型• C++ と JS の型の対応に気を付ける必要があります• また、 webidl では引数の in/out が指定できるのでそこも意識します
– 属性• 特に見るべきは Func 属性です• Constructor 属性や NavigatorProperty 属性もあるかチェックすると
いいでしょう– gecko/dom/bindings
• webidl から cpp/h を生成して置かれるところです• 配下のディレクトリには webidl コンパイラもあります (python で書
かれています )
webidl で使える型
• Webidl で使える型は以下の通りですwebidl cpp
any JS::Handle<JS::Value>
boolean bool
Integer int
float float
DOMString nsAString&
ByteString Not supported
object JS::Handle<JS::Object*>
Webidl で使える型
• この他に型を定義するためのキーワードもあります– interface– dictionary– enum– callback
• キーワードではなく記法で型を定義するものもあります– Union– なんとなく Boost::Variant とかを使ってるような感覚
ですかね
webidl の属性
• 属性はいろいろありますが全部理解できてないので Func 属性、 Constructor 属性、 NavigatorProperty 属性だけ見ていきます– Func 属性
• [Func="funcname"]• Func 属性を指定すると、 Func 属性に指定した関数
が false を返した時 API をあたかも DOM ツリーにないかのように見せられます
• 手前味噌ですが http://www.gcg.bz/labo_blog/?p=867 で Idle API が隠れる理屈を書いてます
webidl の属性
• Constructor 属性– [Constructor<( 引数列 )>]– Constructor 属性が付いていると new してインスタ
ンスを得ることができます– DOM ツリーにぶら下がってなくても Constructor
属性が付いているなら new で使えます• NavigatorProperty 属性
– [NavigatorProperty="propName"]– navigator.propName でアクセスできるようになり
ます– これがないと window にぶら下がるはず?
bindings 配下のコード• objdir-gecko/dom/bindings に webidl から生成され
た cpp/h が置かれます• b2g じゃない gecko の場合は知りません。。。• gecko/dom/bindings 配下には webidl コンパイラも
入っています– gecko/dom/bindings/parser 配下や gecko/dom/
bindings/mozwebidlcodegen あたりがそれです• webidl と実際の実行コードのひも付きが特殊なものは
gecko/dom/bindings/Bindings.conf に設定を書く必要があります– 手前味噌ですがそのへんは
http://www.gcg.bz/labo_blog/?p=456 で書きました
webidl の実装を見つける• 実装は基本的に gecko/dom 配下にいますがいろいろ散
らばっています– 最終的には検索命です。。。
• 散らばり方もいろいろありますがいくつか見てみたものをいくつか並べると– battery
• gecko/dom/battery• わかりやすい例
– AudioContext• gecko/content/media/webaudio• gecko 全域 find しないと見つからない例
– window とか navigator とか• gecko/dom/base