Hatena::Groupmoz-addon

Ci.nsIZIGOROu

2008-09-29

Ex DOM Storage の現状のまとめ (自分用)

| 21:18 |  Ex DOM Storage の現状のまとめ (自分用) - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  Ex DOM Storage の現状のまとめ (自分用) - Ci.nsIZIGOROu

sessionStorage 問題

これが最大の問題。

実は要求される仕様を満たせてない。どういう事かと言うと、

と言うのは出来ているんだけど、この sessionStorage ってのは、タブ単位で独立したデータなんですよね。IE で言うなら IWebBrowser 単位で管理されてると言える。

つまりタブごとにデータが独立で、特定のタブを閉じればそれに対応した sessionStorage も無くなる。

このタブと言う単位をどうやってもサイト側の JS からでは識別出来ない。本当なら IWebBrowser の HWND (ウインドウハンドル) が取れれば終了なんだけど、どうあがいても取れない。

最初は Shell.Application からやろうとか思ったけど当然セキュリティ上、そんな ActiveX は実行できない。

他にも色々考えてみた。

location.replaceセッションID的な物をくっつけてからunloadして、飛び先のdocument.referrerを見る

出来ない。何故ならfragmentはreferrerに含まれない。

クエリストリングとしてセッションID的なものをくっつける

論外。

Cookie ベース

多分これが妥当なんだろうなぁと。但し Cookie を使ったところでタブ単位には出来ないので、

遷移じゃなくて、新しくwindowを開いた場合、つまりターゲットが_self相当では無い場合はwindow.openerが取れるので、新規にセッション開始。

また document.referrer が無い場合、history.length が 1(かな!?)の場合も新規にセッションを開始とかなのかなぁ。

なんか穴がありそうだけど、異なるタブで sessionStorage が共有されるよりはましだとは思うんだけどどうだろう。

また unload イベントも何が起因で unload イベントが起きたか多分判断できないんだよなぁ。

localStorage の同期問題

こっちは一応解決策は考えてるんだけど、やはり同一ドメイン内で同時に localStorage を扱う window がある場合は何らかの形で onstorage イベントが他の window にも通知されるようにしたほうがいい。

あと現時点だと、save の前に一度 load すればいいところをしてないので、データが吹っ飛ぶ可能性があるw

まとめ

今日はずっと sessionStorage がどうにかならないか考えていたんだけど、ちと妥協案にしても面倒なので先に localStorage から片付ける。polling して pull するイメージで。

saveHistory behavior

| 11:51 |  saveHistory behavior - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  saveHistory behavior - Ci.nsIZIGOROu

これは何か

ページごとに存在する persist data を取り扱う behavior のよう。但し、historyで戻る、あるいは進んだ場合にのみ発動するみたい。

サンプル

<!DOCTYPE html>
<html>
  <head>
    <title>saveHistory Test</title>
    <meta name="save" content="history" />
    <style type="text/css">
.historyData {
  behavior: url("#default#saveHistory");
} 
    </style>
  </head>
  <body>
    <div class="historyData"></div>
    <script type="text/javascript">
var data = null;
var historyData = document.getElementsByTagName("div")[0];
historyData.attachEvent("load", function(evt) {
  data = this.getAttribute("pdata");
});
historyData.attachEvent("save", function(evt) {
  this.setAttribute("pdata", ++data);
});
    </script>
  </body>
</html>

のようにして、data という変数alertしてみれば挙動が分かると思う。

ちなみにこの historyData とつけた変数への setAttribute, getAttribute は saveHistory behavior に対する onsave, onload イベントの時の参照先が persist data であって、そのイベントハンドラ内で実行した場合とそうでない場合で、得られるデータないしは保存先が異なる。

どういった場合に使えるか

ブラウザの戻る、進むボタン押した時を検出するとかに使える。

ただ、今自分がやりたい事に対しては全然使えないんだなぁ。

shogo4405shogo44052008/09/29 22:50HTCのDefaultBehaviorを利用すると色々なできますよね^^
DefaultBehaviorのまとめエントリーあると面白いかも。

ZIGOROuZIGOROu2008/10/01 16:16色々出来そうなのは確かなんですけどねー。
他のPersistent系は余り使い道無いかも。。。

MSDNのサンプルコードをIEで開く事が出来るんで、まぁそこ見れば十分だと思いますw

BeckyBecky2011/12/30 17:44Thanks for helping me to see tnhigs in a different light.

dhccgsydhccgsy2012/01/01 01:275DpWXA , [url=http://pzofmctcwmii.com/]pzofmctcwmii[/url], [link=http://gfqljepffslj.com/]gfqljepffslj[/link], http://dqivzaqoccgf.com/

lheqowriapdlheqowriapd2012/01/01 23:09rc4hzw <a href="http://bdxscblnypoa.com/">bdxscblnypoa</a>