| 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 8066da2c07fac086c255d3084dd2e76a86dafaec..10097b49d5821b637c743ef0392ccfd368b8fab3 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 @@
|
| /** Listens to gesture events fired by the ContentViewCore. */
|
| private GestureStateListener mGestureStateListener;
|
|
|
| - /** The parent view of the ContentView, NativePage's view and the InfoBarContainer. */
|
| - private FrameLayout mTabView;
|
| + /** The parent view of the ContentView and the InfoBarContainer. */
|
| + private FrameLayout mContentViewParent;
|
|
|
| /** 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 @@
|
| * This can be {@code null}, if the tab is frozen or being initialized or destroyed.
|
| */
|
| public View getView() {
|
| - return mTabView;
|
| + return mNativePage != null ? mNativePage.getView() : mContentViewParent;
|
| }
|
|
|
| /**
|
| @@ -1200,13 +1200,8 @@
|
| */
|
| private void showNativePage(NativePage nativePage) {
|
| if (mNativePage == nativePage) return;
|
| - destroyNativePage();
|
| + NativePage previousNativePage = mNativePage;
|
| 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
|
| @@ -1217,6 +1212,7 @@
|
| for (TabObserver observer : mObservers) {
|
| observer.onContentChanged(this);
|
| }
|
| + destroyNativePageInternal(previousNativePage);
|
| }
|
|
|
| /**
|
| @@ -1225,8 +1221,7 @@
|
| */
|
| public void freezeNativePage() {
|
| if (mNativePage == null || mNativePage instanceof FrozenNativePage) return;
|
| - assert mNativePage.getView().getWindowToken() == null : "Cannot freeze visible native page";
|
| - mTabView.removeView(mNativePage.getView());
|
| + assert mNativePage.getView().getParent() == null : "Cannot freeze visible native page";
|
| mNativePage = FrozenNativePage.freeze(mNativePage);
|
| }
|
|
|
| @@ -1237,9 +1232,10 @@
|
| updateTitle();
|
|
|
| if (mNativePage == null) return;
|
| - destroyNativePage();
|
| + NativePage previousNativePage = mNativePage;
|
| + mNativePage = null;
|
| for (TabObserver observer : mObservers) observer.onContentChanged(this);
|
| -
|
| + destroyNativePageInternal(previousNativePage);
|
| }
|
|
|
| /**
|
| @@ -1507,7 +1503,9 @@
|
| private void setContentViewCore(ContentViewCore cvc) {
|
| try {
|
| TraceEvent.begin("ChromeTab.setContentViewCore");
|
| - destroyNativePage();
|
| + NativePage previousNativePage = mNativePage;
|
| + mNativePage = null;
|
| + destroyNativePageInternal(previousNativePage);
|
|
|
| mContentViewCore = cvc;
|
| cvc.getContainerView().setOnHierarchyChangeListener(this);
|
| @@ -1518,12 +1516,12 @@
|
| // 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 (mTabView != null) {
|
| + if (mContentViewParent != null) {
|
| assert false;
|
| - mTabView.removeAllViews();
|
| - }
|
| - mTabView = new FrameLayout(mThemedApplicationContext);
|
| - mTabView.addView(cvc.getContainerView(),
|
| + mContentViewParent.removeAllViews();
|
| + }
|
| + mContentViewParent = new FrameLayout(mThemedApplicationContext);
|
| + mContentViewParent.addView(cvc.getContainerView(),
|
| new FrameLayout.LayoutParams(
|
| LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
|
|
|
| @@ -1547,9 +1545,9 @@
|
| // The InfoBarContainer needs to be created after the ContentView has been natively
|
| // initialized.
|
| mInfoBarContainer = new InfoBarContainer(
|
| - mThemedApplicationContext, getId(), mTabView, this);
|
| + mThemedApplicationContext, getId(), mContentViewParent, this);
|
| } else {
|
| - mInfoBarContainer.onParentViewChanged(getId(), mTabView);
|
| + mInfoBarContainer.onParentViewChanged(getId(), mContentViewParent);
|
| }
|
| mInfoBarContainer.setContentViewCore(mContentViewCore);
|
|
|
| @@ -1694,7 +1692,9 @@
|
| for (TabObserver observer : mObservers) observer.onDestroyed(this);
|
| mObservers.clear();
|
|
|
| - destroyNativePage();
|
| + NativePage currentNativePage = mNativePage;
|
| + mNativePage = null;
|
| + destroyNativePageInternal(currentNativePage);
|
| destroyContentViewCore(true);
|
|
|
| // Destroys the native tab after destroying the ContentView but before destroying the
|
| @@ -2013,12 +2013,11 @@
|
| mGroupedWithParent = groupedWithParent;
|
| }
|
|
|
| - private void destroyNativePage() {
|
| - if (mNativePage == null) return;
|
| -
|
| - mTabView.removeView(mNativePage.getView());
|
| - mNativePage.destroy();
|
| - mNativePage = null;
|
| + private void destroyNativePageInternal(NativePage nativePage) {
|
| + if (nativePage == null) return;
|
| + assert nativePage != mNativePage : "Attempting to destroy active page.";
|
| +
|
| + nativePage.destroy();
|
| }
|
|
|
| /**
|
| @@ -2050,7 +2049,7 @@
|
| mSwipeRefreshHandler.setContentViewCore(null);
|
| mSwipeRefreshHandler = null;
|
| }
|
| - mTabView = null;
|
| + mContentViewParent = null;
|
| mContentViewCore.destroy();
|
| mContentViewCore = null;
|
|
|
| @@ -2163,6 +2162,8 @@
|
| 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
|
| @@ -2172,6 +2173,7 @@
|
| mContentViewCore.onSizeChanged(originalWidth, originalHeight, 0, 0);
|
| mContentViewCore.onShow();
|
| mContentViewCore.attachImeAdapter();
|
| + destroyNativePageInternal(previousNativePage);
|
| mWebContentsObserver.didChangeThemeColor(
|
| getWebContents().getThemeColor(mDefaultThemeColor));
|
| for (TabObserver observer : mObservers) {
|
|
|