XULRunner アプリケーションをデバッグする最も簡単な方法はシステムに問題点を通知させることです。2 種類のコンソールが利用可能であり、必要な情報をそれらに表示させるためのさまざまな設定項目が存在します。
設定
以下のように設定するとデバッグがかなり楽になります。
設定は <tt>%appname%/defaults/preferences/</tt> ディレクトリ内の .js ファイルで行います。(拡張子が <tt>.js</tt> であれば)ファイル名は何でもかまいません。ですので、<tt>debug.js</tt> とするのが最良でしょう。
/* デバッグ用設定 */ pref("browser.dom.window.dump.enabled", true); pref("javascript.options.showInConsole", true); pref("javascript.options.strict", true); pref("nglayout.debug.disable_xul_cache", true); pref("nglayout.debug.disable_xul_fastload", true);
コンソール
windows でコンソールを有効にするには <tt>-console</tt> 引数付きで xulrunner を起動してください。<tt>-console</tt> は application.ini 引数の後になくてはなりません。例:<tt>xulrunner.exe /path/to/application.ini -console</tt>
コンソールにテキストを出力するには <tt>dump("my text here\n");</tt> のようにしてください。これは <tt>pref("browser.dom.window.dump.enabled", true)</tt> が有効になっているときのみ機能します。
JavaScript コンソール
JS コンソールを有効にするには -jsconsole 引数付きで xulrunner を起動してください。この引数は application.ini 引数の後になくてはなりません。 例:<tt>xulrunner.exe /path/to/application.ini -jsconsole</tt>
デフォルトでは JS コンソールはウェブコンテンツのエラーのみを表示します。クロムの JavaScript のエラーを表示させるには <tt>pref("javascript.options.showInConsole", true)</tt> をセットする必要があります。
JS エラーログをディスクに保存するには "XRE_CONSOLE_LOG" 環境変数にファイル名のパスを指定してください。例えば <tt>export XRE_CONSOLE_LOG=/path/to/logfile</tt> または <tt>set XRE_CONSOLE_LOG=C:\path\to\logfile</tt>。
JS コンソールへのメッセージの出力
JS コンソールにメッセージを出力するには 2 つの方法があります。
-
Components.utils.reportError(str)
は(例えば赤い停止アイコンとともに)「エラー」としてstr
を出力します。 -
jsdump(str)
(以下のように定義される関数)は吹き出しアイコンとともに「メッセージ」としてstr
を出力します。
function jsdump(str) { Components.classes['@mozilla.org/consoleservice;1'] .getService(Components.interfaces.nsIConsoleService) .logStringMessage(str); }
(この話題についての MozillaZine Knowledge Base の記事 も参照)
Venkman
XULRunner ベースのアプリケーションに Venkman を永久的に付属させる最も簡単な方法は以下のとおりです(XULRunner 1.8.0.1 にてテスト済み)。
- Venkman を addons.mozilla.org から入手する(編集時点では v0.9.87)。
- パッケージを解凍 (unzip) し、<tt>chrome/venkman.jar</tt> ファイルを XULRunner ベースアプリアプリケーションの <tt>chrome</tt> ディレクトリにコピーする
- <tt>components/venkman-service.js</tt> をアプリケーションの <tt>components</tt> ディレクトリにコピーする
- XUL ウィンドウのどれかに
<script src="chrome://venkman/content/venkman-overlay.js"/>
を追加する - ウィンドウに Venkman を開くための UI を追加する(メニューアイテムやツールバーボタンという形になるだろう)。その UI から
start_venkman()
を呼び出すようにする。 - <tt>chrome/chrome.manifest</tt> に以下の行を追加する。
content venkman jar:venkman.jar!/content/venkman/ locale venkman en-US jar:venkman.jar!/locale/en-US/venkman/ skin venkman modern/1.0 jar:venkman.jar!/skin/modern/venkman/
チラシの裏っぽいのでとりあえず保留 (This can also be used in Firefox 1.5 to launch venkman from html buttons in a chrome-loaded page; since venkman.jar gets put into <package>chrome/venkman.jar the chrome.manifest that works for me needs "chrome/" added to venkman.jar: content venkman jar:chrome/venkman.jar!/content/venkman/ locale venkman en-US jar:chrome/venkman.jar!/locale/en-US/venkman/ skin venkman modern/1.0 jar:chrome/venkman.jar!/skin/modern/venkman/
トラブルシューティング
x-jsd is not a registered protocol
Venkman で *.js ファイルを開こうとしたときに "x-jsd is not a registered protocol" というメッセージが表示されたら、XULRunner のバイナリと同じディレクトリに .autoreg という名前の空のファイルを作成してください。もし .autoreg がすでに存在しているならば、それを編集して強制的に最終更新時刻を更新してください。XULRunner は新しいコンポーネントファイルに気付くでしょう。
function toOpenWindowByType is not defined
"function toOpenWindowByType is not defined" というエラーが発生したら、次の関数をご自分のスクリプトに追加するといいでしょう(venkman のオーバレイ内での現象ではないようだ)。
function toOpenWindowByType(inType, uri) { var winopts = "chrome,extrachrome,menubar,resizable,scrollbars,status,toolbar"; window.open(uri, "_blank", winopts); }