2011年11月6日星期日

Firefox Extension: Hook

 

Technorati 标签: ,,

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

没有评论:

发表评论

Test Ads
Hello World