JavaScript で XTF の実装
2005-09-02


も実装しなくてはいけないから面倒くさそう。

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 がついているのは返り値として指定すればいいということみたい。

ここでは elementTypeELEMENT_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) などを使って内容を構築していく。

サンプル

サンプルも作成。getScriptingInterfacesnsIDOMEventTarget を返しておけば、addEventListener でイベントハンドラを登録することもできる。スクリーンショットあり。

パッケージング

そもそも Firefox 1.5 にしか対応していないのでパッケージングも非常に楽。1.0 のことなど考えず chrome.manifest


続きを読む
戻る
[Mozilla Firefox]
[JavaScript]

コメント(全0件)
コメントをする


記事を書く
powered by ASAHIネット