From f94f28269b9eef2711e8aca888e5e35dd2524a97 Mon Sep 17 00:00:00 2001 From: Yegor Jbanov Date: Fri, 4 Dec 2020 10:37:50 -0800 Subject: [PATCH] re-enable pointer events inside platform views --- .../src/engine/canvaskit/embedded_views.dart | 4 ++ .../test/canvaskit/embedded_views_test.dart | 64 +++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 lib/web_ui/test/canvaskit/embedded_views_test.dart diff --git a/lib/web_ui/lib/src/engine/canvaskit/embedded_views.dart b/lib/web_ui/lib/src/engine/canvaskit/embedded_views.dart index 4cb4eaf8f863b..79cc1ee1f93e9 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/embedded_views.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/embedded_views.dart @@ -168,6 +168,10 @@ class HtmlViewEmbedder { platformView.style.height = '${params.size.height}px'; platformView.style.position = 'absolute'; + // disables pointer events. Reenable them here because the + // underlying platform view would want to handle the pointer events. + platformView.style.pointerEvents = 'auto'; + final int currentClippingCount = _countClips(params.mutators); final int? previousClippingCount = _clipCount[viewId]; if (currentClippingCount != previousClippingCount) { diff --git a/lib/web_ui/test/canvaskit/embedded_views_test.dart b/lib/web_ui/test/canvaskit/embedded_views_test.dart new file mode 100644 index 0000000000000..decde96c999b0 --- /dev/null +++ b/lib/web_ui/test/canvaskit/embedded_views_test.dart @@ -0,0 +1,64 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// @dart = 2.12 +import 'dart:async'; +import 'dart:html' as html; + +import 'package:ui/src/engine.dart'; +import 'package:ui/ui.dart' as ui; + +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; + +import 'common.dart'; + +const MethodCodec codec = StandardMethodCodec(); +final EngineSingletonFlutterWindow window = EngineSingletonFlutterWindow(0, EnginePlatformDispatcher.instance); + +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { + group('HtmlViewEmbedder', () { + setUpCanvasKitTest(); + + test('embeds interactive platform views', () async { + ui.platformViewRegistry.registerViewFactory( + 'test-platform-view', + (viewId) => html.DivElement()..id = 'view-0', + ); + await _createPlatformView(0, 'test-platform-view'); + + final EnginePlatformDispatcher dispatcher = ui.window.platformDispatcher as EnginePlatformDispatcher; + final LayerSceneBuilder sb = LayerSceneBuilder(); + sb.pushOffset(0, 0); + sb.addPlatformView(0, width: 10, height: 10); + dispatcher.rasterizer!.draw(sb.build().layerTree); + expect( + domRenderer.sceneElement!.querySelectorAll('#view-0').single.style.pointerEvents, + 'auto', + ); + }); + // TODO: https://github.com/flutter/flutter/issues/60040 + }, skip: isIosSafari); +} + +// Sends a platform message to create a Platform View with the given id and viewType. +Future _createPlatformView(int id, String viewType) { + final completer = Completer(); + window.sendPlatformMessage( + 'flutter/platform_views', + codec.encodeMethodCall(MethodCall( + 'create', + { + 'id': id, + 'viewType': viewType, + }, + )), + (dynamic _) => completer.complete(), + ); + return completer.future; +}