Hatena::Groupmoz-addon

Ci.nsIZIGOROu

2009-05-18

あとで読む

| 18:53 |  あとで読む - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  あとで読む - Ci.nsIZIGOROu

急に Fxdaemon 作りたくなったよ!!!

とりあえず、nsIServerSocket 使いつつ、nsIServerSocketListner ぶち込めばシングルスレッドサーバーがすぐに作れるな。

nsIThread 使ったサンプルが httpd.js にあるようなのでこちら見ながらやれば簡単っぽ。

jwhtnekcinjwhtnekcin2013/07/28 12:02zmvclnp{.beepo, <a href="http://www.nppazyugmt.com/">bmmfpqpsok</a> , [url=http://www.hvvhhybczi.com/]nfbcvfvegn[/url], http://www.jtphqerzxx.com/ bmmfpqpsok

xsjzjwtihexsjzjwtihe2013/07/30 17:29gnzntnp{.beepo, <a href="http://www.bvmkdctyxk.com/">exriylnakh</a> , [url=http://www.jldcbtvisz.com/]tjltwggsdn[/url], http://www.ovckdtcfnk.com/ exriylnakh

zngnkrenthzngnkrenth2013/11/24 09:08sfbfznp{.beepo, <a href="http://www.xrreuqnstg.com/">vzkeaulata</a>

pqzdbaflqupqzdbaflqu2013/11/25 05:17oumgonp{.beepo, http://www.xdmxuibjan.com/ jkjzidhcjo

grqpybswtggrqpybswtg2013/11/26 22:55zadrtnp{.beepo, <a href="http://www.dpitmxcbsv.com/">fkjaykeyjg</a> , [url=http://www.pfnnryypte.com/]rqkfsmotjp[/url], http://www.kapxdlkynv.com/ fkjaykeyjg

ucoxaqxcsxucoxaqxcsx2014/01/12 18:10cncwtnp{.beepo, <a href="http://www.pmzdzjicrf.com/">ubasbaukam</a> , [url=http://www.flzzkmfjdb.com/]raacaepjrk[/url], http://www.nelhlxiynj.com/ ubasbaukam

lgnajyltbclgnajyltbc2014/04/02 09:19pzsqqnp{.beepo, http://www.epsyyvsxhp.com/ oambalroxo

kankikvcikkankikvcik2014/04/04 15:13lswnlnp{.beepo, <a href="http://www.lokqdbdvdg.com/">dbakiwkrnv</a>

auqdldnzftauqdldnzft2014/04/07 00:21iwlilnp{.beepo, <a href="http://www.jztxjusfmc.com/">rflwbomyew</a>

ptzancecwuptzancecwu2014/04/10 07:49zhononp{.beepo, http://www.jotdfqwiva.com/ oafmetzwml

2008-09-22

nsICache のメモ

| 15:41 |  nsICache のメモ - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  nsICache のメモ - Ci.nsIZIGOROu

nsICacheService から始める。

const cacheService = Cc["@mozilla.org/network/cache-service;1"].getService(Ci.nsICacheService);

んでもって次は nsICacheSession を作るのだが、

var cacheSession = cacheService.createSession("clientId", Ci.nsICache.STORE_OFFLINE, true);

とかそういう感じで。

最後にCacheの実態を保存する nsICacheEntryDescription を作るんだけど、このとき write/read で明確にフラグを立てないと Fx が落ちまくる。

var cacheEntry = cacheSession.openCacheEntry("cacheKey", Ci.nsICache.ACCESS_WRITE, true);
var oStream = cacheEntry.openOutputStream(0);
oStream.write(data, data.length); // data は String だとする
oStream.close();
cacheEntry.setMetaDataElement("size", data.length);
cacheEntry.setDataSize(data.length);
cacheEntry.markValid();
cacheEntry.close();

上記が書き込み例。

読み込みの場合は、

var cacheEntry = cacheSession.openCacheEntry("cacheKey", Ci.nsICache.ACCESS_READ, true);
var iStream = cacheEntry.openInputStream(0);
var sStream = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream);
sStream.init(iStream);
var data = sStream.read(cacheEntry.dataSize);
sStream.close();
iStream.close();
cacheEntry.close();

とかそういう感じ。

折角調べたけど不要なのが分かったのでガックリ。

SachinSachin2012/04/29 00:31It seems clumsy, but I did evieythrng as described. When trying to send to phone I get confirmation that it has been sent. But I don't receive it on my HTC Desire, although C-t-P has been installed and logged in. I set C-t-P to start links automatic.+++Stop Press+++I received the tests in the meantime. It took 10 minutes (!) to arrive. Which means it is not usefull: faster to copy typed information.Sorry to bother helpfull users.

jrrykbfpjrrykbfp2012/04/29 17:51vKLusd <a href="http://jyzhcxjrmwsd.com/">jyzhcxjrmwsd</a>

bujsgcemnmbujsgcemnm2012/04/30 23:01w2RFHf <a href="http://wzcfoagjokng.com/">wzcfoagjokng</a>

2008-08-11

nsIScriptSecurityManager のメモ

| 15:59 |  nsIScriptSecurityManager のメモ - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  nsIScriptSecurityManager のメモ - Ci.nsIZIGOROu

危険な URL を判別する為の XPCOM が存在すると言うのを先ほど知ったのでメモ。

使い方

nsIScriptSecurityManager のメソッド ( noscript 以外 )
  • void checkLoadURI ( nsIURI from , nsIURI uri , PRUint32 flags )
  • void checkLoadURIStr ( AUTF8String from , AUTF8String uri , PRUint32 flags )

ここらへんは from から読み出す前提で、uri はどうよってのを確認するメソッドのようだ。flags の部分は nsIScriptSecurityManager の定数。

  • void checkLoadURIStrWithPrincipal ( nsIPrincipal principal , AUTF8String uri , PRUint32 flags )
  • void checkLoadURIWithPrincipal ( nsIPrincipal principal , nsIURI uri , PRUint32 flags )

from の代わりに nsIPrincipal が使えるようになる。Firefox 3 からだと document.nodePrincipal を用いて、任意のページの制限が取れるっぽぃ。

  • void checkSameOriginPrincipal ( nsIPrincipal sourcePrincipal , nsIPrincipal targetPrincipal )
  • void checkSameOriginURI ( nsIURI sourceURI , nsIURI targetURI , PRBool reportError )

XHR 系か?same origin policy に反してるかどうかをチェックするんだろう、きっと。

  • void disableCapability ( char* capability )
  • void enableCapability ( char* capability )

分からない。あとで。

  • nsIPrincipal getChannelPrincipal ( nsIChannel channel )
  • nsIPrincipal getCodebasePrincipal ( nsIURI URI )
  • PRBool isCapabilityEnabled ( char* capability )
  • PRBool isSystemPrincipal ( nsIPrincipal principal )
  • void revertCapability ( char* capability )
  • void setCanEnableCapability ( AUTF8String certificateFingerprint , char* capability , PRInt16 canEnable )

><

使われ方

http://mxr.mozilla.org/firefox/source/toolkit/content/contentAreaUtils.js#56 とか見るといいです。

function urlSecurityCheck(aURL, aPrincipal, aFlags)
{
  const nsIScriptSecurityManager =
    Components.interfaces.nsIScriptSecurityManager;
  var secMan = Components.classes["@mozilla.org/scriptsecuritymanager;1"]
                         .getService(nsIScriptSecurityManager);
  if (aFlags === undefined)
    aFlags = nsIScriptSecurityManager.STANDARD;

  try {
    if (aURL instanceof Components.interfaces.nsIURI)
      secMan.checkLoadURIWithPrincipal(aPrincipal, aURL, aFlags);
    else
      secMan.checkLoadURIStrWithPrincipal(aPrincipal, aURL, aFlags);
  } catch (e) {
    // XXXmano: dump the principal url here too
    throw "Load of " + aURL + " denied.";
  }
}

関連リンク

JaylynnJaylynn2011/12/30 15:44You've got to be kdiding me-it's so transparently clear now!

cihkqonnncihkqonnn2011/12/31 17:09QECXVo <a href="http://eyjqeqncluyu.com/">eyjqeqncluyu</a>

twgxckytwgxcky2011/12/31 22:47Nd72Oe , [url=http://pqvzzcatthaj.com/]pqvzzcatthaj[/url], [link=http://ymbrvznkcolt.com/]ymbrvznkcolt[/link], http://hfquuyoupfdu.com/

utczioutczio2012/01/01 22:33I53GJv <a href="http://gpmloblunvmv.com/">gpmloblunvmv</a>

ivsuvegsivsuvegs2012/01/02 03:26mE8149 , [url=http://zopvzvpgbsrz.com/]zopvzvpgbsrz[/url], [link=http://dmdirlxxmhtw.com/]dmdirlxxmhtw[/link], http://dabigaimaqjd.com/

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があれば全部やるとかやった方がいいっぽぃ。

nsIPropertyBag, nsISimpleEnumerator, nsIProperty

| 14:07 |  nsIPropertyBag, nsISimpleEnumerator, nsIProperty - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  nsIPropertyBag, nsISimpleEnumerator, nsIProperty - Ci.nsIZIGOROu

nsIWritablePropertyBag と wrappedJSObject - Ci.nsIZIGOROu - Mozilla 拡張機能勉強会 の続き。

キーの列挙は nsIPropertyBag.enumerator を他の変数に使うたびに代入して行う。

コードとしては下記のような感じになるかなと。

var props = Cc["@mozilla.org/hash-property-bag;1"].createInstance(Ci.nsIWritablePropertyBag);
// 中略、ここでキーに色々入れる
var iterator = props.enumerator;
while (iterator.hasMoreElements()) {
  with ({prop: iterator:getNext()}) {
    prop.QueryInterface(Ci.nsIProperty);
    // 以下略
  }
}

hasMoreElements() で確認して getNext() するんだけど、この際にnsISuportsで返ってくるんだけど、nsIProperty を実装したオブジェクトが返ってくるので QueryInterface で型変換する。

name, valueと言うメンバ変数がreadonlyで提供されるので、これで元のhashのキーと値が取れる寸法。

インターフェース操作、要するにQueryInterfaceを何度か駆使しなきゃいけないのは面倒だけど、こうしてJSオブジェクトが突っ込めるハッシュがあると便利だな。


nsIWritablePropertyBag と wrappedJSObject

| 13:30 |  nsIWritablePropertyBag と wrappedJSObject - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  nsIWritablePropertyBag と wrappedJSObject - Ci.nsIZIGOROu

d:id:fls さんに教えて貰った wrappedJSObject と nsIWritablePropertyBag についてです。

準備

function wrapped(obj) {
  return { wrappedJSObject: obj };
}

とか定義しておく。

実験

var props = Cc["@mozilla.org/hash-property-bag;1"].createInstance(Ci.nsIWritablePropertyBag);
var data = {a: 1, b: 2};
props.setProperty("foo", data);
props.setProperty("bar", wrapped(data));

とした時に、getPropertyしたらどうなるかと言う話。

Fx2
props.getProperty("foo")
[xpconnect wrapped nsISupports]{QueryInterface: function() {}}

となり、props.getProperty("foo").a とか取れません。

一方で wrappedJSObject しておくと、

props.getProperty("bar");
// [xpconnect wrapped nsISupports] — {QueryInterface: function() {…}}
props.getProperty("bar").wrappedJSObject;
// [object Object] — {a: 1, b: 2}

と言う訳で wrappedJSObject プロパティが出来てます。

Fx3

こっちはgetPropertyした時点で生のJSオブジェクトが帰って来ます。つまり

props.getProperty("foo").a; // 1
props.getProperty("bar").wrappedJSObject.a; // 1

便利になったけど、互換性のある書き方としては後者のwrappedJSObjectを使う場合ですね。

まとめ

と言う訳でwrappedJSObject使うと幸せになれます^^


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-28

Components.utils.getWeakReference() がウマーな件

| 19:13 |  Components.utils.getWeakReference() がウマーな件 - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  Components.utils.getWeakReference() がウマーな件 - Ci.nsIZIGOROu

JS XPCOM などで呼び出し元の JS のコンテキストに対して、Object 型の値を返すとか、あるいは Object 型をそのまま渡すとかっていう事は原則として出来ませんでした。

Firefox 3からある Components.utils.getWeakReference() を使うとそれが出来るようになります。

nsIObserverService を使った例

例えば次のようなソースを用意して実行します。(どこかで)

var EXPORTED_SYMBOLS = ["testObserval"];

const Cc = Components.classes;
const Ci = Components.interfaces;

var testObserval = (function() {
  var observerService = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
  var constructor = function() {
  };

  var TEST_TOPIC = "test-observer-notify";

  constructor.prototype = {
	notify: function(aData) {
	  observerService.notifyObservers({ foo: 1 }, TEST_TOPIC, aData);
	},
	notifyJSObject: function(aData) {
	  observerService.notifyObservers(Components.utils.getWeakReference({ foo: 1 }), TEST_TOPIC, aData);
	},
	register: function(aObserver) {
	  observerService.addObserver(aObserver, TEST_TOPIC, false);
	},
	remove: function(aObserver) {
	  observerService.removeObserver(aObserver, TEST_TOPIC);
	}
  };

  return new constructor();
})();

これは Components.utils.import で読み込んで下さい。JS XPCOM 相当と言う事を確認する為です。

次に呼び出し側の ChromeWindow の JS のコンテキストで、

var testObserver = (function() {
  var constructor = function() {
	this.subject = null;
	this.topic = "";
	this.data = "";
  };

  constructor.prototype = {
	logger: Cc['@mozilla.org/consoleservice;1'].getService(Ci.nsIConsoleService),
	observe: function(aSubject, aTopic, aData) {
	  this.log(aTopic);
	  this.subject = aSubject;
	  this.topic = aTopic;
	  this.data = aData;
	},
	interfaces: function() {
	  var ifaces = [];
	  for (var iface in Ci) {
		if (this.subject instanceof Ci[iface]) {
		  ifaces.push(iface);
		}
	  }
	  return ifaces;
	},
	log: function(msg) {
	  this.logger.logStringMessage(msg);
	}
  };

  return new constructor();
})();

を定義しておきます。

次に testObserval の register で testObserver を登録します。

testObserval.register(testObserver);

次に普通にnotifyしてみます。

testObserval.notify("bar");

中では無理矢理 JSObject 型を subject としています。

testObserver.interfaces().toString(); // nsISupports 

なので、これ以上何も出来ません><

getWeakReference を使うとどうなるか

今度は testObserval.notifyJSObject を代わりに使ってみます。

testObserval.notifyJSObject("bar");

同じように実装しているインターフェースを見てみます。

testObserver.interfaces().toString(); // xpcIJSWeakReference,nsISupports

xpcIJSWeakReference が実装されたオブジェクトが返ってきます。

従って subject の QueryInterface() でキャストして、ここで使えるget()メソッドを呼び出してみると、

testObserver.subject.QueryInterface(Ci.xpcIJSWeakReference).get().foo; // 1

のようにぶち込んだ Objectプロパティアクセス出来ます。

まとめ

今まで XPCOM 的なプリミティブな値か XPCOM オブジェクトしか XPConnect 経由で渡せなかったけど、Componsnts.utils.getWeakReference() を使えば、JSオブジェクトそのままで渡す事が可能になります。

すげー。

呼び出し元では QueryInterface() して get() と言う余計な手続きはありますが、そのまま扱えるのは非常に大きなメリットだなと。この辺りはgetter/setterとかで何とかしちゃえば良さそうだし。

追記 (2008-06-01T02:01:08+09:00)

d:id:fls さんから教えて頂いた wrappedJSObject なら全然問題無いとの事でした。ほぉー。

piro_orpiro_or2008/05/28 19:53要点だけ抜き出すと

var observerService = Cc["@mozilla.org/observer-service;1"]
    .getService(Ci.nsIObserverService);

// XPCOMのインターフェースを通と生のJSオブジェクトにアクセスできない
var observer = {
observe : function(aSubject, aTopic, aData) {
alert(aSubject.foo); // undefined
}
};
observerService.addObserver(observer, 'test-topic', false);
observerService.notifyObservers(
{ foo : 1 },
'test-topic',
null
);
observerService.removeObserver(observer, 'test-topic');

// XPCOMのインターフェース越しで生のJSオブジェクトにアクセスする
var observer = {
observe : function(aSubject, aTopic, aData) {
aSubject = aSubject.QueryInterface(Ci.xpcIJSWeakReference).get(); //****追加****
alert(aSubject.foo); // 1
}
};
observerService.addObserver(observer, 'test-topic', false);
observerService.notifyObservers(
Components.utils.getWeakReference( //****追加****
{ foo : 1 }
), //****追加****
'test-topic',
null
);
observerService.removeObserver(observer, 'test-topic');

てことでしょうか?
第1引数のsubjectはあくまでsubject(主語)としてのみ使うものだ、という思い込みがあったので、こういう使い方は思いつきませんでしたね……

ZIGOROuZIGOROu2008/05/29 11:11> てことでしょうか?

て事ですね。

> 第1引数のsubjectはあくまでsubject(主語)としてのみ使うものだ

第一引数のsubjectを何に使うべきかと言う議論もあるかもしれませんが、言いたい事はそこじゃなくて、xpcIJSWeakReferenceとしてやりとりすれば素のJSオブジェクトでやり取り出来るという事だけですね。

flsfls2008/05/30 21:00wrappedJSObject を使えば簡単にJSオブジェクトでやり取りできますよ

function SubjectWrapper(aObject){
this.wrappedJSObject = aObject;
}

var observer = {
observe : function(aSubject, aTopic, aData) {
alert(aSubject.wrappedJSObject.foo);
}
};

observerService.addObserver(observer, 'test-topic', false);
observerService.notifyObservers(new SubjectWrapper({ foo:1 }), 'test-topic', null);
observerService.removeObserver(observer, 'test-topic');

ZIGOROuZIGOROu2008/06/01 01:57> d:id:fls さん

うへw 知らなかった><
ありがとうございます。勉強になります。

NanaNana2012/07/23 13:02This is an article that makes you think "never touhght of that!"

ivdpvghivdpvgh2012/07/23 22:06z9fRrF <a href="http://dhhlfemkguyw.com/">dhhlfemkguyw</a>

tbsgzgtbsgzg2012/07/24 11:43Ynms0P , [url=http://tvzpvwukgsei.com/]tvzpvwukgsei[/url], [link=http://qdfuftfcfvqc.com/]qdfuftfcfvqc[/link], http://ptogkdwzynow.com/

htuuvzjhtuuvzj2012/07/25 22:35yAH5UE <a href="http://pwhtacsynlwv.com/">pwhtacsynlwv</a>

bekljzllabekljzlla2012/07/26 22:591z5SBX , [url=http://irtffefggpcq.com/]irtffefggpcq[/url], [link=http://zchnxrdznina.com/]zchnxrdznina[/link], http://zgnrqcekjqgd.com/