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 を使ったところでタブ単位には出来ないので、

  • 何らかの形でセッション開始と見なす
    • その際に id 発行する
  • 同一ドメイン内で Ex DOM Storage を読み込んでいる限りは同一セッションと見なせるようにする
    • 遷移する瞬間にそのwindowに紐づくセッションIDをアクティブにして、紐づくセッションID的なのをCookieに載せる
    • 遷移後にそのセッションIDみたいのを取得して対応するデータを取る

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

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

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

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

localStorage の同期問題

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

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

まとめ

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

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>

2008-06-03><

Statement は close する前に finalize() する

| 17:47 |  Statement は close する前に finalize() する - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  Statement は close する前に finalize() する - Ci.nsIZIGOROu

忘れちゃダメだかんね!

finalize()し忘れるとFILEがロックされっぱになってclose()でコケます。

もしwrapper作るならclose, createStatementにそれぞれ wrap して、close()の時にfinalize()してないstatementがあれば全部やるとかやった方がいいっぽぃ。

joinした際に重複するカラム名がある場合、区別が出来ない件

| 13:03 |  joinした際に重複するカラム名がある場合、区別が出来ない件 - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  joinした際に重複するカラム名がある場合、区別が出来ない件 - Ci.nsIZIGOROu

例えば以下のようなクエリがあるとする。

SELECT * FROM Foo, Bar WHERE Foo.name = Bar.name;

当然両者にnameと言うカラムがあるんだけど、これが Storage だと区別が付けられない。

もちろんそれぞれのカラムにインデックスが振ってあるので mozIStorageValueArray の get系メソッドでインデックス指定すれば問題無いのですが、意図的に区別しないといけないので厄介過ぎる件。

まぁこのように実際にjoin時のキーになるなら同じ値であるから問題無いんですが、

  • mozIStorageStatementWrapper で
  • joinのキーになってない、つまり同じ値じゃない同じ名前のカラムが複数ある

って場合は mozIStorageStatementWrapper じゃ成り立たない気がする。

明後日以降に試してみる。

2008-05-20

SQLiteのdatetime型とDateオブジェクトの相互変換ライブラリ

| 15:22 |  SQLiteのdatetime型とDateオブジェクトの相互変換ライブラリ - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  SQLiteのdatetime型とDateオブジェクトの相互変換ライブラリ - Ci.nsIZIGOROu

ソース

var DateTimeFormat = {
  patten: /^(19[7-9]\d|[2-9]\d{3})-(0\d|1[0-2])-(0[1-9]|[12]\d|3[01]) ([01]\d|2[0-3]):([0-5]\d):([0-5]\d)$/,
  format_datetime: function(aDate) {
	return ([aDate.getUTCFullYear(), aDate.getUTCMonth(), aDate.getUTCDate()]).map(function(item) { return DateTimeFormat.format(item, 2); }).join('-') + ' ' + ([aDate.getUTCHours(), aDate.getUTCMinutes(), aDate.getUTCSeconds()]).map(function(item) { return DateTimeFormat.format(item, 2); }).join(':');
  },
  parse_datetime: function(aDateStr) {
	var match;
	if (match = DateTimeFormat.patten.exec(aDateStr)) {
	  var args = Array.prototype.splice.call(match, 1, 6);
	  var aDate = new Date(Date.UTC.apply(Date, args));
	  return aDate;
	}
	else {
	  return;
	}
  },
  format: function(num, size) {
	var fill = size - num.toString().length;
	if (fill > 0)
	  return Array(fill + 1).join('0') + num.toString();
	else
	  return num.toString();
  }
};

2008-05-19chanserv

Storage 用の ResultSet 展開ライブラリ作ってみた

| 19:34 |  Storage 用の ResultSet 展開ライブラリ作ってみた - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  Storage 用の ResultSet 展開ライブラリ作ってみた - Ci.nsIZIGOROu

ソースコード

var StorageResultSetExtractor = function(stmt) {
  this.stmt = stmt;
};

StorageResultSetExtractor.prototype = {
  rowInfoCache: null,
  rowData: null,
  getRowInfo: function() {
	if (this.rowInfoCache) {
	  return this.rowInfoCache;
	}

	var rowInfo = [];
	for (var idx = 0, colCnt = this.stmt.columnCount; idx < colCnt; idx++) {
	  rowInfo.push({ name: this.stmt.getColumnName(idx), type: this.stmt.getTypeOfIndex(idx) });
	}

	this.rowInfoCache = rowInfo;
	return this.rowInfoCache;
  },
  next: function() {
	if (!this.stmt.executeStep())
	  return false;

	var rowInfo = this.getRowInfo();
	var rowData = {};

	for (var cidx = 0, clen = rowInfo.length; cidx < clen; cidx++) {
	  switch (rowInfo[cidx].type) {
		case this.stmt.VALUE_TYPE_NULL:
		  rowData[rowInfo[cidx].name] = null;
		  break;
		case this.stmt.VALUE_TYPE_INTEGER:
		  rowData[rowInfo[cidx].name] = this.stmt.getInt32(cidx);
		  break;
		case this.stmt.VALUE_TYPE_FLOAT:
		  rowData[rowInfo[cidx].name] = this.stmt.getDouble(cidx);
		  break;
		case this.stmt.VALUE_TYPE_TEXT:
		  rowData[rowInfo[cidx].name] = this.stmt.getUTF8String(cidx);
		  break;
		case this.stmt.VALUE_TYPE_BLOB:
		  var dataSize = { aDataSize: null };
		  var data = { aData: null };
		  this.stmt.getBlob(cidx, dataSize, data);
		  rowData[rowInfo[cidx].name] = data.aData;
		  break;
		default:
		  ;
	  }
	}

	this.rowData = rowData;
	return true;
  },
  item: function() {
	return this.rowData;
  }
};

使い方

var storage = Cc["@mozilla.org/storage/service;1"].getService(Ci.mozIStorageService);
var conn = storage.openDatabase(aDBFile);
var stmt = conn.createStatement("SELECT * FROM foo;");

var extractor = new StorageResultSetExtractor(stmt);
var result = [];

while (extractor.next()) {
  result.push(extractor.item());
}

result[0].colname; // これで値取れる

んー、まぁ今はここまで。本当はinflate/deflateとか出来るべきなんだろうなぁ。

ChristopherChristopher2012/09/28 18:11There is a critical shortage of infrotmiave articles like this.

bcskfetxmwbcskfetxmw2012/09/29 05:20wPzYXA <a href="http://mskjgsyfulye.com/">mskjgsyfulye</a>

xoicravirjxoicravirj2012/09/30 01:09R8uDa7 , [url=http://gbqpulptaobp.com/]gbqpulptaobp[/url], [link=http://yzjkswqqoywo.com/]yzjkswqqoywo[/link], http://jvhkpyeexcvu.com/

ysjvlscewysjvlscew2012/09/30 11:32PNyyAc <a href="http://kwjpltbwouwo.com/">kwjpltbwouwo</a>

yelvcsfuymjyelvcsfuymj2012/10/02 02:50LQci7N , [url=http://onwtzvmvqkct.com/]onwtzvmvqkct[/url], [link=http://pwzbknltpxfr.com/]pwzbknltpxfr[/link], http://chfaxyypvvmi.com/