diff --git a/core/test/fixtures/user-flows/reports/sample-flow-result.json b/core/test/fixtures/user-flows/reports/sample-flow-result.json index 928744bb9fca..7fa1b54128fc 100644 --- a/core/test/fixtures/user-flows/reports/sample-flow-result.json +++ b/core/test/fixtures/user-flows/reports/sample-flow-result.json @@ -7004,6 +7004,8 @@ "opportunitySavingsColumnLabel": "Estimated Savings", "passedAuditsGroupTitle": "Passed audits", "runtimeAnalysisWindow": "Initial page load", + "runtimeAnalysisWindowSnapshot": "Point-in-time snapshot", + "runtimeAnalysisWindowTimespan": "User interactions timespan", "runtimeCustom": "Custom throttling", "runtimeDesktopEmulation": "Emulated Desktop", "runtimeMobileEmulation": "Emulated Moto G Power", @@ -7015,8 +7017,8 @@ "runtimeSettingsNetworkThrottling": "Network throttling", "runtimeSettingsScreenEmulation": "Screen emulation", "runtimeSettingsUANetwork": "User agent (network)", - "runtimeSingleLoad": "Single page load", - "runtimeSingleLoadTooltip": "This data is taken from a single page load, as opposed to field data summarizing many sessions.", + "runtimeSingleLoad": "Single page session", + "runtimeSingleLoadTooltip": "This data is taken from a single page session, as opposed to field data summarizing many sessions.", "runtimeSlow4g": "Slow 4G throttling", "runtimeUnknown": "Unknown", "show": "Show", @@ -11842,6 +11844,8 @@ "opportunitySavingsColumnLabel": "Estimated Savings", "passedAuditsGroupTitle": "Passed audits", "runtimeAnalysisWindow": "Initial page load", + "runtimeAnalysisWindowSnapshot": "Point-in-time snapshot", + "runtimeAnalysisWindowTimespan": "User interactions timespan", "runtimeCustom": "Custom throttling", "runtimeDesktopEmulation": "Emulated Desktop", "runtimeMobileEmulation": "Emulated Moto G Power", @@ -11853,8 +11857,8 @@ "runtimeSettingsNetworkThrottling": "Network throttling", "runtimeSettingsScreenEmulation": "Screen emulation", "runtimeSettingsUANetwork": "User agent (network)", - "runtimeSingleLoad": "Single page load", - "runtimeSingleLoadTooltip": "This data is taken from a single page load, as opposed to field data summarizing many sessions.", + "runtimeSingleLoad": "Single page session", + "runtimeSingleLoadTooltip": "This data is taken from a single page session, as opposed to field data summarizing many sessions.", "runtimeSlow4g": "Slow 4G throttling", "runtimeUnknown": "Unknown", "show": "Show", @@ -16836,6 +16840,8 @@ "opportunitySavingsColumnLabel": "Estimated Savings", "passedAuditsGroupTitle": "Passed audits", "runtimeAnalysisWindow": "Initial page load", + "runtimeAnalysisWindowSnapshot": "Point-in-time snapshot", + "runtimeAnalysisWindowTimespan": "User interactions timespan", "runtimeCustom": "Custom throttling", "runtimeDesktopEmulation": "Emulated Desktop", "runtimeMobileEmulation": "Emulated Moto G Power", @@ -16847,8 +16853,8 @@ "runtimeSettingsNetworkThrottling": "Network throttling", "runtimeSettingsScreenEmulation": "Screen emulation", "runtimeSettingsUANetwork": "User agent (network)", - "runtimeSingleLoad": "Single page load", - "runtimeSingleLoadTooltip": "This data is taken from a single page load, as opposed to field data summarizing many sessions.", + "runtimeSingleLoad": "Single page session", + "runtimeSingleLoadTooltip": "This data is taken from a single page session, as opposed to field data summarizing many sessions.", "runtimeSlow4g": "Slow 4G throttling", "runtimeUnknown": "Unknown", "show": "Show", @@ -24605,6 +24611,8 @@ "opportunitySavingsColumnLabel": "Estimated Savings", "passedAuditsGroupTitle": "Passed audits", "runtimeAnalysisWindow": "Initial page load", + "runtimeAnalysisWindowSnapshot": "Point-in-time snapshot", + "runtimeAnalysisWindowTimespan": "User interactions timespan", "runtimeCustom": "Custom throttling", "runtimeDesktopEmulation": "Emulated Desktop", "runtimeMobileEmulation": "Emulated Moto G Power", @@ -24616,8 +24624,8 @@ "runtimeSettingsNetworkThrottling": "Network throttling", "runtimeSettingsScreenEmulation": "Screen emulation", "runtimeSettingsUANetwork": "User agent (network)", - "runtimeSingleLoad": "Single page load", - "runtimeSingleLoadTooltip": "This data is taken from a single page load, as opposed to field data summarizing many sessions.", + "runtimeSingleLoad": "Single page session", + "runtimeSingleLoadTooltip": "This data is taken from a single page session, as opposed to field data summarizing many sessions.", "runtimeSlow4g": "Slow 4G throttling", "runtimeUnknown": "Unknown", "show": "Show", diff --git a/core/test/results/sample_v2.json b/core/test/results/sample_v2.json index 83e5838a5f9d..ed08b43588a6 100644 --- a/core/test/results/sample_v2.json +++ b/core/test/results/sample_v2.json @@ -9286,6 +9286,8 @@ "opportunitySavingsColumnLabel": "Estimated Savings", "passedAuditsGroupTitle": "Passed audits", "runtimeAnalysisWindow": "Initial page load", + "runtimeAnalysisWindowSnapshot": "Point-in-time snapshot", + "runtimeAnalysisWindowTimespan": "User interactions timespan", "runtimeCustom": "Custom throttling", "runtimeDesktopEmulation": "Emulated Desktop", "runtimeMobileEmulation": "Emulated Moto G Power", @@ -9297,8 +9299,8 @@ "runtimeSettingsNetworkThrottling": "Network throttling", "runtimeSettingsScreenEmulation": "Screen emulation", "runtimeSettingsUANetwork": "User agent (network)", - "runtimeSingleLoad": "Single page load", - "runtimeSingleLoadTooltip": "This data is taken from a single page load, as opposed to field data summarizing many sessions.", + "runtimeSingleLoad": "Single page session", + "runtimeSingleLoadTooltip": "This data is taken from a single page session, as opposed to field data summarizing many sessions.", "runtimeSlow4g": "Slow 4G throttling", "runtimeUnknown": "Unknown", "show": "Show", diff --git a/proto/lighthouse-result.proto b/proto/lighthouse-result.proto index 183a88b02ce3..8126d66d6598 100644 --- a/proto/lighthouse-result.proto +++ b/proto/lighthouse-result.proto @@ -663,6 +663,11 @@ message I18n { // This label is for a button that will show the user a trace of the page. string dropdown_view_unthrottled_trace = 64; + // Descriptive label that this analysis considers some arbitrary period of time containing user interactions + string runtime_analysis_window_timespan = 65; + + // Descriptive label that this analysis considers a snapshot of the page at a single point in time + string runtime_analysis_window_snapshot = 66; } // The message holding all formatted strings used in the renderer. diff --git a/report/renderer/report-renderer.js b/report/renderer/report-renderer.js index 512218bacb9e..012ded363478 100644 --- a/report/renderer/report-renderer.js +++ b/report/renderer/report-renderer.js @@ -128,6 +128,13 @@ export class ReportRenderer { devicesTooltipTextLines.push(`${Globals.strings.runtimeSettingsAxeVersion}: ${axeVersion}`); } + let stopwatchLabel = Globals.strings.runtimeAnalysisWindow; + if (report.gatherMode === 'timespan') { + stopwatchLabel = Globals.strings.runtimeAnalysisWindowTimespan; + } else if (report.gatherMode === 'snapshot') { + stopwatchLabel = Globals.strings.runtimeAnalysisWindowSnapshot; + } + // [CSS icon class, textContent, tooltipText] const metaItems = [ ['date', @@ -139,7 +146,7 @@ export class ReportRenderer { Globals.strings.runtimeSingleLoad, Globals.strings.runtimeSingleLoadTooltip], ['stopwatch', - Globals.strings.runtimeAnalysisWindow], + stopwatchLabel], ['networkspeed', `${envValues.summary}`, `${Globals.strings.runtimeSettingsNetworkThrottling}: ${envValues.networkThrottling}`], diff --git a/report/renderer/report-utils.js b/report/renderer/report-utils.js index 7f3359ac12fc..bdf8d2cb70b1 100644 --- a/report/renderer/report-utils.js +++ b/report/renderer/report-utils.js @@ -444,12 +444,16 @@ const UIStrings = { runtimeDesktopEmulation: 'Emulated Desktop', /** Descriptive explanation for a runtime setting that is set to an unknown value. */ runtimeUnknown: 'Unknown', - /** Descriptive label that this analysis run was from a single pageload of a browser (not a summary of hundreds of loads) */ - runtimeSingleLoad: 'Single page load', + /** Descriptive label that this analysis run was from a single sample of a page session (not a summary of hundreds of loads) */ + runtimeSingleLoad: 'Single page session', /** Descriptive label that this analysis only considers the initial load of the page, and no interaction beyond when the page had "fully loaded" */ runtimeAnalysisWindow: 'Initial page load', - /** Descriptive explanation that this analysis run was from a single pageload of a browser, whereas field data often summarizes hundreds+ of page loads */ - runtimeSingleLoadTooltip: 'This data is taken from a single page load, as opposed to field data summarizing many sessions.', // eslint-disable-line max-len + /** Descriptive label that this analysis considers some arbitrary period of time containing user interactions */ + runtimeAnalysisWindowTimespan: 'User interactions timespan', + /** Descriptive label that this analysis considers a snapshot of the page at a single point in time */ + runtimeAnalysisWindowSnapshot: 'Point-in-time snapshot', + /** Descriptive explanation that this analysis run was from a single sample of a page session, whereas field data often summarizes hundreds+ of page loads */ + runtimeSingleLoadTooltip: 'This data is taken from a single page session, as opposed to field data summarizing many sessions.', // eslint-disable-line max-len /** Descriptive explanation for environment throttling that was provided by the runtime environment instead of provided by Lighthouse throttling. */ throttlingProvided: 'Provided by environment', diff --git a/report/test/renderer/report-renderer-test.js b/report/test/renderer/report-renderer-test.js index 5806fb1f25c7..a6db5a5126ee 100644 --- a/report/test/renderer/report-renderer-test.js +++ b/report/test/renderer/report-renderer-test.js @@ -41,6 +41,9 @@ describe('ReportRenderer', () => { const detailsRenderer = new DetailsRenderer(dom); const categoryRenderer = new CategoryRenderer(dom, detailsRenderer); renderer = new ReportRenderer(dom, categoryRenderer); + }); + + beforeEach(() => { sampleResults = ReportUtils.prepareReportResult(sampleResultsOrig); }); @@ -223,6 +226,47 @@ describe('ReportRenderer', () => { expect(itemsTxt).toMatch(/\dx/); expect(itemsTxt).toContain(sampleResults.environment.networkUserAgent); expect(itemsTxt).toMatch('412x823, DPR 1.75'); + expect(itemsTxt).toContain('Initial page load'); + }); + + it('renders a timespan footer', () => { + sampleResults.gatherMode = 'timespan'; + const footer = renderer._renderReportFooter(sampleResults); + const footerContent = footer.querySelector('.lh-footer').textContent; + assert.ok(/Generated by Lighthouse \d/.test(footerContent), 'includes lh version'); + assert.ok(footerContent.match(TIMESTAMP_REGEX), 'includes timestamp'); + + // Check env items were populated. + const items = Array.from(footer.querySelectorAll('.lh-meta__item')); + expect(items.length).toBeGreaterThanOrEqual(6); + + const itemsTxt = items.map(el => `${el.textContent} ${el.title}`).join('\n'); + expect(itemsTxt).toContain('Moto G Power'); + expect(itemsTxt).toContain('RTT'); + expect(itemsTxt).toMatch(/\dx/); + expect(itemsTxt).toContain(sampleResults.environment.networkUserAgent); + expect(itemsTxt).toMatch('412x823, DPR 1.75'); + expect(itemsTxt).toContain('User interactions timespan'); + }); + + it('renders a snapshot footer', () => { + sampleResults.gatherMode = 'snapshot'; + const footer = renderer._renderReportFooter(sampleResults); + const footerContent = footer.querySelector('.lh-footer').textContent; + assert.ok(/Generated by Lighthouse \d/.test(footerContent), 'includes lh version'); + assert.ok(footerContent.match(TIMESTAMP_REGEX), 'includes timestamp'); + + // Check env items were populated. + const items = Array.from(footer.querySelectorAll('.lh-meta__item')); + expect(items.length).toBeGreaterThanOrEqual(6); + + const itemsTxt = items.map(el => `${el.textContent} ${el.title}`).join('\n'); + expect(itemsTxt).toContain('Moto G Power'); + expect(itemsTxt).toContain('RTT'); + expect(itemsTxt).toMatch(/\dx/); + expect(itemsTxt).toContain(sampleResults.environment.networkUserAgent); + expect(itemsTxt).toMatch('412x823, DPR 1.75'); + expect(itemsTxt).toContain('Point-in-time snapshot'); }); }); diff --git a/shared/localization/locales/en-US.json b/shared/localization/locales/en-US.json index 005a526db204..5c46889f1a06 100644 --- a/shared/localization/locales/en-US.json +++ b/shared/localization/locales/en-US.json @@ -3362,6 +3362,12 @@ "report/renderer/report-utils.js | runtimeAnalysisWindow": { "message": "Initial page load" }, + "report/renderer/report-utils.js | runtimeAnalysisWindowSnapshot": { + "message": "Point-in-time snapshot" + }, + "report/renderer/report-utils.js | runtimeAnalysisWindowTimespan": { + "message": "User interactions timespan" + }, "report/renderer/report-utils.js | runtimeCustom": { "message": "Custom throttling" }, @@ -3396,10 +3402,10 @@ "message": "User agent (network)" }, "report/renderer/report-utils.js | runtimeSingleLoad": { - "message": "Single page load" + "message": "Single page session" }, "report/renderer/report-utils.js | runtimeSingleLoadTooltip": { - "message": "This data is taken from a single page load, as opposed to field data summarizing many sessions." + "message": "This data is taken from a single page session, as opposed to field data summarizing many sessions." }, "report/renderer/report-utils.js | runtimeSlow4g": { "message": "Slow 4G throttling" diff --git a/shared/localization/locales/en-XL.json b/shared/localization/locales/en-XL.json index 3f1cf397915f..aa21a2054b59 100644 --- a/shared/localization/locales/en-XL.json +++ b/shared/localization/locales/en-XL.json @@ -3362,6 +3362,12 @@ "report/renderer/report-utils.js | runtimeAnalysisWindow": { "message": "Îńît́îál̂ ṕâǵê ĺôád̂" }, + "report/renderer/report-utils.js | runtimeAnalysisWindowSnapshot": { + "message": "P̂óîńt̂-ín̂-t́îḿê śn̂áp̂śĥót̂" + }, + "report/renderer/report-utils.js | runtimeAnalysisWindowTimespan": { + "message": "Ûśêŕ îńt̂ér̂áĉt́îón̂ś t̂ím̂éŝṕâń" + }, "report/renderer/report-utils.js | runtimeCustom": { "message": "Ĉúŝt́ôḿ t̂h́r̂ót̂t́l̂ín̂ǵ" }, @@ -3396,10 +3402,10 @@ "message": "Ûśêŕ âǵêńt̂ (ńêt́ŵór̂ḱ)" }, "report/renderer/report-utils.js | runtimeSingleLoad": { - "message": "Ŝín̂ǵl̂é p̂áĝé l̂óâd́" + "message": "Ŝín̂ǵl̂é p̂áĝé ŝéŝśîón̂" }, "report/renderer/report-utils.js | runtimeSingleLoadTooltip": { - "message": "T̂h́îś d̂át̂á îś t̂ák̂én̂ f́r̂óm̂ á ŝín̂ǵl̂é p̂áĝé l̂óâd́, âś ôṕp̂óŝéd̂ t́ô f́îél̂d́ d̂át̂á ŝúm̂ḿâŕîźîńĝ ḿâńŷ śêśŝíôńŝ." + "message": "T̂h́îś d̂át̂á îś t̂ák̂én̂ f́r̂óm̂ á ŝín̂ǵl̂é p̂áĝé ŝéŝśîón̂, áŝ óp̂ṕôśêd́ t̂ó f̂íêĺd̂ d́ât́â śûḿm̂ár̂íẑín̂ǵ m̂án̂ý ŝéŝśîón̂ś." }, "report/renderer/report-utils.js | runtimeSlow4g": { "message": "Ŝĺôẃ 4Ĝ t́ĥŕôt́t̂ĺîńĝ"