[webview_flutter] Remove duplicate integration test (#4666)

This test is for a change that was entirely in Android Java code when it
was written, so is testing behavior that is internal to the Android
implementation, and a copy of this test already runs
webview_flutter_android. Given that it's testing internal Android
behavior, only that copy is needed.

For unknown reasons, this copy seems to hang test runs, while the
webview_flutter_android copy does not. Since it's a duplicate that we
want to remove anyway, this simply removes it to fix the tree without
meaningful loss of coverage.

Also fixes a race condition in an integration test, where a future
could be completed more than once.

Part of https://github.com/flutter/flutter/issues/91004
diff --git a/packages/webview_flutter/webview_flutter/CHANGELOG.md b/packages/webview_flutter/webview_flutter/CHANGELOG.md
index aa117c9..6620704 100644
--- a/packages/webview_flutter/webview_flutter/CHANGELOG.md
+++ b/packages/webview_flutter/webview_flutter/CHANGELOG.md
@@ -1,3 +1,8 @@
+## NEXT
+
+* Removes a duplicate Android-specific integration test.
+* Fixes an integration test race condition.
+
 ## 3.0.0
 
 * **BREAKING CHANGE**: On Android, hybrid composition (SurfaceAndroidWebView)
diff --git a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart
index 4c2d1fb..7588dc8 100644
--- a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart
+++ b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart
@@ -480,7 +480,7 @@
                 onMessageReceived: (JavascriptMessage message) {
                   final double currentTime = double.parse(message.message);
                   // Let it play for at least 1 second to make sure the related video's properties are set.
-                  if (currentTime > 1) {
+                  if (currentTime > 1 && !videoPlaying.isCompleted) {
                     videoPlaying.complete(null);
                   }
                 },
@@ -532,7 +532,7 @@
                 onMessageReceived: (JavascriptMessage message) {
                   final double currentTime = double.parse(message.message);
                   // Let it play for at least 1 second to make sure the related video's properties are set.
-                  if (currentTime > 1) {
+                  if (currentTime > 1 && !videoPlaying.isCompleted) {
                     videoPlaying.complete(null);
                   }
                 },
@@ -1202,75 +1202,6 @@
     },
     skip: _skipDueToIssue86757,
   );
-
-  testWidgets(
-    'JavaScript does not run in parent window',
-    (WidgetTester tester) async {
-      const String iframe = '''
-        <!DOCTYPE html>
-        <script>
-          window.onload = () => {
-            window.open(`javascript:
-              var elem = document.createElement("p");
-              elem.innerHTML = "<b>Executed JS in parent origin: " + window.location.origin + "</b>";
-              document.body.append(elem);
-            `);
-          };
-        </script>
-      ''';
-      final String iframeTestBase64 =
-          base64Encode(const Utf8Encoder().convert(iframe));
-
-      final String openWindowTest = '''
-        <!DOCTYPE html>
-        <html>
-        <head>
-          <title>XSS test</title>
-        </head>
-        <body>
-          <iframe
-            onload="window.iframeLoaded = true;"
-            src="data:text/html;charset=utf-8;base64,$iframeTestBase64"></iframe>
-        </body>
-        </html>
-      ''';
-      final String openWindowTestBase64 =
-          base64Encode(const Utf8Encoder().convert(openWindowTest));
-      final Completer<WebViewController> controllerCompleter =
-          Completer<WebViewController>();
-      final Completer<void> pageLoadCompleter = Completer<void>();
-
-      await tester.pumpWidget(
-        Directionality(
-          textDirection: TextDirection.ltr,
-          child: WebView(
-            key: GlobalKey(),
-            onWebViewCreated: (WebViewController controller) {
-              controllerCompleter.complete(controller);
-            },
-            javascriptMode: JavascriptMode.unrestricted,
-            initialUrl:
-                'data:text/html;charset=utf-8;base64,$openWindowTestBase64',
-            onPageFinished: (String url) {
-              pageLoadCompleter.complete();
-            },
-          ),
-        ),
-      );
-
-      final WebViewController controller = await controllerCompleter.future;
-      await pageLoadCompleter.future;
-
-      expect(controller.runJavascriptReturningResult('iframeLoaded'),
-          completion('true'));
-      expect(
-        controller.runJavascriptReturningResult(
-            'document.querySelector("p") && document.querySelector("p").textContent'),
-        completion('null'),
-      );
-    },
-    skip: !Platform.isAndroid,
-  );
 }
 
 // JavaScript booleans evaluate to different string values on Android and iOS.
diff --git a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md
index 818a134..145bc8f 100644
--- a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md
+++ b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md
@@ -1,3 +1,7 @@
+## NEXT
+
+* Fixes an integration test race condition.
+
 ## 2.8.2
 
 * Adds the `WebSettings.setAllowFileAccess()` method and ensure that file access is allowed when the `WebViewAndroidWidget.loadFile()` method is executed.
diff --git a/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart
index 91fc860..544089f 100644
--- a/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart
+++ b/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart
@@ -484,7 +484,7 @@
                 onMessageReceived: (JavascriptMessage message) {
                   final double currentTime = double.parse(message.message);
                   // Let it play for at least 1 second to make sure the related video's properties are set.
-                  if (currentTime > 1) {
+                  if (currentTime > 1 && !videoPlaying.isCompleted) {
                     videoPlaying.complete(null);
                   }
                 },
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md
index db8338d..c3dd872 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md
+++ b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md
@@ -1,6 +1,10 @@
+## NEXT
+
+* Fixes an integration test race condition.
+
 ## 2.7.1
 
-* Fixes header import for cookie manager to be relative only. 
+* Fixes header import for cookie manager to be relative only.
 
 ## 2.7.0
 
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart
index 1e4adb9..5824d5d 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart
+++ b/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart
@@ -466,7 +466,7 @@
                 onMessageReceived: (JavascriptMessage message) {
                   final double currentTime = double.parse(message.message);
                   // Let it play for at least 1 second to make sure the related video's properties are set.
-                  if (currentTime > 1) {
+                  if (currentTime > 1 && !videoPlaying.isCompleted) {
                     videoPlaying.complete(null);
                   }
                 },
@@ -517,7 +517,7 @@
                 onMessageReceived: (JavascriptMessage message) {
                   final double currentTime = double.parse(message.message);
                   // Let it play for at least 1 second to make sure the related video's properties are set.
-                  if (currentTime > 1) {
+                  if (currentTime > 1 && !videoPlaying.isCompleted) {
                     videoPlaying.complete(null);
                   }
                 },