ブラウザ作成にトライ中

完全に五里霧中。WebKitでかなりの部分がショートカットされているとは言え、UIをかぶせるだけの話がここまで面倒とは。

WebViewのバインディング

Interface BuilderでNSWindowのtitleをWebViewのmainFrameTitleにバインディングするだけで良きに計らってくれればそれでいいのだけど、HTML中にtitle要素が無かったり、そもそも表示するのがHTMLとは限らなかったりでなかなか思うようには行かない。
試しにバインドせずに監視だけしてみたら、肝心のタイトルが無い場合での変更通知が狙ったタイミングで来なかった。valueForKeyメッセージを送って貰える値自体は変わっている(nullではなく空文字列)のでバグだろうか? mainFrameURLの方も下手にテキストフィールドとバインドしてしまうと意図しない場所で対応していないsetValueを呼んでしまうらしい。
折角用意されているのだけどmainFrameURLとmainFrameTitleは他のコントロールと直接バインドしない方がいいと言う結論に達した。結局は昔ながらのdelegationベースが確実っぽい。

フォーカス検知

WebFrameView内のフォーカス移動(正確にはOption+Tabでのリンク間移動)を検知したいのだけどWebUIDelegateにはマウス関連のイベントしか定義されていない。そこでDOMオブジェクトに直接イベントリスナを登録してやればどうかとwebView:windowScriptObjectAvailable:で貰えるウインドウオブジェクトにvalueForKey:@"document"メッセージを送たら、何故か知らないがwebView:windowScriptObjectAvailable:がまた呼ばれて、無限ループに突入した。evaluateWebScript:@"document"でもやっぱり同じなので、生成される前にwindowオブジェクトからdocumentオブジェクトにアクセスしてしまうとundefinedを返す際に処理が狂うらしい。
しょうがないのでwebView:didFinishLoadForFrame:でDOMDocumentにイベントリスナを登録したら今度は肝心のイベントが来ない。DOM Eventsの仕様に載っているイベント名をいくつか試したけど梨の礫。どうしてくれよう。

テキストエンコーディング

エンコーディングメニューを作ろうと思って実装を見てみた。CaminoはNibファイルに直接メニューを書いている。SafariやShiiraはプログラム側で生成しているようなので何か良さげなAPIでもあるのかと期待して探したものの、WebViewにcustomTextEncodingNameと言うプロパティが用意されているぐらいでメニュー生成に使えそうなものは見当たらなかった。Shiiraのソースを呼んでみたら最終的にはCFStringのグローバル変数でハードコーディングされてた。
WebViewの方のドキュメントを読むとIANA登録済のエンコーディング名を指定するっぽいのだけど、どんな物が有効なのか不明なのでソースコードを追っかけてみる事にした*1。NSMutableURLRequestの追加カテゴリで利用されているらしい所まではわかったけどそれ以上は追えなかった。

disabledなNSTextField

SpotlightウインドウみたいなUnifiedなToolbarにdimされたテキストを表示させたいと思ったのだけど、setDrawsBackground:NOを指定したNSTextFieldインスタンスの場合、setEnabled:NOと指定してもテキストはdimされないらしい。setColorで直接disabledControlTextColorを指定しても反映されない。setEnabled:YESと指定すると一応setColorのものが反映されるのだけど、今度はバインディングで値が変更されると何故かEditableになってしまう。
それだけではなく、Spotlightウインドウのツールバーに表示される文字列の色が一般的なdisabledControlTextColorじゃなくて、どうもInactiveなウインドウのタイトルのそれに見える。と言う訳でCarbonのAppearance Managerに御登場願ったのだが、kThemeTextColorDocumentWindowTitleInactiveでは殆どdisabledControlTextColorと違いが無いように見える。
もう直接指定するべきかなぁ。

*1:しばらくUNIX系のソフトウエアからは離れていたのだが、WebKitのコードをチェックアウトする為のSubversionの為にDarwinPortsを入れた