1d0825bca7fe65beaee391d30da42e937db621564Steve Block/* 2d0825bca7fe65beaee391d30da42e937db621564Steve Block * Copyright (C) 2009 Google Inc. All rights reserved. 3d0825bca7fe65beaee391d30da42e937db621564Steve Block * 4d0825bca7fe65beaee391d30da42e937db621564Steve Block * Redistribution and use in source and binary forms, with or without 5d0825bca7fe65beaee391d30da42e937db621564Steve Block * modification, are permitted provided that the following conditions are 6d0825bca7fe65beaee391d30da42e937db621564Steve Block * met: 7d0825bca7fe65beaee391d30da42e937db621564Steve Block * 8d0825bca7fe65beaee391d30da42e937db621564Steve Block * * Redistributions of source code must retain the above copyright 9d0825bca7fe65beaee391d30da42e937db621564Steve Block * notice, this list of conditions and the following disclaimer. 10d0825bca7fe65beaee391d30da42e937db621564Steve Block * * Redistributions in binary form must reproduce the above 11d0825bca7fe65beaee391d30da42e937db621564Steve Block * copyright notice, this list of conditions and the following disclaimer 12d0825bca7fe65beaee391d30da42e937db621564Steve Block * in the documentation and/or other materials provided with the 13d0825bca7fe65beaee391d30da42e937db621564Steve Block * distribution. 14d0825bca7fe65beaee391d30da42e937db621564Steve Block * * Neither the name of Google Inc. nor the names of its 15d0825bca7fe65beaee391d30da42e937db621564Steve Block * contributors may be used to endorse or promote products derived from 16d0825bca7fe65beaee391d30da42e937db621564Steve Block * this software without specific prior written permission. 17d0825bca7fe65beaee391d30da42e937db621564Steve Block * 18d0825bca7fe65beaee391d30da42e937db621564Steve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19d0825bca7fe65beaee391d30da42e937db621564Steve Block * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20d0825bca7fe65beaee391d30da42e937db621564Steve Block * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21d0825bca7fe65beaee391d30da42e937db621564Steve Block * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22d0825bca7fe65beaee391d30da42e937db621564Steve Block * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23d0825bca7fe65beaee391d30da42e937db621564Steve Block * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24d0825bca7fe65beaee391d30da42e937db621564Steve Block * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25d0825bca7fe65beaee391d30da42e937db621564Steve Block * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26d0825bca7fe65beaee391d30da42e937db621564Steve Block * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27d0825bca7fe65beaee391d30da42e937db621564Steve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28d0825bca7fe65beaee391d30da42e937db621564Steve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29d0825bca7fe65beaee391d30da42e937db621564Steve Block */ 30d0825bca7fe65beaee391d30da42e937db621564Steve Block 31d0825bca7fe65beaee391d30da42e937db621564Steve BlockWebInspector.AuditLauncherView = function(categoriesById, runnerCallback) 32d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 33d0825bca7fe65beaee391d30da42e937db621564Steve Block WebInspector.View.call(this); 34d0825bca7fe65beaee391d30da42e937db621564Steve Block this._categoriesById = categoriesById; 35d0825bca7fe65beaee391d30da42e937db621564Steve Block this._runnerCallback = runnerCallback; 36d0825bca7fe65beaee391d30da42e937db621564Steve Block this._categoryIdPrefix = "audit-category-item-"; 37d0825bca7fe65beaee391d30da42e937db621564Steve Block this._auditRunning = false; 38d0825bca7fe65beaee391d30da42e937db621564Steve Block 39d0825bca7fe65beaee391d30da42e937db621564Steve Block this.element.addStyleClass("audit-launcher-view"); 40d0825bca7fe65beaee391d30da42e937db621564Steve Block 41d0825bca7fe65beaee391d30da42e937db621564Steve Block this._contentElement = document.createElement("div"); 42d0825bca7fe65beaee391d30da42e937db621564Steve Block this._contentElement.className = "audit-launcher-view-content"; 43d0825bca7fe65beaee391d30da42e937db621564Steve Block this.element.appendChild(this._contentElement); 44d0825bca7fe65beaee391d30da42e937db621564Steve Block 45d0825bca7fe65beaee391d30da42e937db621564Steve Block function categorySortFunction(a, b) 46d0825bca7fe65beaee391d30da42e937db621564Steve Block { 47d0825bca7fe65beaee391d30da42e937db621564Steve Block var aTitle = a.displayName || ""; 48d0825bca7fe65beaee391d30da42e937db621564Steve Block var bTitle = b.displayName || ""; 49d0825bca7fe65beaee391d30da42e937db621564Steve Block return aTitle.localeCompare(bTitle); 50d0825bca7fe65beaee391d30da42e937db621564Steve Block } 51d0825bca7fe65beaee391d30da42e937db621564Steve Block var sortedCategories = []; 52d0825bca7fe65beaee391d30da42e937db621564Steve Block for (var id in this._categoriesById) 53d0825bca7fe65beaee391d30da42e937db621564Steve Block sortedCategories.push(this._categoriesById[id]); 54d0825bca7fe65beaee391d30da42e937db621564Steve Block sortedCategories.sort(categorySortFunction); 55d0825bca7fe65beaee391d30da42e937db621564Steve Block 56d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!sortedCategories.length) { 57d0825bca7fe65beaee391d30da42e937db621564Steve Block this._headerElement = document.createElement("h1"); 58d0825bca7fe65beaee391d30da42e937db621564Steve Block this._headerElement.className = "no-audits"; 59d0825bca7fe65beaee391d30da42e937db621564Steve Block this._headerElement.textContent = WebInspector.UIString("No audits to run"); 60d0825bca7fe65beaee391d30da42e937db621564Steve Block this._contentElement.appendChild(this._headerElement); 61d0825bca7fe65beaee391d30da42e937db621564Steve Block } else 62d0825bca7fe65beaee391d30da42e937db621564Steve Block this._createLauncherUI(sortedCategories); 63d0825bca7fe65beaee391d30da42e937db621564Steve Block} 64d0825bca7fe65beaee391d30da42e937db621564Steve Block 65d0825bca7fe65beaee391d30da42e937db621564Steve BlockWebInspector.AuditLauncherView.prototype = { 668a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block updateResourceTrackingState: function(isTracking) 67d0825bca7fe65beaee391d30da42e937db621564Steve Block { 68d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!this._auditPresentStateLabelElement) 69d0825bca7fe65beaee391d30da42e937db621564Steve Block return; 708a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block if (isTracking) { 71d0825bca7fe65beaee391d30da42e937db621564Steve Block this._auditPresentStateLabelElement.nodeValue = WebInspector.UIString("Audit Present State"); 72d0825bca7fe65beaee391d30da42e937db621564Steve Block this._auditPresentStateElement.disabled = false; 73d0825bca7fe65beaee391d30da42e937db621564Steve Block this._auditPresentStateElement.parentElement.removeStyleClass("disabled"); 74d0825bca7fe65beaee391d30da42e937db621564Steve Block } else { 75d0825bca7fe65beaee391d30da42e937db621564Steve Block this._auditPresentStateLabelElement.nodeValue = WebInspector.UIString("Audit Present State (Resource Tracking must be enabled)"); 76d0825bca7fe65beaee391d30da42e937db621564Steve Block this._auditPresentStateElement.disabled = true; 77d0825bca7fe65beaee391d30da42e937db621564Steve Block this._auditPresentStateElement.parentElement.addStyleClass("disabled"); 78d0825bca7fe65beaee391d30da42e937db621564Steve Block this.auditReloadedStateElement.checked = true; 79d0825bca7fe65beaee391d30da42e937db621564Steve Block } 80d0825bca7fe65beaee391d30da42e937db621564Steve Block }, 81d0825bca7fe65beaee391d30da42e937db621564Steve Block 82d0825bca7fe65beaee391d30da42e937db621564Steve Block _setAuditRunning: function(auditRunning) 83d0825bca7fe65beaee391d30da42e937db621564Steve Block { 84d0825bca7fe65beaee391d30da42e937db621564Steve Block if (this._auditRunning === auditRunning) 85d0825bca7fe65beaee391d30da42e937db621564Steve Block return; 86d0825bca7fe65beaee391d30da42e937db621564Steve Block this._auditRunning = auditRunning; 87d0825bca7fe65beaee391d30da42e937db621564Steve Block this._updateButton(); 88d0825bca7fe65beaee391d30da42e937db621564Steve Block }, 89d0825bca7fe65beaee391d30da42e937db621564Steve Block 90d0825bca7fe65beaee391d30da42e937db621564Steve Block _launchButtonClicked: function(event) 91d0825bca7fe65beaee391d30da42e937db621564Steve Block { 92d0825bca7fe65beaee391d30da42e937db621564Steve Block var catIds = []; 93d0825bca7fe65beaee391d30da42e937db621564Steve Block var childNodes = this._categoriesElement.childNodes; 94d0825bca7fe65beaee391d30da42e937db621564Steve Block for (var id in this._categoriesById) { 95d0825bca7fe65beaee391d30da42e937db621564Steve Block if (this._categoriesById[id]._checkboxElement.checked) 96d0825bca7fe65beaee391d30da42e937db621564Steve Block catIds.push(id); 97d0825bca7fe65beaee391d30da42e937db621564Steve Block } 98d0825bca7fe65beaee391d30da42e937db621564Steve Block function profilingFinishedCallback() 99d0825bca7fe65beaee391d30da42e937db621564Steve Block { 100d0825bca7fe65beaee391d30da42e937db621564Steve Block this._setAuditRunning(false); 101d0825bca7fe65beaee391d30da42e937db621564Steve Block } 102d0825bca7fe65beaee391d30da42e937db621564Steve Block this._setAuditRunning(true); 103d0825bca7fe65beaee391d30da42e937db621564Steve Block this._runnerCallback(catIds, this._auditPresentStateElement.checked, profilingFinishedCallback.bind(this)); 104d0825bca7fe65beaee391d30da42e937db621564Steve Block }, 105d0825bca7fe65beaee391d30da42e937db621564Steve Block 106d0825bca7fe65beaee391d30da42e937db621564Steve Block _selectAllClicked: function(checkCategories) 107d0825bca7fe65beaee391d30da42e937db621564Steve Block { 108d0825bca7fe65beaee391d30da42e937db621564Steve Block var childNodes = this._categoriesElement.childNodes; 109d0825bca7fe65beaee391d30da42e937db621564Steve Block for (var i = 0, length = childNodes.length; i < length; ++i) 110d0825bca7fe65beaee391d30da42e937db621564Steve Block childNodes[i].firstChild.checked = checkCategories; 111d0825bca7fe65beaee391d30da42e937db621564Steve Block this._currentCategoriesCount = checkCategories ? this._totalCategoriesCount : 0; 112d0825bca7fe65beaee391d30da42e937db621564Steve Block this._updateButton(); 113d0825bca7fe65beaee391d30da42e937db621564Steve Block }, 114d0825bca7fe65beaee391d30da42e937db621564Steve Block 115d0825bca7fe65beaee391d30da42e937db621564Steve Block _categoryClicked: function(event) 116d0825bca7fe65beaee391d30da42e937db621564Steve Block { 117d0825bca7fe65beaee391d30da42e937db621564Steve Block this._currentCategoriesCount += event.target.checked ? 1 : -1; 118d0825bca7fe65beaee391d30da42e937db621564Steve Block this._selectAllCheckboxElement.checked = this._currentCategoriesCount === this._totalCategoriesCount; 119d0825bca7fe65beaee391d30da42e937db621564Steve Block this._updateButton(); 120d0825bca7fe65beaee391d30da42e937db621564Steve Block }, 121d0825bca7fe65beaee391d30da42e937db621564Steve Block 122d0825bca7fe65beaee391d30da42e937db621564Steve Block _createCategoryElement: function(title, id) 123d0825bca7fe65beaee391d30da42e937db621564Steve Block { 124d0825bca7fe65beaee391d30da42e937db621564Steve Block var element; 125d0825bca7fe65beaee391d30da42e937db621564Steve Block var labelElement = document.createElement("label"); 126d0825bca7fe65beaee391d30da42e937db621564Steve Block labelElement.id = this._categoryIdPrefix + id; 127d0825bca7fe65beaee391d30da42e937db621564Steve Block 128d0825bca7fe65beaee391d30da42e937db621564Steve Block element = document.createElement("input"); 129d0825bca7fe65beaee391d30da42e937db621564Steve Block element.type = "checkbox"; 130d0825bca7fe65beaee391d30da42e937db621564Steve Block labelElement.appendChild(element); 131d0825bca7fe65beaee391d30da42e937db621564Steve Block labelElement.appendChild(document.createTextNode(title)); 132d0825bca7fe65beaee391d30da42e937db621564Steve Block 133d0825bca7fe65beaee391d30da42e937db621564Steve Block return labelElement; 134d0825bca7fe65beaee391d30da42e937db621564Steve Block }, 135d0825bca7fe65beaee391d30da42e937db621564Steve Block 136d0825bca7fe65beaee391d30da42e937db621564Steve Block _createLauncherUI: function(sortedCategories) 137d0825bca7fe65beaee391d30da42e937db621564Steve Block { 138d0825bca7fe65beaee391d30da42e937db621564Steve Block this._headerElement = document.createElement("h1"); 139d0825bca7fe65beaee391d30da42e937db621564Steve Block this._headerElement.textContent = WebInspector.UIString("Select audits to run"); 140d0825bca7fe65beaee391d30da42e937db621564Steve Block this._contentElement.appendChild(this._headerElement); 141d0825bca7fe65beaee391d30da42e937db621564Steve Block 142d0825bca7fe65beaee391d30da42e937db621564Steve Block function handleSelectAllClick(event) 143d0825bca7fe65beaee391d30da42e937db621564Steve Block { 144d0825bca7fe65beaee391d30da42e937db621564Steve Block this._selectAllClicked(event.target.checked); 145d0825bca7fe65beaee391d30da42e937db621564Steve Block } 146d0825bca7fe65beaee391d30da42e937db621564Steve Block var categoryElement = this._createCategoryElement(WebInspector.UIString("Select All"), ""); 147d0825bca7fe65beaee391d30da42e937db621564Steve Block categoryElement.id = "audit-launcher-selectall"; 148d0825bca7fe65beaee391d30da42e937db621564Steve Block this._selectAllCheckboxElement = categoryElement.firstChild; 149d0825bca7fe65beaee391d30da42e937db621564Steve Block this._selectAllCheckboxElement.checked = true; 150d0825bca7fe65beaee391d30da42e937db621564Steve Block this._selectAllCheckboxElement.addEventListener("click", handleSelectAllClick.bind(this), false); 151d0825bca7fe65beaee391d30da42e937db621564Steve Block this._contentElement.appendChild(categoryElement); 152d0825bca7fe65beaee391d30da42e937db621564Steve Block 153d0825bca7fe65beaee391d30da42e937db621564Steve Block this._categoriesElement = document.createElement("div"); 154d0825bca7fe65beaee391d30da42e937db621564Steve Block this._categoriesElement.className = "audit-categories-container"; 155d0825bca7fe65beaee391d30da42e937db621564Steve Block this._contentElement.appendChild(this._categoriesElement); 156d0825bca7fe65beaee391d30da42e937db621564Steve Block 157d0825bca7fe65beaee391d30da42e937db621564Steve Block var boundCategoryClickListener = this._categoryClicked.bind(this); 158d0825bca7fe65beaee391d30da42e937db621564Steve Block 159d0825bca7fe65beaee391d30da42e937db621564Steve Block for (var i = 0; i < sortedCategories.length; ++i) { 160d0825bca7fe65beaee391d30da42e937db621564Steve Block categoryElement = this._createCategoryElement(sortedCategories[i].displayName, sortedCategories[i].id); 161d0825bca7fe65beaee391d30da42e937db621564Steve Block categoryElement.firstChild.addEventListener("click", boundCategoryClickListener, false); 162d0825bca7fe65beaee391d30da42e937db621564Steve Block sortedCategories[i]._checkboxElement = categoryElement.firstChild; 163d0825bca7fe65beaee391d30da42e937db621564Steve Block this._categoriesElement.appendChild(categoryElement); 164d0825bca7fe65beaee391d30da42e937db621564Steve Block } 165d0825bca7fe65beaee391d30da42e937db621564Steve Block 166d0825bca7fe65beaee391d30da42e937db621564Steve Block this._totalCategoriesCount = this._categoriesElement.childNodes.length; 167d0825bca7fe65beaee391d30da42e937db621564Steve Block this._currentCategoriesCount = 0; 168d0825bca7fe65beaee391d30da42e937db621564Steve Block 169d0825bca7fe65beaee391d30da42e937db621564Steve Block this._buttonContainerElement = document.createElement("div"); 170d0825bca7fe65beaee391d30da42e937db621564Steve Block this._buttonContainerElement.className = "button-container"; 171d0825bca7fe65beaee391d30da42e937db621564Steve Block 172d0825bca7fe65beaee391d30da42e937db621564Steve Block var labelElement = document.createElement("label"); 173d0825bca7fe65beaee391d30da42e937db621564Steve Block this._auditPresentStateElement = document.createElement("input"); 174d0825bca7fe65beaee391d30da42e937db621564Steve Block this._auditPresentStateElement.name = "audit-mode"; 175d0825bca7fe65beaee391d30da42e937db621564Steve Block this._auditPresentStateElement.type = "radio"; 176d0825bca7fe65beaee391d30da42e937db621564Steve Block this._auditPresentStateElement.checked = true; 177d0825bca7fe65beaee391d30da42e937db621564Steve Block this._auditPresentStateLabelElement = document.createTextNode(""); 178d0825bca7fe65beaee391d30da42e937db621564Steve Block labelElement.appendChild(this._auditPresentStateElement); 179d0825bca7fe65beaee391d30da42e937db621564Steve Block labelElement.appendChild(this._auditPresentStateLabelElement); 180d0825bca7fe65beaee391d30da42e937db621564Steve Block this._buttonContainerElement.appendChild(labelElement); 181d0825bca7fe65beaee391d30da42e937db621564Steve Block 182d0825bca7fe65beaee391d30da42e937db621564Steve Block labelElement = document.createElement("label"); 183d0825bca7fe65beaee391d30da42e937db621564Steve Block this.auditReloadedStateElement = document.createElement("input"); 184d0825bca7fe65beaee391d30da42e937db621564Steve Block this.auditReloadedStateElement.name = "audit-mode"; 185d0825bca7fe65beaee391d30da42e937db621564Steve Block this.auditReloadedStateElement.type = "radio"; 186d0825bca7fe65beaee391d30da42e937db621564Steve Block labelElement.appendChild(this.auditReloadedStateElement); 187d0825bca7fe65beaee391d30da42e937db621564Steve Block labelElement.appendChild(document.createTextNode("Reload Page and Audit on Load")); 188d0825bca7fe65beaee391d30da42e937db621564Steve Block this._buttonContainerElement.appendChild(labelElement); 189d0825bca7fe65beaee391d30da42e937db621564Steve Block 190d0825bca7fe65beaee391d30da42e937db621564Steve Block this._launchButton = document.createElement("button"); 191d0825bca7fe65beaee391d30da42e937db621564Steve Block this._launchButton.setAttribute("type", "button"); 192d0825bca7fe65beaee391d30da42e937db621564Steve Block this._launchButton.addEventListener("click", this._launchButtonClicked.bind(this), false); 193d0825bca7fe65beaee391d30da42e937db621564Steve Block this._buttonContainerElement.appendChild(this._launchButton); 194d0825bca7fe65beaee391d30da42e937db621564Steve Block 195d0825bca7fe65beaee391d30da42e937db621564Steve Block this._contentElement.appendChild(this._buttonContainerElement); 196d0825bca7fe65beaee391d30da42e937db621564Steve Block 197d0825bca7fe65beaee391d30da42e937db621564Steve Block this._selectAllClicked(this._selectAllCheckboxElement.checked); 198d0825bca7fe65beaee391d30da42e937db621564Steve Block this.updateResourceTrackingState(); 199d0825bca7fe65beaee391d30da42e937db621564Steve Block this._updateButton(); 200d0825bca7fe65beaee391d30da42e937db621564Steve Block }, 201d0825bca7fe65beaee391d30da42e937db621564Steve Block 202d0825bca7fe65beaee391d30da42e937db621564Steve Block _updateButton: function() 203d0825bca7fe65beaee391d30da42e937db621564Steve Block { 204d0825bca7fe65beaee391d30da42e937db621564Steve Block this._launchButton.disabled = !this._currentCategoriesCount || this._auditRunning; 205d0825bca7fe65beaee391d30da42e937db621564Steve Block if (this._auditRunning) 206d0825bca7fe65beaee391d30da42e937db621564Steve Block this._launchButton.textContent = WebInspector.UIString("Running..."); 207d0825bca7fe65beaee391d30da42e937db621564Steve Block else 208d0825bca7fe65beaee391d30da42e937db621564Steve Block this._launchButton.textContent = WebInspector.UIString("Run"); 209d0825bca7fe65beaee391d30da42e937db621564Steve Block }, 210d0825bca7fe65beaee391d30da42e937db621564Steve Block 2118a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block show: function(parentElement) 2128a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block { 2138a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block WebInspector.View.prototype.show.call(this, parentElement); 2148a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block setTimeout(this.resize(), 0); 2158a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block }, 2168a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 217d0825bca7fe65beaee391d30da42e937db621564Steve Block resize: function() 218d0825bca7fe65beaee391d30da42e937db621564Steve Block { 219d0825bca7fe65beaee391d30da42e937db621564Steve Block if (this._categoriesElement) 220d0825bca7fe65beaee391d30da42e937db621564Steve Block this._categoriesElement.style.height = (this._buttonContainerElement.totalOffsetTop - this._categoriesElement.totalOffsetTop) + "px"; 221d0825bca7fe65beaee391d30da42e937db621564Steve Block } 222d0825bca7fe65beaee391d30da42e937db621564Steve Block} 223d0825bca7fe65beaee391d30da42e937db621564Steve Block 224d0825bca7fe65beaee391d30da42e937db621564Steve BlockWebInspector.AuditLauncherView.prototype.__proto__ = WebInspector.View.prototype; 225