// 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.

import 'dart:async';

import 'package:test/bootstrap/browser.dart';
import 'package:test/test.dart';
import 'package:ui/src/engine.dart';
import 'package:ui/ui.dart' as ui;
import 'package:ui/ui_web/src/ui_web.dart' as ui_web;

import 'common.dart';
import 'test_data.dart';

EngineFlutterWindow get implicitView =>
    EnginePlatformDispatcher.instance.implicitView!;

DomElement get platformViewsHost => implicitView.dom.platformViewsHost;
DomElement get sceneHost => implicitView.dom.sceneHost;

void main() {
  internalBootstrapBrowserTest(() => testMain);
}

void testMain() {
  group('$HtmlViewEmbedder', () {
    setUpCanvasKitTest(withImplicitView: true);

    setUp(() {
      EngineFlutterDisplay.instance.debugOverrideDevicePixelRatio(1);
    });

    tearDown(() {
      PlatformViewManager.instance.debugClear();
      CanvasKitRenderer.instance.debugClear();
    });

    test('embeds interactive platform views', () async {
      ui_web.platformViewRegistry.registerViewFactory(
        'test-platform-view',
        (int viewId) => createDomHTMLDivElement()..id = 'view-0',
      );
      await createPlatformView(0, 'test-platform-view');

      final LayerSceneBuilder sb = LayerSceneBuilder();
      sb.pushOffset(0, 0);
      sb.addPlatformView(0, width: 10, height: 10);
      await renderScene(sb.build());

      // 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 = platformViewsHost.querySelector('#view-0')!;
      final DomElement slot = sceneHost.querySelector('slot')!;
      final DomElement contentsHost = contents.parent!;
      final DomElement slotHost = slot.parent!;

      expect(contents, isNotNull,
          reason: 'The view from the factory is injected in the DOM.');

      expect(contentsHost.tagName, equalsIgnoringCase('flt-platform-view'));
      expect(slotHost.tagName, equalsIgnoringCase('flt-platform-view-slot'));

      expect(slotHost.style.pointerEvents, 'auto',
          reason: 'The slot reenables pointer events.');
      expect(contentsHost.getAttribute('slot'), slot.getAttribute('name'),
          reason: 'The contents and slot are correctly related.');
    });

    test('clips platform views with RRects', () async {
      ui_web.platformViewRegistry.registerViewFactory(
        'test-platform-view',
        (int viewId) => createDomHTMLDivElement()..id = 'view-0',
      );
      await createPlatformView(0, 'test-platform-view');

      final LayerSceneBuilder sb = LayerSceneBuilder();
      sb.pushOffset(0, 0);
      sb.pushClipRRect(
          ui.RRect.fromLTRBR(0, 0, 10, 10, const ui.Radius.circular(3)));
      sb.addPlatformView(0, width: 10, height: 10);
      await renderScene(sb.build());

      expect(
        sceneHost.querySelectorAll('#sk_path_defs').single,
        isNotNull,
      );
      expect(
        sceneHost
            .querySelectorAll('#sk_path_defs')
            .single
            .querySelectorAll('clipPath')
            .single,
        isNotNull,
      );
      expect(
        sceneHost.querySelectorAll('flt-clip').single.style.clipPath,
        'url("#svgClip1")',
      );
      expect(
        sceneHost.querySelectorAll('flt-clip').single.style.width,
        '100%',
      );
      expect(
        sceneHost.querySelectorAll('flt-clip').single.style.height,
        '100%',
      );
    });

    test('correctly transforms platform views', () async {
      ui_web.platformViewRegistry.registerViewFactory(
        'test-platform-view',
        (int viewId) => createDomHTMLDivElement()..id = 'view-0',
      );
      await createPlatformView(0, 'test-platform-view');

      final LayerSceneBuilder sb = LayerSceneBuilder();
      sb.pushOffset(0, 0);
      final Matrix4 scaleMatrix = Matrix4.identity()
        ..scale(5, 5)
        ..translate(100, 100);
      sb.pushTransform(scaleMatrix.toFloat64());
      sb.pushOffset(3, 3);
      sb.addPlatformView(0, width: 10, height: 10);
      await renderScene(sb.build());

      // Transformations happen on the slot element.
      final DomElement slotHost =
          sceneHost.querySelector('flt-platform-view-slot')!;

      expect(
        slotHost.style.transform,
        // We should apply the scale matrix first, then the offset matrix.
        // So the translate should be 515 (5 * 100 + 5 * 3), and not
        // 503 (5 * 100 + 3).
        'matrix3d(5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 515, 515, 0, 1)',
      );
    });

    test('correctly offsets platform views', () async {
      ui_web.platformViewRegistry.registerViewFactory(
        'test-platform-view',
        (int viewId) => createDomHTMLDivElement()..id = 'view-0',
      );
      await createPlatformView(0, 'test-platform-view');

      final LayerSceneBuilder sb = LayerSceneBuilder();
      sb.addPlatformView(0, offset: const ui.Offset(3, 4), width: 5, height: 6);
      await renderScene(sb.build());

      final DomElement slotHost =
          sceneHost.querySelector('flt-platform-view-slot')!;
      final DomCSSStyleDeclaration style = slotHost.style;

      expect(style.transform, 'matrix(1, 0, 0, 1, 3, 4)');
      expect(style.width, '5px');
      expect(style.height, '6px');

      final DomRect slotRect = slotHost.getBoundingClientRect();
      expect(slotRect.left, 3);
      expect(slotRect.top, 4);
      expect(slotRect.right, 8);
      expect(slotRect.bottom, 10);
    });

    // Returns the list of CSS transforms applied to the ancestor chain of
    // elements starting from `viewHost`, up until and excluding
    // <flt-scene-host>.
    List<String> getTransformChain(DomElement viewHost) {
      final List<String> chain = <String>[];
      DomElement? element = viewHost;
      while (element != null &&
          element.tagName.toLowerCase() != 'flt-scene-host') {
        chain.add(element.style.transform);
        element = element.parent;
      }
      return chain;
    }

    test('correctly offsets when clip chain length is changed', () async {
      ui_web.platformViewRegistry.registerViewFactory(
        'test-platform-view',
        (int viewId) => createDomHTMLDivElement()..id = 'view-0',
      );
      await createPlatformView(0, 'test-platform-view');

      LayerSceneBuilder sb = LayerSceneBuilder();
      sb.pushOffset(3, 3);
      sb.pushClipRect(ui.Rect.largest);
      sb.pushOffset(6, 6);
      sb.addPlatformView(0, width: 10, height: 10);
      sb.pop();
      await renderScene(sb.build());

      // Transformations happen on the slot element.
      DomElement slotHost = sceneHost.querySelector('flt-platform-view-slot')!;

      expect(
        getTransformChain(slotHost),
        <String>[
          'matrix(1, 0, 0, 1, 6, 6)',
          'matrix(1, 0, 0, 1, 3, 3)',
        ],
      );

      sb = LayerSceneBuilder();
      sb.pushOffset(3, 3);
      sb.pushClipRect(ui.Rect.largest);
      sb.pushOffset(6, 6);
      sb.pushClipRect(ui.Rect.largest);
      sb.pushOffset(9, 9);
      sb.addPlatformView(0, width: 10, height: 10);
      await renderScene(sb.build());

      // Transformations happen on the slot element.
      slotHost = sceneHost.querySelector('flt-platform-view-slot')!;

      expect(
        getTransformChain(slotHost),
        <String>[
          'matrix(1, 0, 0, 1, 9, 9)',
          'matrix(1, 0, 0, 1, 6, 6)',
          'matrix(1, 0, 0, 1, 3, 3)',
        ],
      );
    });

    test('converts device pixels to logical pixels (no clips)', () async {
      EngineFlutterDisplay.instance.debugOverrideDevicePixelRatio(4);
      ui_web.platformViewRegistry.registerViewFactory(
        'test-platform-view',
        (int viewId) => createDomHTMLDivElement()..id = 'view-0',
      );
      await createPlatformView(0, 'test-platform-view');

      final LayerSceneBuilder sb = LayerSceneBuilder();
      sb.pushOffset(1, 1);
      sb.pushOffset(2, 2);
      sb.pushOffset(3, 3);
      sb.addPlatformView(0, width: 10, height: 10);
      await renderScene(sb.build());

      // Transformations happen on the slot element.
      final DomElement slotHost =
          sceneHost.querySelector('flt-platform-view-slot')!;

      expect(
        getTransformChain(slotHost),
        <String>['matrix(0.25, 0, 0, 0.25, 1.5, 1.5)'],
      );
    });

    test('converts device pixels to logical pixels (with clips)', () async {
      EngineFlutterDisplay.instance.debugOverrideDevicePixelRatio(4);
      ui_web.platformViewRegistry.registerViewFactory(
        'test-platform-view',
        (int viewId) => createDomHTMLDivElement()..id = 'view-0',
      );
      await createPlatformView(0, 'test-platform-view');

      final LayerSceneBuilder sb = LayerSceneBuilder();
      sb.pushOffset(3, 3);
      sb.pushClipRect(ui.Rect.largest);
      sb.pushOffset(6, 6);
      sb.pushClipRect(ui.Rect.largest);
      sb.pushOffset(9, 9);
      sb.addPlatformView(0, width: 10, height: 10);
      await renderScene(sb.build());

      // Transformations happen on the slot element.
      final DomElement slotHost =
          sceneHost.querySelector('flt-platform-view-slot')!;

      expect(
        getTransformChain(slotHost),
        <String>[
          'matrix(1, 0, 0, 1, 9, 9)',
          'matrix(1, 0, 0, 1, 6, 6)',
          'matrix(0.25, 0, 0, 0.25, 0.75, 0.75)',
        ],
      );
    });

    test('renders overlays on top of platform views', () async {
      final CkPicture testPicture =
          paintPicture(const ui.Rect.fromLTRB(0, 0, 10, 10), (CkCanvas canvas) {
        canvas.drawCircle(const ui.Offset(5, 5), 5, CkPaint());
      });

      // Initialize all platform views to be used in the test.
      final List<int> platformViewIds = <int>[];
      for (int i = 0; i < 16; i++) {
        ui_web.platformViewRegistry.registerViewFactory(
          'test-platform-view',
          (int viewId) => createDomHTMLDivElement()..id = 'view-$i',
        );
        await createPlatformView(i, 'test-platform-view');
        platformViewIds.add(i);
      }

      Future<void> renderTestScene({required int viewCount}) async {
        final LayerSceneBuilder sb = LayerSceneBuilder();
        sb.pushOffset(0, 0);
        for (int i = 0; i < viewCount; i++) {
          sb.addPicture(ui.Offset.zero, testPicture);
          sb.addPlatformView(i, width: 10, height: 10);
        }
        await renderScene(sb.build());
      }

      // Frame 1:
      //   Render: up to cache size platform views.
      //   Expect: main canvas plus platform view overlays.
      await renderTestScene(viewCount: 8);
      _expectSceneMatches(<_EmbeddedViewMarker>[
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
      ]);

      // Frame 2:
      //   Render: zero platform views.
      //   Expect: main canvas, no overlays.
      await renderTestScene(viewCount: 0);
      _expectSceneMatches(<_EmbeddedViewMarker>[]);

      // Frame 3:
      //   Render: less than cache size platform views.
      //   Expect: overlays reused.
      await renderTestScene(viewCount: 6);
      _expectSceneMatches(<_EmbeddedViewMarker>[
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
      ]);

      // Frame 4:
      //   Render: more platform views than max overlay count.
      //   Expect: main canvas, backup overlay, maximum overlays.
      await renderTestScene(viewCount: 16);
      _expectSceneMatches(<_EmbeddedViewMarker>[
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _platformView,
        _platformView,
        _platformView,
        _platformView,
        _platformView,
        _platformView,
        _platformView,
        _platformView,
        _overlay,
        _platformView,
      ]);

      // Frame 5:
      //   Render: zero platform views.
      //   Expect: main canvas, no overlays.
      await renderTestScene(viewCount: 0);
      _expectSceneMatches(<_EmbeddedViewMarker>[]);

      // Frame 6:
      //   Render: deleted platform views.
      //   Expect: error.
      for (final int id in platformViewIds) {
        const StandardMethodCodec codec = StandardMethodCodec();
        final Completer<void> completer = Completer<void>();
        ui.PlatformDispatcher.instance.sendPlatformMessage(
          'flutter/platform_views',
          codec.encodeMethodCall(MethodCall(
            'dispose',
            id,
          )),
          completer.complete,
        );
        await completer.future;
      }

      try {
        await renderTestScene(viewCount: platformViewIds.length);
        fail('Expected to throw');
      } on AssertionError catch (error) {
        expect(
          error.toString(),
          'Assertion failed: "Cannot render platform views: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15. These views have not been created, or they have been deleted."',
        );
      }

      // Frame 7:
      //   Render: a platform view after error.
      //   Expect: success. Just checking the system is not left in a corrupted state.
      await createPlatformView(0, 'test-platform-view');
      await renderTestScene(viewCount: 0);
      _expectSceneMatches(<_EmbeddedViewMarker>[]);
    });

    test('correctly reuses overlays', () async {
      final CkPicture testPicture =
          paintPicture(const ui.Rect.fromLTRB(0, 0, 10, 10), (CkCanvas canvas) {
        canvas.drawCircle(const ui.Offset(5, 5), 5, CkPaint());
      });

      // Initialize all platform views to be used in the test.
      final List<int> platformViewIds = <int>[];
      for (int i = 0; i < 20; i++) {
        ui_web.platformViewRegistry.registerViewFactory(
          'test-platform-view',
          (int viewId) => createDomHTMLDivElement()..id = 'view-$i',
        );
        await createPlatformView(i, 'test-platform-view');
        platformViewIds.add(i);
      }

      Future<void> renderTestScene(List<int> views) async {
        final LayerSceneBuilder sb = LayerSceneBuilder();
        sb.pushOffset(0, 0);
        for (final int view in views) {
          sb.addPicture(ui.Offset.zero, testPicture);
          sb.addPlatformView(view, width: 10, height: 10);
        }
        await renderScene(sb.build());
      }

      // Frame 1:
      //   Render: Views 1-10
      //   Expect: main canvas plus platform view overlays; empty cache.
      await renderTestScene(<int>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
      _expectSceneMatches(<_EmbeddedViewMarker>[
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _platformView,
        _platformView,
        _overlay,
        _platformView,
      ]);

      // Frame 2:
      //   Render: Views 2-11
      //   Expect: main canvas plus platform view overlays; empty cache.
      await renderTestScene(<int>[2, 3, 4, 5, 6, 7, 8, 9, 10, 11]);
      _expectSceneMatches(<_EmbeddedViewMarker>[
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _platformView,
        _platformView,
        _overlay,
        _platformView,
      ]);

      // Frame 3:
      //   Render: Views 3-12
      //   Expect: main canvas plus platform view overlays; empty cache.
      await renderTestScene(<int>[3, 4, 5, 6, 7, 8, 9, 10, 11, 12]);
      _expectSceneMatches(<_EmbeddedViewMarker>[
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _platformView,
        _platformView,
        _overlay,
        _platformView,
      ]);

      // Frame 4:
      //   Render: Views 3-12 again (same as last frame)
      //   Expect: main canvas plus platform view overlays; empty cache.
      await renderTestScene(<int>[3, 4, 5, 6, 7, 8, 9, 10, 11, 12]);
      _expectSceneMatches(<_EmbeddedViewMarker>[
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _platformView,
        _platformView,
        _overlay,
        _platformView,
      ]);
    });

    test('embeds and disposes of a platform view', () async {
      ui_web.platformViewRegistry.registerViewFactory(
        'test-platform-view',
        (int viewId) => createDomHTMLDivElement()..id = 'view-0',
      );
      await createPlatformView(0, 'test-platform-view');

      LayerSceneBuilder sb = LayerSceneBuilder();
      sb.pushOffset(0, 0);
      sb.addPlatformView(0, width: 10, height: 10);
      await renderScene(sb.build());
      _expectSceneMatches(<_EmbeddedViewMarker>[
        _platformView,
      ]);

      expect(platformViewsHost.querySelector('flt-platform-view'), isNotNull);

      await disposePlatformView(0);

      sb = LayerSceneBuilder();
      sb.pushOffset(0, 0);
      await renderScene(sb.build());

      _expectSceneMatches(<_EmbeddedViewMarker>[]);

      expect(platformViewsHost.querySelector('flt-platform-view'), isNull);
    });

    test(
        'does not crash when resizing the window after textures have been registered',
        () async {
      ui_web.platformViewRegistry.registerViewFactory(
        'test-platform-view',
        (int viewId) => createDomHTMLDivElement()..id = 'view-0',
      );
      await createPlatformView(0, 'test-platform-view');

      final CkBrowserImageDecoder image = await CkBrowserImageDecoder.create(
        data: kAnimatedGif,
        debugSource: 'test',
      );
      final ui.FrameInfo frame = await image.getNextFrame();
      final CkImage ckImage = frame.image as CkImage;

      final LayerSceneBuilder sb = LayerSceneBuilder();
      sb.pushOffset(0, 0);
      final CkPictureRecorder recorder = CkPictureRecorder();
      final CkCanvas canvas = recorder.beginRecording(ui.Rect.largest);
      canvas.drawImage(ckImage, ui.Offset.zero, CkPaint());
      final CkPicture picture = recorder.endRecording();
      sb.addPicture(ui.Offset.zero, picture);
      sb.addPlatformView(0, width: 10, height: 10);

      implicitView.debugPhysicalSizeOverride = const ui.Size(100, 100);
      implicitView.debugForceResize();
      await renderScene(sb.build());
      _expectSceneMatches(<_EmbeddedViewMarker>[
        _overlay,
        _platformView,
      ]);

      implicitView.debugPhysicalSizeOverride = const ui.Size(200, 200);
      implicitView.debugForceResize();
      await renderScene(sb.build());
      _expectSceneMatches(<_EmbeddedViewMarker>[
        _overlay,
        _platformView,
      ]);

      implicitView.debugPhysicalSizeOverride = null;
      implicitView.debugForceResize();

      // ImageDecoder is not supported in Safari or Firefox.
    }, skip: isSafari || isFirefox);

    test('removes the DOM node of an unrendered platform view', () async {
      ui_web.platformViewRegistry.registerViewFactory(
        'test-platform-view',
        (int viewId) => createDomHTMLDivElement()..id = 'view-0',
      );
      await createPlatformView(0, 'test-platform-view');

      LayerSceneBuilder sb = LayerSceneBuilder();
      sb.pushOffset(0, 0);
      sb.addPlatformView(0, width: 10, height: 10);
      await renderScene(sb.build());
      _expectSceneMatches(<_EmbeddedViewMarker>[
        _platformView,
      ]);

      expect(platformViewsHost.querySelector('flt-platform-view'), isNotNull);

      // Render a frame with a different platform view.
      await createPlatformView(1, 'test-platform-view');
      sb = LayerSceneBuilder();
      sb.pushOffset(0, 0);
      sb.addPlatformView(1, width: 10, height: 10);
      await renderScene(sb.build());
      _expectSceneMatches(<_EmbeddedViewMarker>[
        _platformView,
      ]);

      expect(
        platformViewsHost.querySelectorAll('flt-platform-view'),
        hasLength(2),
      );

      // Render a frame without a platform view, but also without disposing of
      // the platform view.
      sb = LayerSceneBuilder();
      sb.pushOffset(0, 0);
      await renderScene(sb.build());
      _expectSceneMatches(<_EmbeddedViewMarker>[]);

      // The actual contents of the platform view are kept in the dom, until
      // it's actually disposed of!
      expect(
        platformViewsHost.querySelectorAll('flt-platform-view'),
        hasLength(2),
      );
    });

    test(
        'removes old SVG clip definitions from the DOM when the view is recomposited',
        () async {
      ui_web.platformViewRegistry.registerViewFactory(
        'test-platform-view',
        (int viewId) => createDomHTMLDivElement()..id = 'test-view',
      );
      await createPlatformView(0, 'test-platform-view');

      Future<void> renderTestScene() async {
        final LayerSceneBuilder sb = LayerSceneBuilder();
        sb.pushOffset(0, 0);
        sb.pushClipRRect(
            ui.RRect.fromLTRBR(0, 0, 10, 10, const ui.Radius.circular(3)));
        sb.addPlatformView(0, width: 10, height: 10);
        await renderScene(sb.build());
      }

      final DomNode skPathDefs = sceneHost.querySelector('#sk_path_defs')!;

      expect(skPathDefs.childNodes, hasLength(0));

      await renderTestScene();
      expect(skPathDefs.childNodes, hasLength(1));

      await renderTestScene();
      expect(skPathDefs.childNodes, hasLength(1));

      await renderTestScene();
      expect(skPathDefs.childNodes, hasLength(1));
    });

    test('does not crash when a prerolled platform view is not composited',
        () async {
      ui_web.platformViewRegistry.registerViewFactory(
        'test-platform-view',
        (int viewId) => createDomHTMLDivElement()..id = 'view-0',
      );
      await createPlatformView(0, 'test-platform-view');

      final LayerSceneBuilder sb = LayerSceneBuilder();
      sb.pushOffset(0, 0);
      sb.pushClipRect(ui.Rect.zero);
      sb.addPlatformView(0, width: 10, height: 10);
      sb.pop();
      // The below line should not throw an error.
      await renderScene(sb.build());
      _expectSceneMatches(<_EmbeddedViewMarker>[]);
    });

    test('does not create overlays for invisible platform views', () async {
      final CkPicture testPicture =
          paintPicture(const ui.Rect.fromLTRB(0, 0, 10, 10), (CkCanvas canvas) {
        canvas.drawCircle(const ui.Offset(5, 5), 5, CkPaint());
      });
      ui_web.platformViewRegistry.registerViewFactory(
          'test-visible-view',
          (int viewId) =>
              createDomHTMLDivElement()..className = 'visible-platform-view');
      ui_web.platformViewRegistry.registerViewFactory(
        'test-invisible-view',
        (int viewId) =>
            createDomHTMLDivElement()..className = 'invisible-platform-view',
        isVisible: false,
      );
      await createPlatformView(0, 'test-visible-view');
      await createPlatformView(1, 'test-invisible-view');
      await createPlatformView(2, 'test-visible-view');
      await createPlatformView(3, 'test-invisible-view');
      await createPlatformView(4, 'test-invisible-view');
      await createPlatformView(5, 'test-invisible-view');
      await createPlatformView(6, 'test-invisible-view');

      expect(PlatformViewManager.instance.isInvisible(0), isFalse);
      expect(PlatformViewManager.instance.isInvisible(1), isTrue);

      LayerSceneBuilder sb = LayerSceneBuilder();
      sb.pushOffset(0, 0);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(1, width: 10, height: 10);
      sb.pop();
      await renderScene(sb.build());
      _expectSceneMatches(<_EmbeddedViewMarker>[
        _platformView,
        _overlay,
      ], reason: 'Invisible view renders, followed by an overlay.');

      sb = LayerSceneBuilder();
      sb.pushOffset(0, 0);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(0, width: 10, height: 10);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(1, width: 10, height: 10);
      sb.pop();
      await renderScene(sb.build());
      _expectSceneMatches(<_EmbeddedViewMarker>[
        _overlay,
        _platformView,
        _platformView,
        _overlay,
      ], reason: 'Overlay created after a group containing a visible view.');

      sb = LayerSceneBuilder();
      sb.pushOffset(0, 0);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(0, width: 10, height: 10);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(1, width: 10, height: 10);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(2, width: 10, height: 10);
      sb.pop();
      await renderScene(sb.build());
      _expectSceneMatches(<_EmbeddedViewMarker>[
        _overlay,
        _platformView,
        _platformView,
        _overlay,
        _platformView,
      ],
          reason:
              'Overlays created after each group containing a visible view.');

      sb = LayerSceneBuilder();
      sb.pushOffset(0, 0);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(0, width: 10, height: 10);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(1, width: 10, height: 10);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(2, width: 10, height: 10);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(3, width: 10, height: 10);
      sb.pop();
      await renderScene(sb.build());
      _expectSceneMatches(<_EmbeddedViewMarker>[
        _overlay,
        _platformView,
        _platformView,
        _overlay,
        _platformView,
        _platformView,
        _overlay,
      ], reason: 'Invisible views grouped in with visible views.');

      sb = LayerSceneBuilder();
      sb.pushOffset(0, 0);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(0, width: 10, height: 10);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(1, width: 10, height: 10);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(2, width: 10, height: 10);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(3, width: 10, height: 10);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(4, width: 10, height: 10);
      sb.pop();
      await renderScene(sb.build());
      _expectSceneMatches(<_EmbeddedViewMarker>[
        _overlay,
        _platformView,
        _platformView,
        _overlay,
        _platformView,
        _platformView,
        _platformView,
        _overlay,
      ]);

      sb = LayerSceneBuilder();
      sb.pushOffset(0, 0);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(0, width: 10, height: 10);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(1, width: 10, height: 10);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(2, width: 10, height: 10);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(3, width: 10, height: 10);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(4, width: 10, height: 10);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(5, width: 10, height: 10);
      sb.pop();
      await renderScene(sb.build());
      _expectSceneMatches(<_EmbeddedViewMarker>[
        _overlay,
        _platformView,
        _platformView,
        _overlay,
        _platformView,
        _platformView,
        _platformView,
        _platformView,
        _overlay,
      ]);

      sb = LayerSceneBuilder();
      sb.pushOffset(0, 0);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(0, width: 10, height: 10);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(1, width: 10, height: 10);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(2, width: 10, height: 10);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(3, width: 10, height: 10);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(4, width: 10, height: 10);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(5, width: 10, height: 10);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(6, width: 10, height: 10);
      sb.pop();
      await renderScene(sb.build());
      _expectSceneMatches(<_EmbeddedViewMarker>[
        _overlay,
        _platformView,
        _platformView,
        _overlay,
        _platformView,
        _platformView,
        _platformView,
        _platformView,
        _platformView,
        _overlay,
      ]);

      sb = LayerSceneBuilder();
      sb.pushOffset(0, 0);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(1, width: 10, height: 10);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(3, width: 10, height: 10);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(4, width: 10, height: 10);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(5, width: 10, height: 10);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(6, width: 10, height: 10);
      sb.pop();
      await renderScene(sb.build());
      _expectSceneMatches(<_EmbeddedViewMarker>[
        _platformView,
        _platformView,
        _platformView,
        _platformView,
        _platformView,
        _overlay,
      ],
          reason:
              'Many invisible views can be rendered on top of the base overlay.');

      sb = LayerSceneBuilder();
      sb.pushOffset(0, 0);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(1, width: 10, height: 10);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(2, width: 10, height: 10);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(3, width: 10, height: 10);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(4, width: 10, height: 10);
      sb.pop();
      await renderScene(sb.build());
      _expectSceneMatches(<_EmbeddedViewMarker>[
        _platformView,
        _overlay,
        _platformView,
        _platformView,
        _platformView,
        _overlay,
      ]);

      sb = LayerSceneBuilder();
      sb.pushOffset(0, 0);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(4, width: 10, height: 10);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(3, width: 10, height: 10);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(2, width: 10, height: 10);
      sb.addPicture(ui.Offset.zero, testPicture);
      sb.addPlatformView(1, width: 10, height: 10);
      sb.pop();
      await renderScene(sb.build());
      _expectSceneMatches(<_EmbeddedViewMarker>[
        _platformView,
        _platformView,
        _overlay,
        _platformView,
        _platformView,
        _overlay,
      ]);
    });

    test('can dispose without crashing', () async {
      ui_web.platformViewRegistry.registerViewFactory(
          'test-view',
          (int viewId) =>
              createDomHTMLDivElement()..className = 'platform-view',
          isVisible: false);

      await createPlatformView(0, 'test-view');
      await createPlatformView(1, 'test-view');
      await createPlatformView(2, 'test-view');

      final LayerSceneBuilder sb = LayerSceneBuilder()
        ..pushOffset(0, 0)
        ..addPlatformView(0, width: 10, height: 10)
        ..addPlatformView(1, width: 10, height: 10)
        ..addPlatformView(2, width: 10, height: 10)
        ..pop();

      await renderScene(sb.build());

      _expectSceneMatches(<_EmbeddedViewMarker>[
        _platformView,
        _platformView,
        _platformView,
      ]);

      expect(() {
        final HtmlViewEmbedder embedder = (renderer as CanvasKitRenderer)
            .debugGetRasterizerForView(implicitView)!
            .viewEmbedder;
        // The following line used to cause a "Concurrent modification during iteration"
        embedder.dispose();
      }, returnsNormally);
    });

    test('optimizes overlays when pictures and platform views do not overlap',
        () async {
      ui_web.platformViewRegistry.registerViewFactory(
        'test-view',
        (int viewId) => createDomHTMLDivElement()..className = 'platform-view',
      );

      CkPicture rectPicture(ui.Rect rect) {
        return paintPicture(rect, (CkCanvas canvas) {
          canvas.drawRect(
              rect, CkPaint()..color = const ui.Color.fromARGB(255, 255, 0, 0));
        });
      }

      await createPlatformView(0, 'test-view');
      await createPlatformView(1, 'test-view');
      await createPlatformView(2, 'test-view');

      expect(PlatformViewManager.instance.isVisible(0), isTrue);
      expect(PlatformViewManager.instance.isVisible(1), isTrue);
      expect(PlatformViewManager.instance.isVisible(2), isTrue);

      // Scene 1: Pictures just overlap with the most recently painted platform
      // view. Analogous to third-party images with subtitles overlaid. Should
      // only need one overlay at the end of the scene.
      final LayerSceneBuilder sb1 = LayerSceneBuilder();
      sb1.pushOffset(0, 0);
      sb1.addPlatformView(0,
          offset: const ui.Offset(10, 10), width: 50, height: 50);
      sb1.addPicture(
          ui.Offset.zero, rectPicture(const ui.Rect.fromLTWH(12, 12, 10, 10)));
      sb1.addPlatformView(1,
          offset: const ui.Offset(70, 10), width: 50, height: 50);
      sb1.addPicture(
          ui.Offset.zero, rectPicture(const ui.Rect.fromLTWH(72, 12, 10, 10)));
      sb1.addPlatformView(2,
          offset: const ui.Offset(130, 10), width: 50, height: 50);
      sb1.addPicture(
          ui.Offset.zero, rectPicture(const ui.Rect.fromLTWH(132, 12, 10, 10)));
      final LayerScene scene1 = sb1.build();
      await renderScene(scene1);
      _expectSceneMatches(<_EmbeddedViewMarker>[
        _platformView,
        _platformView,
        _platformView,
        _overlay,
      ]);

      // Scene 2: Same as scene 1 but with a background painted first. Should only
      // need a canvas for the background and one more for the rest of the
      // pictures.
      final LayerSceneBuilder sb2 = LayerSceneBuilder();
      sb2.pushOffset(0, 0);
      sb2.addPicture(
          ui.Offset.zero, rectPicture(const ui.Rect.fromLTWH(0, 0, 300, 300)));
      sb2.addPlatformView(0,
          offset: const ui.Offset(10, 10), width: 50, height: 50);
      sb2.addPicture(
          ui.Offset.zero, rectPicture(const ui.Rect.fromLTWH(12, 12, 10, 10)));
      sb2.addPlatformView(1,
          offset: const ui.Offset(70, 10), width: 50, height: 50);
      sb2.addPicture(
          ui.Offset.zero, rectPicture(const ui.Rect.fromLTWH(72, 12, 10, 10)));
      sb2.addPlatformView(2,
          offset: const ui.Offset(130, 10), width: 50, height: 50);
      sb2.addPicture(
          ui.Offset.zero, rectPicture(const ui.Rect.fromLTWH(132, 12, 10, 10)));
      final LayerScene scene2 = sb2.build();
      await renderScene(scene2);
      _expectSceneMatches(<_EmbeddedViewMarker>[
        _overlay,
        _platformView,
        _platformView,
        _platformView,
        _overlay,
      ]);

      // Scene 3: Paints a full-screen picture between each platform view. This
      // is the worst case scenario. There should be an overlay between each
      // platform view.
      final LayerSceneBuilder sb3 = LayerSceneBuilder();
      sb3.pushOffset(0, 0);
      sb3.addPicture(
          ui.Offset.zero, rectPicture(const ui.Rect.fromLTWH(0, 0, 300, 300)));
      sb3.addPlatformView(0,
          offset: const ui.Offset(10, 10), width: 50, height: 50);
      sb3.addPicture(
          ui.Offset.zero, rectPicture(const ui.Rect.fromLTWH(0, 0, 300, 300)));
      sb3.addPlatformView(1,
          offset: const ui.Offset(70, 10), width: 50, height: 50);
      sb3.addPicture(
          ui.Offset.zero, rectPicture(const ui.Rect.fromLTWH(0, 0, 300, 300)));
      sb3.addPlatformView(2,
          offset: const ui.Offset(130, 10), width: 50, height: 50);
      sb3.addPicture(
          ui.Offset.zero, rectPicture(const ui.Rect.fromLTWH(0, 0, 300, 300)));
      final LayerScene scene3 = sb3.build();
      await renderScene(scene3);
      _expectSceneMatches(<_EmbeddedViewMarker>[
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
        _platformView,
        _overlay,
      ]);
    });

    test('optimized overlays correctly with transforms and clips', () async {
      ui_web.platformViewRegistry.registerViewFactory(
        'test-view',
        (int viewId) => createDomHTMLDivElement()..className = 'platform-view',
      );

      CkPicture rectPicture(ui.Rect rect) {
        return paintPicture(rect, (CkCanvas canvas) {
          canvas.drawRect(
              rect, CkPaint()..color = const ui.Color.fromARGB(255, 255, 0, 0));
        });
      }

      await createPlatformView(0, 'test-view');

      expect(PlatformViewManager.instance.isVisible(0), isTrue);

      // Test optimization correctly computes bounds with transforms and clips.
      final LayerSceneBuilder sb = LayerSceneBuilder();
      sb.pushOffset(0, 0);
      final Matrix4 scaleMatrix = Matrix4.identity()..scale(3, 3, 1);
      sb.pushTransform(scaleMatrix.toFloat64());
      sb.pushClipRect(const ui.Rect.fromLTWH(10, 10, 10, 10));
      sb.addPicture(
          ui.Offset.zero, rectPicture(const ui.Rect.fromLTWH(0, 0, 20, 20)));
      sb.addPlatformView(0, width: 20, height: 20);
      final LayerScene scene = sb.build();
      await renderScene(scene);
      _expectSceneMatches(<_EmbeddedViewMarker>[
        _overlay,
        _platformView,
      ]);
    });
  });
}

// Used to test that the platform views and overlays are in the correct order in
// the scene.
enum _EmbeddedViewMarker {
  overlay,
  platformView,
}

_EmbeddedViewMarker get _overlay => _EmbeddedViewMarker.overlay;
_EmbeddedViewMarker get _platformView => _EmbeddedViewMarker.platformView;

const Map<String, _EmbeddedViewMarker> _tagToViewMarker =
    <String, _EmbeddedViewMarker>{
  'flt-canvas-container': _EmbeddedViewMarker.overlay,
  'flt-platform-view-slot': _EmbeddedViewMarker.platformView,
  'flt-clip': _EmbeddedViewMarker.platformView,
};

void _expectSceneMatches(
  List<_EmbeddedViewMarker> expectedMarkers, {
  String? reason,
}) {
  // Convert the scene elements to its corresponding array of _EmbeddedViewMarker
  final List<_EmbeddedViewMarker> sceneElements = sceneHost.children
      .where((DomElement element) => element.tagName != 'svg')
      .map((DomElement element) =>
          _tagToViewMarker[element.tagName.toLowerCase()]!)
      .toList();

  expect(sceneElements, expectedMarkers, reason: reason);
}
