Commit fa28f35b authored by Colin Blundell's avatar Colin Blundell Committed by Commit Bot

[WebLayer] Reset infobar container visibility on navigation

This CL has InfoBarContainer reset itself to being visible when a
navigation commits. This is an adaptation of Chrome's behavior: in
Chrome some features hide the infobar container, which should always be
undone on navigation. While no feature in WebLayer yet does this, it is
good to have this defensive behavior in place so that any such added
features don't end up inadvertently hiding the infobar container
"forever" in a given tab.

Bug: 1093846
Change-Id: I9ead10a1be0b670d8b3f14c195657e60a4a43f20
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2254022
Commit-Queue: Colin Blundell <blundell@chromium.org>
Reviewed-by: default avatarScott Violet <sky@chromium.org>
Cr-Commit-Position: refs/heads/master@{#781743}
parent 67c64155
...@@ -137,4 +137,22 @@ public class InfoBarTest { ...@@ -137,4 +137,22 @@ public class InfoBarTest {
Assert.assertEquals(infoBarContainerView.getParent(), null); Assert.assertEquals(infoBarContainerView.getParent(), null);
} }
@Test
@SmallTest
/**
* Tests that if the infobar container view is hidden, its visibility is restored on navigation.
*
*/
public void testVisibilityRestoredOnNavigation() throws Exception {
View infoBarContainerView = getInfoBarContainerView();
Assert.assertEquals(infoBarContainerView.getVisibility(), View.VISIBLE);
TestThreadUtils.runOnUiThreadBlocking(
() -> { infoBarContainerView.setVisibility(View.GONE); });
Assert.assertEquals(infoBarContainerView.getVisibility(), View.GONE);
mActivityTestRule.navigateAndWait("about:blank");
Assert.assertEquals(infoBarContainerView.getVisibility(), View.VISIBLE);
}
} }
...@@ -16,7 +16,9 @@ import org.chromium.base.annotations.CalledByNative; ...@@ -16,7 +16,9 @@ import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods; import org.chromium.base.annotations.NativeMethods;
import org.chromium.chrome.browser.infobar.InfoBarIdentifier; import org.chromium.chrome.browser.infobar.InfoBarIdentifier;
import org.chromium.content_public.browser.NavigationHandle;
import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContents;
import org.chromium.content_public.browser.WebContentsObserver;
import org.chromium.ui.KeyboardVisibilityDelegate.KeyboardVisibilityListener; import org.chromium.ui.KeyboardVisibilityDelegate.KeyboardVisibilityListener;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -87,8 +89,21 @@ public class InfoBarContainer implements KeyboardVisibilityListener, InfoBar.Con ...@@ -87,8 +89,21 @@ public class InfoBarContainer implements KeyboardVisibilityListener, InfoBar.Con
void onInfoBarContainerShownRatioChanged(InfoBarContainer container, float shownRatio); void onInfoBarContainerShownRatioChanged(InfoBarContainer container, float shownRatio);
} }
// TODO(crbug.com/1025620): Observe WebContents to reset the state of the InfoBarContainer when /**
// the user navigates, a la //chrome's observing of Tab here. * Resets the visibility of the InfoBarContainer when the user navigates, following Chrome's
* behavior. In particular in Chrome some features hide the infobar container. This hiding is
* always on a per-URL basis that should be undone on navigation. While no feature in WebLayer
* yet does this, we put this * defensive behavior in place so that any such added features
* don't end up inadvertently hiding the infobar container "forever" in a given tab.
*/
private final WebContentsObserver mWebContentsObserver = new WebContentsObserver() {
@Override
public void didFinishNavigation(NavigationHandle navigation) {
if (navigation.hasCommitted() && navigation.isInMainFrame()) {
setHidden(false);
}
}
};
public void onTabDidGainActive() { public void onTabDidGainActive() {
initializeContainerView(mTab.getBrowser().getContext()); initializeContainerView(mTab.getBrowser().getContext());
...@@ -152,6 +167,7 @@ public class InfoBarContainer implements KeyboardVisibilityListener, InfoBar.Con ...@@ -152,6 +167,7 @@ public class InfoBarContainer implements KeyboardVisibilityListener, InfoBar.Con
InfoBarContainer(TabImpl tab) { InfoBarContainer(TabImpl tab) {
mTab = tab; mTab = tab;
mTab.getWebContents().addObserver(mWebContentsObserver);
// Chromium's InfoBarContainer may add an InfoBar immediately during this initialization // Chromium's InfoBarContainer may add an InfoBar immediately during this initialization
// call, so make sure everything in the InfoBarContainer is completely ready beforehand. // call, so make sure everything in the InfoBarContainer is completely ready beforehand.
...@@ -287,6 +303,7 @@ public class InfoBarContainer implements KeyboardVisibilityListener, InfoBar.Con ...@@ -287,6 +303,7 @@ public class InfoBarContainer implements KeyboardVisibilityListener, InfoBar.Con
} }
public void destroy() { public void destroy() {
mTab.getWebContents().removeObserver(mWebContentsObserver);
if (mInfoBarContainerView != null) destroyContainerView(); if (mInfoBarContainerView != null) destroyContainerView();
if (mNativeInfoBarContainer != 0) { if (mNativeInfoBarContainer != 0) {
InfoBarContainerJni.get().destroy(mNativeInfoBarContainer, InfoBarContainer.this); InfoBarContainerJni.get().destroy(mNativeInfoBarContainer, InfoBarContainer.this);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment