检测 FF 附加组件中的导航
Detecting navigation in FF add ons
我正在使用 'FF Addon SDK' 将 Chrome 扩展移植到 FF。在后台脚本 (main.js) 文件中,我需要使用 FF 等价于...
chrome.webNavigation.onBeforeNavigate.addListener()
和
chrome.tabs.onUpdated.addListener()
我注意到require("sdk/tabs").on只有open, close, finish等,与导航无关
我看到一些使用 Page-Mod 的解决方案或展示了开发 FF 扩展的旧 XUL 方式的解决方案。我正在专门寻找 FF Addon SDK(仅)解决方案。
感谢任何意见。
编辑:我能够通过使用 Progress Listener 找出 chrome.tabs.onUpdated.addListener() 的替代方案。显然,在 FF 中它被称为 onLocationChange。仍在寻找 chrome.webNavigation.onBeforeNavigate.addListener()
的替代品
很遗憾,chrome.webNavigation.onBeforeNavigate.addListener() 没有合适的替代品。
一周前发现自己处于同样的情况。尝试将 nsIWebProgressListener.onStateChange 用于 STATE_START。没有按预期工作。
你最好的选择是:
1.) 使用 onLocationChange 事件,它会为您提供正在加载的位置的 URI。
2.) 拦截Httprequest。为顶级筛选出一个并调用它 onbeginnavigate。
如果您找到其他方法,请告诉我。
好的,我设法弄明白了。我们需要使用 onStateChange 侦听器。为了模仿 onBeforeNavigation,我们不仅需要检查 STATE_START,还要检查 STATE_IS_DOCUMENT.
var progressListener = {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener, Ci.nsISupportsWeakReference]),
onLocationChange: function(aWebProgress, aRequest, aURI) {
if (aRequest && aURI) {
console.log('onLocationChange: ' + aURI.spec);
}
},
onStateChange: function(aWebProgress, aRequest, aStateFlags, aStatus) {
var status = Ci.nsIWebProgressListener;
if(aStateFlags&status.STATE_START && aStateFlags&status.STATE_IS_DOCUMENT) {
console.log('onStateChange: ' + aRequest.QueryInterface(Ci.nsIChannel).originalURI.spec);
}
}
};
您可以从您的框架脚本中附加一个 onBeforeUnload
/onUnload
事件。
我正在使用 'FF Addon SDK' 将 Chrome 扩展移植到 FF。在后台脚本 (main.js) 文件中,我需要使用 FF 等价于...
chrome.webNavigation.onBeforeNavigate.addListener()
和
chrome.tabs.onUpdated.addListener()
我注意到require("sdk/tabs").on只有open, close, finish等,与导航无关
我看到一些使用 Page-Mod 的解决方案或展示了开发 FF 扩展的旧 XUL 方式的解决方案。我正在专门寻找 FF Addon SDK(仅)解决方案。
感谢任何意见。
编辑:我能够通过使用 Progress Listener 找出 chrome.tabs.onUpdated.addListener() 的替代方案。显然,在 FF 中它被称为 onLocationChange。仍在寻找 chrome.webNavigation.onBeforeNavigate.addListener()
的替代品很遗憾,chrome.webNavigation.onBeforeNavigate.addListener() 没有合适的替代品。 一周前发现自己处于同样的情况。尝试将 nsIWebProgressListener.onStateChange 用于 STATE_START。没有按预期工作。 你最好的选择是: 1.) 使用 onLocationChange 事件,它会为您提供正在加载的位置的 URI。 2.) 拦截Httprequest。为顶级筛选出一个并调用它 onbeginnavigate。
如果您找到其他方法,请告诉我。
好的,我设法弄明白了。我们需要使用 onStateChange 侦听器。为了模仿 onBeforeNavigation,我们不仅需要检查 STATE_START,还要检查 STATE_IS_DOCUMENT.
var progressListener = {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener, Ci.nsISupportsWeakReference]),
onLocationChange: function(aWebProgress, aRequest, aURI) {
if (aRequest && aURI) {
console.log('onLocationChange: ' + aURI.spec);
}
},
onStateChange: function(aWebProgress, aRequest, aStateFlags, aStatus) {
var status = Ci.nsIWebProgressListener;
if(aStateFlags&status.STATE_START && aStateFlags&status.STATE_IS_DOCUMENT) {
console.log('onStateChange: ' + aRequest.QueryInterface(Ci.nsIChannel).originalURI.spec);
}
}
};
您可以从您的框架脚本中附加一个 onBeforeUnload
/onUnload
事件。