diff options
author | Peter Birk Pakkenberg <pbirk@google.com> | 2022-04-22 16:29:14 +0100 |
---|---|---|
committer | Peter Birk Pakkenberg <pbirk@google.com> | 2022-05-10 10:04:56 +0100 |
commit | 0b6f4e7304c4ebd7a9e7e7c01798495f43539547 (patch) | |
tree | 6dac617a3c6469b8224583a491c7970f22aa7f00 | |
parent | 1345d94c7a55fa0d15a79cb8fa7ed6d75ba0870f (diff) | |
download | support-0b6f4e7304c4ebd7a9e7e7c01798495f43539547.tar.gz |
Clean UnknownNullness issues for webkit
Explicitly adding a lint rule to break on UnknownNullness. Fix all
reported lint errors.
Fixes a few other reported code quality issues from Android Studio, such
as fields that could be final and using try-with-resource.
Fixes: 139769993
Fixes: 139774819
Test: ./gradlew webkit:webkit:lint
Test: ./gradlew webkit:webkit:connectedAndroid
Change-Id: I64159337850bee45d7f6fe8f24908c8051933e4e
17 files changed, 147 insertions, 86 deletions
diff --git a/webkit/webkit/lint.xml b/webkit/webkit/lint.xml index 6262c9b67f6..dd56e16974e 100644 --- a/webkit/webkit/lint.xml +++ b/webkit/webkit/lint.xml @@ -22,7 +22,18 @@ <!-- Webkit-specific lint rules: --> + + <!-- We cannot cause ClassVerificationFailure in embedding apps --> <issue id="ClassVerificationFailure" severity="fatal" /> + <!-- Developers need to call our code from Kotlin code, so nullness is important.--> + <issue id="UnknownNullness" severity="fatal" > + <!-- The boundary interfaces are not annotated, and they represent external chromium code, + so skip them. + The catch-all ignore below does not disable this check, + so it needs to be done here too. --> + <ignore path="**/org/chromium/support_lib_boundary/**" /> + </issue> + <!-- Ignore all warnings for webview-support-interfaces, since it's external chromium code. --> <issue id="all" severity="ignore"> <ignore path="**/org/chromium/support_lib_boundary/**" /> diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/PollingCheck.java b/webkit/webkit/src/androidTest/java/androidx/webkit/PollingCheck.java index d660b997df3..f7098fb4fd0 100644 --- a/webkit/webkit/src/androidTest/java/androidx/webkit/PollingCheck.java +++ b/webkit/webkit/src/androidTest/java/androidx/webkit/PollingCheck.java @@ -16,6 +16,8 @@ package androidx.webkit; +import androidx.annotation.NonNull; + import org.junit.Assert; import java.util.concurrent.Callable; @@ -61,7 +63,8 @@ public abstract class PollingCheck { Assert.fail("unexpected timeout"); } - public static void check(CharSequence message, long timeout, Callable<Boolean> condition) + public static void check(@NonNull CharSequence message, long timeout, + @NonNull Callable<Boolean> condition) throws Exception { while (timeout > 0) { if (condition.call()) { diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/ServiceWorkerClientCompatTest.java b/webkit/webkit/src/androidTest/java/androidx/webkit/ServiceWorkerClientCompatTest.java index e40b4d52d60..180fea344a2 100644 --- a/webkit/webkit/src/androidTest/java/androidx/webkit/ServiceWorkerClientCompatTest.java +++ b/webkit/webkit/src/androidTest/java/androidx/webkit/ServiceWorkerClientCompatTest.java @@ -26,6 +26,7 @@ import android.webkit.WebResourceResponse; import android.webkit.WebView; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.MediumTest; @@ -116,8 +117,9 @@ public class ServiceWorkerClientCompatTest { } public static class InterceptServiceWorkerClient extends ServiceWorkerClientCompat { - private List<WebResourceRequest> mInterceptedRequests = new ArrayList<>(); + private final List<WebResourceRequest> mInterceptedRequests = new ArrayList<>(); + @Nullable @Override public WebResourceResponse shouldInterceptRequest(@NonNull WebResourceRequest request) { // Records intercepted requests and only return content for SW_URL. diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/TargetSdkActivityTestRule.java b/webkit/webkit/src/androidTest/java/androidx/webkit/TargetSdkActivityTestRule.java index 1b70b672462..205980214de 100644 --- a/webkit/webkit/src/androidTest/java/androidx/webkit/TargetSdkActivityTestRule.java +++ b/webkit/webkit/src/androidTest/java/androidx/webkit/TargetSdkActivityTestRule.java @@ -23,6 +23,7 @@ import android.app.Activity; import android.content.Context; import android.content.pm.ApplicationInfo; +import androidx.annotation.NonNull; import androidx.test.platform.app.InstrumentationRegistry; /** @@ -34,7 +35,7 @@ public class TargetSdkActivityTestRule<T extends Activity> extends private int mTargetSdk; private Context mAppContext; - public TargetSdkActivityTestRule(Class<T> activityClass, int targetSdk) { + public TargetSdkActivityTestRule(@NonNull Class<T> activityClass, int targetSdk) { super(activityClass); mTargetSdk = targetSdk; } diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/WebSettingsCompatDarkModeTestBase.java b/webkit/webkit/src/androidTest/java/androidx/webkit/WebSettingsCompatDarkModeTestBase.java index 50c432cac0a..568cf608916 100644 --- a/webkit/webkit/src/androidTest/java/androidx/webkit/WebSettingsCompatDarkModeTestBase.java +++ b/webkit/webkit/src/androidTest/java/androidx/webkit/WebSettingsCompatDarkModeTestBase.java @@ -68,7 +68,7 @@ public class WebSettingsCompatDarkModeTestBase<T extends Activity> { @Rule public final TargetSdkActivityTestRule<T> mActivityRule; - public WebSettingsCompatDarkModeTestBase(Class<T> activityClass, int targetSdk) { + public WebSettingsCompatDarkModeTestBase(@NonNull Class<T> activityClass, int targetSdk) { mActivityRule = new TargetSdkActivityTestRule<T>(activityClass, targetSdk); } @@ -154,6 +154,7 @@ public class WebSettingsCompatDarkModeTestBase<T extends Activity> { /** * Returns a matcher to check if a color int is mostly green. */ + @NonNull public static Matcher<Integer> isGreen() { return new TypeSafeMatcher<Integer>() { private int mPageColor; diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewDocumentStartJavaScriptTest.java b/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewDocumentStartJavaScriptTest.java index 619ef7a13d4..b8ae25dbf19 100644 --- a/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewDocumentStartJavaScriptTest.java +++ b/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewDocumentStartJavaScriptTest.java @@ -59,11 +59,11 @@ public class WebViewDocumentStartJavaScriptTest { private static class TestWebMessageListener implements WebViewCompat.WebMessageListener { private BlockingQueue<Data> mQueue = new LinkedBlockingQueue<>(); - public static class Data { - public WebMessageCompat mMessage; - public Uri mSourceOrigin; - public boolean mIsMainFrame; - public JavaScriptReplyProxy mReplyProxy; + static class Data { + WebMessageCompat mMessage; + Uri mSourceOrigin; + boolean mIsMainFrame; + JavaScriptReplyProxy mReplyProxy; Data(WebMessageCompat message, Uri sourceOrigin, boolean isMainFrame, JavaScriptReplyProxy replyProxy) { diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewOnUiThread.java b/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewOnUiThread.java index 215696a36d3..f28c63c4c82 100644 --- a/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewOnUiThread.java +++ b/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewOnUiThread.java @@ -16,6 +16,7 @@ package androidx.webkit; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -98,7 +99,7 @@ public class WebViewOnUiThread implements AutoCloseable{ * * The caller is responsible for destroying the WebView instance. */ - public WebViewOnUiThread(final WebView webView) { + public WebViewOnUiThread(final @NonNull WebView webView) { this(webView, false); } @@ -120,6 +121,7 @@ public class WebViewOnUiThread implements AutoCloseable{ volatile WebView mView; } + @NonNull public static WebView createWebView() { final Holder h = new Holder(); final Context ctx = ApplicationProvider.getApplicationContext(); @@ -157,7 +159,7 @@ public class WebViewOnUiThread implements AutoCloseable{ * * The task will be executed on the same thread that executes the cleanup. */ - public void setCleanupTask(Runnable cleanupTask) { + public void setCleanupTask(@Nullable Runnable cleanupTask) { mCleanupTask = cleanupTask; } @@ -186,89 +188,97 @@ public class WebViewOnUiThread implements AutoCloseable{ this.notifyAll(); } - public static void destroy(final WebView webView) { + public static void destroy(final @NonNull WebView webView) { WebkitUtils.onMainThreadSync(webView::destroy); } - public void setWebViewClient(final WebViewClient webviewClient) { + public void setWebViewClient(final @NonNull WebViewClient webviewClient) { setWebViewClient(mWebView, webviewClient); } public static void setWebViewClient( - final WebView webView, final WebViewClient webviewClient) { + final @NonNull WebView webView, final @NonNull WebViewClient webviewClient) { WebkitUtils.onMainThreadSync(() -> webView.setWebViewClient(webviewClient)); } - public void setWebChromeClient(final WebChromeClient webChromeClient) { + public void setWebChromeClient(final @Nullable WebChromeClient webChromeClient) { setWebChromeClient(mWebView, webChromeClient); } public static void setWebChromeClient( - final WebView webView, final WebChromeClient webChromeClient) { + final @NonNull WebView webView, final @Nullable WebChromeClient webChromeClient) { WebkitUtils.onMainThreadSync(() -> webView.setWebChromeClient(webChromeClient)); } public void setWebViewRenderProcessClient( - final WebViewRenderProcessClient webViewRenderProcessClient) { + final @NonNull WebViewRenderProcessClient webViewRenderProcessClient) { setWebViewRenderProcessClient(mWebView, webViewRenderProcessClient); } public static void setWebViewRenderProcessClient( - final WebView webView, final WebViewRenderProcessClient webViewRenderProcessClient) { + final @NonNull WebView webView, + final @NonNull WebViewRenderProcessClient webViewRenderProcessClient) { WebkitUtils.onMainThreadSync(() -> WebViewCompat.setWebViewRenderProcessClient( webView, webViewRenderProcessClient)); } public void setWebViewRenderProcessClient( - final Executor executor, final WebViewRenderProcessClient webViewRenderProcessClient) { + final @NonNull Executor executor, + final @NonNull WebViewRenderProcessClient webViewRenderProcessClient) { setWebViewRenderProcessClient(mWebView, executor, webViewRenderProcessClient); } public static void setWebViewRenderProcessClient( - final WebView webView, - final Executor executor, - final WebViewRenderProcessClient webViewRenderProcessClient) { + final @NonNull WebView webView, + final @NonNull Executor executor, + final @NonNull WebViewRenderProcessClient webViewRenderProcessClient) { WebkitUtils.onMainThreadSync(() -> WebViewCompat.setWebViewRenderProcessClient( webView, executor, webViewRenderProcessClient)); } + @Nullable public WebViewRenderProcessClient getWebViewRenderProcessClient() { return getWebViewRenderProcessClient(mWebView); } + @Nullable public static WebViewRenderProcessClient getWebViewRenderProcessClient( - final WebView webView) { + final @NonNull WebView webView) { return WebkitUtils.onMainThreadSync( () -> WebViewCompat.getWebViewRenderProcessClient(webView)); } + @NonNull public WebMessagePortCompat[] createWebMessageChannelCompat() { return WebkitUtils.onMainThreadSync(() -> WebViewCompat.createWebMessageChannel(mWebView)); } - public void postWebMessageCompat(final WebMessageCompat message, final Uri targetOrigin) { + public void postWebMessageCompat(final @NonNull WebMessageCompat message, + final @NonNull Uri targetOrigin) { WebkitUtils.onMainThreadSync( () -> WebViewCompat.postWebMessage(mWebView, message, targetOrigin)); } - public void addWebMessageListener(String jsObjectName, Set<String> allowedOriginRules, - final WebViewCompat.WebMessageListener listener) { + public void addWebMessageListener(@NonNull String jsObjectName, + @NonNull Set<String> allowedOriginRules, + final @NonNull WebViewCompat.WebMessageListener listener) { WebkitUtils.onMainThreadSync(() -> WebViewCompat.addWebMessageListener( mWebView, jsObjectName, allowedOriginRules, listener)); } - public void removeWebMessageListener(final String jsObjectName) { + public void removeWebMessageListener(final @NonNull String jsObjectName) { WebkitUtils.onMainThreadSync( () -> WebViewCompat.removeWebMessageListener(mWebView, jsObjectName)); } + @NonNull public ScriptHandler addDocumentStartJavaScript( - String script, Set<String> allowedOriginRules) { + @NonNull String script, @NonNull Set<String> allowedOriginRules) { return WebkitUtils.onMainThreadSync(() -> WebViewCompat.addDocumentStartJavaScript( mWebView, script, allowedOriginRules)); } - public void addJavascriptInterface(final Object object, final String name) { + public void addJavascriptInterface(final @NonNull Object object, final @NonNull String name) { WebkitUtils.onMainThreadSync(() -> mWebView.addJavascriptInterface(object, name)); } @@ -282,7 +292,7 @@ public class WebViewOnUiThread implements AutoCloseable{ callAndWait(() -> mWebView.loadUrl(url)); } - public void loadUrl(final String url) { + public void loadUrl(final @NonNull String url) { WebkitUtils.onMainThreadSync(() -> mWebView.loadUrl(url)); } @@ -299,9 +309,10 @@ public class WebViewOnUiThread implements AutoCloseable{ callAndWait(() -> mWebView.loadData(data, mimeType, encoding)); } - public void loadDataWithBaseURLAndWaitForCompletion(final String baseUrl, - final String data, final String mimeType, final String encoding, - final String historyUrl) { + public void loadDataWithBaseURLAndWaitForCompletion(final @Nullable String baseUrl, + final @NonNull String data, final @Nullable String mimeType, + final @Nullable String encoding, + final @Nullable String historyUrl) { callAndWait(() -> mWebView.loadDataWithBaseURL( baseUrl, data, mimeType, encoding, historyUrl)); } @@ -324,20 +335,23 @@ public class WebViewOnUiThread implements AutoCloseable{ } } + @Nullable public String getTitle() { return WebkitUtils.onMainThreadSync(() -> mWebView.getTitle()); } + @NonNull public WebSettings getSettings() { return WebkitUtils.onMainThreadSync(() -> mWebView.getSettings()); } + @Nullable public String getUrl() { return WebkitUtils.onMainThreadSync(() -> mWebView.getUrl()); } public void postVisualStateCallbackCompat(final long requestId, - final WebViewCompat.VisualStateCallback callback) { + final @NonNull WebViewCompat.VisualStateCallback callback) { WebkitUtils.onMainThreadSync(() -> WebViewCompat.postVisualStateCallback( mWebView, requestId, callback)); } @@ -345,29 +359,35 @@ public class WebViewOnUiThread implements AutoCloseable{ /** * Execute javascript synchronously, returning the result. */ - public String evaluateJavascriptSync(final String script) { + @Nullable + public String evaluateJavascriptSync(final @NonNull String script) { final ResolvableFuture<String> future = ResolvableFuture.create(); evaluateJavascript(script, future::set); return WebkitUtils.waitForFuture(future); } - public void evaluateJavascript(final String script, final ValueCallback<String> result) { + public void evaluateJavascript(final @NonNull String script, + final @Nullable ValueCallback<String> result) { WebkitUtils.onMainThread(() -> mWebView.evaluateJavascript(script, result)); } + @NonNull public WebViewClient getWebViewClient() { return getWebViewClient(mWebView); } - public static WebViewClient getWebViewClient(final WebView webView) { + @NonNull + public static WebViewClient getWebViewClient(final @NonNull WebView webView) { return WebkitUtils.onMainThreadSync(() -> WebViewCompat.getWebViewClient(webView)); } + @Nullable public WebChromeClient getWebChromeClient() { return getWebChromeClient(mWebView); } - public static WebChromeClient getWebChromeClient(final WebView webView) { + @Nullable + public static WebChromeClient getWebChromeClient(final @NonNull WebView webView) { return WebkitUtils.onMainThreadSync(() -> WebViewCompat.getWebChromeClient(webView)); } @@ -402,6 +422,7 @@ public class WebViewOnUiThread implements AutoCloseable{ * This synchronises so that the bitmap contents reflects the current DOM state, rather than * potentially capturing a previously generated frame. */ + @NonNull public Bitmap captureBitmap() { WebSettingsCompat.setOffscreenPreRaster(getSettings(), true); waitForDOMReadyToRender(); @@ -435,10 +456,9 @@ public class WebViewOnUiThread implements AutoCloseable{ * @param call The call to make on the UI thread prior to waiting. */ private void callAndWait(Runnable call) { - assertTrue("WebViewOnUiThread.load*AndWaitForCompletion calls " - + "may not be mixed with load* calls directly on WebView " - + "without calling waitForLoadCompletion after the load", - !isLoaded()); + assertFalse("WebViewOnUiThread.load*AndWaitForCompletion calls " + + "may not be mixed with load* calls directly on WebView " + + "without calling waitForLoadCompletion after the load", isLoaded()); clearLoad(); // clear any extraneous signals from a previous load. if (Looper.myLooper() == Looper.getMainLooper()) { call.run(); @@ -522,7 +542,7 @@ public class WebViewOnUiThread implements AutoCloseable{ * directly. */ public static class WaitForProgressClient extends WebChromeClient { - private WebViewOnUiThread mOnUiThread; + private final WebViewOnUiThread mOnUiThread; WaitForProgressClient(WebViewOnUiThread onUiThread) { mOnUiThread = onUiThread; @@ -544,7 +564,7 @@ public class WebViewOnUiThread implements AutoCloseable{ * WaitForLoadedClient or call WebViewOnUiThread.onPageFinished. */ public static class WaitForLoadedClient extends WebViewClientCompat { - private WebViewOnUiThread mOnUiThread; + private final WebViewOnUiThread mOnUiThread; WaitForLoadedClient(WebViewOnUiThread onUiThread) { mOnUiThread = onUiThread; diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewTestActivity.java b/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewTestActivity.java index 940153722ba..0cd87a3e0e0 100644 --- a/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewTestActivity.java +++ b/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewTestActivity.java @@ -21,15 +21,19 @@ import android.os.Bundle; import android.view.ViewGroup; import android.webkit.WebView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + public class WebViewTestActivity extends Activity { private WebView mWebView; + @NonNull public WebView getWebView() { return mWebView; } @Override - protected void onCreate(Bundle savedInstanceState) { + protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mWebView = new WebView(this); diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewWebMessageListenerTest.java b/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewWebMessageListenerTest.java index 10a9bdfeaea..f53207166d6 100644 --- a/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewWebMessageListenerTest.java +++ b/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewWebMessageListenerTest.java @@ -65,16 +65,16 @@ public class WebViewWebMessageListenerTest { private static final Set<String> MATCH_EXAMPLE_COM = new HashSet<>(Arrays.asList(BASE_URI)); private WebViewOnUiThread mWebViewOnUiThread; - private TestWebMessageListener mListener = new TestWebMessageListener(); + private final TestWebMessageListener mListener = new TestWebMessageListener(); private static class TestWebMessageListener implements WebViewCompat.WebMessageListener { - private BlockingQueue<Data> mQueue = new LinkedBlockingQueue<>(); + private final BlockingQueue<Data> mQueue = new LinkedBlockingQueue<>(); - public static class Data { - public WebMessageCompat mMessage; - public Uri mSourceOrigin; - public boolean mIsMainFrame; - public JavaScriptReplyProxy mReplyProxy; + static class Data { + WebMessageCompat mMessage; + Uri mSourceOrigin; + boolean mIsMainFrame; + JavaScriptReplyProxy mReplyProxy; Data(WebMessageCompat message, Uri sourceOrigin, boolean isMainFrame, JavaScriptReplyProxy replyProxy) { diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/WebkitUtils.java b/webkit/webkit/src/androidTest/java/androidx/webkit/WebkitUtils.java index 75a8387fd4c..62bd52e8882 100644 --- a/webkit/webkit/src/androidTest/java/androidx/webkit/WebkitUtils.java +++ b/webkit/webkit/src/androidTest/java/androidx/webkit/WebkitUtils.java @@ -66,7 +66,8 @@ public final class WebkitUtils { * @param callable the {@link Callable} to execute. * @return a {@link ListenableFuture} representing the result of {@code callable}. */ - public static <T> ListenableFuture<T> onMainThread(final Callable<T> callable) { + @NonNull + public static <T> ListenableFuture<T> onMainThread(final @NonNull Callable<T> callable) { return onMainThreadDelayed(0, callable); } @@ -75,7 +76,7 @@ public final class WebkitUtils { * * @param runnable the {@link Runnable} to execute. */ - public static void onMainThread(final Runnable runnable) { + public static void onMainThread(final @NonNull Runnable runnable) { onMainThreadDelayed(0, runnable); } @@ -86,8 +87,9 @@ public final class WebkitUtils { * @param callable the {@link Callable} to execute. * @return a {@link ListenableFuture} representing the result of {@code callable}. */ + @NonNull public static <T> ListenableFuture<T> onMainThreadDelayed( - long delayMs, final Callable<T> callable) { + long delayMs, final @NonNull Callable<T> callable) { final ResolvableFuture<T> future = ResolvableFuture.create(); sMainHandler.postDelayed(() -> { try { @@ -105,7 +107,7 @@ public final class WebkitUtils { * @param delayMs the delay in milliseconds * @param runnable the {@link Runnable} to execute. */ - public static void onMainThreadDelayed(long delayMs, final Runnable runnable) { + public static void onMainThreadDelayed(long delayMs, final @NonNull Runnable runnable) { sMainHandler.postDelayed(runnable, delayMs); } @@ -120,7 +122,7 @@ public final class WebkitUtils { * @param callable the {@link Callable} to execute. * @return the result of the {@link Callable}. */ - public static <T> T onMainThreadSync(final Callable<T> callable) { + public static <T> T onMainThreadSync(final @NonNull Callable<T> callable) { if (Looper.myLooper() == Looper.getMainLooper()) { throw new IllegalStateException("This cannot be called from the UI thread."); } @@ -135,9 +137,9 @@ public final class WebkitUtils { * * <p class="note"><b>Note:</b> this should not be called from the UI thread. * - * @param Runnable the {@link Runnable} to execute. + * @param runnable the {@link Runnable} to execute. */ - public static void onMainThreadSync(final Runnable runnable) { + public static void onMainThreadSync(final @NonNull Runnable runnable) { if (Looper.myLooper() == Looper.getMainLooper()) { throw new IllegalStateException("This cannot be called from the UI thread."); } @@ -172,7 +174,7 @@ public final class WebkitUtils { * @param featureName the feature to be checked */ @RequiresApi(21) - public static void checkFeature(String featureName) { + public static void checkFeature(@NonNull String featureName) { final String msg = "This device does not have the feature '" + featureName + "'"; final boolean hasFeature = WebViewFeature.isFeatureSupported(featureName); Assume.assumeTrue(msg, hasFeature); @@ -187,7 +189,7 @@ public final class WebkitUtils { * @param future the {@link Future} representing a value of interest. * @return the value {@code future} represents. */ - public static <T> T waitForFuture(Future<T> future) { + public static <T> T waitForFuture(@NonNull Future<T> future) { try { return future.get(TEST_TIMEOUT_MS, TimeUnit.MILLISECONDS); } catch (ExecutionException e) { @@ -219,7 +221,7 @@ public final class WebkitUtils { /** * Takes an element out of the {@link BlockingQueue} (or times out). */ - public static <T> T waitForNextQueueElement(BlockingQueue<T> queue) { + public static <T> T waitForNextQueueElement(@NonNull BlockingQueue<T> queue) { try { T value = queue.poll(TEST_TIMEOUT_MS, TimeUnit.MILLISECONDS); if (value == null) { @@ -242,14 +244,11 @@ public final class WebkitUtils { /** * Write a string to a file, and create the whole parent directories if they don't exist. */ - public static void writeToFile(File file, String content) + public static void writeToFile(@NonNull File file, @NonNull String content) throws IOException { file.getParentFile().mkdirs(); - FileOutputStream fos = new FileOutputStream(file); - try { + try (FileOutputStream fos = new FileOutputStream(file)) { fos.write(content.getBytes("utf-8")); - } finally { - fos.close(); } } @@ -258,7 +257,7 @@ public final class WebkitUtils { * @param currentFile The file or directory to delete. Does not need to exist. * @return Whether currentFile does not exist afterwards. */ - public static boolean recursivelyDeleteFile(File currentFile) { + public static boolean recursivelyDeleteFile(@NonNull File currentFile) { if (!currentFile.exists()) { return true; } @@ -271,8 +270,7 @@ public final class WebkitUtils { } } - boolean ret = currentFile.delete(); - return ret; + return currentFile.delete(); } /** diff --git a/webkit/webkit/src/main/java/androidx/webkit/internal/VisualStateCallbackAdapter.java b/webkit/webkit/src/main/java/androidx/webkit/internal/VisualStateCallbackAdapter.java index 4e95e228b1c..29529c5d1da 100644 --- a/webkit/webkit/src/main/java/androidx/webkit/internal/VisualStateCallbackAdapter.java +++ b/webkit/webkit/src/main/java/androidx/webkit/internal/VisualStateCallbackAdapter.java @@ -16,6 +16,7 @@ package androidx.webkit.internal; +import androidx.annotation.NonNull; import androidx.webkit.WebViewCompat; import org.chromium.support_lib_boundary.VisualStateCallbackBoundaryInterface; @@ -25,9 +26,10 @@ import org.chromium.support_lib_boundary.VisualStateCallbackBoundaryInterface; * corresponding interface shared with the support library glue in the WebView APK). */ public class VisualStateCallbackAdapter implements VisualStateCallbackBoundaryInterface { - private WebViewCompat.VisualStateCallback mVisualStateCallback; + private final WebViewCompat.VisualStateCallback mVisualStateCallback; - public VisualStateCallbackAdapter(WebViewCompat.VisualStateCallback visualStateCallback) { + public VisualStateCallbackAdapter( + @NonNull WebViewCompat.VisualStateCallback visualStateCallback) { mVisualStateCallback = visualStateCallback; } diff --git a/webkit/webkit/src/main/java/androidx/webkit/internal/WebMessageCallbackAdapter.java b/webkit/webkit/src/main/java/androidx/webkit/internal/WebMessageCallbackAdapter.java index 9fe9b211eb4..f68ba94ac57 100644 --- a/webkit/webkit/src/main/java/androidx/webkit/internal/WebMessageCallbackAdapter.java +++ b/webkit/webkit/src/main/java/androidx/webkit/internal/WebMessageCallbackAdapter.java @@ -30,14 +30,14 @@ import java.lang.reflect.InvocationHandler; * Adapter between {@link WebMessageCallbackCompat} and {@link WebMessageCallbackBoundaryInterface}. */ public class WebMessageCallbackAdapter implements WebMessageCallbackBoundaryInterface { - WebMessageCallbackCompat mImpl; + private final WebMessageCallbackCompat mImpl; public WebMessageCallbackAdapter(@NonNull WebMessageCallbackCompat impl) { mImpl = impl; } @Override - public void onMessage(InvocationHandler port, InvocationHandler message) { + public void onMessage(@NonNull InvocationHandler port, @NonNull InvocationHandler message) { mImpl.onMessage(new WebMessagePortImpl(port), WebMessageAdapter.webMessageCompatFromBoundaryInterface( BoundaryInterfaceReflectionUtil.castToSuppLibClass( diff --git a/webkit/webkit/src/main/java/androidx/webkit/internal/WebResourceRequestAdapter.java b/webkit/webkit/src/main/java/androidx/webkit/internal/WebResourceRequestAdapter.java index 0d6a05d3348..5fbd02e55e3 100644 --- a/webkit/webkit/src/main/java/androidx/webkit/internal/WebResourceRequestAdapter.java +++ b/webkit/webkit/src/main/java/androidx/webkit/internal/WebResourceRequestAdapter.java @@ -18,6 +18,8 @@ package androidx.webkit.internal; import android.webkit.WebResourceRequest; +import androidx.annotation.NonNull; + import org.chromium.support_lib_boundary.WebResourceRequestBoundaryInterface; /** @@ -27,7 +29,8 @@ import org.chromium.support_lib_boundary.WebResourceRequestBoundaryInterface; public class WebResourceRequestAdapter { private final WebResourceRequestBoundaryInterface mBoundaryInterface; - public WebResourceRequestAdapter(WebResourceRequestBoundaryInterface boundaryInterface) { + public WebResourceRequestAdapter( + @NonNull WebResourceRequestBoundaryInterface boundaryInterface) { mBoundaryInterface = boundaryInterface; } diff --git a/webkit/webkit/src/main/java/androidx/webkit/internal/WebSettingsAdapter.java b/webkit/webkit/src/main/java/androidx/webkit/internal/WebSettingsAdapter.java index 1b7e3343a00..963fb991a02 100644 --- a/webkit/webkit/src/main/java/androidx/webkit/internal/WebSettingsAdapter.java +++ b/webkit/webkit/src/main/java/androidx/webkit/internal/WebSettingsAdapter.java @@ -16,6 +16,8 @@ package androidx.webkit.internal; +import androidx.annotation.NonNull; + import org.chromium.support_lib_boundary.WebSettingsBoundaryInterface; /** @@ -24,9 +26,9 @@ import org.chromium.support_lib_boundary.WebSettingsBoundaryInterface; * corresponding interface shared with the support library glue in the WebView APK). */ public class WebSettingsAdapter { - private WebSettingsBoundaryInterface mBoundaryInterface; + private final WebSettingsBoundaryInterface mBoundaryInterface; - public WebSettingsAdapter(WebSettingsBoundaryInterface boundaryInterface) { + public WebSettingsAdapter(@NonNull WebSettingsBoundaryInterface boundaryInterface) { mBoundaryInterface = boundaryInterface; } diff --git a/webkit/webkit/src/main/java/androidx/webkit/internal/WebViewProviderFactory.java b/webkit/webkit/src/main/java/androidx/webkit/internal/WebViewProviderFactory.java index 080233e8a59..9eb736b395f 100644 --- a/webkit/webkit/src/main/java/androidx/webkit/internal/WebViewProviderFactory.java +++ b/webkit/webkit/src/main/java/androidx/webkit/internal/WebViewProviderFactory.java @@ -16,6 +16,7 @@ package androidx.webkit.internal; +import android.webkit.TracingController; import android.webkit.WebView; import androidx.annotation.NonNull; @@ -39,23 +40,27 @@ public interface WebViewProviderFactory { /** * Create a support library version of {@link android.webkit.WebViewProvider}. */ - WebViewProviderBoundaryInterface createWebView(WebView webview); + @NonNull + WebViewProviderBoundaryInterface createWebView(@NonNull WebView webview); /** - * Create the boundary interface for {@link androidx.webkit.internal.WebkitToCompatConverter} + * Create the boundary interface for {@link WebkitToCompatConverter} * which converts android.webkit classes into their corresponding support library classes. */ + @NonNull WebkitToCompatConverterBoundaryInterface getWebkitToCompatConverter(); /** * Fetch the boundary interface representing * {@link android.webkit.WebViewFactoryProvider#Statics}. */ + @NonNull StaticsBoundaryInterface getStatics(); /** * Fetch the features supported by the current WebView APK. */ + @NonNull String[] getWebViewFeatures(); /** @@ -65,12 +70,14 @@ public interface WebViewProviderFactory { ServiceWorkerControllerBoundaryInterface getServiceWorkerController(); /** - * Fetch the boundary interface representing {@link android.webkit.TracingController}. + * Fetch the boundary interface representing {@link TracingController}. */ + @NonNull TracingControllerBoundaryInterface getTracingController(); /** * Fetch the boundary interface representing {@link android.webkit.ProxyController}. */ + @NonNull ProxyControllerBoundaryInterface getProxyController(); } diff --git a/webkit/webkit/src/main/java/androidx/webkit/internal/WebViewProviderFactoryAdapter.java b/webkit/webkit/src/main/java/androidx/webkit/internal/WebViewProviderFactoryAdapter.java index 7f0a6b21e10..b30a66b651a 100644 --- a/webkit/webkit/src/main/java/androidx/webkit/internal/WebViewProviderFactoryAdapter.java +++ b/webkit/webkit/src/main/java/androidx/webkit/internal/WebViewProviderFactoryAdapter.java @@ -35,9 +35,9 @@ import org.chromium.support_lib_boundary.util.BoundaryInterfaceReflectionUtil; */ @SuppressWarnings("JavadocReference") // WebViewFactoryProvider and WebViewProvider are hidden. public class WebViewProviderFactoryAdapter implements WebViewProviderFactory { - WebViewProviderFactoryBoundaryInterface mImpl; + final WebViewProviderFactoryBoundaryInterface mImpl; - public WebViewProviderFactoryAdapter(WebViewProviderFactoryBoundaryInterface impl) { + public WebViewProviderFactoryAdapter(@NonNull WebViewProviderFactoryBoundaryInterface impl) { mImpl = impl; } @@ -46,8 +46,9 @@ public class WebViewProviderFactoryAdapter implements WebViewProviderFactory { * {@link android.webkit.WebViewProvider} - the class used to implement * {@link androidx.webkit.WebViewCompat}. */ + @NonNull @Override - public WebViewProviderBoundaryInterface createWebView(WebView webview) { + public WebViewProviderBoundaryInterface createWebView(@NonNull WebView webview) { return BoundaryInterfaceReflectionUtil.castToSuppLibClass( WebViewProviderBoundaryInterface.class, mImpl.createWebView(webview)); } @@ -57,6 +58,7 @@ public class WebViewProviderFactoryAdapter implements WebViewProviderFactory { * {@link androidx.webkit.internal.WebkitToCompatConverter}, which converts android.webkit * classes into their corresponding support library classes. */ + @NonNull @Override public WebkitToCompatConverterBoundaryInterface getWebkitToCompatConverter() { return BoundaryInterfaceReflectionUtil.castToSuppLibClass( @@ -67,6 +69,7 @@ public class WebViewProviderFactoryAdapter implements WebViewProviderFactory { * Adapter method for fetching the support library class representing * {@link android.webkit.WebViewFactoryProvider#Statics}. */ + @NonNull @Override public StaticsBoundaryInterface getStatics() { return BoundaryInterfaceReflectionUtil.castToSuppLibClass( @@ -76,6 +79,7 @@ public class WebViewProviderFactoryAdapter implements WebViewProviderFactory { /** * Adapter method for fetching the features supported by the current WebView APK. */ + @NonNull @Override public String[] getWebViewFeatures() { return mImpl.getSupportedFeatures(); @@ -96,6 +100,7 @@ public class WebViewProviderFactoryAdapter implements WebViewProviderFactory { * Adapter method for fetching the support library class representing * {@link android.webkit.TracingController}. */ + @NonNull @Override public TracingControllerBoundaryInterface getTracingController() { return BoundaryInterfaceReflectionUtil.castToSuppLibClass( @@ -106,6 +111,7 @@ public class WebViewProviderFactoryAdapter implements WebViewProviderFactory { * Adapter method for fetching the support library class representing * {@link android.webkit.ProxyController}. */ + @NonNull @Override public ProxyControllerBoundaryInterface getProxyController() { return BoundaryInterfaceReflectionUtil.castToSuppLibClass( diff --git a/webkit/webkit/src/main/java/androidx/webkit/internal/WebkitToCompatConverter.java b/webkit/webkit/src/main/java/androidx/webkit/internal/WebkitToCompatConverter.java index c7c51d2064f..ef80a917540 100644 --- a/webkit/webkit/src/main/java/androidx/webkit/internal/WebkitToCompatConverter.java +++ b/webkit/webkit/src/main/java/androidx/webkit/internal/WebkitToCompatConverter.java @@ -43,7 +43,7 @@ import java.lang.reflect.InvocationHandler; public class WebkitToCompatConverter { private final WebkitToCompatConverterBoundaryInterface mImpl; - public WebkitToCompatConverter(WebkitToCompatConverterBoundaryInterface impl) { + public WebkitToCompatConverter(@NonNull WebkitToCompatConverterBoundaryInterface impl) { mImpl = impl; } @@ -53,7 +53,7 @@ public class WebkitToCompatConverter { * {@link androidx.webkit.WebSettingsCompat}. */ @NonNull - public WebSettingsAdapter convertSettings(WebSettings webSettings) { + public WebSettingsAdapter convertSettings(@NonNull WebSettings webSettings) { return new WebSettingsAdapter(BoundaryInterfaceReflectionUtil.castToSuppLibClass( WebSettingsBoundaryInterface.class, mImpl.convertSettings(webSettings))); } @@ -63,7 +63,8 @@ public class WebkitToCompatConverter { * that calls on either of those objects affect the other object. */ @NonNull - public WebResourceRequestAdapter convertWebResourceRequest(WebResourceRequest request) { + public WebResourceRequestAdapter convertWebResourceRequest( + @NonNull WebResourceRequest request) { return new WebResourceRequestAdapter(BoundaryInterfaceReflectionUtil.castToSuppLibClass( WebResourceRequestBoundaryInterface.class, mImpl.convertWebResourceRequest(request))); |