| // Copyright 2013 The Flutter Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| import 'package:js/js.dart'; | |
| import 'package:js/js_util.dart' as js_util; | |
| import 'package:test/bootstrap/browser.dart'; | |
| import 'package:test/test.dart'; | |
| import 'package:ui/src/engine.dart' as engine; | |
| import 'package:ui/ui.dart' as ui; | |
| @JS('_flutter') | |
| external set loader(Object? loader); | |
| @JS('_flutter.loader.didCreateEngineInitializer') | |
| external set didCreateEngineInitializer(Object? callback); | |
| void main() { | |
| // Prepare _flutter.loader.didCreateEngineInitializer, so it's ready in the page ASAP. | |
| loader = js_util.jsify(<String, Object>{ | |
| 'loader': <String, Object>{ | |
| 'didCreateEngineInitializer': allowInterop(() { print('not mocked'); }), | |
| }, | |
| }); | |
| internalBootstrapBrowserTest(() => testMain); | |
| } | |
| void testMain() { | |
| test('webOnlyWarmupEngine calls _flutter.loader.didCreateEngineInitializer callback', () async { | |
| Object? engineInitializer; | |
| void didCreateEngineInitializerMock(Object? obj) { | |
| engineInitializer = obj; | |
| } | |
| // Prepare the DOM for: _flutter.loader.didCreateEngineInitializer | |
| didCreateEngineInitializer = allowInterop(didCreateEngineInitializerMock); | |
| // Reset the engine | |
| engine.debugResetEngineInitializationState(); | |
| await ui.webOnlyWarmupEngine( | |
| registerPlugins: () {}, | |
| runApp: () {}, | |
| ); | |
| // Check that the object we captured is actually a loader | |
| expect(engineInitializer, isNotNull); | |
| expect(js_util.hasProperty(engineInitializer!, 'initializeEngine'), isTrue, reason: 'Missing FlutterEngineInitializer method: initializeEngine.'); | |
| expect(js_util.hasProperty(engineInitializer!, 'autoStart'), isTrue, reason: 'Missing FlutterEngineInitializer method: autoStart.'); | |
| }); | |
| test('webOnlyWarmupEngine does auto-start when _flutter.loader.didCreateEngineInitializer does not exist', () async { | |
| loader = null; | |
| bool pluginsRegistered = false; | |
| bool appRan = false; | |
| void registerPluginsMock() { | |
| pluginsRegistered = true; | |
| } | |
| void runAppMock() { | |
| appRan = true; | |
| } | |
| // Reset the engine | |
| engine.debugResetEngineInitializationState(); | |
| await ui.webOnlyWarmupEngine( | |
| registerPlugins: registerPluginsMock, | |
| runApp: runAppMock, | |
| ); | |
| // Check that the object we captured is actually a loader | |
| expect(pluginsRegistered, isTrue, reason: 'Plugins should be immediately registered in autoStart mode.'); | |
| expect(appRan, isTrue, reason: 'App should run immediately in autoStart mode'); | |
| }); | |
| // We cannot test anymore, because by now the engine has registered some stuff that can't be rewound back. | |
| // Like the `ext.flutter.disassemble` developer extension. | |
| } |