1

ドラッグ アンド ドロップ操作での Firefox の動作を変更したい (このWONTFIX バグを修正し、この少し古いパッチをアドオンに適用するため)。XUL オーバーレイを介してこのメ​​ソッドをオーバーライドするにはどうすればよいですか? 私はこのようないくつかのコードを試しました:

<?xml version="1.0"?>
<!DOCTYPE override SYSTEM "chrome://dragdrop/locale/overlay.dtd">
<overlay id="ondrop-overlay"
         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> 

      <binding id="tabbrowser">
          <implementation>
              <method name="onDrop">
                <body>
                ...
                </body>
              </method>
          </implementation>
      </binding>

</overlay>

その間

overlay chrome://browser/content/tabbrowser.xml chrome://dragdrop/content/tabbrowser.xul

私のchrome.manifestにありましたが、成功しませんでした。私を助けてください、ありがとう:)

4

1 に答える 1

2

オーバーレイは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);
});
于 2012-05-17T20:19:34.400 に答える