Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2039)

Unified Diff: android_webview/java/src/org/chromium/android_webview/AwContents.java

Issue 581423002: [aw] Ensure that WebView APIs do not crash if called after destruction. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix findbugs warning. Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: android_webview/java/src/org/chromium/android_webview/AwContents.java
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java
index a4d1119e32cdfbe30ec222a74c9a11ade37e1302..b67a0c30f1e490a7102d654291a565f5cf83b2d6 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwContents.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java
@@ -251,6 +251,10 @@ public class AwContents {
// when in this state.
private boolean mTemporarilyDetached;
+ // True when this AwContents has been destroyed.
+ // Do not use directly, call isDestroyed() instead.
+ private boolean mIsDestroyed = false;
+
private static final class DestroyRunnable implements Runnable {
private final long mNativeAwContents;
private DestroyRunnable(long nativeAwContents) {
@@ -453,8 +457,7 @@ public class AwContents {
@Override
public void scrollNativeTo(int x, int y) {
- if (mNativeAwContents == 0) return;
- nativeScrollTo(mNativeAwContents, x, y);
+ if (!isDestroyed()) nativeScrollTo(mNativeAwContents, x, y);
}
@Override
@@ -511,7 +514,7 @@ public class AwContents {
private class AwComponentCallbacks implements ComponentCallbacks2 {
@Override
public void onTrimMemory(final int level) {
- if (mNativeAwContents == 0) return;
+ if (isDestroyed()) return;
boolean visibleRectEmpty = getGlobalVisibleRect().isEmpty();
final boolean visible = mIsViewVisible && mIsWindowVisible && !visibleRectEmpty;
nativeTrimMemory(mNativeAwContents, level, visible);
@@ -591,6 +594,7 @@ public class AwContents {
@Override
public void onGestureZoomSupportChanged(
boolean supportsDoubleTapZoom, boolean supportsMultiTouchZoom) {
+ if (isDestroyed()) return;
mContentViewCore.updateDoubleTapSupport(supportsDoubleTapZoom);
mContentViewCore.updateMultiTouchZoomSupport(supportsMultiTouchZoom);
}
@@ -636,10 +640,12 @@ public class AwContents {
/**
* Transitions this {@link AwContents} to fullscreen mode and returns the
- * {@link View} where the contents will be drawn while in fullscreen.
+ * {@link View} where the contents will be drawn while in fullscreen, or null
+ * if this AwContents has already been destroyed.
*/
View enterFullScreen() {
assert !isFullScreen();
+ if (isDestroyed()) return null;
// Detach to tear down the GL functor if this is still associated with the old
// container view. It will be recreated during the next call to onDraw attached to
@@ -666,7 +672,7 @@ public class AwContents {
* in the WebView.
*/
void exitFullScreen() {
- if (!isFullScreen())
+ if (!isFullScreen() || isDestroyed())
// exitFullScreen() can be called without a prior call to enterFullScreen() if a
// "misbehave" app overrides onShowCustomView but does not add the custom view to
// the window. Exiting avoids a crash.
@@ -747,7 +753,7 @@ public class AwContents {
*/
private void setNewAwContents(long newAwContentsPtr) {
if (mNativeAwContents != 0) {
- destroy();
+ destroyNatives();
mContentViewCore = null;
mWebContents = null;
mNavigationController = null;
@@ -864,9 +870,17 @@ public class AwContents {
}
/**
- * Deletes the native counterpart of this object.
+ * Destroys this object and deletes its native counterpart.
*/
public void destroy() {
+ mIsDestroyed = true;
+ destroyNatives();
+ }
+
+ /**
+ * Deletes the native counterpart of this object.
+ */
+ private void destroyNatives() {
if (mCleanupReference != null) {
assert mNativeAwContents != 0;
// If we are attached, we have to call native detach to clean up
@@ -875,21 +889,37 @@ public class AwContents {
nativeOnDetachedFromWindow(mNativeAwContents);
}
- // We explicitly do not null out the mContentViewCore reference here
- // because ContentViewCore already has code to deal with the case
- // methods are called on it after it's been destroyed, and other
- // code relies on AwContents.mContentViewCore to be non-null.
mContentViewCore.destroy();
+ mContentViewCore = null;
mNativeAwContents = 0;
+ mWebContents = null;
+ mNavigationController = null;
mCleanupReference.cleanupNow();
mCleanupReference = null;
}
- assert !mContentViewCore.isAlive();
+ assert mContentViewCore == null;
+ assert mWebContents == null;
+ assert mNavigationController == null;
assert mNativeAwContents == 0;
}
+ private boolean isDestroyed() {
+ if (mIsDestroyed) {
+ assert mContentViewCore == null;
+ assert mWebContents == null;
+ assert mNavigationController == null;
+ assert mNativeAwContents == 0;
+ } else {
+ assert mContentViewCore != null;
+ assert mWebContents != null;
+ assert mNavigationController != null;
+ assert mNativeAwContents != 0;
+ }
+ return mIsDestroyed;
+ }
+
@VisibleForTesting
public ContentViewCore getContentViewCore() {
return mContentViewCore;
@@ -911,10 +941,7 @@ public class AwContents {
}
public AwPdfExporter getPdfExporter() {
- // mNativeAwContents can be null, due to destroy().
- if (mNativeAwContents == 0) {
- return null;
- }
+ if (isDestroyed()) return null;
if (mAwPdfExporter == null) {
mAwPdfExporter = new AwPdfExporter(mContainerView);
nativeCreatePdfExporter(mNativeAwContents, mAwPdfExporter);
@@ -945,7 +972,7 @@ public class AwContents {
* to ensure backwards compatible behavior.
*/
public void disableJavascriptInterfacesInspection() {
- mContentViewCore.setAllowJavascriptInterfacesInspection(false);
+ if (!isDestroyed()) mContentViewCore.setAllowJavascriptInterfacesInspection(false);
}
/**
@@ -960,7 +987,7 @@ public class AwContents {
public long getAwDrawGLViewContext() {
// Only called during early construction, so client should not have had a chance to
// call destroy yet.
- assert mNativeAwContents != 0;
+ assert !isDestroyed();
// Using the native pointer as the returned viewContext. This is matched by the
// reinterpret_cast back to BrowserViewRenderer pointer in the native DrawGLFunction.
@@ -999,15 +1026,14 @@ public class AwContents {
}
public Picture capturePicture() {
- if (mNativeAwContents == 0) return null;
+ if (isDestroyed()) return null;
return new AwPicture(nativeCapturePicture(mNativeAwContents,
mScrollOffsetManager.computeHorizontalScrollRange(),
mScrollOffsetManager.computeVerticalScrollRange()));
}
public void clearView() {
- if (mNativeAwContents == 0) return;
- nativeClearView(mNativeAwContents);
+ if (!isDestroyed()) nativeClearView(mNativeAwContents);
}
/**
@@ -1016,7 +1042,7 @@ public class AwContents {
* @param invalidationOnly Flag to call back only on invalidation without providing a picture.
*/
public void enableOnNewPicture(boolean enabled, boolean invalidationOnly) {
- if (mNativeAwContents == 0) return;
+ if (isDestroyed()) return;
if (invalidationOnly) {
mPictureListenerContentProvider = null;
} else if (enabled && mPictureListenerContentProvider == null) {
@@ -1031,18 +1057,15 @@ public class AwContents {
}
public void findAllAsync(String searchString) {
- if (mNativeAwContents == 0) return;
- nativeFindAllAsync(mNativeAwContents, searchString);
+ if (!isDestroyed()) nativeFindAllAsync(mNativeAwContents, searchString);
}
public void findNext(boolean forward) {
- if (mNativeAwContents == 0) return;
- nativeFindNext(mNativeAwContents, forward);
+ if (!isDestroyed()) nativeFindNext(mNativeAwContents, forward);
}
public void clearMatches() {
- if (mNativeAwContents == 0) return;
- nativeClearMatches(mNativeAwContents);
+ if (!isDestroyed()) nativeClearMatches(mNativeAwContents);
}
/**
@@ -1064,8 +1087,7 @@ public class AwContents {
ThreadUtils.runOnUiThread(new Runnable() {
@Override
public void run() {
- if (mNativeAwContents == 0) return;
- nativeAddVisitedLinks(mNativeAwContents, value);
+ if (!isDestroyed()) nativeAddVisitedLinks(mNativeAwContents, value);
}
});
}
@@ -1081,6 +1103,8 @@ public class AwContents {
* @param params Parameters for this load.
*/
public void loadUrl(LoadUrlParams params) {
+ if (isDestroyed()) return;
+
if (params.getLoadUrlType() == LoadUrlParams.LOAD_TYPE_DATA &&
!params.isBaseUrlDataScheme()) {
// This allows data URLs with a non-data base URL access to file:///android_asset/ and
@@ -1119,10 +1143,8 @@ public class AwContents {
}
}
- if (mNativeAwContents != 0) {
- nativeSetExtraHeadersForUrl(
- mNativeAwContents, params.getUrl(), params.getExtraHttpRequestHeadersString());
- }
+ nativeSetExtraHeadersForUrl(
+ mNativeAwContents, params.getUrl(), params.getExtraHttpRequestHeadersString());
params.setExtraHeaders(new HashMap<String, String>());
mNavigationController.loadUrl(params);
@@ -1149,6 +1171,7 @@ public class AwContents {
* @return The URL of the current page or null if it's empty.
*/
public String getUrl() {
+ if (isDestroyed()) return null;
String url = mWebContents.getUrl();
if (url == null || url.trim().isEmpty()) return null;
return url;
@@ -1160,7 +1183,7 @@ public class AwContents {
public void setBackgroundColor(int color) {
mBaseBackgroundColor = color;
- if (mNativeAwContents != 0) nativeSetBackgroundColor(mNativeAwContents, color);
+ if (!isDestroyed()) nativeSetBackgroundColor(mNativeAwContents, color);
}
/**
@@ -1174,7 +1197,7 @@ public class AwContents {
// Do not ask the ContentViewCore for the background color, as it will always
// report white prior to initial navigation or post destruction, whereas we want
// to use the client supplied base value in those cases.
- if (mNativeAwContents == 0 || !mContentsClient.isCachedRendererBackgroundColorValid()) {
+ if (isDestroyed() || !mContentsClient.isCachedRendererBackgroundColorValid()) {
return mBaseBackgroundColor;
}
return mContentsClient.getCachedRendererBackgroundColor();
@@ -1192,7 +1215,7 @@ public class AwContents {
* @see ContentViewCore#getContentSettings()
*/
public ContentSettings getContentSettings() {
- return mContentViewCore.getContentSettings();
+ return isDestroyed() ? null : mContentViewCore.getContentSettings();
}
/**
@@ -1340,77 +1363,77 @@ public class AwContents {
* @see android.webkit.WebView#stopLoading()
*/
public void stopLoading() {
- mWebContents.stop();
+ if (!isDestroyed()) mWebContents.stop();
}
/**
* @see android.webkit.WebView#reload()
*/
public void reload() {
- mNavigationController.reload(true);
+ if (!isDestroyed()) mNavigationController.reload(true);
}
/**
* @see android.webkit.WebView#canGoBack()
*/
public boolean canGoBack() {
- return mNavigationController.canGoBack();
+ return isDestroyed() ? false : mNavigationController.canGoBack();
}
/**
* @see android.webkit.WebView#goBack()
*/
public void goBack() {
- mNavigationController.goBack();
+ if (!isDestroyed()) mNavigationController.goBack();
}
/**
* @see android.webkit.WebView#canGoForward()
*/
public boolean canGoForward() {
- return mNavigationController.canGoForward();
+ return isDestroyed() ? false : mNavigationController.canGoForward();
}
/**
* @see android.webkit.WebView#goForward()
*/
public void goForward() {
- mNavigationController.goForward();
+ if (!isDestroyed()) mNavigationController.goForward();
}
/**
* @see android.webkit.WebView#canGoBackOrForward(int)
*/
public boolean canGoBackOrForward(int steps) {
- return mNavigationController.canGoToOffset(steps);
+ return isDestroyed() ? false : mNavigationController.canGoToOffset(steps);
}
/**
* @see android.webkit.WebView#goBackOrForward(int)
*/
public void goBackOrForward(int steps) {
- mNavigationController.goToOffset(steps);
+ if (!isDestroyed()) mNavigationController.goToOffset(steps);
}
/**
* @see android.webkit.WebView#pauseTimers()
*/
public void pauseTimers() {
- ContentViewStatics.setWebKitSharedTimersSuspended(true);
+ if (!isDestroyed()) ContentViewStatics.setWebKitSharedTimersSuspended(true);
}
/**
* @see android.webkit.WebView#resumeTimers()
*/
public void resumeTimers() {
- ContentViewStatics.setWebKitSharedTimersSuspended(false);
+ if (!isDestroyed()) ContentViewStatics.setWebKitSharedTimersSuspended(false);
}
/**
* @see android.webkit.WebView#onPause()
*/
public void onPause() {
- if (mIsPaused || mNativeAwContents == 0) return;
+ if (mIsPaused || isDestroyed()) return;
mIsPaused = true;
nativeSetIsPaused(mNativeAwContents, mIsPaused);
}
@@ -1419,7 +1442,7 @@ public class AwContents {
* @see android.webkit.WebView#onResume()
*/
public void onResume() {
- if (!mIsPaused || mNativeAwContents == 0) return;
+ if (!mIsPaused || isDestroyed()) return;
mIsPaused = false;
nativeSetIsPaused(mNativeAwContents, mIsPaused);
}
@@ -1459,13 +1482,11 @@ public class AwContents {
* @param includeDiskFiles if false, only the RAM cache is cleared
*/
public void clearCache(boolean includeDiskFiles) {
- if (mNativeAwContents == 0) return;
- nativeClearCache(mNativeAwContents, includeDiskFiles);
+ if (!isDestroyed()) nativeClearCache(mNativeAwContents, includeDiskFiles);
}
public void documentHasImages(Message message) {
- if (mNativeAwContents == 0) return;
- nativeDocumentHasImages(mNativeAwContents, message);
+ if (!isDestroyed()) nativeDocumentHasImages(mNativeAwContents, message);
}
public void saveWebArchive(
@@ -1490,6 +1511,7 @@ public class AwContents {
}
public String getOriginalUrl() {
+ if (isDestroyed()) return null;
NavigationHistory history = mNavigationController.getNavigationHistory();
int currentIndex = history.getCurrentEntryIndex();
if (currentIndex >= 0 && currentIndex < history.getEntryCount()) {
@@ -1502,21 +1524,21 @@ public class AwContents {
* @see ContentViewCore#getNavigationHistory()
*/
public NavigationHistory getNavigationHistory() {
- return mNavigationController.getNavigationHistory();
+ return isDestroyed() ? null : mNavigationController.getNavigationHistory();
}
/**
* @see android.webkit.WebView#getTitle()
*/
public String getTitle() {
- return mWebContents.getTitle();
+ return isDestroyed() ? null : mWebContents.getTitle();
}
/**
* @see android.webkit.WebView#clearHistory()
*/
public void clearHistory() {
- mNavigationController.clearHistory();
+ if (!isDestroyed()) mNavigationController.clearHistory();
}
public String[] getHttpAuthUsernamePassword(String host, String realm) {
@@ -1534,15 +1556,15 @@ public class AwContents {
* @see android.webkit.WebView#getCertificate()
*/
public SslCertificate getCertificate() {
- if (mNativeAwContents == 0) return null;
- return SslUtil.getCertificateFromDerBytes(nativeGetCertificate(mNativeAwContents));
+ return isDestroyed() ? null
+ : SslUtil.getCertificateFromDerBytes(nativeGetCertificate(mNativeAwContents));
}
/**
* @see android.webkit.WebView#clearSslPreferences()
*/
public void clearSslPreferences() {
- mNavigationController.clearSslPreferences();
+ if (!isDestroyed()) mNavigationController.clearSslPreferences();
}
// TODO(sgurun) remove after this rolls in. To keep internal tree happy.
@@ -1555,7 +1577,7 @@ public class AwContents {
* garbage allocation on repeated calls.
*/
public HitTestData getLastHitTestResult() {
- if (mNativeAwContents == 0) return null;
+ if (isDestroyed()) return null;
nativeUpdateLastHitTestData(mNativeAwContents);
return mPossiblyStaleHitTestData;
}
@@ -1564,7 +1586,7 @@ public class AwContents {
* @see android.webkit.WebView#requestFocusNodeHref()
*/
public void requestFocusNodeHref(Message msg) {
- if (msg == null || mNativeAwContents == 0) return;
+ if (msg == null || isDestroyed()) return;
nativeUpdateLastHitTestData(mNativeAwContents);
Bundle data = msg.getData();
@@ -1583,7 +1605,7 @@ public class AwContents {
* @see android.webkit.WebView#requestImageRef()
*/
public void requestImageRef(Message msg) {
- if (msg == null || mNativeAwContents == 0) return;
+ if (msg == null || isDestroyed()) return;
nativeUpdateLastHitTestData(mNativeAwContents);
Bundle data = msg.getData();
@@ -1678,6 +1700,7 @@ public class AwContents {
// This method uses the term 'zoom' for legacy reasons, but relates
// to what chrome calls the 'page scale factor'.
public boolean zoomBy(float delta) {
+ if (isDestroyed()) return false;
if (delta < 0.01f || delta > 100.0f) {
throw new IllegalStateException("zoom delta value outside [0.01, 100] range.");
}
@@ -1688,14 +1711,14 @@ public class AwContents {
* @see android.webkit.WebView#invokeZoomPicker()
*/
public void invokeZoomPicker() {
- mContentViewCore.invokeZoomPicker();
+ if (!isDestroyed()) mContentViewCore.invokeZoomPicker();
}
/**
* @see android.webkit.WebView#preauthorizePermission(Uri, long)
*/
public void preauthorizePermission(Uri origin, long resources) {
- if (mNativeAwContents == 0) return;
+ if (isDestroyed()) return;
nativePreauthorizePermission(mNativeAwContents, origin.toString(), resources);
}
@@ -1703,6 +1726,7 @@ public class AwContents {
* @see ContentViewCore.evaluateJavaScript(String, JavaScriptCallback)
*/
public void evaluateJavaScript(String script, final ValueCallback<String> callback) {
+ if (isDestroyed()) return;
JavaScriptCallback jsCallback = null;
if (callback != null) {
jsCallback = new JavaScriptCallback() {
@@ -1718,7 +1742,7 @@ public class AwContents {
// TODO(boliu): Remove this once Android side no longer calls this.
public void evaluateJavaScriptEvenIfNotYetNavigated(String script) {
- mWebContents.evaluateJavaScript(script, null);
+ if (!isDestroyed()) mWebContents.evaluateJavaScript(script, null);
}
//--------------------------------------------------------------------------------------------
@@ -1743,7 +1767,7 @@ public class AwContents {
* @see android.view.View#onGenericMotionEvent()
*/
public boolean onGenericMotionEvent(MotionEvent event) {
- return mContentViewCore.onGenericMotionEvent(event);
+ return isDestroyed() ? false : mContentViewCore.onGenericMotionEvent(event);
}
/**
@@ -1822,14 +1846,12 @@ public class AwContents {
private void setViewVisibilityInternal(boolean visible) {
mIsViewVisible = visible;
- if (mNativeAwContents == 0) return;
- nativeSetViewVisibility(mNativeAwContents, mIsViewVisible);
+ if (!isDestroyed()) nativeSetViewVisibility(mNativeAwContents, mIsViewVisible);
}
private void setWindowVisibilityInternal(boolean visible) {
mIsWindowVisible = visible;
- if (mNativeAwContents == 0) return;
- nativeSetWindowVisibility(mNativeAwContents, mIsWindowVisible);
+ if (!isDestroyed()) nativeSetWindowVisibility(mNativeAwContents, mIsWindowVisible);
}
/**
@@ -1842,7 +1864,7 @@ public class AwContents {
* @return False if saving state failed.
*/
public boolean saveState(Bundle outState) {
- if (mNativeAwContents == 0 || outState == null) return false;
+ if (isDestroyed() || outState == null) return false;
byte[] state = nativeGetOpaqueState(mNativeAwContents);
if (state == null) return false;
@@ -1857,7 +1879,7 @@ public class AwContents {
* @return False if restoring state failed.
*/
public boolean restoreState(Bundle inState) {
- if (mNativeAwContents == 0 || inState == null) return false;
+ if (isDestroyed() || inState == null) return false;
byte[] state = inState.getByteArray(SAVE_RESTORE_STATE_KEY);
if (state == null) return false;
@@ -1878,6 +1900,7 @@ public class AwContents {
*/
public void addPossiblyUnsafeJavascriptInterface(Object object, String name,
Class<? extends Annotation> requiredAnnotation) {
+ if (isDestroyed()) return;
mContentViewCore.addPossiblyUnsafeJavascriptInterface(object, name, requiredAnnotation);
}
@@ -1885,7 +1908,7 @@ public class AwContents {
* @see android.webkit.WebView#removeJavascriptInterface(String)
*/
public void removeJavascriptInterface(String interfaceName) {
- mContentViewCore.removeJavascriptInterface(interfaceName);
+ if (!isDestroyed()) mContentViewCore.removeJavascriptInterface(interfaceName);
}
/**
@@ -1895,32 +1918,33 @@ public class AwContents {
* @return The AccessibilityNodeProvider, if available, or null otherwise.
*/
public AccessibilityNodeProvider getAccessibilityNodeProvider() {
- return mContentViewCore.getAccessibilityNodeProvider();
+ return isDestroyed() ? null : mContentViewCore.getAccessibilityNodeProvider();
}
/**
* @see android.webkit.WebView#onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo)
*/
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- mContentViewCore.onInitializeAccessibilityNodeInfo(info);
+ if (!isDestroyed()) mContentViewCore.onInitializeAccessibilityNodeInfo(info);
}
/**
* @see android.webkit.WebView#onInitializeAccessibilityEvent(AccessibilityEvent)
*/
public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- mContentViewCore.onInitializeAccessibilityEvent(event);
+ if (!isDestroyed()) mContentViewCore.onInitializeAccessibilityEvent(event);
}
public boolean supportsAccessibilityAction(int action) {
- return mContentViewCore.supportsAccessibilityAction(action);
+ return isDestroyed() ? false : mContentViewCore.supportsAccessibilityAction(action);
}
/**
* @see android.webkit.WebView#performAccessibilityAction(int, Bundle)
*/
public boolean performAccessibilityAction(int action, Bundle arguments) {
- return mContentViewCore.performAccessibilityAction(action, arguments);
+ return isDestroyed() ? false
+ : mContentViewCore.performAccessibilityAction(action, arguments);
}
/**
@@ -1933,8 +1957,7 @@ public class AwContents {
}
public void setNetworkAvailable(boolean networkUp) {
- if (mNativeAwContents == 0) return;
- nativeSetJsOnlineProperty(mNativeAwContents, networkUp);
+ if (!isDestroyed()) nativeSetJsOnlineProperty(mNativeAwContents, networkUp);
}
//--------------------------------------------------------------------------------------------
@@ -1985,7 +2008,7 @@ public class AwContents {
mBrowserContext.getGeolocationPermissions().deny(origin);
}
}
- if (mNativeAwContents == 0) return;
+ if (isDestroyed()) return;
nativeInvokeGeolocationCallback(mNativeAwContents, allow, origin);
}
});
@@ -1994,7 +2017,7 @@ public class AwContents {
@CalledByNative
private void onGeolocationPermissionsShowPrompt(String origin) {
- if (mNativeAwContents == 0) return;
+ if (isDestroyed()) return;
AwGeolocationPermissions permissions = mBrowserContext.getGeolocationPermissions();
// Reject if geoloaction is disabled, or the origin has a retained deny
if (!mSettings.getGeolocationEnabled()) {
@@ -2157,7 +2180,7 @@ public class AwContents {
}
private void saveWebArchiveInternal(String path, final ValueCallback<String> callback) {
- if (path == null || mNativeAwContents == 0) {
+ if (path == null || isDestroyed()) {
ThreadUtils.runOnUiThread(new Runnable() {
@Override
public void run() {
@@ -2204,11 +2227,11 @@ public class AwContents {
}
public void extractSmartClipData(int x, int y, int width, int height) {
- mContentViewCore.extractSmartClipData(x, y, width, height);
+ if (!isDestroyed()) mContentViewCore.extractSmartClipData(x, y, width, height);
}
public void setSmartClipDataListener(ContentViewCore.SmartClipDataListener listener) {
- mContentViewCore.setSmartClipDataListener(listener);
+ if (!isDestroyed()) mContentViewCore.setSmartClipDataListener(listener);
}
// --------------------------------------------------------------------------------------------
@@ -2224,7 +2247,7 @@ public class AwContents {
@Override
public void onDraw(Canvas canvas) {
- if (mNativeAwContents == 0) {
+ if (isDestroyed()) {
canvas.drawColor(getEffectiveBackgroundColor());
return;
}
@@ -2261,7 +2284,7 @@ public class AwContents {
@Override
public void requestFocus() {
- if (mNativeAwContents == 0) return;
+ if (isDestroyed()) return;
if (!mContainerView.isInTouchMode() && mSettings.shouldFocusFirstNode()) {
nativeFocusFirstNode(mNativeAwContents);
}
@@ -2282,16 +2305,17 @@ public class AwContents {
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
- return mContentViewCore.onCreateInputConnection(outAttrs);
+ return isDestroyed() ? null : mContentViewCore.onCreateInputConnection(outAttrs);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
- return mContentViewCore.onKeyUp(keyCode, event);
+ return isDestroyed() ? false : mContentViewCore.onKeyUp(keyCode, event);
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
+ if (isDestroyed()) return false;
if (isDpadEvent(event)) {
mSettings.setSpatialNavigationEnabled(true);
}
@@ -2314,8 +2338,7 @@ public class AwContents {
@Override
public boolean onTouchEvent(MotionEvent event) {
- if (mNativeAwContents == 0) return false;
-
+ if (isDestroyed()) return false;
if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
mSettings.setSpatialNavigationEnabled(false);
}
@@ -2349,22 +2372,22 @@ public class AwContents {
@Override
public boolean onHoverEvent(MotionEvent event) {
- return mContentViewCore.onHoverEvent(event);
+ return isDestroyed() ? false : mContentViewCore.onHoverEvent(event);
}
@Override
public boolean onGenericMotionEvent(MotionEvent event) {
- return mContentViewCore.onGenericMotionEvent(event);
+ return isDestroyed() ? false : mContentViewCore.onGenericMotionEvent(event);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
- mContentViewCore.onConfigurationChanged(newConfig);
+ if (!isDestroyed()) mContentViewCore.onConfigurationChanged(newConfig);
}
@Override
public void onAttachedToWindow() {
- if (mNativeAwContents == 0) return;
+ if (isDestroyed()) return;
if (mIsAttachedToWindow) {
Log.w(TAG, "onAttachedToWindow called when already attached. Ignoring");
return;
@@ -2383,15 +2406,14 @@ public class AwContents {
@Override
public void onDetachedFromWindow() {
+ if (isDestroyed()) return;
if (!mIsAttachedToWindow) {
Log.w(TAG, "onDetachedFromWindow called when already detached. Ignoring");
return;
}
mIsAttachedToWindow = false;
hideAutofillPopup();
- if (mNativeAwContents != 0) {
- nativeOnDetachedFromWindow(mNativeAwContents);
- }
+ nativeOnDetachedFromWindow(mNativeAwContents);
mContentViewCore.onDetachedFromWindow();
updateHardwareAcceleratedFeaturesToggle();
@@ -2407,19 +2429,21 @@ public class AwContents {
@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
+ if (isDestroyed()) return;
mWindowFocused = hasWindowFocus;
mContentViewCore.onWindowFocusChanged(hasWindowFocus);
}
@Override
public void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
+ if (isDestroyed()) return;
mContainerViewFocused = focused;
mContentViewCore.onFocusChanged(focused);
}
@Override
public void onSizeChanged(int w, int h, int ow, int oh) {
- if (mNativeAwContents == 0) return;
+ if (isDestroyed()) return;
mScrollOffsetManager.setContainerViewSize(w, h);
// The AwLayoutSizer needs to go first so that if we're in
// fixedLayoutSize mode the update

Powered by Google App Engine
This is Rietveld 408576698