Hatena::Groupmoz-addon

Ci.nsIZIGOROu

2008-04-16先手と大人と将来

続 RestTestをOSXのXULRunnerで動かす

| 19:06 |  続 RestTestをOSXのXULRunnerで動かす - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  続 RestTestをOSXのXULRunnerで動かす - Ci.nsIZIGOROu

RestTestをOSXのXULRunnerで動かす - Ci.nsIZIGOROu - Mozilla 拡張機能勉強会TODOと課していたアプリケーションの終了が出来ないですが、

<script type="application/x-javascript">
<![CDATA[
function quit(aForceQuit) {
  var appStartup = Components.classes['@mozilla.org/toolkit/app-startup;1'].getService(Components.interfaces.nsIAppStartup);

  // eAttemptQuit will try to close each XUL window, but the XUL window can cancel the quit
  // process if there is unsaved data. eForceQuit will quit no matter what.
  var quitSeverity = aForceQuit ? Components.interfaces.nsIAppStartup.eForceQuit : Components.interfaces.nsIAppStartup.eAttemptQuit;
  appStartup.quit(quitSeverity);
}
]]>
</script>

こんなんをまるっとtester.xulのどこかに入れて、

<hbox>
  <button label="Quit" oncommand="quit(true);"/>
</hbox>

とかやればOKです。

完成版のtester.xul

<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<window id="http-tester" title="RESTTest - HTTP Tester"
		xmlns:html="http://www.w3.org/1999/xhtml"
		xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
		onload="byId('url').focus();"
		onunload="return true;">
  <script type="application/x-javascript" src="chrome://resttest/content/requester.js"/>
  <script type="application/x-javascript">
	<![CDATA[
			 function quit(aForceQuit) {
			 var appStartup = Components.classes['@mozilla.org/toolkit/app-startup;1'].getService(Components.interfaces.nsIAppStartup);

// eAttemptQuit will try to close each XUL window, but the XUL window can cancel the quit
// process if there is unsaved data. eForceQuit will quit no matter what.
var quitSeverity = aForceQuit ? Components.interfaces.nsIAppStartup.eForceQuit : Components.interfaces.nsIAppStartup.eAttemptQuit;
appStartup.quit(quitSeverity);
}
	]]>
  </script>
  <!-- toolbox -->
  <vbox flex="1">
	<groupbox flex="1">
	  <caption id="uri text" label="Request" crop="end"/>
	  <hbox align="center">
		<label value="URL" />
		<textbox id="url" flex="1" type="autocomplete" autocompletesearch="history" value="http://" onkeypress="if (event.keyCode == 13) {sendRequest(); return false;}"/>
	  </hbox>
	  <hbox align="center">
		<label value="Method" control="method.input"/>
		<menulist id="method" editable="true" onkeypress="if (event.keyCode == 13) {sendRequest(); return false;}">
		  <menupopup>
			<menuitem label="GET"/>
			<menuitem label="HEAD"/>
			<menuitem label="POST"/>
			<menuitem label="PUT"/>
			<menuitem label="DELETE"/>
			<menuitem label="OPTIONS"/>
		  </menupopup>
		</menulist>
	  </hbox>
	  <hbox align="center">
		<label value="Headers"/>
		<textbox id="headers" rows="3" value="Content-Type: application/x-www-form-urlencoded" multiline="true" flex="15" type="text" />
	  </hbox>
	  <hbox align="center">
		<label value="POST/PUT data"/>
		<textbox id="data" rows="4" multiline="true" wrapAround="true" flex="15" type="text" />
	  </hbox>
	  <hbox align="right">
		<button id="button" label="Send" onclick="sendRequest()"/>
	  </hbox>
	</groupbox>
	<groupbox flex="1">
	  <caption id="uri text" label="Response" crop="end"/>

	  <hbox align="center">
		<label value="Response Status" />
		<label value="" id="status"/>
	  </hbox>
	  <hbox align="center">
		<label value="Response Headers"/>
		<textbox id="response_headers" rows="5" value="" multiline="true" flex="15" type="text"/>
	  </hbox>
	  <hbox align="center">
		<label value="Response Text" />
		<textbox id="response" rows="8" multiline="true" wrapAround="true" flex="15" type="text" />
	  </hbox>
	</groupbox>
  </vbox>
  <hbox>
	<button label="Quit" oncommand="quit(true);"/>
  </hbox>
</window>

RestTestをOSXのXULRunnerで動かす

| 18:15 |  RestTestをOSXのXULRunnerで動かす - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  RestTestをOSXのXULRunnerで動かす - Ci.nsIZIGOROu

RestTestと言うFirefox用の拡張があります。

詳細は開発者必須!ブラウザでRESTful APIにPUT&DELETE?RestTest MOONGIFT辺りを見て下さい。

で、Firefox拡張って気楽で素敵なんだけどブラウザにくっついてる必然性は一切無い拡張なので、出来れば外したい。でも使いたいぜーって時にどうしようとなる訳ですが、XUL Runnerで動かせばいいかーと言う結論に達してやってみました。ちなみにOSXを想定しています。

まずは準備

XULRunnerインストール

今回は安定板*1を使いました。

インストールdmg->pkgなんで特に説明の必要は無いと思います。

OSXだと、/Library/Framework/XUL.framework/ に展開されます。

RestTestのダウンロード

適当ディレクトリ掘って展開しましょう。

$ cd /path/to/dir
$ mkdir resttest
$ cd resttest
$ wget http://www.xucia.com/files/resttest.xpi
$ unzip resttest.xpi
application.iniを作る

/path/to/dir/resttestを基本として、直下にapplication.iniを作ります。

[App]
Vendor=Xucia
Name=RestTest
Version=1.0
BuildID=20080416
Copyright=Copyright (C) www.xucia.com
ID=resttest@xucia.com

[Gecko]
MinVersion=1.8
MaxVersion=1.9

こんな感じ。

chrome.manifestを編集
content  resttest chrome/content/
skin	 resttest classic/1.0 chrome/skin/
# overlay chrome://browser/content/browser.xul chrome://resttest/content/resttest.xul

overlayは不要なので消す。

pref.jsを作る

./defaults/preferences/pref.js として作ります。

pref("toolkit.defaultChromeURI", "chrome://resttest/content/hello.xul");
install-appする
$ /Library/Frameworks/XUL.framework/xulrunner-bin --install-app /path/to/dir/resttest

こうすると、application.iniで設定した項目で、

/Applications/(Vendor)/(Name).app/Contents/MacOS/xulrunner 

と言う風にインストールされます。つまり、

/Applications/Xucia/RestTest.app/Contents/MacOS/xulrunner 

って感じ。

試してみる

さっき出きたxulrunnerって奴を叩くと実行です。

f:id:ZIGOROu:20080416181308p:image

こんな感じ。普通に使えます。

まとめ

とりあえずOSXの場合はxulrunner -appで直接実行しても何故か画面に対して入力出来ず、ターミナルに出力されちゃう。

あとnightlyだと--install-appがapplication.iniのparse errorだとかで出来なかった。

OSX版は本当に罠が多いらしい。

TODO

Quit()を実装する。

参考リンク

*1:1.8.13