Hatena::ブログ(Diary)

きれいさっぱり、逝くぜ! このページをアンテナに追加 RSSフィード

2008-07-11 Stylishがどのようにして再起動なしでCSSを適用しているか調べてみた

Stylishがどのようにして再起動なしでCSSを適用しているか調べてみた

| Stylishがどのようにして再起動なしでCSSを適用しているか調べてみたを含むブックマーク Stylishがどのようにして再起動なしでCSSを適用しているか調べてみたのブックマークコメント

Firefoxの拡張であるStylishを使用すると、再起動なしでスタイルシートを適用してWebページだけでなくFirefoxインターフェースも変更することが出来る。

この動作がわかれば、Foxdieのようなサブスキンを内蔵したテーマで、再起動なしにサブスキンを試すことが出きると考え、その動作の仕組みを探ってみた。

とりあえず、タブの高さを40pxにするスタイルをStylishに書く。

@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);
tab.tabbrowser-tab {
  height: 40px;
}

DOM Inspectorで調べると「プレビュー(W)」ボタンは「chrome://stylish/content/edit.js」の「doPreview関数」を呼び出している事がわかるので、Venkmanでここにブレークポイントを設置して、実際にタブの高さが40pxになるところまで追いかけてみた。

結局、chrome://stylish/content/common.js

registerStyle: function(uri, css) {
	var cssURL = stylishCommon.codePrefix + css;
	var u = this.ios.newURI(cssURL, null, null);
	this.sss.loadAndRegisterSheet(u, this.sss.USER_SHEET);

this.sss.loadAndRegisterSheet(u, this.sss.USER_SHEET);

で適用されることがわかった。

ここで、各変数を調べてみると以下のようになっていた。

var cssURL = "data:text/css,@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);\ntab.tabbrowser-tab {\n  height: 40px;\n}"

this.ios = Components.classes["@mozilla.org/network/io-service;1"]
            .getService(Components.interfaces.nsIIOService)
this.sss = Components.classes["@mozilla.org/content/style-sheet-service;1"]
            .getService(Components.interfaces.nsIStyleSheetService)

var u = this.ios.newURI(cssURL,null,null);

整理すると以下のようなコードを書けばCSSを適用できることになる。

var myIOS = Components.classes["@mozilla.org/network/io-service;1"]
            .getService(Components.interfaces.nsIIOService)
var mySSS = Components.classes["@mozilla.org/content/style-sheet-service;1"]
            .getService(Components.interfaces.nsIStyleSheetService)
var myURL = "data:text/css,@namespace  url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);tab.tabbrowser-tab {height: 20px;}"
var myU = myIOS.newURI(myURL,null,null);
mySSS.loadAndRegisterSheet(myU, mySSS.USER_SHEET);

以外に簡単だ。

しかし検索して見ると、MDCに日本語訳された文章がのっていた。

今回の収穫は、newURIメソッドの第一引数には、"chrome://hogehoge..."だけでなく、"data:text/css,..."を使えることがわかっただけか。

brazilbrazil 2009/05/07 13:43 data:text/cssです。
これが正しいとURIがパースされるときに空白などがエスケープされます。
上記のコードだと、空白が詰まってしまい、@-moz-documentなどが動作しません。

tksmashiwtksmashiw 2009/05/08 20:17 コメントありがとうございます。
data:css/text修正しました。これは恥ずかしい(汗)。
エスケープの件ですがとりあえず動作はするようですが(Firefox 3.0.10 + 「Javascript Command」拡張で検証)、やっぱり空白の代わりに「%20」って書くのが正しいのでしょうか。よく分かってないんです。

トラックバック - http://d.hatena.ne.jp/tksmashiw/20080711
最近のコメント