| Index: chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappInterceptNavigationDelegate.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappInterceptNavigationDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappInterceptNavigationDelegate.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..3c54153460f568506551a79c266ae24429ee2772
|
| --- /dev/null
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappInterceptNavigationDelegate.java
|
| @@ -0,0 +1,53 @@
|
| +// Copyright 2017 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +package org.chromium.chrome.browser.webapps;
|
| +
|
| +import android.net.Uri;
|
| +import android.support.customtabs.CustomTabsIntent;
|
| +
|
| +import org.chromium.chrome.browser.tab.InterceptNavigationDelegateImpl;
|
| +import org.chromium.chrome.browser.tab.Tab;
|
| +import org.chromium.chrome.browser.util.UrlUtilities;
|
| +import org.chromium.components.navigation_interception.NavigationParams;
|
| +
|
| +/**
|
| + * Intercepts navigations made by the Web App and sends off-origin http(s) ones to a Custom Tab.
|
| + */
|
| +public class WebappInterceptNavigationDelegate extends InterceptNavigationDelegateImpl {
|
| + private final WebappActivity mActivity;
|
| +
|
| + public WebappInterceptNavigationDelegate(WebappActivity activity, Tab tab) {
|
| + super(tab);
|
| + this.mActivity = activity;
|
| + }
|
| +
|
| + @Override
|
| + public boolean shouldIgnoreNavigation(NavigationParams navigationParams) {
|
| + if (super.shouldIgnoreNavigation(navigationParams)) {
|
| + return true;
|
| + }
|
| +
|
| + if (UrlUtilities.isValidForIntentFallbackNavigation(navigationParams.url)
|
| + && isUrlOutsideWebappScope(mActivity.mWebappInfo, navigationParams.url)) {
|
| + CustomTabsIntent.Builder intentBuilder = new CustomTabsIntent.Builder();
|
| + intentBuilder.setShowTitle(true);
|
| + if (mActivity.mWebappInfo.hasValidThemeColor()) {
|
| + // Need to cast as themeColor is a long to contain possible error results.
|
| + intentBuilder.setToolbarColor((int) mActivity.mWebappInfo.themeColor());
|
| + }
|
| + CustomTabsIntent customTabIntent = intentBuilder.build();
|
| + customTabIntent.intent.setPackage(mActivity.getPackageName());
|
| + customTabIntent.launchUrl(mActivity, Uri.parse(navigationParams.url));
|
| + return true;
|
| + }
|
| +
|
| + return false;
|
| + }
|
| +
|
| + // Note that WebApks override this with a rule based on web manifest scope.
|
| + protected boolean isUrlOutsideWebappScope(WebappInfo info, String url) {
|
| + return !UrlUtilities.sameDomainOrHost(info.uri().toString(), url, true);
|
| + }
|
| +}
|
|
|