|
|
|
@ -16,14 +16,23 @@ _flutter.loader = null;
|
|
|
|
|
(function() {
|
|
|
|
|
"use strict";
|
|
|
|
|
class FlutterLoader {
|
|
|
|
|
// TODO: Move the below methods to "#private" once supported by all the browsers
|
|
|
|
|
// we support. In the meantime, we use the "revealing module" pattern.
|
|
|
|
|
/**
|
|
|
|
|
* Creates a FlutterLoader, and initializes its instance methods.
|
|
|
|
|
*/
|
|
|
|
|
constructor() {
|
|
|
|
|
// TODO: Move the below methods to "#private" once supported by all the browsers
|
|
|
|
|
// we support. In the meantime, we use the "revealing module" pattern.
|
|
|
|
|
|
|
|
|
|
// Watchdog to prevent injecting the main entrypoint multiple times.
|
|
|
|
|
_scriptLoaded = null;
|
|
|
|
|
// Watchdog to prevent injecting the main entrypoint multiple times.
|
|
|
|
|
this._scriptLoaded = null;
|
|
|
|
|
|
|
|
|
|
// Resolver for the pending promise returned by loadEntrypoint.
|
|
|
|
|
_didCreateEngineInitializerResolve = null;
|
|
|
|
|
// Resolver for the pending promise returned by loadEntrypoint.
|
|
|
|
|
this._didCreateEngineInitializerResolve = null;
|
|
|
|
|
|
|
|
|
|
// Called by Flutter web.
|
|
|
|
|
// Bound to `this` now, so "this" is preserved across JS <-> Flutter jumps.
|
|
|
|
|
this.didCreateEngineInitializer = this._didCreateEngineInitializer.bind(this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Initializes the main.dart.js with/without serviceWorker.
|
|
|
|
@ -40,19 +49,19 @@ _flutter.loader = null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Resolves the promise created by loadEntrypoint. Called by Flutter.
|
|
|
|
|
* Needs to be weirdly bound like it is, so "this" is preserved across
|
|
|
|
|
* the JS <-> Flutter jumps.
|
|
|
|
|
* Resolves the promise created by loadEntrypoint.
|
|
|
|
|
* Called by Flutter through the public `didCreateEngineInitializer` method,
|
|
|
|
|
* which is bound to the correct instance of the FlutterLoader on the page.
|
|
|
|
|
* @param {*} engineInitializer
|
|
|
|
|
*/
|
|
|
|
|
didCreateEngineInitializer = (function(engineInitializer) {
|
|
|
|
|
_didCreateEngineInitializer(engineInitializer) {
|
|
|
|
|
if (typeof this._didCreateEngineInitializerResolve != "function") {
|
|
|
|
|
console.warn("Do not call didCreateEngineInitializer by hand. Start with loadEntrypoint instead.");
|
|
|
|
|
}
|
|
|
|
|
this._didCreateEngineInitializerResolve(engineInitializer);
|
|
|
|
|
// Remove this method after it's done, so Flutter Web can hot restart.
|
|
|
|
|
// Remove the public method after it's done, so Flutter Web can hot restart.
|
|
|
|
|
delete this.didCreateEngineInitializer;
|
|
|
|
|
}).bind(this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_loadEntrypoint(entrypointUrl) {
|
|
|
|
|
if (!this._scriptLoaded) {
|
|
|
|
@ -60,7 +69,11 @@ _flutter.loader = null;
|
|
|
|
|
let scriptTag = document.createElement("script");
|
|
|
|
|
scriptTag.src = entrypointUrl;
|
|
|
|
|
scriptTag.type = "application/javascript";
|
|
|
|
|
this._didCreateEngineInitializerResolve = resolve; // Cache the resolve, so it can be called from Flutter.
|
|
|
|
|
// Cache the resolve, so it can be called from Flutter.
|
|
|
|
|
// Note: Flutter hot restart doesn't re-create this promise, so this
|
|
|
|
|
// can only be called once. Instead, we need to model this as a stream
|
|
|
|
|
// of `engineCreated` events coming from Flutter that are handled by JS.
|
|
|
|
|
this._didCreateEngineInitializerResolve = resolve;
|
|
|
|
|
scriptTag.addEventListener("error", reject);
|
|
|
|
|
document.body.append(scriptTag);
|
|
|
|
|
});
|
|
|
|
|