diff --git a/lighthouse-core/computed/metrics/largest-contentful-paint-all-frames.js b/lighthouse-core/computed/metrics/largest-contentful-paint-all-frames.js new file mode 100644 index 000000000000..133a89352a64 --- /dev/null +++ b/lighthouse-core/computed/metrics/largest-contentful-paint-all-frames.js @@ -0,0 +1,43 @@ +/** + * @license Copyright 2020 The Lighthouse Authors. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + */ +'use strict'; + +/** + * @fileoverview Computed Largest Contentful Paint (LCP) for all frames. + */ + +const makeComputedArtifact = require('../computed-artifact.js'); +const ComputedMetric = require('./metric.js'); +const LHError = require('../../lib/lh-error.js'); + +class LargestContentfulPaintAllFrames extends ComputedMetric { + /** + * TODO: Simulate LCP all frames in lantern. + * @return {Promise} + */ + static async computeSimulatedMetric() { + throw new Error('LCP All Frames not implemented in lantern'); + } + + /** + * @param {LH.Artifacts.MetricComputationData} data + * @return {Promise} + */ + static async computeObservedMetric(data) { + const {traceOfTab} = data; + if (!traceOfTab.timestamps.largestContentfulPaintAllFrames) { + throw new LHError(LHError.errors.NO_LCP_ALL_FRAMES); + } + + return { + // LCP established as existing, so cast + timing: /** @type {number} */ (traceOfTab.timings.largestContentfulPaintAllFrames), + timestamp: traceOfTab.timestamps.largestContentfulPaintAllFrames, + }; + } +} + +module.exports = makeComputedArtifact(LargestContentfulPaintAllFrames); diff --git a/lighthouse-core/computed/metrics/timing-summary.js b/lighthouse-core/computed/metrics/timing-summary.js index 96498253edda..2b88457a30d4 100644 --- a/lighthouse-core/computed/metrics/timing-summary.js +++ b/lighthouse-core/computed/metrics/timing-summary.js @@ -10,6 +10,7 @@ const Speedline = require('../speedline.js'); const FirstContentfulPaint = require('./first-contentful-paint.js'); const FirstMeaningfulPaint = require('./first-meaningful-paint.js'); const LargestContentfulPaint = require('./largest-contentful-paint.js'); +const LargestContentfulPaintAllFrames = require('./largest-contentful-paint-all-frames.js'); const FirstCPUIdle = require('./first-cpu-idle.js'); const Interactive = require('./interactive.js'); const CumulativeLayoutShift = require('./cumulative-layout-shift.js'); @@ -44,6 +45,7 @@ class TimingSummary { const firstContentfulPaint = await FirstContentfulPaint.request(metricComputationData, context); const firstMeaningfulPaint = await FirstMeaningfulPaint.request(metricComputationData, context); const largestContentfulPaint = await requestOrUndefined(LargestContentfulPaint, metricComputationData); // eslint-disable-line max-len + const largestContentfulPaintAllFrames = await requestOrUndefined(LargestContentfulPaintAllFrames, metricComputationData); // eslint-disable-line max-len const firstCPUIdle = await requestOrUndefined(FirstCPUIdle, metricComputationData); const interactive = await requestOrUndefined(Interactive, metricComputationData); const cumulativeLayoutShift = await requestOrUndefined(CumulativeLayoutShift, trace); @@ -65,6 +67,8 @@ class TimingSummary { firstMeaningfulPaintTs: firstMeaningfulPaint.timestamp, largestContentfulPaint: largestContentfulPaint && largestContentfulPaint.timing, largestContentfulPaintTs: largestContentfulPaint && largestContentfulPaint.timestamp, + largestContentfulPaintAllFrames: largestContentfulPaintAllFrames && largestContentfulPaintAllFrames.timing, // eslint-disable-line max-len + largestContentfulPaintAllFramesTs: largestContentfulPaintAllFrames && largestContentfulPaintAllFrames.timestamp, // eslint-disable-line max-len firstCPUIdle: firstCPUIdle && firstCPUIdle.timing, firstCPUIdleTs: firstCPUIdle && firstCPUIdle.timestamp, interactive: interactive && interactive.timing, @@ -92,6 +96,8 @@ class TimingSummary { observedFirstMeaningfulPaintTs: traceOfTab.timestamps.firstMeaningfulPaint, observedLargestContentfulPaint: traceOfTab.timings.largestContentfulPaint, observedLargestContentfulPaintTs: traceOfTab.timestamps.largestContentfulPaint, + observedLargestContentfulPaintAllFrames: traceOfTab.timings.largestContentfulPaintAllFrames, + observedLargestContentfulPaintAllFramesTs: traceOfTab.timestamps.largestContentfulPaintAllFrames, // eslint-disable-line max-len observedTraceEnd: traceOfTab.timings.traceEnd, observedTraceEndTs: traceOfTab.timestamps.traceEnd, observedLoad: traceOfTab.timings.load, @@ -109,7 +115,10 @@ class TimingSummary { observedSpeedIndexTs: (speedline.speedIndex + speedline.beginning) * 1000, }; /** @type {Record} */ - const debugInfo = {lcpInvalidated: traceOfTab.lcpInvalidated}; + const debugInfo = { + lcpInvalidated: traceOfTab.lcpInvalidated, + lcpAllFramesInvalidated: traceOfTab.lcpAllFramesInvalidated, + }; return {metrics, debugInfo}; } diff --git a/lighthouse-core/lib/lh-error.js b/lighthouse-core/lib/lh-error.js index 4463e0afc4e0..80f38e14a274 100644 --- a/lighthouse-core/lib/lh-error.js +++ b/lighthouse-core/lib/lh-error.js @@ -276,6 +276,10 @@ const ERRORS = { code: 'NO_LCP', message: UIStrings.badTraceRecording, }, + NO_LCP_ALL_FRAMES: { + code: 'NO_LCP_ALL_FRAMES', + message: UIStrings.badTraceRecording, + }, UNSUPPORTED_OLD_CHROME: { code: 'UNSUPPORTED_OLD_CHROME', message: UIStrings.oldChromeDoesNotSupportFeature, diff --git a/lighthouse-core/lib/tracehouse/trace-processor.js b/lighthouse-core/lib/tracehouse/trace-processor.js index cf7100cbf369..7b44dd5d3476 100644 --- a/lighthouse-core/lib/tracehouse/trace-processor.js +++ b/lighthouse-core/lib/tracehouse/trace-processor.js @@ -477,6 +477,39 @@ class TraceProcessor { evt.name === SCHEDULABLE_TASK_TITLE_ALT3; } + /** + * @param {{candidateEventName: string, invalidateEventName: string, events: LH.TraceEvent[], timeOriginEvt: LH.TraceEvent}} options + * @return {{lcp: LH.TraceEvent | undefined, invalidated: boolean}} + */ + static computeValidLCP(options) { + const { + candidateEventName, + invalidateEventName, + events, + timeOriginEvt, + } = options; + + let lcp; + let invalidated = false; + // Iterate the events backwards. + for (let i = events.length - 1; i >= 0; i--) { + const e = events[i]; + // If the event's timestamp is before the time origin, stop. + if (e.ts <= timeOriginEvt.ts) break; + // If the last lcp event in the trace is 'Invalidate', there is inconclusive data to determine LCP. + if (e.name === invalidateEventName) { + invalidated = true; + break; + } + // If not an lcp 'Candidate', keep iterating. + if (e.name !== candidateEventName) continue; + // Found the last LCP candidate in the trace, let's use it. + lcp = e; + break; + } + + return {lcp, invalidated}; + } /** * Finds key trace events, identifies main process/thread, and returns timings of trace events @@ -512,6 +545,16 @@ class TraceProcessor { // Compute the key frame timings for the main frame. const frameTimings = this.computeKeyTimingsForFrame(frameEvents, {timeOriginEvt}); + // Compute LCP for all frames. + const lcpAllFramesResult = this.computeValidLCP({ + candidateEventName: 'NavStartToLargestContentfulPaint::Candidate::AllFrames::UKM', + invalidateEventName: 'NavStartToLargestContentfulPaint::Invalidate::AllFrames::UKM', + events: keyEvents, + timeOriginEvt, + }); + const lcpAllFrames = lcpAllFramesResult.lcp; + const lcpAllFramesInvalidated = lcpAllFramesResult.invalidated; + // Subset all trace events to just our tab's process (incl threads other than main) // stable-sort events to keep them correctly nested. const processEvents = TraceProcessor @@ -530,6 +573,8 @@ class TraceProcessor { // Ensure our traceEnd reflects all page activity. const traceEnd = this.computeTraceEnd(trace.traceEvents, timeOriginEvt); + /** @param {number=} ts */ + const maybeGetTiming = (ts) => ts === undefined ? undefined : (ts - timeOriginEvt.ts) / 1000; // This could be much more concise with object spread, but the consensus is that explicitness is // preferred over brevity here. return { @@ -543,6 +588,7 @@ class TraceProcessor { firstContentfulPaint: frameTimings.timings.firstContentfulPaint, firstMeaningfulPaint: frameTimings.timings.firstMeaningfulPaint, largestContentfulPaint: frameTimings.timings.largestContentfulPaint, + largestContentfulPaintAllFrames: maybeGetTiming(lcpAllFrames && lcpAllFrames.ts), traceEnd: traceEnd.timing, load: frameTimings.timings.load, domContentLoaded: frameTimings.timings.domContentLoaded, @@ -553,6 +599,7 @@ class TraceProcessor { firstContentfulPaint: frameTimings.timestamps.firstContentfulPaint, firstMeaningfulPaint: frameTimings.timestamps.firstMeaningfulPaint, largestContentfulPaint: frameTimings.timestamps.largestContentfulPaint, + largestContentfulPaintAllFrames: lcpAllFrames && lcpAllFrames.ts, traceEnd: traceEnd.timestamp, load: frameTimings.timestamps.load, domContentLoaded: frameTimings.timestamps.domContentLoaded, @@ -562,10 +609,12 @@ class TraceProcessor { firstContentfulPaintEvt: frameTimings.firstContentfulPaintEvt, firstMeaningfulPaintEvt: frameTimings.firstMeaningfulPaintEvt, largestContentfulPaintEvt: frameTimings.largestContentfulPaintEvt, + largestContentfulPaintAllFramesEvt: lcpAllFrames, loadEvt: frameTimings.loadEvt, domContentLoadedEvt: frameTimings.domContentLoadedEvt, fmpFellBack: frameTimings.fmpFellBack, lcpInvalidated: frameTimings.lcpInvalidated, + lcpAllFramesInvalidated: lcpAllFramesInvalidated, }; } @@ -670,24 +719,12 @@ class TraceProcessor { // LCP comes from the latest `largestContentfulPaint::Candidate`, but it can be invalidated // by a `largestContentfulPaint::Invalidate` event. In the case that the last candidate is // invalidated, the value will be undefined. - let largestContentfulPaint; - let lcpInvalidated = false; - // Iterate the events backwards. - for (let i = frameEvents.length - 1; i >= 0; i--) { - const e = frameEvents[i]; - // If the event's timestamp is before the time origin, stop. - if (e.ts <= timeOriginEvt.ts) break; - // If the last lcp event in the trace is 'Invalidate', there is inconclusive data to determine LCP. - if (e.name === 'largestContentfulPaint::Invalidate') { - lcpInvalidated = true; - break; - } - // If not an lcp 'Candidate', keep iterating. - if (e.name !== 'largestContentfulPaint::Candidate') continue; - // Found the last LCP candidate in the trace, let's use it. - largestContentfulPaint = e; - break; - } + const lcpResult = this.computeValidLCP({ + candidateEventName: 'largestContentfulPaint::Candidate', + invalidateEventName: 'largestContentfulPaint::Invalidate', + events: frameEvents, + timeOriginEvt, + }); const load = frameEvents.find(e => e.name === 'loadEventEnd' && e.ts > timeOriginEvt.ts); const domContentLoaded = frameEvents.find( @@ -702,7 +739,7 @@ class TraceProcessor { firstPaint: getTimestamp(firstPaint), firstContentfulPaint: getTimestamp(firstContentfulPaint), firstMeaningfulPaint: getTimestamp(firstMeaningfulPaint), - largestContentfulPaint: getTimestamp(largestContentfulPaint), + largestContentfulPaint: getTimestamp(lcpResult.lcp), load: getTimestamp(load), domContentLoaded: getTimestamp(domContentLoaded), }; @@ -727,11 +764,11 @@ class TraceProcessor { firstPaintEvt: firstPaint, firstContentfulPaintEvt: firstContentfulPaint, firstMeaningfulPaintEvt: firstMeaningfulPaint, - largestContentfulPaintEvt: largestContentfulPaint, + largestContentfulPaintEvt: lcpResult.lcp, loadEvt: load, domContentLoadedEvt: domContentLoaded, fmpFellBack, - lcpInvalidated, + lcpInvalidated: lcpResult.invalidated, }; } } diff --git a/lighthouse-core/test/audits/__snapshots__/metrics-test.js.snap b/lighthouse-core/test/audits/__snapshots__/metrics-test.js.snap index 67d3c4d9cc8b..715b29852b0c 100644 --- a/lighthouse-core/test/audits/__snapshots__/metrics-test.js.snap +++ b/lighthouse-core/test/audits/__snapshots__/metrics-test.js.snap @@ -1,5 +1,56 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`Performance: metrics evaluates valid input (with lcp from all frames) correctly 1`] = ` +Object { + "cumulativeLayoutShift": 0, + "estimatedInputLatency": 16, + "estimatedInputLatencyTs": undefined, + "firstCPUIdle": 668, + "firstCPUIdleTs": 10238937930, + "firstContentfulPaint": 668, + "firstContentfulPaintTs": 10238937930, + "firstMeaningfulPaint": 668, + "firstMeaningfulPaintTs": 10238937930, + "interactive": 668, + "interactiveTs": 10238937930, + "largestContentfulPaint": 668, + "largestContentfulPaintAllFrames": 2258, + "largestContentfulPaintAllFramesTs": 10240528038, + "largestContentfulPaintTs": 10238937930, + "maxPotentialFID": 16, + "observedCumulativeLayoutShift": 0, + "observedDomContentLoaded": 605, + "observedDomContentLoadedTs": 10238874657, + "observedFirstContentfulPaint": 668, + "observedFirstContentfulPaintTs": 10238937930, + "observedFirstMeaningfulPaint": 668, + "observedFirstMeaningfulPaintTs": 10238937930, + "observedFirstPaint": 668, + "observedFirstPaintTs": 10238937930, + "observedFirstVisualChange": 671, + "observedFirstVisualChangeTs": 10238940760, + "observedLargestContentfulPaint": 668, + "observedLargestContentfulPaintAllFrames": 2258, + "observedLargestContentfulPaintAllFramesTs": 10240528038, + "observedLargestContentfulPaintTs": 10238937930, + "observedLastVisualChange": 704, + "observedLastVisualChangeTs": 10238973760, + "observedLoad": 684, + "observedLoadTs": 10238953674, + "observedNavigationStart": 0, + "observedNavigationStartTs": 10238269760, + "observedSpeedIndex": 688, + "observedSpeedIndexTs": 10238957680, + "observedTimeOrigin": 0, + "observedTimeOriginTs": 10238269760, + "observedTraceEnd": 5994, + "observedTraceEndTs": 10244264001, + "speedIndex": 688, + "speedIndexTs": 10238957760, + "totalBlockingTime": 0, +} +`; + exports[`Performance: metrics evaluates valid input (with lcp) correctly 1`] = ` Object { "cumulativeLayoutShift": 0, @@ -14,6 +65,8 @@ Object { "interactive": 4462, "interactiveTs": undefined, "largestContentfulPaint": 2758, + "largestContentfulPaintAllFrames": undefined, + "largestContentfulPaintAllFramesTs": undefined, "largestContentfulPaintTs": undefined, "maxPotentialFID": 1336, "observedCumulativeLayoutShift": 0, @@ -28,6 +81,8 @@ Object { "observedFirstVisualChange": 1105, "observedFirstVisualChangeTs": 713038128064, "observedLargestContentfulPaint": 1122, + "observedLargestContentfulPaintAllFrames": undefined, + "observedLargestContentfulPaintAllFramesTs": undefined, "observedLargestContentfulPaintTs": 713038144775, "observedLastVisualChange": 1722, "observedLastVisualChangeTs": 713038745064, @@ -61,6 +116,8 @@ Object { "interactive": 1582, "interactiveTs": 225415754204, "largestContentfulPaint": undefined, + "largestContentfulPaintAllFrames": undefined, + "largestContentfulPaintAllFramesTs": undefined, "largestContentfulPaintTs": undefined, "maxPotentialFID": 198, "observedCumulativeLayoutShift": 0, @@ -75,6 +132,8 @@ Object { "observedFirstVisualChange": 520, "observedFirstVisualChangeTs": 225414692015, "observedLargestContentfulPaint": undefined, + "observedLargestContentfulPaintAllFrames": undefined, + "observedLargestContentfulPaintAllFramesTs": undefined, "observedLargestContentfulPaintTs": undefined, "observedLastVisualChange": 818, "observedLastVisualChangeTs": 225414990015, @@ -108,6 +167,8 @@ Object { "interactive": 3427, "interactiveTs": undefined, "largestContentfulPaint": undefined, + "largestContentfulPaintAllFrames": undefined, + "largestContentfulPaintAllFramesTs": undefined, "largestContentfulPaintTs": undefined, "maxPotentialFID": 396, "observedCumulativeLayoutShift": 0, @@ -122,6 +183,8 @@ Object { "observedFirstVisualChange": 520, "observedFirstVisualChangeTs": 225414692015, "observedLargestContentfulPaint": undefined, + "observedLargestContentfulPaintAllFrames": undefined, + "observedLargestContentfulPaintAllFramesTs": undefined, "observedLargestContentfulPaintTs": undefined, "observedLastVisualChange": 818, "observedLastVisualChangeTs": 225414990015, diff --git a/lighthouse-core/test/audits/metrics-test.js b/lighthouse-core/test/audits/metrics-test.js index fc47ac7b0d45..c9c55b980707 100644 --- a/lighthouse-core/test/audits/metrics-test.js +++ b/lighthouse-core/test/audits/metrics-test.js @@ -14,6 +14,9 @@ const pwaDevtoolsLog = require('../fixtures/traces/progressive-app-m60.devtools. const lcpTrace = require('../fixtures/traces/lcp-m78.json'); const lcpDevtoolsLog = require('../fixtures/traces/lcp-m78.devtools.log.json'); +const lcpAllFramesTrace = require('../fixtures/traces/lcp-all-frames-m89.json'); +const lcpAllFramesDevtoolsLog = require('../fixtures/traces/lcp-all-frames-m89.devtools.log.json'); + const artifactsTrace = require('../results/artifacts/defaultPass.trace.json'); const artifactsDevtoolsLog = require('../results/artifacts/defaultPass.devtoolslog.json'); @@ -65,6 +68,21 @@ describe('Performance: metrics', () => { expect(result.details.items[0]).toMatchSnapshot(); }); + it('evaluates valid input (with lcp from all frames) correctly', async () => { + const artifacts = { + traces: { + [MetricsAudit.DEFAULT_PASS]: lcpAllFramesTrace, + }, + devtoolsLogs: { + [MetricsAudit.DEFAULT_PASS]: lcpAllFramesDevtoolsLog, + }, + }; + + const context = {settings: {throttlingMethod: 'provided'}, computedCache: new Map()}; + const result = await MetricsAudit.audit(artifacts, context); + expect(result.details.items[0]).toMatchSnapshot(); + }); + it('evaluates valid input (with CLS) correctly', async () => { const artifacts = { traces: { diff --git a/lighthouse-core/test/computed/metrics/largest-contentful-paint-all-frames-test.js b/lighthouse-core/test/computed/metrics/largest-contentful-paint-all-frames-test.js new file mode 100644 index 000000000000..71a24adaecf3 --- /dev/null +++ b/lighthouse-core/test/computed/metrics/largest-contentful-paint-all-frames-test.js @@ -0,0 +1,58 @@ +/** + * @license Copyright 2020 The Lighthouse Authors. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + */ +'use strict'; + +const assert = require('assert').strict; + +const LargestContentfulPaintAllFrames = require('../../../computed/metrics/largest-contentful-paint-all-frames.js'); // eslint-disable-line max-len +const traceAllFrames = require('../../fixtures/traces/lcp-all-frames-m89.json'); +const devtoolsLogAllFrames = require('../../fixtures/traces/lcp-all-frames-m89.devtools.log.json'); +const traceMainFrame = require('../../fixtures/traces/lcp-m78.json'); +const devtoolsLogMainFrame = require('../../fixtures/traces/lcp-m78.devtools.log.json'); +const invalidTrace = require('../../fixtures/traces/progressive-app-m60.json'); +const invalidDevtoolsLog = require('../../fixtures/traces/progressive-app-m60.devtools.log.json'); + +/* eslint-env jest */ + +describe('Metrics: LCP from all frames', () => { + it('should throw for predicted value', async () => { + const settings = {throttlingMethod: 'simulate'}; + const context = {settings, computedCache: new Map()}; + const resultPromise = LargestContentfulPaintAllFrames.request({trace: traceAllFrames, devtoolsLog: devtoolsLogAllFrames, settings}, context); // eslint-disable-line max-len + + // TODO: Implement lantern solution for LCP all frames. + expect(resultPromise).rejects.toThrow(); + }); + + it('should compute an observed value', async () => { + const settings = {throttlingMethod: 'provided'}; + const context = {settings, computedCache: new Map()}; + const result = await LargestContentfulPaintAllFrames.request({trace: traceAllFrames, devtoolsLog: devtoolsLogAllFrames, settings}, context); // eslint-disable-line max-len + + assert.equal(Math.round(result.timing), 2258); + assert.equal(result.timestamp, 10240528038); + }); + + it('should fail to compute an observed value for old trace', async () => { + const settings = {throttlingMethod: 'provided'}; + const context = {settings, computedCache: new Map()}; + const resultPromise = LargestContentfulPaintAllFrames.request( + {trace: invalidTrace, devtoolsLog: invalidDevtoolsLog, settings}, + context + ); + await expect(resultPromise).rejects.toThrow('NO_LCP_ALL_FRAMES'); + }); + + it('should fail if even if main frame LCP is available', async () => { + const settings = {throttlingMethod: 'provided'}; + const context = {settings, computedCache: new Map()}; + const resultPromise = LargestContentfulPaintAllFrames.request( + {trace: traceMainFrame, devtoolsLog: devtoolsLogMainFrame, settings}, + context + ); + await expect(resultPromise).rejects.toThrow('NO_LCP_ALL_FRAMES'); + }); +}); diff --git a/lighthouse-core/test/computed/metrics/timing-summary-test.js b/lighthouse-core/test/computed/metrics/timing-summary-test.js index 6f8155de2539..93c1861911f4 100644 --- a/lighthouse-core/test/computed/metrics/timing-summary-test.js +++ b/lighthouse-core/test/computed/metrics/timing-summary-test.js @@ -7,59 +7,63 @@ const TimingSummary = require('../../../computed/metrics/timing-summary.js'); -const trace = require('../../fixtures/traces/progressive-app-m60.json'); -const devtoolsLog = require('../../fixtures/traces/progressive-app-m60.devtools.log.json'); +const trace = require('../../fixtures/traces/lcp-all-frames-m89.json'); +const devtoolsLog = require('../../fixtures/traces/lcp-all-frames-m89.devtools.log.json'); /* eslint-env jest */ describe('Timing summary', () => { it('contains the correct data', async () => { - const context = {settings: {throttlingMethod: 'simulate'}, computedCache: new Map()}; + const context = {settings: {throttlingMethod: 'devtools'}, computedCache: new Map()}; const result = await TimingSummary.request({trace, devtoolsLog}, context); expect(result.metrics).toMatchInlineSnapshot(` Object { "cumulativeLayoutShift": 0, - "estimatedInputLatency": 77.79999999999995, + "estimatedInputLatency": 16, "estimatedInputLatencyTs": undefined, - "firstCPUIdle": 3351.3320000492963, - "firstCPUIdleTs": undefined, - "firstContentfulPaint": 1336.6100000208244, - "firstContentfulPaintTs": undefined, - "firstMeaningfulPaint": 1553.2040000472914, - "firstMeaningfulPaintTs": undefined, - "interactive": 3426.8545000551967, - "interactiveTs": undefined, - "largestContentfulPaint": undefined, - "largestContentfulPaintTs": undefined, - "maxPotentialFID": 396.0000000000001, + "firstCPUIdle": 668.17, + "firstCPUIdleTs": 10238937930, + "firstContentfulPaint": 668.17, + "firstContentfulPaintTs": 10238937930, + "firstMeaningfulPaint": 668.17, + "firstMeaningfulPaintTs": 10238937930, + "interactive": 668.17, + "interactiveTs": 10238937930, + "largestContentfulPaint": 668.17, + "largestContentfulPaintAllFrames": 2258.278, + "largestContentfulPaintAllFramesTs": 10240528038, + "largestContentfulPaintTs": 10238937930, + "maxPotentialFID": 16, "observedCumulativeLayoutShift": 0, - "observedDomContentLoaded": 560.294, - "observedDomContentLoadedTs": 225414732309, - "observedFirstContentfulPaint": 498.87, - "observedFirstContentfulPaintTs": 225414670885, - "observedFirstMeaningfulPaint": 783.328, - "observedFirstMeaningfulPaintTs": 225414955343, - "observedFirstPaint": 498.853, - "observedFirstPaintTs": 225414670868, - "observedFirstVisualChange": 520, - "observedFirstVisualChangeTs": 225414692015, - "observedLargestContentfulPaint": undefined, - "observedLargestContentfulPaintTs": undefined, - "observedLastVisualChange": 818, - "observedLastVisualChangeTs": 225414990015, - "observedLoad": 2198.898, - "observedLoadTs": 225416370913, + "observedDomContentLoaded": 604.897, + "observedDomContentLoadedTs": 10238874657, + "observedFirstContentfulPaint": 668.17, + "observedFirstContentfulPaintTs": 10238937930, + "observedFirstMeaningfulPaint": 668.17, + "observedFirstMeaningfulPaintTs": 10238937930, + "observedFirstPaint": 668.17, + "observedFirstPaintTs": 10238937930, + "observedFirstVisualChange": 671, + "observedFirstVisualChangeTs": 10238940760, + "observedLargestContentfulPaint": 668.17, + "observedLargestContentfulPaintAllFrames": 2258.278, + "observedLargestContentfulPaintAllFramesTs": 10240528038, + "observedLargestContentfulPaintTs": 10238937930, + "observedLastVisualChange": 704, + "observedLastVisualChangeTs": 10238973760, + "observedLoad": 683.914, + "observedLoadTs": 10238953674, "observedNavigationStart": 0, - "observedNavigationStartTs": 225414172015, - "observedSpeedIndex": 604.7093900063634, - "observedSpeedIndexTs": 225414776724.39, + "observedNavigationStartTs": 10238269760, + "observedSpeedIndex": 687.9203400006518, + "observedSpeedIndexTs": 10238957680.34, "observedTimeOrigin": 0, - "observedTimeOriginTs": 225414172015, - "observedTraceEnd": 12539.872, - "observedTraceEndTs": 225426711887, - "speedIndex": 1676.1335047609864, - "speedIndexTs": undefined, - "totalBlockingTime": 726.4774999940994, + "observedTimeOriginTs": 10238269760, + "observedTraceEnd": 5994.241, + "observedTraceEndTs": 10244264001, + "speedIndex": 688, + "speedIndexTs": 10238957760, + "totalBlockingTime": 0, } `); // Includes performance metrics @@ -69,6 +73,6 @@ describe('Timing summary', () => { // Includs visual metrics from Speedline expect(result.metrics.observedFirstVisualChange).toBeDefined(); - expect(result.debugInfo).toEqual({lcpInvalidated: false}); + expect(result.debugInfo).toEqual({lcpInvalidated: false, lcpAllFramesInvalidated: false}); }); }); diff --git a/lighthouse-core/test/computed/trace-of-tab-test.js b/lighthouse-core/test/computed/trace-of-tab-test.js index a87f6c48b789..e1c4da4fbb12 100644 --- a/lighthouse-core/test/computed/trace-of-tab-test.js +++ b/lighthouse-core/test/computed/trace-of-tab-test.js @@ -76,6 +76,7 @@ describe('TraceOfTabComputed', () => { }, fmpFellBack: false, lcpInvalidated: false, + lcpAllFramesInvalidated: false, loadEvt: { args: { frame: '0x25a638821e30', diff --git a/lighthouse-core/test/fixtures/traces/lcp-all-frames-m89.devtools.log.json b/lighthouse-core/test/fixtures/traces/lcp-all-frames-m89.devtools.log.json new file mode 100644 index 000000000000..2aaafa2031c1 --- /dev/null +++ b/lighthouse-core/test/fixtures/traces/lcp-all-frames-m89.devtools.log.json @@ -0,0 +1,55 @@ +[ + {"method":"Page.lifecycleEvent","params":{"frameId":"4249F84F135F1AC71BD734840955AFAD","loaderId":"552AF08E922F8233A5FE79AA6E9B4022","name":"commit","timestamp":10238.165192}}, + {"method":"Page.lifecycleEvent","params":{"frameId":"4249F84F135F1AC71BD734840955AFAD","loaderId":"552AF08E922F8233A5FE79AA6E9B4022","name":"DOMContentLoaded","timestamp":10238.165874}}, + {"method":"Page.lifecycleEvent","params":{"frameId":"4249F84F135F1AC71BD734840955AFAD","loaderId":"552AF08E922F8233A5FE79AA6E9B4022","name":"load","timestamp":10238.166292}}, + {"method":"Page.lifecycleEvent","params":{"frameId":"4249F84F135F1AC71BD734840955AFAD","loaderId":"552AF08E922F8233A5FE79AA6E9B4022","name":"networkAlmostIdle","timestamp":10238.167863}}, + {"method":"Page.lifecycleEvent","params":{"frameId":"4249F84F135F1AC71BD734840955AFAD","loaderId":"552AF08E922F8233A5FE79AA6E9B4022","name":"networkIdle","timestamp":10238.167863}}, + {"method":"Network.requestWillBeSent","params":{"requestId":"6D3A82B95DE242CC59BE6269DA343595","loaderId":"6D3A82B95DE242CC59BE6269DA343595","documentURL":"http://localhost:8080/iframe-lcp.html","request":{"url":"http://localhost:8080/iframe-lcp.html","method":"GET","headers":{},"mixedContentType":"none","initialPriority":"VeryHigh","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":10238.270206,"wallTime":1606244936.171218,"initiator":{"type":"other"},"type":"Document","frameId":"4249F84F135F1AC71BD734840955AFAD","hasUserGesture":false}}, + {"method":"Network.requestWillBeSentExtraInfo","params":{"requestId":"6D3A82B95DE242CC59BE6269DA343595","associatedCookies":[],"headers":{"Host":"localhost:8080","Connection":"keep-alive","Upgrade-Insecure-Requests":"1","User-Agent":"Mozilla/5.0 (Linux; Android 7.0; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4143.7 Mobile Safari/537.36 Chrome-Lighthouse","Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","Sec-Fetch-Site":"none","Sec-Fetch-Mode":"navigate","Sec-Fetch-User":"?1","Sec-Fetch-Dest":"document","Accept-Encoding":"gzip, deflate, br","Accept-Language":"en-US,en;q=0.9"}}}, + {"method":"Page.lifecycleEvent","params":{"frameId":"4249F84F135F1AC71BD734840955AFAD","loaderId":"552AF08E922F8233A5FE79AA6E9B4022","name":"networkAlmostIdle","timestamp":10238.167863}}, + {"method":"Page.lifecycleEvent","params":{"frameId":"4249F84F135F1AC71BD734840955AFAD","loaderId":"552AF08E922F8233A5FE79AA6E9B4022","name":"networkIdle","timestamp":10238.167863}}, + {"method":"Network.responseReceivedExtraInfo","params":{"requestId":"6D3A82B95DE242CC59BE6269DA343595","blockedCookies":[],"headers":{"content-security-policy":"","Date":"Tue, 24 Nov 2020 19:08:56 GMT","Connection":"keep-alive","Keep-Alive":"timeout=5","Transfer-Encoding":"chunked"},"headersText":"HTTP/1.1 200 OK\r\ncontent-security-policy: \r\nDate: Tue, 24 Nov 2020 19:08:56 GMT\r\nConnection: keep-alive\r\nKeep-Alive: timeout=5\r\nTransfer-Encoding: chunked\r\n\r\n"}}, + {"method":"Network.responseReceived","params":{"requestId":"6D3A82B95DE242CC59BE6269DA343595","loaderId":"6D3A82B95DE242CC59BE6269DA343595","timestamp":10238.840466,"type":"Document","response":{"url":"http://localhost:8080/iframe-lcp.html","status":200,"statusText":"OK","headers":{},"mimeType":"text/html","requestHeaders":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","Accept-Encoding":"gzip, deflate, br"},"connectionReused":true,"connectionId":28,"remoteIPAddress":"[::1]","remotePort":8080,"fromDiskCache":false,"fromServiceWorker":false,"fromPrefetchCache":false,"encodedDataLength":158,"timing":{"requestTime":10238.271278,"sendStart":0.206,"sendEnd":0.257,"pushStart":0,"pushEnd":0,"receiveHeadersEnd":568.032},"responseTime":1606244936173.009,"protocol":"http/1.1","securityState":"secure"},"frameId":"4249F84F135F1AC71BD734840955AFAD"}}, + {"method":"Page.frameStartedLoading","params":{"frameId":"4249F84F135F1AC71BD734840955AFAD"}}, + {"method":"Page.lifecycleEvent","params":{"frameId":"4249F84F135F1AC71BD734840955AFAD","loaderId":"6D3A82B95DE242CC59BE6269DA343595","name":"init","timestamp":10238.844487}}, + {"method":"Page.frameNavigated","params":{"frame":{"id":"4249F84F135F1AC71BD734840955AFAD","loaderId":"6D3A82B95DE242CC59BE6269DA343595","url":"http://localhost:8080/iframe-lcp.html","domainAndRegistry":"","securityOrigin":"http://localhost:8080","mimeType":"text/html","adFrameType":"none","secureContextType":"SecureLocalhost","crossOriginIsolatedContextType":"NotIsolated","gatedAPIFeatures":["SharedArrayBuffers","SharedArrayBuffersTransferAllowed"]}}}, + {"method":"Network.dataReceived","params":{"requestId":"6D3A82B95DE242CC59BE6269DA343595","timestamp":10238.865224,"dataLength":130,"encodedDataLength":0}}, + {"method":"Network.loadingFinished","params":{"requestId":"6D3A82B95DE242CC59BE6269DA343595","timestamp":10238.839607,"encodedDataLength":299,"shouldReportCorbBlocking":false}}, + {"method":"Page.frameAttached","params":{"frameId":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9","parentFrameId":"4249F84F135F1AC71BD734840955AFAD"}}, + {"method":"Page.lifecycleEvent","params":{"frameId":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9","loaderId":"20FA5FE697706189B1E346BDBDCE7678","name":"init","timestamp":10238.870627}}, + {"method":"Page.lifecycleEvent","params":{"frameId":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9","loaderId":"20FA5FE697706189B1E346BDBDCE7678","name":"DOMContentLoaded","timestamp":10238.872853}}, + {"method":"Page.frameStartedLoading","params":{"frameId":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9"}}, + {"method":"Network.requestWillBeSent","params":{"requestId":"B83E07B94F6928B7B5786EB1E83CDF9D","loaderId":"B83E07B94F6928B7B5786EB1E83CDF9D","documentURL":"http://localhost:8080/frame.html","request":{"url":"http://localhost:8080/frame.html","method":"GET","headers":{},"mixedContentType":"none","initialPriority":"VeryHigh","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":10238.874387,"wallTime":1606244936.775422,"initiator":{"type":"parser","url":"http://localhost:8080/iframe-lcp.html","lineNumber":4,"columnNumber":29},"type":"Document","frameId":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9","hasUserGesture":false}}, + {"method":"Network.requestWillBeSentExtraInfo","params":{"requestId":"B83E07B94F6928B7B5786EB1E83CDF9D","associatedCookies":[],"headers":{"Host":"localhost:8080","Connection":"keep-alive","Upgrade-Insecure-Requests":"1","User-Agent":"Mozilla/5.0 (Linux; Android 7.0; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4143.7 Mobile Safari/537.36 Chrome-Lighthouse","Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","Sec-Fetch-Site":"same-origin","Sec-Fetch-Mode":"navigate","Sec-Fetch-Dest":"iframe","Referer":"http://localhost:8080/iframe-lcp.html","Accept-Encoding":"gzip, deflate, br","Accept-Language":"en-US,en;q=0.9"},"clientSecurityState":{"initiatorIsSecureContext":true,"initiatorIPAddressSpace":"Local","privateNetworkRequestPolicy":"Allow"}}}, + {"method":"Page.domContentEventFired","params":{"timestamp":10238.875636}}, + {"method":"Page.lifecycleEvent","params":{"frameId":"4249F84F135F1AC71BD734840955AFAD","loaderId":"6D3A82B95DE242CC59BE6269DA343595","name":"DOMContentLoaded","timestamp":10238.875636}}, + {"method":"Network.responseReceivedExtraInfo","params":{"requestId":"B83E07B94F6928B7B5786EB1E83CDF9D","blockedCookies":[],"headers":{"content-security-policy":"","Date":"Tue, 24 Nov 2020 19:08:56 GMT","Connection":"keep-alive","Keep-Alive":"timeout=5","Transfer-Encoding":"chunked"},"headersText":"HTTP/1.1 200 OK\r\ncontent-security-policy: \r\nDate: Tue, 24 Nov 2020 19:08:56 GMT\r\nConnection: keep-alive\r\nKeep-Alive: timeout=5\r\nTransfer-Encoding: chunked\r\n\r\n"}}, + {"method":"Network.responseReceived","params":{"requestId":"B83E07B94F6928B7B5786EB1E83CDF9D","loaderId":"B83E07B94F6928B7B5786EB1E83CDF9D","timestamp":10238.877184,"type":"Document","response":{"url":"http://localhost:8080/frame.html","status":200,"statusText":"OK","headers":{},"mimeType":"text/html","requestHeaders":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","Accept-Encoding":"gzip, deflate, br"},"connectionReused":true,"connectionId":28,"remoteIPAddress":"[::1]","remotePort":8080,"fromDiskCache":false,"fromServiceWorker":false,"fromPrefetchCache":false,"encodedDataLength":158,"timing":{"requestTime":10238.875237,"sendStart":0.206,"sendEnd":0.259,"pushStart":0,"pushEnd":0,"receiveHeadersEnd":0.78},"responseTime":1606244936776.987,"protocol":"http/1.1","securityState":"secure"},"frameId":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9"}}, + {"method":"Page.lifecycleEvent","params":{"frameId":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9","loaderId":"B83E07B94F6928B7B5786EB1E83CDF9D","name":"init","timestamp":10238.927944}}, + {"method":"Page.frameNavigated","params":{"frame":{"id":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9","parentId":"4249F84F135F1AC71BD734840955AFAD","loaderId":"B83E07B94F6928B7B5786EB1E83CDF9D","name":"","url":"http://localhost:8080/frame.html","domainAndRegistry":"","securityOrigin":"http://localhost:8080","mimeType":"text/html","adFrameType":"none","secureContextType":"SecureLocalhost","crossOriginIsolatedContextType":"NotIsolated","gatedAPIFeatures":["SharedArrayBuffers","SharedArrayBuffersTransferAllowed"]}}}, + {"method":"Network.dataReceived","params":{"requestId":"B83E07B94F6928B7B5786EB1E83CDF9D","timestamp":10238.942637,"dataLength":87,"encodedDataLength":0}}, + {"method":"Page.lifecycleEvent","params":{"frameId":"4249F84F135F1AC71BD734840955AFAD","loaderId":"6D3A82B95DE242CC59BE6269DA343595","name":"firstPaint","timestamp":10238.93793}}, + {"method":"Page.lifecycleEvent","params":{"frameId":"4249F84F135F1AC71BD734840955AFAD","loaderId":"6D3A82B95DE242CC59BE6269DA343595","name":"firstContentfulPaint","timestamp":10238.93793}}, + {"method":"Page.lifecycleEvent","params":{"frameId":"4249F84F135F1AC71BD734840955AFAD","loaderId":"6D3A82B95DE242CC59BE6269DA343595","name":"firstMeaningfulPaintCandidate","timestamp":10238.93793}}, + {"method":"Network.loadingFinished","params":{"requestId":"B83E07B94F6928B7B5786EB1E83CDF9D","timestamp":10238.876303,"encodedDataLength":256,"shouldReportCorbBlocking":false}}, + {"method":"Page.lifecycleEvent","params":{"frameId":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9","loaderId":"B83E07B94F6928B7B5786EB1E83CDF9D","name":"load","timestamp":10238.948072}}, + {"method":"Page.frameStoppedLoading","params":{"frameId":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9"}}, + {"method":"Page.loadEventFired","params":{"timestamp":10238.953688}}, + {"method":"Page.lifecycleEvent","params":{"frameId":"4249F84F135F1AC71BD734840955AFAD","loaderId":"6D3A82B95DE242CC59BE6269DA343595","name":"load","timestamp":10238.953688}}, + {"method":"Page.frameStoppedLoading","params":{"frameId":"4249F84F135F1AC71BD734840955AFAD"}}, + {"method":"Page.lifecycleEvent","params":{"frameId":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9","loaderId":"B83E07B94F6928B7B5786EB1E83CDF9D","name":"DOMContentLoaded","timestamp":10238.954372}}, + {"method":"Network.requestWillBeSentExtraInfo","params":{"requestId":"16591.3","associatedCookies":[],"headers":{"Host":"localhost:8080","Connection":"keep-alive","User-Agent":"Mozilla/5.0 (Linux; Android 7.0; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4143.7 Mobile Safari/537.36 Chrome-Lighthouse","Accept":"image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8","Sec-Fetch-Site":"same-origin","Sec-Fetch-Mode":"no-cors","Sec-Fetch-Dest":"image","Referer":"http://localhost:8080/iframe-lcp.html","Accept-Encoding":"gzip, deflate, br","Accept-Language":"en-US,en;q=0.9"},"clientSecurityState":{"initiatorIsSecureContext":true,"initiatorIPAddressSpace":"Local","privateNetworkRequestPolicy":"Allow"}}}, + {"method":"Network.requestWillBeSent","params":{"requestId":"16591.3","loaderId":"6D3A82B95DE242CC59BE6269DA343595","documentURL":"http://localhost:8080/iframe-lcp.html","request":{"url":"http://localhost:8080/favicon.ico","method":"GET","headers":{},"mixedContentType":"none","initialPriority":"High","referrerPolicy":"strict-origin-when-cross-origin"},"timestamp":10238.95814,"wallTime":1606244936.85916,"initiator":{"type":"other"},"type":"Other","frameId":"4249F84F135F1AC71BD734840955AFAD","hasUserGesture":false}}, + {"method":"Page.lifecycleEvent","params":{"frameId":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9","loaderId":"B83E07B94F6928B7B5786EB1E83CDF9D","name":"firstPaint","timestamp":10238.966275}}, + {"method":"Page.lifecycleEvent","params":{"frameId":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9","loaderId":"B83E07B94F6928B7B5786EB1E83CDF9D","name":"firstContentfulPaint","timestamp":10238.966275}}, + {"method":"Page.lifecycleEvent","params":{"frameId":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9","loaderId":"B83E07B94F6928B7B5786EB1E83CDF9D","name":"firstMeaningfulPaintCandidate","timestamp":10238.966275}}, + {"method":"Network.responseReceivedExtraInfo","params":{"requestId":"16591.3","blockedCookies":[],"headers":{"Date":"Tue, 24 Nov 2020 19:08:56 GMT","Connection":"keep-alive","Keep-Alive":"timeout=5","Content-Length":"0"},"headersText":"HTTP/1.1 404 Not Found\r\nDate: Tue, 24 Nov 2020 19:08:56 GMT\r\nConnection: keep-alive\r\nKeep-Alive: timeout=5\r\nContent-Length: 0\r\n\r\n"}}, + {"method":"Page.lifecycleEvent","params":{"frameId":"4249F84F135F1AC71BD734840955AFAD","loaderId":"6D3A82B95DE242CC59BE6269DA343595","name":"networkAlmostIdle","timestamp":10238.87567}}, + {"method":"Page.lifecycleEvent","params":{"frameId":"4249F84F135F1AC71BD734840955AFAD","loaderId":"6D3A82B95DE242CC59BE6269DA343595","name":"firstMeaningfulPaint","timestamp":10238.93793}}, + {"method":"Page.lifecycleEvent","params":{"frameId":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9","loaderId":"B83E07B94F6928B7B5786EB1E83CDF9D","name":"networkAlmostIdle","timestamp":10238.95439}}, + {"method":"Page.lifecycleEvent","params":{"frameId":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9","loaderId":"B83E07B94F6928B7B5786EB1E83CDF9D","name":"firstMeaningfulPaint","timestamp":10238.966275}}, + {"method":"Page.lifecycleEvent","params":{"frameId":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9","loaderId":"B83E07B94F6928B7B5786EB1E83CDF9D","name":"networkIdle","timestamp":10238.95439}}, + {"method":"Network.responseReceived","params":{"requestId":"16591.3","loaderId":"6D3A82B95DE242CC59BE6269DA343595","timestamp":10239.525317,"type":"Other","response":{"url":"http://localhost:8080/favicon.ico","status":404,"statusText":"Not Found","headers":{"Content-Length":"0"},"mimeType":"text/plain","connectionReused":true,"connectionId":28,"remoteIPAddress":"[::1]","remotePort":8080,"fromDiskCache":false,"fromServiceWorker":false,"fromPrefetchCache":false,"encodedDataLength":129,"timing":{"requestTime":10238.959278,"sendStart":0.225,"sendEnd":0.291,"pushStart":0,"pushEnd":0,"receiveHeadersEnd":563.464},"responseTime":1606244936860.823,"protocol":"http/1.1","securityState":"secure"},"frameId":"4249F84F135F1AC71BD734840955AFAD"}}, + {"method":"Network.loadingFinished","params":{"requestId":"16591.3","timestamp":10239.522919,"encodedDataLength":129,"shouldReportCorbBlocking":false}}, + {"method":"Page.lifecycleEvent","params":{"frameId":"4249F84F135F1AC71BD734840955AFAD","loaderId":"6D3A82B95DE242CC59BE6269DA343595","name":"networkIdle","timestamp":10239.526678}} +] \ No newline at end of file diff --git a/lighthouse-core/test/fixtures/traces/lcp-all-frames-m89.json b/lighthouse-core/test/fixtures/traces/lcp-all-frames-m89.json new file mode 100644 index 000000000000..23cbf7a7791a --- /dev/null +++ b/lighthouse-core/test/fixtures/traces/lcp-all-frames-m89.json @@ -0,0 +1,149 @@ +{ + "traceEvents": [ + {"args":{"name":"swapper"},"cat":"__metadata","name":"thread_name","ph":"M","pid":16563,"tid":0,"ts":0}, + {"args":{"name":"CrBrowserMain"},"cat":"__metadata","name":"thread_name","ph":"M","pid":16563,"tid":775,"ts":0}, + {"args":{"name":"CrRendererMain"},"cat":"__metadata","name":"thread_name","ph":"M","pid":16591,"tid":775,"ts":0}, + {"args":{"name":"Chrome_DevToolsHandlerThread"},"cat":"__metadata","name":"thread_name","ph":"M","pid":16563,"tid":62723,"ts":0}, + {"args":{"name":"VizCompositorThread"},"cat":"__metadata","name":"thread_name","ph":"M","pid":16583,"tid":44291,"ts":0}, + {"args":{"name":"Chrome_IOThread"},"cat":"__metadata","name":"thread_name","ph":"M","pid":16563,"tid":34819,"ts":0}, + {"args":{"name":"Chrome_ChildIOThread"},"cat":"__metadata","name":"thread_name","ph":"M","pid":16591,"tid":19715,"ts":0}, + {"args":{"name":"CrGpuMain"},"cat":"__metadata","name":"thread_name","ph":"M","pid":16583,"tid":775,"ts":0}, + {"args":{"name":"CompositorTileWorker1"},"cat":"__metadata","name":"thread_name","ph":"M","pid":16563,"tid":82691,"ts":0}, + {"args":{"name":"StackSamplingProfiler"},"cat":"__metadata","name":"thread_name","ph":"M","pid":16583,"tid":20995,"ts":0}, + {"args":{"name":"StackSamplingProfiler"},"cat":"__metadata","name":"thread_name","ph":"M","pid":16563,"tid":20739,"ts":0}, + {"args":{"name":"Compositor"},"cat":"__metadata","name":"thread_name","ph":"M","pid":16591,"tid":15619,"ts":0}, + {"args":{"name":"ThreadPoolServiceThread"},"cat":"__metadata","name":"thread_name","ph":"M","pid":16563,"tid":37923,"ts":0}, + {"args":{"name":"Chrome_ChildIOThread"},"cat":"__metadata","name":"thread_name","ph":"M","pid":16583,"tid":33283,"ts":0}, + {"args":{"name":"CacheThread_BlockFile"},"cat":"__metadata","name":"thread_name","ph":"M","pid":16563,"tid":50435,"ts":0}, + {"args":{"name":"CompositorTileWorker4"},"cat":"__metadata","name":"thread_name","ph":"M","pid":16591,"tid":41987,"ts":0}, + {"args":{"name":"CompositorTileWorker2"},"cat":"__metadata","name":"thread_name","ph":"M","pid":16591,"tid":22787,"ts":0}, + {"args":{"name":"CompositorTileWorker3"},"cat":"__metadata","name":"thread_name","ph":"M","pid":16591,"tid":23299,"ts":0}, + {"args":{"name":"ThreadPoolForegroundWorker"},"cat":"__metadata","name":"thread_name","ph":"M","pid":16563,"tid":67843,"ts":0}, + {"args":{"name":"ThreadPoolForegroundWorker"},"cat":"__metadata","name":"thread_name","ph":"M","pid":16583,"tid":29955,"ts":0}, + {"args":{"name":"ThreadPoolForegroundWorker"},"cat":"__metadata","name":"thread_name","ph":"M","pid":16591,"tid":20995,"ts":0}, + {"args":{"name":"GPU Process"},"cat":"__metadata","name":"process_name","ph":"M","pid":16583,"tid":0,"ts":0}, + {"args":{"name":"Browser"},"cat":"__metadata","name":"process_name","ph":"M","pid":16563,"tid":0,"ts":0}, + {"args":{"name":"Renderer"},"cat":"__metadata","name":"process_name","ph":"M","pid":16591,"tid":0,"ts":0}, + {"args":{"data":{"frameTreeNodeId":2,"frames":[{"frame":"4249F84F135F1AC71BD734840955AFAD","name":"","processId":16591,"url":"about:blank"}],"persistentIds":true}},"cat":"disabled-by-default-devtools.timeline","name":"TracingStartedInBrowser","ph":"I","pid":16563,"s":"t","tid":775,"ts":10238265533,"tts":727229}, + {"args":{"data":{"type":"beforeunload"}},"cat":"devtools.timeline","dur":8,"name":"EventDispatch","ph":"X","pid":16591,"tdur":7,"tid":775,"ts":10238269747,"tts":1218233}, + {"args":{},"cat":"disabled-by-default-devtools.timeline","dur":17990,"name":"RunTask","ph":"X","pid":16591,"tdur":17989,"tid":775,"ts":10238842105,"tts":1653398}, + {"args":{"data":{"type":"pagehide"}},"cat":"devtools.timeline","dur":5,"name":"EventDispatch","ph":"X","pid":16591,"tdur":5,"tid":775,"ts":10238844020,"tts":1655313}, + {"args":{"data":{"type":"visibilitychange"}},"cat":"devtools.timeline","dur":4,"name":"EventDispatch","ph":"X","pid":16591,"tdur":4,"tid":775,"ts":10238844346,"tts":1655639}, + {"args":{"data":{"type":"webkitvisibilitychange"}},"cat":"devtools.timeline","dur":2,"name":"EventDispatch","ph":"X","pid":16591,"tdur":3,"tid":775,"ts":10238844354,"tts":1655646}, + {"args":{"data":{"type":"unload"}},"cat":"devtools.timeline","dur":2,"name":"EventDispatch","ph":"X","pid":16591,"tdur":2,"tid":775,"ts":10238844364,"tts":1655656}, + {"args":{"data":{"frame":"4249F84F135F1AC71BD734840955AFAD","priority":"VeryHigh","requestId":"6D3A82B95DE242CC59BE6269DA343595","requestMethod":"GET","url":"http://localhost:8080/iframe-lcp.html"}},"cat":"devtools.timeline","name":"ResourceSendRequest","ph":"I","pid":16591,"s":"t","tid":775,"ts":10238845190,"tts":1656483}, + {"args":{"data":{"encodedDataLength":158,"frame":"4249F84F135F1AC71BD734840955AFAD","fromCache":false,"fromServiceWorker":false,"mimeType":"text/html","requestId":"6D3A82B95DE242CC59BE6269DA343595","responseTime":1606244936173.009,"statusCode":200,"timing":{"connectEnd":-1,"connectStart":-1,"dnsEnd":-1,"dnsStart":-1,"proxyEnd":-1,"proxyStart":-1,"pushEnd":0,"pushStart":0,"receiveHeadersEnd":568.032,"requestTime":10238.271278,"sendEnd":0.257,"sendStart":0.206,"sslEnd":-1,"sslStart":-1,"workerReady":-1,"workerStart":-1}}},"cat":"devtools.timeline","name":"ResourceReceiveResponse","ph":"I","pid":16591,"s":"t","tid":775,"ts":10238845664,"tts":1656957}, + {"args":{"data":{"columnNumber":1,"frame":"4249F84F135F1AC71BD734840955AFAD","lineNumber":1,"url":""}},"cat":"devtools.timeline","dur":1181,"name":"EvaluateScript","ph":"X","pid":16591,"tdur":1180,"tid":775,"ts":10238856503,"tts":1667796}, + {"args":{"data":{"columnNumber":1,"lineNumber":1,"notStreamedReason":"inline script","streamed":false,"url":""},"fileName":""},"cat":"v8,devtools.timeline","dur":93,"name":"v8.compile","ph":"X","pid":16591,"tdur":93,"tid":775,"ts":10238856510,"tts":1667802}, + {"args":{},"cat":"v8","dur":2,"name":"v8.compile","ph":"X","pid":16591,"tdur":2,"tid":775,"ts":10238857680,"tts":1668973}, + {"args":{"data":{"columnNumber":1,"frame":"4249F84F135F1AC71BD734840955AFAD","lineNumber":1,"url":""}},"cat":"devtools.timeline","dur":766,"name":"EvaluateScript","ph":"X","pid":16591,"tdur":766,"tid":775,"ts":10238857691,"tts":1668983}, + {"args":{"data":{"columnNumber":1,"lineNumber":1,"notStreamedReason":"inline script","streamed":false,"url":""},"fileName":""},"cat":"v8,devtools.timeline","dur":96,"name":"v8.compile","ph":"X","pid":16591,"tdur":97,"tid":775,"ts":10238857695,"tts":1668987}, + {"args":{},"cat":"v8","dur":1,"name":"v8.compile","ph":"X","pid":16591,"tdur":2,"tid":775,"ts":10238858454,"tts":1669746}, + {"args":{"data":{"columnNumber":1,"frame":"4249F84F135F1AC71BD734840955AFAD","lineNumber":1,"url":""}},"cat":"devtools.timeline","dur":1001,"name":"EvaluateScript","ph":"X","pid":16591,"tdur":1001,"tid":775,"ts":10238858464,"tts":1669757}, + {"args":{"data":{"columnNumber":1,"lineNumber":1,"notStreamedReason":"inline script","streamed":false,"url":""},"fileName":""},"cat":"v8,devtools.timeline","dur":77,"name":"v8.compile","ph":"X","pid":16591,"tdur":77,"tid":775,"ts":10238858468,"tts":1669760}, + {"args":{},"cat":"v8","dur":2,"name":"v8.compile","ph":"X","pid":16591,"tdur":2,"tid":775,"ts":10238859462,"tts":1670754}, + {"args":{"data":{"encodedDataLength":130,"frame":"4249F84F135F1AC71BD734840955AFAD","requestId":"6D3A82B95DE242CC59BE6269DA343595"}},"cat":"devtools.timeline","name":"ResourceReceivedData","ph":"I","pid":16591,"s":"t","tid":775,"ts":10238864869,"tts":1675388}, + {"args":{"data":{"decodedBodyLength":130,"didFail":false,"encodedDataLength":299,"finishTime":10238.839607,"requestId":"6D3A82B95DE242CC59BE6269DA343595"}},"cat":"devtools.timeline","name":"ResourceFinish","ph":"I","pid":16591,"s":"t","tid":775,"ts":10238866091,"tts":1676611}, + {"args":{},"cat":"disabled-by-default-devtools.timeline","dur":1607,"name":"RunTask","ph":"X","pid":16591,"tdur":1609,"tid":775,"ts":10238866244,"tts":1676762}, + {"args":{},"cat":"disabled-by-default-devtools.timeline","dur":8950,"name":"RunTask","ph":"X","pid":16591,"tdur":8937,"tid":775,"ts":10238867882,"tts":1678401}, + {"args":{"beginData":{"frame":"4249F84F135F1AC71BD734840955AFAD","startLine":0,"url":"http://localhost:8080/iframe-lcp.html"},"endData":{"endLine":-1}},"cat":"devtools.timeline","dur":8061,"name":"ParseHTML","ph":"X","pid":16591,"tdur":8048,"tid":775,"ts":10238868442,"tts":1678961}, + {"args":{"beginData":{"frame":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9","startLine":0,"url":"about:blank"},"endData":{"endLine":-1}},"cat":"devtools.timeline","dur":429,"name":"ParseHTML","ph":"X","pid":16591,"tdur":430,"tid":775,"ts":10238871994,"tts":1682499}, + {"args":{"data":{"type":"readystatechange"}},"cat":"devtools.timeline","dur":4,"name":"EventDispatch","ph":"X","pid":16591,"tdur":4,"tid":775,"ts":10238872459,"tts":1682965}, + {"args":{"data":{"type":"DOMContentLoaded"}},"cat":"devtools.timeline","dur":2,"name":"EventDispatch","ph":"X","pid":16591,"tdur":2,"tid":775,"ts":10238872469,"tts":1682974}, + {"args":{"data":{"frame":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9","isMainFrame":false,"page":"4249F84F135F1AC71BD734840955AFAD"}},"cat":"devtools.timeline","name":"MarkDOMContent","ph":"I","pid":16591,"s":"t","tid":775,"ts":10238872508,"tts":1683014}, + {"args":{"data":{"type":"readystatechange"}},"cat":"devtools.timeline","dur":4,"name":"EventDispatch","ph":"X","pid":16591,"tdur":3,"tid":775,"ts":10238872891,"tts":1683397}, + {"args":{"data":{"type":"beforeunload"}},"cat":"devtools.timeline","dur":5,"name":"EventDispatch","ph":"X","pid":16591,"tdur":5,"tid":775,"ts":10238873629,"tts":1684135}, + {"args":{"data":{"type":"readystatechange"}},"cat":"devtools.timeline","dur":4,"name":"EventDispatch","ph":"X","pid":16591,"tdur":4,"tid":775,"ts":10238874139,"tts":1684644}, + {"args":{"data":{"type":"DOMContentLoaded"}},"cat":"devtools.timeline","dur":486,"name":"EventDispatch","ph":"X","pid":16591,"tdur":484,"tid":775,"ts":10238874169,"tts":1684676}, + {"args":{"data":{"frame":"4249F84F135F1AC71BD734840955AFAD"}},"cat":"disabled-by-default-devtools.timeline","name":"InvalidateLayout","ph":"I","pid":16591,"s":"t","tid":775,"ts":10238874772,"tts":1685278}, + {"args":{"data":{"frame":"4249F84F135F1AC71BD734840955AFAD","isMainFrame":true,"page":"4249F84F135F1AC71BD734840955AFAD"}},"cat":"devtools.timeline","name":"MarkDOMContent","ph":"I","pid":16591,"s":"t","tid":775,"ts":10238875625,"tts":1686131}, + {"args":{},"cat":"disabled-by-default-devtools.timeline","dur":48269,"name":"RunTask","ph":"X","pid":16591,"tdur":47228,"tid":775,"ts":10238876852,"tts":1687357}, + {"args":{"beginData":{"dirtyObjects":8,"frame":"4249F84F135F1AC71BD734840955AFAD","partialLayout":false,"totalObjects":8},"endData":{"root":[0,0,980,0,980,1743,0,1743],"rootNode":4}},"cat":"devtools.timeline","dur":44205,"name":"Layout","ph":"X","pid":16591,"tdur":43182,"tid":775,"ts":10238876987,"tts":1687492}, + {"args":{"data":{"frame":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9"}},"cat":"disabled-by-default-devtools.timeline","name":"InvalidateLayout","ph":"I","pid":16591,"s":"t","tid":775,"ts":10238921160,"tts":1730642}, + {"args":{},"cat":"disabled-by-default-devtools.timeline","dur":13451,"name":"RunTask","ph":"X","pid":16591,"tdur":13445,"tid":775,"ts":10238925994,"tts":1735455}, + {"args":{"data":{"type":"pagehide"}},"cat":"devtools.timeline","dur":6,"name":"EventDispatch","ph":"X","pid":16591,"tdur":6,"tid":775,"ts":10238927217,"tts":1736678}, + {"args":{"data":{"type":"visibilitychange"}},"cat":"devtools.timeline","dur":4,"name":"EventDispatch","ph":"X","pid":16591,"tdur":4,"tid":775,"ts":10238927229,"tts":1736690}, + {"args":{"data":{"type":"webkitvisibilitychange"}},"cat":"devtools.timeline","dur":2,"name":"EventDispatch","ph":"X","pid":16591,"tdur":2,"tid":775,"ts":10238927236,"tts":1736697}, + {"args":{"data":{"type":"unload"}},"cat":"devtools.timeline","dur":6,"name":"EventDispatch","ph":"X","pid":16591,"tdur":5,"tid":775,"ts":10238927240,"tts":1736702}, + {"args":{"data":{"frame":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9","priority":"VeryHigh","requestId":"B83E07B94F6928B7B5786EB1E83CDF9D","requestMethod":"GET","url":"http://localhost:8080/frame.html"}},"cat":"devtools.timeline","name":"ResourceSendRequest","ph":"I","pid":16591,"s":"t","tid":775,"ts":10238928082,"tts":1737538}, + {"args":{"data":{"encodedDataLength":158,"frame":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9","fromCache":false,"fromServiceWorker":false,"mimeType":"text/html","requestId":"B83E07B94F6928B7B5786EB1E83CDF9D","responseTime":1606244936776.987,"statusCode":200,"timing":{"connectEnd":-1,"connectStart":-1,"dnsEnd":-1,"dnsStart":-1,"proxyEnd":-1,"proxyStart":-1,"pushEnd":0,"pushStart":0,"receiveHeadersEnd":0.78,"requestTime":10238.875237,"sendEnd":0.259,"sendStart":0.206,"sslEnd":-1,"sslStart":-1,"workerReady":-1,"workerStart":-1}}},"cat":"devtools.timeline","name":"ResourceReceiveResponse","ph":"I","pid":16591,"s":"t","tid":775,"ts":10238928100,"tts":1737557}, + {"args":{"data":{"columnNumber":1,"frame":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9","lineNumber":1,"url":""}},"cat":"devtools.timeline","dur":1199,"name":"EvaluateScript","ph":"X","pid":16591,"tdur":1200,"tid":775,"ts":10238936281,"tts":1745736}, + {"args":{"data":{"columnNumber":1,"lineNumber":1,"notStreamedReason":"inline script","streamed":false,"url":""},"fileName":""},"cat":"v8,devtools.timeline","dur":92,"name":"v8.compile","ph":"X","pid":16591,"tdur":91,"tid":775,"ts":10238936287,"tts":1745744}, + {"args":{},"cat":"v8","dur":2,"name":"v8.compile","ph":"X","pid":16591,"tdur":2,"tid":775,"ts":10238937476,"tts":1746932}, + {"args":{"data":{"columnNumber":1,"frame":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9","lineNumber":1,"url":""}},"cat":"devtools.timeline","dur":731,"name":"EvaluateScript","ph":"X","pid":16591,"tdur":732,"tid":775,"ts":10238937489,"tts":1746944}, + {"args":{"data":{"columnNumber":1,"lineNumber":1,"notStreamedReason":"inline script","streamed":false,"url":""},"fileName":""},"cat":"v8,devtools.timeline","dur":106,"name":"v8.compile","ph":"X","pid":16591,"tdur":106,"tid":775,"ts":10238937492,"tts":1746948}, + {"args":{},"cat":"v8","dur":1,"name":"v8.compile","ph":"X","pid":16591,"tdur":2,"tid":775,"ts":10238938217,"tts":1747672}, + {"args":{"data":{"columnNumber":1,"frame":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9","lineNumber":1,"url":""}},"cat":"devtools.timeline","dur":747,"name":"EvaluateScript","ph":"X","pid":16591,"tdur":747,"tid":775,"ts":10238938228,"tts":1747684}, + {"args":{"data":{"columnNumber":1,"lineNumber":1,"notStreamedReason":"inline script","streamed":false,"url":""},"fileName":""},"cat":"v8,devtools.timeline","dur":490,"name":"v8.compile","ph":"X","pid":16591,"tdur":490,"tid":775,"ts":10238938231,"tts":1747687}, + {"args":{},"cat":"v8","dur":1,"name":"v8.compile","ph":"X","pid":16591,"tdur":2,"tid":775,"ts":10238938972,"tts":1748427}, + {"args":{"main_frame_tree_node_id":2},"cat":"loading","name":"NavStartToLargestContentfulPaint::Invalidate::AllFrames::UKM","ph":"I","pid":16563,"s":"t","tid":775,"ts":10238940116,"tts":772478}, + {"args":{},"cat":"disabled-by-default-devtools.timeline","dur":1328,"name":"RunTask","ph":"X","pid":16591,"tdur":1264,"tid":775,"ts":10238940243,"tts":1749699}, + {"args":{"data":{"encodedDataLength":87,"frame":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9","requestId":"B83E07B94F6928B7B5786EB1E83CDF9D"}},"cat":"devtools.timeline","name":"ResourceReceivedData","ph":"I","pid":16591,"s":"t","tid":775,"ts":10238942625,"tts":1752018}, + {"args":{"data":{"decodedBodyLength":87,"didFail":false,"encodedDataLength":256,"finishTime":10238.876303,"requestId":"B83E07B94F6928B7B5786EB1E83CDF9D"}},"cat":"devtools.timeline","name":"ResourceFinish","ph":"I","pid":16591,"s":"t","tid":775,"ts":10238945107,"tts":1754496}, + {"args":{},"cat":"disabled-by-default-devtools.timeline","dur":8084,"name":"RunTask","ph":"X","pid":16591,"tdur":7842,"tid":775,"ts":10238946337,"tts":1755727}, + {"args":{"beginData":{"frame":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9","startLine":0,"url":"http://localhost:8080/frame.html"},"endData":{"endLine":-1}},"cat":"devtools.timeline","dur":8055,"name":"ParseHTML","ph":"X","pid":16591,"tdur":7814,"tid":775,"ts":10238946343,"tts":1755732}, + {"args":{"data":{"type":"readystatechange"}},"cat":"devtools.timeline","dur":4,"name":"EventDispatch","ph":"X","pid":16591,"tdur":4,"tid":775,"ts":10238947015,"tts":1756404}, + {"args":{"data":{"type":"DOMContentLoaded"}},"cat":"devtools.timeline","dur":4,"name":"EventDispatch","ph":"X","pid":16591,"tdur":4,"tid":775,"ts":10238947033,"tts":1756422}, + {"args":{"data":{"frame":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9"}},"cat":"disabled-by-default-devtools.timeline","name":"InvalidateLayout","ph":"I","pid":16591,"s":"t","tid":775,"ts":10238947450,"tts":1756839}, + {"args":{"data":{"type":"readystatechange"}},"cat":"devtools.timeline","dur":78,"name":"EventDispatch","ph":"X","pid":16591,"tdur":78,"tid":775,"ts":10238947958,"tts":1757348}, + {"args":{"data":{"type":"load"}},"cat":"devtools.timeline","dur":3,"name":"EventDispatch","ph":"X","pid":16591,"tdur":4,"tid":775,"ts":10238948046,"tts":1757435}, + {"args":{"data":{"type":"load"}},"cat":"devtools.timeline","dur":3,"name":"EventDispatch","ph":"X","pid":16591,"tdur":3,"tid":775,"ts":10238948063,"tts":1757452}, + {"args":{"data":{"frame":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9","isMainFrame":false,"page":"4249F84F135F1AC71BD734840955AFAD"}},"cat":"devtools.timeline","name":"MarkLoad","ph":"I","pid":16591,"s":"t","tid":775,"ts":10238948069,"tts":1757459}, + {"args":{"data":{"type":"pageshow"}},"cat":"devtools.timeline","dur":3,"name":"EventDispatch","ph":"X","pid":16591,"tdur":4,"tid":775,"ts":10238948097,"tts":1757486}, + {"args":{"beginData":{"dirtyObjects":5,"frame":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9","partialLayout":false,"totalObjects":5},"endData":{"root":[0,0,300,0,300,150,0,150],"rootNode":7}},"cat":"devtools.timeline","dur":5074,"name":"Layout","ph":"X","pid":16591,"tdur":4837,"tid":775,"ts":10238948107,"tts":1757496}, + {"args":{"data":{"type":"readystatechange"}},"cat":"devtools.timeline","dur":6,"name":"EventDispatch","ph":"X","pid":16591,"tdur":7,"tid":775,"ts":10238953649,"tts":1762800}, + {"args":{"data":{"type":"load"}},"cat":"devtools.timeline","dur":5,"name":"EventDispatch","ph":"X","pid":16591,"tdur":4,"tid":775,"ts":10238953667,"tts":1762819}, + {"args":{"data":{"frame":"4249F84F135F1AC71BD734840955AFAD","isMainFrame":true,"page":"4249F84F135F1AC71BD734840955AFAD"}},"cat":"devtools.timeline","name":"MarkLoad","ph":"I","pid":16591,"s":"t","tid":775,"ts":10238953684,"tts":1762835}, + {"args":{"data":{"type":"pageshow"}},"cat":"devtools.timeline","dur":4,"name":"EventDispatch","ph":"X","pid":16591,"tdur":4,"tid":775,"ts":10238953717,"tts":1762869}, + {"args":{"data":{"frame":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9","isMainFrame":false,"page":"4249F84F135F1AC71BD734840955AFAD"}},"cat":"devtools.timeline","name":"MarkDOMContent","ph":"I","pid":16591,"s":"t","tid":775,"ts":10238954365,"tts":1763513}, + {"args":{},"cat":"disabled-by-default-devtools.timeline","dur":2264,"name":"RunTask","ph":"X","pid":16591,"tdur":2252,"tid":775,"ts":10238957362,"tts":1766121}, + {"args":{"data":{"frame":"4249F84F135F1AC71BD734840955AFAD","priority":"High","requestId":"16591.3","requestMethod":"GET","url":"http://localhost:8080/favicon.ico"}},"cat":"devtools.timeline","name":"ResourceSendRequest","ph":"I","pid":16591,"s":"t","tid":775,"ts":10238958112,"tts":1766867}, + {"args":{},"cat":"disabled-by-default-devtools.timeline","dur":3614,"name":"RunTask","ph":"X","pid":16591,"tdur":3583,"tid":775,"ts":10238959685,"tts":1768431}, + {"args":{"data":{"durationInMilliseconds":696,"inMainFrame":false,"size":1897,"type":"text"},"main_frame_tree_node_id":2},"cat":"loading","name":"NavStartToLargestContentfulPaint::Candidate::AllFrames::UKM","ph":"I","pid":16563,"s":"t","tid":775,"ts":10238987002,"tts":779659}, + {"args":{},"cat":"disabled-by-default-devtools.timeline","dur":2380,"name":"RunTask","ph":"X","pid":16591,"tdur":2380,"tid":775,"ts":10239524341,"tts":2198836}, + {"args":{"data":{"encodedDataLength":129,"frame":"4249F84F135F1AC71BD734840955AFAD","fromCache":false,"fromServiceWorker":false,"mimeType":"text/plain","requestId":"16591.3","responseTime":1606244936860.823,"statusCode":404,"timing":{"connectEnd":-1,"connectStart":-1,"dnsEnd":-1,"dnsStart":-1,"proxyEnd":-1,"proxyStart":-1,"pushEnd":0,"pushStart":0,"receiveHeadersEnd":563.464,"requestTime":10238.959278,"sendEnd":0.291,"sendStart":0.225,"sslEnd":-1,"sslStart":-1,"workerReady":-1,"workerStart":-1}}},"cat":"devtools.timeline","name":"ResourceReceiveResponse","ph":"I","pid":16591,"s":"t","tid":775,"ts":10239525296,"tts":2199792}, + {"args":{"data":{"decodedBodyLength":0,"didFail":false,"encodedDataLength":129,"finishTime":10239.522919,"requestId":"16591.3"}},"cat":"devtools.timeline","name":"ResourceFinish","ph":"I","pid":16591,"s":"t","tid":775,"ts":10239526665,"tts":2201161}, + {"args":{"data":{"durationInMilliseconds":696,"inMainFrame":false,"size":1897,"type":"text"},"main_frame_tree_node_id":2},"cat":"loading","name":"NavStartToLargestContentfulPaint::Candidate::AllFrames::UKM","ph":"I","pid":16563,"s":"t","tid":775,"ts":10239987386,"tts":789454}, + {"args":{"data":{"durationInMilliseconds":696,"inMainFrame":false,"size":1897,"type":"text"},"main_frame_tree_node_id":2},"cat":"loading","name":"NavStartToLargestContentfulPaint::Candidate::AllFrames::UKM","ph":"I","pid":16563,"s":"t","tid":775,"ts":10240528038,"tts":789608}, + {"args":{},"cat":"disabled-by-default-devtools.timeline","dur":2834,"name":"RunTask","ph":"X","pid":16591,"tdur":2835,"tid":775,"ts":10244207242,"tts":5758907}, + {"args":{},"cat":"disabled-by-default-devtools.timeline","dur":2766,"name":"EvaluateScript","ph":"X","pid":16591,"tdur":2765,"tid":775,"ts":10244207269,"tts":5758935}, + {"args":{"data":{"columnNumber":1,"lineNumber":1,"notStreamedReason":"inline script","streamed":false,"url":""},"fileName":""},"cat":"v8,devtools.timeline","dur":631,"name":"v8.compile","ph":"X","pid":16591,"tdur":632,"tid":775,"ts":10244207359,"tts":5759024}, + {"args":{"microtask_count":2},"cat":"v8.execute","dur":132,"name":"RunMicrotasks","ph":"X","pid":16591,"tdur":131,"tid":775,"ts":10244209307,"tts":5760973}, + {"args":{"data":{"frame":"4249F84F135F1AC71BD734840955AFAD","singleShot":true,"stackTrace":[{"columnNumber":5,"functionName":"","lineNumber":12,"scriptId":"16","url":""}],"timeout":50,"timerId":1}},"cat":"devtools.timeline","name":"TimerInstall","ph":"I","pid":16591,"s":"t","tid":775,"ts":10244209412,"tts":5761077}, + {"args":{"microtask_count":1},"cat":"v8.execute","dur":566,"name":"RunMicrotasks","ph":"X","pid":16591,"tdur":567,"tid":775,"ts":10244209466,"tts":5761131}, + {"args":{"snapshot":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAHyARgDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAII/8QAGRABAAIDAAAAAAAAAAAAAAAAAAEDM3Kx/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/EABQRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/ANUgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi/BZrPAvwWazwBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIvwWazwL8Fms8AWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACL8Fms8C/BZrPAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi/BZrPAvwWazwBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIvwWazwL8Fms8AWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACL8Fms8C/BZrPAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi/BZrPAvwWazwBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIvwWazwL8Fms8AWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACL8Fms8C/BZrPAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi/BZrPAvwWazwBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIvwWazwL8Fms8AWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACL8Fms8C/BZrPAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi/BZrPAvwWazwBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIvwWazwL8Fms8AWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACL8Fms8C/BZrPAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi/BZrPAvwWazwBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIvwWazwL8Fms8AWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACL8Fms8C/BZrPAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi/BZrPAvwWazwBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIvwWazwL8Fms8AWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACL8Fms8C/BZrPAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi/BZrPAvwWazwBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIvwWazwL8Fms8AWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACL8Fms8C/BZrPAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi/BZrPAvwWazwBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIvwWazwL8Fms8AWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACL8Fms8C/BZrPAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi/BZrPAvwWazwBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIvwWazwL8Fms8AWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACL8Fms8C/BZrPAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi/BZrPAvwWazwBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIvwWazwAH/9k="},"cat":"disabled-by-default-devtools.screenshot","id":"0x1","name":"Screenshot","ph":"O","pid":16563,"tid":775,"ts":10238265752}, + {"args":{"data":{"documentLoaderURL":"http://localhost:8080/iframe-lcp.html","isLoadingMainFrame":true,"navigationId":"6D3A82B95DE242CC59BE6269DA343595"},"frame":"4249F84F135F1AC71BD734840955AFAD"},"cat":"blink.user_timing","name":"navigationStart","ph":"R","pid":16591,"tid":775,"ts":10238269760}, + {"args":{"data":{"documentLoaderURL":"","isLoadingMainFrame":false,"navigationId":"20FA5FE697706189B1E346BDBDCE7678"},"frame":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9"},"cat":"blink.user_timing","name":"navigationStart","ph":"R","pid":16591,"tid":775,"ts":10238870612}, + {"args":{"frame":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9"},"cat":"blink.user_timing,rail","name":"domContentLoadedEventEnd","ph":"R","pid":16591,"tid":775,"ts":10238872473}, + {"args":{"data":{"documentLoaderURL":"http://localhost:8080/frame.html","isLoadingMainFrame":false,"navigationId":"B83E07B94F6928B7B5786EB1E83CDF9D"},"frame":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9"},"cat":"blink.user_timing","name":"navigationStart","ph":"R","pid":16591,"tid":775,"ts":10238874037}, + {"args":{"frame":"4249F84F135F1AC71BD734840955AFAD"},"cat":"blink.user_timing,rail","name":"domContentLoadedEventEnd","ph":"R","pid":16591,"tid":775,"ts":10238874657}, + {"args":{"data":{"navigationId":"6D3A82B95DE242CC59BE6269DA343595"},"frame":"4249F84F135F1AC71BD734840955AFAD"},"cat":"loading,rail,devtools.timeline","name":"firstPaint","ph":"R","pid":16591,"tid":775,"ts":10238937930}, + {"args":{"data":{"navigationId":"6D3A82B95DE242CC59BE6269DA343595"},"frame":"4249F84F135F1AC71BD734840955AFAD"},"cat":"loading,rail,devtools.timeline","name":"firstContentfulPaint","ph":"R","pid":16591,"tid":775,"ts":10238937930}, + {"args":{"data":{"navigationId":"6D3A82B95DE242CC59BE6269DA343595"},"frame":"4249F84F135F1AC71BD734840955AFAD"},"cat":"loading,rail,devtools.timeline","name":"firstMeaningfulPaintCandidate","ph":"R","pid":16591,"tid":775,"ts":10238937930}, + {"args":{"data":{"candidateIndex":1,"isMainFrame":true,"navigationId":"6D3A82B95DE242CC59BE6269DA343595","nodeId":5,"size":388,"type":"text"},"frame":"4249F84F135F1AC71BD734840955AFAD"},"cat":"loading,rail,devtools.timeline","name":"largestContentfulPaint::Candidate","ph":"R","pid":16591,"tid":775,"ts":10238937930}, + {"args":{"data":{"navigationId":"6D3A82B95DE242CC59BE6269DA343595"},"frame":"4249F84F135F1AC71BD734840955AFAD"},"cat":"loading,rail,devtools.timeline","name":"firstMeaningfulPaint","ph":"R","pid":16591,"tid":775,"ts":10238937930}, + {"args":{"afterUserInput":0,"frame":"4249F84F135F1AC71BD734840955AFAD"},"cat":"loading,rail,devtools.timeline","name":"firstMeaningfulPaint","ph":"R","pid":16591,"tid":775,"ts":10238937930}, + {"args":{"snapshot":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAHyARgDASIAAhEBAxEB/8QAGwABAQEBAQEBAQAAAAAAAAAAAAIEAQUDBgj/xAAzEAEAAQIEAwYDBwUAAAAAAAAAAwECBDNysRESkQUUMlRh0SExQRM0UXFzorIGFSJCgv/EABQBAQAAAAAAAAAAAAAAAAAAAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwD+mYvtsRjMbb3i+yyKS22222lvy5La/Wn41ffu0vnJulvsjBW8uM7Qrx8Uttf2W0bAZu7S+cm6W+x3aXzk3S32aQGbu0vnJulvsd2l85N0t9mkBm7tL5ybpb7HdpfOTdLfZpAZu7S+cm6W+x3aXzk3S32aQGbu0vnJulvs+8XH7O3mrWtfxr9VJj8FAUAAAAAAAAAAAAAAAAAAAAACJ8iTTXYJ8iTTXYB8MJ96xn6lP4WtTLhPvWM/Up/C1qAAAAAAAAAcj8FHXLPBQHQAAAAAAAAAAAAAAAAAAAAARPkSaa7BPkSaa7AM2Cu5sZ2hTh4Zbafstq2MeFjvixeNvvtryyyW3W1p9acltN6Va+b0u6A6Oc3pd0Ob0u6A6Oc3pd0Ob0u6A6Oc3pd0Ob0u6A6Oc3pd0Ob0u6A65Z4aHN6XdHiY/tHtDB42kcXZ92Iw3Gz/ACspdxpzc3Gvy4fDhTqD3B5EPa2JvpBW7szE2faUrzUrTwcOPz/PhTqx1/qHG+GnYWO5vh/rXh4+X58Pw+P5UB+jH5/Fdu42CS/l7GxcsfC2tvJSvNxrS2tePw+lbq0/5q+kfbOLkhvu/tWKiusvstrS+2teNtb+WtacKfHhTjUHuDxML2l2jNjcPZdgOTD381ZLrqXUrHwrwpT5cK1rx3e2AAAAAAAAAAAAAAAACJ8iTTXYJ8iTTXYBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAInyJNNdgnyJNNdgFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAifIk012CfIk012AWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJ8iTTXYJ8iTTXYBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAInyJNNdgnyJNNdgFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAifIk012CfIk012AWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJ8iTTXYJ8iTTXYBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAInyJNNdgnyJNNdgFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAifIk012CfIk012AWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJ8iTTXYJ8iTTXYBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAInyJNNdgnyJNNdgFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAifIk012CfIk012AWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJ8iTTXYJ8iTTXYBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAInyJNNdgnyJNNdgFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAifIk012CfIk012AWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJ8iTTXYJ8iTTXYBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAInyJNNdgnyJNNdgFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAifIk012CfIk012AWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJ8iTTXYJ8iTTXYBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAInyJNNdgnyJNNdgFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAifIk012CfIk012AWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJ8iTTXYJ8iTTXYBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAInyJNNdgnyJNNdgFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAifIk012CfIk012AWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJ8iTTXYJ8iTTXYBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAInyJNNdgnyJNNdgFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAifIk012CfIk012AWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJ8iTTXYJ8iTTXYBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAInyJNNdgnyJNNdgFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAifIk012AB//2Q=="},"cat":"disabled-by-default-devtools.screenshot","id":"0x1","name":"Screenshot","ph":"O","pid":16563,"tid":775,"ts":10238941331}, + {"args":{"frame":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9"},"cat":"blink.user_timing,rail","name":"domContentLoadedEventEnd","ph":"R","pid":16591,"tid":775,"ts":10238947363}, + {"args":{"frame":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9"},"cat":"blink.user_timing","name":"loadEventEnd","ph":"R","pid":16591,"tid":775,"ts":10238948051}, + {"args":{"frame":"4249F84F135F1AC71BD734840955AFAD"},"cat":"blink.user_timing","name":"loadEventEnd","ph":"R","pid":16591,"tid":775,"ts":10238953674}, + {"args":{"data":{"navigationId":"B83E07B94F6928B7B5786EB1E83CDF9D"},"frame":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9"},"cat":"loading,rail,devtools.timeline","name":"firstPaint","ph":"R","pid":16591,"tid":775,"ts":10238966275}, + {"args":{"data":{"navigationId":"B83E07B94F6928B7B5786EB1E83CDF9D"},"frame":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9"},"cat":"loading,rail,devtools.timeline","name":"firstContentfulPaint","ph":"R","pid":16591,"tid":775,"ts":10238966275}, + {"args":{"data":{"navigationId":"B83E07B94F6928B7B5786EB1E83CDF9D"},"frame":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9"},"cat":"loading,rail,devtools.timeline","name":"firstMeaningfulPaintCandidate","ph":"R","pid":16591,"tid":775,"ts":10238966275}, + {"args":{"data":{"candidateIndex":1,"isMainFrame":false,"navigationId":"B83E07B94F6928B7B5786EB1E83CDF9D","nodeId":8,"size":1897,"type":"text"},"frame":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9"},"cat":"loading,rail,devtools.timeline","name":"largestContentfulPaint::Candidate","ph":"R","pid":16591,"tid":775,"ts":10238966275}, + {"args":{"data":{"navigationId":"B83E07B94F6928B7B5786EB1E83CDF9D"},"frame":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9"},"cat":"loading,rail,devtools.timeline","name":"firstMeaningfulPaint","ph":"R","pid":16591,"tid":775,"ts":10238966275}, + {"args":{"afterUserInput":0,"frame":"7A6B1A30E4E37EC3C7BDDF6D18DC64F9"},"cat":"loading,rail,devtools.timeline","name":"firstMeaningfulPaint","ph":"R","pid":16591,"tid":775,"ts":10238966275}, + {"args":{"snapshot":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAHyARgDASIAAhEBAxEB/8QAHAABAQACAwEBAAAAAAAAAAAAAAIBBAUGBwMI/8QANBABAAIBAgUCAwgBAwUAAAAAAAEDAgQRBRIzcrEGIRMxkQcUIjJBUWFxI0JU0RUWYoKi/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/EABQRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/AP0dreJUaO3WW8S4nhodNXbjXhlZlhjj+SMvnMf21qvUXBbcqoq9S6XObeb4cY3Vzz8uMZTt7e+2MxP9Sz6g4ZbxPg/qLS6auqzVajDLCn4k7RjnlTGMTvtO3zdP1PojjFv/AGbyV6aueFaK2nVzXqZwyysypiuJxmMfePwx89vYHcNN6g4NqssY03qTS2zlVN+MYXVzvXE7c/bv7bvvbxbh1PDbOIXcdqr0NWfw878864wwy322mZjaJ39nl/Bvs349p9JotNxHS6C+ivgUcKuxw1meOWWfxozmccoxiY9vlP7ud4x6L49q/sl4p6b+916ziOot/wANuqt94rizHLH4mcY/iyjHHbfYHd6dfpL9XGlp4zjnqJxnKK8csJymI239tv03j6w0J9T8BibIn1Ro4muJyz/z1fhiInLef29omf6hw/pv0rxPh/rTU8XnONNotV8XLUaOL5urysymOWzCJiJwymInm2naf2aXF/RfFNTf67+76fQxVxfSV0aDe2Y5MsassJnKOX8Mfin5b+wOz2eo+CVxZNnqbSYxXXhbnM3VRy4Z/lyn9on9J/Vyehtq19eeei4pN+GGXJlNc4ZRGX7T7fN5FxH7NfUd2n45XTGlynXcM4fo8Js1mUzjnRnOWfvye0e/t/T1P0hodbw7h9un1+GETjbPw8/izbnZjPvzZ5bR777x/UQDk/u1v+8u+mP/AAfdrf8AeXfTH/hsgNb7tb/vLvpj/wAPvVv8PHmmZn95/VSa/wAkAoAAAAAAAAAAAAAAAAAAAAAEX9CztnwF/Qs7Z8AOg/azxjWcC9I8T13DNbOj1eOs0+GOcTjG8ZZYYzH4omPeJn9HQ/tD9W+p/TvEtDTRxbV4WajhWo1llUxTZGmzi2qMc8tsN8sMYyz3295iN/03e40YY2ajWRnjjlHxMfaY3/0YtnKqvKd8q8JnbbeY/T9geb8Y9eZaD1Z6e5NXp7uAajL7jq764/DGoswjKvLm+UR7bbf+bqHGfWnqTh/COO6WeK5ZTTrqr9LxTkr2nS2X/D+FvtyzlE45R8t9vd7v8Grbb4eG2++3LHzJpqnHlmvCcf25Y2B5N6F9Ua/iHrXi+i4hxuc9Jp+L36bSYzZVM3Y414zFXLGPN7b5Zc2/+lv8M9X3af1R6902q4njqMtFqKaOGaPPLCJnPOiMvh4xEc2UznO367PSsaascubGvCMt994xjc+DVz83w8ObfffljfcHjHF/VHFMPsdt9R1epM6uOYcOm67TxjV/iunPHeOWcd8eWd8dp+f9vR/Q2HGo4bqLOO6uvVRddNuknGcZyxonGNoynGIiZ35p3iPlMfNz/wACnbKPhV7Zfm/DHv8A2+kRERERG0QAAAxX+SGWMPyQDIAAAAAAAAAAAAAAAAAAAAAIv6FnbPgL+hZ2z4Aa2iy5tZxCNvy24x/8Yy3Gnpa86tXrc88Z5bbMcsZj9Y5MY8xLb5v4y+gMjHN/GX0Ob+MvoDIxzfxl9Dm/jL6AyMc38ZfQ5v4y+gMjHN/GX0Ob+MvoDLGH5YOb+Mvo4TX8R4ho9bFdXD8tRpt8PxYRlvHNzbz8tvbaPqDnBxFPFtTnFE5cM1OHxInmiY/Jtv8AP+9o+rTn1DrfyxwLXc3t/pnb8/L89v29/wCoB2Mdf1XHdbRZny8G1dte2M48kTzbzGMzv7fpOUx/6y+lfGdXZTnl/wBK1VWWGeGMxnjM74znyzMbR77RvIOcHCaXiXEbtbp8MtByafPmmzLKMomvadoj5bTM7+XNgAAAAAAAAAAAAAAAAi/oWds+Av6FnbPgBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIv6FnbPgL+hZ2z4AWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACL+hZ2z4C/oWds+AFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi/oWds+Av6FnbPgBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIv6FnbPgL+hZ2z4AWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACL+hZ2z4C/oWds+AFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi/oWds+Av6FnbPgBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIv6FnbPgL+hZ2z4AWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACL+hZ2z4C/oWds+AFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi/oWds+Av6FnbPgBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIv6FnbPgL+hZ2z4AWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACL+hZ2z4C/oWds+AFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi/oWds+Av6FnbPgBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIv6FnbPgL+hZ2z4AWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACL+hZ2z4C/oWds+AFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi/oWds+Av6FnbPgBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIv6FnbPgL+hZ2z4AWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACL+hZ2z4C/oWds+AFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi/oWds+Av6FnbPgBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIv6FnbPgL+hZ2z4AWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACL+hZ2z4C/oWds+AFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi/oWds+Av6FnbPgBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIv6FnbPgL+hZ2z4AWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACL+hZ2z4C/oWds+AFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi/oWds+Av6FnbPgBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIv6FnbPgL+hZ2z4AWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACL+hZ2z4C/oWds+AFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi/oWds+Av6FnbPgBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIv6FnbPgL+hZ2z4AWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACL+hZ2z4AB//2Q=="},"cat":"disabled-by-default-devtools.screenshot","id":"0x1","name":"Screenshot","ph":"O","pid":16563,"tid":775,"ts":10238974697}, + {"args":{"number":12},"cat":"__metadata","name":"num_cpus","ph":"M","pid":16563,"tid":0,"ts":10244263947}, + {"args":{"number":12},"cat":"__metadata","name":"num_cpus","ph":"M","pid":16583,"tid":0,"ts":10244263950}, + {"args":{"number":12},"cat":"__metadata","name":"num_cpus","ph":"M","pid":16591,"tid":0,"ts":10244263955}, + {"args":{"sort_index":-6},"cat":"__metadata","name":"process_sort_index","ph":"M","pid":16563,"tid":775,"ts":10244263962}, + {"args":{"uptime":8},"cat":"__metadata","name":"process_uptime_seconds","ph":"M","pid":16563,"tid":775,"ts":10244263964}, + {"args":{"sort_index":-1},"cat":"__metadata","name":"process_sort_index","ph":"M","pid":16583,"tid":44291,"ts":10244263981}, + {"args":{"uptime":8},"cat":"__metadata","name":"process_uptime_seconds","ph":"M","pid":16583,"tid":44291,"ts":10244263984}, + {"args":{"sort_index":-5},"cat":"__metadata","name":"process_sort_index","ph":"M","pid":16591,"tid":19715,"ts":10244263995}, + {"args":{"uptime":7},"cat":"__metadata","name":"process_uptime_seconds","ph":"M","pid":16591,"tid":19715,"ts":10244263997}, + {"args":{"labels":"Subframe: http://localhost"},"cat":"__metadata","name":"process_labels","ph":"M","pid":16591,"tid":19715,"ts":10244263999}, + {"args":{"sort_index":-1},"cat":"__metadata","name":"thread_sort_index","ph":"M","pid":16591,"tid":775,"ts":10244264001} + ] +} \ No newline at end of file diff --git a/lighthouse-core/test/lib/tracehouse/trace-processor-test.js b/lighthouse-core/test/lib/tracehouse/trace-processor-test.js index f0544bdceae9..36326d444c40 100644 --- a/lighthouse-core/test/lib/tracehouse/trace-processor-test.js +++ b/lighthouse-core/test/lib/tracehouse/trace-processor-test.js @@ -20,6 +20,7 @@ const noFCPtrace = require('../../fixtures/traces/airhorner_no_fcp.json'); const noNavStartTrace = require('../../fixtures/traces/no_navstart_event.json'); const backgroundTabTrace = require('../../fixtures/traces/backgrounded-tab-missing-paints.json'); const lcpTrace = require('../../fixtures/traces/lcp-m78.json'); +const lcpAllFramesTrace = require('../../fixtures/traces/lcp-all-frames-m89.json'); /* eslint-env jest */ @@ -435,6 +436,80 @@ Object { }); }); + describe('finds correct LCP from all frames', () => { + it('in a trace', () => { + const trace = TraceProcessor.computeTraceOfTab(lcpAllFramesTrace); + expect({ + 'firstContentfulPaintEvt.ts': trace.firstContentfulPaintEvt.ts, + 'largestContentfulPaintEvt.ts': trace.largestContentfulPaintEvt.ts, + 'mainFrameIds.frameId': trace.mainFrameIds.frameId, + 'timeOriginEvt.ts': trace.timeOriginEvt.ts, + 'timestamps.firstContentfulPaint': trace.timestamps.firstContentfulPaint, + 'timestamps.largestContentfulPaint': trace.timestamps.largestContentfulPaint, + 'timestamps.largestContentfulPaintAllFrames': trace.timestamps.largestContentfulPaintAllFrames, // eslint-disable-line max-len + 'timings.firstContentfulPaint': trace.timings.firstContentfulPaint, + 'timings.largestContentfulPaint': trace.timings.largestContentfulPaint, + 'timings.largestContentfulPaintAllFrames': trace.timings.largestContentfulPaintAllFrames, + }).toMatchInlineSnapshot(` + Object { + "firstContentfulPaintEvt.ts": 10238937930, + "largestContentfulPaintEvt.ts": 10238937930, + "mainFrameIds.frameId": "4249F84F135F1AC71BD734840955AFAD", + "timeOriginEvt.ts": 10238269760, + "timestamps.firstContentfulPaint": 10238937930, + "timestamps.largestContentfulPaint": 10238937930, + "timestamps.largestContentfulPaintAllFrames": 10240528038, + "timings.firstContentfulPaint": 668.17, + "timings.largestContentfulPaint": 668.17, + "timings.largestContentfulPaintAllFrames": 2258.278, + } + `); + }); + + it('ignores main frame LCP events', () => { + const testTrace = createTestTrace({timeOrigin: 0, traceEnd: 2000}); + const frame = testTrace.traceEvents[0].args.frame; + const args = {frame}; + const cat = 'loading,rail,devtools.timeline'; + testTrace.traceEvents.push( + /* eslint-disable max-len */ + {name: 'largestContentfulPaint::Candidate', cat, args, ts: 1000, duration: 10}, + {name: 'NavStartToLargestContentfulPaint::Candidate::AllFrames::UKM', cat, args, ts: 1100, duration: 10}, + {name: 'NavStartToLargestContentfulPaint::Invalidate::AllFrames::UKM', cat, args, ts: 1200, duration: 10}, + {name: 'largestContentfulPaint::Invalidate', cat, args, ts: 1300, duration: 10}, + {name: 'largestContentfulPaint::Candidate', cat, args, ts: 1400, duration: 10}, + {name: 'NavStartToLargestContentfulPaint::Candidate::AllFrames::UKM', cat, args, ts: 1500, duration: 10} + /* eslint-enable max-len */ + ); + const trace = TraceProcessor.computeTraceOfTab(testTrace); + assert.equal(trace.timestamps.largestContentfulPaint, 1400); + assert.equal(trace.timestamps.largestContentfulPaintAllFrames, 1500); + assert.ok(!trace.lcpInvalidated); + assert.ok(!trace.lcpAllFramesInvalidated); + }); + + it('invalidates even if main frame LCP is available', () => { + const testTrace = createTestTrace({timeOrigin: 0, traceEnd: 2000}); + const frame = testTrace.traceEvents[0].args.frame; + const args = {frame}; + const cat = 'loading,rail,devtools.timeline'; + testTrace.traceEvents.push( + /* eslint-disable max-len */ + {name: 'largestContentfulPaint::Candidate', cat, args, ts: 1000, duration: 10}, + {name: 'NavStartToLargestContentfulPaint::Candidate::AllFrames::UKM', cat, args, ts: 1100, duration: 10}, + {name: 'NavStartToLargestContentfulPaint::Invalidate::AllFrames::UKM', cat, args, ts: 1200, duration: 10}, + {name: 'largestContentfulPaint::Invalidate', cat, args, ts: 1300, duration: 10}, + {name: 'largestContentfulPaint::Candidate', cat, args, ts: 1400, duration: 10} + /* eslint-enable max-len */ + ); + const trace = TraceProcessor.computeTraceOfTab(testTrace); + assert.equal(trace.timestamps.largestContentfulPaint, 1400); + assert.equal(trace.timestamps.largestContentfulPaintAllFrames, undefined); + assert.ok(!trace.lcpInvalidated); + assert.ok(trace.lcpAllFramesInvalidated); + }); + }); + it('handles traces missing a paints (captured in background tab)', () => { const trace = TraceProcessor.computeTraceOfTab(backgroundTabTrace); assert.equal(trace.mainFrameIds.frameId, '0x53965941e30'); diff --git a/lighthouse-core/test/results/sample_v2.json b/lighthouse-core/test/results/sample_v2.json index eff0c0caf24f..06adc95953c2 100644 --- a/lighthouse-core/test/results/sample_v2.json +++ b/lighthouse-core/test/results/sample_v2.json @@ -1469,7 +1469,8 @@ "observedSpeedIndexTs": 185607736763 }, { - "lcpInvalidated": false + "lcpInvalidated": false, + "lcpAllFramesInvalidated": false } ] } @@ -5828,6 +5829,12 @@ "duration": 100, "entryType": "measure" }, + { + "startTime": 0, + "name": "lh:computed:LargestContentfulPaintAllFrames", + "duration": 100, + "entryType": "measure" + }, { "startTime": 0, "name": "lh:audit:offline-start-url", diff --git a/types/artifacts.d.ts b/types/artifacts.d.ts index cf5e71198bed..6f60b956a262 100644 --- a/types/artifacts.d.ts +++ b/types/artifacts.d.ts @@ -597,6 +597,7 @@ declare global { firstContentfulPaint: number; firstMeaningfulPaint?: number; largestContentfulPaint?: number; + largestContentfulPaintAllFrames?: number; traceEnd: number; load?: number; domContentLoaded?: number; @@ -625,6 +626,8 @@ declare global { firstMeaningfulPaintEvt?: TraceEvent; /** The trace event marking largestContentfulPaint, if it was found. */ largestContentfulPaintEvt?: TraceEvent; + /** The trace event marking largestContentfulPaint from all frames, if it was found. */ + largestContentfulPaintAllFramesEvt?: TraceEvent; /** The trace event marking loadEventEnd, if it was found. */ loadEvt?: TraceEvent; /** The trace event marking domContentLoadedEventEnd, if it was found. */ @@ -636,6 +639,8 @@ declare global { fmpFellBack: boolean; /** Whether LCP was invalidated without a new candidate. */ lcpInvalidated: boolean; + /** Whether LCP from all frames was invalidated without a new candidate. */ + lcpAllFramesInvalidated: boolean; } /** Information on a tech stack (e.g. a JS library) used by the page. */ @@ -666,6 +671,8 @@ declare global { firstMeaningfulPaintTs: number | undefined; largestContentfulPaint: number | undefined; largestContentfulPaintTs: number | undefined; + largestContentfulPaintAllFrames: number | undefined; + largestContentfulPaintAllFramesTs: number | undefined; firstCPUIdle: number | undefined; firstCPUIdleTs: number | undefined; interactive: number | undefined; @@ -690,6 +697,8 @@ declare global { observedFirstMeaningfulPaintTs: number | undefined; observedLargestContentfulPaint: number | undefined; observedLargestContentfulPaintTs: number | undefined; + observedLargestContentfulPaintAllFrames: number | undefined; + observedLargestContentfulPaintAllFramesTs: number | undefined; observedTraceEnd: number | undefined; observedTraceEndTs: number | undefined; observedLoad: number | undefined;