URL Hook
有时需要在Firefox加载URL之前hook住URL,对URL做些check,比如判定URL是否为phishing site,是否需要block等~~~
var myListener = { QueryInterface: function(iid) { if (iid.equals(Components.interfaces.nsIURIContentListener) || iid.equals(Components.interfaces.nsISupportsWeakReference) || iid.equals(Components.interfaces.nsISupports)) return this; throw Components.results.NS_NOINTERFACE; }, onStartURIOpen: function(aUri) { // do here some processing of aUri and based on this: // return false; -> to let the URL go, // return true; -> to stop loading this url // getBrowser().mCurrentTab.linkedBrowser.loadURI("http://redirect.com"); return true; -> to redirect return false; }, doContent: function(aContentType, aIsContentPreferred, aRequest, aContentHandler ) { throw Components.results.NS_ERROR_NOT_IMPLEMENTED; }, canHandleContent: function(aContentType, aIsContentPreferred, aDesiredContentType) { throw Components.results.NS_ERROR_NOT_IMPLEMENTED; }, isPreferred: function(aContentType, aDesiredContentType) { try { var webNavInfo = Components.classes["@mozilla.org/webnavigation-info;1"] .getService(Components.interfaces.nsIWebNavigationInfo); return webNavInfo.isTypeSupported(aContentType, null); } catch (e) { return false; } }, GetWeakReference : function() { throw Components.results.NS_ERROR_NOT_IMPLEMENTED; } } // Setting up the content listener var wnd = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor) .getInterface(Components.interfaces.nsIWebNavigation) .QueryInterface(Components.interfaces.nsIDocShell) .QueryInterface(Components.interfaces.nsIInterfaceRequestor) .getInterface(Components.interfaces.nsIURIContentListener); wnd.parentContentListener = myListener;
可以在onStartURIOpen里对URL进行check。
技术细节参考:https://developer.mozilla.org/en/Document_Loading_-_From_Load_Start_to_Finding_a_Handler
Page Hook
有时需要在页面加载完成后hook,以对页面进行一些处理,比如提取出所有的URL并检查是否为phishing site,等等。
try { if (document.getElementById("appcontent")) document.getElementById("appcontent").addEventListener("DOMContentLoaded", onPageLoad, false); else document.getElementById("browser_content").addEventListener("DOMContentLoaded", onPageLoad, false); } catch (e) { } onPageLoad = function(aEvent) { var doc = aEvent.originalTarget; if(doc.nodeName != "#document") return; // Don't handle chrome pages if(doc.location.protocol == "chrome:") return; // parse DOM tree var filter = function(node) { return NodeFilter.FILTER_ACCEPT; }; var tw = document.createTreeWalker(doc.documentElement, NodeFilter.SHOW_TEXT, filter, false); var node; while((node = tw.nextNode())) { // check node } };
参考:https://developer.mozilla.org/en/Code_snippets/On_page_load
另一个相关的是页面unload时的hook,这个更简单点:
// add hook for page unload window.addEventListener("pagehide", onPageUnload, false); onPageUnload = function(aEvent) { if (aEvent.originalTarget instanceof HTMLDocument) { var doc = aEvent.originalTarget; //alert("page unloaded:" + doc.location.href); } }
没有评论:
发表评论