未验证 提交 b86bc246 编写于 作者: M Mouad Debbar 提交者: GitHub

[web] Fix exception when using a keyboard (#24150)

上级 08f39f7c
......@@ -194,10 +194,15 @@ class EnginePlatformDispatcher extends ui.PlatformDispatcher {
/// Engine code should use this method instead of the callback directly.
/// Otherwise zones won't work properly.
void invokeOnKeyData(ui.KeyData data, _KeyDataResponseCallback callback) {
invoke(
() { callback(onKeyData == null ? false : onKeyData!(data)); },
_onKeyDataZone,
);
final ui.KeyDataCallback? onKeyData = _onKeyData;
if (onKeyData != null) {
invoke(
() => callback(onKeyData(data)),
_onKeyDataZone,
);
} else {
callback(false);
}
}
/// A callback that is invoked to report the [FrameTiming] of recently
......
......@@ -13,6 +13,9 @@ import 'package:test/test.dart';
import 'package:ui/ui.dart' as ui;
import 'package:ui/src/engine.dart';
const int kPhysicalKeyA = 0x00070004;
const int kLogicalKeyA = 0x00000000061;
void main() {
internalBootstrapBrowserTest(() => testMain);
}
......@@ -146,6 +149,52 @@ void testMain() {
EnginePlatformDispatcher.instance.invokeOnPointerDataPacket(null);
});
test('invokeOnKeyData returns normally when onKeyData is null', () {
final ui.KeyData keyData = ui.KeyData(
timeStamp: Duration(milliseconds: 1),
type: ui.KeyEventType.repeat,
physical: kPhysicalKeyA,
logical: kLogicalKeyA,
character: 'a',
synthesized: true,
);
expect(() {
EnginePlatformDispatcher.instance.invokeOnKeyData(keyData, (bool result) {
expect(result, isFalse);
});
}, returnsNormally);
});
test('onKeyData preserves the zone', () {
final Zone innerZone = Zone.current.fork();
innerZone.runGuarded(() {
final ui.KeyDataCallback onKeyData = (_) {
expect(Zone.current, innerZone);
return false;
};
window.onKeyData = onKeyData;
// Test that the getter returns the exact same onKeyData, e.g. it doesn't
// wrap it.
expect(window.onKeyData, same(onKeyData));
});
final ui.KeyData keyData = ui.KeyData(
timeStamp: Duration(milliseconds: 1),
type: ui.KeyEventType.repeat,
physical: kPhysicalKeyA,
logical: kLogicalKeyA,
character: 'a',
synthesized: true,
);
EnginePlatformDispatcher.instance.invokeOnKeyData(keyData, (bool result) {
expect(result, isFalse);
});
window.onKeyData = null;
});
test('onSemanticsEnabledChanged preserves the zone', () {
final Zone innerZone = Zone.current.fork();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册