• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.adservices.common;
18 
19 import android.content.Context;
20 import android.util.Log;
21 
22 import com.android.adservices.service.js.JSScriptEngine;
23 import com.android.adservices.shared.testing.SupportedByConditionRule;
24 
25 import java.util.concurrent.ExecutionException;
26 import java.util.concurrent.TimeUnit;
27 import java.util.concurrent.TimeoutException;
28 
29 public final class WebViewSupportUtil {
30 
31     private static final String TAG = "WebViewSupportUtil";
32     private static final int JS_SANDBOX_TIMEOUT_MS = 5000;
33 
34     /**
35      * @return instance of SupportedByConditionRule which checks if Javascript Sandbox is available
36      */
createJSSandboxAvailableRule(Context context)37     public static SupportedByConditionRule createJSSandboxAvailableRule(Context context) {
38         return new SupportedByConditionRule(
39                 "JS Sandbox is not available", () -> isJSSandboxAvailable(context));
40     }
41 
42     /**
43      * @return instance of SupportedByConditionRule which checks if Javascript Sandbox supports WASM
44      *     for Fledge/Protected Audience
45      */
createWasmSupportAvailableRule(Context context)46     public static SupportedByConditionRule createWasmSupportAvailableRule(Context context) {
47         return new SupportedByConditionRule(
48                 "JS Sandbox does not support WASM", () -> isWasmSupportAvailable(context));
49     }
50 
51     /**
52      * @return a boolean to indicate if Javascript sandbox is available.
53      */
isJSSandboxAvailable(Context context)54     public static boolean isJSSandboxAvailable(Context context)
55             throws ExecutionException, InterruptedException, TimeoutException {
56         boolean isJSSandboxAvailable =
57                 JSScriptEngine.AvailabilityChecker.isJSSandboxAvailable()
58                         && JSScriptEngine.getInstance()
59                                 .isConfigurableHeapSizeSupported()
60                                 .get(JS_SANDBOX_TIMEOUT_MS, TimeUnit.MILLISECONDS);
61         Log.d(TAG, String.format("isJSSandboxAvailable: %s", isJSSandboxAvailable));
62         return isJSSandboxAvailable;
63     }
64 
65     /**
66      * @return a boolean to indicate if Console callback for Javascript isolate is available.
67      */
isJSIsolateConsoleCallbackAvailable(Context context)68     public static boolean isJSIsolateConsoleCallbackAvailable(Context context)
69             throws ExecutionException, InterruptedException, TimeoutException {
70         boolean isJSIsolateConsoleCallbackAvailable =
71                 isJSSandboxAvailable(context)
72                         && JSScriptEngine.getInstance()
73                                 .isConsoleCallbackSupported()
74                                 .get(JS_SANDBOX_TIMEOUT_MS, TimeUnit.MILLISECONDS);
75         Log.d(
76                 TAG,
77                 String.format(
78                         "isJSIsolateConsoleCallbackAvailable: %s",
79                         isJSIsolateConsoleCallbackAvailable));
80         return isJSIsolateConsoleCallbackAvailable;
81     }
82 
83     /**
84      * @return a boolean to indicate if Javascript sandbox supports WASM.
85      */
isWasmSupportAvailable(Context context)86     public static boolean isWasmSupportAvailable(Context context)
87             throws ExecutionException, InterruptedException, TimeoutException {
88         boolean isWasmSupportAvailable =
89                 JSScriptEngine.AvailabilityChecker.isJSSandboxAvailable()
90                         && JSScriptEngine.getInstance()
91                                 .isWasmSupported()
92                                 .get(JS_SANDBOX_TIMEOUT_MS, TimeUnit.MILLISECONDS);
93         Log.d(TAG, String.format("isWasmSupportAvailable: %s", isWasmSupportAvailable));
94         return isWasmSupportAvailable;
95     }
96 
97     /**
98      * @return a boolean to indicate if Javascript sandbox supports evaluation without transaction
99      *     limits.
100      */
isEvaluationWithoutTransactionLimitSupportAvailable(Context context)101     public static boolean isEvaluationWithoutTransactionLimitSupportAvailable(Context context)
102             throws ExecutionException, InterruptedException, TimeoutException {
103         boolean isEvaluationWithoutTransactionLimitSupportAvailable =
104                 isJSSandboxAvailable(context)
105                         && JSScriptEngine.getInstance()
106                                 .isLargeTransactionsSupported()
107                                 .get(JS_SANDBOX_TIMEOUT_MS, TimeUnit.MILLISECONDS);
108         Log.d(
109                 TAG,
110                 String.format(
111                         "isEvaluationWithoutTransactionLimitSupportAvailable: %s",
112                         isEvaluationWithoutTransactionLimitSupportAvailable));
113         return isEvaluationWithoutTransactionLimitSupportAvailable;
114     }
115 }
116