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