Firefox 3.0.11 で DOMストレージの動きがおかしい
前振り
Wassrで色々と Greasemonkey(以下グリモン) 書いてる訳なのですが、設定を保存したいグリモンが有って、設定データをCookieに保存していたのですが、利用者次第でデータの量がふくれてCookieのサイズ(4K)を超えてしまい、400 BadRequest になると言う根本の問題を抱えていた欠陥グリモンでした。
で、Cookieの変わりに DOMストレージはどうよ?って教えてもらって試して見たのが事の始まり。
DOMストレージの状況
DOMストレージはCookieを使わずにローカル側にデータをハッシュ形式で保存できる仕組みで localStorageオブジェクトを利用します。(※セッション期間だけ有効な、sessionStorageもあります)
Firefox 3.0.11 ではまだ未実装で、代わりに同様の globalStorage オブジェクトを使う事で同じ機能を実現する(はずでした)。
参照 -> DOM Storage - DOM | MDN
問題
グリモンを作っていて気付いたのですが、Firefox の DOMストレージが複数タブ間で上手く同期されていないようなのです。
で、単純な検証ページを作成して確認する事にしました。
検証ページ(コード)
検証ページは A と B があります。検証ページへのリンク -> 検証ページA 検証ページB
各々のページには「追加処理」「全削除」「全表示」ボタンと、DOMストレージの内容を表示する textarea が存在します。
両ページの動きは同じで、「追加処理」を行ったときの追加するデータが違います。
ページAは
Key[ADD] に対して、"AAA," を追加します。
Key[KeyAAA] に対して、"ValueAAA" をセットします。
ページBは
Key[ADD] に対して、"BBB," を追加します。
Key[KeyBBB] に対して、"ValueBBB" をセットします。
「全削除」は DOMストレージの中身をハッシュのキーを走査して全部消します。
「全表示」は現在のDOMストレージの中身を表示します。
localStorageが使えるブラウザ(IE8とSafari4)はlocalStorageを、localStorageの無いFirefoxでは globalStorageを使うようになってます。
var ls = window.localStorage || window.globalStorage[location.hostname];
再現方法と現象と・・・
以下の表は上から時系列に進めていく過程での、実行コマンドとストレージの内容を示しています。
検証は、Firefox 3.0.11 にて
列説明
- A処理
- 検証ページAでの実施した処理
- B処理
- 検証ページBでの実施した処理
- A状態
- 検証ページAで左記処理後にDOMストレージの内容「全表示」押下して表示した結果。
- B状態
- 検証ページBで左記処理後にDOMストレージの内容「全表示」押下して表示した結果。
- 想定結果
- 想定(希望される)される結果(Safari4とIE8での結果と同様)
状態は [キー]=値 の形式で書きます。
ケース1
↓ | A処理 | B処理 | A状態 | B状態 | 想定結果 | |
---|---|---|---|---|---|---|
1 | OPEN | - | 無し | 無し | 無し | |
2 | - | OPEN | 無し | 無し | 無し | |
3 | 「追加処理」押下 | - | [ADD]=AAA, [KeyAAA]=ValueAAA |
無し(※アレ?) | [ADD]=AAA, [KeyAAA]=ValueAAA |
|
4 | - | 「追加処理」押下 | [ADD]=AAA,BBB, [KeyAAA]=ValueAAA (※アレ?) |
[ADD]=AAA,BBB, [KeyAAA]=ValueAAA [KeyBBB]=ValueBBB |
[ADD]=AAA,BBB, [KeyAAA]=ValueAAA [KeyBBB]=ValueBBB |
|
5 | 「追加処理」押下 | - | [ADD]=AAA,BBB,AAA [KeyAAA]=ValueAAA [KeyBBB]=ValueBBB |
[ADD]=AAA,BBB,AAA [KeyAAA]=ValueAAA [KeyBBB]=ValueBBB |
[ADD]=AAA,BBB,AAA [KeyAAA]=ValueAAA [KeyBBB]=ValueBBB |
|
6 | - | 「全削除」押下 | [ADD]= [KeyAAA]= [KeyBBB]= (※アレ?) |
無し | 無し | |
7 | 「全削除」押下 ->スクリプトハング |
- | [ADD]= [KeyAAA]= [KeyBBB]= (※アレ?) |
無し | 無し | |
8 | CLOSE | - | 無し | 無し | 無し |
この後、表示するとキーも消えてるw
ケース2
↓ | A処理 | B処理 | A状態 | B状態 | 想定結果 | |
---|---|---|---|---|---|---|
1 | OPEN | - | 無し | 無し | 無し | |
2 | - | OPEN | 無し | 無し | 無し | |
3 | 「追加処理」押下 | - | [ADD]=AAA, [KeyAAA]=ValueAAA |
無し(※アレ?) | [ADD]=AAA, [KeyAAA]=ValueAAA |
|
4 | CLOSE | - | × | 無し(※アレ?) | [ADD]=AAA, [KeyAAA]=ValueAAA |
|
5 | - | CLOSE | × | × | [ADD]=AAA, [KeyAAA]=ValueAAA |
|
6 | OPEN | - | [ADD]=AAA, [KeyAAA]=ValueAAA |
× | [ADD]=AAA, [KeyAAA]=ValueAAA |
|
7 | - | OPEN | [ADD]=AAA, [KeyAAA]=ValueAAA |
[ADD]=AAA, [KeyAAA]=ValueAAA |
[ADD]=AAA, [KeyAAA]=ValueAAA |
なんですかねコレ?汗
他にも色々と変な状態にはなったのですが、上記で十分かと・・・コレって一体・・・Firefoxより自分を疑いたいのですが・・・IE8とSafari4は想定通りに動いてくれたので・・・