我可以在Firefox扩展中检测并阻止JavaScript驱动的重定向吗?

时间:2012-02-21 05:38:07

标签: javascript firefox-addon

基本上,我想让Firefox服从“当网站尝试重定向或重新加载页面时警告我”用户偏好。目前,对于任何类型的门口作家来说,这都是非常开放的芝麻等。

请在related superuser post中找到有关此不当行为的详细说明。

2 个答案:

答案 0 :(得分:3)

您可以使用Object.watch()拦截某些属性的更改,例如window.location

function onLocationChange(id, oldval, newval)
{
  if (confirm("Do you want to navigate to " + newval + "?"))
    return newval;
  else
    return oldval;
}
wnd.watch("location", onLocationChange);
wnd.document.watch("location", onLocationChange);
wnd.location.watch("href", onLocationChange);

您必须同样拦截对hostpathname等其他window.location properties的分配。这种方法的最大缺点是:只能有一个观察者。如果页面安装了自己的观察程序或只是调用wnd.unwatch("location"),则所有检测都将消失。

如何在JavaScript有机会运行的任何页面之前进入窗口取决于您是使用附加SDK还是使用经典附加组件。如果您使用的是附加SDK,则使用page-mod module并将contentScriptWhen参数设置为start。在上面的代码示例中,您将wnd替换为unsafeWindow(必须直接访问该窗口,否则它将无效)。

在经典插件中,您注册了content-document-global-created notification的观察者。在这里,您还必须直接访问该窗口:

var wnd = XPCNativeWrapper.unwrap(subject);

请参阅documentation on XPCNativeWrapper.unwrap()

答案 1 :(得分:1)

使用window.location属性可以完成“JavaScript驱动的重定向”。您需要做的就是在页面加载后立即替换该属性的setter函数。

这是关于定义属性的setter和getter的John Resig博客文章。 http://ejohn.org/blog/javascript-getters-and-setters/

我无法使用客户端js覆盖默认的window.location setter,但是可以使用更具特权的扩展环境。