Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

core(driver): pause after FCP event before resolving load #10505

Merged
merged 8 commits into from
Mar 27, 2020

Conversation

patrickhulce
Copy link
Collaborator

@patrickhulce patrickhulce commented Mar 25, 2020

Summary
TTI needs at least 5s of quiet after FCP in order to be computed for observed metrics. Currently we wait for 5s after load, network quiet, and CPU quiet and in a vast majority of cases at least one of these occurs at or after FCP so it doesn't matter, but in some cases it does. This PR updates our logic to wait 5s after FCP as well before resolving the page as "loaded"

Related Issues/PRs
fixes #10503

@patrickhulce patrickhulce requested a review from a team as a code owner March 25, 2020 17:35
@patrickhulce patrickhulce requested review from connorjclark and removed request for a team March 25, 2020 17:35
@vercel vercel bot temporarily deployed to Preview March 25, 2020 20:07 Inactive
@patrickhulce
Copy link
Collaborator Author

Alright @mattzeunert I was 2/2 on reproing that URL before this change and 0/10 with this change. Any more complicated URL that prompted your investigation you want to try before we merge? :)

@mattzeunert
Copy link
Contributor

Looks good to me. Thanks for the quick fix @patrickhulce!

@patrickhulce patrickhulce merged commit f1216f9 into master Mar 27, 2020
@patrickhulce patrickhulce deleted the wait_for_fcp branch March 27, 2020 15:02
Copy link
Member

@brendankenny brendankenny left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm too late! There may be a few things in here still worth addressing

@@ -26,6 +26,22 @@ module.exports = [
},
},
},
{
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it suspicious that the above expectations didn't change after dropping any throttling? Were the bounds just really really loose? Should we switch to a ± assertion for them?

},
'interactive': {
// FCP at ~5 seconds out
numericValue: '>4900',
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same for these bounds...doesn't really differentiate between ~5 seconds and ~30 seconds, but will flakiness prevent us from putting a useful upper bound?

@@ -65,7 +65,7 @@ const smokeTests = [{
}, {
id: 'metrics',
expectations: require('./tricky-metrics/expectations.js'),
config: require('../../../../lighthouse-core/config/perf-config.js'),
config: require('../../../../lighthouse-core/config/no-throttling-config.js'),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe it would be good to document why this config is being used here for future reference? e.g. I'm pretty sure we only used perf-config here because it was a convenient, preexisting config to check out the perf category with devtools throttling, but if there were more specific tricky reasons as well, I would have long forgotten them by now :)

(I assume from the comment in tricky-tti-late-fcp.html the test would fail if switching to a different throttling, but that might not always be the case)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe it would be good to document why this config is being used here for future reference?

Or would that comment make more sense in the expectations file instead? Since it would allow a comment per test url, but authors are still likely to look there if changing things (whereas they might not look at comments in the html fixture until a test actually starts failing).

Don't throw things at me if this is yet another thing your smokehouse refactor would have made easy 😬

@@ -83,6 +83,7 @@ const defaultPassConfig = {
loadFailureMode: 'fatal',
recordTrace: false,
useThrottling: false,
pauseAfterFcpMs: 0,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should probably document sometime why these are defaulted to 0 in here but then all have non-0 defaults in default-config.js :)

@@ -0,0 +1,17 @@
/**
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is the intention for this to be for testing only? Consider moving to lighthouse-cli/test/smokehouse/test-definitions/?

'use strict';

/** @type {LH.Config.Json} */
const perfConfig = {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

rename? (we already ended up with two perf-config.jss already, and I think I'm responsible for that terrible decision, but we can at least avoid a third perfConfig local name :)

@@ -649,10 +651,11 @@ class Driver {

/**
* Returns a promise that resolve when a frame has a FCP.
* @param {number} pauseAfterFcpMs
* @param {number} maxWaitForFCPMs
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  * @param {number} pauseAfterFcpMs
  * @param {number} maxWaitForFCPMs

🥴capitalization

let maxWaitMs = passContext.settings && passContext.settings.maxWaitForLoad;
let maxFCPMs = passContext.settings && passContext.settings.maxWaitForFcp;

/* eslint-disable max-len */
if (typeof pauseAfterFcpMs !== 'number') pauseAfterFcpMs = DEFAULT_PAUSE_AFTER_FCP;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should really clean this up as well, after all the effort we go through to get our settings and constants in order before loading a page :)

It looks like these will not be set only if a passContext wasn't passed in, and we don't pass in a passContext only when we're loading blankPage, which ends up mostly doing _waitForNothing, so it doesn't need defaults for these anyways :)

@@ -92,6 +93,7 @@ const defaultPassConfig = {
};

const nonSimulatedPassConfigOverrides = {
pauseAfterFcpMs: 5250,
pauseAfterLoadMs: 5250,
networkQuietThresholdMs: 5250,
cpuQuietThresholdMs: 5250,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe we could have gotten away with a single pauseAfterLoadingLandmark that just waits that much after the last of these, but there's probably unavoidable trickery in there, and that ship sailed a long time ago regardless

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
6 participants