diff options
author | boliu@chromium.org <boliu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-15 20:27:57 +0000 |
---|---|---|
committer | boliu@chromium.org <boliu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-15 20:27:57 +0000 |
commit | 2dc4a1bd1906b3065b1141a10bad26be3f33ac4e (patch) | |
tree | 8d29ade7e2fbafb52ad2e42d337e51dca9f5db9b /android_webview/java | |
parent | 1b83432467491b596f800bd623da8e3975c8d77f (diff) | |
download | chromium_src-2dc4a1bd1906b3065b1141a10bad26be3f33ac4e.zip chromium_src-2dc4a1bd1906b3065b1141a10bad26be3f33ac4e.tar.gz chromium_src-2dc4a1bd1906b3065b1141a10bad26be3f33ac4e.tar.bz2 |
[Android WebView] Fix view state for popups
We did not correctly call onAttachedToWindow on a pop up
webview. This caused InProcessViewRenderer to unnecessarily
fallback to software mode.
Take this opportunity to properly clean up the pop up flow
to properly clean up the existing mContentViewCore and
mNativeAwContents.
BUG=
NOTRY=true
Review URL: https://chromiumcodereview.appspot.com/19141002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@211678 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'android_webview/java')
-rw-r--r-- | android_webview/java/src/org/chromium/android_webview/AwContents.java | 48 |
1 files changed, 37 insertions, 11 deletions
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 61257ea..d0f7733 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwContents.java +++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java @@ -149,6 +149,7 @@ public class AwContents { private boolean mIsPaused; private boolean mIsVisible; // Equivalent to windowVisible && viewVisible && !mIsPaused. + private boolean mIsAttachedToWindow; private Bitmap mFavicon; private boolean mHasRequestedVisitedHistoryFromClient; // TODO(boliu): This should be in a global context, not per webview. @@ -536,14 +537,29 @@ public class AwContents { // Recap: supplyContentsForPopup() is called on the parent window's content, this method is // called on the popup window's content. private void receivePopupContents(int popupNativeAwContents) { + // Save existing view state. + final boolean wasAttached = mIsAttachedToWindow; + final boolean wasVisible = getContainerViewVisible(); + final boolean wasPaused = mIsPaused; + final boolean wasFocused = mWindowFocused; + + // Properly clean up existing mContentViewCore and mNativeAwContents. + if (wasFocused) onWindowFocusChanged(false); + if (wasVisible) setVisibilityInternal(false); + // TODO(boliu): This may destroy GL resources outside of functor. + if (wasAttached) onDetachedFromWindow(); + if (!wasPaused) onPause(); + setNewAwContents(popupNativeAwContents); - // Finally refresh view size and visibility, to poke new values into ContentViewCore. + // Finally refresh all view state for mContentViewCore and mNativeAwContents. + if (!wasPaused) onResume(); + if (wasAttached) onAttachedToWindow(); mLastGlobalVisibleWidth = 0; mLastGlobalVisibleHeight = 0; onSizeChanged(mContainerView.getWidth(), mContainerView.getHeight(), 0, 0); - updateVisibilityStateForced(); - onWindowFocusChanged(mWindowFocused); + if (wasVisible) setVisibilityInternal(true); + if (wasFocused) onWindowFocusChanged(true); } public void destroy() { @@ -924,6 +940,7 @@ public class AwContents { public void onPause() { mIsPaused = true; updateVisibilityState(); + mContentViewCore.onActivityPause(); } /** @@ -932,6 +949,9 @@ public class AwContents { public void onResume() { mIsPaused = false; updateVisibilityState(); + // Not calling mContentViewCore.onActivityResume because it is the same + // as onShow, but we do not want to call onShow yet, since AwContents + // visibility depends on other things. TODO(boliu): Clean this up. } /** @@ -1207,8 +1227,11 @@ public class AwContents { /** * @see android.view.View#onAttachedToWindow() + * + * Note that this is also called from receivePopupContents. */ public void onAttachedToWindow() { + mIsAttachedToWindow = true; if (mScrollChangeListener == null) { mScrollChangeListener = new ScrollChangeListener(); } @@ -1228,6 +1251,7 @@ public class AwContents { * @see android.view.View#onDetachedFromWindow() */ public void onDetachedFromWindow() { + mIsAttachedToWindow = false; if (mNativeAwContents != 0) { nativeOnDetachedFromWindow(mNativeAwContents); } @@ -1283,21 +1307,23 @@ public class AwContents { } private void updateVisibilityState() { - doUpdateVisibilityState(false); - } + boolean visible = getContainerViewVisible(); + if (mIsVisible == visible) return; - private void updateVisibilityStateForced() { - doUpdateVisibilityState(true); + setVisibilityInternal(visible); } - private void doUpdateVisibilityState(boolean forced) { - if (mNativeAwContents == 0) return; + private boolean getContainerViewVisible() { boolean windowVisible = mContainerView.getWindowVisibility() == View.VISIBLE; boolean viewVisible = mContainerView.getVisibility() == View.VISIBLE; - boolean visible = windowVisible && viewVisible && !mIsPaused; - if (mIsVisible == visible && !forced) return; + return windowVisible && viewVisible && !mIsPaused; + } + private void setVisibilityInternal(boolean visible) { + // Note that this skips mIsVisible check and unconditionally sets + // visibility. In general, callers should use updateVisibilityState + // instead. mIsVisible = visible; if (mIsVisible) { mContentViewCore.onShow(); |