Index: chrome/android/java/src/org/chromium/chrome/browser/Tab.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/Tab.java b/chrome/android/java/src/org/chromium/chrome/browser/Tab.java |
index 62eadf463a5e98643a3a149d64ec7592aa439b0e..59c6f1a499f53d88a9e2ae572404b775795c76ce 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/Tab.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/Tab.java |
@@ -142,6 +142,9 @@ public class Tab { |
/** {@link ContentViewCore} showing the current page, or {@code null} if the tab is frozen. */ |
private ContentViewCore mContentViewCore; |
+ /** 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>(); |
@@ -754,8 +757,7 @@ public class Tab { |
* This can be {@code null}, if the tab is frozen or being initialized or destroyed. |
*/ |
public View getView() { |
- return mNativePage != null ? mNativePage.getView() : |
- (mContentViewCore != null ? mContentViewCore.getContainerView() : null); |
+ return mNativePage != null ? mNativePage.getView() : mContentViewParent; |
} |
/** |
@@ -1285,6 +1287,18 @@ public class Tab { |
mContentViewCore = cvc; |
+ // Wrap the ContentView in a FrameLayout, which will contain both the ContentView and the |
+ // InfoBarContainer. The alternative -- placing the InfoBarContainer inside the 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) { |
+ assert false; |
+ mContentViewParent.removeAllViews(); |
+ } |
+ mContentViewParent = new FrameLayout(mContext); |
+ mContentViewParent.addView(cvc.getContainerView()); |
+ |
mWebContentsDelegate = createWebContentsDelegate(); |
mWebContentsObserver = new TabWebContentsObserver(mContentViewCore.getWebContents()); |
mVoiceSearchTabHelper = new VoiceSearchTabHelper(mContentViewCore.getWebContents()); |
@@ -1303,9 +1317,9 @@ public class Tab { |
// initialized. |
WebContents webContents = mContentViewCore.getWebContents(); |
mInfoBarContainer = new InfoBarContainer( |
- mContext, getId(), mContentViewCore.getContainerView(), webContents); |
+ mContext, getId(), mContentViewParent, webContents); |
} else { |
- mInfoBarContainer.onParentViewChanged(getId(), mContentViewCore.getContainerView()); |
+ mInfoBarContainer.onParentViewChanged(getId(), mContentViewParent); |
} |
if (AppBannerManager.isEnabled() && mAppBannerManager == null) { |
@@ -1696,9 +1710,8 @@ public class Tab { |
destroyContentViewCoreInternal(mContentViewCore); |
- if (mInfoBarContainer != null && mInfoBarContainer.getParent() != null) { |
- mInfoBarContainer.removeFromParentView(); |
- } |
+ mContentViewParent.removeAllViews(); |
+ mContentViewParent = null; |
mContentViewCore.destroy(); |
mContentViewCore = null; |