2012-02-21 59 views
3

基本上,我想讓Firefox服從「在網站嘗試重定向或重新加載頁面時警告我」用戶首選項。目前,這是真正開放的芝麻爲任何種類的門口作家等。我可以檢測並阻止Firefox擴展中的JavaScript驅動重定向嗎?

請在related superuser post找到這種不端行爲的詳細說明。

+0

您將無法區分「JavaScript驅動的重定向」與常規鏈接點擊 - 這意味着警告將過於頻繁。 – 2012-02-21 08:18:39

+0

@WladimirPalant,好吧,我希望比頻道觀察者提供的更好的控制,例如:位置設置器上的某種鉤子...順便說一句,感謝偉大的(est)擴展:-) – OnTheFly 2012-02-21 10:12:39

回答

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); 

你將不得不同樣攔截分配給其他window.location propertieshostpathname。這種方法的一大缺點是:只能有一個觀察者。如果頁面安裝了自己的監視器,或者只需調用wnd.unwatch("location"),則您的所有檢測都將消失。

如何在任何頁面JavaScript有機會運行之前到達窗口取決於您是使用附加SDK還是使用經典插件。如果您正在使用附加SDK,那麼您使用page-mod module並將contentScriptWhen參數設置爲start。在上面的代碼示例中,用unsafeWindow代替wnd(該窗口必須直接訪問,否則將不起作用)。

在一個經典的附加組件中,您註冊了一個content-document-global-created notification的觀察者。在這裏,你還可以直接訪問該窗口:

var wnd = XPCNativeWrapper.unwrap(subject); 

documentation on XPCNativeWrapper.unwrap()

1

「JavaScript驅動重定向」將通過使用window.location屬性完成。您只需在頁面加載後立即替換該屬性的setter函數。

以下是關於定義屬性的setter和getters的John Resig博客文章。 http://ejohn.org/blog/javascript-getters-and-setters/

我無法使用客戶端js覆蓋默認的window.location setter,但可以使用更多特權的擴展環境。

+0

'window.location'財產不能被有意操縱。特權代碼也無法做到,所以這是行不通的。 – 2012-02-23 12:17:46

+0

我並不完全感到驚訝。所以唯一可能的方法就是在運行之前處理所有的腳本,並用一個新的屬性替換'window.location'的實例,該屬性在設置時包含警告,然後調用'window.location'。一種黑客。 – pseudosavant 2012-02-23 17:21:56

相關問題