Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 4e69f62

Browse files
authored
[Web, Keyboard] Implement FlutterHtmlKeyboardEvent.keyCode and defaultPrevented, and rename Keyboard to RawKeyboard (#34626)
1 parent 1cd26a0 commit 4e69f62

File tree

10 files changed

+199
-216
lines changed

10 files changed

+199
-216
lines changed

ci/licenses_golden/licenses_flutter

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1267,7 +1267,6 @@ FILE: ../../../flutter/lib/web_ui/lib/src/engine/initialization.dart
12671267
FILE: ../../../flutter/lib/web_ui/lib/src/engine/js_interop/js_loader.dart
12681268
FILE: ../../../flutter/lib/web_ui/lib/src/engine/js_interop/js_promise.dart
12691269
FILE: ../../../flutter/lib/web_ui/lib/src/engine/key_map.g.dart
1270-
FILE: ../../../flutter/lib/web_ui/lib/src/engine/keyboard.dart
12711270
FILE: ../../../flutter/lib/web_ui/lib/src/engine/keyboard_binding.dart
12721271
FILE: ../../../flutter/lib/web_ui/lib/src/engine/mouse_cursor.dart
12731272
FILE: ../../../flutter/lib/web_ui/lib/src/engine/navigation.dart
@@ -1285,6 +1284,7 @@ FILE: ../../../flutter/lib/web_ui/lib/src/engine/plugins.dart
12851284
FILE: ../../../flutter/lib/web_ui/lib/src/engine/pointer_binding.dart
12861285
FILE: ../../../flutter/lib/web_ui/lib/src/engine/pointer_converter.dart
12871286
FILE: ../../../flutter/lib/web_ui/lib/src/engine/profiler.dart
1287+
FILE: ../../../flutter/lib/web_ui/lib/src/engine/raw_keyboard.dart
12881288
FILE: ../../../flutter/lib/web_ui/lib/src/engine/renderer.dart
12891289
FILE: ../../../flutter/lib/web_ui/lib/src/engine/rrect_renderer.dart
12901290
FILE: ../../../flutter/lib/web_ui/lib/src/engine/safe_browser_api.dart

lib/web_ui/lib/src/engine.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,6 @@ export 'engine/initialization.dart';
108108
export 'engine/js_interop/js_loader.dart';
109109
export 'engine/js_interop/js_promise.dart';
110110
export 'engine/key_map.g.dart';
111-
export 'engine/keyboard.dart';
112111
export 'engine/keyboard_binding.dart';
113112
export 'engine/mouse_cursor.dart';
114113
export 'engine/navigation/history.dart';
@@ -125,6 +124,7 @@ export 'engine/plugins.dart';
125124
export 'engine/pointer_binding.dart';
126125
export 'engine/pointer_converter.dart';
127126
export 'engine/profiler.dart';
127+
export 'engine/raw_keyboard.dart';
128128
export 'engine/renderer.dart';
129129
export 'engine/rrect_renderer.dart';
130130
export 'engine/safe_browser_api.dart';

lib/web_ui/lib/src/engine/embedder.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,7 @@ class FlutterViewEmbedder {
324324
}
325325

326326
PointerBinding.initInstance(glassPaneElement);
327-
KeyboardBinding.initInstance(glassPaneElement);
327+
KeyboardBinding.initInstance();
328328

329329
if (domWindow.visualViewport == null && isWebKit) {
330330
// Older Safari versions sometimes give us bogus innerWidth/innerHeight

lib/web_ui/lib/src/engine/initialization.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ import 'dart:developer' as developer;
88
import 'package:ui/src/engine/assets.dart';
99
import 'package:ui/src/engine/browser_detection.dart';
1010
import 'package:ui/src/engine/embedder.dart';
11-
import 'package:ui/src/engine/keyboard.dart';
1211
import 'package:ui/src/engine/mouse_cursor.dart';
1312
import 'package:ui/src/engine/navigation.dart';
1413
import 'package:ui/src/engine/platform_dispatcher.dart';
1514
import 'package:ui/src/engine/platform_views/content_manager.dart';
1615
import 'package:ui/src/engine/profiler.dart';
16+
import 'package:ui/src/engine/raw_keyboard.dart';
1717
import 'package:ui/src/engine/renderer.dart';
1818
import 'package:ui/src/engine/safe_browser_api.dart';
1919
import 'package:ui/src/engine/window.dart';
@@ -234,7 +234,7 @@ Future<void> initializeEngineUi() async {
234234
}
235235
_initializationState = DebugEngineInitializationState.initializingUi;
236236

237-
Keyboard.initialize(onMacOs: operatingSystem == OperatingSystem.macOs);
237+
RawKeyboard.initialize(onMacOs: operatingSystem == OperatingSystem.macOs);
238238
MouseCursor.initialize();
239239
ensureFlutterViewEmbedderInitialized();
240240
_initializationState = DebugEngineInitializationState.initialized;

lib/web_ui/lib/src/engine/keyboard_binding.dart

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,26 +88,25 @@ Duration _eventTimeStampToDuration(num milliseconds) {
8888
}
8989

9090
class KeyboardBinding {
91-
KeyboardBinding._(this.glassPaneElement) {
91+
KeyboardBinding._() {
9292
_setup();
9393
}
9494

9595
/// The singleton instance of this object.
9696
static KeyboardBinding? get instance => _instance;
9797
static KeyboardBinding? _instance;
9898

99-
static void initInstance(DomElement glassPaneElement) {
99+
static void initInstance() {
100100
if (_instance == null) {
101-
_instance = KeyboardBinding._(glassPaneElement);
101+
_instance = KeyboardBinding._();
102102
assert(() {
103103
registerHotRestartListener(_instance!._reset);
104104
return true;
105105
}());
106106
}
107107
}
108108

109-
final DomElement glassPaneElement;
110-
late KeyboardConverter _converter;
109+
late final KeyboardConverter _converter;
111110
final Map<String, DomEventListener> _listeners = <String, DomEventListener>{};
112111

113112
void _addEventListener(String eventName, DomEventListener handler) {
@@ -179,6 +178,7 @@ class FlutterHtmlKeyboardEvent {
179178
String get type => _event.type;
180179
String? get code => _event.code;
181180
String? get key => _event.key;
181+
int get keyCode => _event.keyCode;
182182
bool? get repeat => _event.repeat;
183183
int? get location => _event.location;
184184
num? get timeStamp => _event.timeStamp;
@@ -189,6 +189,7 @@ class FlutterHtmlKeyboardEvent {
189189

190190
bool getModifierState(String key) => _event.getModifierState(key);
191191
void preventDefault() => _event.preventDefault();
192+
bool get defaultPrevented => _event.defaultPrevented;
192193
}
193194

194195
// Reads [DomKeyboardEvent], then [dispatches ui.KeyData] accordingly.

lib/web_ui/lib/src/engine/keyboard.dart renamed to lib/web_ui/lib/src/engine/raw_keyboard.dart

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@ import 'dart:typed_data';
77

88
import '../engine.dart' show registerHotRestartListener;
99
import 'dom.dart';
10+
import 'keyboard_binding.dart';
1011
import 'platform_dispatcher.dart';
1112
import 'safe_browser_api.dart';
1213
import 'services.dart';
1314

1415
/// Provides keyboard bindings, such as the `flutter/keyevent` channel.
15-
class Keyboard {
16-
Keyboard._(this._onMacOs) {
16+
class RawKeyboard {
17+
RawKeyboard._(this._onMacOs) {
1718
_keydownListener = allowInterop((DomEvent event) {
1819
_handleHtmlEvent(event);
1920
});
@@ -28,16 +29,16 @@ class Keyboard {
2829
});
2930
}
3031

31-
/// Initializes the [Keyboard] singleton.
32+
/// Initializes the [RawKeyboard] singleton.
3233
///
3334
/// Use the [instance] getter to get the singleton after calling this method.
3435
static void initialize({bool onMacOs = false}) {
35-
_instance ??= Keyboard._(onMacOs);
36+
_instance ??= RawKeyboard._(onMacOs);
3637
}
3738

38-
/// The [Keyboard] singleton.
39-
static Keyboard? get instance => _instance;
40-
static Keyboard? _instance;
39+
/// The [RawKeyboard] singleton.
40+
static RawKeyboard? get instance => _instance;
41+
static RawKeyboard? _instance;
4142

4243
/// A mapping of [KeyboardEvent.code] to [Timer].
4344
///
@@ -48,7 +49,7 @@ class Keyboard {
4849
DomEventListener? _keydownListener;
4950
DomEventListener? _keyupListener;
5051

51-
/// Uninitializes the [Keyboard] singleton.
52+
/// Uninitializes the [RawKeyboard] singleton.
5253
///
5354
/// After calling this method this object becomes unusable and [instance]
5455
/// becomes `null`. Call [initialize] again to initialize a new singleton.
@@ -87,13 +88,13 @@ class Keyboard {
8788
return _onMacOs;
8889
}
8990

90-
void _handleHtmlEvent(DomEvent event) {
91-
if (!domInstanceOfString(event, 'KeyboardEvent')) {
91+
void _handleHtmlEvent(DomEvent domEvent) {
92+
if (!domInstanceOfString(domEvent, 'KeyboardEvent')) {
9293
return;
9394
}
9495

95-
final DomKeyboardEvent keyboardEvent = event as DomKeyboardEvent;
96-
final String timerKey = keyboardEvent.code!;
96+
final FlutterHtmlKeyboardEvent event = FlutterHtmlKeyboardEvent(domEvent as DomKeyboardEvent);
97+
final String timerKey = event.code!;
9798

9899
// Don't handle synthesizing a keyup event for modifier keys
99100
if (!_isModifierKey(event) && _shouldDoKeyGuard()) {
@@ -126,11 +127,11 @@ class Keyboard {
126127
final Map<String, dynamic> eventData = <String, dynamic>{
127128
'type': event.type,
128129
'keymap': 'web',
129-
'code': keyboardEvent.code,
130-
'key': keyboardEvent.key,
131-
'location': keyboardEvent.location,
130+
'code': event.code,
131+
'key': event.key,
132+
'location': event.location,
132133
'metaState': _lastMetaState,
133-
'keyCode': keyboardEvent.keyCode,
134+
'keyCode': event.keyCode,
134135
};
135136

136137
EnginePlatformDispatcher.instance.invokeOnPlatformMessage('flutter/keyevent',
@@ -147,7 +148,7 @@ class Keyboard {
147148
);
148149
}
149150

150-
void _synthesizeKeyup(DomKeyboardEvent event) {
151+
void _synthesizeKeyup(FlutterHtmlKeyboardEvent event) {
151152
final Map<String, dynamic> eventData = <String, dynamic>{
152153
'type': 'keyup',
153154
'keymap': 'web',
@@ -180,7 +181,7 @@ const int modifierCapsLock = 0x20;
180181
const int modifierScrollLock = 0x40;
181182

182183
/// Creates a bitmask representing the meta state of the [event].
183-
int _getMetaState(DomKeyboardEvent event) {
184+
int _getMetaState(FlutterHtmlKeyboardEvent event) {
184185
int metaState = _modifierNone;
185186
if (event.getModifierState('Shift')) {
186187
metaState |= _modifierShift;
@@ -212,15 +213,15 @@ int _getMetaState(DomKeyboardEvent event) {
212213
///
213214
/// Modifier keys are shift, alt, ctrl and meta/cmd/win. These are the keys used
214215
/// to perform keyboard shortcuts (e.g. `cmd+c`, `cmd+l`).
215-
bool _isModifierKey(DomKeyboardEvent event) {
216+
bool _isModifierKey(FlutterHtmlKeyboardEvent event) {
216217
final String key = event.key!;
217218
return key == 'Meta' || key == 'Shift' || key == 'Alt' || key == 'Control';
218219
}
219220

220221
/// Returns true if the [event] is been affects by any of the modifiers key
221222
///
222223
/// This is a strong indication that this key is been used for a shortcut
223-
bool _isAffectedByModifiers(DomKeyboardEvent event) {
224+
bool _isAffectedByModifiers(FlutterHtmlKeyboardEvent event) {
224225
return event.ctrlKey || event.shiftKey || event.altKey || event.metaKey;
225226
}
226227

lib/web_ui/test/canvaskit/initialization_services_vs_ui_test.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ void testMain() {
1616
expect(windowFlutterCanvasKit, isNull);
1717

1818
expect(findGlassPane(), isNull);
19-
expect(Keyboard.instance, isNull);
19+
expect(RawKeyboard.instance, isNull);
2020
expect(MouseCursor.instance, isNull);
2121
expect(KeyboardBinding.instance, isNull);
2222
expect(PointerBinding.instance, isNull);
@@ -27,15 +27,15 @@ void testMain() {
2727
expect(windowFlutterCanvasKit, isNotNull);
2828

2929
expect(findGlassPane(), isNull);
30-
expect(Keyboard.instance, isNull);
30+
expect(RawKeyboard.instance, isNull);
3131
expect(MouseCursor.instance, isNull);
3232
expect(KeyboardBinding.instance, isNull);
3333
expect(PointerBinding.instance, isNull);
3434

3535
// Now UI should be taken over by Flutter.
3636
await initializeEngineUi();
3737
expect(findGlassPane(), isNotNull);
38-
expect(Keyboard.instance, isNotNull);
38+
expect(RawKeyboard.instance, isNotNull);
3939
expect(MouseCursor.instance, isNotNull);
4040
expect(KeyboardBinding.instance, isNotNull);
4141
expect(PointerBinding.instance, isNotNull);

0 commit comments

Comments
 (0)