-
Notifications
You must be signed in to change notification settings - Fork 28.6k
[web] Add onEntrypointLoaded to FlutterLoader. #108776
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
[web] Add onEntrypointLoaded to FlutterLoader. #108776
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good! I had a few questions about some bits, not sure if they are real concerns or whether I just don't have the context yet on the approach.
packages/flutter_tools/lib/src/web/file_generators/flutter_js.dart
Outdated
Show resolved
Hide resolved
packages/flutter_tools/lib/src/web/file_generators/flutter_js.dart
Outdated
Show resolved
Hide resolved
packages/flutter_tools/lib/src/web/file_generators/flutter_js.dart
Outdated
Show resolved
Hide resolved
} | ||
}); | ||
// Once the entrypoint is ready, do things! | ||
_flutter.loader.onEntrypointLoaded(async function(event) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It seems to me like it would be more natural to just await the promise that loadEntrypoint
returns rather than having a disconnected callback. Is there a reason for this pattern over a standard promise await? Also, it doesn't seem like there is a mechanism to unsubscribe from these events.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You know I'm realizing your description in the PR talks about this a lot and I didn't actually read it. Let me read through that.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
TL;DR: The didCreateEngineInitializer
method may be called multiple times in Dev (once per hot-restart). However the promise returned by loadEntrypoint cannot be re-created, so the code breaks with a "Promise already resolved" error when you attempt to hot-restart.
The only solution I could come up with is to make an onEntrypointLoaded
event stream, so every time that flutter tells you: "Hey, I have a fresh engine ready to be initialized" JS actually does initialize it :)
(The previous version relied on flutter's ability to auto-start if it didn't find the didCreateEngineInitializer
callback in the DOM, by deleting it after the first load. The problem with that is that any special parameters that you passed to initializeEngine
and runApp
on first load, wouldn't be passed in subsequent restarts)
packages/flutter_tools/lib/src/web/file_generators/flutter_js.dart
Outdated
Show resolved
Hide resolved
PTAL @eyebrowsoffire, I think this addresses most of what we discussed earlier. I also took a little bit of extra time to separate the "injecting the entrypoint" bit from the core loader, so it can also be (eventually) easily overridden. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just one small thing but otherwise looks good!
packages/flutter_tools/lib/src/web/file_generators/flutter_js.dart
Outdated
Show resolved
Hide resolved
Also: untangle service worker loader code to its own class, ServiceWorkerLoader so it can be modularized/overridden later.
…. FlutterLoader is now super nice and tiny!
(Force-push after rebase with master) |
() => runWebServiceWorkerTestWithCachingResources(headless: true, testType: ServiceWorkerTestType.withoutFlutterJs), | ||
() => runWebServiceWorkerTestWithCachingResources(headless: true, testType: ServiceWorkerTestType.withFlutterJs), | ||
() => runWebServiceWorkerTestWithCachingResources(headless: true, testType: ServiceWorkerTestType.withFlutterJsShort), | ||
() => runWebServiceWorkerTestWithCachingResources(headless: true, testType: ServiceWorkerTestType.withFlutterJsEntrypointLoadedEvent), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm starting to wonder if the "ServiceWorkerTest" has become a misnomer at this point. We seem to be testing all sorts loading scenarios, whether service-worker related or not.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Indeed, I created this a while ago:
* M3 counter error style * polish * Update text_field_template.dart * Roll Flutter Engine from 3cba105 to cf0db3e (1 revision) (#108716) * resolve comments * Roll Plugins from 257eacb1e2aa to a6d42f1e01d3 (3 revisions) (#108738) * Override PlaceholderDimensions equality operator to avoid unnecessary TextPainter re-layouts (#108623) * Roll Flutter Engine from cf0db3e to aa90044 (1 revision) (#108734) * Roll Flutter Engine from aa90044 to 6d2fd23 (5 revisions) (#108744) * Fix lerp to eccentric circle. (#108743) * Roll Flutter Engine from 6d2fd23 to f182794 (4 revisions) (#108749) * Roll Flutter Engine from f182794 to 25e8021 (1 revision) (#108751) * Sync with flutter/.github#13 (#108754) * Roll Flutter Engine from 25e8021 to e771729 (2 revisions) (#108755) * clean-up analysis_options.yaml (#108747) * Fix ExpansionTile shows children background when expanded (#107834) * Create `containsSemantics` to allow for partial matching of semantics in tests. (#108573) * Roll Flutter Engine from e771729 to 7d0f6d2 (2 revisions) (#108757) * Enable conditional_uri_does_not_exist (#108652) * Roll Flutter Engine from 7d0f6d2 to b257966 (3 revisions) (#108763) * Roll Flutter Engine from b257966 to 60e5eb6 (3 revisions) (#108766) * Reland `Linux_samsung_a02 openpay_benchmarks__scroll_perf` (#108466) (#108769) * [SelectionOverlay]Move the debug statement to the scope of the assertion. (#108508) * Roll Flutter Engine from 60e5eb6 to 1c3b1b3 (11 revisions) (#108780) * Roll Flutter Engine from 1c3b1b3 to b607811 (1 revision) (#108782) * Roll Flutter Engine from b607811 to 3b2bd24 (1 revision) (#108784) * Roll Flutter Engine from 3b2bd24 to 0e5392c (1 revision) (#108788) * Roll Flutter Engine from 0e5392c to 4b19256 (1 revision) (#108793) * Roll Flutter Engine from 4b19256 to e0b5edc (2 revisions) (#108798) * Roll Flutter Engine from e0b5edc to b164c5c (1 revision) (#108814) * Update text_field.dart * Roll Flutter Engine from b164c5c to eb2b57b (4 revisions) (#108821) * Roll Plugins from a6d42f1e01d3 to 0d6d03a94ed5 (1 revision) (#108822) * Roll Flutter Engine from eb2b57b to 978d8e2 (2 revisions) (#108825) * Loupe Android + iOS (#107477) * added Magnifier for iOS and Android * Mark `Mac_ios microbenchmarks_ios_flaky` flaky (#108820) * Deprecate `toggleableActiveColor` (#97972) * Roll Flutter Engine from 978d8e2 to 2b31732 (4 revisions) (#108830) * [flutter_tools] Test that DAP process terminates at the end of a session (#108301) * Roll Flutter Engine from 2b31732 to 4e9c869 (1 revision) (#108833) * fix noop toString() diagnostics (#108836) * [flutter_tools] Migrate more tool tests to null-safety (#108639) * Revert "Fix ExpansionTile shows children background when expanded" (#108844) * Roll Flutter Engine from 4e9c869 to 6724561 (2 revisions) (#108838) * Marks Linux_android clipper_cache_perf__e2e_summary to be unflaky (#104088) * Update documentation to match implementation (#108843) * Reland "Add shadowColor and surfaceTintColor to Dialog and DialogTheme." #108718 * Roll Flutter Engine from 6724561 to f3deaba (8 revisions) (#108847) * Roll Flutter Engine from f3deaba to c07e1ac (2 revisions) (#108849) * Roll Flutter Engine from c07e1ac to a1e77ae (5 revisions) (#108850) * Roll Flutter Engine from a1e77ae to c456476 (2 revisions) (#108853) * Roll Flutter Engine from c456476 to 6cd744b (1 revision) (#108857) * Roll Flutter Engine from 6cd744b to 51296a6 (1 revision) (#108860) * Roll Flutter Engine from 51296a6 to 05228ad (1 revision) (#108862) * Revert "Roll Flutter Engine from 51296a6 to 05228ad (1 revision) (#108862)" (#108882) This reverts commit a880c4e. * Roll Plugins from 0d6d03a94ed5 to e74c42028d39 (5 revisions) (#108887) * Roll Flutter Engine from 51296a6 to 2c28298 (6 revisions) (#108899) * [flutter_test] Add flag to send device pointer events to the framework (#108430) * Roll Flutter Engine from 2c28298 to adba702 (2 revisions) (#108903) * fix flutter not finding custom device (#108884) * Force a11y services to off for complex_layout_semantics_perf test (#108906) * Update `equalsIgnoringHashCodes` to take a list of Strings (#108507) * [macOS] Use editing intents from engine (#105407) * Added `IconButtonTheme` and apply it to `IconButton` in M3 (#108332) * Created IconButtonTheme and apply it to IconButton * [web] Add onEntrypointLoaded to FlutterLoader. (#108776) * Roll pub packages (#108919) * [flutter_test] perf: find.ancestor (#108868) * Roll Flutter Engine from adba702 to 1188a80 (4 revisions) (#108922) * Bump github/codeql-action from 2.1.17 to 2.1.18 (#108923) * Remove some outdated ignores from framework (#108915) * Roll Flutter Engine from 1188a80 to 1743d1d (1 revision) (#108925) * Clean up ScrollbarPainter (#107179) * Remove outdated ignores (#108924) * Add more logs to diagnose Gold flake (#108930) * M3 counter error style * polish * Update text_field_template.dart * resolve comments * Update text_field.dart Co-authored-by: engine-flutter-autoroll <[email protected]> Co-authored-by: Tomasz Gucio <[email protected]> Co-authored-by: Greg Spencer <[email protected]> Co-authored-by: Ian Hickson <[email protected]> Co-authored-by: Michael Goderbauer <[email protected]> Co-authored-by: Bruno Leroux <[email protected]> Co-authored-by: pdblasi-google <[email protected]> Co-authored-by: Kaushik Iska <[email protected]> Co-authored-by: xubaolin <[email protected]> Co-authored-by: Anthony Oleinik <[email protected]> Co-authored-by: keyonghan <[email protected]> Co-authored-by: Taha Tesser <[email protected]> Co-authored-by: Danny Tuppeny <[email protected]> Co-authored-by: Phil Quitslund <[email protected]> Co-authored-by: Christopher Fujino <[email protected]> Co-authored-by: Kate Lovett <[email protected]> Co-authored-by: Flutter GitHub Bot <[email protected]> Co-authored-by: parkershepherd <[email protected]> Co-authored-by: Darren Austin <[email protected]> Co-authored-by: Zachary Anderson <[email protected]> Co-authored-by: Jia Hao <[email protected]> Co-authored-by: Hannes Winkler <[email protected]> Co-authored-by: Matej Knopp <[email protected]> Co-authored-by: Qun Cheng <[email protected]> Co-authored-by: David Iglesias <[email protected]> Co-authored-by: Pascal Welsch <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* M3 counter error style * polish * Update text_field_template.dart * Roll Flutter Engine from 3cba105 to cf0db3e (1 revision) (flutter#108716) * resolve comments * Roll Plugins from 257eacb1e2aa to a6d42f1e01d3 (3 revisions) (flutter#108738) * Override PlaceholderDimensions equality operator to avoid unnecessary TextPainter re-layouts (flutter#108623) * Roll Flutter Engine from cf0db3e to aa90044 (1 revision) (flutter#108734) * Roll Flutter Engine from aa90044 to 6d2fd23 (5 revisions) (flutter#108744) * Fix lerp to eccentric circle. (flutter#108743) * Roll Flutter Engine from 6d2fd23 to f182794 (4 revisions) (flutter#108749) * Roll Flutter Engine from f182794 to 25e8021 (1 revision) (flutter#108751) * Sync with flutter/.github#13 (flutter#108754) * Roll Flutter Engine from 25e8021 to e771729 (2 revisions) (flutter#108755) * clean-up analysis_options.yaml (flutter#108747) * Fix ExpansionTile shows children background when expanded (flutter#107834) * Create `containsSemantics` to allow for partial matching of semantics in tests. (flutter#108573) * Roll Flutter Engine from e771729 to 7d0f6d2 (2 revisions) (flutter#108757) * Enable conditional_uri_does_not_exist (flutter#108652) * Roll Flutter Engine from 7d0f6d2 to b257966 (3 revisions) (flutter#108763) * Roll Flutter Engine from b257966 to 60e5eb6 (3 revisions) (flutter#108766) * Reland `Linux_samsung_a02 openpay_benchmarks__scroll_perf` (flutter#108466) (flutter#108769) * [SelectionOverlay]Move the debug statement to the scope of the assertion. (flutter#108508) * Roll Flutter Engine from 60e5eb6 to 1c3b1b3 (11 revisions) (flutter#108780) * Roll Flutter Engine from 1c3b1b3 to b607811 (1 revision) (flutter#108782) * Roll Flutter Engine from b607811 to 3b2bd24 (1 revision) (flutter#108784) * Roll Flutter Engine from 3b2bd24 to 0e5392c (1 revision) (flutter#108788) * Roll Flutter Engine from 0e5392c to 4b19256 (1 revision) (flutter#108793) * Roll Flutter Engine from 4b19256 to e0b5edc (2 revisions) (flutter#108798) * Roll Flutter Engine from e0b5edc to b164c5c (1 revision) (flutter#108814) * Update text_field.dart * Roll Flutter Engine from b164c5c to eb2b57b (4 revisions) (flutter#108821) * Roll Plugins from a6d42f1e01d3 to 0d6d03a94ed5 (1 revision) (flutter#108822) * Roll Flutter Engine from eb2b57b to 978d8e2 (2 revisions) (flutter#108825) * Loupe Android + iOS (flutter#107477) * added Magnifier for iOS and Android * Mark `Mac_ios microbenchmarks_ios_flaky` flaky (flutter#108820) * Deprecate `toggleableActiveColor` (flutter#97972) * Roll Flutter Engine from 978d8e2 to 2b31732 (4 revisions) (flutter#108830) * [flutter_tools] Test that DAP process terminates at the end of a session (flutter#108301) * Roll Flutter Engine from 2b31732 to 4e9c869 (1 revision) (flutter#108833) * fix noop toString() diagnostics (flutter#108836) * [flutter_tools] Migrate more tool tests to null-safety (flutter#108639) * Revert "Fix ExpansionTile shows children background when expanded" (flutter#108844) * Roll Flutter Engine from 4e9c869 to 6724561 (2 revisions) (flutter#108838) * Marks Linux_android clipper_cache_perf__e2e_summary to be unflaky (flutter#104088) * Update documentation to match implementation (flutter#108843) * Reland "Add shadowColor and surfaceTintColor to Dialog and DialogTheme." flutter#108718 * Roll Flutter Engine from 6724561 to f3deaba (8 revisions) (flutter#108847) * Roll Flutter Engine from f3deaba to c07e1ac (2 revisions) (flutter#108849) * Roll Flutter Engine from c07e1ac to a1e77ae (5 revisions) (flutter#108850) * Roll Flutter Engine from a1e77ae to c456476 (2 revisions) (flutter#108853) * Roll Flutter Engine from c456476 to 6cd744b (1 revision) (flutter#108857) * Roll Flutter Engine from 6cd744b to 51296a6 (1 revision) (flutter#108860) * Roll Flutter Engine from 51296a6 to 05228ad (1 revision) (flutter#108862) * Revert "Roll Flutter Engine from 51296a6 to 05228ad (1 revision) (flutter#108862)" (flutter#108882) This reverts commit a880c4e. * Roll Plugins from 0d6d03a94ed5 to e74c42028d39 (5 revisions) (flutter#108887) * Roll Flutter Engine from 51296a6 to 2c28298 (6 revisions) (flutter#108899) * [flutter_test] Add flag to send device pointer events to the framework (flutter#108430) * Roll Flutter Engine from 2c28298 to adba702 (2 revisions) (flutter#108903) * fix flutter not finding custom device (flutter#108884) * Force a11y services to off for complex_layout_semantics_perf test (flutter#108906) * Update `equalsIgnoringHashCodes` to take a list of Strings (flutter#108507) * [macOS] Use editing intents from engine (flutter#105407) * Added `IconButtonTheme` and apply it to `IconButton` in M3 (flutter#108332) * Created IconButtonTheme and apply it to IconButton * [web] Add onEntrypointLoaded to FlutterLoader. (flutter#108776) * Roll pub packages (flutter#108919) * [flutter_test] perf: find.ancestor (flutter#108868) * Roll Flutter Engine from adba702 to 1188a80 (4 revisions) (flutter#108922) * Bump github/codeql-action from 2.1.17 to 2.1.18 (flutter#108923) * Remove some outdated ignores from framework (flutter#108915) * Roll Flutter Engine from 1188a80 to 1743d1d (1 revision) (flutter#108925) * Clean up ScrollbarPainter (flutter#107179) * Remove outdated ignores (flutter#108924) * Add more logs to diagnose Gold flake (flutter#108930) * M3 counter error style * polish * Update text_field_template.dart * resolve comments * Update text_field.dart Co-authored-by: engine-flutter-autoroll <[email protected]> Co-authored-by: Tomasz Gucio <[email protected]> Co-authored-by: Greg Spencer <[email protected]> Co-authored-by: Ian Hickson <[email protected]> Co-authored-by: Michael Goderbauer <[email protected]> Co-authored-by: Bruno Leroux <[email protected]> Co-authored-by: pdblasi-google <[email protected]> Co-authored-by: Kaushik Iska <[email protected]> Co-authored-by: xubaolin <[email protected]> Co-authored-by: Anthony Oleinik <[email protected]> Co-authored-by: keyonghan <[email protected]> Co-authored-by: Taha Tesser <[email protected]> Co-authored-by: Danny Tuppeny <[email protected]> Co-authored-by: Phil Quitslund <[email protected]> Co-authored-by: Christopher Fujino <[email protected]> Co-authored-by: Kate Lovett <[email protected]> Co-authored-by: Flutter GitHub Bot <[email protected]> Co-authored-by: parkershepherd <[email protected]> Co-authored-by: Darren Austin <[email protected]> Co-authored-by: Zachary Anderson <[email protected]> Co-authored-by: Jia Hao <[email protected]> Co-authored-by: Hannes Winkler <[email protected]> Co-authored-by: Matej Knopp <[email protected]> Co-authored-by: Qun Cheng <[email protected]> Co-authored-by: David Iglesias <[email protected]> Co-authored-by: Pascal Welsch <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
The current promise-based API of flutter.js to inject the entrypoint and report back with an "engine initializer" object does not work well with Flutter web's hot-restart feature, and in fact, reverts to "auto" initialization upon hot restart as a "fix". See: #108403. This is a problem for incoming changes on flutter, where we might want to pass custom parameters to the
initializeEngine
/runApp
JS methods.onEntrypointLoaded
eventThis PR adds a new
onEntrypointLoaded
method to the FlutterLoader provided by flutter.js that triggers a new "flutter:entrypoint-loaded" event every time the app (hot)restarts, so the rest of the custom initialization code can run.The new init sequence of a flutter app that survives hot-restart looks like:
This separation also makes quite obvious what things will run once (
loadEntrypoint
) vs what will run every time the engine hot-restarts (onEntrypointLoaded
).Detangle flutter.js ServiceWorkerLoader from EntrypointLoader
In a first (small) step towards modularization of the library, this change detangles the old "loadWithServiceWorker" logic into: load service worker, then load the entrypoint.
The old logic basically attempted very hard to load a service worker, but if for any case it'd fail, it'd always "fall back" to the _loadEntrypoint method.
The new logic separates the Service Worker install logic from the Entrypoint loader, so it can be loaded in two steps:
The new structure makes it easier to ES-Modularize the file in the future, or inject custom behavior for any/all of the steps of the bootstrap. (Some extra modularization is still required from the FlutterLoader bits, but this looks like a nice start).
Issues
Tests
Backwards-compatibility
Pre-launch Checklist
///
).If you need help, consider asking for advice on the #hackers-new channel on Discord.