Home

Frame Stats

Source code for bookmarklet Frame Stats.



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

    function hasAttribute(e, a)
    {
        return e.hasAttribute(a);
    }


    var noframes_count = 0;
    var iframe_count = 0;
    var frames = [];
    var unique_frames = [];
    var repeat_frames = [];
    var g_anon_count = 0;
    var g_frame_count = 0;
    var g_noscroll_count = 0;

    var frameset_count = 0;
    var frameset_doc_count = 0;
    function eD(dt, f) {
        if (f != null) {
            ++g_frame_count;
            g_noscroll_count += (f.scrolling.toLowerCase() == "no") ? 1 : 0;
            g_anon_count += hasAttribute(f, "NAME") ? 0 : 1;
            frames[f.src] = f.src;
            if (unique_frames[f.src] != f.src && repeat_frames[f.src] != f.src)
            {
                unique_frames[f.src] = f.src;
            }
            else
            {
                unique_frames[f.src] = null;
                repeat_frames[f.src] = f.src;
            }

        }
        var fsc = dt.getElementsByTagName("FRAMESET").length;
        if (fsc > 0) {
            frameset_count += fsc;
            ++frameset_doc_count;
        }
        noframes_count += dt.getElementsByTagName("NOFRAMES").length > 0 ? 1 : 0;
        iframe_count += dt.getElementsByTagName("IFRAME").length;
    }


    // "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 st = "Framesets: " + frameset_count;
    if (frameset_doc_count > 1)
    {
        st += " (in " + frameset_doc_count + " documents)";
    }
    if (g_frame_count > 0)
    {
        st += ". | Frames: " + g_frame_count
        +     " (unique: " + countItems(unique_frames)
        +     ", repeated: " + countItems(repeat_frames)
        +     ", anonymous: " + g_anon_count
        +     ", non-scrolling: " + g_noscroll_count  + ")"
        +     ". NOFRAMES: " + (noframes_count > 0 ? "yes" : "no");
    }
    if (iframe_count > 0)
    {
        st += ". | IFRAME: " + iframe_count;
    }
    alert(st + ".");
}());