chromium/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebkitToCompatConverterAdapter.java

// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.support_lib_glue;

import android.os.Build;
import android.webkit.CookieManager;
import android.webkit.SafeBrowsingResponse;
import android.webkit.ServiceWorkerWebSettings;
import android.webkit.WebMessagePort;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;

import androidx.annotation.RequiresApi;

import com.android.webview.chromium.SafeBrowsingResponseAdapter;
import com.android.webview.chromium.ServiceWorkerSettingsAdapter;
import com.android.webview.chromium.WebMessagePortAdapter;
import com.android.webview.chromium.WebResourceErrorAdapter;
import com.android.webview.chromium.WebkitToSharedGlueConverter;

import org.chromium.support_lib_boundary.WebkitToCompatConverterBoundaryInterface;
import org.chromium.support_lib_boundary.util.BoundaryInterfaceReflectionUtil;
import org.chromium.support_lib_callback_glue.SupportLibSafeBrowsingResponse;
import org.chromium.support_lib_callback_glue.SupportLibWebResourceError;

import java.lang.reflect.InvocationHandler;

/**
 * Adapter used for fetching implementations for Compat objects given their corresponding
 * webkit-object.
 */
class SupportLibWebkitToCompatConverterAdapter implements WebkitToCompatConverterBoundaryInterface {
    SupportLibWebkitToCompatConverterAdapter() {}

    // WebSettingsBoundaryInterface
    @Override
    public InvocationHandler convertSettings(WebSettings webSettings) {
        return BoundaryInterfaceReflectionUtil.createInvocationHandlerFor(
                new SupportLibWebSettingsAdapter(
                        WebkitToSharedGlueConverter.getSettings(webSettings)));
    }

    // WebResourceRequestBoundaryInterface
    @Override
    public InvocationHandler convertWebResourceRequest(WebResourceRequest request) {
        return BoundaryInterfaceReflectionUtil.createInvocationHandlerFor(
                new SupportLibWebResourceRequest(
                        WebkitToSharedGlueConverter.getWebResourceRequest(request)));
    }

    // ServiceWorkerWebSettingsBoundaryInterface
    @Override
    public InvocationHandler convertServiceWorkerSettings(
            /* ServiceWorkerWebSettings */ Object serviceWorkerWebSettings) {
        return BoundaryInterfaceReflectionUtil.createInvocationHandlerFor(
                new SupportLibServiceWorkerSettingsAdapter(
                        WebkitToSharedGlueConverter.getServiceWorkerSettings(
                                (ServiceWorkerWebSettings) serviceWorkerWebSettings)));
    }

    @Override
    public /* ServiceWorkerWebSettings */ Object convertServiceWorkerSettings(
            /* SupportLibServiceWorkerSettings */ InvocationHandler serviceWorkerSettings) {
        SupportLibServiceWorkerSettingsAdapter supportLibWebSettings =
                (SupportLibServiceWorkerSettingsAdapter)
                        BoundaryInterfaceReflectionUtil.getDelegateFromInvocationHandler(
                                serviceWorkerSettings);
        return new ServiceWorkerSettingsAdapter(supportLibWebSettings.getAwServiceWorkerSettings());
    }

    @Override
    public /* SupportLibWebResourceError */ InvocationHandler convertWebResourceError(
            /* WebResourceError */ Object webResourceError) {
        return BoundaryInterfaceReflectionUtil.createInvocationHandlerFor(
                new SupportLibWebResourceError(
                        WebkitToSharedGlueConverter.getAwWebResourceError(
                                (WebResourceError) webResourceError)));
    }

    @Override
    public /* WebResourceError */ Object convertWebResourceError(
            /* SupportLibWebResourceError */ InvocationHandler webResourceError) {
        SupportLibWebResourceError supportLibError =
                (SupportLibWebResourceError)
                        BoundaryInterfaceReflectionUtil.getDelegateFromInvocationHandler(
                                webResourceError);
        return new WebResourceErrorAdapter(supportLibError.getAwWebResourceError());
    }

    @Override
    @RequiresApi(Build.VERSION_CODES.O_MR1)
    public /* SupportLibSafeBrowsingResponse */ InvocationHandler convertSafeBrowsingResponse(
            /* SafeBrowsingResponse */ Object safeBrowsingResponse) {
        return BoundaryInterfaceReflectionUtil.createInvocationHandlerFor(
                new SupportLibSafeBrowsingResponse(
                        WebkitToSharedGlueConverter.getAwSafeBrowsingResponseCallback(
                                (SafeBrowsingResponse) safeBrowsingResponse)));
    }

    @Override
    @RequiresApi(Build.VERSION_CODES.O_MR1)
    public /* SafeBrowsingResponse */ Object convertSafeBrowsingResponse(
            /* SupportLibSafeBrowsingResponse */ InvocationHandler safeBrowsingResponse) {
        SupportLibSafeBrowsingResponse supportLibResponse =
                (SupportLibSafeBrowsingResponse)
                        BoundaryInterfaceReflectionUtil.getDelegateFromInvocationHandler(
                                safeBrowsingResponse);
        return new SafeBrowsingResponseAdapter(
                supportLibResponse.getAwSafeBrowsingResponseCallback());
    }

    @Override
    public /* SupportLibWebMessagePort */ InvocationHandler convertWebMessagePort(
            /* WebMessagePort */ Object webMessagePort) {
        return BoundaryInterfaceReflectionUtil.createInvocationHandlerFor(
                new SupportLibWebMessagePortAdapter(
                        WebkitToSharedGlueConverter.getMessagePort(
                                (WebMessagePort) webMessagePort)));
    }

    @Override
    public /* WebMessagePort */ Object convertWebMessagePort(
            /* SupportLibWebMessagePort */ InvocationHandler webMessagePort) {
        SupportLibWebMessagePortAdapter supportLibMessagePort =
                (SupportLibWebMessagePortAdapter)
                        BoundaryInterfaceReflectionUtil.getDelegateFromInvocationHandler(
                                webMessagePort);
        return new WebMessagePortAdapter(supportLibMessagePort.getPort());
    }

    // WebViewCookieManagerBoundaryInterface
    @Override
    public InvocationHandler convertCookieManager(Object cookieManager) {
        return BoundaryInterfaceReflectionUtil.createInvocationHandlerFor(
                new SupportLibWebViewCookieManagerAdapter(
                        WebkitToSharedGlueConverter.getCookieManager(
                                (CookieManager) cookieManager)));
    }
}