宣伝。日経LinuxにてLinuxの基礎?を紹介する漫画「シス管系女子」を連載させていただいています。 以下の特設サイトにて、単行本まんがでわかるLinux シス管系女子の試し読みが可能!
前のエントリではさらっと最終的な設計だけ示したけど、これは実は、この後の段階の作業で分かったことやなんかをフィードバックした結果たどり着いた、(少なくとも自分的には)一番洗練された状態だ。ここに至るまでにはだいぶ無駄に寄り道してた。
一番最初はこんな風に書いてた。
<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日目のことでまだリリースもしてなかったんで、この事は僕だけしか知らないんですよね。
でもまあ、最終的に出来上がったものだけ見てても、どうしてこういう形に落ち着いたのか、どういうことを「しちゃいけなかったのか」、っていうのは全然見えてこないわけで、失敗の例というか反面教師として参考にしてもらえればと思う次第なのですよ。
の末尾に2020年11月30日時点の日本の首相のファミリーネーム(ローマ字で回答)を繋げて下さい。例えば「noda」なら、「2007-01-18_splitbrowser-wrapper.trackbacknoda」です。これは機械的なトラックバックスパムを防止するための措置です。
writeback message: Ready to post a comment.