Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 82cfb600 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "webview: implement new minimum version check." into main

parents ccd43f4d f566a8b9
Loading
Loading
Loading
Loading
+29 −4
Original line number Diff line number Diff line
@@ -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
@@ -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);
        }
    }

    /**
@@ -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
+8 −0
Original line number Diff line number Diff line
@@ -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
}
+52 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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 */);
@@ -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";