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

Commit 7d93b913 authored by Ziad Youssef's avatar Ziad Youssef
Browse files

Add a flag for WebViewUpdateServiceImpl changes

This adds a class similar to WebViewUpdateServiceImpl behind a flag.
The intended modification will be mainly for the new class.

This doesn't introduce any functional changes.

Test: manually overriding flags using ag/25382508

Bug: 308907090

Change-Id: Ia522be467b435e2e8b8ef76ddeb16b4e7dc821c5
parent b7036071
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -63,6 +63,7 @@ aconfig_srcjars = [
    ":android.hardware.usb.flags-aconfig-java{.generated_srcjars}",
    ":android.tracing.flags-aconfig-java{.generated_srcjars}",
    ":android.appwidget.flags-aconfig-java{.generated_srcjars}",
    ":android.webkit.flags-aconfig-java{.generated_srcjars}",
]

filegroup {
@@ -748,3 +749,19 @@ java_aconfig_library {
    aconfig_declarations: "android.appwidget.flags-aconfig",
    defaults: ["framework-minus-apex-aconfig-java-defaults"],
}

// WebView
aconfig_declarations {
    name: "android.webkit.flags-aconfig",
    package: "android.webkit",
    srcs: [
        "core/java/android/webkit/*.aconfig",
        "services/core/java/com/android/server/webkit/*.aconfig",
    ],
}

java_aconfig_library {
    name: "android.webkit.flags-aconfig-java",
    aconfig_declarations: "android.webkit.flags-aconfig",
    defaults: ["framework-minus-apex-aconfig-java-defaults"],
}
+8 −2
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.server.webkit;

import static android.webkit.Flags.updateServiceV2;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -51,7 +53,7 @@ public class WebViewUpdateService extends SystemService {
    private static final String TAG = "WebViewUpdateService";

    private BroadcastReceiver mWebViewUpdatedReceiver;
    private WebViewUpdateServiceImpl mImpl;
    private WebViewUpdateServiceInterface mImpl;

    static final int PACKAGE_CHANGED = 0;
    static final int PACKAGE_ADDED = 1;
@@ -60,8 +62,12 @@ public class WebViewUpdateService extends SystemService {

    public WebViewUpdateService(Context context) {
        super(context);
        if (updateServiceV2()) {
            mImpl = new WebViewUpdateServiceImpl2(context, SystemImpl.getInstance());
        } else {
            mImpl = new WebViewUpdateServiceImpl(context, SystemImpl.getInstance());
        }
    }

    @Override
    public void onStart() {
+27 −14
Original line number Diff line number Diff line
@@ -63,7 +63,7 @@ import java.util.List;
 *
 * @hide
 */
class WebViewUpdateServiceImpl {
class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface {
    private static final String TAG = WebViewUpdateServiceImpl.class.getSimpleName();

    private static class WebViewPackageMissingException extends Exception {
@@ -112,7 +112,8 @@ class WebViewUpdateServiceImpl {
        mSystemInterface = systemInterface;
    }

    void packageStateChanged(String packageName, int changedState, int userId) {
    @Override
    public void packageStateChanged(String packageName, int changedState, int userId) {
        // We don't early out here in different cases where we could potentially early-out (e.g. if
        // we receive PACKAGE_CHANGED for another user than the system user) since that would
        // complicate this logic further and open up for more edge cases.
@@ -163,7 +164,8 @@ class WebViewUpdateServiceImpl {
        }
    }

    void prepareWebViewInSystemServer() {
    @Override
    public void prepareWebViewInSystemServer() {
        mSystemInterface.notifyZygote(isMultiProcessEnabled());
        try {
            synchronized (mLock) {
@@ -210,7 +212,8 @@ class WebViewUpdateServiceImpl {
        mSystemInterface.ensureZygoteStarted();
    }

    void handleNewUser(int userId) {
    @Override
    public void handleNewUser(int userId) {
        // The system user is always started at boot, and by that point we have already run one
        // round of the package-changing logic (through prepareWebViewInSystemServer()), so early
        // out here.
@@ -218,7 +221,8 @@ class WebViewUpdateServiceImpl {
        handleUserChange();
    }

    void handleUserRemoved(int userId) {
    @Override
    public void handleUserRemoved(int userId) {
        handleUserChange();
    }

@@ -232,14 +236,16 @@ class WebViewUpdateServiceImpl {
        updateCurrentWebViewPackage(null);
    }

    void notifyRelroCreationCompleted() {
    @Override
    public void notifyRelroCreationCompleted() {
        synchronized (mLock) {
            mNumRelroCreationsFinished++;
            checkIfRelrosDoneLocked();
        }
    }

    WebViewProviderResponse waitForAndGetProvider() {
    @Override
    public WebViewProviderResponse waitForAndGetProvider() {
        PackageInfo webViewPackage = null;
        final long timeoutTimeMs = System.nanoTime() / NS_PER_MS + WAIT_TIMEOUT_MS;
        boolean webViewReady = false;
@@ -284,7 +290,8 @@ class WebViewUpdateServiceImpl {
     * replacing that provider it will not be in use directly, but will be used when the relros
     * or the replacement are done).
     */
    String changeProviderAndSetting(String newProviderName) {
    @Override
    public String changeProviderAndSetting(String newProviderName) {
        PackageInfo newPackage = updateCurrentWebViewPackage(newProviderName);
        if (newPackage == null) return "";
        return newPackage.packageName;
@@ -367,7 +374,8 @@ class WebViewUpdateServiceImpl {
    /**
     * Fetch only the currently valid WebView packages.
     **/
    WebViewProviderInfo[] getValidWebViewPackages() {
    @Override
    public WebViewProviderInfo[] getValidWebViewPackages() {
        ProviderAndPackageInfo[] providersAndPackageInfos = getValidWebViewPackagesAndInfos();
        WebViewProviderInfo[] providers =
            new WebViewProviderInfo[providersAndPackageInfos.length];
@@ -464,11 +472,13 @@ class WebViewUpdateServiceImpl {
        return true;
    }

    WebViewProviderInfo[] getWebViewPackages() {
    @Override
    public WebViewProviderInfo[] getWebViewPackages() {
        return mSystemInterface.getWebViewPackages();
    }

    PackageInfo getCurrentWebViewPackage() {
    @Override
    public PackageInfo getCurrentWebViewPackage() {
        synchronized (mLock) {
            return mCurrentWebViewPackage;
        }
@@ -620,7 +630,8 @@ class WebViewUpdateServiceImpl {
        return null;
    }

    boolean isMultiProcessEnabled() {
    @Override
    public boolean isMultiProcessEnabled() {
        int settingValue = mSystemInterface.getMultiProcessSetting(mContext);
        if (mSystemInterface.isMultiProcessDefaultEnabled()) {
            // Multiprocess should be enabled unless the user has turned it off manually.
@@ -631,7 +642,8 @@ class WebViewUpdateServiceImpl {
        }
    }

    void enableMultiProcess(boolean enable) {
    @Override
    public void enableMultiProcess(boolean enable) {
        PackageInfo current = getCurrentWebViewPackage();
        mSystemInterface.setMultiProcessSetting(mContext,
                enable ? MULTIPROCESS_SETTING_ON_VALUE : MULTIPROCESS_SETTING_OFF_VALUE);
@@ -644,7 +656,8 @@ class WebViewUpdateServiceImpl {
    /**
     * Dump the state of this Service.
     */
    void dumpState(PrintWriter pw) {
    @Override
    public void dumpState(PrintWriter pw) {
        pw.println("Current WebView Update Service state");
        pw.println(String.format("  Multiprocess enabled: %b", isMultiProcessEnabled()));
        synchronized (mLock) {
+747 −0

File added.

Preview size limit exceeded, changes collapsed.

+50 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 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 com.android.server.webkit;

import android.content.pm.PackageInfo;
import android.webkit.WebViewProviderInfo;
import android.webkit.WebViewProviderResponse;

import java.io.PrintWriter;

interface WebViewUpdateServiceInterface {
    void packageStateChanged(String packageName, int changedState, int userId);

    void handleNewUser(int userId);

    void handleUserRemoved(int userId);

    WebViewProviderInfo[] getWebViewPackages();

    void prepareWebViewInSystemServer();

    void notifyRelroCreationCompleted();

    WebViewProviderResponse waitForAndGetProvider();

    String changeProviderAndSetting(String newProviderName);

    WebViewProviderInfo[] getValidWebViewPackages();

    PackageInfo getCurrentWebViewPackage();

    boolean isMultiProcessEnabled();

    void enableMultiProcess(boolean enable);

    void dumpState(PrintWriter pw);
}
Loading