firefox-addon - nsIWebProgressListener - 重定向到另一个 URL

标签 firefox-addon

在我的扩展中,我需要处理部分 URL 被一些标记替换的书签。当用户打开这样的书签时,扩展应该用一些值替换这个标记并打开新的位置。为了实现这一点,我使用了 nsIWebProgressListener,如下所示:

bookmarksResolver: {
    onLocationChange: function(aWebProgress, aRequest, aLocation, aFlags) {
        if (aLocation) {
            try {
                // Replace markers
                var resolvedLocation = resolveReferences(location);
                if (resolvedLocation != location) { // Open new location if markers were found and replaced
                    aWebProgress.DOMWindow.location.replace(resolvedLocation);
                }
            }
            catch(ex) {
                   //Logging error
            }
        }
    },

    /* Stubs for other listeners */
    onStateChange: function(a, b, c, d) {},
    onProgressChange: function(a, b, c, d, e, f) {},
    onStatusChange: function(a, b, c, d) {},
    onSecurityChange: function(a, b, c) {},

    QueryInterface: function (aIID) {
        if (aIID.equals(Components.interfaces.nsIWebProgressListener) ||
                aIID.equals(Components.interfaces.nsIWebProgressListener2) ||
                aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
                aIID.equals(Components.interfaces.nsISupports)) {
            return this;
        }
        else {
            throw Components.results.NS_NOINTERFACE;
        }
    }
},

问题是,当我尝试替换 URL 中的标记时,如 https://[marker].site.com 我会显示一个奇怪的错误页面(说 netError 上存在语法错误。 xhtml),然后打开带有替换标记的 url,但地址栏一直显示 https://[marker].site.com URL。

问题 #1:我在这里正确使用了 onLocationChange 吗?也许,应该使用另一种方法?

问题 #2:我该怎么做才能防止发生此错误?


UPD:使用 onStateChange 而不是 onLocationChange 并使用标志 STATE_TRANSFERRING | STATE_IS_DOCUMENT 因为捕获标志STATE_START | STATE_IS_DOCUMENT 在重定向之前导致严重的 UI 挂起。我也把请求取消方法调用。现在看起来像这样:

bookmarksResolver: {
    onStateChange: function(aWebProgress, aRequest, aStateFlags, aStatus) {
        var nsIWebProgressListener = Components.interfaces.nsIWebProgressListener;
        if (aStateFlags & nsIWebProgressListener.STATE_TRANSFERRING
                    && aStateFlags & nsIWebProgressListener.STATE_IS_REQUEST) {
            try {
                var location = aWebProgress.DOMWindow.location.href;
                var resolvedLocation = resolveReferences(location);
                if (resolvedLocation != location) {
                    aRequest.cancel(Components.results.NS_BINDING_REDIRECTED);
                    aWebProgress.DOMWindow.location.href = resolvedLocation;
                    logger.info('Old URL: [' + location + ']');
                    logger.info('Redirected to: [' + resolvedLocation + ']');
                }
            }
            catch(ex) {
                    //Logging error
            }
        }
    },

    /* Stubs for other listeners */
    onLocationChange: function(a, b, c, d) {},
    onProgressChange: function(a, b, c, d, e, f) {},
    onStatusChange: function(a, b, c, d) {},
    onSecurityChange: function(a, b, c) {},

    QueryInterface: function (aIID) {
        if (aIID.equals(Components.interfaces.nsIWebProgressListener) ||
                aIID.equals(Components.interfaces.nsIWebProgressListener2) ||
                aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
                aIID.equals(Components.interfaces.nsISupports)) {
            return this;
        }
        else {
            throw Components.results.NS_NOINTERFACE;
        }
    }
},

除 RSS 页面外,一切正常。旧位置和“重定向到”的日志条目显示标记已被替换且新 URL 正确。但是它们会一遍又一遍地重新加载,因为实际的 URL(我从 aWebProgress.DOMWindow.location.href 获得)由于某种原因没有改变,并且一次又一次地执行替换。加载 RSS URL 有什么不同,如何解决?

最佳答案

Q1:我更喜欢onStateChange

Q2:也许 aRequest.cancel(Components.results.NS_BINDING_REDIRECTED) 会和平地结束原始请求。

关于firefox-addon - nsIWebProgressListener - 重定向到另一个 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13137929/

相关文章:

firefox - 使用附加 SDK 开发 Firefox 扩展有哪些优点/缺点?

javascript - Firefox 附加 pageshow 事件在工作人员能够接收消息之前触发

firefox-addon - 如何使 Firefox 扩展中的代码在计时器上执行

firefox - 禁用带有插件或扩展名的单个 javascript 文件

javascript - 检测 Firefox 扩展版本

javascript - 哪个更快,XPath 还是 Regexp?

javascript - 查找事件的位置(鼠标悬停在按钮上),用于 Firefox 扩展

javascript - 使用 Firefox Add-on SDK 定位面板

javascript - 是否有用于禁用/启用 Firefox 扩展的 API?

javascript - 让 Pagemod 和 Page-worker 模块一起工作?