| // 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 'dart:async'; |
| |
| import 'package:test/bootstrap/browser.dart'; |
| import 'package:test/test.dart'; |
| import 'package:ui/src/engine.dart'; |
| |
| void main() { |
| internalBootstrapBrowserTest(() => testMain); |
| } |
| |
| void testMain() { |
| test('services are initalized separately from UI', () async { |
| final JsFlutterConfiguration? config = await bootstrapAndExtractConfig(); |
| expect(scheduleFrameCallback, isNull); |
| |
| expect(findGlassPane(), isNull); |
| expect(RawKeyboard.instance, isNull); |
| expect(KeyboardBinding.instance, isNull); |
| expect(EnginePlatformDispatcher.instance.implicitView, isNull); |
| |
| // After initializing services the UI should remain intact. |
| await initializeEngineServices(jsConfiguration: config); |
| expect(scheduleFrameCallback, isNotNull); |
| expect(windowFlutterCanvasKit, isNotNull); |
| |
| expect(findGlassPane(), isNull); |
| expect(RawKeyboard.instance, isNull); |
| expect(KeyboardBinding.instance, isNull); |
| expect(EnginePlatformDispatcher.instance.implicitView, isNull); |
| |
| // Now UI should be taken over by Flutter. |
| await initializeEngineUi(); |
| expect(findGlassPane(), isNotNull); |
| expect(RawKeyboard.instance, isNotNull); |
| expect(KeyboardBinding.instance, isNotNull); |
| expect(EnginePlatformDispatcher.instance.implicitView, isNotNull); |
| }); |
| } |
| |
| DomElement? findGlassPane() { |
| return domDocument.querySelector('flt-glass-pane'); |
| } |
| |
| Future<JsFlutterConfiguration?> bootstrapAndExtractConfig() { |
| // Since this test is explicitly checking each part of the bootstrapping process, |
| // we can't use the standard bootstrapper here. However, we do need the flutter |
| // configuration object that is passed into flutter.js to actually initialize the |
| // engine with, so here we do a little no-op bootstrap that just retrieves the |
| // configuration that is passed into the `initializeEngine` callback. |
| final Completer<JsFlutterConfiguration?> configCompleter = Completer<JsFlutterConfiguration?>(); |
| final AppBootstrap bootstrap = AppBootstrap( |
| initializeEngine: ([JsFlutterConfiguration? config]) async => configCompleter.complete(config), |
| runApp: () {} |
| ); |
| final FlutterLoader? loader = flutter?.loader; |
| if (loader == null || loader.isAutoStart) { |
| // TODO(jacksongardner): Unit tests under dart2wasm still use the old way which |
| // doesn't invoke flutter.js directly, so we autostart here. Once dart2wasm tests |
| // work with flutter.js, we can remove this code path. |
| bootstrap.autoStart(); |
| } else { |
| loader.didCreateEngineInitializer(bootstrap.prepareEngineInitializer()); |
| } |
| |
| return configCompleter.future; |
| } |