Merge "[WebView Support Library] Add ServiceWorker non-framework support." into pi-dev
diff --git a/webkit/src/main/java/androidx/webkit/ServiceWorkerControllerCompat.java b/webkit/src/main/java/androidx/webkit/ServiceWorkerControllerCompat.java
index 0a27cd0..3eb55d2 100644
--- a/webkit/src/main/java/androidx/webkit/ServiceWorkerControllerCompat.java
+++ b/webkit/src/main/java/androidx/webkit/ServiceWorkerControllerCompat.java
@@ -24,6 +24,8 @@
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.webkit.internal.FrameworkServiceWorkerController;
+import androidx.webkit.internal.ServiceWorkerControllerAdapter;
+import androidx.webkit.internal.WebViewGlueCommunicator;
 
 // TODO(gsennton) guard APIs with isFeatureSupported(String)
 
@@ -79,7 +81,8 @@
     }
 
     private static ServiceWorkerControllerCompat getSupportLibraryControllerCompat() {
-        return null; // TODO(gsennton) implement this
+        return new ServiceWorkerControllerAdapter(
+                WebViewGlueCommunicator.getFactory().getServiceWorkerController());
     }
 
     /**
diff --git a/webkit/src/main/java/androidx/webkit/internal/ServiceWorkerClientAdapter.java b/webkit/src/main/java/androidx/webkit/internal/ServiceWorkerClientAdapter.java
new file mode 100644
index 0000000..3ffeb83
--- /dev/null
+++ b/webkit/src/main/java/androidx/webkit/internal/ServiceWorkerClientAdapter.java
@@ -0,0 +1,42 @@
+/*
+ * 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.WebResourceRequest;
+import android.webkit.WebResourceResponse;
+
+import androidx.webkit.ServiceWorkerClientCompat;
+
+import org.chromium.support_lib_boundary.ServiceWorkerClientBoundaryInterface;
+
+/**
+ * Adapter between {@link ServiceWorkerClientCompat} and
+ * {@link ServiceWorkerClientBoundaryInterface} (the corresponding interface shared with the support
+ * library glue in the WebView APK).
+ */
+public class ServiceWorkerClientAdapter implements ServiceWorkerClientBoundaryInterface {
+    private final ServiceWorkerClientCompat mClient;
+
+    public ServiceWorkerClientAdapter(ServiceWorkerClientCompat client) {
+        mClient = client;
+    }
+
+    @Override
+    public WebResourceResponse shouldInterceptRequest(WebResourceRequest request) {
+        return mClient.shouldInterceptRequest(request);
+    }
+}
diff --git a/webkit/src/main/java/androidx/webkit/internal/ServiceWorkerControllerAdapter.java b/webkit/src/main/java/androidx/webkit/internal/ServiceWorkerControllerAdapter.java
new file mode 100644
index 0000000..4baa3ea
--- /dev/null
+++ b/webkit/src/main/java/androidx/webkit/internal/ServiceWorkerControllerAdapter.java
@@ -0,0 +1,54 @@
+/*
+ * 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 androidx.webkit.ServiceWorkerClientCompat;
+import androidx.webkit.ServiceWorkerControllerCompat;
+import androidx.webkit.ServiceWorkerWebSettingsCompat;
+
+import org.chromium.support_lib_boundary.ServiceWorkerControllerBoundaryInterface;
+import org.chromium.support_lib_boundary.ServiceWorkerWebSettingsBoundaryInterface;
+import org.chromium.support_lib_boundary.util.BoundaryInterfaceReflectionUtil;
+
+/**
+ * Adapter between {@link ServiceWorkerControllerCompat} and
+ * {@link ServiceWorkerControllerBoundaryInterface} (the corresponding interface shared with the
+ * support library glue in the WebView APK).
+ */
+public class ServiceWorkerControllerAdapter extends ServiceWorkerControllerCompat {
+    private final ServiceWorkerControllerBoundaryInterface mImpl;
+    private final ServiceWorkerWebSettingsCompat mWebSettings;
+
+    public ServiceWorkerControllerAdapter(ServiceWorkerControllerBoundaryInterface impl) {
+        mImpl = impl;
+        mWebSettings = new ServiceWorkerWebSettingsAdapter(
+                BoundaryInterfaceReflectionUtil.castToSuppLibClass(
+                        ServiceWorkerWebSettingsBoundaryInterface.class,
+                        mImpl.getServiceWorkerWebSettings()));
+    }
+
+    @Override
+    public ServiceWorkerWebSettingsCompat getServiceWorkerWebSettings() {
+        return mWebSettings;
+    }
+
+    @Override
+    public void setServiceWorkerClient(ServiceWorkerClientCompat client) {
+        mImpl.setServiceWorkerClient(BoundaryInterfaceReflectionUtil.createInvocationHandlerFor(
+                new ServiceWorkerClientAdapter(client)));
+    }
+}
diff --git a/webkit/src/main/java/androidx/webkit/internal/ServiceWorkerWebSettingsAdapter.java b/webkit/src/main/java/androidx/webkit/internal/ServiceWorkerWebSettingsAdapter.java
new file mode 100644
index 0000000..fd49396
--- /dev/null
+++ b/webkit/src/main/java/androidx/webkit/internal/ServiceWorkerWebSettingsAdapter.java
@@ -0,0 +1,74 @@
+/*
+ * 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 androidx.webkit.ServiceWorkerWebSettingsCompat;
+
+import org.chromium.support_lib_boundary.ServiceWorkerWebSettingsBoundaryInterface;
+
+/**
+ * Adapter between {@link ServiceWorkerWebSettingsCompat} and
+ * {@link ServiceWorkerWebSettingsBoundaryInterface} (the corresponding interface shared with the
+ * support library glue in the WebView APK).
+ */
+public class ServiceWorkerWebSettingsAdapter extends ServiceWorkerWebSettingsCompat {
+    private final ServiceWorkerWebSettingsBoundaryInterface mImpl;
+
+    public ServiceWorkerWebSettingsAdapter(ServiceWorkerWebSettingsBoundaryInterface impl) {
+        mImpl = impl;
+    }
+
+    @Override
+    public void setCacheMode(int mode) {
+        mImpl.setCacheMode(mode);
+    }
+
+    @Override
+    public int getCacheMode() {
+        return mImpl.getCacheMode();
+    }
+
+    @Override
+    public void setAllowContentAccess(boolean allow) {
+        mImpl.setAllowContentAccess(allow);
+    }
+
+    @Override
+    public boolean getAllowContentAccess() {
+        return mImpl.getAllowContentAccess();
+    }
+
+    @Override
+    public void setAllowFileAccess(boolean allow) {
+        mImpl.setAllowFileAccess(allow);
+    }
+
+    @Override
+    public boolean getAllowFileAccess() {
+        return mImpl.getAllowFileAccess();
+    }
+
+    @Override
+    public void setBlockNetworkLoads(boolean flag) {
+        mImpl.setBlockNetworkLoads(flag);
+    }
+
+    @Override
+    public boolean getBlockNetworkLoads() {
+        return mImpl.getBlockNetworkLoads();
+    }
+}
diff --git a/webkit/src/main/java/androidx/webkit/internal/WebViewProviderFactoryAdapter.java b/webkit/src/main/java/androidx/webkit/internal/WebViewProviderFactoryAdapter.java
index 544dc6e..efe0e64 100644
--- a/webkit/src/main/java/androidx/webkit/internal/WebViewProviderFactoryAdapter.java
+++ b/webkit/src/main/java/androidx/webkit/internal/WebViewProviderFactoryAdapter.java
@@ -18,6 +18,7 @@
 
 import android.webkit.WebView;
 
+import org.chromium.support_lib_boundary.ServiceWorkerControllerBoundaryInterface;
 import org.chromium.support_lib_boundary.StaticsBoundaryInterface;
 import org.chromium.support_lib_boundary.WebViewProviderBoundaryInterface;
 import org.chromium.support_lib_boundary.WebViewProviderFactoryBoundaryInterface;
@@ -70,4 +71,13 @@
     public String[] getWebViewFeatures() {
         return mImpl.getSupportedFeatures();
     }
+
+    /**
+     * Adapter method for fetching the support library class representing
+     * {@link android.webkit.ServiceWorkerController}.
+     */
+    public ServiceWorkerControllerBoundaryInterface getServiceWorkerController() {
+        return BoundaryInterfaceReflectionUtil.castToSuppLibClass(
+                ServiceWorkerControllerBoundaryInterface.class, mImpl.getServiceWorkerController());
+    }
 }