diff --git a/lighthouse-core/report/html/renderer/report-renderer.js b/lighthouse-core/report/html/renderer/report-renderer.js
index 813ae20243e8..928dc4742245 100644
--- a/lighthouse-core/report/html/renderer/report-renderer.js
+++ b/lighthouse-core/report/html/renderer/report-renderer.js
@@ -242,17 +242,6 @@ class ReportRenderer {
wrapper.appendChild(renderer.render(category, report.categoryGroups));
}
- // Fireworks
- const scoresAll100 = report.reportCategories.every(cat => cat.score === 1);
- if (!this._dom.isDevTools() && scoresAll100) {
- const scoresContainer = this._dom.find('.lh-scores-container', headerContainer);
- scoresContainer.classList.add('score100');
- this._dom._document.body.classList.add('dark');
- scoresContainer.addEventListener('click', _ => {
- scoresContainer.classList.toggle('fireworks-paused');
- });
- }
-
if (scoreHeader) {
const scoreGauges =
this._renderScoreGauges(report, categoryRenderer, specificCategoryRenderers);
diff --git a/lighthouse-core/report/html/renderer/report-ui-features.js b/lighthouse-core/report/html/renderer/report-ui-features.js
index e0733f3b5fea..2cd777ec9cff 100644
--- a/lighthouse-core/report/html/renderer/report-ui-features.js
+++ b/lighthouse-core/report/html/renderer/report-ui-features.js
@@ -89,7 +89,27 @@ class ReportUIFeatures {
this._document.addEventListener('keyup', this.onKeyUp);
this._document.addEventListener('copy', this.onCopy);
const topbarLogo = this._dom.find('.lh-topbar__logo', this._document);
- topbarLogo.addEventListener('click', this._toggleDarkTheme);
+ topbarLogo.addEventListener('click', () => this._toggleDarkTheme());
+
+ let turnOffTheLights = false;
+ if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
+ turnOffTheLights = true;
+ }
+
+ // Fireworks.
+ const scoresAll100 = Object.values(report.categories).every(cat => cat.score === 1);
+ if (!this._dom.isDevTools() && scoresAll100) {
+ turnOffTheLights = true;
+ const scoresContainer = this._dom.find('.lh-scores-container', this._document);
+ scoresContainer.classList.add('score100');
+ scoresContainer.addEventListener('click', _ => {
+ scoresContainer.classList.toggle('fireworks-paused');
+ });
+ }
+
+ if (turnOffTheLights) {
+ this._toggleDarkTheme(true);
+ }
// There is only a sticky header when at least 2 categories are present.
if (Object.keys(this.json.categories).length >= 2) {
@@ -513,9 +533,10 @@ class ReportUIFeatures {
/**
* @private
+ * @param {boolean} [force]
*/
- _toggleDarkTheme() {
- this._document.body.classList.toggle('dark');
+ _toggleDarkTheme(force) {
+ this._document.body.classList.toggle('dark', force);
}
_updateStickyHeaderOnScroll() {
diff --git a/lighthouse-core/test/report/html/renderer/report-renderer-test.js b/lighthouse-core/test/report/html/renderer/report-renderer-test.js
index d6d8e6a987f5..243f81b431da 100644
--- a/lighthouse-core/test/report/html/renderer/report-renderer-test.js
+++ b/lighthouse-core/test/report/html/renderer/report-renderer-test.js
@@ -82,8 +82,6 @@ describe('ReportRenderer', () => {
// 3 sets of gauges - one in sticky header, one in scores header, and one in each section.
assert.equal(output.querySelectorAll('.lh-gauge__wrapper, .lh-gauge--pwa__wrapper').length,
sampleResults.reportCategories.length * 3, 'renders category gauges');
- // no fireworks
- assert.ok(output.querySelector('.score100') === null, 'has no fireworks treatment');
});
it('renders additional reports by replacing the existing one', () => {
@@ -214,23 +212,6 @@ describe('ReportRenderer', () => {
assert.equal(renderer._templateContext, otherDocument);
});
- it('should render an all 100 report with fireworks', () => {
- const container = renderer._dom._document.body;
-
- sampleResults.reportCategories.forEach(element => {
- element.score = 1;
- });
-
- const output = renderer.renderReport(sampleResults, container);
- // standard checks
- assert.ok(output.querySelector('.lh-header-sticky'), 'has a header');
- assert.ok(output.querySelector('.lh-report'), 'has report body');
- assert.equal(output.querySelectorAll('.lh-gauge__wrapper, .lh-gauge--pwa__wrapper').length,
- sampleResults.reportCategories.length * 3, 'renders category gauges');
- // fireworks!
- assert.ok(output.querySelector('.score100'), 'has fireworks treatment');
- });
-
it('should add LHR channel to doc link parameters', () => {
const lhrChannel = sampleResults.configSettings.channel;
// Make sure we have a channel in the LHR.
diff --git a/lighthouse-core/test/report/html/renderer/report-ui-features-test.js b/lighthouse-core/test/report/html/renderer/report-ui-features-test.js
index 4e83cd0cca93..54a3d7852ddc 100644
--- a/lighthouse-core/test/report/html/renderer/report-ui-features-test.js
+++ b/lighthouse-core/test/report/html/renderer/report-ui-features-test.js
@@ -171,4 +171,22 @@ describe('ReportUIFeatures', () => {
});
});
});
+
+ describe('fireworks', () => {
+ it('should render an non-all 100 report without fireworks', () => {
+ const lhr = JSON.parse(JSON.stringify(sampleResults));
+ lhr.categories.performance.score = 0.5;
+ const container = render(lhr);
+ assert.ok(container.querySelector('.score100') === null, 'has no fireworks treatment');
+ });
+
+ it('should render an all 100 report with fireworks', () => {
+ const lhr = JSON.parse(JSON.stringify(sampleResults));
+ Object.values(lhr.categories).forEach(element => {
+ element.score = 1;
+ });
+ const container = render(lhr);
+ assert.ok(container.querySelector('.score100'), 'has fireworks treatment');
+ });
+ });
});