summaryrefslogtreecommitdiff
path: root/chromium/java/com/android/webview
diff options
context:
space:
mode:
authorKristian Monsen <kristianm@google.com>2013-08-23 21:06:44 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2013-08-23 21:06:44 +0000
commitda5db0dadd27c0fdd3b626b8705cb9b1d91d2da3 (patch)
treede98f6d8929c4bcf6f22e5db0c7a24aac62b0bfc /chromium/java/com/android/webview
parent369d3e508c8468e09d858725a28c453e5dfa3a07 (diff)
parent62389e2d66a99e936652092333782947e363241d (diff)
downloadwebview-da5db0dadd27c0fdd3b626b8705cb9b1d91d2da3.tar.gz
Merge "Fix for b/10428080: Check that apps are calling View methods on UI thread" into klp-dev
Diffstat (limited to 'chromium/java/com/android/webview')
-rw-r--r--chromium/java/com/android/webview/chromium/WebViewChromium.java130
1 files changed, 130 insertions, 0 deletions
diff --git a/chromium/java/com/android/webview/chromium/WebViewChromium.java b/chromium/java/com/android/webview/chromium/WebViewChromium.java
index 7849a0d..ad854fc 100644
--- a/chromium/java/com/android/webview/chromium/WebViewChromium.java
+++ b/chromium/java/com/android/webview/chromium/WebViewChromium.java
@@ -147,23 +147,36 @@ class WebViewChromium implements WebViewProvider,
}
+ // Intentionally not static, as no need to check thread on static methods
+ private void checkThread() {
+ if (!ThreadUtils.runningOnUiThread()) {
+ throw new IllegalStateException(
+ "Calling View methods on another thread than the UI thread. " +
+ "PLEASE FILE A BUG! go/klp-webview-bug");
+ }
+ }
+
@Override
public void setHorizontalScrollbarOverlay(boolean overlay) {
+ checkThread();
mAwContents.setHorizontalScrollbarOverlay(overlay);
}
@Override
public void setVerticalScrollbarOverlay(boolean overlay) {
+ checkThread();
mAwContents.setVerticalScrollbarOverlay(overlay);
}
@Override
public boolean overlayHorizontalScrollbar() {
+ checkThread();
return mAwContents.overlayHorizontalScrollbar();
}
@Override
public boolean overlayVerticalScrollbar() {
+ checkThread();
return mAwContents.overlayVerticalScrollbar();
}
@@ -175,11 +188,13 @@ class WebViewChromium implements WebViewProvider,
@Override
public SslCertificate getCertificate() {
+ checkThread();
return mAwContents.getCertificate();
}
@Override
public void setCertificate(SslCertificate certificate) {
+ checkThread();
UnimplementedWebViewApi.invoke();
}
@@ -191,16 +206,19 @@ class WebViewChromium implements WebViewProvider,
@Override
public void setHttpAuthUsernamePassword(String host, String realm, String username,
String password) {
+ checkThread();
mAwContents.setHttpAuthUsernamePassword(host, realm, username, password);
}
@Override
public String[] getHttpAuthUsernamePassword(String host, String realm) {
+ checkThread();
return mAwContents.getHttpAuthUsernamePassword(host, realm);
}
@Override
public void destroy() {
+ checkThread();
mAwContents.destroy();
if (mGLfunctor != null) {
mGLfunctor.destroy();
@@ -210,11 +228,13 @@ class WebViewChromium implements WebViewProvider,
@Override
public void setNetworkAvailable(boolean networkUp) {
+ checkThread();
NetworkChangeNotifier.forceConnectivityState(networkUp);
}
@Override
public WebBackForwardList saveState(Bundle outState) {
+ checkThread();
if (outState == null) return null;
if (!mAwContents.saveState(outState)) return null;
return copyBackForwardList();
@@ -234,6 +254,7 @@ class WebViewChromium implements WebViewProvider,
@Override
public WebBackForwardList restoreState(Bundle inState) {
+ checkThread();
if (inState == null) return null;
if (!mAwContents.restoreState(inState)) return null;
return copyBackForwardList();
@@ -329,56 +350,67 @@ class WebViewChromium implements WebViewProvider,
}
public void evaluateJavaScript(String script, ValueCallback<String> resultCallback) {
+ checkThread();
mAwContents.evaluateJavaScript(script, resultCallback);
}
@Override
public void saveWebArchive(String filename) {
+ checkThread();
saveWebArchive(filename, false, null);
}
@Override
public void saveWebArchive(String basename, boolean autoname, ValueCallback<String> callback) {
+ checkThread();
mAwContents.saveWebArchive(basename, autoname, callback);
}
@Override
public void stopLoading() {
+ checkThread();
mAwContents.stopLoading();
}
@Override
public void reload() {
+ checkThread();
mAwContents.reload();
}
@Override
public boolean canGoBack() {
+ checkThread();
return mAwContents.canGoBack();
}
@Override
public void goBack() {
+ checkThread();
mAwContents.goBack();
}
@Override
public boolean canGoForward() {
+ checkThread();
return mAwContents.canGoForward();
}
@Override
public void goForward() {
+ checkThread();
mAwContents.goForward();
}
@Override
public boolean canGoBackOrForward(int steps) {
+ checkThread();
return mAwContents.canGoBackOrForward(steps);
}
@Override
public void goBackOrForward(int steps) {
+ checkThread();
mAwContents.goBackOrForward(steps);
}
@@ -390,48 +422,57 @@ class WebViewChromium implements WebViewProvider,
@Override
public boolean pageUp(boolean top) {
+ checkThread();
return mAwContents.pageUp(top);
}
@Override
public boolean pageDown(boolean bottom) {
+ checkThread();
return mAwContents.pageDown(bottom);
}
@Override
public void clearView() {
+ checkThread();
UnimplementedWebViewApi.invoke();
}
@Override
public Picture capturePicture() {
+ checkThread();
return mAwContents.capturePicture();
}
@Override
public void exportToPdf(OutputStream stream, int width, int height,
ValueCallback<Boolean> resultCallback, CancellationSignal cancellationSignal) {
+ checkThread();
mAwContents.getPdfExporter().exportToPdf(stream, width, height, resultCallback,
cancellationSignal);
}
@Override
public float getScale() {
+ checkThread();
return mAwContents.getScale();
}
@Override
public void setInitialScale(int scaleInPercent) {
+ checkThread();
mAwContents.getSettings().setInitialPageScale(scaleInPercent);
}
@Override
public void invokeZoomPicker() {
+ checkThread();
mAwContents.invokeZoomPicker();
}
@Override
public WebView.HitTestResult getHitTestResult() {
+ checkThread();
AwContents.HitTestData data = mAwContents.getLastHitTestResult();
mHitTestResult.setType(data.hitTestResultType);
mHitTestResult.setExtra(data.hitTestResultExtraData);
@@ -440,16 +481,19 @@ class WebViewChromium implements WebViewProvider,
@Override
public void requestFocusNodeHref(Message hrefMsg) {
+ checkThread();
mAwContents.requestFocusNodeHref(hrefMsg);
}
@Override
public void requestImageRef(Message msg) {
+ checkThread();
mAwContents.requestImageRef(msg);
}
@Override
public String getUrl() {
+ checkThread();
String url = mAwContents.getUrl();
if (url == null || url.trim().isEmpty()) return null;
return url;
@@ -457,6 +501,7 @@ class WebViewChromium implements WebViewProvider,
@Override
public String getOriginalUrl() {
+ checkThread();
String url = mAwContents.getOriginalUrl();
if (url == null || url.trim().isEmpty()) return null;
return url;
@@ -464,11 +509,13 @@ class WebViewChromium implements WebViewProvider,
@Override
public String getTitle() {
+ checkThread();
return mAwContents.getTitle();
}
@Override
public Bitmap getFavicon() {
+ checkThread();
return mAwContents.getFavicon();
}
@@ -480,51 +527,61 @@ class WebViewChromium implements WebViewProvider,
@Override
public int getProgress() {
+ checkThread();
return mAwContents.getMostRecentProgress();
}
@Override
public int getContentHeight() {
+ checkThread();
return mAwContents.getContentHeightCss();
}
@Override
public int getContentWidth() {
+ checkThread();
return mAwContents.getContentWidthCss();
}
@Override
public void pauseTimers() {
+ checkThread();
mAwContents.pauseTimers();
}
@Override
public void resumeTimers() {
+ checkThread();
mAwContents.resumeTimers();
}
@Override
public void onPause() {
+ checkThread();
mAwContents.onPause();
}
@Override
public void onResume() {
+ checkThread();
mAwContents.onResume();
}
@Override
public boolean isPaused() {
+ checkThread();
return mAwContents.isPaused();
}
@Override
public void freeMemory() {
+ checkThread();
UnimplementedWebViewApi.invoke();
}
@Override
public void clearCache(boolean includeDiskFiles) {
+ checkThread();
mAwContents.clearCache(includeDiskFiles);
}
@@ -533,48 +590,57 @@ class WebViewChromium implements WebViewProvider,
*/
@Override
public void clearFormData() {
+ checkThread();
mAwContents.hideAutofillPopup();
}
@Override
public void clearHistory() {
+ checkThread();
mAwContents.clearHistory();
}
@Override
public void clearSslPreferences() {
+ checkThread();
mAwContents.clearSslPreferences();
}
@Override
public WebBackForwardList copyBackForwardList() {
+ checkThread();
return new WebBackForwardListChromium(
mAwContents.getNavigationHistory());
}
@Override
public void setFindListener(WebView.FindListener listener) {
+ checkThread();
mContentsClientAdapter.setFindListener(listener);
}
@Override
public void findNext(boolean forwards) {
+ checkThread();
mAwContents.findNext(forwards);
}
@Override
public int findAll(String searchString) {
+ checkThread();
mAwContents.findAllAsync(searchString);
return 0;
}
@Override
public void findAllAsync(String searchString) {
+ checkThread();
mAwContents.findAllAsync(searchString);
}
@Override
public boolean showFindDialog(String text, boolean showIme) {
+ checkThread();
if (mWebView.getParent() == null) {
return false;
}
@@ -600,36 +666,43 @@ class WebViewChromium implements WebViewProvider,
@Override
public void notifyFindDialogDismissed() {
+ checkThread();
clearMatches();
}
@Override
public void clearMatches() {
+ checkThread();
mAwContents.clearMatches();
}
@Override
public void documentHasImages(Message response) {
+ checkThread();
mAwContents.documentHasImages(response);
}
@Override
public void setWebViewClient(WebViewClient client) {
+ checkThread();
mContentsClientAdapter.setWebViewClient(client);
}
@Override
public void setDownloadListener(DownloadListener listener) {
+ checkThread();
mContentsClientAdapter.setDownloadListener(listener);
}
@Override
public void setWebChromeClient(WebChromeClient client) {
+ checkThread();
mContentsClientAdapter.setWebChromeClient(client);
}
@Override
public void setPictureListener(WebView.PictureListener listener) {
+ checkThread();
mContentsClientAdapter.setPictureListener(listener);
mAwContents.enableOnNewPicture(listener != null,
mAppTargetSdkVersion >= Build.VERSION_CODES.JELLY_BEAN_MR2);
@@ -637,6 +710,7 @@ class WebViewChromium implements WebViewProvider,
@Override
public void addJavascriptInterface(Object obj, String interfaceName) {
+ checkThread();
Class<? extends Annotation> requiredAnnotation = null;
if (mAppTargetSdkVersion >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
requiredAnnotation = JavascriptInterface.class;
@@ -646,11 +720,13 @@ class WebViewChromium implements WebViewProvider,
@Override
public void removeJavascriptInterface(String interfaceName) {
+ checkThread();
mAwContents.removeJavascriptInterface(interfaceName);
}
@Override
public WebSettings getSettings() {
+ checkThread();
if (mWebSettings == null) {
mWebSettings = new ContentSettingsAdapter(mAwContents.getSettings());
}
@@ -659,16 +735,19 @@ class WebViewChromium implements WebViewProvider,
@Override
public void setMapTrackballToArrowKeys(boolean setMap) {
+ checkThread();
// This is a deprecated API: intentional no-op.
}
@Override
public void flingScroll(int vx, int vy) {
+ checkThread();
mAwContents.flingScroll(vx, vy);
}
@Override
public View getZoomControls() {
+ checkThread();
// This was deprecated in 2009 and hidden in JB MR1, so just provide the minimum needed
// to stop very out-dated applications from crashing.
Log.w(TAG, "WebView doesn't support getZoomControls");
@@ -677,31 +756,37 @@ class WebViewChromium implements WebViewProvider,
@Override
public boolean canZoomIn() {
+ checkThread();
return mAwContents.canZoomIn();
}
@Override
public boolean canZoomOut() {
+ checkThread();
return mAwContents.canZoomOut();
}
@Override
public boolean zoomIn() {
+ checkThread();
return mAwContents.zoomIn();
}
@Override
public boolean zoomOut() {
+ checkThread();
return mAwContents.zoomOut();
}
@Override
public void dumpViewHierarchyWithProperties(BufferedWriter out, int level) {
+ checkThread();
UnimplementedWebViewApi.invoke();
}
@Override
public View findHierarchyView(String className, int hashCode) {
+ checkThread();
UnimplementedWebViewApi.invoke();
return null;
}
@@ -710,11 +795,13 @@ class WebViewChromium implements WebViewProvider,
@Override
public WebViewProvider.ViewDelegate getViewDelegate() {
+ checkThread();
return this;
}
@Override
public WebViewProvider.ScrollDelegate getScrollDelegate() {
+ checkThread();
return this;
}
@@ -725,26 +812,31 @@ class WebViewChromium implements WebViewProvider,
// ViewGroup.
// @Override
public boolean shouldDelayChildPressedState() {
+ checkThread();
return true;
}
// @Override
public AccessibilityNodeProvider getAccessibilityNodeProvider() {
+ checkThread();
return mAwContents.getAccessibilityNodeProvider();
}
@Override
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
+ checkThread();
mAwContents.onInitializeAccessibilityNodeInfo(info);
}
@Override
public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
+ checkThread();
mAwContents.onInitializeAccessibilityEvent(event);
}
@Override
public boolean performAccessibilityAction(int action, Bundle arguments) {
+ checkThread();
if (mAwContents.supportsAccessibilityAction(action)) {
return mAwContents.performAccessibilityAction(action, arguments);
}
@@ -753,6 +845,7 @@ class WebViewChromium implements WebViewProvider,
@Override
public void setOverScrollMode(int mode) {
+ checkThread();
// This gets called from the android.view.View c'tor that WebView inherits from. This
// causes the method to be called when mAwContents == null.
// It's safe to ignore these calls however since AwContents will read the current value of
@@ -764,12 +857,14 @@ class WebViewChromium implements WebViewProvider,
@Override
public void setScrollBarStyle(int style) {
+ checkThread();
mAwContents.setScrollBarStyle(style);
}
@Override
public void onDrawVerticalScrollBar(Canvas canvas, Drawable scrollBar,
int l, int t, int r, int b) {
+ checkThread();
// WebViewClassic was overriding this method to handle rubberband over-scroll. Since
// WebViewChromium doesn't support that the vanilla implementation of this method can be
// used.
@@ -778,21 +873,25 @@ class WebViewChromium implements WebViewProvider,
@Override
public void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
+ checkThread();
mAwContents.onContainerViewOverScrolled(scrollX, scrollY, clampedX, clampedY);
}
@Override
public void onWindowVisibilityChanged(int visibility) {
+ checkThread();
mAwContents.onWindowVisibilityChanged(visibility);
}
@Override
public void onDraw(Canvas canvas) {
+ checkThread();
mAwContents.onDraw(canvas);
}
@Override
public void setLayoutParams(ViewGroup.LayoutParams layoutParams) {
+ checkThread();
// TODO: This is the minimum implementation for HTMLViewer
// bringup. Likely will need to go up to ContentViewCore for
// a complete implementation.
@@ -801,43 +900,51 @@ class WebViewChromium implements WebViewProvider,
@Override
public boolean performLongClick() {
+ checkThread();
return mWebViewPrivate.super_performLongClick();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
+ checkThread();
mAwContents.onConfigurationChanged(newConfig);
}
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
+ checkThread();
return mAwContents.onCreateInputConnection(outAttrs);
}
@Override
public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) {
+ checkThread();
UnimplementedWebViewApi.invoke();
return false;
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
+ checkThread();
UnimplementedWebViewApi.invoke();
return false;
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
+ checkThread();
return mAwContents.onKeyUp(keyCode, event);
}
@Override
public void onAttachedToWindow() {
+ checkThread();
mAwContents.onAttachedToWindow();
}
@Override
public void onDetachedFromWindow() {
+ checkThread();
mAwContents.onDetachedFromWindow();
if (mGLfunctor != null) {
mGLfunctor.detach();
@@ -846,6 +953,7 @@ class WebViewChromium implements WebViewProvider,
@Override
public void onVisibilityChanged(View changedView, int visibility) {
+ checkThread();
// The AwContents will find out the container view visibility before the first draw so we
// can safely ignore onVisibilityChanged callbacks that happen before init().
if (mAwContents != null) {
@@ -855,11 +963,13 @@ class WebViewChromium implements WebViewProvider,
@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
+ checkThread();
mAwContents.onWindowFocusChanged(hasWindowFocus);
}
@Override
public void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
+ checkThread();
mAwContents.onFocusChanged(focused, direction, previouslyFocusedRect);
}
@@ -869,73 +979,87 @@ class WebViewChromium implements WebViewProvider,
// bringup. Likely will need to go up to AwContents for a complete
// implementation, e.g. setting the compositor visible region (to
// avoid painting tiles that are offscreen due to the view's position).
+ checkThread();
return mWebViewPrivate.super_setFrame(left, top, right, bottom);
}
@Override
public void onSizeChanged(int w, int h, int ow, int oh) {
+ checkThread();
mAwContents.onSizeChanged(w, h, ow, oh);
}
@Override
public void onScrollChanged(int l, int t, int oldl, int oldt) {
+ checkThread();
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
+ checkThread();
return mAwContents.dispatchKeyEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
+ checkThread();
return mAwContents.onTouchEvent(ev);
}
@Override
public boolean onHoverEvent(MotionEvent event) {
+ checkThread();
return mAwContents.onHoverEvent(event);
}
@Override
public boolean onGenericMotionEvent(MotionEvent event) {
+ checkThread();
return mAwContents.onGenericMotionEvent(event);
}
@Override
public boolean onTrackballEvent(MotionEvent ev) {
+ checkThread();
// Trackball event not handled, which eventually gets converted to DPAD keyevents
return false;
}
@Override
public boolean requestFocus(int direction, Rect previouslyFocusedRect) {
+ checkThread();
mAwContents.requestFocus();
return mWebViewPrivate.super_requestFocus(direction, previouslyFocusedRect);
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ checkThread();
mAwContents.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
public boolean requestChildRectangleOnScreen(View child, Rect rect, boolean immediate) {
+ checkThread();
UnimplementedWebViewApi.invoke();
return false;
}
@Override
public void setBackgroundColor(int color) {
+ checkThread();
mAwContents.setBackgroundColor(color);
}
@Override
public void setLayerType(int layerType, Paint paint) {
+ checkThread();
UnimplementedWebViewApi.invoke();
}
@Override
public void preDispatchDraw(Canvas canvas) {
+ checkThread();
// TODO(leandrogracia): remove this method from WebViewProvider if we think
// we won't need it again.
}
@@ -944,31 +1068,37 @@ class WebViewChromium implements WebViewProvider,
@Override
public int computeHorizontalScrollRange() {
+ checkThread();
return mAwContents.computeHorizontalScrollRange();
}
@Override
public int computeHorizontalScrollOffset() {
+ checkThread();
return mAwContents.computeHorizontalScrollOffset();
}
@Override
public int computeVerticalScrollRange() {
+ checkThread();
return mAwContents.computeVerticalScrollRange();
}
@Override
public int computeVerticalScrollOffset() {
+ checkThread();
return mAwContents.computeVerticalScrollOffset();
}
@Override
public int computeVerticalScrollExtent() {
+ checkThread();
return mAwContents.computeVerticalScrollExtent();
}
@Override
public void computeScroll() {
+ checkThread();
mAwContents.computeScroll();
}