idlリーディング webidl編

13
IDL リリリリリリ webidl リ リリリリ リリリリリリリリリリリリリ リリ リリ

Upload: masami-yabushita

Post on 18-Aug-2015

17 views

Category:

Technology


0 download

TRANSCRIPT

IDL リーディングwebidl 編

株式会社グローバルサイバーグループ

藪下 正美

自己紹介

• もうみんな知ってるよね!

会社紹介

• 株式会社グローバルサイバーグループ–時間ないので省略

アジェンダ

• webidl とは• webidl を読む– webidl で使える型– webidl の属性

• bindings 配下のコード• webidl の実装を見つける

webidl とは

• webidl は JS に対して API を提供するインターフェイス定義言語のひとつです

• W3C で仕様が策定されています

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

まとめ

• grep と find 偉大!• ズボラしたかったら

https://mxr.mozilla.org とか http://reading.fxos.org/source/ で適当に検索してみるといいです

• 読む分にはなんとなく読めるからまあ頑張って– API 実装しだすと闇が見えてきますけれど

も。。。