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 |