ツリー型タブのツリー構造の保存の仕方の説明など

そのうち日記に転記するつもり(と言いつつまるでやる気配がない)のメモ代わり。
6
Piro🎉"シス管系女子"シリーズ累計5万部突破!!🎉 @piro_or

今更ながらツリー型タブに再起動後にツリーが壊れる系の問題のデバッグを支援するための機能を加えた。JSON.stringify(gBrowser.treeStyleTab.dumpTreeInformation()) で、保持してるツリー構造に関する情報を見れるようになった。

2015-10-05 20:09:31
Piro🎉"シス管系女子"シリーズ累計5万部突破!!🎉 @piro_or

それでさっそくタブの並べ替え後に「並べ替える前の位置の前後にあったタブ」の情報がちゃんと更新されていないという状態だった事が分かって、そのへんもちゃんと更新するように直してみた。github.com/piroor/treesty… がこれで直ったはずなんだけど……

2015-10-05 20:10:34
Piro🎉"シス管系女子"シリーズ累計5万部突破!!🎉 @piro_or

ニーズないけど勝手に語る。ツリー型タブのツリー構造の保存の仕組みについて。

2015-10-05 23:48:35
Piro🎉"シス管系女子"シリーズ累計5万部突破!!🎉 @piro_or

ツリー型タブではタブのツリー構造を、Firefox自身が提供しているセッション保存機能を使って保存してる。具体的には、タブとウィンドウに対して任意のメタ情報を保存するnsISessionStore#setTabValue()/setWindowValue()を使ってる。

2015-10-05 23:50:32
Piro🎉"シス管系女子"シリーズ累計5万部突破!!🎉 @piro_or

(Tab Mix Plusの独自のセッション保存機構との相性が最悪なのはこれが理由。その組み合わせでまともに動く事を期待する方がおかしいというレベルです。なのでTSTとの併用時にはTMP独自のセッション保存機構はOFFにする事を強く推奨します。)

2015-10-05 23:54:01
Piro🎉"シス管系女子"シリーズ累計5万部突破!!🎉 @piro_or

各タブはセッションをまたいでTST独自の一意なIDを付与されていて、タブ同士の親子関係は基本的にこのIDの文字列で管理してる。個々のタブは「自分の親」「最上位の階層までの祖先群」「自分の直接の子供達」「同じ階層の前後のタブ」のIDを全部保持してる。つまり、情報の重複が結構ある。

2015-10-05 23:57:18
Piro🎉"シス管系女子"シリーズ累計5万部突破!!🎉 @piro_or

なんでそんなに無駄に冗長になってるのかというと、Firefoxのタブは必ず全てが復元されるとは限らないから。クラッシュした後の復帰時には、クラッシュの原因となったタブ以外だけを復元という事ができるんだけど、最小限の情報だけしか保持してないとこういう時にツリーが壊れる。

2015-10-05 23:58:28
Piro🎉"シス管系女子"シリーズ累計5万部突破!!🎉 @piro_or

なので、個々のタブは可能な限りそれぞれが持ってる情報からツリーを復元できるようになってる。祖先のタブ群を保持してるのも、親タブは復元されなかったけど祖父(?)タブは復元されたみたいなケースを想定しての事です。

2015-10-05 23:59:45
Piro🎉"シス管系女子"シリーズ累計5万部突破!!🎉 @piro_or

ただ、このやり方には「ウィンドウが開かれてすぐにはツリー構造を復元できない」という制限がある。Firefoxのセッション復元ではまず必要なタブがまとめて開かれた後、ロードされたセッション情報が個々のタブに割り当てられるまでの間にタイムラグがあって、その間は情報を全く読めない。

2015-10-06 00:02:05
Piro🎉"シス管系女子"シリーズ累計5万部突破!!🎉 @piro_or

なので、タブに保存された情報からだけツリー構造を復元していると、起動後にタブのツリー情報が1つずつちょっとずつ復元される様子が目に見えるというレベルで待たされる事になる。タブの数が何十個もあると、めっちゃ待たされて辛い。

2015-10-06 00:03:19
Piro🎉"シス管系女子"シリーズ累計5万部突破!!🎉 @piro_or

という事でそれへの対策として、ツリー全体の構造を「ウィンドウのメタ情報」としてウィンドウそのものに関連付けておいて、セッション復元時に開かれたタブの個数がツリーのタブの総数と一致してたら真っ先にその構造を反映する(個々のタブの情報が読み取り可能になるのを待たない)ようにしてる。

2015-10-06 00:05:55
Piro🎉"シス管系女子"シリーズ累計5万部突破!!🎉 @piro_or

閉じたタブを開き直したり、閉じたウィンドウを開き直したり、Firefoxを再起動したり、というときにタブの順番がおかしくなるというバグは、多分、個々のタブに保存された「相対的なツリー構造の情報」からのツリーの復元に失敗してるからだと思う。変な情報が残ってたりとか。

2015-10-06 00:07:21
Piro🎉"シス管系女子"シリーズ累計5万部突破!!🎉 @piro_or

そういうのを調べるために今回追加したのが gBrowser.treeStyleTab.dumpTreeInformation() というメソッドで、ブラウザコンソールで実行すれば、個々のタブに保存された相対的なツリー構造の情報をJSONとして得られる。

2015-10-06 00:09:12
Piro🎉"シス管系女子"シリーズ累計5万部突破!!🎉 @piro_or

ツリー構造が正しく復元されないという現象に遭遇した時は、行った操作の手順と併せてJSON.stringify(gBrowser.treeStyleTab.dumpTreeInformation()) の結果を教えてもらえるとデバッグの助けになるんじゃないかなと期待してる。

2015-10-06 00:10:57
Piro🎉"シス管系女子"シリーズ累計5万部突破!!🎉 @piro_or

以上、どこにもニーズの無いツリー型タブの話おしまい。

2015-10-06 00:11:46
Piro🎉"シス管系女子"シリーズ累計5万部突破!!🎉 @piro_or

URLマッチによる自動グループ化、的な機能はTSTでは敢えてスルーしてるんだよね。自分自身が、ツリーの親子関係はリンクを辿った履歴が可視化されたものとしてしか使わないという事が分かってるので。 twitter.com/makky55makky55…

2015-10-06 00:15:30
Yuusuke Masaki @makky55makky55

しかもこのアドオンのすごいところは、タブを自動でグループ化できたり、フィルタ表示できるので、たとえばURLマッチでgithubと入力すれば、自動でグループ化でき、グループをクリックすればそれ以外のタブは非表示にできる。ということでツリー型タブ本家よりすごい!!

2015-09-23 00:00:04
Piro🎉"シス管系女子"シリーズ累計5万部突破!!🎉 @piro_or

そういう思想なので、ツリー構造の編集を支援する機能もそんなに充実はさせてない(そこに労力は割かない事にしてる)。ツリーは自分で組み立てるものじゃなくて、リンクを辿った足跡として勝手にできるものと定義してる。それ以外の勝手なツリー形成も、自分で把握できなくなるからやらない。という。

2015-10-06 00:18:03
Piro🎉"シス管系女子"シリーズ累計5万部突破!!🎉 @piro_or

でも何らかの見えないルールに従って自動的にインテリジェントにツリーが形成された方がいいという人もいるだろうとは思う。ので、そういう人がそういう機能を持つ物を使うのは自然だと思う。どっちが正解という話ではない。

2015-10-06 00:19:46
Piro🎉"シス管系女子"シリーズ累計5万部突破!!🎉 @piro_or

ただ、ツリー型タブはこういう方針ですよ、ということ。万能選手は目指してない、目指したら破綻すると分かってる、というか過去にTBEで破綻して痛い目を見たのでその反省で、自分の想定するシナリオ以外の使い方には冷淡に割り切るようにしてる次第です。

2015-10-06 00:22:58
Piro🎉"シス管系女子"シリーズ累計5万部突破!!🎉 @piro_or

想定するシナリオっていうのは、clear-code.com/blog/2015/10/1… での調査の時みたいに「MXRで見つかった結果を片っ端から子タブで開いて、それぞれのソースからさらにリンクを先を子タブでどんどん辿ってく」みたいなユースケースね。これやってると30とか40とか増える。

2015-10-06 00:27:08