public class

ServiceWorkerWebSettingsImpl

extends ServiceWorkerWebSettingsCompat

 java.lang.Object

androidx.webkit.ServiceWorkerWebSettingsCompat

↳androidx.webkit.internal.ServiceWorkerWebSettingsImpl

Gradle dependencies

compile group: 'androidx.webkit', name: 'webkit', version: '1.12.0-rc01'

  • groupId: androidx.webkit
  • artifactId: webkit
  • version: 1.12.0-rc01

Artifact androidx.webkit:webkit:1.12.0-rc01 it located at Google repository (https://maven.google.com/)

Androidx artifact mapping:

androidx.webkit:webkit com.android.support:webkit

Overview

Implementation of ServiceWorkerWebSettingsCompat. This class uses either the framework, the WebView APK, or both, to implement ServiceWorkerWebSettingsCompat functionality.

Summary

Constructors
publicServiceWorkerWebSettingsImpl(ServiceWorkerWebSettings settings)

This class handles three different scenarios: 1.

Methods
public abstract booleangetAllowContentAccess()

Gets whether Service Workers support content URL access.

public abstract booleangetAllowFileAccess()

Gets whether Service Workers support file access.

public abstract booleangetBlockNetworkLoads()

Gets whether Service Workers are prohibited from loading any resources from the network.

public abstract intgetCacheMode()

Gets the current setting for overriding the cache mode.

public abstract java.util.Set<java.lang.String>getRequestedWithHeaderOriginAllowList()

Get the currently configured allow-list of origins, which is guaranteed to receive the X-Requested-With HTTP header on requests from service workers.

public abstract voidsetAllowContentAccess(boolean allow)

Enables or disables content URL access from Service Workers.

public abstract voidsetAllowFileAccess(boolean allow)

Enables or disables file access within Service Workers.

public abstract voidsetBlockNetworkLoads(boolean flag)

Sets whether Service Workers should not load resources from the network.

public abstract voidsetCacheMode(int mode)

Overrides the way the cache is used.

public abstract voidsetRequestedWithHeaderOriginAllowList(java.util.Set<java.lang.String> allowList)

Set an allow-list of origins to receive the X-Requested-With HTTP header from service workers.

from java.lang.Objectclone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Constructors

public ServiceWorkerWebSettingsImpl(ServiceWorkerWebSettings settings)

This class handles three different scenarios: 1. The Android version on the device is high enough to support all APIs used. 2. The Android version on the device is too low to support any ServiceWorkerWebSettings APIs so we use the support library glue instead through org.chromium.support_lib_boundary.ServiceWorkerWebSettingsBoundaryInterface. 3. The Android version on the device is high enough to support some ServiceWorkerWebSettings APIs, so we call into them using , but the rest of the APIs are only supported by the support library glue, so whenever we call such an API we fetch a org.chromium.support_lib_boundary.ServiceWorkerWebSettingsBoundaryInterface corresponding to our .

Methods

public abstract void setCacheMode(int mode)

Overrides the way the cache is used.

This method should only be called if WebViewFeature.isFeatureSupported(String) returns true for WebViewFeature.SERVICE_WORKER_CACHE_MODE.

Parameters:

mode: the mode to use. One of , , or . The default value is .

See also: , ServiceWorkerWebSettingsCompat.getCacheMode()

public abstract int getCacheMode()

Gets the current setting for overriding the cache mode.

This method should only be called if WebViewFeature.isFeatureSupported(String) returns true for WebViewFeature.SERVICE_WORKER_CACHE_MODE.

Returns:

the current setting for overriding the cache mode

See also: ServiceWorkerWebSettingsCompat.setCacheMode(int)

public abstract void setAllowContentAccess(boolean allow)

Enables or disables content URL access from Service Workers.

This method should only be called if WebViewFeature.isFeatureSupported(String) returns true for WebViewFeature.SERVICE_WORKER_CONTENT_ACCESS.

See also: , ServiceWorkerWebSettingsCompat.getAllowContentAccess()

public abstract boolean getAllowContentAccess()

Gets whether Service Workers support content URL access.

This method should only be called if WebViewFeature.isFeatureSupported(String) returns true for WebViewFeature.SERVICE_WORKER_CONTENT_ACCESS.

See also: ServiceWorkerWebSettingsCompat.setAllowContentAccess(boolean)

public abstract void setAllowFileAccess(boolean allow)

Enables or disables file access within Service Workers.

This method should only be called if WebViewFeature.isFeatureSupported(String) returns true for WebViewFeature.SERVICE_WORKER_FILE_ACCESS.

See also: , ServiceWorkerWebSettingsCompat.getAllowContentAccess()

public abstract boolean getAllowFileAccess()

Gets whether Service Workers support file access.

This method should only be called if WebViewFeature.isFeatureSupported(String) returns true for WebViewFeature.SERVICE_WORKER_FILE_ACCESS.

See also: ServiceWorkerWebSettingsCompat.setAllowFileAccess(boolean)

public abstract void setBlockNetworkLoads(boolean flag)

Sets whether Service Workers should not load resources from the network.

This method should only be called if WebViewFeature.isFeatureSupported(String) returns true for WebViewFeature.SERVICE_WORKER_BLOCK_NETWORK_LOADS.

Parameters:

flag: true means block network loads by the Service Workers

See also: , ServiceWorkerWebSettingsCompat.getBlockNetworkLoads()

public abstract boolean getBlockNetworkLoads()

Gets whether Service Workers are prohibited from loading any resources from the network.

This method should only be called if WebViewFeature.isFeatureSupported(String) returns true for WebViewFeature.SERVICE_WORKER_BLOCK_NETWORK_LOADS.

Returns:

true if the Service Workers are not allowed to load any resources from the network

See also: ServiceWorkerWebSettingsCompat.setBlockNetworkLoads(boolean)

public abstract java.util.Set<java.lang.String> getRequestedWithHeaderOriginAllowList()

Get the currently configured allow-list of origins, which is guaranteed to receive the X-Requested-With HTTP header on requests from service workers.

Any origin not on this allow-list may not receive the header, depending on the current installed WebView provider.

The format of the strings in the allow-list follows the origin rules of WebViewCompat.addWebMessageListener(WebView, String, Set, WebViewCompat.WebMessageListener).

Returns:

The configured set of allow-listed origins.

See also: ServiceWorkerWebSettingsCompat.setRequestedWithHeaderOriginAllowList(Set), WebSettingsCompat.getRequestedWithHeaderOriginAllowList(WebSettings)

public abstract void setRequestedWithHeaderOriginAllowList(java.util.Set<java.lang.String> allowList)

Set an allow-list of origins to receive the X-Requested-With HTTP header from service workers.

Historically, this header was sent on all requests from WebView, containing the app package name of the embedding app. Depending on the version of installed WebView, this may no longer be the case, as the header was deprecated in late 2022, and its use discontinued.

Apps can use this method to restore the legacy behavior for servers that still rely on the deprecated header, but it should not be used to identify the webview to first-party servers under the control of the app developer.

The format of the strings in the allow-list follows the origin rules of WebViewCompat.addWebMessageListener(WebView, String, Set, WebViewCompat.WebMessageListener).

Parameters:

allowList: Set of origins to allow-list.

See also: WebSettingsCompat.setRequestedWithHeaderOriginAllowList(WebSettings, Set)

Source

/*
 * Copyright 2018 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.internal;

import android.webkit.ServiceWorkerWebSettings;

import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.webkit.ServiceWorkerWebSettingsCompat;

import org.chromium.support_lib_boundary.ServiceWorkerWebSettingsBoundaryInterface;
import org.chromium.support_lib_boundary.util.BoundaryInterfaceReflectionUtil;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.Set;

/**
 * Implementation of {@link ServiceWorkerWebSettingsCompat}.
 * This class uses either the framework, the WebView APK, or both, to implement
 * {@link ServiceWorkerWebSettingsCompat} functionality.
 */
public class ServiceWorkerWebSettingsImpl extends ServiceWorkerWebSettingsCompat {
    private ServiceWorkerWebSettings mFrameworksImpl;
    private ServiceWorkerWebSettingsBoundaryInterface mBoundaryInterface;

    /**
     * This class handles three different scenarios:
     * 1. The Android version on the device is high enough to support all APIs used.
     * 2. The Android version on the device is too low to support any ServiceWorkerWebSettings APIs
     * so we use the support library glue instead through
     * {@link ServiceWorkerWebSettingsBoundaryInterface}.
     * 3. The Android version on the device is high enough to support some ServiceWorkerWebSettings
     * APIs, so we call into them using {@link android.webkit.ServiceWorkerWebSettings}, but the
     * rest of the APIs are only supported by the support library glue, so whenever we call such an
     * API we fetch a {@link ServiceWorkerWebSettingsBoundaryInterface} corresponding to our
     * {@link android.webkit.ServiceWorkerWebSettings}.
     */
    public ServiceWorkerWebSettingsImpl(@NonNull ServiceWorkerWebSettings settings) {
        mFrameworksImpl = settings;
    }

    public ServiceWorkerWebSettingsImpl(@NonNull InvocationHandler invocationHandler) {
        mBoundaryInterface = BoundaryInterfaceReflectionUtil.castToSuppLibClass(
                ServiceWorkerWebSettingsBoundaryInterface.class, invocationHandler);
    }

    @RequiresApi(24)
    private ServiceWorkerWebSettings getFrameworksImpl() {
        if (mFrameworksImpl == null) {
            mFrameworksImpl =
                    WebViewGlueCommunicator.getCompatConverter().convertServiceWorkerSettings(
                            Proxy.getInvocationHandler(mBoundaryInterface));
        }
        return mFrameworksImpl;
    }

    private ServiceWorkerWebSettingsBoundaryInterface getBoundaryInterface() {
        if (mBoundaryInterface == null) {
            // If the boundary interface is null we must have a working frameworks implementation to
            // convert into a boundary interface.
            // The case of the boundary interface being null here only occurs if we created the
            // ServiceWorkerWebSettingsImpl using a frameworks API, but now want to call an API on
            // the ServiceWorkerWebSettingsImpl that is only supported by the support library glue.
            // This could happen for example if we introduce a new ServiceWorkerWebSettings API in
            // level 30 and we run the support library on an N device (whose framework supports
            // ServiceWorkerWebSettings).
            mBoundaryInterface = BoundaryInterfaceReflectionUtil.castToSuppLibClass(
                    ServiceWorkerWebSettingsBoundaryInterface.class,
                    WebViewGlueCommunicator.getCompatConverter().convertServiceWorkerSettings(
                            mFrameworksImpl));
        }
        return mBoundaryInterface;
    }

    @Override
    public void setCacheMode(int mode) {
        final ApiFeature.N feature = WebViewFeatureInternal.SERVICE_WORKER_CACHE_MODE;
        if (feature.isSupportedByFramework()) {
            ApiHelperForN.setCacheMode(getFrameworksImpl(), mode);
        } else if (feature.isSupportedByWebView()) {
            getBoundaryInterface().setCacheMode(mode);
        } else {
            throw WebViewFeatureInternal.getUnsupportedOperationException();
        }
    }

    @Override
    public int getCacheMode() {
        final ApiFeature.N feature = WebViewFeatureInternal.SERVICE_WORKER_CACHE_MODE;
        if (feature.isSupportedByFramework()) {
            return ApiHelperForN.getCacheMode(getFrameworksImpl());
        } else if (feature.isSupportedByWebView()) {
            return getBoundaryInterface().getCacheMode();
        } else {
            throw WebViewFeatureInternal.getUnsupportedOperationException();
        }
    }

    @Override
    public void setAllowContentAccess(boolean allow) {
        final ApiFeature.N feature = WebViewFeatureInternal.SERVICE_WORKER_CONTENT_ACCESS;
        if (feature.isSupportedByFramework()) {
            ApiHelperForN.setAllowContentAccess(getFrameworksImpl(), allow);
        } else if (feature.isSupportedByWebView()) {
            getBoundaryInterface().setAllowContentAccess(allow);
        } else {
            throw WebViewFeatureInternal.getUnsupportedOperationException();
        }
    }

    @Override
    public boolean getAllowContentAccess() {
        final ApiFeature.N feature = WebViewFeatureInternal.SERVICE_WORKER_CONTENT_ACCESS;
        if (feature.isSupportedByFramework()) {
            return ApiHelperForN.getAllowContentAccess(getFrameworksImpl());
        } else if (feature.isSupportedByWebView()) {
            return getBoundaryInterface().getAllowContentAccess();
        } else {
            throw WebViewFeatureInternal.getUnsupportedOperationException();
        }
    }

    @Override
    public void setAllowFileAccess(boolean allow) {
        final ApiFeature.N feature = WebViewFeatureInternal.SERVICE_WORKER_FILE_ACCESS;
        if (feature.isSupportedByFramework()) {
            ApiHelperForN.setAllowFileAccess(getFrameworksImpl(), allow);
        } else if (feature.isSupportedByWebView()) {
            getBoundaryInterface().setAllowFileAccess(allow);
        } else {
            throw WebViewFeatureInternal.getUnsupportedOperationException();
        }
    }

    @Override
    public boolean getAllowFileAccess() {
        final ApiFeature.N feature = WebViewFeatureInternal.SERVICE_WORKER_FILE_ACCESS;
        if (feature.isSupportedByFramework()) {
            return ApiHelperForN.getAllowFileAccess(getFrameworksImpl());
        } else if (feature.isSupportedByWebView()) {
            return getBoundaryInterface().getAllowFileAccess();
        } else {
            throw WebViewFeatureInternal.getUnsupportedOperationException();
        }
    }

    @Override
    public void setBlockNetworkLoads(boolean flag) {
        final ApiFeature.N feature = WebViewFeatureInternal.SERVICE_WORKER_BLOCK_NETWORK_LOADS;
        if (feature.isSupportedByFramework()) {
            ApiHelperForN.setBlockNetworkLoads(getFrameworksImpl(), flag);
        } else if (feature.isSupportedByWebView()) {
            getBoundaryInterface().setBlockNetworkLoads(flag);
        } else {
            throw WebViewFeatureInternal.getUnsupportedOperationException();
        }
    }

    @Override
    public boolean getBlockNetworkLoads() {
        final ApiFeature.N feature = WebViewFeatureInternal.SERVICE_WORKER_BLOCK_NETWORK_LOADS;
        if (feature.isSupportedByFramework()) {
            return ApiHelperForN.getBlockNetworkLoads(getFrameworksImpl());
        } else if (feature.isSupportedByWebView()) {
            return getBoundaryInterface().getBlockNetworkLoads();
        } else {
            throw WebViewFeatureInternal.getUnsupportedOperationException();
        }
    }

    @NonNull
    @Override
    public Set<String> getRequestedWithHeaderOriginAllowList() {
        final ApiFeature.NoFramework feature =
                WebViewFeatureInternal.REQUESTED_WITH_HEADER_ALLOW_LIST;
        if (feature.isSupportedByWebView()) {
            return getBoundaryInterface().getRequestedWithHeaderOriginAllowList();
        } else {
            throw WebViewFeatureInternal.getUnsupportedOperationException();
        }
    }

    @Override
    public void setRequestedWithHeaderOriginAllowList(@NonNull Set<String> allowList) {
        final ApiFeature.NoFramework feature =
                WebViewFeatureInternal.REQUESTED_WITH_HEADER_ALLOW_LIST;
        if (feature.isSupportedByWebView()) {
            getBoundaryInterface().setRequestedWithHeaderOriginAllowList(allowList);
        } else {
            throw WebViewFeatureInternal.getUnsupportedOperationException();
        }
    }
}