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