Home

Miscellaneous Page Stats

Source code for bookmarklet Miscellaneous Page Stats.



javascript:
(function(){
        function travTree(node, ifun)
    {
        var counter = 0;
        function ns(nxi, level)
        {
            var nx = nxi;
            while (nx)
            {
                ++counter;
                ifun(nx);
                ns(nx.firstChild, level + 1);
                nx = level > 0 ? nx.nextSibling : null;
            }
        }

        ns( node, 0 );
        return counter;
    }

    function countItems(a)
    {
        return a.length;
    }

    function hasAttribute(e, a)
    {
        return e.hasAttribute(a);
    }
    var rp = 0;

    function testEvents(n, events)
    {
        var ct = 0;
        for (var ii = 0; ii < events.length; ++ii) {
            ct += hasAttribute( n, "ON" + events[ii] ) ? 1 : 0;
        }
        return ct;
    }

    var hcRE = /\S+/;

    var link_count = 0;

    var script_href_count = 0;
    var dummy_href_count = 0;

    var scripts = [];
    var inline_script_count = 0;

    var refresh_count = 0;
    var font_count = 0;
    var layer_count = 0;
    var iframe_count = 0;

    var target_count = 0;

    var m_events = ["CLICK", "DBLCLICK", "MOUSEDOWN", "MOUSEUP",
        "MOUSEOVER", "MOUSEMOVE", "MOUSEOUT"];
    var m_event_count = 0;
    var k_events = ["KEYPRESS", "KEYDOWN", "KEYUP"];
    var k_event_count = 0;

    var f_events = ["CHANGE", "SELECT", "SUBMIT", "RESET"];
    var f_event_count = 0;

    var o_events = ["BLUR", "FOCUS"];
    var o_event_count = 0;

    function eN(n)
    {
        if (n.data != null && /\S+/m.test(n.data)) {
            if ( n.parentNode != null ) {
                switch (n.parentNode.tagName)
                {
                    case "SCRIPT":
                        ++inline_script_count;
                    break;
                }
            }
        }
        var tg = n.tagName;
        if (tg == null) {return;}

        if (n.attributes.length > 0) {
            m_event_count += testEvents(n, m_events);
            k_event_count += testEvents(n, k_events);
            f_event_count += testEvents(n, f_events);
            o_event_count += testEvents(n, o_events);
        }

        switch (tg)
        {
            case "SCRIPT":
                if (n.src && n.src.length > 0) {
                    scripts[n.src] = n.src;
                }
            break;

            case "META":
                refresh_count += (n.httpEquiv.toLowerCase() == "refresh" ? 1 : 0);
            break;

            case "FONT":
                ++font_count;
            break;

            case "LAYER":
                ++layer_count;
            break;

            case "A":
            {
                if ( n.href && n.href.length > 0 ) {
                    dummy_href_count += (/#$/i.test(n.href) ? 1 : 0);
                    script_href_count += (/^javascript:/i.test(n.href) ? 1 : 0);
                    target_count += (hasAttribute(n, "TARGET") ? 1 : 0);
                    ++link_count;
                }
            }
            break;

            case "IFRAME":
                ++iframe_count;
            break;
        }
    }

    var g_frame_count = 0;
    function eD(dt, f) {
        if (f != null) {
            ++g_frame_count;
            }

        var hd = dt.getElementsByTagName( "HEAD" )[0];
        travTree(hd, eN);

        var bod = dt.getElementsByTagName( "BODY" )[0];
        travTree(bod, eN);
    }


    // "dIr" == "documentIterator"
    function dIr(dt, f) {
        function ifsr( fs )
        {
            for (var i = 0; i < fs.length; ++i)
            {
                try {
                    dIr(fs[i].contentDocument, fs[i]); // recursive call
                }
                catch (e) {
                    alert(e || "Unspecified error");
                }
            }
        }

        if (dt == null) {return;}
        eD(dt, f);
        ifsr( dt.getElementsByTagName("FRAME") );
        ifsr( dt.getElementsByTagName("IFRAME") );
    }

    // iterate through all documents
    dIr(document, null);

    var ec = m_event_count + k_event_count + f_event_count + o_event_count;
    var st = "Frames: " + g_frame_count;
        if (iframe_count > 0) {
            st += ". | Iframes: " + iframe_count;
        }
        if (refresh_count > 0) {
            st += ". | Refresh: " + refresh_count;
        }
        if (layer_count > 0) {
            st += ". | Layer: " + layer_count;
        }

        st += ". | Links: " + link_count
        + " (script: " + script_href_count
        + ", #: " + dummy_href_count
        + "; target: " + target_count + ")"

        + ". | Events: " + ec;
        if ( ec > 0 ) {
            st += " (Mouse: " + m_event_count
            +     ", key: " + k_event_count
            +     ", form: " + f_event_count
            +     ", other: " + o_event_count + ")";
            }

        st += ". | Ext. scripts: " + countItems(scripts)
        + ", inline: " + inline_script_count

        + ". | FONT: " + font_count
        ;
    alert(st + ".");
}());