Break out webkit tests by targetSdk

Move all existing androidx.webkit tests into a separate library module
configured with product flavours to allow dark-mode tests to run under
their intended targetSdk version.

The CL re-enables the previously disabled tests that required targetSdk
<= 32 and permanently removes a broken test that conflicts with web
standards (b/202546063).

All other tests for androidx.webkit have been moved as well in order to
allow continued use of shared test utilities.

Test: webkit:integration-tests:targesdk-tests:connectedAndroidTest
Fixes: 254572377
Change-Id: I8256255e0672b3e200022e374f78fdbe98965614
diff --git a/settings.gradle b/settings.gradle
index 242ed5c..ceba832 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1074,6 +1074,7 @@
 includeProject(":wear:watchface:watchface-style", [BuildType.MAIN, BuildType.WEAR])
 includeProject(":wear:watchface:watchface-style-old-api-test-service", "wear/watchface/watchface-style/old-api-test-service", [BuildType.MAIN, BuildType.WEAR])
 includeProject(":wear:watchface:watchface-style-old-api-test-stub", "wear/watchface/watchface-style/old-api-test-stub", [BuildType.MAIN, BuildType.WEAR])
+includeProject(":webkit:integration-tests:instrumentation", [BuildType.MAIN])
 includeProject(":webkit:integration-tests:testapp", [BuildType.MAIN])
 includeProject(":webkit:webkit", [BuildType.MAIN])
 includeProject(":window:window", [BuildType.MAIN, BuildType.COMPOSE, BuildType.FLAN, BuildType.WINDOW])
diff --git a/webkit/README.md b/webkit/README.md
index dedcbe1..7b564c0 100644
--- a/webkit/README.md
+++ b/webkit/README.md
@@ -24,16 +24,23 @@
 ```sh
 cd frameworks/support/
 # Build the library/compile changes
-./gradlew :webkit:assembleDebug
+./gradlew :webkit:webkit:assembleDebug
 # Run integration tests with the WebView installed on the device
-./gradlew :webkit:connectedAndroidTest
+./gradlew :webkit:integration-tests:instrumentation:connectedAndroidTest
 # Update API files (only necessary if you changed public APIs)
-./gradlew :webkit:updateApi
+./gradlew :webkit:webkit:updateApi
 ```
 
 For more a detailed developer guide, Googlers should read
 http://go/wvsl-contribute.
 
+## Instrumentation tests
+The instrumentation tests for `androidx.webkit` are located in the
+`:webkit:integration-tests:instrumentation` project. The tests have been split out into a separate
+project to facilitate testing against different targetSdk versions.
+
+Any new tests should be added to that project. To run the test, use the command above.
+
 ## API demo code
 
 We also maintain a demo app ([demo
diff --git a/webkit/integration-tests/instrumentation/README.md b/webkit/integration-tests/instrumentation/README.md
new file mode 100644
index 0000000..fc40d86
--- /dev/null
+++ b/webkit/integration-tests/instrumentation/README.md
@@ -0,0 +1,27 @@
+# Webkit library instrumentation tests
+
+This project contains the instrumentation tests for the [webkit](/webkit/webkit) library.
+
+The tests are located in a separate module to allow the use of multiple
+[product flavors](https://developer.android.com/build/build-variants#product-flavors)
+to build and run the tests against different targetSdk versions.
+
+This is necessary in order to test dark mode functionality, which changes depending on `targetSdk`
+between `32` and `33`.
+
+
+## Source sets
+Tests that do not depend on a particular `targetSdk` version should be added to the default `androidTest` source set.
+
+Tests that require a particular `targetSdk` version should be added to the appropriate
+[source set](https://developer.android.com/build/build-variants#sourcesets).
+
+## Running tests from Android Studio
+Tests can be run as normal in Android Studio. You must use the "Build Variants" menu to select
+the product flavor to run. Use one of
+
+* `targetSdkLatestDebug`
+* `targetSdk32Debug`
+
+You must select the corresponding build variant in order to run tests located outside the shared
+source set.
\ No newline at end of file
diff --git a/webkit/integration-tests/instrumentation/build.gradle b/webkit/integration-tests/instrumentation/build.gradle
new file mode 100644
index 0000000..3c0f930
--- /dev/null
+++ b/webkit/integration-tests/instrumentation/build.gradle
@@ -0,0 +1,50 @@
+import androidx.build.Publish
+import androidx.build.LibraryType
+
+plugins {
+    id("AndroidXPlugin")
+    id('com.android.library')
+}
+android {
+    namespace 'androidx.webkit.instrumentation'
+
+    defaultConfig {
+        multiDexEnabled = true
+        targetSdkVersion 33  // This should be the latest SDK version at all times.
+    }
+    flavorDimensions = ["targetSdk"]
+
+    productFlavors {
+        targetSdk32 {
+            dimension "targetSdk"
+            targetSdkVersion 32
+        }
+        targetSdkLatest {
+            dimension "targetSdk"
+            // uses default config
+        }
+    }
+}
+dependencies {
+    androidTestImplementation(project(":webkit:webkit"))
+
+    androidTestImplementation(libs.okhttpMockwebserver)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation("androidx.appcompat:appcompat:1.1.0")
+    androidTestImplementation("androidx.concurrent:concurrent-futures:1.0.0")
+    androidTestImplementation(libs.mockitoCore, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(libs.dexmakerMockito, excludes.bytebuddy)
+    androidTestImplementation(libs.multidex)
+
+    // Hamcrest matchers:
+    androidTestImplementation(libs.bundles.espressoContrib, excludes.espresso)
+}
+
+androidx {
+    type = type = LibraryType.INTERNAL_TEST_LIBRARY
+    publish = Publish.NONE  // This library exists for CI-testing only - do not publish.
+    additionalDeviceTestApkKeys.add("chrome")
+}
diff --git a/webkit/webkit/src/androidTest/AndroidManifest.xml b/webkit/integration-tests/instrumentation/src/androidTest/AndroidManifest.xml
similarity index 86%
rename from webkit/webkit/src/androidTest/AndroidManifest.xml
rename to webkit/integration-tests/instrumentation/src/androidTest/AndroidManifest.xml
index 86da6b2..a1eefc5 100644
--- a/webkit/webkit/src/androidTest/AndroidManifest.xml
+++ b/webkit/integration-tests/instrumentation/src/androidTest/AndroidManifest.xml
@@ -22,13 +22,13 @@
          http://localhost URLs (and P defaults to blocking cleartext traffic).
          -->
     <application android:label="AndroidX Webkit Unittests"
-                 android:hardwareAccelerated="true"
-                 android:usesCleartextTraffic="true">
+        android:hardwareAccelerated="true"
+        android:usesCleartextTraffic="true">
 
         <activity android:name="androidx.webkit.WebViewTestActivity"/>
         <activity android:name="androidx.webkit.WebViewDarkThemeTestActivity"
-             android:theme="@style/Theme.AppCompat"/>
+            android:theme="@style/Theme.AppCompat"/>
         <activity android:name="androidx.webkit.WebViewLightThemeTestActivity"
-             android:theme="@style/Theme.AppCompat.Light"/>
+            android:theme="@style/Theme.AppCompat.Light"/>
     </application>
-</manifest>
+</manifest>
\ No newline at end of file
diff --git a/webkit/webkit/src/androidTest/assets/star.svg b/webkit/integration-tests/instrumentation/src/androidTest/assets/star.svg
similarity index 100%
rename from webkit/webkit/src/androidTest/assets/star.svg
rename to webkit/integration-tests/instrumentation/src/androidTest/assets/star.svg
diff --git a/webkit/webkit/src/androidTest/assets/star.svgz b/webkit/integration-tests/instrumentation/src/androidTest/assets/star.svgz
similarity index 100%
rename from webkit/webkit/src/androidTest/assets/star.svgz
rename to webkit/integration-tests/instrumentation/src/androidTest/assets/star.svgz
Binary files differ
diff --git a/webkit/webkit/src/androidTest/assets/text/test.txt b/webkit/integration-tests/instrumentation/src/androidTest/assets/text/test.txt
similarity index 100%
rename from webkit/webkit/src/androidTest/assets/text/test.txt
rename to webkit/integration-tests/instrumentation/src/androidTest/assets/text/test.txt
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/BoundaryInterfaceTest.java b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/BoundaryInterfaceTest.java
similarity index 100%
rename from webkit/webkit/src/androidTest/java/androidx/webkit/BoundaryInterfaceTest.java
rename to webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/BoundaryInterfaceTest.java
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/CookieManagerCompatTest.java b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/CookieManagerCompatTest.java
similarity index 100%
rename from webkit/webkit/src/androidTest/java/androidx/webkit/CookieManagerCompatTest.java
rename to webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/CookieManagerCompatTest.java
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/IncompatibilityTest.java b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/IncompatibilityTest.java
similarity index 100%
rename from webkit/webkit/src/androidTest/java/androidx/webkit/IncompatibilityTest.java
rename to webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/IncompatibilityTest.java
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/PollingCheck.java b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/PollingCheck.java
similarity index 94%
rename from webkit/webkit/src/androidTest/java/androidx/webkit/PollingCheck.java
rename to webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/PollingCheck.java
index f7098fb..9cf05c9 100644
--- a/webkit/webkit/src/androidTest/java/androidx/webkit/PollingCheck.java
+++ b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/PollingCheck.java
@@ -16,6 +16,8 @@
 
 package androidx.webkit;
 
+import android.annotation.SuppressLint;
+
 import androidx.annotation.NonNull;
 
 import org.junit.Assert;
@@ -40,6 +42,7 @@
 
     protected abstract boolean check();
 
+    @SuppressLint("BanThreadSleep")
     public void run() {
         if (check()) {
             return;
@@ -63,6 +66,7 @@
         Assert.fail("unexpected timeout");
     }
 
+    @SuppressLint("BanThreadSleep")
     public static void check(@NonNull CharSequence message, long timeout,
             @NonNull Callable<Boolean> condition)
             throws Exception {
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/PostMessageTest.java b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/PostMessageTest.java
similarity index 100%
rename from webkit/webkit/src/androidTest/java/androidx/webkit/PostMessageTest.java
rename to webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/PostMessageTest.java
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/ProxyControllerTest.java b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/ProxyControllerTest.java
similarity index 100%
rename from webkit/webkit/src/androidTest/java/androidx/webkit/ProxyControllerTest.java
rename to webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/ProxyControllerTest.java
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/ServiceWorkerClientCompatTest.java b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/ServiceWorkerClientCompatTest.java
similarity index 100%
rename from webkit/webkit/src/androidTest/java/androidx/webkit/ServiceWorkerClientCompatTest.java
rename to webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/ServiceWorkerClientCompatTest.java
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/ServiceWorkerWebSettingsCompatTest.java b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/ServiceWorkerWebSettingsCompatTest.java
similarity index 97%
rename from webkit/webkit/src/androidTest/java/androidx/webkit/ServiceWorkerWebSettingsCompatTest.java
rename to webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/ServiceWorkerWebSettingsCompatTest.java
index e2c7976..e7f9feb 100644
--- a/webkit/webkit/src/androidTest/java/androidx/webkit/ServiceWorkerWebSettingsCompatTest.java
+++ b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/ServiceWorkerWebSettingsCompatTest.java
@@ -18,6 +18,7 @@
 
 import static androidx.webkit.WebViewFeature.isFeatureSupported;
 
+import android.annotation.SuppressLint;
 import android.os.Build;
 import android.os.SystemClock;
 import android.webkit.WebSettings;
@@ -48,6 +49,7 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP)
 public class ServiceWorkerWebSettingsCompatTest {
 
+    public static final String TEST_APK_NAME = "androidx.webkit.instrumentation.test";
     private ServiceWorkerWebSettingsCompat mSettings;
 
     private static final long POLL_TIMEOUT_DURATION_MS = 5000;
@@ -263,7 +265,7 @@
                 request = server.takeRequest(5, TimeUnit.SECONDS);
             } while (request != null && !TEXT_CONTENT_PATH.equals(request.getPath()));
             Assert.assertNotNull("Test timed out while waiting for expected request", request);
-            Assert.assertEquals("androidx.webkit.test", request.getHeader("X-Requested-With"));
+            Assert.assertEquals(TEST_APK_NAME, request.getHeader("X-Requested-With"));
             webViewOnUiThread.setCleanupTask(() -> waitForServiceWorkerDone(webViewOnUiThread));
         }
     }
@@ -311,6 +313,7 @@
      * for other tests.
      * See b/230078824.
      */
+    @SuppressLint("BanThreadSleep")
     private void waitForServiceWorkerDone(final WebViewOnUiThread webViewOnUiThread) {
         long timeout = SystemClock.uptimeMillis() + POLL_TIMEOUT_DURATION_MS;
         while (SystemClock.uptimeMillis() < timeout
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/TracingControllerTest.java b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/TracingControllerTest.java
similarity index 100%
rename from webkit/webkit/src/androidTest/java/androidx/webkit/TracingControllerTest.java
rename to webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/TracingControllerTest.java
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/WebMessageCompatUnitTest.java b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebMessageCompatUnitTest.java
similarity index 100%
rename from webkit/webkit/src/androidTest/java/androidx/webkit/WebMessageCompatUnitTest.java
rename to webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebMessageCompatUnitTest.java
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/WebSettingsCompatDarkModeTestBase.java b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebSettingsCompatDarkModeTestBase.java
similarity index 94%
rename from webkit/webkit/src/androidTest/java/androidx/webkit/WebSettingsCompatDarkModeTestBase.java
rename to webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebSettingsCompatDarkModeTestBase.java
index be61919..1b50075 100644
--- a/webkit/webkit/src/androidTest/java/androidx/webkit/WebSettingsCompatDarkModeTestBase.java
+++ b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebSettingsCompatDarkModeTestBase.java
@@ -18,7 +18,6 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
-import android.app.Activity;
 import android.graphics.Bitmap;
 import android.graphics.Color;
 import android.os.Build;
@@ -44,7 +43,7 @@
  * Base class for dark mode related test.
  */
 @RequiresApi(Build.VERSION_CODES.KITKAT)
-public class WebSettingsCompatDarkModeTestBase<T extends Activity> {
+public class WebSettingsCompatDarkModeTestBase<T extends WebViewTestActivity> {
 
     // The size of WebViews to use in the app.
     private static final int WEBVIEW_SIZE = 128;
@@ -76,17 +75,18 @@
     // representation.
     @SuppressWarnings("deprecation")
     @Rule
-    public final TargetSdkActivityTestRule<T> mActivityRule;
+    public final androidx.test.rule.ActivityTestRule<T> mActivityRule;
 
-    public WebSettingsCompatDarkModeTestBase(@NonNull Class<T> activityClass, int targetSdk) {
-        mActivityRule = new TargetSdkActivityTestRule<T>(activityClass,
-                targetSdk);
+    /** @noinspection deprecation*/
+    @SuppressWarnings("deprecation")
+    public WebSettingsCompatDarkModeTestBase(@NonNull Class<T> activityClass) {
+        mActivityRule = new androidx.test.rule.ActivityTestRule<>(activityClass);
     }
 
     @Before
     public void setUp() {
         mWebViewOnUiThread = new WebViewOnUiThread(
-                ((WebViewTestActivity) mActivityRule.getActivity()).getWebView());
+                mActivityRule.getActivity().getWebView());
         mWebViewOnUiThread.getSettings().setJavaScriptEnabled(true);
     }
 
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/WebSettingsCompatTest.java b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebSettingsCompatTest.java
similarity index 97%
rename from webkit/webkit/src/androidTest/java/androidx/webkit/WebSettingsCompatTest.java
rename to webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebSettingsCompatTest.java
index b283da8..f0b21a0 100644
--- a/webkit/webkit/src/androidTest/java/androidx/webkit/WebSettingsCompatTest.java
+++ b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebSettingsCompatTest.java
@@ -46,6 +46,7 @@
 @RunWith(AndroidJUnit4.class)
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP)
 public class WebSettingsCompatTest {
+    public static final String TEST_APK_NAME = "androidx.webkit.instrumentation.test";
     WebViewOnUiThread mWebViewOnUiThread;
 
     @Before
@@ -180,7 +181,7 @@
             mWebViewOnUiThread.loadUrl(requestUrl);
             RecordedRequest recordedRequest = mockWebServer.takeRequest();
             String headerValue = recordedRequest.getHeader("X-Requested-With");
-            Assert.assertEquals("androidx.webkit.test", headerValue);
+            Assert.assertEquals(TEST_APK_NAME, headerValue);
         }
     }
 }
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewApkTest.java b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebViewApkTest.java
similarity index 100%
rename from webkit/webkit/src/androidTest/java/androidx/webkit/WebViewApkTest.java
rename to webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebViewApkTest.java
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewAssetLoaderTest.java b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebViewAssetLoaderTest.java
similarity index 100%
rename from webkit/webkit/src/androidTest/java/androidx/webkit/WebViewAssetLoaderTest.java
rename to webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebViewAssetLoaderTest.java
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewClientCompatTest.java b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebViewClientCompatTest.java
similarity index 100%
rename from webkit/webkit/src/androidTest/java/androidx/webkit/WebViewClientCompatTest.java
rename to webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebViewClientCompatTest.java
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewCompatTest.java b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebViewCompatTest.java
similarity index 100%
rename from webkit/webkit/src/androidTest/java/androidx/webkit/WebViewCompatTest.java
rename to webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebViewCompatTest.java
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewDarkThemeTestActivity.java b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebViewDarkThemeTestActivity.java
similarity index 100%
rename from webkit/webkit/src/androidTest/java/androidx/webkit/WebViewDarkThemeTestActivity.java
rename to webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebViewDarkThemeTestActivity.java
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewDocumentStartJavaScriptTest.java b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebViewDocumentStartJavaScriptTest.java
similarity index 100%
rename from webkit/webkit/src/androidTest/java/androidx/webkit/WebViewDocumentStartJavaScriptTest.java
rename to webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebViewDocumentStartJavaScriptTest.java
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewLightThemeTestActivity.java b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebViewLightThemeTestActivity.java
similarity index 100%
rename from webkit/webkit/src/androidTest/java/androidx/webkit/WebViewLightThemeTestActivity.java
rename to webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebViewLightThemeTestActivity.java
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewOnUiThread.java b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebViewOnUiThread.java
similarity index 98%
rename from webkit/webkit/src/androidTest/java/androidx/webkit/WebViewOnUiThread.java
rename to webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebViewOnUiThread.java
index 69f6cd5..d22e732 100644
--- a/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewOnUiThread.java
+++ b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebViewOnUiThread.java
@@ -271,6 +271,9 @@
                 () -> WebViewCompat.removeWebMessageListener(mWebView, jsObjectName));
     }
 
+    /**
+     * @deprecated unreleased API to be removed
+     */
     @NonNull
     @Deprecated
     @SuppressWarnings("deprecation") // To be removed in 1.9.0
@@ -290,7 +293,7 @@
      * Test fails if the load timeout elapses.
      * @param url The URL to load.
      */
-    void loadUrlAndWaitForCompletion(final String url) {
+    public void loadUrlAndWaitForCompletion(@NonNull final String url) {
         callAndWait(() -> mWebView.loadUrl(url));
     }
 
@@ -393,7 +396,8 @@
         return WebkitUtils.onMainThreadSync(() -> WebViewCompat.getWebChromeClient(webView));
     }
 
-    WebView getWebViewOnCurrentThread() {
+    @NonNull
+    public WebView getWebViewOnCurrentThread() {
         return mWebView;
     }
 
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewRenderProcessClientTest.java b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebViewRenderProcessClientTest.java
similarity index 100%
rename from webkit/webkit/src/androidTest/java/androidx/webkit/WebViewRenderProcessClientTest.java
rename to webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebViewRenderProcessClientTest.java
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewRenderProcessTest.java b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebViewRenderProcessTest.java
similarity index 100%
rename from webkit/webkit/src/androidTest/java/androidx/webkit/WebViewRenderProcessTest.java
rename to webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebViewRenderProcessTest.java
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewTestActivity.java b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebViewTestActivity.java
similarity index 100%
rename from webkit/webkit/src/androidTest/java/androidx/webkit/WebViewTestActivity.java
rename to webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebViewTestActivity.java
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewVersion.java b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebViewVersion.java
similarity index 100%
rename from webkit/webkit/src/androidTest/java/androidx/webkit/WebViewVersion.java
rename to webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebViewVersion.java
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewWebMessageCompatTest.java b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebViewWebMessageCompatTest.java
similarity index 100%
rename from webkit/webkit/src/androidTest/java/androidx/webkit/WebViewWebMessageCompatTest.java
rename to webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebViewWebMessageCompatTest.java
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewWebMessageListenerTest.java b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebViewWebMessageListenerTest.java
similarity index 100%
rename from webkit/webkit/src/androidTest/java/androidx/webkit/WebViewWebMessageListenerTest.java
rename to webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebViewWebMessageListenerTest.java
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/WebkitUtils.java b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebkitUtils.java
similarity index 100%
rename from webkit/webkit/src/androidTest/java/androidx/webkit/WebkitUtils.java
rename to webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebkitUtils.java
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/internal/AssetHelperTest.java b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/internal/AssetHelperTest.java
similarity index 100%
rename from webkit/webkit/src/androidTest/java/androidx/webkit/internal/AssetHelperTest.java
rename to webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/internal/AssetHelperTest.java
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/internal/WebViewFeatureInternalTest.java b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/internal/WebViewFeatureInternalTest.java
similarity index 97%
rename from webkit/webkit/src/androidTest/java/androidx/webkit/internal/WebViewFeatureInternalTest.java
rename to webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/internal/WebViewFeatureInternalTest.java
index 3a1ba43..a406145 100644
--- a/webkit/webkit/src/androidTest/java/androidx/webkit/internal/WebViewFeatureInternalTest.java
+++ b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/internal/WebViewFeatureInternalTest.java
@@ -22,8 +22,6 @@
 import androidx.annotation.NonNull;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.SmallTest;
-import androidx.webkit.internal.ConditionallySupportedFeature;
-import androidx.webkit.internal.WebViewFeatureInternal;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/webkit/webkit/src/androidTest/res/raw/test.txt b/webkit/integration-tests/instrumentation/src/androidTest/res/raw/test.txt
similarity index 100%
rename from webkit/webkit/src/androidTest/res/raw/test.txt
rename to webkit/integration-tests/instrumentation/src/androidTest/res/raw/test.txt
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/WebSettingsCompatForceDarkTest.java b/webkit/integration-tests/instrumentation/src/androidTestTargetSdk32/java/androidx/webkit/WebSettingsCompatForceDarkTest.java
similarity index 74%
rename from webkit/webkit/src/androidTest/java/androidx/webkit/WebSettingsCompatForceDarkTest.java
rename to webkit/integration-tests/instrumentation/src/androidTestTargetSdk32/java/androidx/webkit/WebSettingsCompatForceDarkTest.java
index e78dafc..f7085fe 100644
--- a/webkit/webkit/src/androidTest/java/androidx/webkit/WebSettingsCompatForceDarkTest.java
+++ b/webkit/integration-tests/instrumentation/src/androidTestTargetSdk32/java/androidx/webkit/WebSettingsCompatForceDarkTest.java
@@ -28,20 +28,21 @@
 import androidx.test.filters.MediumTest;
 import androidx.test.filters.SdkSuppress;
 
-import org.junit.Ignore;
+import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
 
+/**
+ * Instrumentation tests for pre-33 dark mode behavior.
+ */
 @MediumTest
 @RunWith(AndroidJUnit4.class)
 @SdkSuppress(minSdkVersion = VERSION_CODES.LOLLIPOP)
 public class WebSettingsCompatForceDarkTest extends
         WebSettingsCompatDarkModeTestBase<WebViewLightThemeTestActivity> {
     public WebSettingsCompatForceDarkTest() {
-        // Set targetSdkVersion to the max version the force dark API works on.
-        // TODO(http://b/214741472): Use VERSION_CODES.S_V2 once Android X supports it.
-        super(WebViewLightThemeTestActivity.class, VERSION_CODES.S);
+        super(WebViewLightThemeTestActivity.class);
     }
 
     /**
@@ -54,7 +55,7 @@
     public void testForceDark_default() throws Throwable {
         WebkitUtils.checkFeature(WebViewFeature.FORCE_DARK);
 
-        assertEquals("The default force dark state should be AUTO",
+        Assert.assertEquals("The default force dark state should be AUTO",
                 WebSettingsCompat.FORCE_DARK_AUTO,
                 WebSettingsCompat.getForceDark(getSettingsOnUiThread()));
     }
@@ -65,7 +66,6 @@
      * should be reflected in that test as necessary. See http://go/modifying-webview-cts.
      */
     @SuppressWarnings("deprecation")
-    @Ignore("Disabled due to b/230480958")
     @Test
     public void testForceDark_rendersDark() throws Throwable {
         WebkitUtils.checkFeature(WebViewFeature.FORCE_DARK);
@@ -100,7 +100,6 @@
      * i.e. web contents are always darkened by a user agent.
      */
     @SuppressWarnings("deprecation")
-    @Ignore("Disabled due to b/240432254")
     @Test
     public void testForceDark_userAgentDarkeningOnly() {
         WebkitUtils.checkFeature(WebViewFeature.FORCE_DARK);
@@ -133,8 +132,6 @@
      * i.e. web contents are darkened only by web theme.
      */
     @SuppressWarnings("deprecation")
-    @Ignore("Disabled due to b/260586583")
-    @SdkSuppress(maxSdkVersion = 32) // b/254572377
     @Test
     public void testForceDark_webThemeDarkeningOnly() {
         WebkitUtils.checkFeature(WebViewFeature.FORCE_DARK);
@@ -161,39 +158,4 @@
         assertThat("Bitmap colour should be green", getWebPageColor(), isGreen());
         assertTrue(prefersDarkTheme());
     }
-
-    /**
-     * Test to exercise PREFER_WEB_THEME_OVER_USER_AGENT_DARKENING option,
-     * i.e. web contents are darkened by a user agent if there is no dark web theme.
-     */
-    @SuppressWarnings("deprecation")
-    @Test
-    @Ignore("Disabled due to b/202546063")
-    public void testForceDark_preferWebThemeOverUADarkening() {
-        WebkitUtils.checkFeature(WebViewFeature.FORCE_DARK);
-        WebkitUtils.checkFeature(WebViewFeature.FORCE_DARK_STRATEGY);
-        WebkitUtils.checkFeature(WebViewFeature.OFF_SCREEN_PRERASTER);
-        setWebViewSize();
-
-        getWebViewOnUiThread().loadUrlAndWaitForCompletion("about:blank");
-
-        WebSettingsCompat.setForceDark(
-                getSettingsOnUiThread(), WebSettingsCompat.FORCE_DARK_ON);
-        WebSettingsCompat.setForceDarkStrategy(getSettingsOnUiThread(),
-                WebSettingsCompat.DARK_STRATEGY_PREFER_WEB_THEME_OVER_USER_AGENT_DARKENING);
-
-        getWebViewOnUiThread().loadUrlAndWaitForCompletion("about:blank");
-        // Loading a page without dark-theme support should result in a dark background as
-        // web page is darken by a user agent
-        assertTrue("Bitmap colour should be dark",
-                ColorUtils.calculateLuminance(getWebPageColor()) < 0.5f);
-        assertFalse(prefersDarkTheme());
-
-        // Loading a page with dark-theme support should result in a green background (as
-        // specified in media-query)
-        getWebViewOnUiThread().loadDataAndWaitForCompletion(mDarkThemeSupport, "text/html",
-                "base64");
-        assertThat("Bitmap colour should be green", getWebPageColor(), isGreen());
-        assertTrue(prefersDarkTheme());
-    }
 }
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/WebSettingsCompatDarkThemeTest.java b/webkit/integration-tests/instrumentation/src/androidTestTargetSdkLatest/java/androidx/webkit/WebSettingsCompatDarkThemeTest.java
similarity index 91%
rename from webkit/webkit/src/androidTest/java/androidx/webkit/WebSettingsCompatDarkThemeTest.java
rename to webkit/integration-tests/instrumentation/src/androidTestTargetSdkLatest/java/androidx/webkit/WebSettingsCompatDarkThemeTest.java
index 48840fe..2e7f311 100644
--- a/webkit/webkit/src/androidTest/java/androidx/webkit/WebSettingsCompatDarkThemeTest.java
+++ b/webkit/integration-tests/instrumentation/src/androidTestTargetSdkLatest/java/androidx/webkit/WebSettingsCompatDarkThemeTest.java
@@ -30,18 +30,16 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-
+/**
+ * Instrumentation tests for dark mode on targetSdk >= 33.
+ */
 @MediumTest
 @RunWith(AndroidJUnit4.class)
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP)
 public class WebSettingsCompatDarkThemeTest extends
         WebSettingsCompatDarkModeTestBase<WebViewDarkThemeTestActivity> {
     public WebSettingsCompatDarkThemeTest() {
-        // targetSdkVersion to T, it is min version the algorithmic darkening works.
-        // VERSION_CODES.TIRAMISU can't be compiled, follows the pattern in
-        // core/core/src/main/java/androidx/core/os/BuildCompat.java,
-        // uses 33 instead of VERSION_CODES.TIRAMISU
-        super(WebViewDarkThemeTestActivity.class, 33);
+        super(WebViewDarkThemeTestActivity.class);
     }
 
     /**
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/WebSettingsCompatLightThemeTest.java b/webkit/integration-tests/instrumentation/src/androidTestTargetSdkLatest/java/androidx/webkit/WebSettingsCompatLightThemeTest.java
similarity index 95%
rename from webkit/webkit/src/androidTest/java/androidx/webkit/WebSettingsCompatLightThemeTest.java
rename to webkit/integration-tests/instrumentation/src/androidTestTargetSdkLatest/java/androidx/webkit/WebSettingsCompatLightThemeTest.java
index d16d15c..68ae3ff 100644
--- a/webkit/webkit/src/androidTest/java/androidx/webkit/WebSettingsCompatLightThemeTest.java
+++ b/webkit/integration-tests/instrumentation/src/androidTestTargetSdkLatest/java/androidx/webkit/WebSettingsCompatLightThemeTest.java
@@ -29,16 +29,16 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-
+/**
+ * Instrumentation tests for light mode on targetSdk >= 33.
+ */
 @MediumTest
 @RunWith(AndroidJUnit4.class)
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP)
 public class WebSettingsCompatLightThemeTest extends
         WebSettingsCompatDarkModeTestBase<WebViewLightThemeTestActivity> {
     public WebSettingsCompatLightThemeTest() {
-        // targetSdkVersion to T, it is min version the algorithmic darkening works.
-        // TODO(http://b/214741472): Use VERSION_CODES.TIRAMISU once available.
-        super(WebViewLightThemeTestActivity.class, 33);
+        super(WebViewLightThemeTestActivity.class);
     }
 
     /**
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/TargetSdkActivityTestRule.java b/webkit/webkit/src/androidTest/java/androidx/webkit/TargetSdkActivityTestRule.java
deleted file mode 100644
index 2059802..0000000
--- a/webkit/webkit/src/androidTest/java/androidx/webkit/TargetSdkActivityTestRule.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.webkit;
-
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-
-import androidx.annotation.NonNull;
-import androidx.test.platform.app.InstrumentationRegistry;
-
-/**
- * This class is used to override the default targetSdkVersion value in ApplicationInfo.
- */
-@SuppressWarnings("deprecation")
-public class TargetSdkActivityTestRule<T extends Activity> extends
-        androidx.test.rule.ActivityTestRule<T> {
-    private int mTargetSdk;
-    private Context mAppContext;
-
-    public TargetSdkActivityTestRule(@NonNull Class<T> activityClass, int targetSdk) {
-        super(activityClass);
-        mTargetSdk = targetSdk;
-    }
-
-    @Override
-    protected void beforeActivityLaunched() {
-        try {
-            runOnUiThread(() -> {
-                        mAppContext = spy(
-                                InstrumentationRegistry.getInstrumentation().getTargetContext()
-                                        .getApplicationContext());
-                        ApplicationInfo appInfo = mAppContext.getApplicationInfo();
-                        appInfo.targetSdkVersion = mTargetSdk;
-                        when(mAppContext.getApplicationInfo()).thenReturn(appInfo);
-                    }
-            );
-        } catch (Throwable throwable) {
-            throw new RuntimeException(throwable);
-        }
-    }
-}