オーバーレイはXULドキュメントにのみ適用され、XBLバインディングには適用されません(これはXUL機能であり、XBLではサポートされていません)。要素のバインディングを元のバインディングから継承する独自のバインディングに置き換えることもできますが、問題のより良い解決策は、ブラウザーウィンドウをオーバーレイして、そのコンテキストでコードを実行することです。tabbrowser
そのコードはtabbrowser
、ウィンドウのインスタンスを変更します。だからchrome.manifest
あなたは書くでしょう:
overlay chrome://browser/content/browser.xul chrome://dragdrop/content/browserOverlay.xul
そしてでbrowserOverlay.xul
:
<?xml version="1.0"?>
<overlay id="ondrop-overlay"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/x-javascript" src="browserOverlay.js"/>
</overlay>
そして最後に、次のbrowserOverlay.js
ようになります。
window.addEventListener("load", function(event)
{
var browser = window.getBrowser();
// Replace browser.onDrop method by own function but keep the original so that it
// can be called later.
var origOnDrop = browser.onDrop;
browser.onDrop = function(aEvent, aXferData, aDragSession)
{
if (...)
{
// Your own processing of the call (start a search)
...
}
else
{
// Let the original function handle the call
origOnDrop.apply(this, arguments);
}
};
});
上記のコードはグローバル変数の使用を避けていることに注意してください。すべての変数は関数内で宣言されています。ブラウザウィンドウのコンテキストで実行しているため、これは一般的に適切なアクションです。グローバル変数はブラウザ自体のコードと共有され、他の拡張機能のコードもこのコンテキストで実行されます。グローバル変数に同じ名前を選択する2つのコードは、厄介な問題を引き起こす可能性があります。グローバル変数を使用しないことが、これを回避するための最良の方法です。
編集:あなたは明らかに古いコード(Gecko 1.8ブランチ)を見ていました。現在のコードにはonDrop
メソッドがありませんが、タブコンテナ要素の適切なイベントハンドラーがあります。イベントハンドラーを置き換えることはできませんが、ドラッグされたテキストがリンクでない場合は何も行わないため、置き換える必要もありません。したがって、このケースを処理する独自のイベントハンドラーを追加するだけで済みます。
window.addEventListener("load", function(event)
{
var browser = window.getBrowser();
browser.tabContainer.addEventListener("drop", function(event)
{
if (...)
{
// This is a search string, do something with it
...
// Indicate that we processed the event
event.stopPropagation();
}
}, false);
});