From a926e1a8035f34e9bb5bcbda4bd8d32205002a10 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Wed, 13 Jul 2022 18:32:08 -0700 Subject: [PATCH 1/2] Rename Raw use flutter event All FlutterHtmlKeyboardEvent Migrate to defaultPrevented Fix RawKeyboard --- ci/licenses_golden/licenses_flutter | 2 +- lib/web_ui/lib/src/engine.dart | 2 +- lib/web_ui/lib/src/engine/embedder.dart | 2 +- lib/web_ui/lib/src/engine/initialization.dart | 4 +- .../lib/src/engine/keyboard_binding.dart | 11 +- .../{keyboard.dart => raw_keyboard.dart} | 41 +- .../initialization_services_vs_ui_test.dart | 6 +- lib/web_ui/test/keyboard_converter_test.dart | 446 +++++++++--------- lib/web_ui/test/keyboard_test_common.dart | 80 ++++ ...board_test.dart => raw_keyboard_test.dart} | 72 +-- 10 files changed, 376 insertions(+), 290 deletions(-) rename lib/web_ui/lib/src/engine/{keyboard.dart => raw_keyboard.dart} (88%) create mode 100644 lib/web_ui/test/keyboard_test_common.dart rename lib/web_ui/test/{keyboard_test.dart => raw_keyboard_test.dart} (93%) diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index 58281df1d52f7..8ffc123a221fe 100644 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -1181,7 +1181,6 @@ FILE: ../../../flutter/lib/web_ui/lib/src/engine/initialization.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/js_interop/js_loader.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/js_interop/js_promise.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/key_map.g.dart -FILE: ../../../flutter/lib/web_ui/lib/src/engine/keyboard.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/keyboard_binding.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/mouse_cursor.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/navigation.dart @@ -1199,6 +1198,7 @@ FILE: ../../../flutter/lib/web_ui/lib/src/engine/plugins.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/pointer_binding.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/pointer_converter.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/profiler.dart +FILE: ../../../flutter/lib/web_ui/lib/src/engine/raw_keyboard.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/rrect_renderer.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/safe_browser_api.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/semantics.dart diff --git a/lib/web_ui/lib/src/engine.dart b/lib/web_ui/lib/src/engine.dart index 166f78ffac659..865de034ef993 100644 --- a/lib/web_ui/lib/src/engine.dart +++ b/lib/web_ui/lib/src/engine.dart @@ -104,7 +104,6 @@ export 'engine/initialization.dart'; export 'engine/js_interop/js_loader.dart'; export 'engine/js_interop/js_promise.dart'; export 'engine/key_map.g.dart'; -export 'engine/keyboard.dart'; export 'engine/keyboard_binding.dart'; export 'engine/mouse_cursor.dart'; export 'engine/navigation/history.dart'; @@ -121,6 +120,7 @@ export 'engine/plugins.dart'; export 'engine/pointer_binding.dart'; export 'engine/pointer_converter.dart'; export 'engine/profiler.dart'; +export 'engine/raw_keyboard.dart'; export 'engine/rrect_renderer.dart'; export 'engine/safe_browser_api.dart'; export 'engine/semantics/accessibility.dart'; diff --git a/lib/web_ui/lib/src/engine/embedder.dart b/lib/web_ui/lib/src/engine/embedder.dart index ef6107e3a6023..1edc4210ee82c 100644 --- a/lib/web_ui/lib/src/engine/embedder.dart +++ b/lib/web_ui/lib/src/engine/embedder.dart @@ -331,7 +331,7 @@ class FlutterViewEmbedder { } PointerBinding.initInstance(glassPaneElement); - KeyboardBinding.initInstance(glassPaneElement); + KeyboardBinding.initInstance(); if (domWindow.visualViewport == null && isWebKit) { // Older Safari versions sometimes give us bogus innerWidth/innerHeight diff --git a/lib/web_ui/lib/src/engine/initialization.dart b/lib/web_ui/lib/src/engine/initialization.dart index eb20b9626f5b3..b043079adcba7 100644 --- a/lib/web_ui/lib/src/engine/initialization.dart +++ b/lib/web_ui/lib/src/engine/initialization.dart @@ -9,12 +9,12 @@ import 'package:ui/src/engine/assets.dart'; import 'package:ui/src/engine/browser_detection.dart'; import 'package:ui/src/engine/canvaskit/initialization.dart'; import 'package:ui/src/engine/embedder.dart'; -import 'package:ui/src/engine/keyboard.dart'; import 'package:ui/src/engine/mouse_cursor.dart'; import 'package:ui/src/engine/navigation.dart'; import 'package:ui/src/engine/platform_dispatcher.dart'; import 'package:ui/src/engine/platform_views/content_manager.dart'; import 'package:ui/src/engine/profiler.dart'; +import 'package:ui/src/engine/raw_keyboard.dart'; import 'package:ui/src/engine/safe_browser_api.dart'; import 'package:ui/src/engine/text/font_collection.dart'; import 'package:ui/src/engine/text/line_break_properties.dart'; @@ -253,7 +253,7 @@ Future initializeEngineUi() async { } _initializationState = DebugEngineInitializationState.initializingUi; - Keyboard.initialize(onMacOs: operatingSystem == OperatingSystem.macOs); + RawKeyboard.initialize(onMacOs: operatingSystem == OperatingSystem.macOs); MouseCursor.initialize(); ensureFlutterViewEmbedderInitialized(); _initializationState = DebugEngineInitializationState.initialized; diff --git a/lib/web_ui/lib/src/engine/keyboard_binding.dart b/lib/web_ui/lib/src/engine/keyboard_binding.dart index 9a500efea9311..74e0fa5f7d050 100644 --- a/lib/web_ui/lib/src/engine/keyboard_binding.dart +++ b/lib/web_ui/lib/src/engine/keyboard_binding.dart @@ -88,7 +88,7 @@ Duration _eventTimeStampToDuration(num milliseconds) { } class KeyboardBinding { - KeyboardBinding._(this.glassPaneElement) { + KeyboardBinding._() { _setup(); } @@ -96,9 +96,9 @@ class KeyboardBinding { static KeyboardBinding? get instance => _instance; static KeyboardBinding? _instance; - static void initInstance(DomElement glassPaneElement) { + static void initInstance() { if (_instance == null) { - _instance = KeyboardBinding._(glassPaneElement); + _instance = KeyboardBinding._(); assert(() { registerHotRestartListener(_instance!._reset); return true; @@ -106,8 +106,7 @@ class KeyboardBinding { } } - final DomElement glassPaneElement; - late KeyboardConverter _converter; + late final KeyboardConverter _converter; final Map _listeners = {}; void _addEventListener(String eventName, DomEventListener handler) { @@ -179,6 +178,7 @@ class FlutterHtmlKeyboardEvent { String get type => _event.type; String? get code => _event.code; String? get key => _event.key; + int get keyCode => _event.keyCode; bool? get repeat => _event.repeat; int? get location => _event.location; num? get timeStamp => _event.timeStamp; @@ -189,6 +189,7 @@ class FlutterHtmlKeyboardEvent { bool getModifierState(String key) => _event.getModifierState(key); void preventDefault() => _event.preventDefault(); + bool get defaultPrevented => _event.defaultPrevented; } // Reads [DomKeyboardEvent], then [dispatches ui.KeyData] accordingly. diff --git a/lib/web_ui/lib/src/engine/keyboard.dart b/lib/web_ui/lib/src/engine/raw_keyboard.dart similarity index 88% rename from lib/web_ui/lib/src/engine/keyboard.dart rename to lib/web_ui/lib/src/engine/raw_keyboard.dart index 440f249850e83..57d16116e7c2d 100644 --- a/lib/web_ui/lib/src/engine/keyboard.dart +++ b/lib/web_ui/lib/src/engine/raw_keyboard.dart @@ -7,13 +7,14 @@ import 'dart:typed_data'; import '../engine.dart' show registerHotRestartListener; import 'dom.dart'; +import 'keyboard_binding.dart'; import 'platform_dispatcher.dart'; import 'safe_browser_api.dart'; import 'services.dart'; /// Provides keyboard bindings, such as the `flutter/keyevent` channel. -class Keyboard { - Keyboard._(this._onMacOs) { +class RawKeyboard { + RawKeyboard._(this._onMacOs) { _keydownListener = allowInterop((DomEvent event) { _handleHtmlEvent(event); }); @@ -28,16 +29,16 @@ class Keyboard { }); } - /// Initializes the [Keyboard] singleton. + /// Initializes the [RawKeyboard] singleton. /// /// Use the [instance] getter to get the singleton after calling this method. static void initialize({bool onMacOs = false}) { - _instance ??= Keyboard._(onMacOs); + _instance ??= RawKeyboard._(onMacOs); } - /// The [Keyboard] singleton. - static Keyboard? get instance => _instance; - static Keyboard? _instance; + /// The [RawKeyboard] singleton. + static RawKeyboard? get instance => _instance; + static RawKeyboard? _instance; /// A mapping of [KeyboardEvent.code] to [Timer]. /// @@ -48,7 +49,7 @@ class Keyboard { DomEventListener? _keydownListener; DomEventListener? _keyupListener; - /// Uninitializes the [Keyboard] singleton. + /// Uninitializes the [RawKeyboard] singleton. /// /// After calling this method this object becomes unusable and [instance] /// becomes `null`. Call [initialize] again to initialize a new singleton. @@ -87,13 +88,13 @@ class Keyboard { return _onMacOs; } - void _handleHtmlEvent(DomEvent event) { - if (!domInstanceOfString(event, 'KeyboardEvent')) { + void _handleHtmlEvent(DomEvent domEvent) { + if (!domInstanceOfString(domEvent, 'KeyboardEvent')) { return; } - final DomKeyboardEvent keyboardEvent = event as DomKeyboardEvent; - final String timerKey = keyboardEvent.code!; + final FlutterHtmlKeyboardEvent event = FlutterHtmlKeyboardEvent(domEvent as DomKeyboardEvent); + final String timerKey = event.code!; // Don't handle synthesizing a keyup event for modifier keys if (!_isModifierKey(event) && _shouldDoKeyGuard()) { @@ -126,11 +127,11 @@ class Keyboard { final Map eventData = { 'type': event.type, 'keymap': 'web', - 'code': keyboardEvent.code, - 'key': keyboardEvent.key, - 'location': keyboardEvent.location, + 'code': event.code, + 'key': event.key, + 'location': event.location, 'metaState': _lastMetaState, - 'keyCode': keyboardEvent.keyCode, + 'keyCode': event.keyCode, }; EnginePlatformDispatcher.instance.invokeOnPlatformMessage('flutter/keyevent', @@ -147,7 +148,7 @@ class Keyboard { ); } - void _synthesizeKeyup(DomKeyboardEvent event) { + void _synthesizeKeyup(FlutterHtmlKeyboardEvent event) { final Map eventData = { 'type': 'keyup', 'keymap': 'web', @@ -180,7 +181,7 @@ const int modifierCapsLock = 0x20; const int modifierScrollLock = 0x40; /// Creates a bitmask representing the meta state of the [event]. -int _getMetaState(DomKeyboardEvent event) { +int _getMetaState(FlutterHtmlKeyboardEvent event) { int metaState = _modifierNone; if (event.getModifierState('Shift')) { metaState |= _modifierShift; @@ -212,7 +213,7 @@ int _getMetaState(DomKeyboardEvent event) { /// /// Modifier keys are shift, alt, ctrl and meta/cmd/win. These are the keys used /// to perform keyboard shortcuts (e.g. `cmd+c`, `cmd+l`). -bool _isModifierKey(DomKeyboardEvent event) { +bool _isModifierKey(FlutterHtmlKeyboardEvent event) { final String key = event.key!; return key == 'Meta' || key == 'Shift' || key == 'Alt' || key == 'Control'; } @@ -220,7 +221,7 @@ bool _isModifierKey(DomKeyboardEvent event) { /// Returns true if the [event] is been affects by any of the modifiers key /// /// This is a strong indication that this key is been used for a shortcut -bool _isAffectedByModifiers(DomKeyboardEvent event) { +bool _isAffectedByModifiers(FlutterHtmlKeyboardEvent event) { return event.ctrlKey || event.shiftKey || event.altKey || event.metaKey; } diff --git a/lib/web_ui/test/canvaskit/initialization_services_vs_ui_test.dart b/lib/web_ui/test/canvaskit/initialization_services_vs_ui_test.dart index 1268aa12a6b9a..119765a5c1650 100644 --- a/lib/web_ui/test/canvaskit/initialization_services_vs_ui_test.dart +++ b/lib/web_ui/test/canvaskit/initialization_services_vs_ui_test.dart @@ -16,7 +16,7 @@ void testMain() { expect(windowFlutterCanvasKit, isNull); expect(findGlassPane(), isNull); - expect(Keyboard.instance, isNull); + expect(RawKeyboard.instance, isNull); expect(MouseCursor.instance, isNull); expect(KeyboardBinding.instance, isNull); expect(PointerBinding.instance, isNull); @@ -27,7 +27,7 @@ void testMain() { expect(windowFlutterCanvasKit, isNotNull); expect(findGlassPane(), isNull); - expect(Keyboard.instance, isNull); + expect(RawKeyboard.instance, isNull); expect(MouseCursor.instance, isNull); expect(KeyboardBinding.instance, isNull); expect(PointerBinding.instance, isNull); @@ -35,7 +35,7 @@ void testMain() { // Now UI should be taken over by Flutter. await initializeEngineUi(); expect(findGlassPane(), isNotNull); - expect(Keyboard.instance, isNotNull); + expect(RawKeyboard.instance, isNotNull); expect(MouseCursor.instance, isNotNull); expect(KeyboardBinding.instance, isNotNull); expect(PointerBinding.instance, isNotNull); diff --git a/lib/web_ui/test/keyboard_converter_test.dart b/lib/web_ui/test/keyboard_converter_test.dart index 0af85815dcf37..619c18a59d80d 100644 --- a/lib/web_ui/test/keyboard_converter_test.dart +++ b/lib/web_ui/test/keyboard_converter_test.dart @@ -9,6 +9,8 @@ import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart' as ui; +import 'keyboard_test_common.dart'; + const int kLocationStandard = 0; const int kLocationLeft = 1; const int kLocationRight = 2; @@ -84,13 +86,10 @@ void testMain() { // Only handle down events return key.type == ui.KeyEventType.down; }); - bool preventedDefault = false; - void onPreventDefault() { preventedDefault = true; } + MockKeyboardEvent event; - converter.handleEvent(keyDownEvent('KeyA', 'a') - ..timeStamp = 1 - ..onPreventDefault = onPreventDefault - ); + event = keyDownEvent('KeyA', 'a')..timeStamp = 1; + converter.handleEvent(event); expectKeyData(keyDataList.last, timeStamp: const Duration(milliseconds: 1), type: ui.KeyEventType.down, @@ -98,13 +97,10 @@ void testMain() { logical: kLogicalKeyA, character: 'a', ); - expect(preventedDefault, isTrue); - preventedDefault = false; + expect(event.defaultPrevented, isTrue); - converter.handleEvent(keyRepeatedDownEvent('KeyA', 'a') - ..timeStamp = 1.5 - ..onPreventDefault = onPreventDefault - ); + event = keyRepeatedDownEvent('KeyA', 'a')..timeStamp = 1.5; + converter.handleEvent(event); expectKeyData(keyDataList.last, timeStamp: const Duration(milliseconds: 1, microseconds: 500), type: ui.KeyEventType.repeat, @@ -112,12 +108,10 @@ void testMain() { logical: kLogicalKeyA, character: 'a', ); - expect(preventedDefault, isFalse); + expect(event.defaultPrevented, isFalse); - converter.handleEvent(keyRepeatedDownEvent('KeyA', 'a') - ..timeStamp = 1500 - ..onPreventDefault = onPreventDefault - ); + event = keyRepeatedDownEvent('KeyA', 'a')..timeStamp = 1500; + converter.handleEvent(event); expectKeyData(keyDataList.last, timeStamp: const Duration(seconds: 1, milliseconds: 500), type: ui.KeyEventType.repeat, @@ -125,12 +119,10 @@ void testMain() { logical: kLogicalKeyA, character: 'a', ); - expect(preventedDefault, isFalse); + expect(event.defaultPrevented, isFalse); - converter.handleEvent(keyUpEvent('KeyA', 'a') - ..timeStamp = 2000.5 - ..onPreventDefault = onPreventDefault - ); + event = keyUpEvent('KeyA', 'a')..timeStamp = 2000.5; + converter.handleEvent(event); expectKeyData(keyDataList.last, timeStamp: const Duration(seconds: 2, microseconds: 500), type: ui.KeyEventType.up, @@ -138,7 +130,7 @@ void testMain() { logical: kLogicalKeyA, character: null, ); - expect(preventedDefault, isFalse); + expect(event.defaultPrevented, isFalse); }); test('Release modifier during a repeated sequence', () { @@ -148,85 +140,77 @@ void testMain() { // Only handle down events return key.type == ui.KeyEventType.down; }); - bool preventedDefault = false; - void onPreventDefault() { preventedDefault = true; } + MockKeyboardEvent event; - converter.handleEvent(keyDownEvent('ShiftLeft', 'Shift', kShift, kLocationLeft) - ..onPreventDefault = onPreventDefault - ); + event = keyDownEvent('ShiftLeft', 'Shift', kShift, kLocationLeft); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalShiftLeft, logical: kLogicalShiftLeft, character: null, ); - expect(preventedDefault, isTrue); - preventedDefault = false; + expect(event.defaultPrevented, isTrue); - converter.handleEvent(keyDownEvent('KeyA', 'A', kShift) - ..onPreventDefault = onPreventDefault - ); + event = keyDownEvent('KeyA', 'A', kShift); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalKeyA, logical: kLogicalKeyA, character: 'A', ); - expect(preventedDefault, isTrue); - preventedDefault = false; + expect(event.defaultPrevented, isTrue); - converter.handleEvent(keyRepeatedDownEvent('KeyA', 'A', kShift) - ..onPreventDefault = onPreventDefault - ); + event = keyRepeatedDownEvent('KeyA', 'A', kShift); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.repeat, physical: kPhysicalKeyA, logical: kLogicalKeyA, character: 'A', ); - expect(preventedDefault, isFalse); + expect(event.defaultPrevented, isFalse); - converter.handleEvent(keyUpEvent('ShiftLeft', 'Shift', 0, kLocationLeft) - ..onPreventDefault = onPreventDefault - ); + event = keyUpEvent('ShiftLeft', 'Shift', 0, kLocationLeft); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, physical: kPhysicalShiftLeft, logical: kLogicalShiftLeft, character: null, ); - expect(preventedDefault, isFalse); + expect(event.defaultPrevented, isFalse); - converter.handleEvent(keyRepeatedDownEvent('KeyA', 'a') - ..onPreventDefault = onPreventDefault - ); + event = keyRepeatedDownEvent('KeyA', 'a'); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.repeat, physical: kPhysicalKeyA, logical: kLogicalKeyA, character: 'a', ); - expect(preventedDefault, isFalse); + expect(event.defaultPrevented, isFalse); - converter.handleEvent(keyRepeatedDownEvent('KeyA', 'a') - ..onPreventDefault = onPreventDefault - ); + event = keyRepeatedDownEvent('KeyA', 'a'); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.repeat, physical: kPhysicalKeyA, logical: kLogicalKeyA, character: 'a', ); - expect(preventedDefault, isFalse); + expect(event.defaultPrevented, isFalse); - converter.handleEvent(keyUpEvent('KeyA', 'a')); + event = keyUpEvent('KeyA', 'a'); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, physical: kPhysicalKeyA, logical: kLogicalKeyA, character: null, ); - expect(preventedDefault, isFalse); + expect(event.defaultPrevented, isFalse); }); test('Distinguish between left and right modifiers', () { @@ -235,8 +219,10 @@ void testMain() { keyDataList.add(key); return true; }); + MockKeyboardEvent event; - converter.handleEvent(keyDownEvent('ShiftLeft', 'Shift', kShift, kLocationLeft)); + event = keyDownEvent('ShiftLeft', 'Shift', kShift, kLocationLeft); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalShiftLeft, @@ -244,7 +230,8 @@ void testMain() { character: null, ); - converter.handleEvent(keyDownEvent('ShiftRight', 'Shift', kShift, kLocationRight)); + event = keyDownEvent('ShiftRight', 'Shift', kShift, kLocationRight); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalShiftRight, @@ -252,7 +239,8 @@ void testMain() { character: null, ); - converter.handleEvent(keyUpEvent('ShiftLeft', 'Shift', kShift, kLocationLeft)); + event = keyUpEvent('ShiftLeft', 'Shift', kShift, kLocationLeft); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, physical: kPhysicalShiftLeft, @@ -260,7 +248,8 @@ void testMain() { character: null, ); - converter.handleEvent(keyUpEvent('ShiftRight', 'Shift', 0, kLocationRight)); + event = keyUpEvent('ShiftRight', 'Shift', 0, kLocationRight); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, physical: kPhysicalShiftRight, @@ -275,8 +264,10 @@ void testMain() { keyDataList.add(key); return true; }); + MockKeyboardEvent event; - converter.handleEvent(keyDownEvent('', 'Shift', kShift)); + event = keyDownEvent('', 'Shift', kShift); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalEmptyCode, @@ -284,7 +275,8 @@ void testMain() { character: null, ); - converter.handleEvent(keyUpEvent('', 'Shift', kShift)); + event = keyUpEvent('', 'Shift', kShift); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, physical: kPhysicalEmptyCode, @@ -292,7 +284,8 @@ void testMain() { character: null, ); - converter.handleEvent(keyDownEvent('', 'Control', kCtrl)); + event = keyDownEvent('', 'Control', kCtrl); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalEmptyCode, @@ -300,7 +293,8 @@ void testMain() { character: null, ); - converter.handleEvent(keyUpEvent('', 'Control', kCtrl)); + event = keyUpEvent('', 'Control', kCtrl); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, physical: kPhysicalEmptyCode, @@ -308,7 +302,8 @@ void testMain() { character: null, ); - converter.handleEvent(keyDownEvent('', 'Alt', kAlt)); + event = keyDownEvent('', 'Alt', kAlt); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalEmptyCode, @@ -316,7 +311,8 @@ void testMain() { character: null, ); - converter.handleEvent(keyUpEvent('', 'Alt', kAlt)); + event = keyUpEvent('', 'Alt', kAlt); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, physical: kPhysicalEmptyCode, @@ -324,7 +320,8 @@ void testMain() { character: null, ); - converter.handleEvent(keyDownEvent('', 'Meta', kMeta)); + event = keyDownEvent('', 'Meta', kMeta); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalEmptyCode, @@ -332,7 +329,8 @@ void testMain() { character: null, ); - converter.handleEvent(keyUpEvent('', 'Meta', kMeta)); + event = keyUpEvent('', 'Meta', kMeta); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, physical: kPhysicalEmptyCode, @@ -347,8 +345,10 @@ void testMain() { keyDataList.add(key); return true; }); + MockKeyboardEvent event; - converter.handleEvent(keyDownEvent('Digit1', '1')); + event = keyDownEvent('Digit1', '1'); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalDigit1, @@ -356,7 +356,8 @@ void testMain() { character: '1', ); - converter.handleEvent(keyDownEvent('Numpad1', '1', 0, kLocationNumpad)); + event = keyDownEvent('Numpad1', '1', 0, kLocationNumpad); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalNumpad1, @@ -364,7 +365,8 @@ void testMain() { character: '1', ); - converter.handleEvent(keyUpEvent('Digit1', '1')); + event = keyUpEvent('Digit1', '1'); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, physical: kPhysicalDigit1, @@ -372,7 +374,8 @@ void testMain() { character: null, ); - converter.handleEvent(keyUpEvent('Numpad1', '1', 0, kLocationNumpad)); + event = keyUpEvent('Numpad1', '1', 0, kLocationNumpad); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, physical: kPhysicalNumpad1, @@ -387,6 +390,7 @@ void testMain() { keyDataList.add(key); return true; }); + MockKeyboardEvent event; // The absolute values of the following logical keys are not guaranteed. const int kLogicalAltE = 0x1740070008; @@ -396,9 +400,11 @@ void testMain() { expect(kLogicalAltE, isNot(equals(kLogicalAltU))); expect(kLogicalAltE, isNot(equals(kLogicalAltShiftE))); - converter.handleEvent(keyDownEvent('AltLeft', 'Alt', kAlt, kLocationLeft)); + event = keyDownEvent('AltLeft', 'Alt', kAlt, kLocationLeft); + converter.handleEvent(event); - converter.handleEvent(keyDownEvent('KeyE', 'Dead', kAlt)); + event = keyDownEvent('KeyE', 'Dead', kAlt); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalKeyE, @@ -406,7 +412,8 @@ void testMain() { character: null, ); - converter.handleEvent(keyUpEvent('KeyE', 'Dead', kAlt)); + event = keyUpEvent('KeyE', 'Dead', kAlt); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, physical: kPhysicalKeyE, @@ -414,7 +421,8 @@ void testMain() { character: null, ); - converter.handleEvent(keyDownEvent('KeyU', 'Dead', kAlt)); + event = keyDownEvent('KeyU', 'Dead', kAlt); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalKeyU, @@ -422,7 +430,8 @@ void testMain() { character: null, ); - converter.handleEvent(keyUpEvent('KeyU', 'Dead', kAlt)); + event = keyUpEvent('KeyU', 'Dead', kAlt); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, physical: kPhysicalKeyU, @@ -430,11 +439,13 @@ void testMain() { character: null, ); - converter.handleEvent(keyDownEvent('ShiftLeft', 'Shift', kAlt | kShift, kLocationLeft)); + event = keyDownEvent('ShiftLeft', 'Shift', kAlt | kShift, kLocationLeft); + converter.handleEvent(event); // This does not actually produce a Dead key on macOS (US layout); just for // testing. - converter.handleEvent(keyDownEvent('KeyE', 'Dead', kAlt | kShift)); + event = keyDownEvent('KeyE', 'Dead', kAlt | kShift); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalKeyE, @@ -442,9 +453,11 @@ void testMain() { character: null, ); - converter.handleEvent(keyUpEvent('AltLeft', 'Alt', kShift, kLocationLeft)); + event = keyUpEvent('AltLeft', 'Alt', kShift, kLocationLeft); + converter.handleEvent(event); - converter.handleEvent(keyUpEvent('KeyE', 'e', kShift)); + event = keyUpEvent('KeyE', 'e', kShift); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, physical: kPhysicalKeyE, @@ -452,7 +465,8 @@ void testMain() { character: null, ); - converter.handleEvent(keyUpEvent('ShiftLeft', 'Shift', 0, kLocationLeft)); + event = keyUpEvent('ShiftLeft', 'Shift', 0, kLocationLeft); + converter.handleEvent(event); }); test('Duplicate down is preceded with synthesized up', () { @@ -461,20 +475,16 @@ void testMain() { keyDataList.add(key); return true; }); - bool preventedDefault = false; - void onPreventDefault() { preventedDefault = true; } + MockKeyboardEvent event; - converter.handleEvent(keyDownEvent('ShiftLeft', 'Shift', kShift, kLocationLeft) - ..onPreventDefault = onPreventDefault - ); - expect(preventedDefault, isTrue); - preventedDefault = false; + event = keyDownEvent('ShiftLeft', 'Shift', kShift, kLocationLeft); + converter.handleEvent(event); + expect(event.defaultPrevented, isTrue); // A KeyUp of ShiftLeft is missed. keyDataList.clear(); - converter.handleEvent(keyDownEvent('ShiftLeft', 'Shift', kShift, kLocationLeft) - ..onPreventDefault = onPreventDefault - ); + event = keyDownEvent('ShiftLeft', 'Shift', kShift, kLocationLeft); + converter.handleEvent(event); expect(keyDataList, hasLength(2)); expectKeyData(keyDataList.first, type: ui.KeyEventType.up, @@ -489,12 +499,11 @@ void testMain() { logical: kLogicalShiftLeft, character: null, ); - expect(preventedDefault, isTrue); + expect(event.defaultPrevented, isTrue); keyDataList.clear(); - converter.handleEvent(keyUpEvent('ShiftLeft', 'Shift', 0, kLocationLeft) - ..onPreventDefault = onPreventDefault - ); + event = keyUpEvent('ShiftLeft', 'Shift', 0, kLocationLeft); + converter.handleEvent(event); expect(keyDataList, hasLength(1)); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, @@ -502,7 +511,7 @@ void testMain() { logical: kLogicalShiftLeft, character: null, ); - expect(preventedDefault, isTrue); + expect(event.defaultPrevented, isTrue); }); test('Duplicate ups are skipped', () { @@ -511,17 +520,15 @@ void testMain() { keyDataList.add(key); return true; }); - bool preventedDefault = false; - void onPreventDefault() { preventedDefault = true; } + MockKeyboardEvent event; // A KeyDown of ShiftRight is missed due to loss of focus. - converter.handleEvent(keyUpEvent('ShiftRight', 'Shift', 0, kLocationRight) - ..onPreventDefault = onPreventDefault - ); + event = keyUpEvent('ShiftRight', 'Shift', 0, kLocationRight); + converter.handleEvent(event); expect(keyDataList, hasLength(1)); expect(keyDataList[0].physical, 0); expect(keyDataList[0].logical, 0); - expect(preventedDefault, isTrue); + expect(event.defaultPrevented, isTrue); }); test('Conflict from multiple keyboards do not crash', () { @@ -530,22 +537,32 @@ void testMain() { keyDataList.add(key); return true; }); + MockKeyboardEvent event; // Same layout - converter.handleEvent(keyDownEvent('KeyA', 'a')); - converter.handleEvent(keyDownEvent('KeyA', 'a')); - converter.handleEvent(keyUpEvent('KeyA', 'a')); - converter.handleEvent(keyUpEvent('KeyA', 'a')); + event = keyDownEvent('KeyA', 'a'); + converter.handleEvent(event); + event = keyDownEvent('KeyA', 'a'); + converter.handleEvent(event); + event = keyUpEvent('KeyA', 'a'); + converter.handleEvent(event); + event = keyUpEvent('KeyA', 'a'); + converter.handleEvent(event); // Different layout - converter.handleEvent(keyDownEvent('KeyA', 'a')); - converter.handleEvent(keyDownEvent('KeyA', 'u')); - converter.handleEvent(keyUpEvent('KeyA', 'u')); - converter.handleEvent(keyUpEvent('KeyA', 'a')); + event = keyDownEvent('KeyA', 'a'); + converter.handleEvent(event); + event = keyDownEvent('KeyA', 'u'); + converter.handleEvent(event); + event = keyUpEvent('KeyA', 'u'); + converter.handleEvent(event); + event = keyUpEvent('KeyA', 'a'); + converter.handleEvent(event); // Passes if there's no crash, and states are reset after everything is released. keyDataList.clear(); - converter.handleEvent(keyDownEvent('KeyA', 'a')); + event = keyDownEvent('KeyA', 'a'); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalKeyA, @@ -553,7 +570,8 @@ void testMain() { character: 'a', ); - converter.handleEvent(keyDownEvent('KeyU', 'u')); + event = keyDownEvent('KeyU', 'u'); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalKeyU, @@ -568,13 +586,11 @@ void testMain() { keyDataList.add(key); return true; }, onMacOs: true); - bool preventedDefault = false; - void onPreventDefault() { preventedDefault = true; } + MockKeyboardEvent event; // A KeyDown of ShiftRight is missed due to loss of focus. - converter.handleEvent(keyDownEvent('CapsLock', 'CapsLock') - ..onPreventDefault = onPreventDefault - ); + event = keyDownEvent('CapsLock', 'CapsLock'); + converter.handleEvent(event); expect(keyDataList, hasLength(1)); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, @@ -582,9 +598,8 @@ void testMain() { logical: kLogicalCapsLock, character: null, ); - expect(preventedDefault, isTrue); + expect(event.defaultPrevented, isTrue); keyDataList.clear(); - preventedDefault = false; async.elapse(const Duration(microseconds: 1)); expect(keyDataList, hasLength(1)); @@ -595,12 +610,11 @@ void testMain() { character: null, synthesized: true, ); - expect(preventedDefault, isFalse); + expect(event.defaultPrevented, isTrue); keyDataList.clear(); - converter.handleEvent(keyUpEvent('CapsLock', 'CapsLock') - ..onPreventDefault = onPreventDefault - ); + event = keyUpEvent('CapsLock', 'CapsLock'); + converter.handleEvent(event); expect(keyDataList, hasLength(1)); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, @@ -608,9 +622,8 @@ void testMain() { logical: kLogicalCapsLock, character: null, ); - expect(preventedDefault, isTrue); + expect(event.defaultPrevented, isTrue); keyDataList.clear(); - preventedDefault = false; async.elapse(const Duration(microseconds: 1)); expect(keyDataList, hasLength(1)); @@ -621,11 +634,12 @@ void testMain() { character: null, synthesized: true, ); - expect(preventedDefault, isFalse); + expect(event.defaultPrevented, isTrue); keyDataList.clear(); // Another key down works - converter.handleEvent(keyDownEvent('CapsLock', 'CapsLock')); + event = keyDownEvent('CapsLock', 'CapsLock'); + converter.handleEvent(event); expect(keyDataList, hasLength(1)); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, @@ -647,9 +661,11 @@ void testMain() { final KeyboardConverter converter = KeyboardConverter((ui.KeyData key) { keyDataList.add(key); return true; - }); + }); // onMacOs: false + MockKeyboardEvent event; - converter.handleEvent(keyDownEvent('CapsLock', 'CapsLock')); + event = keyDownEvent('CapsLock', 'CapsLock'); + converter.handleEvent(event); expect(keyDataList, hasLength(1)); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, @@ -662,7 +678,8 @@ void testMain() { async.elapse(const Duration(seconds: 10)); expect(keyDataList, isEmpty); - converter.handleEvent(keyUpEvent('CapsLock', 'CapsLock')); + event = keyUpEvent('CapsLock', 'CapsLock'); + converter.handleEvent(event); expect(keyDataList, hasLength(1)); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, @@ -675,7 +692,8 @@ void testMain() { async.elapse(const Duration(seconds: 10)); expect(keyDataList, isEmpty); - converter.handleEvent(keyDownEvent('CapsLock', 'CapsLock')); + event = keyDownEvent('CapsLock', 'CapsLock'); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalCapsLock, @@ -683,7 +701,8 @@ void testMain() { character: null, ); - converter.handleEvent(keyUpEvent('CapsLock', 'CapsLock')); + event = keyUpEvent('CapsLock', 'CapsLock'); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, physical: kPhysicalCapsLock, @@ -698,11 +717,14 @@ void testMain() { keyDataList.add(key); return true; }, onMacOs: true); + MockKeyboardEvent event; - converter.handleEvent(keyDownEvent('MetaLeft', 'Meta', kMeta, kLocationLeft)..timeStamp = 100); + event = keyDownEvent('MetaLeft', 'Meta', kMeta, kLocationLeft)..timeStamp = 100; + converter.handleEvent(event); async.elapse(const Duration(milliseconds: 100)); - converter.handleEvent(keyDownEvent('KeyA', 'a', kMeta)..timeStamp = 200); + event = keyDownEvent('KeyA', 'a', kMeta)..timeStamp = 200; + converter.handleEvent(event); expectKeyData(keyDataList.last, timeStamp: const Duration(milliseconds: 200), type: ui.KeyEventType.down, @@ -725,7 +747,8 @@ void testMain() { ); keyDataList.clear(); - converter.handleEvent(keyUpEvent('MetaLeft', 'Meta', 0, kLocationLeft)..timeStamp = 2700); + event = keyUpEvent('MetaLeft', 'Meta', 0, kLocationLeft)..timeStamp = 2700; + converter.handleEvent(event); expectKeyData(keyDataList.last, timeStamp: const Duration(milliseconds: 2700), type: ui.KeyEventType.up, @@ -736,7 +759,8 @@ void testMain() { async.elapse(const Duration(milliseconds: 100)); // Key A states are cleared - converter.handleEvent(keyDownEvent('KeyA', 'a')..timeStamp = 2800); + event = keyDownEvent('KeyA', 'a')..timeStamp = 2800; + converter.handleEvent(event); expectKeyData(keyDataList.last, timeStamp: const Duration(milliseconds: 2800), type: ui.KeyEventType.down, @@ -746,7 +770,8 @@ void testMain() { ); async.elapse(const Duration(milliseconds: 100)); - converter.handleEvent(keyUpEvent('KeyA', 'a')..timeStamp = 2900); + event = keyUpEvent('KeyA', 'a')..timeStamp = 2900; + converter.handleEvent(event); expectKeyData(keyDataList.last, timeStamp: const Duration(milliseconds: 2900), type: ui.KeyEventType.up, @@ -762,18 +787,24 @@ void testMain() { keyDataList.add(key); return true; }, onMacOs: true); + MockKeyboardEvent event; - converter.handleEvent(keyDownEvent('MetaLeft', 'Meta', kMeta, kLocationLeft)..timeStamp = 100); + event = keyDownEvent('MetaLeft', 'Meta', kMeta, kLocationLeft)..timeStamp = 100; + converter.handleEvent(event); async.elapse(const Duration(milliseconds: 100)); - converter.handleEvent(keyDownEvent('KeyA', 'a', kMeta)..timeStamp = 200); + event = keyDownEvent('KeyA', 'a', kMeta)..timeStamp = 200; + converter.handleEvent(event); async.elapse(const Duration(milliseconds: 400)); - converter.handleEvent(keyRepeatedDownEvent('KeyA', 'a', kMeta)..timeStamp = 600); + event = keyRepeatedDownEvent('KeyA', 'a', kMeta)..timeStamp = 600; + converter.handleEvent(event); async.elapse(const Duration(milliseconds: 50)); - converter.handleEvent(keyRepeatedDownEvent('KeyA', 'a', kMeta)..timeStamp = 650); + event = keyRepeatedDownEvent('KeyA', 'a', kMeta)..timeStamp = 650; + converter.handleEvent(event); async.elapse(const Duration(milliseconds: 50)); - converter.handleEvent(keyRepeatedDownEvent('KeyA', 'a', kMeta)..timeStamp = 700); + event = keyRepeatedDownEvent('KeyA', 'a', kMeta)..timeStamp = 700; + converter.handleEvent(event); // Keyup of KeyA is omitted due to being a shortcut. @@ -788,7 +819,8 @@ void testMain() { ); keyDataList.clear(); - converter.handleEvent(keyUpEvent('MetaLeft', 'Meta', 0, kLocationLeft)..timeStamp = 3200); + event = keyUpEvent('MetaLeft', 'Meta', 0, kLocationLeft)..timeStamp = 3200; + converter.handleEvent(event); expectKeyData(keyDataList.last, timeStamp: const Duration(milliseconds: 3200), type: ui.KeyEventType.up, @@ -799,7 +831,8 @@ void testMain() { async.elapse(const Duration(milliseconds: 100)); // Key A states are cleared - converter.handleEvent(keyDownEvent('KeyA', 'a')..timeStamp = 3300); + event = keyDownEvent('KeyA', 'a')..timeStamp = 3300; + converter.handleEvent(event); expectKeyData(keyDataList.last, timeStamp: const Duration(milliseconds: 3300), type: ui.KeyEventType.down, @@ -809,7 +842,8 @@ void testMain() { ); async.elapse(const Duration(milliseconds: 100)); - converter.handleEvent(keyUpEvent('KeyA', 'a')..timeStamp = 3400); + event = keyUpEvent('KeyA', 'a')..timeStamp = 3400; + converter.handleEvent(event); expectKeyData(keyDataList.last, timeStamp: const Duration(milliseconds: 3400), type: ui.KeyEventType.up, @@ -825,11 +859,14 @@ void testMain() { keyDataList.add(key); return true; }); + MockKeyboardEvent event; - converter.handleEvent(keyDownEvent('MetaLeft', 'Meta', kMeta, kLocationLeft)..timeStamp = 100); + event = keyDownEvent('MetaLeft', 'Meta', kMeta, kLocationLeft)..timeStamp = 100; + converter.handleEvent(event); async.elapse(const Duration(milliseconds: 100)); - converter.handleEvent(keyDownEvent('KeyA', 'a', kCtrl)..timeStamp = 200); + event = keyDownEvent('KeyA', 'a', kCtrl)..timeStamp = 200; + converter.handleEvent(event); expectKeyData(keyDataList.last, timeStamp: const Duration(milliseconds: 200), type: ui.KeyEventType.down, @@ -840,10 +877,12 @@ void testMain() { keyDataList.clear(); async.elapse(const Duration(milliseconds: 500)); - converter.handleEvent(keyUpEvent('MetaLeft', 'Meta', 0, kLocationLeft)..timeStamp = 700); + event = keyUpEvent('MetaLeft', 'Meta', 0, kLocationLeft)..timeStamp = 700; + converter.handleEvent(event); async.elapse(const Duration(milliseconds: 100)); - converter.handleEvent(keyUpEvent('KeyA', 'a')..timeStamp = 800); + event = keyUpEvent('KeyA', 'a')..timeStamp = 800; + converter.handleEvent(event); expectKeyData(keyDataList.last, timeStamp: const Duration(milliseconds: 800), type: ui.KeyEventType.up, @@ -856,7 +895,8 @@ void testMain() { expect(keyDataList, isEmpty); // Key A states are cleared - converter.handleEvent(keyDownEvent('KeyA', 'a')..timeStamp = 2800); + event = keyDownEvent('KeyA', 'a')..timeStamp = 2800; + converter.handleEvent(event); expectKeyData(keyDataList.last, timeStamp: const Duration(milliseconds: 2800), type: ui.KeyEventType.down, @@ -866,7 +906,8 @@ void testMain() { ); async.elapse(const Duration(milliseconds: 100)); - converter.handleEvent(keyUpEvent('KeyA', 'a')..timeStamp = 2900); + event = keyUpEvent('KeyA', 'a')..timeStamp = 2900; + converter.handleEvent(event); expectKeyData(keyDataList.last, timeStamp: const Duration(milliseconds: 2900), type: ui.KeyEventType.up, @@ -881,12 +922,15 @@ void testMain() { final KeyboardConverter converter = KeyboardConverter((ui.KeyData key) { keyDataList.add(key); return true; - }); + }); // onMacOs: false + MockKeyboardEvent event; - converter.handleEvent(keyDownEvent('MetaLeft', 'Meta', kMeta, kLocationLeft)..timeStamp = 100); + event = keyDownEvent('MetaLeft', 'Meta', kMeta, kLocationLeft)..timeStamp = 100; + converter.handleEvent(event); async.elapse(const Duration(milliseconds: 100)); - converter.handleEvent(keyDownEvent('KeyA', 'a', kMeta)..timeStamp = 200); + event = keyDownEvent('KeyA', 'a', kMeta)..timeStamp = 200; + converter.handleEvent(event); expectKeyData(keyDataList.last, timeStamp: const Duration(milliseconds: 200), type: ui.KeyEventType.down, @@ -905,9 +949,11 @@ void testMain() { final KeyboardConverter converter = KeyboardConverter((ui.KeyData key) { keyDataList.add(key); return true; - }); + }); // onMacOs: false + MockKeyboardEvent event; - converter.handleEvent(keyDownEvent('ScrollLock', 'ScrollLock')); + event = keyDownEvent('ScrollLock', 'ScrollLock'); + converter.handleEvent(event); expect(keyDataList, hasLength(1)); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, @@ -920,7 +966,8 @@ void testMain() { async.elapse(const Duration(seconds: 10)); expect(keyDataList, isEmpty); - converter.handleEvent(keyUpEvent('ScrollLock', 'ScrollLock')); + event = keyUpEvent('ScrollLock', 'ScrollLock'); + converter.handleEvent(event); expect(keyDataList, hasLength(1)); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, @@ -930,7 +977,8 @@ void testMain() { ); keyDataList.clear(); - converter.handleEvent(keyDownEvent('ScrollLock', 'ScrollLock')); + event = keyDownEvent('ScrollLock', 'ScrollLock'); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalScrollLock, @@ -938,7 +986,8 @@ void testMain() { character: null, ); - converter.handleEvent(keyUpEvent('ScrollLock', 'ScrollLock')); + event = keyUpEvent('ScrollLock', 'ScrollLock'); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, physical: kPhysicalScrollLock, @@ -952,9 +1001,11 @@ void testMain() { final KeyboardConverter converter = KeyboardConverter((ui.KeyData key) { keyDataList.add(key); return true; - }); + }); // onMacOs: false + MockKeyboardEvent event; - converter.handleEvent(keyDownEvent('ShiftRight', 'Shift', kShift, kLocationRight)); + event = keyDownEvent('ShiftRight', 'Shift', kShift, kLocationRight); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalShiftRight, @@ -962,7 +1013,8 @@ void testMain() { character: null, ); - converter.handleEvent(keyDownEvent('ShiftLeft', 'Shift', kShift, kLocationLeft)); + event = keyDownEvent('ShiftLeft', 'Shift', kShift, kLocationLeft); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalShiftLeft, @@ -973,7 +1025,8 @@ void testMain() { // The release of the shift keys are omitted - converter.handleEvent(keyDownEvent('KeyA', 'a')); + event = keyDownEvent('KeyA', 'a'); + converter.handleEvent(event); expect(keyDataList, hasLength(3)); expectKeyData(keyDataList[0], type: ui.KeyEventType.up, @@ -1008,9 +1061,11 @@ void testMain() { final KeyboardConverter converter = KeyboardConverter((ui.KeyData key) { keyDataList.add(key); return true; - }); + }); // onMacOs: false + MockKeyboardEvent event; - converter.handleEvent(keyDownEvent('ShiftLeft', 'Shift', kShift, kLocationLeft)); + event = keyDownEvent('ShiftLeft', 'Shift', kShift, kLocationLeft); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalShiftLeft, @@ -1019,7 +1074,8 @@ void testMain() { ); keyDataList.clear(); - converter.handleEvent(keyDownEvent('MetaLeft', 'Meta', kShift /* No kMeta here! */, kLocationLeft)); + event = keyDownEvent('MetaLeft', 'Meta', kShift /* No kMeta here! */, kLocationLeft); + converter.handleEvent(event); // Only a MetaLeft down event, no synthesized MetaLeft up events. expect(keyDataList, hasLength(1)); expectKeyData(keyDataList.first, @@ -1030,7 +1086,8 @@ void testMain() { ); keyDataList.clear(); - converter.handleEvent(keyUpEvent('MetaLeft', 'Meta', kShift | kMeta /* Yes, kMeta here! */, kLocationLeft)); + event = keyUpEvent('MetaLeft', 'Meta', kShift | kMeta /* Yes, kMeta here! */, kLocationLeft); + converter.handleEvent(event); // Only a MetaLeft down event, no synthesized MetaLeft up events. expect(keyDataList, hasLength(1)); expectKeyData(keyDataList.first, @@ -1041,7 +1098,8 @@ void testMain() { ); keyDataList.clear(); - converter.handleEvent(keyUpEvent('ShiftLeft', 'Shift', 0, kLocationLeft)); + event = keyUpEvent('ShiftLeft', 'Shift', 0, kLocationLeft); + converter.handleEvent(event); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, physical: kPhysicalShiftLeft, @@ -1052,60 +1110,6 @@ void testMain() { }); } -class MockKeyboardEvent implements FlutterHtmlKeyboardEvent { - MockKeyboardEvent({ - required this.type, - required this.code, - required this.key, - this.timeStamp = 0, - this.repeat = false, - this.altKey = false, - this.ctrlKey = false, - this.shiftKey = false, - this.metaKey = false, - this.location = 0, - this.onPreventDefault, - }); - - @override - String type; - - @override - String? code; - - @override - String? key; - - @override - bool? repeat; - - @override - num? timeStamp; - - @override - bool altKey; - - @override - bool ctrlKey; - - @override - bool shiftKey; - - @override - bool metaKey; - - @override - int? location; - - @override - bool getModifierState(String key) => modifierState.contains(key); - final Set modifierState = {}; - - @override - void preventDefault() { onPreventDefault?.call(); } - VoidCallback? onPreventDefault; -} - // Flags used for the `modifiers` argument of `key***Event` functions. const int kAlt = 0x1; const int kCtrl = 0x2; @@ -1114,7 +1118,7 @@ const int kMeta = 0x8; // Utility functions to make code more concise. // -// To add timeStamp or onPreventDefault, use syntax like `..timeStamp = `. +// To add timeStamp , use syntax `..timeStamp = `. MockKeyboardEvent keyDownEvent(String code, String key, [int modifiers = 0, int location = 0]) { return MockKeyboardEvent( type: 'keydown', diff --git a/lib/web_ui/test/keyboard_test_common.dart b/lib/web_ui/test/keyboard_test_common.dart new file mode 100644 index 0000000000000..22f77bf871838 --- /dev/null +++ b/lib/web_ui/test/keyboard_test_common.dart @@ -0,0 +1,80 @@ +// 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:ui/src/engine.dart'; + +typedef VoidCallback = void Function(); + +class MockKeyboardEvent implements FlutterHtmlKeyboardEvent { + MockKeyboardEvent({ + required this.type, + required this.code, + required this.key, + this.timeStamp = 0, + this.repeat = false, + this.keyCode = 0, + bool altKey = false, + bool ctrlKey = false, + bool shiftKey = false, + bool metaKey = false, + bool altGrKey = false, + this.location = 0, + this.onPreventDefault, + }) : modifierState = + { + if (altKey) 'Alt', + if (ctrlKey) 'Control', + if (shiftKey) 'Shift', + if (metaKey) 'Meta', + if (altGrKey) 'AltGraph', + }; + + @override + String type; + + @override + String? code; + + @override + String? key; + + @override + bool? repeat; + + @override + int keyCode; + + @override + num? timeStamp; + + @override + bool get altKey => modifierState.contains('Alt'); + + @override + bool get ctrlKey => modifierState.contains('Control'); + + @override + bool get shiftKey => modifierState.contains('Shift'); + + @override + bool get metaKey => modifierState.contains('Meta'); + + @override + int? location; + + @override + bool getModifierState(String key) => modifierState.contains(key); + final Set modifierState; + + @override + void preventDefault() { + onPreventDefault?.call(); + _defaultPrevented = true; + } + VoidCallback? onPreventDefault; + + @override + bool get defaultPrevented => _defaultPrevented; + bool _defaultPrevented = false; +} diff --git a/lib/web_ui/test/keyboard_test.dart b/lib/web_ui/test/raw_keyboard_test.dart similarity index 93% rename from lib/web_ui/test/keyboard_test.dart rename to lib/web_ui/test/raw_keyboard_test.dart index 5c6425ffa1c4a..4bccfc335fc16 100644 --- a/lib/web_ui/test/keyboard_test.dart +++ b/lib/web_ui/test/raw_keyboard_test.dart @@ -10,7 +10,7 @@ import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/src/engine/browser_detection.dart'; import 'package:ui/src/engine/dom.dart'; -import 'package:ui/src/engine/keyboard.dart'; +import 'package:ui/src/engine/raw_keyboard.dart'; import 'package:ui/src/engine/services.dart'; import 'package:ui/src/engine/text_editing/text_editing.dart'; import 'package:ui/ui.dart' as ui; @@ -20,7 +20,7 @@ void main() { } void testMain() { - group('Keyboard', () { + group('RawKeyboard', () { /// Used to save and restore [ui.window.onPlatformMessage] after each test. ui.PlatformMessageCallback? savedCallback; @@ -33,15 +33,15 @@ void testMain() { }); test('initializes and disposes', () { - expect(Keyboard.instance, isNull); - Keyboard.initialize(); - expect(Keyboard.instance, isA()); - Keyboard.instance!.dispose(); - expect(Keyboard.instance, isNull); + expect(RawKeyboard.instance, isNull); + RawKeyboard.initialize(); + expect(RawKeyboard.instance, isA()); + RawKeyboard.instance!.dispose(); + expect(RawKeyboard.instance, isNull); }); test('dispatches keyup to flutter/keyevent channel', () { - Keyboard.initialize(); + RawKeyboard.initialize(); String? channelReceived; Map? dataReceived; @@ -67,13 +67,13 @@ void testMain() { 'keyCode': 1, }); - Keyboard.instance!.dispose(); + RawKeyboard.instance!.dispose(); }, // TODO(mdebbar): https://github.com/flutter/flutter/issues/50815 skip: browserEngine == BrowserEngine.edge); test('dispatches keydown to flutter/keyevent channel', () { - Keyboard.initialize(); + RawKeyboard.initialize(); String? channelReceived; Map? dataReceived; @@ -100,13 +100,13 @@ void testMain() { }); expect(event.defaultPrevented, isFalse); - Keyboard.instance!.dispose(); + RawKeyboard.instance!.dispose(); }, // TODO(mdebbar): https://github.com/flutter/flutter/issues/50815 skip: browserEngine == BrowserEngine.edge); test('dispatches correct meta state', () { - Keyboard.initialize(); + RawKeyboard.initialize(); Map? dataReceived; ui.window.onPlatformMessage = (String channel, ByteData? data, @@ -154,13 +154,13 @@ void testMain() { 'keyCode': 0, }); - Keyboard.instance!.dispose(); + RawKeyboard.instance!.dispose(); }, // TODO(mdebbar): https://github.com/flutter/flutter/issues/50815 skip: browserEngine == BrowserEngine.edge); test('dispatches repeat events', () { - Keyboard.initialize(); + RawKeyboard.initialize(); final List> messages = >[]; ui.window.onPlatformMessage = (String channel, ByteData? data, @@ -209,13 +209,13 @@ void testMain() { expectedMessage, ]); - Keyboard.instance!.dispose(); + RawKeyboard.instance!.dispose(); }, // TODO(mdebbar): https://github.com/flutter/flutter/issues/50815 skip: browserEngine == BrowserEngine.edge); test('stops dispatching events after dispose', () { - Keyboard.initialize(); + RawKeyboard.initialize(); int count = 0; ui.window.onPlatformMessage = (String channel, ByteData? data, @@ -228,8 +228,8 @@ void testMain() { dispatchKeyboardEvent('keyup'); expect(count, 2); - Keyboard.instance!.dispose(); - expect(Keyboard.instance, isNull); + RawKeyboard.instance!.dispose(); + expect(RawKeyboard.instance, isNull); // No more event dispatching. dispatchKeyboardEvent('keydown'); @@ -239,7 +239,7 @@ void testMain() { }); test('prevents default when key is handled by the framework', () { - Keyboard.initialize(); + RawKeyboard.initialize(); int count = 0; ui.window.onPlatformMessage = (String channel, ByteData? data, @@ -258,11 +258,11 @@ void testMain() { expect(event.defaultPrevented, isTrue); expect(count, 1); - Keyboard.instance!.dispose(); + RawKeyboard.instance!.dispose(); }); test("Doesn't prevent default when key is not handled by the framework", () { - Keyboard.initialize(); + RawKeyboard.initialize(); int count = 0; ui.window.onPlatformMessage = (String channel, ByteData? data, @@ -281,11 +281,11 @@ void testMain() { expect(event.defaultPrevented, isFalse); expect(count, 1); - Keyboard.instance!.dispose(); + RawKeyboard.instance!.dispose(); }); test('keyboard events should be triggered on text fields', () { - Keyboard.initialize(); + RawKeyboard.initialize(); int count = 0; ui.window.onPlatformMessage = (String channel, ByteData? data, @@ -305,11 +305,11 @@ void testMain() { expect(count, 1); }); - Keyboard.instance!.dispose(); + RawKeyboard.instance!.dispose(); }); test('the "Tab" key should never be ignored', () { - Keyboard.initialize(); + RawKeyboard.initialize(); int count = 0; ui.window.onPlatformMessage = (String channel, ByteData? data, @@ -331,7 +331,7 @@ void testMain() { expect(count, 1); }); - Keyboard.instance!.dispose(); + RawKeyboard.instance!.dispose(); }); testFakeAsync( @@ -344,7 +344,7 @@ void testMain() { // // There's no `keyup(i)`. The web engine is expected to synthesize a // `keyup(i)` event. - Keyboard.initialize(onMacOs: true); + RawKeyboard.initialize(onMacOs: true); final List> messages = >[]; ui.window.onPlatformMessage = (String channel, ByteData? data, @@ -460,14 +460,14 @@ void testMain() { } ]); - Keyboard.instance!.dispose(); + RawKeyboard.instance!.dispose(); }, ); testFakeAsync( 'On macOS, do not synthesize keyup when we receive repeat events', (FakeAsync async) { - Keyboard.initialize(onMacOs: true); + RawKeyboard.initialize(onMacOs: true); final List> messages = >[]; ui.window.onPlatformMessage = (String channel, ByteData? data, @@ -542,14 +542,14 @@ void testMain() { } messages.clear(); - Keyboard.instance!.dispose(); + RawKeyboard.instance!.dispose(); }, ); testFakeAsync( 'On macOS, do not synthesize keyup when keys are not affected by meta modifiers', (FakeAsync async) { - Keyboard.initialize(); + RawKeyboard.initialize(); final List> messages = >[]; ui.window.onPlatformMessage = (String channel, ByteData? data, @@ -574,12 +574,12 @@ void testMain() { async.elapse(const Duration(seconds: 3)); expect(messages, hasLength(0)); - Keyboard.instance!.dispose(); + RawKeyboard.instance!.dispose(); }, ); testFakeAsync('On macOS, do not synthesize keyup for meta keys', (FakeAsync async) { - Keyboard.initialize(onMacOs: true); + RawKeyboard.initialize(onMacOs: true); final List> messages = >[]; ui.window.onPlatformMessage = (String channel, ByteData? data, @@ -637,13 +637,13 @@ void testMain() { } ]); - Keyboard.instance!.dispose(); + RawKeyboard.instance!.dispose(); }); testFakeAsync( 'On non-macOS, do not synthesize keyup for shortcuts', (FakeAsync async) { - Keyboard.initialize(); + RawKeyboard.initialize(); // onMacOs: false final List> messages = >[]; ui.window.onPlatformMessage = (String channel, ByteData? data, @@ -696,7 +696,7 @@ void testMain() { async.elapse(const Duration(seconds: 3)); expect(messages, isEmpty); - Keyboard.instance!.dispose(); + RawKeyboard.instance!.dispose(); }, ); From 6e0eb2c4adef948ead36bf696e7bc7666669b233 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 3 Oct 2022 11:03:43 -0700 Subject: [PATCH 2/2] Remove extra event creation line --- lib/web_ui/test/keyboard_converter_test.dart | 326 +++++++------------ lib/web_ui/test/keyboard_test_common.dart | 7 +- 2 files changed, 115 insertions(+), 218 deletions(-) diff --git a/lib/web_ui/test/keyboard_converter_test.dart b/lib/web_ui/test/keyboard_converter_test.dart index 619c18a59d80d..53dba7f2e8d7a 100644 --- a/lib/web_ui/test/keyboard_converter_test.dart +++ b/lib/web_ui/test/keyboard_converter_test.dart @@ -86,10 +86,8 @@ void testMain() { // Only handle down events return key.type == ui.KeyEventType.down; }); - MockKeyboardEvent event; - event = keyDownEvent('KeyA', 'a')..timeStamp = 1; - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('KeyA', 'a')..timeStamp = 1); expectKeyData(keyDataList.last, timeStamp: const Duration(milliseconds: 1), type: ui.KeyEventType.down, @@ -97,10 +95,9 @@ void testMain() { logical: kLogicalKeyA, character: 'a', ); - expect(event.defaultPrevented, isTrue); + expect(MockKeyboardEvent.lastDefaultPrevented, isTrue); - event = keyRepeatedDownEvent('KeyA', 'a')..timeStamp = 1.5; - converter.handleEvent(event); + converter.handleEvent(keyRepeatedDownEvent('KeyA', 'a')..timeStamp = 1.5); expectKeyData(keyDataList.last, timeStamp: const Duration(milliseconds: 1, microseconds: 500), type: ui.KeyEventType.repeat, @@ -108,10 +105,9 @@ void testMain() { logical: kLogicalKeyA, character: 'a', ); - expect(event.defaultPrevented, isFalse); + expect(MockKeyboardEvent.lastDefaultPrevented, isFalse); - event = keyRepeatedDownEvent('KeyA', 'a')..timeStamp = 1500; - converter.handleEvent(event); + converter.handleEvent(keyRepeatedDownEvent('KeyA', 'a')..timeStamp = 1500); expectKeyData(keyDataList.last, timeStamp: const Duration(seconds: 1, milliseconds: 500), type: ui.KeyEventType.repeat, @@ -119,10 +115,9 @@ void testMain() { logical: kLogicalKeyA, character: 'a', ); - expect(event.defaultPrevented, isFalse); + expect(MockKeyboardEvent.lastDefaultPrevented, isFalse); - event = keyUpEvent('KeyA', 'a')..timeStamp = 2000.5; - converter.handleEvent(event); + converter.handleEvent(keyUpEvent('KeyA', 'a')..timeStamp = 2000.5); expectKeyData(keyDataList.last, timeStamp: const Duration(seconds: 2, microseconds: 500), type: ui.KeyEventType.up, @@ -130,7 +125,7 @@ void testMain() { logical: kLogicalKeyA, character: null, ); - expect(event.defaultPrevented, isFalse); + expect(MockKeyboardEvent.lastDefaultPrevented, isFalse); }); test('Release modifier during a repeated sequence', () { @@ -140,77 +135,69 @@ void testMain() { // Only handle down events return key.type == ui.KeyEventType.down; }); - MockKeyboardEvent event; - event = keyDownEvent('ShiftLeft', 'Shift', kShift, kLocationLeft); - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('ShiftLeft', 'Shift', kShift, kLocationLeft)); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalShiftLeft, logical: kLogicalShiftLeft, character: null, ); - expect(event.defaultPrevented, isTrue); + expect(MockKeyboardEvent.lastDefaultPrevented, isTrue); - event = keyDownEvent('KeyA', 'A', kShift); - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('KeyA', 'A', kShift)); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalKeyA, logical: kLogicalKeyA, character: 'A', ); - expect(event.defaultPrevented, isTrue); + expect(MockKeyboardEvent.lastDefaultPrevented, isTrue); - event = keyRepeatedDownEvent('KeyA', 'A', kShift); - converter.handleEvent(event); + converter.handleEvent(keyRepeatedDownEvent('KeyA', 'A', kShift)); expectKeyData(keyDataList.last, type: ui.KeyEventType.repeat, physical: kPhysicalKeyA, logical: kLogicalKeyA, character: 'A', ); - expect(event.defaultPrevented, isFalse); + expect(MockKeyboardEvent.lastDefaultPrevented, isFalse); - event = keyUpEvent('ShiftLeft', 'Shift', 0, kLocationLeft); - converter.handleEvent(event); + converter.handleEvent(keyUpEvent('ShiftLeft', 'Shift', 0, kLocationLeft)); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, physical: kPhysicalShiftLeft, logical: kLogicalShiftLeft, character: null, ); - expect(event.defaultPrevented, isFalse); + expect(MockKeyboardEvent.lastDefaultPrevented, isFalse); - event = keyRepeatedDownEvent('KeyA', 'a'); - converter.handleEvent(event); + converter.handleEvent(keyRepeatedDownEvent('KeyA', 'a')); expectKeyData(keyDataList.last, type: ui.KeyEventType.repeat, physical: kPhysicalKeyA, logical: kLogicalKeyA, character: 'a', ); - expect(event.defaultPrevented, isFalse); + expect(MockKeyboardEvent.lastDefaultPrevented, isFalse); - event = keyRepeatedDownEvent('KeyA', 'a'); - converter.handleEvent(event); + converter.handleEvent(keyRepeatedDownEvent('KeyA', 'a')); expectKeyData(keyDataList.last, type: ui.KeyEventType.repeat, physical: kPhysicalKeyA, logical: kLogicalKeyA, character: 'a', ); - expect(event.defaultPrevented, isFalse); + expect(MockKeyboardEvent.lastDefaultPrevented, isFalse); - event = keyUpEvent('KeyA', 'a'); - converter.handleEvent(event); + converter.handleEvent(keyUpEvent('KeyA', 'a')); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, physical: kPhysicalKeyA, logical: kLogicalKeyA, character: null, ); - expect(event.defaultPrevented, isFalse); + expect(MockKeyboardEvent.lastDefaultPrevented, isFalse); }); test('Distinguish between left and right modifiers', () { @@ -219,10 +206,8 @@ void testMain() { keyDataList.add(key); return true; }); - MockKeyboardEvent event; - event = keyDownEvent('ShiftLeft', 'Shift', kShift, kLocationLeft); - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('ShiftLeft', 'Shift', kShift, kLocationLeft)); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalShiftLeft, @@ -230,8 +215,7 @@ void testMain() { character: null, ); - event = keyDownEvent('ShiftRight', 'Shift', kShift, kLocationRight); - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('ShiftRight', 'Shift', kShift, kLocationRight)); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalShiftRight, @@ -239,8 +223,7 @@ void testMain() { character: null, ); - event = keyUpEvent('ShiftLeft', 'Shift', kShift, kLocationLeft); - converter.handleEvent(event); + converter.handleEvent(keyUpEvent('ShiftLeft', 'Shift', kShift, kLocationLeft)); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, physical: kPhysicalShiftLeft, @@ -248,8 +231,7 @@ void testMain() { character: null, ); - event = keyUpEvent('ShiftRight', 'Shift', 0, kLocationRight); - converter.handleEvent(event); + converter.handleEvent(keyUpEvent('ShiftRight', 'Shift', 0, kLocationRight)); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, physical: kPhysicalShiftRight, @@ -264,10 +246,8 @@ void testMain() { keyDataList.add(key); return true; }); - MockKeyboardEvent event; - event = keyDownEvent('', 'Shift', kShift); - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('', 'Shift', kShift)); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalEmptyCode, @@ -275,8 +255,7 @@ void testMain() { character: null, ); - event = keyUpEvent('', 'Shift', kShift); - converter.handleEvent(event); + converter.handleEvent(keyUpEvent('', 'Shift', kShift)); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, physical: kPhysicalEmptyCode, @@ -284,8 +263,7 @@ void testMain() { character: null, ); - event = keyDownEvent('', 'Control', kCtrl); - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('', 'Control', kCtrl)); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalEmptyCode, @@ -293,8 +271,7 @@ void testMain() { character: null, ); - event = keyUpEvent('', 'Control', kCtrl); - converter.handleEvent(event); + converter.handleEvent(keyUpEvent('', 'Control', kCtrl)); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, physical: kPhysicalEmptyCode, @@ -302,8 +279,7 @@ void testMain() { character: null, ); - event = keyDownEvent('', 'Alt', kAlt); - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('', 'Alt', kAlt)); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalEmptyCode, @@ -311,8 +287,7 @@ void testMain() { character: null, ); - event = keyUpEvent('', 'Alt', kAlt); - converter.handleEvent(event); + converter.handleEvent(keyUpEvent('', 'Alt', kAlt)); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, physical: kPhysicalEmptyCode, @@ -320,8 +295,7 @@ void testMain() { character: null, ); - event = keyDownEvent('', 'Meta', kMeta); - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('', 'Meta', kMeta)); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalEmptyCode, @@ -329,8 +303,7 @@ void testMain() { character: null, ); - event = keyUpEvent('', 'Meta', kMeta); - converter.handleEvent(event); + converter.handleEvent(keyUpEvent('', 'Meta', kMeta)); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, physical: kPhysicalEmptyCode, @@ -345,10 +318,8 @@ void testMain() { keyDataList.add(key); return true; }); - MockKeyboardEvent event; - event = keyDownEvent('Digit1', '1'); - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('Digit1', '1')); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalDigit1, @@ -356,8 +327,7 @@ void testMain() { character: '1', ); - event = keyDownEvent('Numpad1', '1', 0, kLocationNumpad); - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('Numpad1', '1', 0, kLocationNumpad)); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalNumpad1, @@ -365,8 +335,7 @@ void testMain() { character: '1', ); - event = keyUpEvent('Digit1', '1'); - converter.handleEvent(event); + converter.handleEvent(keyUpEvent('Digit1', '1')); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, physical: kPhysicalDigit1, @@ -374,8 +343,7 @@ void testMain() { character: null, ); - event = keyUpEvent('Numpad1', '1', 0, kLocationNumpad); - converter.handleEvent(event); + converter.handleEvent(keyUpEvent('Numpad1', '1', 0, kLocationNumpad)); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, physical: kPhysicalNumpad1, @@ -390,7 +358,6 @@ void testMain() { keyDataList.add(key); return true; }); - MockKeyboardEvent event; // The absolute values of the following logical keys are not guaranteed. const int kLogicalAltE = 0x1740070008; @@ -400,11 +367,9 @@ void testMain() { expect(kLogicalAltE, isNot(equals(kLogicalAltU))); expect(kLogicalAltE, isNot(equals(kLogicalAltShiftE))); - event = keyDownEvent('AltLeft', 'Alt', kAlt, kLocationLeft); - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('AltLeft', 'Alt', kAlt, kLocationLeft)); - event = keyDownEvent('KeyE', 'Dead', kAlt); - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('KeyE', 'Dead', kAlt)); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalKeyE, @@ -412,8 +377,7 @@ void testMain() { character: null, ); - event = keyUpEvent('KeyE', 'Dead', kAlt); - converter.handleEvent(event); + converter.handleEvent(keyUpEvent('KeyE', 'Dead', kAlt)); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, physical: kPhysicalKeyE, @@ -421,8 +385,7 @@ void testMain() { character: null, ); - event = keyDownEvent('KeyU', 'Dead', kAlt); - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('KeyU', 'Dead', kAlt)); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalKeyU, @@ -430,8 +393,7 @@ void testMain() { character: null, ); - event = keyUpEvent('KeyU', 'Dead', kAlt); - converter.handleEvent(event); + converter.handleEvent(keyUpEvent('KeyU', 'Dead', kAlt)); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, physical: kPhysicalKeyU, @@ -439,13 +401,11 @@ void testMain() { character: null, ); - event = keyDownEvent('ShiftLeft', 'Shift', kAlt | kShift, kLocationLeft); - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('ShiftLeft', 'Shift', kAlt | kShift, kLocationLeft)); // This does not actually produce a Dead key on macOS (US layout); just for // testing. - event = keyDownEvent('KeyE', 'Dead', kAlt | kShift); - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('KeyE', 'Dead', kAlt | kShift)); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalKeyE, @@ -453,11 +413,9 @@ void testMain() { character: null, ); - event = keyUpEvent('AltLeft', 'Alt', kShift, kLocationLeft); - converter.handleEvent(event); + converter.handleEvent(keyUpEvent('AltLeft', 'Alt', kShift, kLocationLeft)); - event = keyUpEvent('KeyE', 'e', kShift); - converter.handleEvent(event); + converter.handleEvent(keyUpEvent('KeyE', 'e', kShift)); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, physical: kPhysicalKeyE, @@ -465,8 +423,7 @@ void testMain() { character: null, ); - event = keyUpEvent('ShiftLeft', 'Shift', 0, kLocationLeft); - converter.handleEvent(event); + converter.handleEvent(keyUpEvent('ShiftLeft', 'Shift', 0, kLocationLeft)); }); test('Duplicate down is preceded with synthesized up', () { @@ -475,16 +432,13 @@ void testMain() { keyDataList.add(key); return true; }); - MockKeyboardEvent event; - event = keyDownEvent('ShiftLeft', 'Shift', kShift, kLocationLeft); - converter.handleEvent(event); - expect(event.defaultPrevented, isTrue); + converter.handleEvent(keyDownEvent('ShiftLeft', 'Shift', kShift, kLocationLeft)); + expect(MockKeyboardEvent.lastDefaultPrevented, isTrue); // A KeyUp of ShiftLeft is missed. keyDataList.clear(); - event = keyDownEvent('ShiftLeft', 'Shift', kShift, kLocationLeft); - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('ShiftLeft', 'Shift', kShift, kLocationLeft)); expect(keyDataList, hasLength(2)); expectKeyData(keyDataList.first, type: ui.KeyEventType.up, @@ -499,11 +453,10 @@ void testMain() { logical: kLogicalShiftLeft, character: null, ); - expect(event.defaultPrevented, isTrue); + expect(MockKeyboardEvent.lastDefaultPrevented, isTrue); keyDataList.clear(); - event = keyUpEvent('ShiftLeft', 'Shift', 0, kLocationLeft); - converter.handleEvent(event); + converter.handleEvent(keyUpEvent('ShiftLeft', 'Shift', 0, kLocationLeft)); expect(keyDataList, hasLength(1)); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, @@ -511,7 +464,7 @@ void testMain() { logical: kLogicalShiftLeft, character: null, ); - expect(event.defaultPrevented, isTrue); + expect(MockKeyboardEvent.lastDefaultPrevented, isTrue); }); test('Duplicate ups are skipped', () { @@ -520,15 +473,13 @@ void testMain() { keyDataList.add(key); return true; }); - MockKeyboardEvent event; // A KeyDown of ShiftRight is missed due to loss of focus. - event = keyUpEvent('ShiftRight', 'Shift', 0, kLocationRight); - converter.handleEvent(event); + converter.handleEvent(keyUpEvent('ShiftRight', 'Shift', 0, kLocationRight)); expect(keyDataList, hasLength(1)); expect(keyDataList[0].physical, 0); expect(keyDataList[0].logical, 0); - expect(event.defaultPrevented, isTrue); + expect(MockKeyboardEvent.lastDefaultPrevented, isTrue); }); test('Conflict from multiple keyboards do not crash', () { @@ -537,32 +488,22 @@ void testMain() { keyDataList.add(key); return true; }); - MockKeyboardEvent event; // Same layout - event = keyDownEvent('KeyA', 'a'); - converter.handleEvent(event); - event = keyDownEvent('KeyA', 'a'); - converter.handleEvent(event); - event = keyUpEvent('KeyA', 'a'); - converter.handleEvent(event); - event = keyUpEvent('KeyA', 'a'); - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('KeyA', 'a')); + converter.handleEvent(keyDownEvent('KeyA', 'a')); + converter.handleEvent(keyUpEvent('KeyA', 'a')); + converter.handleEvent(keyUpEvent('KeyA', 'a')); // Different layout - event = keyDownEvent('KeyA', 'a'); - converter.handleEvent(event); - event = keyDownEvent('KeyA', 'u'); - converter.handleEvent(event); - event = keyUpEvent('KeyA', 'u'); - converter.handleEvent(event); - event = keyUpEvent('KeyA', 'a'); - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('KeyA', 'a')); + converter.handleEvent(keyDownEvent('KeyA', 'u')); + converter.handleEvent(keyUpEvent('KeyA', 'u')); + converter.handleEvent(keyUpEvent('KeyA', 'a')); // Passes if there's no crash, and states are reset after everything is released. keyDataList.clear(); - event = keyDownEvent('KeyA', 'a'); - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('KeyA', 'a')); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalKeyA, @@ -570,8 +511,7 @@ void testMain() { character: 'a', ); - event = keyDownEvent('KeyU', 'u'); - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('KeyU', 'u')); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalKeyU, @@ -586,11 +526,9 @@ void testMain() { keyDataList.add(key); return true; }, onMacOs: true); - MockKeyboardEvent event; // A KeyDown of ShiftRight is missed due to loss of focus. - event = keyDownEvent('CapsLock', 'CapsLock'); - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('CapsLock', 'CapsLock')); expect(keyDataList, hasLength(1)); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, @@ -598,7 +536,7 @@ void testMain() { logical: kLogicalCapsLock, character: null, ); - expect(event.defaultPrevented, isTrue); + expect(MockKeyboardEvent.lastDefaultPrevented, isTrue); keyDataList.clear(); async.elapse(const Duration(microseconds: 1)); @@ -610,11 +548,10 @@ void testMain() { character: null, synthesized: true, ); - expect(event.defaultPrevented, isTrue); + expect(MockKeyboardEvent.lastDefaultPrevented, isTrue); keyDataList.clear(); - event = keyUpEvent('CapsLock', 'CapsLock'); - converter.handleEvent(event); + converter.handleEvent(keyUpEvent('CapsLock', 'CapsLock')); expect(keyDataList, hasLength(1)); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, @@ -622,7 +559,7 @@ void testMain() { logical: kLogicalCapsLock, character: null, ); - expect(event.defaultPrevented, isTrue); + expect(MockKeyboardEvent.lastDefaultPrevented, isTrue); keyDataList.clear(); async.elapse(const Duration(microseconds: 1)); @@ -634,12 +571,11 @@ void testMain() { character: null, synthesized: true, ); - expect(event.defaultPrevented, isTrue); + expect(MockKeyboardEvent.lastDefaultPrevented, isTrue); keyDataList.clear(); // Another key down works - event = keyDownEvent('CapsLock', 'CapsLock'); - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('CapsLock', 'CapsLock')); expect(keyDataList, hasLength(1)); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, @@ -662,10 +598,8 @@ void testMain() { keyDataList.add(key); return true; }); // onMacOs: false - MockKeyboardEvent event; - event = keyDownEvent('CapsLock', 'CapsLock'); - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('CapsLock', 'CapsLock')); expect(keyDataList, hasLength(1)); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, @@ -678,8 +612,7 @@ void testMain() { async.elapse(const Duration(seconds: 10)); expect(keyDataList, isEmpty); - event = keyUpEvent('CapsLock', 'CapsLock'); - converter.handleEvent(event); + converter.handleEvent(keyUpEvent('CapsLock', 'CapsLock')); expect(keyDataList, hasLength(1)); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, @@ -692,8 +625,7 @@ void testMain() { async.elapse(const Duration(seconds: 10)); expect(keyDataList, isEmpty); - event = keyDownEvent('CapsLock', 'CapsLock'); - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('CapsLock', 'CapsLock')); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalCapsLock, @@ -701,8 +633,7 @@ void testMain() { character: null, ); - event = keyUpEvent('CapsLock', 'CapsLock'); - converter.handleEvent(event); + converter.handleEvent(keyUpEvent('CapsLock', 'CapsLock')); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, physical: kPhysicalCapsLock, @@ -717,14 +648,11 @@ void testMain() { keyDataList.add(key); return true; }, onMacOs: true); - MockKeyboardEvent event; - event = keyDownEvent('MetaLeft', 'Meta', kMeta, kLocationLeft)..timeStamp = 100; - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('MetaLeft', 'Meta', kMeta, kLocationLeft)..timeStamp = 100); async.elapse(const Duration(milliseconds: 100)); - event = keyDownEvent('KeyA', 'a', kMeta)..timeStamp = 200; - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('KeyA', 'a', kMeta)..timeStamp = 200); expectKeyData(keyDataList.last, timeStamp: const Duration(milliseconds: 200), type: ui.KeyEventType.down, @@ -747,8 +675,7 @@ void testMain() { ); keyDataList.clear(); - event = keyUpEvent('MetaLeft', 'Meta', 0, kLocationLeft)..timeStamp = 2700; - converter.handleEvent(event); + converter.handleEvent(keyUpEvent('MetaLeft', 'Meta', 0, kLocationLeft)..timeStamp = 2700); expectKeyData(keyDataList.last, timeStamp: const Duration(milliseconds: 2700), type: ui.KeyEventType.up, @@ -759,8 +686,7 @@ void testMain() { async.elapse(const Duration(milliseconds: 100)); // Key A states are cleared - event = keyDownEvent('KeyA', 'a')..timeStamp = 2800; - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('KeyA', 'a')..timeStamp = 2800); expectKeyData(keyDataList.last, timeStamp: const Duration(milliseconds: 2800), type: ui.KeyEventType.down, @@ -770,8 +696,7 @@ void testMain() { ); async.elapse(const Duration(milliseconds: 100)); - event = keyUpEvent('KeyA', 'a')..timeStamp = 2900; - converter.handleEvent(event); + converter.handleEvent(keyUpEvent('KeyA', 'a')..timeStamp = 2900); expectKeyData(keyDataList.last, timeStamp: const Duration(milliseconds: 2900), type: ui.KeyEventType.up, @@ -787,24 +712,18 @@ void testMain() { keyDataList.add(key); return true; }, onMacOs: true); - MockKeyboardEvent event; - event = keyDownEvent('MetaLeft', 'Meta', kMeta, kLocationLeft)..timeStamp = 100; - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('MetaLeft', 'Meta', kMeta, kLocationLeft)..timeStamp = 100); async.elapse(const Duration(milliseconds: 100)); - event = keyDownEvent('KeyA', 'a', kMeta)..timeStamp = 200; - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('KeyA', 'a', kMeta)..timeStamp = 200); async.elapse(const Duration(milliseconds: 400)); - event = keyRepeatedDownEvent('KeyA', 'a', kMeta)..timeStamp = 600; - converter.handleEvent(event); + converter.handleEvent(keyRepeatedDownEvent('KeyA', 'a', kMeta)..timeStamp = 600); async.elapse(const Duration(milliseconds: 50)); - event = keyRepeatedDownEvent('KeyA', 'a', kMeta)..timeStamp = 650; - converter.handleEvent(event); + converter.handleEvent(keyRepeatedDownEvent('KeyA', 'a', kMeta)..timeStamp = 650); async.elapse(const Duration(milliseconds: 50)); - event = keyRepeatedDownEvent('KeyA', 'a', kMeta)..timeStamp = 700; - converter.handleEvent(event); + converter.handleEvent(keyRepeatedDownEvent('KeyA', 'a', kMeta)..timeStamp = 700); // Keyup of KeyA is omitted due to being a shortcut. @@ -819,8 +738,7 @@ void testMain() { ); keyDataList.clear(); - event = keyUpEvent('MetaLeft', 'Meta', 0, kLocationLeft)..timeStamp = 3200; - converter.handleEvent(event); + converter.handleEvent(keyUpEvent('MetaLeft', 'Meta', 0, kLocationLeft)..timeStamp = 3200); expectKeyData(keyDataList.last, timeStamp: const Duration(milliseconds: 3200), type: ui.KeyEventType.up, @@ -831,8 +749,7 @@ void testMain() { async.elapse(const Duration(milliseconds: 100)); // Key A states are cleared - event = keyDownEvent('KeyA', 'a')..timeStamp = 3300; - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('KeyA', 'a')..timeStamp = 3300); expectKeyData(keyDataList.last, timeStamp: const Duration(milliseconds: 3300), type: ui.KeyEventType.down, @@ -842,8 +759,7 @@ void testMain() { ); async.elapse(const Duration(milliseconds: 100)); - event = keyUpEvent('KeyA', 'a')..timeStamp = 3400; - converter.handleEvent(event); + converter.handleEvent(keyUpEvent('KeyA', 'a')..timeStamp = 3400); expectKeyData(keyDataList.last, timeStamp: const Duration(milliseconds: 3400), type: ui.KeyEventType.up, @@ -859,14 +775,11 @@ void testMain() { keyDataList.add(key); return true; }); - MockKeyboardEvent event; - event = keyDownEvent('MetaLeft', 'Meta', kMeta, kLocationLeft)..timeStamp = 100; - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('MetaLeft', 'Meta', kMeta, kLocationLeft)..timeStamp = 100); async.elapse(const Duration(milliseconds: 100)); - event = keyDownEvent('KeyA', 'a', kCtrl)..timeStamp = 200; - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('KeyA', 'a', kCtrl)..timeStamp = 200); expectKeyData(keyDataList.last, timeStamp: const Duration(milliseconds: 200), type: ui.KeyEventType.down, @@ -877,12 +790,10 @@ void testMain() { keyDataList.clear(); async.elapse(const Duration(milliseconds: 500)); - event = keyUpEvent('MetaLeft', 'Meta', 0, kLocationLeft)..timeStamp = 700; - converter.handleEvent(event); + converter.handleEvent(keyUpEvent('MetaLeft', 'Meta', 0, kLocationLeft)..timeStamp = 700); async.elapse(const Duration(milliseconds: 100)); - event = keyUpEvent('KeyA', 'a')..timeStamp = 800; - converter.handleEvent(event); + converter.handleEvent(keyUpEvent('KeyA', 'a')..timeStamp = 800); expectKeyData(keyDataList.last, timeStamp: const Duration(milliseconds: 800), type: ui.KeyEventType.up, @@ -895,8 +806,7 @@ void testMain() { expect(keyDataList, isEmpty); // Key A states are cleared - event = keyDownEvent('KeyA', 'a')..timeStamp = 2800; - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('KeyA', 'a')..timeStamp = 2800); expectKeyData(keyDataList.last, timeStamp: const Duration(milliseconds: 2800), type: ui.KeyEventType.down, @@ -906,8 +816,7 @@ void testMain() { ); async.elapse(const Duration(milliseconds: 100)); - event = keyUpEvent('KeyA', 'a')..timeStamp = 2900; - converter.handleEvent(event); + converter.handleEvent(keyUpEvent('KeyA', 'a')..timeStamp = 2900); expectKeyData(keyDataList.last, timeStamp: const Duration(milliseconds: 2900), type: ui.KeyEventType.up, @@ -923,14 +832,11 @@ void testMain() { keyDataList.add(key); return true; }); // onMacOs: false - MockKeyboardEvent event; - event = keyDownEvent('MetaLeft', 'Meta', kMeta, kLocationLeft)..timeStamp = 100; - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('MetaLeft', 'Meta', kMeta, kLocationLeft)..timeStamp = 100); async.elapse(const Duration(milliseconds: 100)); - event = keyDownEvent('KeyA', 'a', kMeta)..timeStamp = 200; - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('KeyA', 'a', kMeta)..timeStamp = 200); expectKeyData(keyDataList.last, timeStamp: const Duration(milliseconds: 200), type: ui.KeyEventType.down, @@ -950,10 +856,8 @@ void testMain() { keyDataList.add(key); return true; }); // onMacOs: false - MockKeyboardEvent event; - event = keyDownEvent('ScrollLock', 'ScrollLock'); - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('ScrollLock', 'ScrollLock')); expect(keyDataList, hasLength(1)); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, @@ -966,8 +870,7 @@ void testMain() { async.elapse(const Duration(seconds: 10)); expect(keyDataList, isEmpty); - event = keyUpEvent('ScrollLock', 'ScrollLock'); - converter.handleEvent(event); + converter.handleEvent(keyUpEvent('ScrollLock', 'ScrollLock')); expect(keyDataList, hasLength(1)); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, @@ -977,8 +880,7 @@ void testMain() { ); keyDataList.clear(); - event = keyDownEvent('ScrollLock', 'ScrollLock'); - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('ScrollLock', 'ScrollLock')); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalScrollLock, @@ -986,8 +888,7 @@ void testMain() { character: null, ); - event = keyUpEvent('ScrollLock', 'ScrollLock'); - converter.handleEvent(event); + converter.handleEvent(keyUpEvent('ScrollLock', 'ScrollLock')); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, physical: kPhysicalScrollLock, @@ -1002,10 +903,8 @@ void testMain() { keyDataList.add(key); return true; }); // onMacOs: false - MockKeyboardEvent event; - event = keyDownEvent('ShiftRight', 'Shift', kShift, kLocationRight); - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('ShiftRight', 'Shift', kShift, kLocationRight)); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalShiftRight, @@ -1013,8 +912,7 @@ void testMain() { character: null, ); - event = keyDownEvent('ShiftLeft', 'Shift', kShift, kLocationLeft); - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('ShiftLeft', 'Shift', kShift, kLocationLeft)); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalShiftLeft, @@ -1025,8 +923,7 @@ void testMain() { // The release of the shift keys are omitted - event = keyDownEvent('KeyA', 'a'); - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('KeyA', 'a')); expect(keyDataList, hasLength(3)); expectKeyData(keyDataList[0], type: ui.KeyEventType.up, @@ -1062,10 +959,8 @@ void testMain() { keyDataList.add(key); return true; }); // onMacOs: false - MockKeyboardEvent event; - event = keyDownEvent('ShiftLeft', 'Shift', kShift, kLocationLeft); - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('ShiftLeft', 'Shift', kShift, kLocationLeft)); expectKeyData(keyDataList.last, type: ui.KeyEventType.down, physical: kPhysicalShiftLeft, @@ -1074,8 +969,7 @@ void testMain() { ); keyDataList.clear(); - event = keyDownEvent('MetaLeft', 'Meta', kShift /* No kMeta here! */, kLocationLeft); - converter.handleEvent(event); + converter.handleEvent(keyDownEvent('MetaLeft', 'Meta', kShift /* No kMeta here! */, kLocationLeft)); // Only a MetaLeft down event, no synthesized MetaLeft up events. expect(keyDataList, hasLength(1)); expectKeyData(keyDataList.first, @@ -1086,8 +980,7 @@ void testMain() { ); keyDataList.clear(); - event = keyUpEvent('MetaLeft', 'Meta', kShift | kMeta /* Yes, kMeta here! */, kLocationLeft); - converter.handleEvent(event); + converter.handleEvent(keyUpEvent('MetaLeft', 'Meta', kShift | kMeta /* Yes, kMeta here! */, kLocationLeft)); // Only a MetaLeft down event, no synthesized MetaLeft up events. expect(keyDataList, hasLength(1)); expectKeyData(keyDataList.first, @@ -1098,8 +991,7 @@ void testMain() { ); keyDataList.clear(); - event = keyUpEvent('ShiftLeft', 'Shift', 0, kLocationLeft); - converter.handleEvent(event); + converter.handleEvent(keyUpEvent('ShiftLeft', 'Shift', 0, kLocationLeft)); expectKeyData(keyDataList.last, type: ui.KeyEventType.up, physical: kPhysicalShiftLeft, diff --git a/lib/web_ui/test/keyboard_test_common.dart b/lib/web_ui/test/keyboard_test_common.dart index 22f77bf871838..b4b2113731ea8 100644 --- a/lib/web_ui/test/keyboard_test_common.dart +++ b/lib/web_ui/test/keyboard_test_common.dart @@ -28,7 +28,9 @@ class MockKeyboardEvent implements FlutterHtmlKeyboardEvent { if (shiftKey) 'Shift', if (metaKey) 'Meta', if (altGrKey) 'AltGraph', - }; + } { + _lastEvent = this; + } @override String type; @@ -77,4 +79,7 @@ class MockKeyboardEvent implements FlutterHtmlKeyboardEvent { @override bool get defaultPrevented => _defaultPrevented; bool _defaultPrevented = false; + + static bool get lastDefaultPrevented => _lastEvent?.defaultPrevented ?? false; + static MockKeyboardEvent? _lastEvent; }