PoC

1回は現象を確認できるんだけど,2回目の再現は出来て無い. “global.dat”が,LF(U+0A) をデータの区切りにしておきながら,エスケープしてないのが原因のひとつではありそう.

global.dat の構造は四行一組で

TITLE U+0A URI U+0A TIME U+0A DIFF U+0A

てな感じで,実際は以下のようになっている.

XHTML 1.0: The Extensible HyperText Markup Language (Second Edition) http://www.w3.org/TR/xhtml1/ 1186023934 344461

この TITLE は HTML(text/html) なら 文書の “TITLE” 要素の中身のUTF-8 にエンコードされた(改行を取り去った)文字列が入る.ところが,XHTML(application/xml+xhtml or application/xml) だと UTF-8エンコードされただけの文字列が入る.

なので,U+0A を”TITLE” 要素の中身に含む文書だと

XHTML 1.0: The Extensible Hyper Text Markup Language (Second Edition) http://www.w3.org/TR/xhtml1/ 1186023934 344461

という風に,TITLE が2行になって四行一組の構造がおかしくなるので,Opera を再起動したときに”“Your history list file is corrupt and will be cleared.”“(1166471331)となる.

というのが,”global.dat”の構造的欠陥とも言うべき点からの予測される結論.だが,この四行一組の構造を意図的に破壊した”global.dat “を読み込ませても,履歴の破壊が必ず起こるわけではないようだ.1行ずつすれたままでも,最終的な帳尻が合えば何も起こらないぽい.

Historyのパネルで,一覧表示のほうは改行の前までしか表示されないのに,ツールチップだとタイトルが複数行で表示されるのでOpera内部で改行をちゃんと扱えてるのかどうか良くわからんね.