Firefox の中身を少し覗いてみる | ヨモツネット text ja 2009-03-14 http://www.yomotsu.net/wp/?p=509 CSS, Web, Web ブラウザー, XML

Firefox の中身を少し覗いてみる

blog移行しました。新しいblogで更新を続けています。

Firefox のアドレスバーに

などを入力すると CSS のソースが表示されます。これは、Firefox がもっているデフォルトの CSS です。Standard mode の場合は html.css を参照し、Quirks mode 時は quirk.css を参照するようです。他にも MathML や SVG 用の CSS もありました。

これらの CSS は Windows の場合、 C:\Program Files\Mozilla Firefox\res に格納されています。そして、C:\Program Files\Mozilla Firefox\res に格納されている html.css などをリネームするなどして Firefox が参照できないようにすると、レンダリングされる HTML 要素はすべて inline 表示となります。

resource://gre/res/html.css は Web サイト制作時のリセット (ベース) 用の CSS を書くときの参考になります。

ちなみに GRE は Gecko Runtime Environment のことみたいです。

Mozilla 独自拡張について

これらの CSS では、Mozilla 独自拡張がたくさん使われています。例えば html.css の中では…

dd {
  display: block;
  -moz-margin-start: 40px;
}

とか

center {
  display: block;
  text-align: -moz-center;
}

などを見つけることができます。これは、現在用意されている CSS のプロパティと値だけでは足りなさそうということがわかります。Appendix A. A sample style sheet for HTML 4.0 のような CSS では足りないので独自拡張を使う必要があった感じ。

center 要素の挙動については centerを甘くみちゃいけない – vantguarde – web:g が参考になります。

XBL について

form.css にはビジュアル表現に関するもののほかに、-moz-binding: url("chrome://global/content/platformHTMLBindings.xml#textAreas");のように Firefox の操作と結びつけるものもありました。

これは XBL といって、CSS をつかって、要素を動的に操作するための言語です。これを使えば、CSS から JavaScript を実行することもできます。

e.g.

XBL を適用する HTML のソースコード

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>XBL のデモ</title>
<style type="text/css">
p {
  -moz-binding: url("demo.xml#test");
}
</style>
</head>
<body>
<p>1個目のp</p>
<p>2個目のp</p>
<p>3個目のp</p>
<p>4個目のp</p>
</body>
</html>

上記の HTML から参照される demo.xml のソースコード

<?xml version="1.0" encoding="utf-8"?>
<bindings xmlns="http://www.mozilla.org/xbl">
  <binding id="test">
    <implementation>
      <constructor>
        <![CDATA[
        alert(this.innerHTML);
        this.style.color='red';
        ]]>
      </constructor>
    </implementation>
  </binding>
</bindings>

XBL の 動作確認用 demo (Firefox 専用)

XBL は後の要素から適用されていくような挙動だった。実行されるのは少なくとも DOM が完成した後なのかな..。

この XBL ととてもよく似た実装が IE にもあります。IE では HTC を使うことで、CSS をつかって、要素を動的に操作することができます。HTC はかなり昔のものなので、XML に似ている書き方をします。

e.g.

HTC を適用する HTML のソースコード

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>HTC のデモ</title>
<style type="text/css">
p {
  behavior: url("demo.htc");
}
</style>
</head>
<body>
<p>1個目のp</p>
<p>2個目のp</p>
<p>3個目のp</p>
<p>4個目のp</p>
</body>
</html>

上記の HTML から参照される demo.htc のソースコード

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<public:component xmlns="http://www.w3.org/1999/xhtml" xmlns:public="urn:HTMLComponent">
  <script type="text/javascript">
    //<![CDATA[
    alert(this.innerHTML);
    this.style.color='red';
    //]]>
  </script>
</public:component>

HTC の 動作確認用 demo (IE 専用)

z-index の上限

resource://gre/res/EditorOverride.css には z-index: 2147483647; /* max value for this property */ という箇所がありました。どうやら Firefox での z-index の値は 2147483647 が上限らしいです。 (ちなみに 2147483647 = 2^31 – 1 = 0×7FFFFFFF で符号付き 32bit 整数の最大値)

z-index の値を 2147483648 として上限を超える場合を試してみると、Firefox 2 では該当の要素はレンダリングされませんでした。Firefox 3 では 2147483648 は 2147483647 として処理されるような挙動でした。

e.g.

<div style="background:#ff0; position:absolute; z-index:2147483648; width:100px; height:100px; top:0; left:0;">Fx 2 では消える</div>
<div style="background:#f0f; position:absolute; z-index:2147483647; width:100px; height:100px; top:50px; left:0;">前面に表示される</div>
<div style="background:#0ff; position:absolute; z-index:2147483646; width:100px; height:100px; top:25px; left:50px;">背面に表示される</div>

demo

ちなみに IE の場合は、2147483648 以上は 2147483647 として扱われる挙動でした。

また、Safari (Webkit), Opera では、2147483647 と 2147483646 を重ねた場合、2147483646 が前面に表示されました。z-index が大きすぎる場合はすべて最大値として処理されるのでしょうか。

Firefox には他にも

などがあります。

Firefox のアドレスバーに chrome://browser/content/browser.xul を入力すると Firefox の表示領域にもう一つのFirefox の UI が表示されます。新しく表示された Firefox の UI アドレスバーに再度 chrome://browser/content/browser.xul を入力するとさらに表示されます。拡張子からもわかりますが、Firefox は XUL で構成されています。

chrome:// スキームから始まっているリソースは browser.jar などのようにハードコートされているので browser.jar を解凍するとそれぞれのファイルを実際にのぞくことができます。

C:\Program Files\Mozilla Firefox\chrome にある browser.jar を任意の場所にコピー、ペーストし、ファイル名を browser.jar から browser.zip に変更した後、zip ファイルとして解凍すると content というフォルダが現れます。chrome://browser/content/browser.xul は content/brouser/browser.xul に入っています。

このソースコードを覗いてみると、UI には XUL と CSS が使われていることがわかります。

トラックバックURI

http://www.yomotsu.net/wp/wp-trackback.php?p=509

この記事へのコメントはまだありません

コメントフォーム

コメント

コメントでは一部の XHTML タグを使用できます。 : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

カテゴリー一覧

この Weblog の FEED

この Weblog の FEED