From 629692531b5aca92c341fd04e521df29920fc799 Mon Sep 17 00:00:00 2001 From: Mouad Debbar Date: Thu, 16 Feb 2023 16:52:51 -0500 Subject: [PATCH] [web] Make glassPaneElement and glassPaneShadow non-nullable --- lib/web_ui/lib/src/engine/embedder.dart | 16 +++++++--------- lib/web_ui/lib/src/engine/mouse_cursor.dart | 2 +- .../lib/src/engine/platform_dispatcher.dart | 2 +- .../engine/platform_views/content_manager.dart | 2 +- .../lib/src/engine/semantics/text_field.dart | 4 ++-- lib/web_ui/lib/src/engine/text/measurement.dart | 2 +- .../src/engine/text_editing/text_editing.dart | 2 +- .../test/canvaskit/embedded_views_test.dart | 12 ++++++------ lib/web_ui/test/embedder_test.dart | 10 +++++----- lib/web_ui/test/engine/pointer_binding_test.dart | 2 +- .../test/engine/semantics/semantics_test.dart | 4 ++-- .../test/engine/semantics/semantics_tester.dart | 2 +- .../test/html/bitmap_canvas_golden_test.dart | 6 +++--- 13 files changed, 32 insertions(+), 34 deletions(-) diff --git a/lib/web_ui/lib/src/engine/embedder.dart b/lib/web_ui/lib/src/engine/embedder.dart index c2d507de65044..d16821e3d9ee0 100644 --- a/lib/web_ui/lib/src/engine/embedder.dart +++ b/lib/web_ui/lib/src/engine/embedder.dart @@ -117,12 +117,12 @@ class FlutterViewEmbedder { /// which captures semantics input events. The semantics DOM tree must be a /// child of the glass pane element so that events bubble up to the glass pane /// if they are not handled by semantics. - DomElement? get glassPaneElement => _glassPaneElement; - DomElement? _glassPaneElement; + DomElement get glassPaneElement => _glassPaneElement; + late DomElement _glassPaneElement; /// The [HostNode] of the [glassPaneElement], which contains the whole Flutter app. - HostNode? get glassPaneShadow => _glassPaneShadow; - HostNode? _glassPaneShadow; + HostNode get glassPaneShadow => _glassPaneShadow; + late HostNode _glassPaneShadow; static const String defaultFontStyle = 'normal'; static const String defaultFontWeight = 'normal'; @@ -149,9 +149,7 @@ class FlutterViewEmbedder { ); // Create and inject the [_glassPaneElement]. - final DomElement glassPaneElement = - domDocument.createElement(glassPaneTagName); - _glassPaneElement = glassPaneElement; + _glassPaneElement = domDocument.createElement(glassPaneTagName); // This must be attached to the DOM now, so the engine can create a host // node (ShadowDOM or a fallback) next. @@ -340,8 +338,8 @@ class FlutterViewEmbedder { _embeddingStrategy.attachResourcesHost(resourcesHost, nextTo: glassPaneElement); } else { - glassPaneShadow!.node - .insertBefore(resourcesHost, glassPaneShadow!.node.firstChild); + glassPaneShadow.node + .insertBefore(resourcesHost, glassPaneShadow.node.firstChild); } _resourcesHost = resourcesHost; } diff --git a/lib/web_ui/lib/src/engine/mouse_cursor.dart b/lib/web_ui/lib/src/engine/mouse_cursor.dart index 009ca0f2110ed..d6eee12946478 100644 --- a/lib/web_ui/lib/src/engine/mouse_cursor.dart +++ b/lib/web_ui/lib/src/engine/mouse_cursor.dart @@ -67,7 +67,7 @@ class MouseCursor { void activateSystemCursor(String? kind) { setElementStyle( - flutterViewEmbedder.glassPaneElement!, + flutterViewEmbedder.glassPaneElement, 'cursor', _mapKindToCssValue(kind), ); diff --git a/lib/web_ui/lib/src/engine/platform_dispatcher.dart b/lib/web_ui/lib/src/engine/platform_dispatcher.dart index 06859c6684d2c..c69ff41cff8fd 100644 --- a/lib/web_ui/lib/src/engine/platform_dispatcher.dart +++ b/lib/web_ui/lib/src/engine/platform_dispatcher.dart @@ -567,7 +567,7 @@ class EnginePlatformDispatcher extends ui.PlatformDispatcher { _platformViewMessageHandler ??= PlatformViewMessageHandler( contentManager: platformViewManager, contentHandler: (DomElement content) { - flutterViewEmbedder.glassPaneElement!.append(content); + flutterViewEmbedder.glassPaneElement.append(content); }, ); _platformViewMessageHandler!.handlePlatformViewCall(data, callback!); diff --git a/lib/web_ui/lib/src/engine/platform_views/content_manager.dart b/lib/web_ui/lib/src/engine/platform_views/content_manager.dart index baa68a08cf839..f50d3af3ee670 100644 --- a/lib/web_ui/lib/src/engine/platform_views/content_manager.dart +++ b/lib/web_ui/lib/src/engine/platform_views/content_manager.dart @@ -161,7 +161,7 @@ class PlatformViewManager { final DomElement slot = domDocument.createElement('slot') ..style.display = 'none' ..setAttribute('name', tombstoneName); - flutterViewEmbedder.glassPaneShadow!.append(slot); + flutterViewEmbedder.glassPaneShadow.append(slot); // Link the element to the new slot element.setAttribute('slot', tombstoneName); // Delete both the element, and the new slot diff --git a/lib/web_ui/lib/src/engine/semantics/text_field.dart b/lib/web_ui/lib/src/engine/semantics/text_field.dart index fa3ba97e0ff7e..9552707bcb6a0 100644 --- a/lib/web_ui/lib/src/engine/semantics/text_field.dart +++ b/lib/web_ui/lib/src/engine/semantics/text_field.dart @@ -424,14 +424,14 @@ class TextField extends RoleManager { ..height = '${semanticsObject.rect!.height}px'; if (semanticsObject.hasFocus) { - if (flutterViewEmbedder.glassPaneShadow!.activeElement != + if (flutterViewEmbedder.glassPaneShadow.activeElement != activeEditableElement) { semanticsObject.owner.addOneTimePostUpdateCallback(() { activeEditableElement.focus(); }); } SemanticsTextEditingStrategy.instance.activate(this); - } else if (flutterViewEmbedder.glassPaneShadow!.activeElement == + } else if (flutterViewEmbedder.glassPaneShadow.activeElement == activeEditableElement) { if (!isIosSafari) { SemanticsTextEditingStrategy.instance.deactivate(this); diff --git a/lib/web_ui/lib/src/engine/text/measurement.dart b/lib/web_ui/lib/src/engine/text/measurement.dart index 0a8ccddfe16e1..3a026e2c5d235 100644 --- a/lib/web_ui/lib/src/engine/text/measurement.dart +++ b/lib/web_ui/lib/src/engine/text/measurement.dart @@ -29,7 +29,7 @@ class RulerHost { ..height = '0'; if (root == null) { - flutterViewEmbedder.glassPaneShadow!.node.appendChild(_rulerHost); + flutterViewEmbedder.glassPaneShadow.node.appendChild(_rulerHost); } else { root.appendChild(_rulerHost); } diff --git a/lib/web_ui/lib/src/engine/text_editing/text_editing.dart b/lib/web_ui/lib/src/engine/text_editing/text_editing.dart index 27b574808228e..46447963a78e4 100644 --- a/lib/web_ui/lib/src/engine/text_editing/text_editing.dart +++ b/lib/web_ui/lib/src/engine/text_editing/text_editing.dart @@ -51,7 +51,7 @@ void _emptyCallback(dynamic _) {} /// The default [HostNode] that hosts all DOM required for text editing when a11y is not enabled. @visibleForTesting -HostNode get defaultTextEditingRoot => flutterViewEmbedder.glassPaneShadow!; +HostNode get defaultTextEditingRoot => flutterViewEmbedder.glassPaneShadow; /// These style attributes are constant throughout the life time of an input /// element. diff --git a/lib/web_ui/test/canvaskit/embedded_views_test.dart b/lib/web_ui/test/canvaskit/embedded_views_test.dart index fe32856ba75d4..d4d521e330bb7 100644 --- a/lib/web_ui/test/canvaskit/embedded_views_test.dart +++ b/lib/web_ui/test/canvaskit/embedded_views_test.dart @@ -41,7 +41,7 @@ void testMain() { // The platform view is now split in two parts. The contents live // as a child of the glassPane, and the slot lives in the glassPane // shadow root. The slot is the one that has pointer events auto. - final DomElement contents = flutterViewEmbedder.glassPaneElement! + final DomElement contents = flutterViewEmbedder.glassPaneElement .querySelector('#view-0')!; final DomElement slot = flutterViewEmbedder.sceneElement! .querySelector('slot')!; @@ -598,7 +598,7 @@ void testMain() { ]); expect( - flutterViewEmbedder.glassPaneElement! + flutterViewEmbedder.glassPaneElement .querySelector('flt-platform-view'), isNotNull, ); @@ -614,7 +614,7 @@ void testMain() { ]); expect( - flutterViewEmbedder.glassPaneElement! + flutterViewEmbedder.glassPaneElement .querySelector('flt-platform-view'), isNull, ); @@ -685,7 +685,7 @@ void testMain() { ]); expect( - flutterViewEmbedder.glassPaneElement! + flutterViewEmbedder.glassPaneElement .querySelector('flt-platform-view'), isNotNull, ); @@ -703,7 +703,7 @@ void testMain() { ]); expect( - flutterViewEmbedder.glassPaneElement! + flutterViewEmbedder.glassPaneElement .querySelectorAll('flt-platform-view'), hasLength(2)); @@ -719,7 +719,7 @@ void testMain() { // The actual contents of the platform view are kept in the dom, until // it's actually disposed of! expect( - flutterViewEmbedder.glassPaneElement! + flutterViewEmbedder.glassPaneElement .querySelectorAll('flt-platform-view'), hasLength(2)); }); diff --git a/lib/web_ui/test/embedder_test.dart b/lib/web_ui/test/embedder_test.dart index a4197061fa304..ebd5e3c656a23 100644 --- a/lib/web_ui/test/embedder_test.dart +++ b/lib/web_ui/test/embedder_test.dart @@ -46,14 +46,14 @@ void testMain() { final FlutterViewEmbedder embedder = FlutterViewEmbedder(); expect( - embedder.glassPaneShadow?.querySelectorAll('flt-semantics-placeholder'), + embedder.glassPaneShadow.querySelectorAll('flt-semantics-placeholder'), isNotEmpty, ); }); test('renders a shadowRoot by default', () { final FlutterViewEmbedder embedder = FlutterViewEmbedder(); - final HostNode hostNode = embedder.glassPaneShadow!; + final HostNode hostNode = embedder.glassPaneShadow; expect(domInstanceOfString(hostNode.node, 'ShadowRoot'), isTrue); }); @@ -64,7 +64,7 @@ void testMain() { attachShadow = null; // Break ShadowDOM final FlutterViewEmbedder embedder = FlutterViewEmbedder(); - final HostNode hostNode = embedder.glassPaneShadow!; + final HostNode hostNode = embedder.glassPaneShadow; expect(domInstanceOfString(hostNode.node, 'Element'), isTrue); expect( (hostNode.node as DomElement).tagName, @@ -92,7 +92,7 @@ void testMain() { regularTextField.focus(); DomCSSStyleDeclaration? style = domWindow.getComputedStyle( - embedder.glassPaneShadow!.querySelector('input')!, + embedder.glassPaneShadow.querySelector('input')!, '::placeholder'); expect(style, isNotNull); expect(style.opacity, isNot('0')); @@ -104,7 +104,7 @@ void testMain() { textField.focus(); style = domWindow.getComputedStyle( - embedder.glassPaneShadow!.querySelector('input.flt-text-editing')!, + embedder.glassPaneShadow.querySelector('input.flt-text-editing')!, '::placeholder'); expect(style, isNotNull); expect(style.opacity, '0'); diff --git a/lib/web_ui/test/engine/pointer_binding_test.dart b/lib/web_ui/test/engine/pointer_binding_test.dart index 2dedf3ea5f491..1c9d1af957752 100644 --- a/lib/web_ui/test/engine/pointer_binding_test.dart +++ b/lib/web_ui/test/engine/pointer_binding_test.dart @@ -42,7 +42,7 @@ void main() { void testMain() { ensureFlutterViewEmbedderInitialized(); - final DomElement glassPane = flutterViewEmbedder.glassPaneElement!; + final DomElement glassPane = flutterViewEmbedder.glassPaneElement; late double dpi; setUp(() { diff --git a/lib/web_ui/test/engine/semantics/semantics_test.dart b/lib/web_ui/test/engine/semantics/semantics_test.dart index 76708d98ad187..63f70a6a06d40 100644 --- a/lib/web_ui/test/engine/semantics/semantics_test.dart +++ b/lib/web_ui/test/engine/semantics/semantics_test.dart @@ -1646,7 +1646,7 @@ void _testTappable() { ); tester.apply(); - expect(flutterViewEmbedder.glassPaneShadow!.activeElement, tester.getSemanticsObject(0).element); + expect(flutterViewEmbedder.glassPaneShadow.activeElement, tester.getSemanticsObject(0).element); semantics().semanticsEnabled = false; }); } @@ -2007,7 +2007,7 @@ void _testPlatformView() { expect(child3Rect.bottom, 60); final DomElement platformViewElement = - flutterViewEmbedder.glassPaneElement!.querySelector('#view-0')!; + flutterViewEmbedder.glassPaneElement.querySelector('#view-0')!; final DomRect platformViewRect = platformViewElement.getBoundingClientRect(); expect(platformViewRect.left, 0); expect(platformViewRect.top, 15); diff --git a/lib/web_ui/test/engine/semantics/semantics_tester.dart b/lib/web_ui/test/engine/semantics/semantics_tester.dart index 5feab92baef31..cee9eead3d3b0 100644 --- a/lib/web_ui/test/engine/semantics/semantics_tester.dart +++ b/lib/web_ui/test/engine/semantics/semantics_tester.dart @@ -22,7 +22,7 @@ import '../../matchers.dart'; /// so we don't have to hardcode domDocument across the test. (The host of a /// normal flutter app used to be domDocument, but now that the app is wrapped /// in a Shadow DOM, that's not the case anymore.) -HostNode get appHostNode => flutterViewEmbedder.glassPaneShadow!; +HostNode get appHostNode => flutterViewEmbedder.glassPaneShadow; /// CSS style applied to the root of the semantics tree. // TODO(yjbanov): this should be handled internally by [expectSemanticsTree]. diff --git a/lib/web_ui/test/html/bitmap_canvas_golden_test.dart b/lib/web_ui/test/html/bitmap_canvas_golden_test.dart index 8f3f5db1c31cf..1852988f64029 100644 --- a/lib/web_ui/test/html/bitmap_canvas_golden_test.dart +++ b/lib/web_ui/test/html/bitmap_canvas_golden_test.dart @@ -32,13 +32,13 @@ Future testMain() async { testScene.style.transform = 'scale(0.3)'; } testScene.append(canvas.rootElement); - flutterViewEmbedder.glassPaneShadow!.querySelector('flt-scene-host')!.append(testScene); + flutterViewEmbedder.glassPaneShadow.querySelector('flt-scene-host')!.append(testScene); } setUpStableTestFonts(); tearDown(() { - flutterViewEmbedder.glassPaneShadow?.querySelector('flt-scene')?.remove(); + flutterViewEmbedder.glassPaneShadow.querySelector('flt-scene')?.remove(); }); /// Draws several lines, some aligned precisely with the pixel grid, and some @@ -260,7 +260,7 @@ Future testMain() async { } sceneElement.querySelector('flt-clip')!.append(canvas.rootElement); - flutterViewEmbedder.glassPaneShadow!.querySelector('flt-scene-host')!.append(sceneElement); + flutterViewEmbedder.glassPaneShadow.querySelector('flt-scene-host')!.append(sceneElement); await matchGoldenFile( 'bitmap_canvas_draws_text_on_top_of_canvas.png',