Commit 05ac5803 authored by Colin Blundell's avatar Colin Blundell Committed by Commit Bot

[WebLayer] Create and use ExternalNavigationParams

This CL takes a prepapatory step to WebLayer sharing Chrome's
ExternalNavigationHandler for launching external intents by creating
and populating the ExternalNavigationParams struct that gets passed
to the former class. I adapted the building of ExternalNavigationParams
in //chrome's
InterceptNavigationDelegateImpl.java:buildExternalNavigationParams() to
//weblayer, leaving notes in the code where we might need to refine
the calculation of some arguments over time.

This CL also changes //weblayer's ExternalNavigationHandler to take in
the params just so that the constructed object is used. There is no
behavioral change.

Bug: 1031465
Change-Id: If7135fcbfc9d369f2683208fde12725925156736
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2100974Reviewed-by: default avatarMichael Thiessen <mthiesse@chromium.org>
Commit-Queue: Colin Blundell <blundell@chromium.org>
Cr-Commit-Position: refs/heads/master@{#751051}
parent a545fa9a
...@@ -350,6 +350,7 @@ source_set("weblayer_lib_base") { ...@@ -350,6 +350,7 @@ source_set("weblayer_lib_base") {
"//components/embedder_support/android:util", "//components/embedder_support/android:util",
"//components/embedder_support/android:web_contents_delegate", "//components/embedder_support/android:web_contents_delegate",
"//components/embedder_support/android/metrics", "//components/embedder_support/android/metrics",
"//components/external_intents/android",
"//components/javascript_dialogs", "//components/javascript_dialogs",
"//components/metrics", "//components/metrics",
"//components/minidump_uploader", "//components/minidump_uploader",
......
...@@ -91,6 +91,7 @@ android_library("java") { ...@@ -91,6 +91,7 @@ android_library("java") {
"//components/embedder_support/android:util_java", "//components/embedder_support/android:util_java",
"//components/embedder_support/android:web_contents_delegate_java", "//components/embedder_support/android:web_contents_delegate_java",
"//components/embedder_support/android/metrics:java", "//components/embedder_support/android/metrics:java",
"//components/external_intents/android:java",
"//components/find_in_page/android:java", "//components/find_in_page/android:java",
"//components/javascript_dialogs/android:java", "//components/javascript_dialogs/android:java",
"//components/metrics:metrics_java", "//components/metrics:metrics_java",
......
include_rules = [ include_rules = [
"+components/browser_ui/util/android", "+components/browser_ui/util/android",
"+components/crash/android/java", "+components/crash/android/java",
"+components/external_intents",
"+components/minidump_uploader", "+components/minidump_uploader",
"+services/device/public/java/src/org/chromium/device/geolocation", "+services/device/public/java/src/org/chromium/device/geolocation",
] ]
...@@ -12,6 +12,7 @@ import android.provider.Browser; ...@@ -12,6 +12,7 @@ import android.provider.Browser;
import org.chromium.base.Log; import org.chromium.base.Log;
import org.chromium.components.embedder_support.util.UrlConstants; import org.chromium.components.embedder_support.util.UrlConstants;
import org.chromium.components.embedder_support.util.UrlUtilities; import org.chromium.components.embedder_support.util.UrlUtilities;
import org.chromium.components.external_intents.ExternalNavigationParams;
import org.chromium.content_public.common.ContentUrlConstants; import org.chromium.content_public.common.ContentUrlConstants;
import org.chromium.ui.base.PageTransition; import org.chromium.ui.base.PageTransition;
...@@ -57,8 +58,13 @@ public class ExternalNavigationHandler { ...@@ -57,8 +58,13 @@ public class ExternalNavigationHandler {
return true; return true;
} }
static boolean shouldOverrideUrlLoading(TabImpl tab, String url, boolean hasUserGesture, static boolean shouldOverrideUrlLoading(TabImpl tab, ExternalNavigationParams params) {
boolean isRedirect, boolean isMainFrame, int pageTransition) { String url = params.getUrl();
boolean hasUserGesture = params.hasUserGesture();
boolean isRedirect = params.isRedirect();
boolean isMainFrame = params.isMainFrame();
int pageTransition = params.getPageTransition();
if (UrlUtilities.isAcceptedScheme(url)) return false; if (UrlUtilities.isAcceptedScheme(url)) return false;
// A back-forward navigation should never trigger an intent. // A back-forward navigation should never trigger an intent.
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
package org.chromium.weblayer_private; package org.chromium.weblayer_private;
import org.chromium.base.annotations.NativeMethods; import org.chromium.base.annotations.NativeMethods;
import org.chromium.components.external_intents.ExternalNavigationParams;
import org.chromium.components.navigation_interception.InterceptNavigationDelegate; import org.chromium.components.navigation_interception.InterceptNavigationDelegate;
import org.chromium.components.navigation_interception.NavigationParams; import org.chromium.components.navigation_interception.NavigationParams;
import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContents;
...@@ -25,11 +26,46 @@ public class InterceptNavigationDelegateImpl implements InterceptNavigationDeleg ...@@ -25,11 +26,46 @@ public class InterceptNavigationDelegateImpl implements InterceptNavigationDeleg
this, mTab.getWebContents()); this, mTab.getWebContents());
} }
/**
* Returns ExternalNavigationParams.Builder to generate ExternalNavigationParams for
* ExternalNavigationHandler#shouldOverrideUrlLoading().
*/
private ExternalNavigationParams.Builder buildExternalNavigationParams(
NavigationParams navigationParams, boolean shouldCloseTab) {
return new ExternalNavigationParams
.Builder(navigationParams.url, mTab.getProfile().isIncognito(),
navigationParams.referrer, navigationParams.pageTransitionType,
navigationParams.isRedirect)
.setApplicationMustBeInForeground(true)
// NOTE: ExternalNavigationHandler.java supports the redirect handler being
// null, although WebLayer will likely eventually want one.
.setRedirectHandler(null)
.setOpenInNewTab(shouldCloseTab)
// TODO(crbug.com/1031465): See whether this needs to become more refined
// (cf. //chrome's setting of this field in its version of this method).
.setIsBackgroundTabNavigation(!mTab.isVisible())
.setIsMainFrame(navigationParams.isMainFrame)
.setHasUserGesture(navigationParams.hasUserGesture)
.setShouldCloseContentsOnOverrideUrlLoadingAndLaunchIntent(
shouldCloseTab && navigationParams.isMainFrame);
}
private boolean shouldCloseContentsOnOverrideUrlLoadingAndLaunchIntent() {
if (mTab.getWebContents() == null) return false;
if (!mTab.getWebContents().getNavigationController().canGoToOffset(0)) return true;
// TODO(crbug.com/1031465): Adapt the TabRedirectHandler-dependent check that //chrome's
// InterceptNavigationDelegateImpl.java does in its version of this method?
return false;
}
@Override @Override
public boolean shouldIgnoreNavigation(NavigationParams navigationParams) { public boolean shouldIgnoreNavigation(NavigationParams navigationParams) {
return ExternalNavigationHandler.shouldOverrideUrlLoading(mTab, navigationParams.url, boolean shouldCloseTab = shouldCloseContentsOnOverrideUrlLoadingAndLaunchIntent();
navigationParams.hasUserGesture, navigationParams.isRedirect, ExternalNavigationParams params =
navigationParams.isMainFrame, navigationParams.pageTransitionType); buildExternalNavigationParams(navigationParams, shouldCloseTab).build();
return ExternalNavigationHandler.shouldOverrideUrlLoading(mTab, params);
} }
@NativeMethods @NativeMethods
......
...@@ -257,8 +257,15 @@ public final class TabImpl extends ITab.Stub { ...@@ -257,8 +257,15 @@ public final class TabImpl extends ITab.Stub {
TabImplJni.get().setTopControlsContainerView(mNativeTab, TabImpl.this, 0); TabImplJni.get().setTopControlsContainerView(mNativeTab, TabImpl.this, 0);
} }
/**
* Returns whether this Tab is visible.
*/
public boolean isVisible() {
return (mBrowser.getActiveTab() == this && mBrowser.isStarted());
}
private void updateWebContentsVisibility() { private void updateWebContentsVisibility() {
boolean visibleNow = mBrowser.getActiveTab() == this && mBrowser.isStarted(); boolean visibleNow = isVisible();
boolean webContentsVisible = mWebContents.getVisibility() == Visibility.VISIBLE; boolean webContentsVisible = mWebContents.getVisibility() == Visibility.VISIBLE;
if (visibleNow) { if (visibleNow) {
if (!webContentsVisible) mWebContents.onShow(); if (!webContentsVisible) mWebContents.onShow();
......
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