Index: third_party/WebKit/Source/devtools/front_end/audits2/lighthouse/renderer/category-renderer.js |
diff --git a/third_party/WebKit/Source/devtools/front_end/audits2/lighthouse/renderer/category-renderer.js b/third_party/WebKit/Source/devtools/front_end/audits2/lighthouse/renderer/category-renderer.js |
index fa662daf03ad9418f85002ea16c55b6e36e09d19..5310a9dccab09f3ecfc5bb40964e6c99ccb5b3d4 100644 |
--- a/third_party/WebKit/Source/devtools/front_end/audits2/lighthouse/renderer/category-renderer.js |
+++ b/third_party/WebKit/Source/devtools/front_end/audits2/lighthouse/renderer/category-renderer.js |
@@ -56,11 +56,15 @@ class CategoryRenderer { |
// Append audit details to header section so the entire audit is within a <details>. |
const header = /** @type {!HTMLDetailsElement} */ (this._dom.find('.lh-score__header', tmpl)); |
- header.open = audit.score < 100; // expand failed audits |
if (audit.result.details) { |
header.appendChild(this._detailsRenderer.render(audit.result.details)); |
} |
+ const scoreEl = this._dom.find('.lh-score', tmpl); |
+ if (audit.result.informative) { |
+ scoreEl.classList.add('lh-score--informative'); |
+ } |
+ |
return this._populateScore(tmpl, audit.score, scoringMode, title, description); |
} |
@@ -93,6 +97,11 @@ class CategoryRenderer { |
_renderCategoryScore(category) { |
const tmpl = this._dom.cloneTemplate('#tmpl-lh-category-score', this._templateContext); |
const score = Math.round(category.score); |
+ |
+ const gaugeContainerEl = this._dom.find('.lh-score__gauge', tmpl); |
+ const gaugeEl = this.renderScoreGauge(category); |
+ gaugeContainerEl.appendChild(gaugeEl); |
+ |
return this._populateScore(tmpl, score, 'numeric', category.name, category.description); |
} |
@@ -142,11 +151,25 @@ class CategoryRenderer { |
return tmpl; |
} |
+ /** |
+ * @param {!ReportRenderer.CategoryJSON} category |
+ * @param {!Object<string, !ReportRenderer.GroupJSON>} groups |
+ * @return {!Element} |
+ */ |
+ render(category, groups) { |
+ switch (category.id) { |
+ case 'accessibility': |
+ return this._renderAccessibilityCategory(category, groups); |
+ default: |
+ return this._renderDefaultCategory(category); |
+ } |
+ } |
+ |
/** |
* @param {!ReportRenderer.CategoryJSON} category |
* @return {!Element} |
*/ |
- render(category) { |
+ _renderDefaultCategory(category) { |
const element = this._dom.createElement('div', 'lh-category'); |
element.id = category.id; |
element.appendChild(this._renderCategoryScore(category)); |
@@ -174,6 +197,89 @@ class CategoryRenderer { |
element.appendChild(passedElem); |
return element; |
} |
+ |
+ /** |
+ * @param {!Array<!ReportRenderer.AuditJSON>} audits |
+ * @param {!ReportRenderer.GroupJSON} group |
+ * @return {!Element} |
+ */ |
+ _renderAuditGroup(audits, group) { |
+ const auditGroupElem = this._dom.createElement('details', |
+ 'lh-audit-group lh-expandable-details'); |
+ const auditGroupHeader = this._dom.createElement('div', |
+ 'lh-audit-group__header lh-expandable-details__header'); |
+ auditGroupHeader.textContent = group.title; |
+ |
+ const auditGroupDescription = this._dom.createElement('div', 'lh-audit-group__description'); |
+ auditGroupDescription.textContent = group.description; |
+ |
+ const auditGroupSummary = this._dom.createElement('summary', |
+ 'lh-audit-group__summary lh-expandable-details__summary'); |
+ const auditGroupArrow = this._dom.createElement('div', 'lh-toggle-arrow', { |
+ title: 'See audits', |
+ }); |
+ auditGroupSummary.appendChild(auditGroupHeader); |
+ auditGroupSummary.appendChild(auditGroupArrow); |
+ |
+ auditGroupElem.appendChild(auditGroupSummary); |
+ auditGroupElem.appendChild(auditGroupDescription); |
+ audits.forEach(audit => auditGroupElem.appendChild(this._renderAudit(audit))); |
+ return auditGroupElem; |
+ } |
+ |
+ /** |
+ * @param {!ReportRenderer.CategoryJSON} category |
+ * @param {!Object<string, !ReportRenderer.GroupJSON>} groupDefinitions |
+ * @return {!Element} |
+ */ |
+ _renderAccessibilityCategory(category, groupDefinitions) { |
+ const element = this._dom.createElement('div', 'lh-category'); |
+ element.id = category.id; |
+ element.appendChild(this._renderCategoryScore(category)); |
+ |
+ const auditsGroupedByGroup = /** @type {!Object<string, |
+ {passed: !Array<!ReportRenderer.AuditJSON>, |
+ failed: !Array<!ReportRenderer.AuditJSON>}>} */ ({}); |
+ category.audits.forEach(audit => { |
+ const groupId = audit.group; |
+ const groups = auditsGroupedByGroup[groupId] || {passed: [], failed: []}; |
+ |
+ if (audit.score === 100) { |
+ groups.passed.push(audit); |
+ } else { |
+ groups.failed.push(audit); |
+ } |
+ |
+ auditsGroupedByGroup[groupId] = groups; |
+ }); |
+ |
+ const passedElements = /** @type {!Array<!Element>} */ ([]); |
+ Object.keys(auditsGroupedByGroup).forEach(groupId => { |
+ const group = groupDefinitions[groupId]; |
+ const groups = auditsGroupedByGroup[groupId]; |
+ if (groups.failed.length) { |
+ const auditGroupElem = this._renderAuditGroup(groups.failed, group); |
+ auditGroupElem.open = true; |
+ element.appendChild(auditGroupElem); |
+ } |
+ |
+ if (groups.passed.length) { |
+ const auditGroupElem = this._renderAuditGroup(groups.passed, group); |
+ passedElements.push(auditGroupElem); |
+ } |
+ }); |
+ |
+ // don't create a passed section if there are no passed |
+ if (!passedElements.length) return element; |
+ |
+ const passedElem = this._dom.createElement('details', 'lh-passed-audits'); |
+ const passedSummary = this._dom.createElement('summary', 'lh-passed-audits-summary'); |
+ passedElem.appendChild(passedSummary); |
+ passedSummary.textContent = `View ${passedElements.length} passed items`; |
+ passedElements.forEach(elem => passedElem.appendChild(elem)); |
+ element.appendChild(passedElem); |
+ return element; |
+ } |
} |
if (typeof module !== 'undefined' && module.exports) { |