基本上,我想讓Firefox服從「在網站嘗試重定向或重新加載頁面時警告我」用戶首選項。目前,這是真正開放的芝麻爲任何種類的門口作家等。我可以檢測並阻止Firefox擴展中的JavaScript驅動重定向嗎?
請在related superuser post找到這種不端行爲的詳細說明。
基本上,我想讓Firefox服從「在網站嘗試重定向或重新加載頁面時警告我」用戶首選項。目前,這是真正開放的芝麻爲任何種類的門口作家等。我可以檢測並阻止Firefox擴展中的JavaScript驅動重定向嗎?
請在related superuser post找到這種不端行爲的詳細說明。
您可以使用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);
你將不得不同樣攔截分配給其他window.location
properties像host
或pathname
。這種方法的一大缺點是:只能有一個觀察者。如果頁面安裝了自己的監視器,或者只需調用wnd.unwatch("location")
,則您的所有檢測都將消失。
如何在任何頁面JavaScript有機會運行之前到達窗口取決於您是使用附加SDK還是使用經典插件。如果您正在使用附加SDK,那麼您使用page-mod
module並將contentScriptWhen
參數設置爲start
。在上面的代碼示例中,用unsafeWindow
代替wnd
(該窗口必須直接訪問,否則將不起作用)。
在一個經典的附加組件中,您註冊了一個content-document-global-created
notification的觀察者。在這裏,你還可以直接訪問該窗口:
var wnd = XPCNativeWrapper.unwrap(subject);
「JavaScript驅動重定向」將通過使用window.location
屬性完成。您只需在頁面加載後立即替換該屬性的setter
函數。
以下是關於定義屬性的setter和getters的John Resig博客文章。 http://ejohn.org/blog/javascript-getters-and-setters/
我無法使用客戶端js覆蓋默認的window.location
setter,但可以使用更多特權的擴展環境。
'window.location'財產不能被有意操縱。特權代碼也無法做到,所以這是行不通的。 – 2012-02-23 12:17:46
我並不完全感到驚訝。所以唯一可能的方法就是在運行之前處理所有的腳本,並用一個新的屬性替換'window.location'的實例,該屬性在設置時包含警告,然後調用'window.location'。一種黑客。 – pseudosavant 2012-02-23 17:21:56
您將無法區分「JavaScript驅動的重定向」與常規鏈接點擊 - 這意味着警告將過於頻繁。 – 2012-02-21 08:18:39
@WladimirPalant,好吧,我希望比頻道觀察者提供的更好的控制,例如:位置設置器上的某種鉤子...順便說一句,感謝偉大的(est)擴展:-) – OnTheFly 2012-02-21 10:12:39