[英]Firefox Extension: Access the DOM Before It's Loaded
我正在嘗試創建一個Firefox擴展,以在觸發任何當前頁面的Javascript之前觸發我的Javascript代碼。 我的Javascript代碼基本上將控制是否可以執行或拒絕頁面的Javascript代碼。
我首先嘗試遵循此答案 ,但是我真的無法弄清楚如何使其工作,並意識到我依靠的是onDOMContentLoaded
,它已在Javascript執行后加載。
然后,我將注意力轉向XPCOM,但又一次並沒有真正理解Firefox教程告訴我的內容。
我最近一直在嘗試通過Firebug進行擴展 ,但是我似乎遇到了同樣的問題……只有在解析/執行Java腳本后才能訪問Java腳本。 這是我編寫的結果代碼 。 我認為如果可以在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代碼? 另外,如果有人有任何有用的見解,我也希望聽到。 哦,如果你們都需要我提供更多代碼,請告訴我,我將其發布。
您可以在運行任何JavaScript代碼之前訪問新文檔,方法是偵聽content-document-global-created
觀察者通知 。 但是,此時文檔將為空,並且在解析器添加<script>
標記后,JavaScript代碼將立即運行-您無法真正阻止它。 這是我知道的控制腳本執行的選項。
1)使用nsIDocShell.allowJavascript
禁用窗口的所有JavaScript:
wnd.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsIWebNavigation)
.QueryInterface(Components.interfaces.nsIDocShell)
.allowJavascript = false;
這是一種全有或全無的方法。 請注意,即使新文檔加載到同一框架中,JavaScript也會保持禁用狀態。
2)在XPCOM組件中實現nsIContentPolicy
接口 ,並將其注冊在content-policy
類別中(通過nsICategoryManager
)。 您的shouldLoad()
函數將能夠有選擇地阻止腳本-但它只會調用外部腳本(即<script src="...">
),而不會調用頁面上的內聯腳本。
3)使用JavaScript調試器服務來攔截腳本執行。 您可以使用jsdIDebuggerService.interruptHook
逐步執行JavaScript,並在需要時中止腳本。 但這當然會大大降低JavaScript的執行速度。 至少應使用jsdIDebuggerService.addFilter()
將其限制為特定文檔,否則,將降低整個瀏覽器(包括瀏覽器UI)的速度。
我正在嘗試創建一個Firefox擴展,以在觸發任何當前頁面的Javascript之前觸發我的Javascript代碼。 我的Javascript代碼基本上將控制是否可以執行或拒絕頁面的Javascript代碼。
首先,完全防止文檔被完全解析,然后從側面開始,獲取相同的文檔,對該文檔進行任何處理,然后將生成的文檔注入頁面中。 這是我目前的工作方式https://stackoverflow.com/a/36097573/6085033
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.