Loading core/java/android/webkit/WebViewFactoryProvider.java +29 −4 Original line number Diff line number Diff line Loading @@ -36,17 +36,32 @@ import java.util.List; */ @SystemApi public interface WebViewFactoryProvider { /** @hide */ /** * Used as the requirement when Flags.useBEntryPoint() is false. * @hide */ int MINIMUM_SUPPORTED_TARGET_SDK = Build.VERSION_CODES.TIRAMISU; /** * Used as the requirement when Flags.useBEntryPoint() is true. * TODO: set to the actual minimum required version code - this is just the * version shipped in V. * @hide */ long MINIMUM_SUPPORTED_VERSION_CODE = 661308800L; /** * Returns whether the WebView implementation represented by {@code packageInfo} * is compatible with this version of Android. * @hide */ static boolean isCompatibleImplementationPackage(@NonNull PackageInfo packageInfo) { if (Flags.useBEntryPoint()) { return packageInfo.versionCode >= MINIMUM_SUPPORTED_VERSION_CODE; } else { return packageInfo.applicationInfo.targetSdkVersion >= MINIMUM_SUPPORTED_TARGET_SDK; } } /** * Returns a string describing the minimum requirement for a WebView implementation Loading @@ -54,7 +69,13 @@ public interface WebViewFactoryProvider { * @hide */ static @NonNull String describeCompatibleImplementationPackage() { return TextUtils.formatSimple("Minimum targetSdkVersion: %d", MINIMUM_SUPPORTED_TARGET_SDK); if (Flags.useBEntryPoint()) { return TextUtils.formatSimple("Minimum versionCode for OS support: %d", MINIMUM_SUPPORTED_VERSION_CODE); } else { return TextUtils.formatSimple("Minimum targetSdkVersion: %d", MINIMUM_SUPPORTED_TARGET_SDK); } } /** Loading @@ -63,8 +84,12 @@ public interface WebViewFactoryProvider { * @hide */ static @NonNull String getWebViewFactoryClassName() { if (Flags.useBEntryPoint()) { return "com.android.webview.chromium.WebViewChromiumFactoryProviderForB"; } else { return "com.android.webview.chromium.WebViewChromiumFactoryProviderForT"; } } /** * This Interface provides glue for implementing the backend of WebView static methods which Loading core/java/android/webkit/flags.aconfig +8 −0 Original line number Diff line number Diff line Loading @@ -42,3 +42,11 @@ flag { description: "New APIs required by File System Access" bug: "40101963" } flag { name: "use_b_entry_point" namespace: "webview" description: "Use B-specific entry point to WebView APK" bug: "373617389" is_fixed_read_only: true } services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java +52 −0 Original line number Diff line number Diff line Loading @@ -25,9 +25,12 @@ import android.content.pm.PackageInfo; import android.content.pm.Signature; import android.os.Build; import android.os.Bundle; import android.platform.test.annotations.RequiresFlagsDisabled; import android.platform.test.annotations.RequiresFlagsEnabled; import android.platform.test.flag.junit.CheckFlagsRule; import android.platform.test.flag.junit.DeviceFlagsValueProvider; import android.util.Base64; import android.webkit.Flags; import android.webkit.WebViewFactory; import android.webkit.WebViewProviderInfo; import android.webkit.WebViewProviderResponse; Loading Loading @@ -1239,6 +1242,7 @@ public class WebViewUpdateServiceTest { * that packages targeting an older version are not valid. */ @Test @RequiresFlagsDisabled(Flags.FLAG_USE_B_ENTRY_POINT) public void testTargetSdkVersionValidity() { PackageInfo newSdkPackage = createPackageInfo("newTargetSdkPackage", true /* enabled */, true /* valid */, true /* installed */); Loading Loading @@ -1280,6 +1284,54 @@ public class WebViewUpdateServiceTest { 1 /* first preparation phase */); } /** * Ensure that packages with a versionCode new enough for the current platform are valid, and * that older packages are not valid. */ @Test @RequiresFlagsEnabled(Flags.FLAG_USE_B_ENTRY_POINT) public void testVersionCodeOSCompatValidity() { PackageInfo newVersionPackage = createPackageInfo("newVersionPackage", true /* enabled */, true /* valid */, true /* installed */); newVersionPackage.setLongVersionCode(200L); PackageInfo currentVersionPackage = createPackageInfo("currentVersionPackage", true /* enabled */, true /* valid */, true /* installed */); currentVersionPackage.setLongVersionCode(100L); PackageInfo oldVersionPackage = createPackageInfo("oldVersionPackage", true /* enabled */, true /* valid */, true /* installed */); oldVersionPackage.setLongVersionCode(50L); WebViewProviderInfo newVersionProviderInfo = new WebViewProviderInfo(newVersionPackage.packageName, "", true, false, null); WebViewProviderInfo currentVersionProviderInfo = new WebViewProviderInfo(currentVersionPackage.packageName, "", true, false, null); WebViewProviderInfo[] packages = new WebViewProviderInfo[] { currentVersionProviderInfo, new WebViewProviderInfo(oldVersionPackage.packageName, "", true, false, null), newVersionProviderInfo }; setupWithPackages(packages); // Mock the compatibility predicate as requiring 100 as versionCode. mTestSystemImpl.setCompatibilityPredicate( pi -> pi.getLongVersionCode() >= 100L); // Start with the setting pointing to the invalid package mTestSystemImpl.updateUserSetting(oldVersionPackage.packageName); mTestSystemImpl.setPackageInfo(newVersionPackage); mTestSystemImpl.setPackageInfo(currentVersionPackage); mTestSystemImpl.setPackageInfo(oldVersionPackage); assertArrayEquals( new WebViewProviderInfo[] { currentVersionProviderInfo, newVersionProviderInfo }, mWebViewUpdateServiceImpl.getValidWebViewPackages()); runWebViewBootPreparationOnMainSync(); checkPreparationPhasesForPackage(currentVersionPackage.packageName, 1 /* first preparation phase */); } @Test public void testDefaultWebViewPackageIsTheFirstAvailableByDefault() { String nonDefaultPackage = "nonDefaultPackage"; Loading Loading
core/java/android/webkit/WebViewFactoryProvider.java +29 −4 Original line number Diff line number Diff line Loading @@ -36,17 +36,32 @@ import java.util.List; */ @SystemApi public interface WebViewFactoryProvider { /** @hide */ /** * Used as the requirement when Flags.useBEntryPoint() is false. * @hide */ int MINIMUM_SUPPORTED_TARGET_SDK = Build.VERSION_CODES.TIRAMISU; /** * Used as the requirement when Flags.useBEntryPoint() is true. * TODO: set to the actual minimum required version code - this is just the * version shipped in V. * @hide */ long MINIMUM_SUPPORTED_VERSION_CODE = 661308800L; /** * Returns whether the WebView implementation represented by {@code packageInfo} * is compatible with this version of Android. * @hide */ static boolean isCompatibleImplementationPackage(@NonNull PackageInfo packageInfo) { if (Flags.useBEntryPoint()) { return packageInfo.versionCode >= MINIMUM_SUPPORTED_VERSION_CODE; } else { return packageInfo.applicationInfo.targetSdkVersion >= MINIMUM_SUPPORTED_TARGET_SDK; } } /** * Returns a string describing the minimum requirement for a WebView implementation Loading @@ -54,7 +69,13 @@ public interface WebViewFactoryProvider { * @hide */ static @NonNull String describeCompatibleImplementationPackage() { return TextUtils.formatSimple("Minimum targetSdkVersion: %d", MINIMUM_SUPPORTED_TARGET_SDK); if (Flags.useBEntryPoint()) { return TextUtils.formatSimple("Minimum versionCode for OS support: %d", MINIMUM_SUPPORTED_VERSION_CODE); } else { return TextUtils.formatSimple("Minimum targetSdkVersion: %d", MINIMUM_SUPPORTED_TARGET_SDK); } } /** Loading @@ -63,8 +84,12 @@ public interface WebViewFactoryProvider { * @hide */ static @NonNull String getWebViewFactoryClassName() { if (Flags.useBEntryPoint()) { return "com.android.webview.chromium.WebViewChromiumFactoryProviderForB"; } else { return "com.android.webview.chromium.WebViewChromiumFactoryProviderForT"; } } /** * This Interface provides glue for implementing the backend of WebView static methods which Loading
core/java/android/webkit/flags.aconfig +8 −0 Original line number Diff line number Diff line Loading @@ -42,3 +42,11 @@ flag { description: "New APIs required by File System Access" bug: "40101963" } flag { name: "use_b_entry_point" namespace: "webview" description: "Use B-specific entry point to WebView APK" bug: "373617389" is_fixed_read_only: true }
services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java +52 −0 Original line number Diff line number Diff line Loading @@ -25,9 +25,12 @@ import android.content.pm.PackageInfo; import android.content.pm.Signature; import android.os.Build; import android.os.Bundle; import android.platform.test.annotations.RequiresFlagsDisabled; import android.platform.test.annotations.RequiresFlagsEnabled; import android.platform.test.flag.junit.CheckFlagsRule; import android.platform.test.flag.junit.DeviceFlagsValueProvider; import android.util.Base64; import android.webkit.Flags; import android.webkit.WebViewFactory; import android.webkit.WebViewProviderInfo; import android.webkit.WebViewProviderResponse; Loading Loading @@ -1239,6 +1242,7 @@ public class WebViewUpdateServiceTest { * that packages targeting an older version are not valid. */ @Test @RequiresFlagsDisabled(Flags.FLAG_USE_B_ENTRY_POINT) public void testTargetSdkVersionValidity() { PackageInfo newSdkPackage = createPackageInfo("newTargetSdkPackage", true /* enabled */, true /* valid */, true /* installed */); Loading Loading @@ -1280,6 +1284,54 @@ public class WebViewUpdateServiceTest { 1 /* first preparation phase */); } /** * Ensure that packages with a versionCode new enough for the current platform are valid, and * that older packages are not valid. */ @Test @RequiresFlagsEnabled(Flags.FLAG_USE_B_ENTRY_POINT) public void testVersionCodeOSCompatValidity() { PackageInfo newVersionPackage = createPackageInfo("newVersionPackage", true /* enabled */, true /* valid */, true /* installed */); newVersionPackage.setLongVersionCode(200L); PackageInfo currentVersionPackage = createPackageInfo("currentVersionPackage", true /* enabled */, true /* valid */, true /* installed */); currentVersionPackage.setLongVersionCode(100L); PackageInfo oldVersionPackage = createPackageInfo("oldVersionPackage", true /* enabled */, true /* valid */, true /* installed */); oldVersionPackage.setLongVersionCode(50L); WebViewProviderInfo newVersionProviderInfo = new WebViewProviderInfo(newVersionPackage.packageName, "", true, false, null); WebViewProviderInfo currentVersionProviderInfo = new WebViewProviderInfo(currentVersionPackage.packageName, "", true, false, null); WebViewProviderInfo[] packages = new WebViewProviderInfo[] { currentVersionProviderInfo, new WebViewProviderInfo(oldVersionPackage.packageName, "", true, false, null), newVersionProviderInfo }; setupWithPackages(packages); // Mock the compatibility predicate as requiring 100 as versionCode. mTestSystemImpl.setCompatibilityPredicate( pi -> pi.getLongVersionCode() >= 100L); // Start with the setting pointing to the invalid package mTestSystemImpl.updateUserSetting(oldVersionPackage.packageName); mTestSystemImpl.setPackageInfo(newVersionPackage); mTestSystemImpl.setPackageInfo(currentVersionPackage); mTestSystemImpl.setPackageInfo(oldVersionPackage); assertArrayEquals( new WebViewProviderInfo[] { currentVersionProviderInfo, newVersionProviderInfo }, mWebViewUpdateServiceImpl.getValidWebViewPackages()); runWebViewBootPreparationOnMainSync(); checkPreparationPhasesForPackage(currentVersionPackage.packageName, 1 /* first preparation phase */); } @Test public void testDefaultWebViewPackageIsTheFirstAvailableByDefault() { String nonDefaultPackage = "nonDefaultPackage"; Loading