Вопрос по – Переопределение / наложение метода XUL

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, но у меня не было никакого успеха. Пожалуйста, помогите мне, спасибо :)

Ваш Ответ

1   ответ
2

но не к привязкам XBL (это функция XUL и не поддерживается XBL). Пока тыcould заменить привязку для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);
    }
  };
});

Обратите внимание, что приведенный выше код избегает использования глобальных переменных, все переменные объявлены внутри функции. Как правило, это хороший способ действий, поскольку вы работаете в контексте окна браузера - любые глобальные переменные совместно используются с собственным кодом браузера и кодом других расширений, также работающих в этом контексте. Два куска кода, выбирающие одно и то же имя для своей глобальной переменной, могут привести к неприятным проблемам, поэтому не используйте глобальные переменные, чтобы избежать этого.

Edit: Вы, очевидно, смотрели на устаревший код (ветка 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);
});
Error: User Rate Limit Exceededpastebin.mozilla.org/1645141Error: User Rate Limit Exceeded Ebrahim Byagowi
Error: User Rate Limit Exceeded Ebrahim Byagowi
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Ebrahim Byagowi

Похожие вопросы