15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2009 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions in binary form must reproduce the above
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Events test - test the hooking and dispatch of events.
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// This is a fairly simple test for measuring event peformance.
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// We create a DOM structure (a set of nested divs) to test with.
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// The Hooking test measures the time to register onclick handlers for
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// each node in the structure.  This simulates conditions where applications
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// register event handlers on many nodes programatically.
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// The Dispatch test measures the time to dispatch events to each node
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// in the structure.  In this case, we register the event handler as part
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// of the HTML for the structure, and then simply simulate onclick events
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// to each node.
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Works in IE, FF, Safari, and Chrome.
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Events_counter = 0;
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function EventClickHandler() {
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Events_counter++;
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function EventsTest(rows, cols) {
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var me = this;
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.rows = rows;
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.cols = cols;
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.cell_count = 0; // Track the number of cells created in our dom tree.
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.proxies = [];
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.random_ids = [];
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Create a DOM structure and optionally register event handlers on each node.
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Create the structure by setting innerHTML so that the DOM nodes are not
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // pre-wrapped for JS access.
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.CreateTable = function(add_event_listeners) {
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var html_string = '<div>';
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < me.rows; i++)
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            html_string += me.CreateRow(i, me.cols, add_event_listeners);
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return html_string + '</div>';
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Returns an html string for a div with a row/column based id, with an optional onclick handler.
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.CreateCell = function(row_id, col_id, add_event_listeners) {
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var str =  '<div id="r' + row_id + 'c' + col_id + '"';
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (add_event_listeners)
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            str += ' onclick="EventClickHandler();"';
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        str += '>'+ me.cell_count++ + '</div>';
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return str;
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Returns an html string with an outer div containing |cols| inner divs,
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // optionally having an onclick handler.
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.CreateRow = function(row_id, cols, add_event_listeners) {
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var html_string = '<div id="r' + row_id + '">';
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < cols; i++)
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            html_string += me.CreateCell(row_id, i, add_event_listeners);
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return html_string + '</div>';
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Prepares for testing with elements that have no pre-defined onclick
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // handlers.
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.Setup = function() {
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        me.cell_count = 0;
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Events_counter = 0;
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var root_element = document.getElementById("benchmark_content");
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        root_element.innerHTML = me.CreateTable(false);
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return root_element;
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Similar to Setup, but with onclick handlers already defined in the html.
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.SetupWithListeners = function() {
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        me.cell_count = 0;
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Events_counter = 0;
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var root_element = document.getElementById("benchmark_content");
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        root_element.innerHTML = me.CreateTable(true);
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return root_element;
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Sets up for testing performance of removing event handlers.
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.SetupForTeardown = function() {
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        me.random_ids = [];
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        me.SetupWithListeners();
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var tmp = [];
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var row = 0; row < me.rows; row++) {
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            for (var col = 0; col < me.cols; col++)
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                tmp.push("r" + row + "c" + col);
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        while (tmp.length > 0) {
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var index = Math.floor(Math.random() * tmp.length);
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            me.random_ids.push(tmp.splice(index, 1));
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Tests the time it takes to go through and hook all elements in our dom.
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.HookTest = function() {
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var node_count = 0;
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var row_id = 0;
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        while(true) {
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var row = document.getElementById('r' + row_id);
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (row == undefined)
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var col_id = 0;
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            while(true) {
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var col = document.getElementById('r' + row_id + 'c' + col_id);
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (col == undefined)
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    break;
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (col.addEventListener)
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    col.addEventListener("click", EventClickHandler, false);
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                else if (col.attachEvent)
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    col.attachEvent("onclick", EventClickHandler); // To support IE
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                else
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    throw "FAILED TO ATTACH EVENTS";
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                col_id++;
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                node_count++;
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            row_id++;
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (node_count != me.rows * me.cols)
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            throw "ERROR - did not iterate all nodes";
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Tests the time it takes to go through and hook all elements in our dom.
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Creates new proxy object for each registration
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.HookTestProxy = function() {
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var node_count = 0;
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var row_id = 0;
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        while(true) {
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var row = document.getElementById('r' + row_id);
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (row == undefined)
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var col_id = 0;
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            while(true) {
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var col = document.getElementById('r' + row_id + 'c' + col_id);
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (col == undefined)
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    break;
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var proxy = function() {};
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                proxy.col = col;
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                me.proxies.push(proxy);
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (col.addEventListener)
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    col.addEventListener("click", proxy, false);
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                else if (col.attachEvent)
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    col.attachEvent("onclick", proxy); // To support IE
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                else
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    throw "FAILED TO ATTACH EVENTS";
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                col_id++;
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                node_count++;
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            row_id++;
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (node_count != me.rows * me.cols)
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            throw "ERROR - did not iterate all nodes";
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Tests firing the events for each element in our dom.
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.DispatchTest = function() {
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var node_count = 0;
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var row_id = 0;
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        while(true) {
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var row = document.getElementById('r' + row_id);
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (row == undefined)
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var col_id = 0;
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            while(true) {
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var col = document.getElementById('r' + row_id + 'c' + col_id);
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (col == undefined)
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  break;
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (document.createEvent) {
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    var event = document.createEvent("MouseEvents");
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    event.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    col.dispatchEvent(event);
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                } else if (col.fireEvent) {
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    var event = document.createEventObject();
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    col.fireEvent("onclick", event);
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                } else
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    throw "FAILED TO FIRE EVENTS";
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                col_id++;
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                node_count++;
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            row_id++;
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (Events_counter != me.rows * me.cols)
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            throw "ERROR - did not fire events on all nodes!" + Events_counter;
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Tests removing event handlers.
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.TeardownTest = function() {
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var node_count = 0;
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < me.random_ids.length; i++) {
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var col = document.getElementById(me.random_ids[i]);
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (col.removeEventListener)
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                col.removeEventListener("click", EventClickHandler, false);
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            else if (col.detachEvent)
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                col.detachEvent("onclick", EventClickHandler);
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            else
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                throw "FAILED TO FIRE EVENTS";
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            node_count++;
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (node_count != me.rows * me.cols)
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            throw "ERROR - did not remove listeners from all nodes! " + node_count;
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Removes event handlers and their associated proxy objects.
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.ProxyCleanup = function() {
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0, n = me.proxies.length; i < n; i++) {
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var proxy = me.proxies[i];
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var col = proxy.col;
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (col.removeEventListener)
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                col.removeEventListener("click", proxy, false);
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            else if (col.detachEvent)
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                col.detachEvent("onclick", proxy); // To support IE
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        me.proxies = [];
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var small_test = new EventsTest(100, 10);
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var large_test = new EventsTest(100, 50);
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var extra_large_test = new EventsTest(200, 20);
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var EventTest = new BenchmarkSuite('Events', [
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    new Benchmark("Event Hooking (1000 nodes)", small_test.HookTest, small_test.Setup),
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    new Benchmark("Event Dispatch (1000 nodes)", small_test.DispatchTest, small_test.SetupWithListeners),
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    new Benchmark("Event Hooking (5000 nodes)", large_test.HookTest, large_test.Setup),
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    new Benchmark("Event Hooking Proxy (4000 nodes)",
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        extra_large_test.HookTestProxy, extra_large_test.Setup, extra_large_test.ProxyCleanup),
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    new Benchmark("Event Dispatch (5000 nodes)", large_test.DispatchTest, large_test.SetupWithListeners),
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    new Benchmark("Event Teardown (5000 nodes)", large_test.TeardownTest, large_test.SetupForTeardown),
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    new Benchmark("Event Teardown (4000 nodes)", extra_large_test.TeardownTest, extra_large_test.SetupForTeardown)
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)]);
275