[webkit] add feature flag for ServiceWorkerClien..shouldInterceptRequest

Allow developers to check whether
ServiceWorkerClientCompat.shouldInterceptRequest is supported through
the use of a feature flag.

Corresponding Chromium change:
https://chromium-review.googlesource.com/c/chromium/src/+/998164

Bug: 73151166
Test: Ensure ServiceWorkerClientCompat test fails when the
SERVICE_WORKER_SHOULD_INTERCEPT_REQUEST flag is missing on the support
support library side.

Change-Id: I3f8e27f6462a7bab90a48bf8c5d9cf8d5814dc9b
diff --git a/webkit/api/current.txt b/webkit/api/current.txt
index b565173..b001df8 100644
--- a/webkit/api/current.txt
+++ b/webkit/api/current.txt
@@ -66,6 +66,7 @@
     field public static final java.lang.String SERVICE_WORKER_CACHE_MODE = "SERVICE_WORKER_CACHE_MODE";
     field public static final java.lang.String SERVICE_WORKER_CONTENT_ACCESS = "SERVICE_WORKER_CONTENT_ACCESS";
     field public static final java.lang.String SERVICE_WORKER_FILE_ACCESS = "SERVICE_WORKER_FILE_ACCESS";
+    field public static final java.lang.String SERVICE_WORKER_SHOULD_INTERCEPT_REQUEST = "SERVICE_WORKER_SHOULD_INTERCEPT_REQUEST";
     field public static final java.lang.String START_SAFE_BROWSING = "START_SAFE_BROWSING";
     field public static final java.lang.String VISUAL_STATE_CALLBACK = "VISUAL_STATE_CALLBACK";
   }
diff --git a/webkit/src/main/java/androidx/webkit/ServiceWorkerClientCompat.java b/webkit/src/main/java/androidx/webkit/ServiceWorkerClientCompat.java
index 19aab8c..5c3c5ff 100644
--- a/webkit/src/main/java/androidx/webkit/ServiceWorkerClientCompat.java
+++ b/webkit/src/main/java/androidx/webkit/ServiceWorkerClientCompat.java
@@ -43,6 +43,10 @@
      * @see android.webkit.WebViewClient#shouldInterceptRequest(android.webkit.WebView,
      * WebResourceRequest)
      *
+     * This method is called only if
+     * {@link WebViewFeature#SERVICE_WORKER_SHOULD_INTERCEPT_REQUEST} is supported. You can check
+     * whether that flag is supported using {@link WebViewFeature#isFeatureSupported(String)}.
+     *
      */
     public abstract WebResourceResponse shouldInterceptRequest(@NonNull WebResourceRequest request);
 }
diff --git a/webkit/src/main/java/androidx/webkit/WebViewFeature.java b/webkit/src/main/java/androidx/webkit/WebViewFeature.java
index eb54eed..d321c8c 100644
--- a/webkit/src/main/java/androidx/webkit/WebViewFeature.java
+++ b/webkit/src/main/java/androidx/webkit/WebViewFeature.java
@@ -18,6 +18,7 @@
 
 import android.content.Context;
 import android.webkit.ValueCallback;
+import android.webkit.WebResourceRequest;
 import android.webkit.WebSettings;
 
 import androidx.annotation.NonNull;
@@ -56,7 +57,8 @@
             SERVICE_WORKER_CACHE_MODE,
             SERVICE_WORKER_CONTENT_ACCESS,
             SERVICE_WORKER_FILE_ACCESS,
-            SERVICE_WORKER_BLOCK_NETWORK_LOADS
+            SERVICE_WORKER_BLOCK_NETWORK_LOADS,
+            SERVICE_WORKER_SHOULD_INTERCEPT_REQUEST
 
     })
     @Retention(RetentionPolicy.SOURCE)
@@ -159,6 +161,14 @@
     public static final String SERVICE_WORKER_BLOCK_NETWORK_LOADS =
             Features.SERVICE_WORKER_BLOCK_NETWORK_LOADS;
 
+    /**
+     * Feature for {@link #isFeatureSupported(String)}.
+     * This feature covers
+     * {@link ServiceWorkerClientCompat#shouldInterceptRequest(WebResourceRequest)}.
+     */
+    public static final String SERVICE_WORKER_SHOULD_INTERCEPT_REQUEST =
+            Features.SERVICE_WORKER_SHOULD_INTERCEPT_REQUEST;
+
 
     /**
      * Return whether a feature is supported at run-time. This depends on the Android version of the
diff --git a/webkit/src/main/java/androidx/webkit/internal/ServiceWorkerClientAdapter.java b/webkit/src/main/java/androidx/webkit/internal/ServiceWorkerClientAdapter.java
index 3ffeb83..f96bbd1 100644
--- a/webkit/src/main/java/androidx/webkit/internal/ServiceWorkerClientAdapter.java
+++ b/webkit/src/main/java/androidx/webkit/internal/ServiceWorkerClientAdapter.java
@@ -22,6 +22,7 @@
 import androidx.webkit.ServiceWorkerClientCompat;
 
 import org.chromium.support_lib_boundary.ServiceWorkerClientBoundaryInterface;
+import org.chromium.support_lib_boundary.util.Features;
 
 /**
  * Adapter between {@link ServiceWorkerClientCompat} and
@@ -39,4 +40,9 @@
     public WebResourceResponse shouldInterceptRequest(WebResourceRequest request) {
         return mClient.shouldInterceptRequest(request);
     }
+
+    @Override
+    public String[] getSupportedFeatures() {
+        return new String[] { Features.SERVICE_WORKER_SHOULD_INTERCEPT_REQUEST };
+    }
 }
diff --git a/webkit/src/main/java/androidx/webkit/internal/WebViewFeatureInternal.java b/webkit/src/main/java/androidx/webkit/internal/WebViewFeatureInternal.java
index 52189e9..b019544 100644
--- a/webkit/src/main/java/androidx/webkit/internal/WebViewFeatureInternal.java
+++ b/webkit/src/main/java/androidx/webkit/internal/WebViewFeatureInternal.java
@@ -19,8 +19,10 @@
 import android.content.Context;
 import android.os.Build;
 import android.webkit.ValueCallback;
+import android.webkit.WebResourceRequest;
 import android.webkit.WebSettings;
 
+import androidx.webkit.ServiceWorkerClientCompat;
 import androidx.webkit.WebViewCompat;
 import androidx.webkit.WebViewFeature;
 import androidx.webkit.WebViewFeature.WebViewSupportFeature;
@@ -114,6 +116,13 @@
      * {@link androidx.webkit.ServiceWorkerWebSettingsCompat#setBlockNetworkLoads(boolean)}.
      */
     SERVICE_WORKER_BLOCK_NETWORK_LOADS(WebViewFeature.SERVICE_WORKER_BLOCK_NETWORK_LOADS,
+            Build.VERSION_CODES.N),
+
+    /**
+     * This feature covers
+     * {@link ServiceWorkerClientCompat#shouldInterceptRequest(WebResourceRequest)}.
+     */
+    SERVICE_WORKER_SHOULD_INTERCEPT_REQUEST(WebViewFeature.SERVICE_WORKER_SHOULD_INTERCEPT_REQUEST,
             Build.VERSION_CODES.N);
 
     private final String mFeatureValue;