宣伝。日経LinuxにてLinuxの基礎?を紹介する漫画「シス管系女子」を連載させていただいています。 以下の特設サイトにて、単行本まんがでわかるLinux シス管系女子の試し読みが可能!
XPConnectも使えるコマンドラインのJavaScript実行環境で、xpcshellという物がある。XULRunnerをダウンロードするとおまけでついてくる。
xpcshell内ではWindowオブジェクトが無いので、当然だけどWindow.setTimeout()
やWindow.setInterval()
等を使った遅延処理は書けない。でもXPConnectは使えるので、nsITimerの機能を使えば似たようなことはできるはず。
という事で以下のようなスクリプトを書いて-fオプションで読み込ませてみたけど、実はこのままでは期待通りに動いてくれない。
var Cc = Components.classes;
var Ci = Components.interfaces;
function Timeout(aCallback, aDelay) {
this.finished = false;
this.callback = aCallback;
this.init(aDelay);
}
Timeout.prototype = {
init : function(aDelay) {
this.timer = Cc['@mozilla.org/timer;1']
.createInstance(Ci.nsITimer);
this.timer.init(this, aDelay, Ci.nsITimer.TYPE_ONE_SHOT);
},
cancel : function() {
if (!this.timer) return;
delete this.timer;
delete this.callback;
this.finished = true;
},
observe : function(aSubject, aTopic, aData) {
if (aTopic != 'timer-callback') return;
if (typeof this.callback == 'function')
this.callback();
else
eval(this.callback);
this.cancel();
}
};
print('START');
var timeout = new Timeout(
function() {
print('3 SEC AFTER');
},
3000
);
これを実行しても、「START」と出てすぐに終わってしまう。何故かというと、xpcshellはメインスレッドの処理が終わったらその時点でxpcshell自体を終了させてしまうからなのだそうだ。
UxU 0.7.6でも使ってるGecko 1.9以降のスレッド関係の機能を使うと、この問題を解消できる。さっきのスクリプトの末尾に以下を加えて実行すると、今度は「START」と出た3秒後に「3 SEC AFTER」「END」と出てからxpcshellが終了するようになる。
var thread = Cc['@mozilla.org/thread-manager;1']
.getService()
.mainThread;
while (!timeout.finished) {
thread.processNextEvent(true);
}
print('END');
多分nsITimerのタイマー機能以外でも、これ(フラグが立つまでwhileでループ回してメインスレッドを止める)でうまくいくんじゃないかと思う。
XMLHttpRequestも試してみた。
var Cc = Components.classes;
var Ci = Components.interfaces;
var request = Cc['@mozilla.org/xmlextras/xmlhttprequest;1']
.createInstance(Ci.nsIXMLHttpRequest)
.QueryInterface(Ci.nsIDOMEventTarget);
var loaded = false;
request.open('GET', 'http://piro.sakura.ne.jp/', true);
request.addEventListener('load', function() {
print(request.responseText);
loaded = true;
}, false);
request.send(null);
print('REQUESTING...');
var thread = Cc['@mozilla.org/thread-manager;1']
.getService()
.mainThread;
while (!loaded) {
thread.processNextEvent(true);
}
print('END');
これも、ちゃんとレスポンスが帰ってきてから終了した。
の末尾に2020年11月30日時点の日本の首相のファミリーネーム(ローマ字で回答)を繋げて下さい。例えば「noda」なら、「2010-02-06_xpcshell-delayed.trackbacknoda」です。これは機械的なトラックバックスパムを防止するための措置です。
writeback message: Ready to post a comment.