y-matsui::weblog

電子楽器、音楽、コンピュータ、プログラミング、雑感。面倒くさいオヤジの独り言

cookiemanager.jsのトラブルで学んだこと

フォントサイズを変更し、設定状態を保存する機能を作っていた時の話。
この小さなプログラムは、prototype.jsとcookiemanager.jsを利用している。
フォントサイズ変更・保存機能をMovableTypeの部品として実装したのだが、どうも動きがおかしい。
FireFoxの場合は、フォントサイズのデータをCookieとして書き出し、同じドメイン内の全ページで、設定が引き継がれる”正常な”動作をする。
しかし、IEの場合、同じページを参照した時は、設定が復元されるが、同じドメイン内の別ページでは、設定が保存されていない。
cookieに関することだから、cookiemanager.jsが怪しい・・・と眺めていたら。
案の定、IEOpera、それ以外で異なる動きをしている。試しに、ブラウザごとの分岐処理を全部取っ払ってみた。
結果、まともに動いた。
何がおかしいのだろうか・・と今度は、IEだった場合の処理を追っかけてみる。

/**
* Determines if this object will use IE's proprietary userData behaviour
* instead of cookies for storage.
*/

とか
// Internet Explorer has a cookie handling bug - if the *combined size*
// of all cookies stored for a given domain is greater than 4096 bytes,
// document.cookie will return an empty string. Until this is fixed , we
// will fall back on IE's proprietary userData behaviour.

なんて書かれている。
IEの(サイズが4kbを超える)cookieの扱いにはバグがあるから、userData behaviourとかを使うよ・・っていう意味のようだ。
「userDataって何だべ?」
と調べると。Cookieの代わりに使えるオブジェクトらしい。”複数のブラウザセッションを超えてデータを永続化できる ”というのはcookieも同じ。
ただ(IE標準搭載)userDataビヘイビアに書かれている一文がとても重要なのであった。
そこにはこう書かれていた
「userDataビヘイビアとは、IE5.0以降に標準搭載されたHTMLビヘイビアの一つ。クッキーと同じように、訪問者のクライアントPC上にデータを保存し、何時でも取り出すことができる。ただしセキュリティの関係から、保存データは同一ディレクトリ内からのみ参照できる。」
保存データは同一ディレクトリ内からのみ参照。
これで原因ははっきりした。
cookieがパスを(/)とすることで同一ドメイン内ですべて機能することと比べ、userDataは同じディレクトリのコンテンツでしか効かないということだ。

なるほど、それなら合点がいく。

■参考サイト
[javascript] IEとFirefox2.0以上で動作するClient Side Storage
クライアントサイドストレージか。サーバサイドのオブジェクトで、セッションオブジェクトとかアプリケーションオブジェクトとかあるけど、そういうイメージだね。
DOM:Storage
Firefox2以降から使えるようになったブラウザオブジェクト。
UserData ビヘイビアによる入力データーの保存(コンテンツの永遠化機能)
入力データを含むページデータ(64kb)をまとめてuserDataに保存しちゃうんだって。凄い使い方だね。