Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(583)

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/audits2/Audits2Panel.js

Issue 2856653002: Roll Lighthouse & add error reporting (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2016 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 /** 5 /**
6 * @unrestricted 6 * @unrestricted
7 */ 7 */
8 Audits2.Audits2Panel = class extends UI.Panel { 8 Audits2.Audits2Panel = class extends UI.Panel {
9 constructor() { 9 constructor() {
10 super('audits2'); 10 super('audits2');
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 54
55 this._statusView = this._createStatusView(uiElement); 55 this._statusView = this._createStatusView(uiElement);
56 } 56 }
57 57
58 /** 58 /**
59 * @param {!Element} launcherUIElement 59 * @param {!Element} launcherUIElement
60 * @return {!Element} 60 * @return {!Element}
61 */ 61 */
62 _createStatusView(launcherUIElement) { 62 _createStatusView(launcherUIElement) {
63 var statusView = launcherUIElement.createChild('div', 'audits2-status hbox h idden'); 63 var statusView = launcherUIElement.createChild('div', 'audits2-status hbox h idden');
64 statusView.createChild('span', 'icon'); 64 this._statusIcon = statusView.createChild('span', 'icon');
65 this._statusElement = createElement('p'); 65 this._statusElement = statusView.createChild('p');
66 statusView.appendChild(this._statusElement);
67 this._updateStatus(Common.UIString('Loading...')); 66 this._updateStatus(Common.UIString('Loading...'));
68 return statusView; 67 return statusView;
69 } 68 }
70 69
71 _start() { 70 _start() {
72 this._inspectedURL = SDK.targetManager.mainTarget().inspectedURL(); 71 this._inspectedURL = SDK.targetManager.mainTarget().inspectedURL();
73 72
74 const categoryIDs = this._settings.map(setting => { 73 const categoryIDs = this._settings.map(setting => {
75 const preset = Audits2.Audits2Panel.Presets.find(preset => preset.id === s etting.name); 74 const preset = Audits2.Audits2Panel.Presets.find(preset => preset.id === s etting.name);
76 return {configID: preset.configID, value: setting.get()}; 75 return {configID: preset.configID, value: setting.get()};
77 }).filter(agg => !!agg.value).map(agg => agg.configID); 76 }).filter(agg => !!agg.value).map(agg => agg.configID);
78 77
79 return Promise.resolve() 78 return Promise.resolve()
80 .then(_ => this._protocolService.attach()) 79 .then(_ => this._protocolService.attach())
81 .then(_ => { 80 .then(_ => {
82 this._auditRunning = true; 81 this._auditRunning = true;
83 this._updateButton(); 82 this._updateButton();
84 this._updateStatus(Common.UIString('Loading...')); 83 this._updateStatus(Common.UIString('Loading...'));
85 }) 84 })
86 .then(_ => this._protocolService.startLighthouse(this._inspectedURL, cat egoryIDs)) 85 .then(_ => this._protocolService.startLighthouse(this._inspectedURL, cat egoryIDs))
87 .then(lighthouseResult => { 86 .then(lighthouseResult => {
88 this._finish(lighthouseResult); 87 this._finish(lighthouseResult);
89 return this._stop(); 88 return this._stop();
89 }).catch(err => {
90 if (err instanceof Error) this._renderBugReport(err);
90 }); 91 });
91 } 92 }
92 93
93 /** 94 /**
94 * @param {!Event} event 95 * @param {!Event} event
95 */ 96 */
96 _startButtonClicked(event) { 97 _startButtonClicked(event) {
97 if (this._auditRunning) { 98 if (this._auditRunning) {
98 this._updateStatus(Common.UIString('Cancelling...')); 99 this._updateStatus(Common.UIString('Cancelling...'));
99 this._stop(); 100 this._stop();
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 this._resultsView.removeChildren(); 142 this._resultsView.removeChildren();
142 143
143 var url = lighthouseResult.url; 144 var url = lighthouseResult.url;
144 var timestamp = lighthouseResult.generatedTime; 145 var timestamp = lighthouseResult.generatedTime;
145 this._createResultsBar(this._resultsView, url, timestamp); 146 this._createResultsBar(this._resultsView, url, timestamp);
146 this._renderReport(this._resultsView, lighthouseResult); 147 this._renderReport(this._resultsView, lighthouseResult);
147 this.contentElement.classList.add('show-results'); 148 this.contentElement.classList.add('show-results');
148 } 149 }
149 150
150 /** 151 /**
152 * @param {!Error} err
153 */
154 _renderBugReport(err) {
155 console.error(err);
156 this._statusElement.textContent = '';
157 this._statusIcon.classList.add('error');
158 this._statusElement.createTextChild(Common.UIString('We ran into an error. ' ));
159 this._createBugReportLink(err, this._statusElement);
160 }
161
162 /**
163 * @param {!Error} err
164 * @param {!Element} parentElem
165 */
166 _createBugReportLink(err, parentElem) {
167 var baseURI = 'https://github.com/GoogleChrome/lighthouse/issues/new?';
168 var title = encodeURI('title=DevTools Error: ' + err.message.substring(0, 60 ));
169
170 var qsBody = '';
171 qsBody += '**Error Message**: ' + err.message + '\n';
172 qsBody += '**Stack Trace**:\n ```' + err.stack + '```';
173 var body = '&body=' + encodeURI(qsBody);
174
175 var reportErrorEl = parentElem.createChild('a', 'audits2-link audits2-report -error');
176 reportErrorEl.href = baseURI + title + body;
177 reportErrorEl.textContent = Common.UIString('Report this bug');
178 reportErrorEl.target = '_blank';
179 }
180
181 /**
151 * @param {!Element} resultsView 182 * @param {!Element} resultsView
152 * @param {!ReportRenderer.ReportJSON} lighthouseResult 183 * @param {!ReportRenderer.ReportJSON} lighthouseResult
153 * @suppressGlobalPropertiesCheck 184 * @suppressGlobalPropertiesCheck
154 */ 185 */
155 _renderReport(resultsView, lighthouseResult) { 186 _renderReport(resultsView, lighthouseResult) {
156 var reportContainer = resultsView.createChild('div', 'report-container'); 187 var reportContainer = resultsView.createChild('div', 'report-container lh-ro ot');
157 188
158 var dom = new DOM(document); 189 var dom = new DOM(document);
159 var detailsRenderer = new DetailsRenderer(dom); 190 var detailsRenderer = new DetailsRenderer(dom);
160 var renderer = new ReportRenderer(dom, detailsRenderer); 191 var categoryRenderer = new CategoryRenderer(dom, detailsRenderer);
192 var renderer = new Audits2.ReportRenderer(dom, categoryRenderer);
161 193
162 var templatesHTML = Runtime.cachedResources['audits2/lighthouse/templates.ht ml']; 194 var templatesHTML = Runtime.cachedResources['audits2/lighthouse/templates.ht ml'];
163 var templatesDOM = new DOMParser().parseFromString(templatesHTML, 'text/html '); 195 var templatesDOM = new DOMParser().parseFromString(templatesHTML, 'text/html ');
164 if (!templatesDOM) 196 if (!templatesDOM)
165 return; 197 return;
166 198
167 renderer.setTemplateContext(templatesDOM); 199 renderer.setTemplateContext(templatesDOM);
168 reportContainer.appendChild(renderer.renderReport(lighthouseResult)); 200 renderer.renderReport(lighthouseResult, reportContainer);
169 } 201 }
170 202
171 /** 203 /**
172 * @param {!Element} resultsView 204 * @param {!Element} resultsView
173 * @param {string} url 205 * @param {string} url
174 * @param {string} timestamp 206 * @param {string} timestamp
175 */ 207 */
176 _createResultsBar(resultsView, url, timestamp) { 208 _createResultsBar(resultsView, url, timestamp) {
177 var elem = resultsView.createChild('div', 'results-bar hbox'); 209 var elem = resultsView.createChild('div', 'results-bar hbox');
178 elem.createChild('div', 'audits2-logo audits2-logo-small'); 210 elem.createChild('div', 'audits2-logo audits2-logo-small');
179 211
180 var summaryElem = elem.createChild('div', 'audits2-summary'); 212 var summaryElem = elem.createChild('div', 'audits2-summary');
181 var reportFor = summaryElem.createChild('span'); 213 var reportFor = summaryElem.createChild('span');
182 reportFor.createTextChild('Report for '); 214 reportFor.createTextChild('Report for ');
183 var urlElem = reportFor.createChild('b'); 215 var urlElem = reportFor.createChild('b');
184 urlElem.textContent = url; 216 urlElem.textContent = url;
185 var timeElem = summaryElem.createChild('span'); 217 var timeElem = summaryElem.createChild('span');
186 timeElem.textContent = 218 timeElem.textContent =
187 `Generated at ${new Date(timestamp).toLocaleDateString()} ${new Date(tim estamp).toLocaleTimeString()}`; 219 `Generated at ${new Date(timestamp).toLocaleDateString()} ${new Date(tim estamp).toLocaleTimeString()}`;
188 220
189 var newAuditButton = 221 var newAuditButton =
190 UI.createTextButton(Common.UIString('New Audit'), this._reset.bind(this) , 'new-audit audit-btn'); 222 UI.createTextButton(Common.UIString('New Audit'), this._reset.bind(this) , 'new-audit audit-btn');
191 elem.appendChild(newAuditButton); 223 elem.appendChild(newAuditButton);
192 } 224 }
193 }; 225 };
194 226
227 /**
228 * @override
229 */
230 Audits2.ReportRenderer = class extends ReportRenderer {
231 /**
232 * Provides empty element for left nav
233 * @override
234 * @returns {!DocumentFragment}
235 */
236 _renderReportNav() {
237 return createDocumentFragment();
238 }
239 };
240
241
242 class ReportUIFeatures {
243 /**
244 * @param {!ReportRenderer.ReportJSON} report
245 */
246 initFeatures(report) {}
247 }
248
195 /** @typedef {{id: string, configID: string, description: string}} */ 249 /** @typedef {{id: string, configID: string, description: string}} */
196 Audits2.Audits2Panel.Preset; 250 Audits2.Audits2Panel.Preset;
197 251
198 /** @type {!Array.<!Audits2.Audits2Panel.Preset>} */ 252 /** @type {!Array.<!Audits2.Audits2Panel.Preset>} */
199 Audits2.Audits2Panel.Presets = [ 253 Audits2.Audits2Panel.Presets = [
200 // configID maps to Lighthouse's Object.keys(config.categories)[0] value 254 // configID maps to Lighthouse's Object.keys(config.categories)[0] value
201 {id: 'audits2_cat_pwa', configID: 'pwa', description: 'Progressive Web App'}, 255 {id: 'audits2_cat_pwa', configID: 'pwa', description: 'Progressive Web App'},
202 {id: 'audits2_cat_perf', configID: 'performance', description: 'Performance me trics and diagnostics'}, 256 {id: 'audits2_cat_perf', configID: 'performance', description: 'Performance me trics and diagnostics'},
203 {id: 'audits2_cat_a11y', configID: 'accessibility', description: 'Accessibilit y'}, 257 {id: 'audits2_cat_a11y', configID: 'accessibility', description: 'Accessibilit y'},
204 {id: 'audits2_cat_best_practices', configID: 'best-practices', description: 'M odern best practices'}, 258 {id: 'audits2_cat_best_practices', configID: 'best-practices', description: 'M odern best practices'},
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
276 * @param {!Object=} params 330 * @param {!Object=} params
277 * @return {!Promise<!ReportRenderer.ReportJSON>} 331 * @return {!Promise<!ReportRenderer.ReportJSON>}
278 */ 332 */
279 _send(method, params) { 333 _send(method, params) {
280 if (!this._backendPromise) 334 if (!this._backendPromise)
281 this._initWorker(); 335 this._initWorker();
282 336
283 return this._backendPromise.then(_ => this._backend.send(method, params)); 337 return this._backendPromise.then(_ => this._backend.send(method, params));
284 } 338 }
285 }; 339 };
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/devtools/BUILD.gn ('k') | third_party/WebKit/Source/devtools/front_end/audits2/audits2Panel.css » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698