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

Commit 4679474

Browse files
flarharryterkelsen
authored andcommitted
Revert "[web] Ensure handled key event is not propagated to IME" (#47086)
Reverts #46829 Fixes flutter/flutter#136857 Speculative fix for The builds breaking on the web text tests as seen here: https://github.com/flutter/flutter/runs/17840697842
1 parent d46ff7a commit 4679474

6 files changed

Lines changed: 20 additions & 74 deletions

File tree

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

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import 'browser_detection.dart';
1313
import 'dom.dart';
1414
import 'key_map.g.dart';
1515
import 'platform_dispatcher.dart';
16-
import 'raw_keyboard.dart';
1716
import 'semantics.dart';
1817

1918
typedef _VoidCallback = void Function();
@@ -105,12 +104,9 @@ class KeyboardBinding {
105104
_addEventListener('keydown', (DomEvent domEvent) {
106105
final FlutterHtmlKeyboardEvent event = FlutterHtmlKeyboardEvent(domEvent as DomKeyboardEvent);
107106
_converter.handleEvent(event);
108-
RawKeyboard.instance?.handleHtmlEvent(domEvent);
109107
});
110-
_addEventListener('keyup', (DomEvent domEvent) {
111-
final FlutterHtmlKeyboardEvent event = FlutterHtmlKeyboardEvent(domEvent as DomKeyboardEvent);
112-
_converter.handleEvent(event);
113-
RawKeyboard.instance?.handleHtmlEvent(domEvent);
108+
_addEventListener('keyup', (DomEvent event) {
109+
_converter.handleEvent(FlutterHtmlKeyboardEvent(event as DomKeyboardEvent));
114110
});
115111
}
116112

@@ -213,7 +209,6 @@ class FlutterHtmlKeyboardEvent {
213209

214210
bool getModifierState(String key) => _event.getModifierState(key);
215211
void preventDefault() => _event.preventDefault();
216-
void stopPropagation() => _event.stopPropagation();
217212
bool get defaultPrevented => _event.defaultPrevented;
218213
}
219214

lib/web_ui/lib/src/engine/raw_keyboard.dart

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,15 @@ import 'services.dart';
1515
/// Provides keyboard bindings, such as the `flutter/keyevent` channel.
1616
class RawKeyboard {
1717
RawKeyboard._(this._onMacOs) {
18+
_keydownListener = createDomEventListener((DomEvent event) {
19+
_handleHtmlEvent(event);
20+
});
21+
domWindow.addEventListener('keydown', _keydownListener);
22+
23+
_keyupListener = createDomEventListener((DomEvent event) {
24+
_handleHtmlEvent(event);
25+
});
26+
domWindow.addEventListener('keyup', _keyupListener);
1827
registerHotRestartListener(() {
1928
dispose();
2029
});
@@ -25,9 +34,6 @@ class RawKeyboard {
2534
/// Use the [instance] getter to get the singleton after calling this method.
2635
static void initialize({bool onMacOs = false}) {
2736
_instance ??= RawKeyboard._(onMacOs);
28-
// KeyboardBinding is responsible for forwarding the keyboard
29-
// events to the RawKeyboard handler.
30-
KeyboardBinding.initInstance();
3137
}
3238

3339
/// The [RawKeyboard] singleton.
@@ -40,16 +46,24 @@ class RawKeyboard {
4046
/// if no repeat events were received.
4147
final Map<String, Timer> _keydownTimers = <String, Timer>{};
4248

49+
DomEventListener? _keydownListener;
50+
DomEventListener? _keyupListener;
51+
4352
/// Uninitializes the [RawKeyboard] singleton.
4453
///
4554
/// After calling this method this object becomes unusable and [instance]
4655
/// becomes `null`. Call [initialize] again to initialize a new singleton.
4756
void dispose() {
57+
domWindow.removeEventListener('keydown', _keydownListener);
58+
domWindow.removeEventListener('keyup', _keyupListener);
59+
4860
for (final String key in _keydownTimers.keys) {
4961
_keydownTimers[key]!.cancel();
5062
}
5163
_keydownTimers.clear();
5264

65+
_keydownListener = null;
66+
_keyupListener = null;
5367
_instance = null;
5468
}
5569

@@ -82,7 +96,7 @@ class RawKeyboard {
8296
return event.type == 'keydown' && event.key == 'Tab' && event.isComposing;
8397
}
8498

85-
void handleHtmlEvent(DomEvent domEvent) {
99+
void _handleHtmlEvent(DomEvent domEvent) {
86100
if (!domInstanceOfString(domEvent, 'KeyboardEvent')) {
87101
return;
88102
}
@@ -144,7 +158,6 @@ class RawKeyboard {
144158
if (jsonResponse['handled'] as bool) {
145159
// If the framework handled it, then don't propagate it any further.
146160
event.preventDefault();
147-
event.stopPropagation();
148161
}
149162
},
150163
);

lib/web_ui/test/common/keyboard_test_common.dart

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ class MockKeyboardEvent implements FlutterHtmlKeyboardEvent {
2222
bool altGrKey = false,
2323
this.location = 0,
2424
this.onPreventDefault,
25-
this.onStopPropagation,
2625
}) : modifierState =
2726
<String>{
2827
if (altKey) 'Alt',
@@ -85,12 +84,6 @@ class MockKeyboardEvent implements FlutterHtmlKeyboardEvent {
8584
bool get defaultPrevented => _defaultPrevented;
8685
bool _defaultPrevented = false;
8786

88-
@override
89-
void stopPropagation() {
90-
onStopPropagation?.call();
91-
}
92-
VoidCallback? onStopPropagation;
93-
9487
static bool get lastDefaultPrevented => _lastEvent?.defaultPrevented ?? false;
9588
static MockKeyboardEvent? _lastEvent;
9689
}

lib/web_ui/test/engine/raw_keyboard_test.dart

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,6 @@ void testMain() {
5252

5353
DomKeyboardEvent event;
5454

55-
// Dispatch a keydown event first so that KeyboardBinding will recognize the keyup event.
56-
// and will not set preventDefault on it.
57-
event = dispatchKeyboardEvent('keydown', key: 'SomeKey', code: 'SomeCode', keyCode: 1);
58-
5955
event = dispatchKeyboardEvent('keyup', key: 'SomeKey', code: 'SomeCode', keyCode: 1);
6056

6157
expect(event.defaultPrevented, isFalse);

lib/web_ui/test/engine/text_editing_test.dart

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,12 @@ import 'package:test/test.dart';
1212
import 'package:ui/src/engine.dart' show flutterViewEmbedder;
1313
import 'package:ui/src/engine/browser_detection.dart';
1414
import 'package:ui/src/engine/dom.dart';
15-
import 'package:ui/src/engine/raw_keyboard.dart';
1615
import 'package:ui/src/engine/services.dart';
1716
import 'package:ui/src/engine/text_editing/autofill_hint.dart';
1817
import 'package:ui/src/engine/text_editing/input_type.dart';
1918
import 'package:ui/src/engine/text_editing/text_editing.dart';
2019
import 'package:ui/src/engine/util.dart';
2120
import 'package:ui/src/engine/vector_math.dart';
22-
import 'package:ui/ui.dart' as ui;
2321

2422
import '../common/spy.dart';
2523
import '../common/test_initialization.dart';
@@ -372,52 +370,6 @@ Future<void> testMain() async {
372370
expect(lastInputAction, 'TextInputAction.done');
373371
});
374372

375-
test('handling keyboard event prevents triggering input action', () {
376-
final ui.PlatformMessageCallback? savedCallback = ui.window.onPlatformMessage;
377-
378-
bool markTextEventHandled = false;
379-
ui.window.onPlatformMessage = (String channel, ByteData? data,
380-
ui.PlatformMessageResponseCallback? callback) {
381-
final ByteData response = const JSONMessageCodec()
382-
.encodeMessage(<String, dynamic>{'handled': markTextEventHandled})!;
383-
callback!(response);
384-
};
385-
RawKeyboard.initialize();
386-
387-
final InputConfiguration config = InputConfiguration();
388-
editingStrategy!.enable(
389-
config,
390-
onChange: trackEditingState,
391-
onAction: trackInputAction,
392-
);
393-
394-
// No input action so far.
395-
expect(lastInputAction, isNull);
396-
397-
markTextEventHandled = true;
398-
dispatchKeyboardEvent(
399-
editingStrategy!.domElement!,
400-
'keydown',
401-
keyCode: _kReturnKeyCode,
402-
);
403-
404-
// Input action prevented by platform message callback.
405-
expect(lastInputAction, isNull);
406-
407-
markTextEventHandled = false;
408-
dispatchKeyboardEvent(
409-
editingStrategy!.domElement!,
410-
'keydown',
411-
keyCode: _kReturnKeyCode,
412-
);
413-
414-
// Input action received.
415-
expect(lastInputAction, 'TextInputAction.done');
416-
417-
ui.window.onPlatformMessage = savedCallback;
418-
RawKeyboard.instance?.dispose();
419-
});
420-
421373
test('Triggers input action in multi-line mode', () {
422374
final InputConfiguration config = InputConfiguration(
423375
inputType: EngineInputType.multiline,

third_party/web_locale_keymap/lib/web_locale_keymap/locale_keymap.dart

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,6 @@ class LocaleKeymap {
4141
return eventKeyCode;
4242
}
4343
if (result == null) {
44-
if ((eventCode ?? '').isEmpty && (eventKey ?? '').isEmpty) {
45-
return null;
46-
}
4744
final int? heuristicResult = heuristicMapper(eventCode ?? '', eventKey ?? '');
4845
if (heuristicResult != null) {
4946
return heuristicResult;

0 commit comments

Comments
 (0)