Skip to content

Commit

Permalink
[web] PointerBinding per view (#48248)
Browse files Browse the repository at this point in the history
- Move initialization of `PointerBinding`/`KeyboardBinding` out of `FlutterViewEmbedder`.
- `computeEventOffsetToTarget` properly handles events within a given view.
- `PointerBinding` operates on the given Flutter view (it still listens to some `domWindow` events for the implicit view).
    - Stop using globals e.g. `ui.window`, `KeyboardBinding.instance`, `SafariPointerEventWorkaround.instance`, etc.
- `pointer_binding_test.dart` doesn't use globals either.
- `clickDebouncer` is now a static property on `PointerBinding`.

Fixes flutter/flutter#137289
  • Loading branch information
mdebbar committed Dec 11, 2023
1 parent 5587d26 commit 4c30919
Show file tree
Hide file tree
Showing 17 changed files with 349 additions and 287 deletions.
10 changes: 0 additions & 10 deletions lib/web_ui/lib/src/engine/embedder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,7 @@ import '../engine.dart' show buildMode, renderer;
import 'browser_detection.dart';
import 'configuration.dart';
import 'dom.dart';
import 'keyboard_binding.dart';
import 'platform_dispatcher.dart';
import 'pointer_binding.dart';
import 'text_editing/text_editing.dart';
import 'view_embedder/style_manager.dart';
import 'window.dart';
Expand Down Expand Up @@ -67,14 +65,6 @@ class FlutterViewEmbedder {

renderer.reset(this);

// TODO(mdebbar): Move these to `engine/initialization.dart`.

KeyboardBinding.initInstance();
PointerBinding.initInstance(
_flutterViewElement,
KeyboardBinding.instance!.converter,
);

window.onResize.listen(_metricsDidChange);
}

Expand Down
2 changes: 2 additions & 0 deletions lib/web_ui/lib/src/engine/initialization.dart
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,8 @@ Future<void> initializeEngineUi() async {
_initializationState = DebugEngineInitializationState.initializingUi;

RawKeyboard.initialize(onMacOs: operatingSystem == OperatingSystem.macOs);
KeyboardBinding.initInstance();

if (!configuration.multiViewEnabled) {
ensureImplicitViewInitialized(hostElement: configuration.hostElement);
ensureFlutterViewEmbedderInitialized();
Expand Down
5 changes: 5 additions & 0 deletions lib/web_ui/lib/src/engine/keyboard_binding.dart
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,7 @@ class KeyboardConverter {
bool _disposed = false;
void dispose() {
_disposed = true;
clearPressedKeys();
}

// On macOS, CapsLock behaves differently in that, a keydown event occurs when
Expand Down Expand Up @@ -699,4 +700,8 @@ class KeyboardConverter {
bool keyIsPressed(int physical) {
return _pressingRecords.containsKey(physical);
}

void clearPressedKeys() {
_pressingRecords.clear();
}
}
2 changes: 1 addition & 1 deletion lib/web_ui/lib/src/engine/platform_dispatcher.dart
Original file line number Diff line number Diff line change
Expand Up @@ -634,7 +634,7 @@ class EnginePlatformDispatcher extends ui.PlatformDispatcher {
const StandardMessageCodec codec = StandardMessageCodec();
// TODO(yjbanov): Dispatch the announcement to the correct view?
// https://github.com/flutter/flutter/issues/137445
implicitView!.accessibilityAnnouncements.handleMessage(codec, data);
implicitView?.accessibilityAnnouncements.handleMessage(codec, data);
replyToPlatformMessage(callback, codec.encodeMessage(true));
return;

Expand Down
Loading

0 comments on commit 4c30919

Please sign in to comment.