我想通过拖放操作更改Firefox的行为(用于修复此WONTFIX bug并使用我的插件应用这个有点旧的patch)。如何通过XUL覆盖覆盖this方法?我试过这样的代码:
<?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中, 但我没有任何成功。请帮助我,谢谢:)
答案 0 :(得分: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);
}
};
});
请注意,上面的代码避免使用全局变量,所有变量都在函数内声明。这通常是一个很好的操作过程,因为您在浏览器窗口的上下文中运行 - 任何全局变量都与浏览器自己的代码共享,其他扩展的代码也在此上下文中运行。为其全局变量选择相同名称的两段代码可能会导致令人讨厌的问题,而不使用任何全局变量是避免这种情况的最佳方法。
编辑:您显然在查看过时的代码(Gecko 1.8分支)。当前代码没有onDrop
方法,而是选项卡容器元素上的a proper event handler。您无法替换事件处理程序 - 但您也不需要,因为如果拖动的文本不是链接,它将不会执行任何操作。因此,您只需添加自己的事件处理程序即可处理此案例。
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);
});