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); |
+ } |
+} |