getScriptingInterfaces
[LINK] で nsIDOMElement
とかを返しておかないと自動的に nsIDOMElement
だと認識されない。つまり document.getElementsByTagName("calendar")[0].nodeType
とかやっても undefined
になる。
void getScriptingInterfaces(out unsigned long count,
[array, size_is(count), retval] out nsIIDPtr array);
IDL を見ると out だなんて使われているのでどう実装したらいいものか悩んだが、FAQ によると out の引数にはオブジェクトが渡されるからその value プロパティに値をセットすればいいそうな。配列のほうは JavaScript の配列を自動的に変換してくれる。 retval がついているのは返り値として指定すればいいということみたい。
ここでは elementType
に ELEMENT_TYPE_XML_VISUAL
を指定していたので nsIXTFXMLVisual インターフェースも実装しなくてはいけない。が、その前にその派生元である nsIXTFVisual インターフェースを実装。まずは visualContent
[LINK] 、ここには実際に表示に使われる要素を指定する。今回は onCreated()
の呼び出しの中でセットするが、それ以降は指定される要素自体を変更してはいけない。要素の属性や子要素の変更ならできる。
insertionPoint
[LINK] には visualContent
に指定した要素か、その子孫要素を指定する。appendChild
とかの実際の適用先がここに指定された要素になる。null
を指定しておけば子要素を挿入しても表示されないらしい。
applyDocumentStyleSheets
[LINK] は多分読んで字のごとく。製作者スタイルシートを適用するかどうかだと思う。
そして nsIXTFXMLVisual インターフェースの実装。といっても onCreated メソッドしかない。要素の作成時に呼び出される。今回はここでカレンダーを表す表を作成、visualContent
にセットしている。
要素の作成には XMLContentBuilder
[LINK] を使用。最初に名前空間 URI をセットしてから beginElement(tagName)
と endElement()
、attrib(name, value)
、textNode(text)
などを使って内容を構築していく。
サンプルも作成。getScriptingInterfaces
で nsIDOMEventTarget
を返しておけば、addEventListener
でイベントハンドラを登録することもできる。スクリーンショットあり。
そもそも Firefox 1.5 にしか対応していないのでパッケージングも非常に楽。1.0 のことなど考えず chrome.manifest
セコメントをする