MozillaZine.jp フォーラム
https://forums.mozillazine.jp/

Thunderbirdで、XULのスクリプトのシンタックスエラーがエラーコンソールに出ない
https://forums.mozillazine.jp/viewtopic.php?f=26&t=14517
ページ 11

作成者:  WADA [ 2013年12月26日(木) 10:49 ]
記事の件名:  Thunderbirdで、XULのスクリプトのシンタックスエラーがエラーコンソールに出ない

Thunderbird 17の頃からなんですが、自作のXULのスクリプトのシンタックスエラーがエラーコンソールに出なくなってしまい、Tb 24でもそうです、
全体をtry/catchでくくって自分でフックしようとしても、シンタックスエラーのためにアドオンのスクリプトが実行されないので、意味がない(^^:
今のところ、全然動かなかったらTb 10ESRでエラーがでないことを確認してTb24で動作確認、で逃げられているんですけどね。

どこかの設定で、エラーコンソールに表示する・しない、を制御できるのでしょうか。
chrome.mnifestやinstall.rdfの記述に問題があるのかな?
あるいは、<script>を書く場所の問題?
ToolBarボタンそのものではなくToolBarパレットに登録し、ToolBarのカストマイズでボタンを登録するようにしていて、それも、ToolBarではなくMenuBarにボタンを入れた、ということが関係するのかな?

現在アドオンを置いてあるURLです。
http://www.h2.dion.ne.jp/~radon/mozilla ... 0-003.html
単に各種のオブジェクトをエラーコンソールにダンプするのが目的なんですが、メモリーリークを引き起こすテストケースや、クラッシュが起こるテストケースもあるので、基本は非公開の個人用アドオンです。
名前の意味は「TbがGmail IMAPで常に[Gmail]/Trashをtrashにするので、他のmboxを無理矢理trashにしてしまう」。
Folder re-discoveryで[Gmail]/Trashに戻してしまうので意味が無いのですが、一時的にせよ、Tbに逆らって好みのmboxにtrashアイコンをセットできるので、気分転換ができる(^^)

作成者:  WADA [ 2013年12月26日(木) 17:52 ]
記事の件名:  Re: Thunderbirdで、XULのスクリプトのシンタックスエラーがエラーコンソールに出ない

追記です。

普通と異なるのは、JSファイルのロード時に実行されるのは、このアドオン用の唯一のグローバルオブジェクト(window.XYZのようなグローバル変数)の定義と、そのいくつかのプロパティーの値のセットと、多くの関数を、その唯一のグローバルオブジェクトのプロパティーとして定義しているだけ、ということです。
JSファイルの中には、functionステートメントはありません。
ほぼ全てが、ボタンクリックの後のグローバルオブジェクトのプロパティーのfunctionのコール、になっていて、いくつかは、イベントハンドラーやイベントリスナーとして使うようになっています。
これは、windowのプロパティー(グローバル変数)のバッティングや、varやletを書き忘れてwindow.xyzを壊してしまうことを減らすためです。
Objectオブジェクトの定義をしているだけですから、JSファイルのロード時のシンタックスチェックには、まず引っかかりません。

実行時に判明するシンタックスエラーや未定義変数の参照エラーなどは、エラーのあるブロックが大体わかっている時には、try/catchでほぼ引っ掛けられるのですが、何箇所か書き換えていたり重要な場所でのエラーで何も実行されないような場合には、エラーコンソールにエラーメッセージがでてくれないと、手も足もでない状態になってしまいます(^^;

作成者:  WADA [ 2014年3月07日(金) 11:58 ]
記事の件名:  Re: Thunderbirdで、XULのスクリプトのシンタックスエラーがエラーコンソールに出ない

ほぼ、「自己解決」、です。

回避策:
JavaScript Code ModuleにしてComponents.utils.import("resource://app名/ファイル名.jsm",オブジェクト名); を使う。

importユーティリティがロード時にシンタックスエラーを検出すると、エラーメッセージをだしてくれます。
その上、ファイル名.jsmの中で、Components.utils.import("resource://app名/子供のファイル名.jsm",オブジェクト名); を使えば、階層化できるので、
あるオブジェクト内の個々のfunctionにつき一つの.jsmファイル、ということも非常に簡単にできて、便利。
Singletonなので、各XULウィンドウのwindowごとにコードを持たずに済み、メモリー消費量の節約にもなるし、
app名さえユニークであればいいので、グローバル変数の衝突の回避も、非常に楽にできますし、
複数のAdd-Onに分けてSingletonを共有、ということも、簡単にできます。

もっとも、各XULウィンドウのwindowとかdocumentには直接アクセスできないので、
それぞれのXULウィンドウの、windowとかdocumentとかwindow.自分のグローバル変数、などは、パラメーターで渡すとか、オブジェクトのプロパティーとして入れておく、などが常に必要になり、
今あるコードを全てSingletonのオブジェクトに移行するのは、ちょっと手間がかかりますけど。
Singletonのオブジェクトとして使い、functionは、オブジェクトメソッドとして定義してあって、this.プロパティを扱う、という場合には楽なんですが、
Singletonのコードライブラリーとして使うには、当然ですが、functionの中に必ず、Components.utils.import("resource://app名/子供のファイル名.jsm",オブジェクト名); を書いておかないといけない。
Components.utils.import(... と書いておくだけでいい、という話ではあるんですけどね。

ページ 11 All times are UTC + 9 hours
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/