MozillaZine.jp フォーラム https://forums.mozillazine.jp/ |
|
Thunderbirdで、XULのスクリプトのシンタックスエラーがエラーコンソールに出ない https://forums.mozillazine.jp/viewtopic.php?f=26&t=14517 |
ページ 1 / 1 |
作成者: | 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(... と書いておくだけでいい、という話ではあるんですけどね。 |
ページ 1 / 1 | All times are UTC + 9 hours |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |