| Index: chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
|
| index 10097b49d5821b637c743ef0392ccfd368b8fab3..8066da2c07fac086c255d3084dd2e76a86dafaec 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
|
| @@ -182,8 +182,8 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener,
|
| /** Listens to gesture events fired by the ContentViewCore. */
|
| private GestureStateListener mGestureStateListener;
|
|
|
| - /** The parent view of the ContentView and the InfoBarContainer. */
|
| - private FrameLayout mContentViewParent;
|
| + /** The parent view of the ContentView, NativePage's view and the InfoBarContainer. */
|
| + private FrameLayout mTabView;
|
|
|
| /** A list of Tab observers. These are used to broadcast Tab events to listeners. */
|
| private final ObserverList<TabObserver> mObservers = new ObserverList<TabObserver>();
|
| @@ -780,7 +780,7 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener,
|
| * This can be {@code null}, if the tab is frozen or being initialized or destroyed.
|
| */
|
| public View getView() {
|
| - return mNativePage != null ? mNativePage.getView() : mContentViewParent;
|
| + return mTabView;
|
| }
|
|
|
| /**
|
| @@ -1200,8 +1200,13 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener,
|
| */
|
| private void showNativePage(NativePage nativePage) {
|
| if (mNativePage == nativePage) return;
|
| - NativePage previousNativePage = mNativePage;
|
| + destroyNativePage();
|
| mNativePage = nativePage;
|
| +
|
| + mTabView.addView(nativePage.getView(),
|
| + mTabView.indexOfChild(mContentViewCore.getContainerView()) + 1,
|
| + new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
|
| +
|
| pushNativePageStateToNavigationEntry();
|
| // Notifying of theme color change before content change because some of
|
| // the observers depend on the theme information being correct in
|
| @@ -1212,7 +1217,6 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener,
|
| for (TabObserver observer : mObservers) {
|
| observer.onContentChanged(this);
|
| }
|
| - destroyNativePageInternal(previousNativePage);
|
| }
|
|
|
| /**
|
| @@ -1221,7 +1225,8 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener,
|
| */
|
| public void freezeNativePage() {
|
| if (mNativePage == null || mNativePage instanceof FrozenNativePage) return;
|
| - assert mNativePage.getView().getParent() == null : "Cannot freeze visible native page";
|
| + assert mNativePage.getView().getWindowToken() == null : "Cannot freeze visible native page";
|
| + mTabView.removeView(mNativePage.getView());
|
| mNativePage = FrozenNativePage.freeze(mNativePage);
|
| }
|
|
|
| @@ -1232,10 +1237,9 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener,
|
| updateTitle();
|
|
|
| if (mNativePage == null) return;
|
| - NativePage previousNativePage = mNativePage;
|
| - mNativePage = null;
|
| + destroyNativePage();
|
| for (TabObserver observer : mObservers) observer.onContentChanged(this);
|
| - destroyNativePageInternal(previousNativePage);
|
| +
|
| }
|
|
|
| /**
|
| @@ -1503,9 +1507,7 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener,
|
| private void setContentViewCore(ContentViewCore cvc) {
|
| try {
|
| TraceEvent.begin("ChromeTab.setContentViewCore");
|
| - NativePage previousNativePage = mNativePage;
|
| - mNativePage = null;
|
| - destroyNativePageInternal(previousNativePage);
|
| + destroyNativePage();
|
|
|
| mContentViewCore = cvc;
|
| cvc.getContainerView().setOnHierarchyChangeListener(this);
|
| @@ -1516,12 +1518,12 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener,
|
| // ContentView -- causes problems since then the ContentView would contain both real
|
| // views (the infobars) and virtual views (the web page elements), which breaks Android
|
| // accessibility. http://crbug.com/416663
|
| - if (mContentViewParent != null) {
|
| + if (mTabView != null) {
|
| assert false;
|
| - mContentViewParent.removeAllViews();
|
| + mTabView.removeAllViews();
|
| }
|
| - mContentViewParent = new FrameLayout(mThemedApplicationContext);
|
| - mContentViewParent.addView(cvc.getContainerView(),
|
| + mTabView = new FrameLayout(mThemedApplicationContext);
|
| + mTabView.addView(cvc.getContainerView(),
|
| new FrameLayout.LayoutParams(
|
| LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
|
|
|
| @@ -1545,9 +1547,9 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener,
|
| // The InfoBarContainer needs to be created after the ContentView has been natively
|
| // initialized.
|
| mInfoBarContainer = new InfoBarContainer(
|
| - mThemedApplicationContext, getId(), mContentViewParent, this);
|
| + mThemedApplicationContext, getId(), mTabView, this);
|
| } else {
|
| - mInfoBarContainer.onParentViewChanged(getId(), mContentViewParent);
|
| + mInfoBarContainer.onParentViewChanged(getId(), mTabView);
|
| }
|
| mInfoBarContainer.setContentViewCore(mContentViewCore);
|
|
|
| @@ -1692,9 +1694,7 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener,
|
| for (TabObserver observer : mObservers) observer.onDestroyed(this);
|
| mObservers.clear();
|
|
|
| - NativePage currentNativePage = mNativePage;
|
| - mNativePage = null;
|
| - destroyNativePageInternal(currentNativePage);
|
| + destroyNativePage();
|
| destroyContentViewCore(true);
|
|
|
| // Destroys the native tab after destroying the ContentView but before destroying the
|
| @@ -2013,11 +2013,12 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener,
|
| mGroupedWithParent = groupedWithParent;
|
| }
|
|
|
| - private void destroyNativePageInternal(NativePage nativePage) {
|
| - if (nativePage == null) return;
|
| - assert nativePage != mNativePage : "Attempting to destroy active page.";
|
| + private void destroyNativePage() {
|
| + if (mNativePage == null) return;
|
|
|
| - nativePage.destroy();
|
| + mTabView.removeView(mNativePage.getView());
|
| + mNativePage.destroy();
|
| + mNativePage = null;
|
| }
|
|
|
| /**
|
| @@ -2049,7 +2050,7 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener,
|
| mSwipeRefreshHandler.setContentViewCore(null);
|
| mSwipeRefreshHandler = null;
|
| }
|
| - mContentViewParent = null;
|
| + mTabView = null;
|
| mContentViewCore.destroy();
|
| mContentViewCore = null;
|
|
|
| @@ -2162,8 +2163,6 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener,
|
| mContentViewCore.onHide();
|
| }
|
| destroyContentViewCore(deleteOldNativeWebContents);
|
| - NativePage previousNativePage = mNativePage;
|
| - mNativePage = null;
|
| setContentViewCore(newContentViewCore);
|
| // Size of the new ContentViewCore is zero at this point. If we don't call onSizeChanged(),
|
| // next onShow() call would send a resize message with the current ContentViewCore size
|
| @@ -2173,7 +2172,6 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener,
|
| mContentViewCore.onSizeChanged(originalWidth, originalHeight, 0, 0);
|
| mContentViewCore.onShow();
|
| mContentViewCore.attachImeAdapter();
|
| - destroyNativePageInternal(previousNativePage);
|
| mWebContentsObserver.didChangeThemeColor(
|
| getWebContents().getThemeColor(mDefaultThemeColor));
|
| for (TabObserver observer : mObservers) {
|
|
|