ひとりGecko-SDK読書会 その3

今日が最終回。

nsIPromptService.idl

いろんなdialogを出す。basic認証のパスワードの入力とか、
暗号化されてないのをpostしますかとか、about:configの数字とか文字列とかの変更とか、
いろいろ。

nsIProperties.idl

いろんな変数を保存しておける。global変数みたいな感覚かな。
環境変数っぽく使うのも便利かも。

nsIProtocolHandler.idl

はい。ProtocolHandler。about:とか、chrome:とか、そういうのはこれで実装されてる。たぶん。
要するに、独自のprotocol(scheme)とか、protocolっぽくとかを実装するもの。
たとえば、nomina://tabs/current/みたいなのもこれで実装できる…これいいかも
nsIIOServiceも参照。

nsIRequest.idl nsIRequestObserver.idl

Request。たとえば"GET hogepiyo\r\n"とか。
nsIRequestObserverはそれをobserveするservice。
ちなみに、nsIWebProgressListenerでも出てきます。

nsIScriptableInputStream.idl

はい。nsIInputStremへのJavaScriptからのinterface。まとめればよかったな。

nsISecurityWarningDialogs.idl

hogeDialogs系のやつですね。http⇔httpsのときとかに出るdialogのinterfaceです。
例によって例のごとくこれのfactoryを作ってComponentRegistrarで登録。
nsIPromptService.idlの実装で事足りるような気もするけど…

nsISelection.idl (nsISelectionController.idl)

WebBrowserの選択範囲をいろいろするやつ。nsIDOMWindow::GetSelection()で取得できる。
伸ばしたり、縮めたり、全選択したり、textに落としたり。
NOT FROZENだけど、nsISelectionControllerを使えばもっと細かく設定できる。
ちなみに、nsISelectionControllerのCaret系の関数はいわゆるキャレットモード用(未確認)

nsIServiceManager.idl

とっても重要。いままでservice serviceって連呼してきたやつらへのinterfaceをもらってくる。
nominaではnsServiceManagerUtils.hのものを使ってます。

nsISHistory.idl (nsISHistoryInternal.idl)

はい。お待ちかね。tab1枚の履歴、SessionHistoryです。
WebBrowserが実装してるnsIWebNavigation::GetSessionHistory()で取得します。
あと、nsISHistoryではEntryを追加することができないので、
tab1枚の履歴をcloneしたいときは、nsISHistoryInternal::AddEntry()を使います。

nsISHistoryListener.idl

SessionHistoryのためのWebBrowserListenerです。
こっちはどっちかといえば、ブラウザの「戻る」「進む」ボタンの実装用。
あと、「戻れるか」「進めるか」はこれでは直接的には取得できないので、
nsIWebNavigation::CanGoBack()とかを使うみたい。

nsISimpleEnumerator.idl

Gecko独自の連結listっぽい?
GeckoはとにかくSTLは使わない方針っぽいのです。
たとえば、templateの仕様をnsCOMPtr以外には認めてなかったり(Mozilla Coding Style Guide)

nsIStreamListener.idl nsIUniCharStreamListener.idl

よくわかりません。どこに登録するんだろう。

nsISupports.idl nsISupportsPrimitive.idl

はい。出ましたラスボス(早い)。XPCOMであるためのinterfaceです。
nsISupportsPrimitiveは、XPCOMでないような型(char文字列とか、intとか)と、
XPCOMが仲良くおはなしできるようにするためのもの…かな?

nsITooltipListener.idl nsITooltipTextProvider.idl

nsITooltipListenerはWebBrowserListenerで、tooltipを出したり消したりするものです。
仕様上、同時に表示できるtooltipはWebBrowser(tab)1枚につきひとつ。
あと、その文字列は標準ではGeckoが自動生成するのですが、
自分でいじりたければ、nsITooltipTextProviderで上書きしてください。
2chブラウザみたいにリンク先をちょっと表示…みたいなことぐらいはできます。
ただ、あくまでキャラクタベースなので、複雑なことをしたいなら、
nsIDOMEventListenerあたりを使ってひっかけたほうがいいかも。

nsITraceRefcnt.idl

nsCOMPtrの中の人。garbage collector用の参照カウントを数えてるみたい。普通は触らないですね。

nsIUploadChannel.idl

nsIChannelの一種。そのまま。

nsIURI.idl nsIURL.idl

こんなのもあるのです。URIを構造化して管理する。それだけだけどね。
とりあえず、http:がSchemeで、全体はSpec。これだけでも憶えるといいかも。

nsIURIContentListener.idl

loadする中身を監視する。DocShellやWebBrowserが実装してる。
chain状に呼ばれていくみたい。
なので、nsIWebBrowser::SetParentURIContentListener()で登録する。
一応、自分の実装でもSetParentURIContentListener()を実装することが推奨されてるみたい。

nsIWeakReference.idl

XPCOMのWeakReference。所有しないreference("non-owing, non-dangling reference")。
たとえばObjectAとObjectBが相互にreferenceを持っているとすると、garbage collectorが混乱してしまう。
そこで、片方のreferenceをWeakReferenceにして、そっちを優先的に殺すことにするのです。
こんなことは結構あって、たとえばChromeとWebBrowserの関係とかもそう。
ちなみに、nominaではnsWeakReference.hのnsSupportsWeakReferenceを使ってます。

nsIWebBrowserChrome.idl nsIWebBrowserChromeFocus.idl

nsIWebBrowserChromeは、Chromeの基本interfaceです。
Chromeとはまあ、tab1枚みたいなもんで、WebBrowserにイロをつけたようなもの、かな。
基本的には、WebBrowser + NativeWindowへのGeckoからのinterfaceであると考えればよいかと。
で、nsIWebBrowserChromeFocusはWebBrowserと枠とのfocusの相互乗り入れ。

nsIWebBrowser.idl

WebBrowserの基本interface。
Chrome・WebBrowserListener・URIContentListenerの登録と、
top-level DOMWindowへのreferenceの提供など。

nsIWebBrowserFind.idl (nsIFind.idl)

ページ内検索。WebBrowserからdo_GetInterfaceでもらえる。
より詳しくいろいろしたいなら、NOT FROZENだけど、nsIFind.idlをどうぞ。

nsIWebBrowserFocus.idl

focusのcontrol。同様にWebBrowserが実装してる。
nsIWebBrowserFocus::Actiate()は最重要。これがないとそもそもtextareaとかに入力すらできない。

nsIWebBrowserPrint.idl

まあ、印刷用。同様にWebBrowserが実装してる。
あんまり興味がないので触っていませんが、これで遊ぶと実は面白いのかも。

(nsIWebBrowserPersist.idl)

SDKじゃないけど。ページを保存したり、リンク先を保存したり。
nominaでもお世話になってます。

nsIWebBrowserSetup.idl

はいお待ちかね。JavaScriptのon/offなど。いちばんタブブラウザっぽい機能かも。
ちなみに、文字サイズはいじれないので、nsIDOMWindow::SetTextZoom()で。

nsIWebBrowserStream.idl

URIとnsIWebNavigationではどうしようもないsrcから読み込む…らしい。わかりません。

nsIWebProgress.idl nsIWebProgressListener.idl

何%進んだか、とか。nsIWebProgressListenerはWebBrowserListenerのひとつ。
でも、ほかのWebBrowserListenerとちがって、ダウンローダーとかを作るときにも使えます。
さっきのnsIWebBrowserPersistでも使える。

nsIWindowCreator.idl nsIWindowWatcher.idl

nsIWindowWatcherはDOMWindowを管理するservice。
で、nsIWindowCreatorはnsIWindowWatcher::OpenWindow()とかから呼ばれるinterface。
ということで、これを実装してWindowWatherに登録する。
このnsIWindowWatcher::OpenWindow()は、javascriptのpopupだけじゃなくて、
新規tabで開く(target="_blank")や、XUL dialogの作成でも呼ばれるので注意。
で、初期状態では殆どのdialogがXUL dialogとして実装されてるのでもっと注意。

nsIX509Cert.idl nsIX509CertDB.idl nsIX509CertValidity.idl

認証書の中身とか。認証書DBのserviceとか。
最初のほうで出てきたnsICertificateDialogsでも使います。

nsrootidl.idl

まあ、知らなくてもなんとかなるさ。


ということで、はい。終ーーーーーーーーーーー了ーーーーーーーーーーーー


うん。一部(112個)cheatしたけど、192個制覇。
あと残ってるのはたとえばnsXPCOM.hとか、nsXPCOMGlue.hとか、nsStringAPI.hとか、
そういう素直にidlから生成されたわけではなさそうなものたちですね。
ついでに、がさっと飛ばしたDOMがらみが実はもうちょっと見る必要があることに気づく。


ということで、みなさま。これからものみなスケッチをよろしくなのです。
あと、嘘・間違い・ツッコミ等ございましたら適宜ご報告いただけるとありがたいです。