OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
11 * copyright notice, this list of conditions and the following disclaimer | 11 * copyright notice, this list of conditions and the following disclaimer |
12 * in the documentation and/or other materials provided with the | 12 * in the documentation and/or other materials provided with the |
13 * distribution. | 13 * distribution. |
14 * * Neither the name of Google Inc. nor the names of its | 14 * * Neither the name of Google Inc. nor the names of its |
15 * contributors may be used to endorse or promote products derived from | 15 * contributors may be used to endorse or promote products derived from |
16 * this software without specific prior written permission. | 16 * this software without specific prior written permission. |
17 * | 17 * |
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
29 */ | 29 */ |
30 | |
31 /** | 30 /** |
32 * @constructor | 31 * @unrestricted |
33 * @param {!WebInspector.AuditController} auditController | |
34 * @extends {WebInspector.VBox} | |
35 */ | 32 */ |
36 WebInspector.AuditLauncherView = function(auditController) | 33 WebInspector.AuditLauncherView = class extends WebInspector.VBox { |
37 { | 34 /** |
38 WebInspector.VBox.call(this); | 35 * @param {!WebInspector.AuditController} auditController |
| 36 */ |
| 37 constructor(auditController) { |
| 38 super(); |
39 this.setMinimumSize(100, 25); | 39 this.setMinimumSize(100, 25); |
40 | 40 |
41 this._auditController = auditController; | 41 this._auditController = auditController; |
42 | 42 |
43 this._categoryIdPrefix = "audit-category-item-"; | 43 this._categoryIdPrefix = 'audit-category-item-'; |
44 this._auditRunning = false; | 44 this._auditRunning = false; |
45 | 45 |
46 this.element.classList.add("audit-launcher-view"); | 46 this.element.classList.add('audit-launcher-view'); |
47 this.element.classList.add("panel-enabler-view"); | 47 this.element.classList.add('panel-enabler-view'); |
48 | 48 |
49 this._contentElement = createElement("div"); | 49 this._contentElement = createElement('div'); |
50 this._contentElement.className = "audit-launcher-view-content"; | 50 this._contentElement.className = 'audit-launcher-view-content'; |
51 this.element.appendChild(this._contentElement); | 51 this.element.appendChild(this._contentElement); |
52 this._boundCategoryClickListener = this._categoryClicked.bind(this); | 52 this._boundCategoryClickListener = this._categoryClicked.bind(this); |
53 | 53 |
54 this._resetResourceCount(); | 54 this._resetResourceCount(); |
55 | 55 |
56 this._sortedCategories = []; | 56 this._sortedCategories = []; |
57 | 57 |
58 this._headerElement = createElement("h1"); | 58 this._headerElement = createElement('h1'); |
59 this._headerElement.className = "no-audits"; | 59 this._headerElement.className = 'no-audits'; |
60 this._headerElement.textContent = WebInspector.UIString("No audits to run"); | 60 this._headerElement.textContent = WebInspector.UIString('No audits to run'); |
61 this._contentElement.appendChild(this._headerElement); | 61 this._contentElement.appendChild(this._headerElement); |
62 | 62 |
63 WebInspector.targetManager.addModelListener(WebInspector.NetworkManager, Web
Inspector.NetworkManager.Events.RequestStarted, this._onRequestStarted, this); | 63 WebInspector.targetManager.addModelListener( |
64 WebInspector.targetManager.addModelListener(WebInspector.NetworkManager, Web
Inspector.NetworkManager.Events.RequestFinished, this._onRequestFinished, this); | 64 WebInspector.NetworkManager, WebInspector.NetworkManager.Events.RequestS
tarted, this._onRequestStarted, this); |
| 65 WebInspector.targetManager.addModelListener( |
| 66 WebInspector.NetworkManager, WebInspector.NetworkManager.Events.RequestF
inished, this._onRequestFinished, this); |
65 | 67 |
66 var defaultSelectedAuditCategory = {}; | 68 var defaultSelectedAuditCategory = {}; |
67 defaultSelectedAuditCategory[WebInspector.AuditLauncherView.AllCategoriesKey
] = true; | 69 defaultSelectedAuditCategory[WebInspector.AuditLauncherView.AllCategoriesKey
] = true; |
68 this._selectedCategoriesSetting = WebInspector.settings.createSetting("selec
tedAuditCategories", defaultSelectedAuditCategory); | 70 this._selectedCategoriesSetting = |
| 71 WebInspector.settings.createSetting('selectedAuditCategories', defaultSe
lectedAuditCategory); |
| 72 } |
| 73 |
| 74 _resetResourceCount() { |
| 75 this._loadedResources = 0; |
| 76 this._totalResources = 0; |
| 77 } |
| 78 |
| 79 _onRequestStarted(event) { |
| 80 var request = /** @type {!WebInspector.NetworkRequest} */ (event.data); |
| 81 // Ignore long-living WebSockets for the sake of progress indicator, as we w
on't be waiting them anyway. |
| 82 if (request.resourceType() === WebInspector.resourceTypes.WebSocket) |
| 83 return; |
| 84 ++this._totalResources; |
| 85 this._updateResourceProgress(); |
| 86 } |
| 87 |
| 88 _onRequestFinished(event) { |
| 89 var request = /** @type {!WebInspector.NetworkRequest} */ (event.data); |
| 90 // See resorceStarted for details. |
| 91 if (request.resourceType() === WebInspector.resourceTypes.WebSocket) |
| 92 return; |
| 93 ++this._loadedResources; |
| 94 this._updateResourceProgress(); |
| 95 } |
| 96 |
| 97 /** |
| 98 * @param {!WebInspector.AuditCategory} category |
| 99 */ |
| 100 addCategory(category) { |
| 101 if (!this._sortedCategories.length) |
| 102 this._createLauncherUI(); |
| 103 |
| 104 var selectedCategories = this._selectedCategoriesSetting.get(); |
| 105 var categoryElement = this._createCategoryElement(category.displayName, cate
gory.id); |
| 106 category._checkboxElement = categoryElement.checkboxElement; |
| 107 if (this._selectAllCheckboxElement.checked || selectedCategories[category.di
splayName]) { |
| 108 category._checkboxElement.checked = true; |
| 109 ++this._currentCategoriesCount; |
| 110 } |
| 111 |
| 112 /** |
| 113 * @param {!WebInspector.AuditCategory} a |
| 114 * @param {!WebInspector.AuditCategory} b |
| 115 * @return {number} |
| 116 */ |
| 117 function compareCategories(a, b) { |
| 118 var aTitle = a.displayName || ''; |
| 119 var bTitle = b.displayName || ''; |
| 120 return aTitle.localeCompare(bTitle); |
| 121 } |
| 122 var insertBefore = this._sortedCategories.lowerBound(category, compareCatego
ries); |
| 123 this._categoriesElement.insertBefore(categoryElement, this._categoriesElemen
t.children[insertBefore]); |
| 124 this._sortedCategories.splice(insertBefore, 0, category); |
| 125 this._selectedCategoriesUpdated(); |
| 126 } |
| 127 |
| 128 _startAudit() { |
| 129 this._auditRunning = true; |
| 130 this._updateButton(); |
| 131 this._toggleUIComponents(this._auditRunning); |
| 132 |
| 133 var catIds = []; |
| 134 for (var category = 0; category < this._sortedCategories.length; ++category)
{ |
| 135 if (this._sortedCategories[category]._checkboxElement.checked) |
| 136 catIds.push(this._sortedCategories[category].id); |
| 137 } |
| 138 |
| 139 this._resetResourceCount(); |
| 140 this._progressIndicator = new WebInspector.ProgressIndicator(); |
| 141 this._buttonContainerElement.appendChild(this._progressIndicator.element); |
| 142 this._displayResourceLoadingProgress = true; |
| 143 |
| 144 /** |
| 145 * @this {WebInspector.AuditLauncherView} |
| 146 */ |
| 147 function onAuditStarted() { |
| 148 this._displayResourceLoadingProgress = false; |
| 149 } |
| 150 this._auditController.initiateAudit( |
| 151 catIds, new WebInspector.ProgressProxy(this._progressIndicator, this._au
ditsDone.bind(this)), |
| 152 this._auditPresentStateElement.checked, onAuditStarted.bind(this)); |
| 153 } |
| 154 |
| 155 _auditsDone() { |
| 156 this._displayResourceLoadingProgress = false; |
| 157 delete this._progressIndicator; |
| 158 this._launchButton.disabled = false; |
| 159 this._auditRunning = false; |
| 160 this._updateButton(); |
| 161 this._toggleUIComponents(this._auditRunning); |
| 162 } |
| 163 |
| 164 /** |
| 165 * @param {boolean} disable |
| 166 */ |
| 167 _toggleUIComponents(disable) { |
| 168 this._selectAllCheckboxElement.disabled = disable; |
| 169 for (var child = this._categoriesElement.firstChild; child; child = child.ne
xtSibling) |
| 170 child.checkboxElement.disabled = disable; |
| 171 this._auditPresentStateElement.disabled = disable; |
| 172 this._auditReloadedStateElement.disabled = disable; |
| 173 } |
| 174 |
| 175 _launchButtonClicked(event) { |
| 176 if (this._auditRunning) { |
| 177 this._launchButton.disabled = true; |
| 178 this._progressIndicator.cancel(); |
| 179 return; |
| 180 } |
| 181 this._startAudit(); |
| 182 } |
| 183 |
| 184 _clearButtonClicked() { |
| 185 this._auditController.clearResults(); |
| 186 } |
| 187 |
| 188 /** |
| 189 * @param {boolean} checkCategories |
| 190 * @param {boolean=} userGesture |
| 191 */ |
| 192 _selectAllClicked(checkCategories, userGesture) { |
| 193 var childNodes = this._categoriesElement.childNodes; |
| 194 for (var i = 0, length = childNodes.length; i < length; ++i) |
| 195 childNodes[i].checkboxElement.checked = checkCategories; |
| 196 this._currentCategoriesCount = checkCategories ? this._sortedCategories.leng
th : 0; |
| 197 this._selectedCategoriesUpdated(userGesture); |
| 198 } |
| 199 |
| 200 _categoryClicked(event) { |
| 201 this._currentCategoriesCount += event.target.checked ? 1 : -1; |
| 202 this._selectAllCheckboxElement.checked = this._currentCategoriesCount === th
is._sortedCategories.length; |
| 203 this._selectedCategoriesUpdated(true); |
| 204 } |
| 205 |
| 206 /** |
| 207 * @param {string} title |
| 208 * @param {string=} id |
| 209 */ |
| 210 _createCategoryElement(title, id) { |
| 211 var labelElement = createCheckboxLabel(title); |
| 212 if (id) { |
| 213 labelElement.id = this._categoryIdPrefix + id; |
| 214 labelElement.checkboxElement.addEventListener('click', this._boundCategory
ClickListener, false); |
| 215 } |
| 216 labelElement.__displayName = title; |
| 217 |
| 218 return labelElement; |
| 219 } |
| 220 |
| 221 _createLauncherUI() { |
| 222 this._headerElement = createElement('h1'); |
| 223 this._headerElement.textContent = WebInspector.UIString('Select audits to ru
n'); |
| 224 |
| 225 this._contentElement.removeChildren(); |
| 226 this._contentElement.appendChild(this._headerElement); |
| 227 |
| 228 /** |
| 229 * @param {!Event} event |
| 230 * @this {WebInspector.AuditLauncherView} |
| 231 */ |
| 232 function handleSelectAllClick(event) { |
| 233 this._selectAllClicked(event.target.checked, true); |
| 234 } |
| 235 var categoryElement = this._createCategoryElement(WebInspector.UIString('Sel
ect All'), ''); |
| 236 categoryElement.id = 'audit-launcher-selectall'; |
| 237 this._selectAllCheckboxElement = categoryElement.checkboxElement; |
| 238 this._selectAllCheckboxElement.checked = |
| 239 this._selectedCategoriesSetting.get()[WebInspector.AuditLauncherView.All
CategoriesKey]; |
| 240 this._selectAllCheckboxElement.addEventListener('click', handleSelectAllClic
k.bind(this), false); |
| 241 this._contentElement.appendChild(categoryElement); |
| 242 |
| 243 this._categoriesElement = this._contentElement.createChild('fieldset', 'audi
t-categories-container'); |
| 244 this._currentCategoriesCount = 0; |
| 245 |
| 246 this._contentElement.createChild('div', 'flexible-space'); |
| 247 |
| 248 this._buttonContainerElement = this._contentElement.createChild('div', 'butt
on-container'); |
| 249 |
| 250 var radio = createRadioLabel('audit-mode', WebInspector.UIString('Audit Pres
ent State'), true); |
| 251 this._buttonContainerElement.appendChild(radio); |
| 252 this._auditPresentStateElement = radio.radioElement; |
| 253 |
| 254 radio = createRadioLabel('audit-mode', WebInspector.UIString('Reload Page an
d Audit on Load')); |
| 255 this._buttonContainerElement.appendChild(radio); |
| 256 this._auditReloadedStateElement = radio.radioElement; |
| 257 |
| 258 this._launchButton = createTextButton(WebInspector.UIString('Run'), this._la
unchButtonClicked.bind(this)); |
| 259 this._buttonContainerElement.appendChild(this._launchButton); |
| 260 |
| 261 this._clearButton = createTextButton(WebInspector.UIString('Clear'), this._c
learButtonClicked.bind(this)); |
| 262 this._buttonContainerElement.appendChild(this._clearButton); |
| 263 |
| 264 this._selectAllClicked(this._selectAllCheckboxElement.checked); |
| 265 } |
| 266 |
| 267 _updateResourceProgress() { |
| 268 if (this._displayResourceLoadingProgress) |
| 269 this._progressIndicator.setTitle( |
| 270 WebInspector.UIString('Loading (%d of %d)', this._loadedResources, thi
s._totalResources)); |
| 271 } |
| 272 |
| 273 /** |
| 274 * @param {boolean=} userGesture |
| 275 */ |
| 276 _selectedCategoriesUpdated(userGesture) { |
| 277 // Save present categories only upon user gesture to clean up junk from past
versions and removed extensions. |
| 278 // Do not remove old categories if not handling a user gesture, as there's c
hance categories will be added |
| 279 // later during start-up. |
| 280 var selectedCategories = userGesture ? {} : this._selectedCategoriesSetting.
get(); |
| 281 var childNodes = this._categoriesElement.childNodes; |
| 282 for (var i = 0, length = childNodes.length; i < length; ++i) |
| 283 selectedCategories[childNodes[i].__displayName] = childNodes[i].checkboxEl
ement.checked; |
| 284 selectedCategories[WebInspector.AuditLauncherView.AllCategoriesKey] = this._
selectAllCheckboxElement.checked; |
| 285 this._selectedCategoriesSetting.set(selectedCategories); |
| 286 this._updateButton(); |
| 287 } |
| 288 |
| 289 _updateButton() { |
| 290 this._launchButton.textContent = this._auditRunning ? WebInspector.UIString(
'Stop') : WebInspector.UIString('Run'); |
| 291 this._launchButton.disabled = !this._currentCategoriesCount; |
| 292 } |
69 }; | 293 }; |
70 | 294 |
71 WebInspector.AuditLauncherView.AllCategoriesKey = "__AllCategories"; | 295 WebInspector.AuditLauncherView.AllCategoriesKey = '__AllCategories'; |
72 | |
73 WebInspector.AuditLauncherView.prototype = { | |
74 _resetResourceCount: function() | |
75 { | |
76 this._loadedResources = 0; | |
77 this._totalResources = 0; | |
78 }, | |
79 | |
80 _onRequestStarted: function(event) | |
81 { | |
82 var request = /** @type {!WebInspector.NetworkRequest} */ (event.data); | |
83 // Ignore long-living WebSockets for the sake of progress indicator, as
we won't be waiting them anyway. | |
84 if (request.resourceType() === WebInspector.resourceTypes.WebSocket) | |
85 return; | |
86 ++this._totalResources; | |
87 this._updateResourceProgress(); | |
88 }, | |
89 | |
90 _onRequestFinished: function(event) | |
91 { | |
92 var request = /** @type {!WebInspector.NetworkRequest} */ (event.data); | |
93 // See resorceStarted for details. | |
94 if (request.resourceType() === WebInspector.resourceTypes.WebSocket) | |
95 return; | |
96 ++this._loadedResources; | |
97 this._updateResourceProgress(); | |
98 }, | |
99 | |
100 /** | |
101 * @param {!WebInspector.AuditCategory} category | |
102 */ | |
103 addCategory: function(category) | |
104 { | |
105 if (!this._sortedCategories.length) | |
106 this._createLauncherUI(); | |
107 | |
108 var selectedCategories = this._selectedCategoriesSetting.get(); | |
109 var categoryElement = this._createCategoryElement(category.displayName,
category.id); | |
110 category._checkboxElement = categoryElement.checkboxElement; | |
111 if (this._selectAllCheckboxElement.checked || selectedCategories[categor
y.displayName]) { | |
112 category._checkboxElement.checked = true; | |
113 ++this._currentCategoriesCount; | |
114 } | |
115 | |
116 /** | |
117 * @param {!WebInspector.AuditCategory} a | |
118 * @param {!WebInspector.AuditCategory} b | |
119 * @return {number} | |
120 */ | |
121 function compareCategories(a, b) | |
122 { | |
123 var aTitle = a.displayName || ""; | |
124 var bTitle = b.displayName || ""; | |
125 return aTitle.localeCompare(bTitle); | |
126 } | |
127 var insertBefore = this._sortedCategories.lowerBound(category, compareCa
tegories); | |
128 this._categoriesElement.insertBefore(categoryElement, this._categoriesEl
ement.children[insertBefore]); | |
129 this._sortedCategories.splice(insertBefore, 0, category); | |
130 this._selectedCategoriesUpdated(); | |
131 }, | |
132 | |
133 _startAudit: function() | |
134 { | |
135 this._auditRunning = true; | |
136 this._updateButton(); | |
137 this._toggleUIComponents(this._auditRunning); | |
138 | |
139 var catIds = []; | |
140 for (var category = 0; category < this._sortedCategories.length; ++categ
ory) { | |
141 if (this._sortedCategories[category]._checkboxElement.checked) | |
142 catIds.push(this._sortedCategories[category].id); | |
143 } | |
144 | |
145 this._resetResourceCount(); | |
146 this._progressIndicator = new WebInspector.ProgressIndicator(); | |
147 this._buttonContainerElement.appendChild(this._progressIndicator.element
); | |
148 this._displayResourceLoadingProgress = true; | |
149 | |
150 /** | |
151 * @this {WebInspector.AuditLauncherView} | |
152 */ | |
153 function onAuditStarted() | |
154 { | |
155 this._displayResourceLoadingProgress = false; | |
156 } | |
157 this._auditController.initiateAudit(catIds, new WebInspector.ProgressPro
xy(this._progressIndicator, this._auditsDone.bind(this)), this._auditPresentStat
eElement.checked, onAuditStarted.bind(this)); | |
158 }, | |
159 | |
160 _auditsDone: function() | |
161 { | |
162 this._displayResourceLoadingProgress = false; | |
163 delete this._progressIndicator; | |
164 this._launchButton.disabled = false; | |
165 this._auditRunning = false; | |
166 this._updateButton(); | |
167 this._toggleUIComponents(this._auditRunning); | |
168 }, | |
169 | |
170 /** | |
171 * @param {boolean} disable | |
172 */ | |
173 _toggleUIComponents: function(disable) | |
174 { | |
175 this._selectAllCheckboxElement.disabled = disable; | |
176 for (var child = this._categoriesElement.firstChild; child; child = chil
d.nextSibling) | |
177 child.checkboxElement.disabled = disable; | |
178 this._auditPresentStateElement.disabled = disable; | |
179 this._auditReloadedStateElement.disabled = disable; | |
180 }, | |
181 | |
182 _launchButtonClicked: function(event) | |
183 { | |
184 if (this._auditRunning) { | |
185 this._launchButton.disabled = true; | |
186 this._progressIndicator.cancel(); | |
187 return; | |
188 } | |
189 this._startAudit(); | |
190 }, | |
191 | |
192 _clearButtonClicked: function() | |
193 { | |
194 this._auditController.clearResults(); | |
195 }, | |
196 | |
197 /** | |
198 * @param {boolean} checkCategories | |
199 * @param {boolean=} userGesture | |
200 */ | |
201 _selectAllClicked: function(checkCategories, userGesture) | |
202 { | |
203 var childNodes = this._categoriesElement.childNodes; | |
204 for (var i = 0, length = childNodes.length; i < length; ++i) | |
205 childNodes[i].checkboxElement.checked = checkCategories; | |
206 this._currentCategoriesCount = checkCategories ? this._sortedCategories.
length : 0; | |
207 this._selectedCategoriesUpdated(userGesture); | |
208 }, | |
209 | |
210 _categoryClicked: function(event) | |
211 { | |
212 this._currentCategoriesCount += event.target.checked ? 1 : -1; | |
213 this._selectAllCheckboxElement.checked = this._currentCategoriesCount ==
= this._sortedCategories.length; | |
214 this._selectedCategoriesUpdated(true); | |
215 }, | |
216 | |
217 /** | |
218 * @param {string} title | |
219 * @param {string=} id | |
220 */ | |
221 _createCategoryElement: function(title, id) | |
222 { | |
223 var labelElement = createCheckboxLabel(title); | |
224 if (id) { | |
225 labelElement.id = this._categoryIdPrefix + id; | |
226 labelElement.checkboxElement.addEventListener("click", this._boundCa
tegoryClickListener, false); | |
227 } | |
228 labelElement.__displayName = title; | |
229 | |
230 return labelElement; | |
231 }, | |
232 | |
233 _createLauncherUI: function() | |
234 { | |
235 this._headerElement = createElement("h1"); | |
236 this._headerElement.textContent = WebInspector.UIString("Select audits t
o run"); | |
237 | |
238 this._contentElement.removeChildren(); | |
239 this._contentElement.appendChild(this._headerElement); | |
240 | |
241 /** | |
242 * @param {!Event} event | |
243 * @this {WebInspector.AuditLauncherView} | |
244 */ | |
245 function handleSelectAllClick(event) | |
246 { | |
247 this._selectAllClicked(event.target.checked, true); | |
248 } | |
249 var categoryElement = this._createCategoryElement(WebInspector.UIString(
"Select All"), ""); | |
250 categoryElement.id = "audit-launcher-selectall"; | |
251 this._selectAllCheckboxElement = categoryElement.checkboxElement; | |
252 this._selectAllCheckboxElement.checked = this._selectedCategoriesSetting
.get()[WebInspector.AuditLauncherView.AllCategoriesKey]; | |
253 this._selectAllCheckboxElement.addEventListener("click", handleSelectAll
Click.bind(this), false); | |
254 this._contentElement.appendChild(categoryElement); | |
255 | |
256 this._categoriesElement = this._contentElement.createChild("fieldset", "
audit-categories-container"); | |
257 this._currentCategoriesCount = 0; | |
258 | |
259 this._contentElement.createChild("div", "flexible-space"); | |
260 | |
261 this._buttonContainerElement = this._contentElement.createChild("div", "
button-container"); | |
262 | |
263 var radio = createRadioLabel("audit-mode", WebInspector.UIString("Audit
Present State"), true); | |
264 this._buttonContainerElement.appendChild(radio); | |
265 this._auditPresentStateElement = radio.radioElement; | |
266 | |
267 radio = createRadioLabel("audit-mode", WebInspector.UIString("Reload Pag
e and Audit on Load")); | |
268 this._buttonContainerElement.appendChild(radio); | |
269 this._auditReloadedStateElement = radio.radioElement; | |
270 | |
271 this._launchButton = createTextButton(WebInspector.UIString("Run"), this
._launchButtonClicked.bind(this)); | |
272 this._buttonContainerElement.appendChild(this._launchButton); | |
273 | |
274 this._clearButton = createTextButton(WebInspector.UIString("Clear"), thi
s._clearButtonClicked.bind(this)); | |
275 this._buttonContainerElement.appendChild(this._clearButton); | |
276 | |
277 this._selectAllClicked(this._selectAllCheckboxElement.checked); | |
278 }, | |
279 | |
280 _updateResourceProgress: function() | |
281 { | |
282 if (this._displayResourceLoadingProgress) | |
283 this._progressIndicator.setTitle(WebInspector.UIString("Loading (%d
of %d)", this._loadedResources, this._totalResources)); | |
284 }, | |
285 | |
286 /** | |
287 * @param {boolean=} userGesture | |
288 */ | |
289 _selectedCategoriesUpdated: function(userGesture) | |
290 { | |
291 // Save present categories only upon user gesture to clean up junk from
past versions and removed extensions. | |
292 // Do not remove old categories if not handling a user gesture, as there
's chance categories will be added | |
293 // later during start-up. | |
294 var selectedCategories = userGesture ? {} : this._selectedCategoriesSett
ing.get(); | |
295 var childNodes = this._categoriesElement.childNodes; | |
296 for (var i = 0, length = childNodes.length; i < length; ++i) | |
297 selectedCategories[childNodes[i].__displayName] = childNodes[i].chec
kboxElement.checked; | |
298 selectedCategories[WebInspector.AuditLauncherView.AllCategoriesKey] = th
is._selectAllCheckboxElement.checked; | |
299 this._selectedCategoriesSetting.set(selectedCategories); | |
300 this._updateButton(); | |
301 }, | |
302 | |
303 _updateButton: function() | |
304 { | |
305 this._launchButton.textContent = this._auditRunning ? WebInspector.UIStr
ing("Stop") : WebInspector.UIString("Run"); | |
306 this._launchButton.disabled = !this._currentCategoriesCount; | |
307 }, | |
308 | |
309 __proto__: WebInspector.VBox.prototype | |
310 }; | |
OLD | NEW |