Commit fc9b7c38 authored by Jinsuk Kim's avatar Jinsuk Kim Committed by Commit Bot

Android: Handle links on interstitial pages in preview tab

This CL handles the following issues on interstitial pages.
1 - The links for privacy, support etc will be open with the preview tab.
2 - The link "Back to safety" will go to the previous page. If there
    is no previous page i.e. previous page is NPT, the preview tab
    will be closed.

The change works for overlay panel-based preview tab only.

Bug: 1014689
Change-Id: I8d16f344ee6d523fb22382a0a208a25dbe7229fe
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1890517
Commit-Queue: Jinsuk Kim <jinsukkim@chromium.org>
Reviewed-by: default avatarShakti Sahu <shaktisahu@chromium.org>
Reviewed-by: default avatarDonn Denman <donnd@chromium.org>
Cr-Commit-Position: refs/heads/master@{#711544}
parent 7bbb8b19
...@@ -23,9 +23,17 @@ public class OverlayContentDelegate { ...@@ -23,9 +23,17 @@ public class OverlayContentDelegate {
* Called when a page navigation results in an error page. * Called when a page navigation results in an error page.
* @param url The URL that caused the failure. * @param url The URL that caused the failure.
* @param isExternalUrl Whether the URL is different from the initially loaded URL. * @param isExternalUrl Whether the URL is different from the initially loaded URL.
* @param isFailure Whether the loaded page is an error page. * @param isFailure Whether the loaded page is a page with an error response.
* @param isError Whether the loaded page is an error (interstitial) page.
*/ */
public void onMainFrameNavigation(String url, boolean isExternalUrl, boolean isFailure) {} public void onMainFrameNavigation(
String url, boolean isExternalUrl, boolean isFailure, boolean isError) {}
/**
* Called when the URL is requested to be opened in a new tab.
* @param url The URL associated with this request.
*/
public void onOpenNewTabRequested(String url) {}
/** /**
* Called when a page title gets updated. * Called when a page title gets updated.
......
...@@ -76,7 +76,8 @@ public class OverlayPanel extends OverlayPanelAnimation implements ActivityState ...@@ -76,7 +76,8 @@ public class OverlayPanel extends OverlayPanelAnimation implements ActivityState
StateChangeReason.TAB_PROMOTION, StateChangeReason.CLICK, StateChangeReason.SWIPE, StateChangeReason.TAB_PROMOTION, StateChangeReason.CLICK, StateChangeReason.SWIPE,
StateChangeReason.FLING, StateChangeReason.OPTIN, StateChangeReason.OPTOUT, StateChangeReason.FLING, StateChangeReason.OPTIN, StateChangeReason.OPTOUT,
StateChangeReason.CLOSE_BUTTON, StateChangeReason.PANEL_SUPPRESS, StateChangeReason.CLOSE_BUTTON, StateChangeReason.PANEL_SUPPRESS,
StateChangeReason.PANEL_UNSUPPRESS, StateChangeReason.TAP_SUPPRESS}) StateChangeReason.PANEL_UNSUPPRESS, StateChangeReason.TAP_SUPPRESS,
StateChangeReason.NAVIGATION})
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
public @interface StateChangeReason { public @interface StateChangeReason {
int UNKNOWN = 0; int UNKNOWN = 0;
...@@ -100,8 +101,9 @@ public class OverlayPanel extends OverlayPanelAnimation implements ActivityState ...@@ -100,8 +101,9 @@ public class OverlayPanel extends OverlayPanelAnimation implements ActivityState
int PANEL_SUPPRESS = 18; int PANEL_SUPPRESS = 18;
int PANEL_UNSUPPRESS = 19; int PANEL_UNSUPPRESS = 19;
int TAP_SUPPRESS = 20; int TAP_SUPPRESS = 20;
int NAVIGATION = 21;
// Always update MAX_VALUE to match the last StateChangeReason in the list. // Always update MAX_VALUE to match the last StateChangeReason in the list.
int MAX_VALUE = 20; int MAX_VALUE = 21;
} }
/** The activity this panel is in. */ /** The activity this panel is in. */
......
...@@ -29,6 +29,7 @@ import org.chromium.content_public.browser.NavigationHandle; ...@@ -29,6 +29,7 @@ import org.chromium.content_public.browser.NavigationHandle;
import org.chromium.content_public.browser.RenderCoordinates; import org.chromium.content_public.browser.RenderCoordinates;
import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContents;
import org.chromium.content_public.browser.WebContentsObserver; import org.chromium.content_public.browser.WebContentsObserver;
import org.chromium.content_public.common.ResourceRequestBody;
import org.chromium.ui.base.ViewAndroidDelegate; import org.chromium.ui.base.ViewAndroidDelegate;
/** /**
...@@ -211,6 +212,12 @@ public class OverlayPanelContent { ...@@ -211,6 +212,12 @@ public class OverlayPanelContent {
return mIsFullscreen; return mIsFullscreen;
} }
@Override
public void openNewTab(String url, String extraHeaders, ResourceRequestBody postData,
int disposition, boolean isRendererInitiated) {
mContentDelegate.onOpenNewTabRequested(url);
}
@Override @Override
public int getTopControlsHeight() { public int getTopControlsHeight() {
return (int) (mBarHeightPx return (int) (mBarHeightPx
...@@ -360,7 +367,8 @@ public class OverlayPanelContent { ...@@ -360,7 +367,8 @@ public class OverlayPanelContent {
mIsProcessingPendingNavigation = false; mIsProcessingPendingNavigation = false;
mContentDelegate.onMainFrameNavigation(navigation.getUrl(), mContentDelegate.onMainFrameNavigation(navigation.getUrl(),
!TextUtils.equals(navigation.getUrl(), mLoadedUrl), !TextUtils.equals(navigation.getUrl(), mLoadedUrl),
isHttpFailureCode(navigation.httpStatusCode())); isHttpFailureCode(navigation.httpStatusCode()),
navigation.isErrorPage());
} }
} }
}; };
......
...@@ -26,6 +26,7 @@ import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost; ...@@ -26,6 +26,7 @@ import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost;
import org.chromium.chrome.browser.compositor.layouts.eventfilter.OverlayPanelEventFilter; import org.chromium.chrome.browser.compositor.layouts.eventfilter.OverlayPanelEventFilter;
import org.chromium.chrome.browser.compositor.scene_layer.EphemeralTabSceneLayer; import org.chromium.chrome.browser.compositor.scene_layer.EphemeralTabSceneLayer;
import org.chromium.chrome.browser.compositor.scene_layer.SceneOverlayLayer; import org.chromium.chrome.browser.compositor.scene_layer.SceneOverlayLayer;
import org.chromium.chrome.browser.ntp.NewTabPage;
import org.chromium.chrome.browser.ssl.SecurityStateModel; import org.chromium.chrome.browser.ssl.SecurityStateModel;
import org.chromium.chrome.browser.tab.SadTab; import org.chromium.chrome.browser.tab.SadTab;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
...@@ -133,9 +134,20 @@ public class EphemeralTabPanel extends OverlayPanel { ...@@ -133,9 +134,20 @@ public class EphemeralTabPanel extends OverlayPanel {
} }
private class EphemeralTabPanelContentDelegate extends OverlayContentDelegate { private class EphemeralTabPanelContentDelegate extends OverlayContentDelegate {
/** Whether the currently loaded page is an error (interstitial) page. */
private boolean mIsOnErrorPage;
@Override @Override
public void onMainFrameLoadStarted(String url, boolean isExternalUrl) { public void onMainFrameLoadStarted(String url, boolean isExternalUrl) {
if (TextUtils.equals(mUrl, url)) return; if (TextUtils.equals(mUrl, url)) return;
if (mIsOnErrorPage && NewTabPage.isNTPUrl(url)) {
// "Back to safety" on interstitial page leads to NTP.
// We just close the panel in response.
closePanel(StateChangeReason.NAVIGATION, true);
mUrl = null;
return;
}
mUrl = url; mUrl = url;
// Resets to default icon if favicon may need updating. // Resets to default icon if favicon may need updating.
...@@ -143,8 +155,13 @@ public class EphemeralTabPanel extends OverlayPanel { ...@@ -143,8 +155,13 @@ public class EphemeralTabPanel extends OverlayPanel {
} }
@Override @Override
public void onMainFrameNavigation(String url, boolean isExternalUrl, boolean isFailure) { public void onMainFrameNavigation(
String url, boolean isExternalUrl, boolean isFailure, boolean isError) {
// Force WebContents to be visible. URLs that are supposed to create a separate tab but
// ended up on the preview tab needs this.
getWebContents().onShow();
updateCaption(); updateCaption();
mIsOnErrorPage = isError;
} }
@Override @Override
...@@ -156,6 +173,13 @@ public class EphemeralTabPanel extends OverlayPanel { ...@@ -156,6 +173,13 @@ public class EphemeralTabPanel extends OverlayPanel {
public void onSSLStateUpdated() { public void onSSLStateUpdated() {
if (isNewLayout()) updateCaption(); if (isNewLayout()) updateCaption();
} }
@Override
public void onOpenNewTabRequested(String url) {
// We never open a new tab when navigating in an overlay.
loadUrlInPanel(url);
requestPanelShow(StateChangeReason.CLICK);
}
} }
@Override @Override
......
...@@ -991,7 +991,8 @@ public class ContextualSearchManager ...@@ -991,7 +991,8 @@ public class ContextualSearchManager
} }
@Override @Override
public void onMainFrameNavigation(String url, boolean isExternalUrl, boolean isFailure) { public void onMainFrameNavigation(
String url, boolean isExternalUrl, boolean isFailure, boolean isError) {
assert mSearchPanel != null; assert mSearchPanel != null;
if (isExternalUrl) { if (isExternalUrl) {
if (!ContextualSearchFieldTrial.getSwitch( if (!ContextualSearchFieldTrial.getSwitch(
......
...@@ -533,7 +533,7 @@ public class ContextualSearchManagerTest { ...@@ -533,7 +533,7 @@ public class ContextualSearchManagerTest {
*/ */
private void fakeContentViewDidNavigate(boolean isFailure) { private void fakeContentViewDidNavigate(boolean isFailure) {
String url = mFakeServer.getLoadedUrl(); String url = mFakeServer.getLoadedUrl();
mManager.getOverlayContentDelegate().onMainFrameNavigation(url, false, isFailure); mManager.getOverlayContentDelegate().onMainFrameNavigation(url, false, isFailure, false);
} }
/** /**
......
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