Index: chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java |
index d717db18818f48dd145458009e185dcdf135c7d4..c509fd0695204d53d0cffccbfce86c3d01859950 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java |
@@ -445,6 +445,18 @@ public class ExternalNavigationHandler { |
// to launch the WebAPK without showing the intent picker. |
String targetWebApkPackageName = |
mDelegate.findWebApkPackageName(resolvingInfos); |
+ |
+ // We can't rely on this falling through to startActivityIfNeeded and behaving |
+ // correctly for WebAPKs. This is because the target of the intent is the |
+ // WebApk's main activity but that's just a bouncer which will redirect to |
+ // WebApkActivity in chrome. To avoid bouncing indefinitely, don't override the |
+ // navigation if we are currently showing the WebApk |
+ // |params.webApkPackageName()| that we will redirect to. |
+ if (targetWebApkPackageName != null |
+ && targetWebApkPackageName.equals(params.webApkPackageName())) { |
+ return OverrideUrlLoadingResult.NO_OVERRIDE; |
+ } |
+ |
if (targetWebApkPackageName != null |
&& mDelegate.countSpecializedHandlers(resolvingInfos) == 1) { |
intent.setPackage(targetWebApkPackageName); |