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