xpcshell で非同期処理

で、教えていただいたので、早速実装してみた。

xpcshell timerTest.jsで実行すると、以下のような感じなる。

[loading 'xpcshell.js'...]
0: HogeFuga
1: HogeFuga
FooBar
2: HogeFuga
3: HogeFuga
FooBar
4: HogeFuga
5: HogeFuga
6: HogeFuga
FooBar
7: HogeFuga
8: HogeFuga
END

非同期的なものはみんな、ThreadManager.poolに収めるようにして、timeTest.jsの最後のThreadManager.wait()でpoolに収められたものが終了するのを待っている。

一応、setTimout,setIntervalに加えて、XMLHttpRequestasync=true、任意のメソッドを実行するThreadManager.callAsyncをpoolの管理対象にしている。

ただ、ThreadManager.callAsync中にXMLHttpRequestをやったら

[Exception... "Component returned failure code: 0x80570015 (NS_ERROR_XPC_CI_RETURNED_FAILURE) [nsIJSCID.createInstance]"  nsresult: "0x80570015 (NS_ERROR_XPC_CI_RETURNED_FAILURE)"  location: "JS frame :: xpcshell.js :: XMLHttpRequest :: line 186"  data: no]

という例外が発生してしまい動かなかった。とってもバギーな感じw

*1:xpcshell.jsは特殊なファイルでxpcshell実行時にカレントディレクトリにこのファイルがあると自動でロードされる