mozura さんが書きました:
Thunderbird本体[omni.ja]内にある[messengercompose.xul]において[cloudAttachmentLinkManager.js]を読み込んでいますが、自作のJSファイルを読み込むように変更したいと考えています。
変更方法として[omni.ja]内のXULファイルを直接変更するのではなく、自作のアドオンで変更したいと考えています。
XULファイルのJSファイル読み込み定義を削除することは可能でしょうか。
(自作のアドオンで対象のXULをoverlayし、自作のJSファイルを追加することは出来ています。)
「アドオンで対象のXULをoverlay」というのは、
Tbが、C:\ ... \omni.ja\ ... \messengercompose.xul というファイルを、chrome://messenger/ ... /messengercompose.xul というURLで持ってきたものにオーバーレイ、であり、
このXULオーバーレイにおいて、この「chrome://messenger/ ... /messengercompose.xul 」というURLに対応するリソースの探索順を変えるとか、リソースの探索場所を上に追加する、というようなことはできなかった?
それができないと、アドオンで、Tbの標準のhogehoge.xul/.jsをコピーして書き換えたものをアドオンのhogehoge.xul/.jsに入れておいて、アドオンのhogehoge.xul/.jsを使わせる、というようなことができないから、できそうに思えますが。
それと、chrome://~/...の探索は、固定された一つの場所ではなくて、chrome://~に対応する複数の定義の上からもってくるのでXULオーバーレイやアドオンが成立する、という風に思っていたのですが...
Tbのmessengercompose.xulがsrc="chrome://messenger/ ... /cloudAttachmentLinkManager.jsで持ってくるものを、自分のアドオンのcloudAttachmentLinkManager.jsにし、その中で、TbのcloudAttachmentLinkManager.jsの中の全てのロジックやfunctionを思い通りに書き換える、とか、
chrome://messenger/ ... /messengercompose.xul で持ってこられるものを、自分のアドオンの中のmessengercompose.xul にさせて、その中の<script>でロードするものを好きなように書き換える、
というようなことができるようにはなっていない?
windowの定義でロードされるhogehoge.jsで定義しているfunction文は、window.function名というJavaScriptのグローバル変数になりますし、
あるオブジェクトのプロパティーとして定義している~=function() ...ならば、そのあるオブジェクト.プロパティ名になりますから、
自分のアドオンの中で、そのwindow.function名やオブジェクト.プロパティ名の内容を自分で定義したfunctionオブジェクトで置き換えれば、
TbのJSコードを自分のもので置き換えることができます。
Tbのhogehoge.jsをロードした時に実行される部分を停めることはできないですが。
それに、cloudAttachmentLinkManager.js がやっていることは、
gCloudAttachmentLinkManager というオブジェクト(コンポーザーウィンドウのwindow.gCloudAttachmentLinkManager というJSのグローバル変数)を定義し、そのプロパティーに各種のfunctionを定義し、gCloudAttachmentLinkManager というオブジェクトの中の何かを、addEventListnerでEventListnerとして登録しているだけです。
「
cloudAttachmentLinkManager.jsのソース」
ですから、そのEventListnerをremoveEventListnerで殺し、window.gCloudAttachmentLinkManagerというオブジェクトの中身を書き換え、自分のEventListnerを登録してしまえば、TbのcloudAttachmentLinkManager.jsを書き換えたのと同等になります。
TbのcloudAttachmentLinkManager.jsがロードされて、自分のアドオンに制御が渡ってくる前に、Tbのwindow.gCloudAttachmentLinkManagerを使って他の誰かが実行した部分のキャンセルはできませんが、
compose-window-init、compose-window-close, compose-send-messageのイベントリスナーを登録しているだけだから、最初のcompose-window-initが発生するまでは誰も何もしないわけで、コンポーザーウィンドウでアドオンがロードされる方がほぼ確実に先になるように思えます。
gCloudAttachmentLinkManager.init.bind(gCloudAttachmentLinkManager)の.bindが何者なのか不明なので、正確なところは不明ですが。
JavaScriptコードの置き換えでは、これが一番簡単で楽だから、このほうが一般的じゃないかな?
TbのcloudAttachmentLinkManager.jsが定義したものを置き換えてしまう、というような手法ではダメだったので、TbのcloudAttachmentLinkManager.jsをロードさせないようにしたい、なのですか?