2012-04-18 68 views
2

我試圖創建一個Firefox擴展,在任何當前頁面的Javascript被觸發前觸發我的Javascript代碼。我的Javascript代碼基本上可以控制頁面的Javascript代碼是否可以執行或拒絕。Firefox擴展:在加載DOM之前訪問DOM

我剛開始嘗試遵循this answer,但我無法真正弄清楚如何讓它正常工作,並意識到我依賴於onDOMContentLoaded,它在Javascript已經執行後加載。

然後我將注意力轉向XPCOM,但又一次沒有真正理解Firefox教程告訴我什麼。

我最近試圖做一個extension through Firebug,但我似乎遇到了同樣的問題......只有在解析/執行後才能訪問Javascript。這是我寫的resulting code。我想,如果我能在onExamineResponse事件訪問文件的對象,我的問題可以解決,但我不知道該怎麼做......我說的是這個代碼:

BeepbopListener.prototype = { 
    onRequest: function(context, file) { 
     ... 
    }, 

    onExamineResponse: function(context, file) { 
     FBTrace.sysout("onexamineresponse " + file); // this returns something like 
     // '[xpconnect wrapped (nsISupports, nsIHttpChannel, nsIRequest, nsIUploadChannel, nsITraceableChannel, nsIHttpChannelInternal)]' 
     // but I don't know how to access those elements... 
     var pattern = /\.js$/; 
     if (pattern.test(file.href) && FBTrace.DBG_BEEPBOP) { 
      FBTrace.sysout("ONEXAMINE DOESN'T EVEN GET IN THIS IF SO YOU WON'T SEE THIS"); 
     } 
    }, 

    ... 
}; 

所以我問題是...是否有一個教程,告訴我如何在執行之前訪問頁面上的所有Javascript代碼?此外,如果任何人有任何有用的見解,我很樂意聽到它。哦,如果你們都需要更多的代碼,只需告訴我,我會發布它。

回答

2

通過監聽content-document-global-created observer notification,您可以在任何JavaScript代碼運行之前訪問新文檔。但是,此時文檔將爲空,並且只要解析器添加<script>標記,JavaScript代碼就會運行 - 您無法真正阻止它。以下是我知道的控制腳本執行的選項。

1)禁用所有的JavaScript使用nsIDocShell.allowJavascript窗口:

wnd.QueryInterface(Components.interfaces.nsIInterfaceRequestor) 
    .getInterface(Components.interfaces.nsIWebNavigation) 
    .QueryInterface(Components.interfaces.nsIDocShell) 
    .allowJavascript = false; 

這是一個全有或全無的方法。請注意,即使新文檔加載到同一個框架中,JavaScript仍然處於禁用狀態。

2)在XPCOM組件中實現nsIContentPolicy interface,並將其註冊到content-policy類別中(通過nsICategoryManager)。您的shouldLoad()函數將能夠選擇性地阻止腳本 - 但它只會調用外部腳本(意爲<script src="...">),而不是頁面上的內聯腳本。

3)使用JavaScript debugger service截取腳本執行。您可以使用jsdIDebuggerService.interruptHook來逐步執行JavaScript並隨時中止腳本。但是這當然會非常顯着地降低JavaScript的執行速度。至少您應該使用jsdIDebuggerService.addFilter()將其限制爲特定文檔,否則您將減慢整個瀏覽器(包括瀏覽器UI)的速度。

+0

嗯,不是我希望的答案,但仍然是一個堅實的答案。我現在正在嘗試的路線是製作一個代理服務器,而且這似乎是在做伎倆,但我真的希望有一個更簡單的方法來做到這一點。好吧。 – incutonez 2012-04-19 23:42:03

+0

@incutonez:好吧,如果你想攔截HTTP流量,[nsITraceableChannel](http://www.softwareishard.com/blog/firebug/nsitraceablechannel-intercept-http-traffic/)可能是一個更簡單的解決方案。但是,您應該瞭解[bug 653533](https://bugzilla.mozilla.org/show_bug.cgi?id=653533)。 – 2012-04-20 05:26:36

2

我正在嘗試創建一個Firefox擴展,在任何當前頁面的Javascript被觸發前觸發我的Javascript代碼。我的Javascript代碼基本上可以控制頁面的Javascript代碼是否可以執行或拒絕。

首先完全防止文檔被完全解析,然後取出相同的文檔,對該文檔進行任何處理,然後將生成的文檔注入頁面。這是我目前如何做到這一點https://stackoverflow.com/a/36097573/6085033

+0

雖然這個鏈接可能回答這個問題,但[在這裏包含答案的基本部分更好](http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-其他 - 真正的好答案/ 8259#8259),並提供參考鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。如果目標網站無法訪問或永久離線,請始終引用重要鏈接中最相關的部分。 – Makyen 2016-03-19 06:03:32