Unverified Commit cc9b78fc authored by Ferhat's avatar Ferhat Committed by GitHub

[web] Treeshake keymaps for web (4% code size reduction in hello world) (#75945)

parent 3e77f5e4
......@@ -267,6 +267,17 @@ abstract class RawKeyEvent with Diagnosticable {
String? character;
final String keymap = message['keymap'] as String;
if (kIsWeb) {
final String? key = message['key'] as String?;
data = RawKeyEventDataWeb(
code: message['code'] as String? ?? '',
key: key ?? '',
metaState: message['metaState'] as int? ?? 0,
);
if (key != null && key.isNotEmpty) {
character = key;
}
} else {
switch (keymap) {
case 'android':
data = RawKeyEventDataAndroid(
......@@ -325,14 +336,6 @@ abstract class RawKeyEvent with Diagnosticable {
character = String.fromCharCode(unicodeScalarValues);
}
break;
case 'web':
data = RawKeyEventDataWeb(
code: message['code'] as String? ?? '',
key: message['key'] as String? ?? '',
metaState: message['metaState'] as int? ?? 0,
);
character = message['key'] as String?;
break;
case 'windows':
final int characterCodePoint = message['characterCodePoint'] as int? ?? 0;
data = RawKeyEventDataWindows(
......@@ -345,6 +348,17 @@ abstract class RawKeyEvent with Diagnosticable {
character = String.fromCharCode(characterCodePoint);
}
break;
case 'web':
final String? key = message['key'] as String?;
data = RawKeyEventDataWeb(
code: message['code'] as String? ?? '',
key: key ?? '',
metaState: message['metaState'] as int? ?? 0,
);
if (key != null && key.isNotEmpty) {
character = key;
}
break;
default:
/// This exception would only be hit on platforms that haven't yet
/// implemented raw key events, but will only be triggered if the
......@@ -352,7 +366,7 @@ abstract class RawKeyEvent with Diagnosticable {
/// first place.
throw FlutterError('Unknown keymap for key events: $keymap');
}
}
final String type = message['type'] as String;
switch (type) {
case 'keydown':
......
......@@ -42,6 +42,37 @@ void main() {
expect(typedData.modifiers, RawKeyEventDataFuchsia.modifierLeftMeta);
expect(typedData.isModifierPressed(ModifierKey.metaModifier, side: KeyboardSide.left), isTrue);
await tester.pumpWidget(Container());
focusNode.dispose();
}, skip: isBrowser); // This is a Fuchsia-specific test.
testWidgets('Web key event', (WidgetTester tester) async {
final List<RawKeyEvent> events = <RawKeyEvent>[];
final FocusNode focusNode = FocusNode();
await tester.pumpWidget(
RawKeyboardListener(
focusNode: focusNode,
onKey: events.add,
child: Container(),
),
);
focusNode.requestFocus();
await tester.idle();
await tester.sendKeyEvent(LogicalKeyboardKey.metaLeft, platform: 'web');
await tester.idle();
expect(events.length, 2);
expect(events[0].runtimeType, equals(RawKeyDownEvent));
expect(events[0].data, isA<RawKeyEventDataWeb>());
final RawKeyEventDataWeb typedData = events[0].data as RawKeyEventDataWeb;
expect(typedData.code, 'MetaLeft');
expect(typedData.metaState, RawKeyEventDataWeb.modifierMeta);
expect(typedData.isModifierPressed(ModifierKey.metaModifier, side: KeyboardSide.left), isTrue);
await tester.pumpWidget(Container());
focusNode.dispose();
});
......
......@@ -4,6 +4,7 @@
import 'dart:io';
import 'package:flutter/foundation.dart' show kIsWeb;
import 'package:flutter/services.dart';
import 'test_async_utils.dart';
......@@ -85,6 +86,11 @@ class KeyEventSimulator {
static int _getKeyCode(LogicalKeyboardKey key, String platform) {
assert(_osIsSupported(platform), 'Platform $platform not supported for key simulation');
if (kIsWeb) {
// web doesn't have int type code. This check is used to treeshake
// keyboard map code.
return -1;
} else {
late Map<int, LogicalKeyboardKey> map;
switch (platform) {
case 'android':
......@@ -100,7 +106,7 @@ class KeyEventSimulator {
// iOS doesn't do key codes, just scan codes.
return -1;
case 'web':
// web doesn't have int type code
// web doesn't have int type code.
return -1;
case 'linux':
map = kGlfwToLogicalKey;
......@@ -119,6 +125,8 @@ class KeyEventSimulator {
assert(keyCode != null, 'Key $key not found in $platform keyCode map');
return keyCode!;
}
}
static String _getWebKeyCode(LogicalKeyboardKey key) {
String? result;
for (final String code in kWebToLogicalKey.keys) {
......@@ -134,6 +142,10 @@ class KeyEventSimulator {
static PhysicalKeyboardKey _findPhysicalKey(LogicalKeyboardKey key, String platform) {
assert(_osIsSupported(platform), 'Platform $platform not supported for key simulation');
late Map<dynamic, PhysicalKeyboardKey> map;
if (kIsWeb) {
// This check is used to treeshake keymap code.
map = kWebToPhysicalKey;
} else {
switch (platform) {
case 'android':
map = kAndroidToPhysicalKey;
......@@ -157,6 +169,7 @@ class KeyEventSimulator {
map = kWindowsToPhysicalKey;
break;
}
}
PhysicalKeyboardKey? result;
for (final PhysicalKeyboardKey physicalKey in map.values) {
if (key.debugName == physicalKey.debugName) {
......@@ -191,6 +204,13 @@ class KeyEventSimulator {
'keymap': platform,
};
if (kIsWeb) {
result['code'] = _getWebKeyCode(key);
result['key'] = key.keyLabel;
result['metaState'] = _getWebModifierFlags(key, isDown);
return result;
}
switch (platform) {
case 'android':
result['keyCode'] = keyCode;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment