Home > Latest topics

Latest topics > Split Browser開発のよもやま話(4):構造が決まるまでの試行錯誤

宣伝1。日経LinuxにてLinuxの基礎?を紹介する漫画「シス管系女子」を連載させていただいています。 以下の特設サイトにて、単行本まんがでわかるLinux シス管系女子の試し読みが可能! シス管系女子って何!? - 「シス管系女子」特設サイト

宣伝2。Firefox Hacks Rebooted発売中。本書の1/3を使って、再起動不要なアドオンの作り方のテクニックや非同期処理の効率のいい書き方などを解説しています。既刊のFirefox 3 Hacks拡張機能開発チュートリアルと併せてどうぞ。

Firefox Hacks Rebooted ―Mozillaテクノロジ徹底活用テクニック
浅井 智也 池田 譲治 小山田 昌史 五味渕 大賀 下田 洋志 寺田 真 松澤 太郎
オライリージャパン

Split Browser開発のよもやま話(4):構造が決まるまでの試行錯誤 - Jan 18, 2007

前のエントリではさらっと最終的な設計だけ示したけど、これは実は、この後の段階の作業で分かったことやなんかをフィードバックした結果たどり着いた、(少なくとも自分的には)一番洗練された状態だ。ここに至るまでにはだいぶ無駄に寄り道してた。

一番最初はこんな風に書いてた。


<content orient="vertical">
  <xul:vbox anonid="vertical-container" flex="1">
    <xul:hbox anonid="horizontal-container" flex="1">
      <children/>
    </xul:hbox>
  </xul:vbox>
</content>

一番下の階層にある<children/>というのは、バインディングを追加された要素にappendChild()した要素が実際に配置される場所を指定するためのもの。つまりこの場合、バインディングを指定されたsubbrowser-container要素と、見かけの子要素のsubbrowser要素の間に、実際にはvbox[anonid="vertical-container"]、hbox[anonid="horizontal-container"]という2つの要素が挟まっていることになる。

でもこれではうまく動かなかった。container.hContainer.insertBefore(document.createElement('splitter'), container.firstChild)として、<children/>によって挿入された「見かけの子要素」の「前」に新しい要素を追加しようとしても、


<xul:hbox anonid="horizontal-container" flex="1">
  <xul:subbrowser/>
  <xul:splitter/>
</xul:hbox>

という風に、要素の順番が狂ってしまうんだな。いや内部的には指定どおりに埋め込まれてるんだけど、表示される順番がこういう風に狂ってしまうんですよ。これはバインディングで追加された匿名内容と、通常のDOMツリーでも見える普通の子要素とが同じ階層にあった場合に起こる問題で、以前tabbrowserのタブ周りをTBEでいじろうとしてだいぶ悩まされた。XULのordinal属性を使っても、CSSの-moz-box-ordinalプロパティを使っても、確かこれは解決できなかった気がする。これが、前のエントリで「vbox[anonid="vertical-container"]が必要」と書いた理由です。

そこで、以下のように書き換えてみた。


<content orient="vertical">
  <xul:vbox anonid="vertical-container" flex="1">
    <xul:hbox anonid="horizontal-container" flex="1">
      <xul:box anonid="wrapper" flex="1">
        <children/>
      </xul:box>
    </xul:hbox>
  </xul:vbox>
</content>

横に「分割」する時、つまり水平コンテナのhbox[anonid="horizontal-container"]のinsertBefore()で要素を追加する時は、<children/>の位置にあるsubbrowser要素ではなく、box[anonid="wrapper"]を参照ノード(2番目の引数)として渡してやるようにする。これによって、hboxの内容はすべて匿名内容となり、ちゃんと意図したとおりの順番で表示されるようになった。

しかし最初に書いたとおり、現在の構造ではbox[anonid="wrapper"]なボックス自体をそもそもなくしてしまった(例外的に一箇所だけ、Firefoxに元からあるtabbrowser要素に対してだけは今でもこのbox[anonid="wrapper"]なボックスを使っているけれども)。それが何故なのかは、この後のエントリで書くつもり。

……という感じで本当はあっち行ったりこっち行ったりフラフラしてたんですけど、この辺は開発始めた1日目のことでまだリリースもしてなかったんで、この事は僕だけしか知らないんですよね。

でもまあ、最終的に出来上がったものだけ見てても、どうしてこういう形に落ち着いたのか、どういうことを「しちゃいけなかったのか」、っていうのは全然見えてこないわけで、失敗の例というか反面教師として参考にしてもらえればと思う次第なのですよ。

さらに続く。

分類:Mozilla > XUL, , , , , , 時刻:16:13 | Comments/Trackbacks (0) | Edit

Comments/Trackbacks

TrackBack ping me at


の末尾に2014年1月19日時点の日本の首相のファミリーネーム(ローマ字で回答)を繋げて下さい。例えば「noda」なら、「2007-01-18_splitbrowser-wrapper.trackbacknoda」です。これは機械的なトラックバックスパムを防止するための措置です。

Post a comment

writeback message: Ready to post a comment.

2014年1月19日時点の日本の首相のファミリーネーム(ひらがなで回答)

Powered by blosxom 2.0 + starter kit
Home

カテゴリ一覧

過去の記事

1999.2~2005.8

最近のつぶやき

オススメ

Mozilla Firefox ブラウザ無料ダウンロード