ゴールデンウイークになにかしなくてはと思い、Mozilla Firefoxのbuildとかをやっていた。これまでFirefoxは気になっていたがいまいちUIの見た目など気に入らない部分が多く、ちょっと使ってはIEに戻っていた。そのへんを自分の好きに修正できるならうれしいかもと思ったのがきっかけだった。
最終的にはデフォルトのFirefoxでも、Stylish拡張を入れてガンガンユーザCSSを書くことで別にbuildなんてしなくても使えるようになるかもということがわかったので、結果的にこの試みは無駄だったんだけど。
build
最速Firefoxをビルドしよう【後編】 (1/4) - ITmedia エンタープライズに書かれた方法ではうまくbuildできなかった。今インストールされている開発環境がVS2005なのでそのせいかもしれない。
またVisual C++ 2005はまだ十分にテストが行われていないため、ビルドの際にソースコードの修正などが必要である*。
と書かれているがそもそもconfigureの段階で失敗するのでそれ以前の問題のような気がしてならない。Netscape Wintoolsで本当に大丈夫なのかよくわからないと思った。
一方本家mozilla developer centerのほうにWindows ビルド環境の準備 | MDNというページがあって、こちらではMozillaBuildというものをダウンロードしてインストールしろと書いてある。しかもFirefox3のαだとVS2005でもbuildできるという。というわけでHeadソースをとってきてこのページに従ってbuildしたところ上手くいった。
必要な物のインストールが終わったら、c:\mozilla-build ディレクトリから次のバッチファイルのうちの 1 つを実行します。
- start-msvc6.bat
- start-msvc71.bat
- start-msvc8.bat
.mozconfigを書いた上で、上記のstart-msvc8.batを実行するとminGWのコンソール(rxvtか?)が出てくるので、そこでmake -f client.mkをやればOKだった。
改造する
さてbuildできたということはソースを直せば自分の好きに修正できるということだ。firefoxで一番個人的に納得のいかない点は、最小フォントサイズという指定はできるくせに最大フォントサイズは指定できないということだった。もしかしたら表面に出ていないだけで知らない設定があるのかもしれない。とりあえずそのへんを中心にソースを探ってみた。最小フォントサイズも大事だが俺は大きいフォントが嫌いなので最大が指定できないとイヤなのである。
適当にgrepをかけたところ、nsPresContext::GetFontPreferences()あたりでそれっぽい設定の取得をやってるように見えた。minimum-sizeはあったがmaximium-sizeはなかった。そういうもんなのか。
pref.Assign("font.minimum-size."); pref.Append(langGroup); PRInt32 size = nsContentUtils::GetIntPref(pref.get()); if (unit == eUnit_px) { mMinimumFontSize = CSSPixelsToAppUnits(size); } else if (unit == eUnit_pt) { mMinimumFontSize = this->PointsToAppUnits(size); }
こんな感じになっていた。これが見つかれば、あとはmMinimumFontSizeを使っているところを強引にいじっていけばハードコーディングした最大フォントサイズつきFirefoxがbuildできるんだろう。具体的にはlayout/style/nsRuleNode.cppにminimumFontSizeを使ってフォントサイズをごにょごにょしているところがあるのでそのへんを修正してやればいい。
で、結果的にはうまくできたわけだが、やっぱりそれでもレンダリング結果としてはなんか微妙に納得できない感じだった。なんていうか最小フォントサイズ(8px)と最大フォントサイズ(12px)のどちらかにほぼ張り付いてしまうページが多くてダメなんだよな。そもそも「もうちょっと小さいフォントで表示してくれよ」と思うページは見出しが30pxくらいで表示されてて本文は12pxで表示されてたりする。その本文はこういう制限を加えてもやっぱり12pxで表示されてるままで、それはやっぱり大きすぎるわけで。
その後layout/style/nsStyleUtil.cppあたりにフォントサイズのテーブルがあるのを見つけていじったりしてみたが、だんだん面倒くさくなってきてやめた。
ユーザCSS
最終的には改造するのはあきらめて、Firefox2を普通に使って本当によく使うページだけをユーザCSSで個別対応していくことにした(ヘタレ)。とりあえずはlingrとtwitterくらいだけど。
mixiもうまくできないかと思ってがんばってみたが、あらゆる部分がTABLEになっていてしかもIDがついていないので幅を変更しようにも難しくて、
[width="520"] {width: 300px !important; } [width="506"] {width: 286px !important; } [width="505"] {width: 285px !important; } [width="470"] {width: 250px !important; } TD [width="80"] {width: 60px !important; } TD [width="425"] {width: 195px !important; } TABLE [width="380"] {width: 160px !important; } [width="800"] {width: 510px !important; } [width="247"] {width: 124px !important; } [height *="23"] { width:63px !important; } [height *="23"][width*="22"] { width:22px !important; } [height *="23"][width*="23"] { width:23px !important; } [src*="img.mixi.jp/img/title1-.gif"] { width: 124px !important; height: 50px !important; }
こんな「明らかに間違った解決策だろ、それ」という感じになってきてしまったのであきらめた。