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