Index: chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandlerTest.java |
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandlerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandlerTest.java |
index 7adab80b46b2bf8fe97c78ee93b28b2c20b2b8e8..ffab52ae8f389afbc8c99b4178f718c449cdebd1 100644 |
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandlerTest.java |
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandlerTest.java |
@@ -5,6 +5,7 @@ |
package org.chromium.chrome.browser.externalnav; |
import android.annotation.SuppressLint; |
+import android.content.ComponentName; |
import android.content.Context; |
import android.content.Intent; |
import android.content.pm.ActivityInfo; |
@@ -39,9 +40,10 @@ public class ExternalNavigationHandlerTest extends InstrumentationTestCase { |
// Expectations |
private static final int IGNORE = 0x0; |
private static final int START_INCOGNITO = 0x1; |
- private static final int START_ACTIVITY = 0x2; |
+ private static final int START_CHROME = 0x2; |
private static final int START_FILE = 0x4; |
- private static final int INTENT_SANITIZATION_EXCEPTION = 0x8; |
+ private static final int START_OTHER_ACTIVITY = 0x8; |
+ private static final int INTENT_SANITIZATION_EXCEPTION = 0x10; |
private static final String SEARCH_RESULT_URL_FOR_TOM_HANKS = |
"https://www.google.com/search?q=tom+hanks"; |
@@ -72,6 +74,9 @@ public class ExternalNavigationHandlerTest extends InstrumentationTestCase { |
private static final String TEXT_APP_1_PACKAGE_NAME = "text_app_1"; |
private static final String TEXT_APP_2_PACKAGE_NAME = "text_app_2"; |
+ private static final String WEB_APK_SCOPE = "https://www.template.com"; |
+ private static final String WEB_APK_PACKAGE_NAME = "org.chromium.webapk.template"; |
+ |
private final TestExternalNavigationDelegate mDelegate; |
private ExternalNavigationHandler mUrlHandler; |
@@ -104,7 +109,8 @@ public class ExternalNavigationHandlerTest extends InstrumentationTestCase { |
.expecting(OverrideUrlLoadingResult.NO_OVERRIDE, IGNORE); |
checkUrl("tel:012345678") |
.withReferrer("chrome://about") |
- .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, START_ACTIVITY); |
+ .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, |
+ START_OTHER_ACTIVITY); |
} |
@SmallTest |
@@ -123,11 +129,13 @@ public class ExternalNavigationHandlerTest extends InstrumentationTestCase { |
checkUrl("market://1234") |
.withPageTransition(PageTransition.FORM_SUBMIT) |
.withIsRedirect(true) |
- .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, START_ACTIVITY); |
+ .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, |
+ START_OTHER_ACTIVITY); |
checkUrl("http://youtube.com://") |
.withPageTransition(PageTransition.FORM_SUBMIT) |
.withIsRedirect(true) |
- .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, START_ACTIVITY); |
+ .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, |
+ START_OTHER_ACTIVITY); |
// If the page matches the referrer, then continue loading in Chrome. |
checkUrl("http://youtube.com://") |
@@ -141,7 +149,8 @@ public class ExternalNavigationHandlerTest extends InstrumentationTestCase { |
.withReferrer("http://google.com") |
.withPageTransition(PageTransition.FORM_SUBMIT) |
.withIsRedirect(true) |
- .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, START_ACTIVITY); |
+ .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, |
+ START_OTHER_ACTIVITY); |
// It doesn't make sense to allow intent picker without redirect, since form data |
// is not encoded in the intent (although, in theory, it could be passed in as |
@@ -182,10 +191,12 @@ public class ExternalNavigationHandlerTest extends InstrumentationTestCase { |
public void testPageTransitionType() { |
// Non-link page transition type are ignored. |
checkUrl("http://youtube.com/") |
- .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, START_ACTIVITY); |
+ .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, |
+ START_OTHER_ACTIVITY); |
checkUrl("http://youtube.com/") |
.withIsRedirect(true) |
- .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, START_ACTIVITY); |
+ .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, |
+ START_OTHER_ACTIVITY); |
// http://crbug.com/143118 - Don't show the picker for directly typed URLs, unless |
// the URL results in a redirect. |
@@ -205,7 +216,7 @@ public class ExternalNavigationHandlerTest extends InstrumentationTestCase { |
checkUrl("wtai://wp/mc;0123456789") |
.withIsIncognito(true) |
.expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, |
- START_ACTIVITY | INTENT_SANITIZATION_EXCEPTION); |
+ START_OTHER_ACTIVITY | INTENT_SANITIZATION_EXCEPTION); |
// These two cases are currently unimplemented. |
checkUrl("wtai://wp/sd;0123456789") |
@@ -224,7 +235,8 @@ public class ExternalNavigationHandlerTest extends InstrumentationTestCase { |
@SmallTest |
public void testExternalUri() { |
checkUrl("tel:012345678") |
- .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, START_ACTIVITY); |
+ .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, |
+ START_OTHER_ACTIVITY); |
} |
@SmallTest |
@@ -233,7 +245,8 @@ public class ExternalNavigationHandlerTest extends InstrumentationTestCase { |
checkUrl("market://1234") |
.withPageTransition(PageTransition.TYPED) |
.withIsRedirect(true) |
- .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, START_ACTIVITY); |
+ .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, |
+ START_OTHER_ACTIVITY); |
// http://crbug.com/143118 |
checkUrl("market://1234") |
@@ -254,7 +267,8 @@ public class ExternalNavigationHandlerTest extends InstrumentationTestCase { |
checkUrl("http://youtube.com/") |
.withPageTransition(transitionTypeIncomingIntent) |
.withIsRedirect(true) |
- .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, START_ACTIVITY); |
+ .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, |
+ START_OTHER_ACTIVITY); |
} |
@SmallTest |
@@ -264,12 +278,13 @@ public class ExternalNavigationHandlerTest extends InstrumentationTestCase { |
String urlWithSel = "intent:wtai://wp/#Intent;SEL;action=android.settings.SETTINGS;" |
+ "component=package/class;end"; |
- checkUrl(url) |
- .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, START_ACTIVITY); |
+ checkUrl(url).expecting( |
+ OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, START_OTHER_ACTIVITY); |
// http://crbug.com/370399 |
checkUrl(urlWithSel) |
- .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, START_ACTIVITY); |
+ .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, |
+ START_OTHER_ACTIVITY); |
} |
@SmallTest |
@@ -316,7 +331,8 @@ public class ExternalNavigationHandlerTest extends InstrumentationTestCase { |
.withPageTransition(transTypeLinkFromIntent) |
.withIsRedirect(true) |
.withRedirectHandler(redirectHandler) |
- .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, START_ACTIVITY); |
+ .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, |
+ START_OTHER_ACTIVITY); |
// Do not ignore if a new intent cannot be handled by Chrome. |
redirectHandler.updateIntent(fooIntent); |
@@ -326,7 +342,8 @@ public class ExternalNavigationHandlerTest extends InstrumentationTestCase { |
.withPageTransition(transTypeLinkFromIntent) |
.withIsRedirect(true) |
.withRedirectHandler(redirectHandler) |
- .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, START_ACTIVITY); |
+ .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, |
+ START_OTHER_ACTIVITY); |
} |
@SmallTest |
@@ -356,7 +373,8 @@ public class ExternalNavigationHandlerTest extends InstrumentationTestCase { |
.withPageTransition(transTypeLinkFromIntent) |
.withIsRedirect(true) |
.withRedirectHandler(redirectHandler) |
- .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, START_ACTIVITY); |
+ .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, |
+ START_OTHER_ACTIVITY); |
} |
@SmallTest |
@@ -366,7 +384,8 @@ public class ExternalNavigationHandlerTest extends InstrumentationTestCase { |
checkUrl(INTENT_URL_WITH_FALLBACK_URL) |
.withReferrer(SEARCH_RESULT_URL_FOR_TOM_HANKS) |
- .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, START_ACTIVITY); |
+ .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, |
+ START_OTHER_ACTIVITY); |
Intent invokedIntent = mDelegate.startActivityIntent; |
assertEquals(IMDB_APP_INTENT_FOR_TOM_HANKS, invokedIntent.getData().toString()); |
@@ -431,7 +450,8 @@ public class ExternalNavigationHandlerTest extends InstrumentationTestCase { |
checkUrl(INTENT_URL_WITH_JAVASCRIPT_FALLBACK_URL) |
.withReferrer(SEARCH_RESULT_URL_FOR_TOM_HANKS) |
.withIsIncognito(true) |
- .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, START_ACTIVITY); |
+ .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, |
+ START_OTHER_ACTIVITY); |
Intent invokedIntent = mDelegate.startActivityIntent; |
assertTrue(invokedIntent.getData().toString().startsWith("market://")); |
@@ -550,7 +570,8 @@ public class ExternalNavigationHandlerTest extends InstrumentationTestCase { |
mDelegate.setIsChromeAppInForeground(false); |
checkUrl("http://youtube.com/") |
.withChromeAppInForegroundRequired(false) |
- .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, START_ACTIVITY); |
+ .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, |
+ START_OTHER_ACTIVITY); |
} |
@SmallTest |
@@ -590,7 +611,8 @@ public class ExternalNavigationHandlerTest extends InstrumentationTestCase { |
public void testSameDomainDifferentApps() { |
checkUrl(CALENDAR_URL) |
.withReferrer(KEEP_URL) |
- .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, START_ACTIVITY); |
+ .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, |
+ START_OTHER_ACTIVITY); |
} |
@SmallTest |
@@ -615,7 +637,8 @@ public class ExternalNavigationHandlerTest extends InstrumentationTestCase { |
.withReferrer(referrer) |
.withPageTransition(PageTransition.FORM_SUBMIT) |
.withIsRedirect(true) |
- .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, START_ACTIVITY); |
+ .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, |
+ START_OTHER_ACTIVITY); |
assertEquals(Uri.parse(referrer), |
mDelegate.startActivityIntent.getParcelableExtra(Intent.EXTRA_REFERRER)); |
assertEquals(1, mDelegate.startActivityIntent.getIntExtra( |
@@ -694,7 +717,8 @@ public class ExternalNavigationHandlerTest extends InstrumentationTestCase { |
checkUrl("sms:+012345678?body=hello%20there") |
.withReferrer(referer) |
- .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, START_ACTIVITY); |
+ .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, |
+ START_OTHER_ACTIVITY); |
assertNotNull(mDelegate.startActivityIntent); |
assertEquals(TEXT_APP_2_PACKAGE_NAME, mDelegate.startActivityIntent.getPackage()); |
@@ -708,7 +732,8 @@ public class ExternalNavigationHandlerTest extends InstrumentationTestCase { |
checkUrl("sms:+012345678?body=hello%20there") |
.withReferrer(referer) |
- .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, START_ACTIVITY); |
+ .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, |
+ START_OTHER_ACTIVITY); |
assertNotNull(mDelegate.startActivityIntent); |
assertNull(mDelegate.startActivityIntent.getPackage()); |
@@ -721,12 +746,23 @@ public class ExternalNavigationHandlerTest extends InstrumentationTestCase { |
checkUrl("intent://012345678?body=hello%20there/#Intent;scheme=sms;end") |
.withReferrer(referer) |
- .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, START_ACTIVITY); |
+ .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, |
+ START_OTHER_ACTIVITY); |
assertNotNull(mDelegate.startActivityIntent); |
assertEquals(TEXT_APP_2_PACKAGE_NAME, mDelegate.startActivityIntent.getPackage()); |
} |
+ /** |
+ * Test that tapping on a link which is outside of the referrer Web APK's scope brings the |
+ * user back to Chrome. |
+ */ |
+ @SmallTest |
+ public void testLeaveWebApk_LinkOutOfScope() { |
+ checkUrl(SEARCH_RESULT_URL_FOR_TOM_HANKS) |
+ .withReferrerWebApkPackage(WEB_APK_PACKAGE_NAME) |
+ .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, START_CHROME); |
+ } |
private static ResolveInfo newResolveInfo(String packageName, String name) { |
ActivityInfo ai = new ActivityInfo(); |
@@ -756,22 +792,25 @@ public class ExternalNavigationHandlerTest extends InstrumentationTestCase { |
return list; |
} |
} |
- if (intent.getDataString().startsWith("http://") |
- || intent.getDataString().startsWith("https://")) { |
+ String dataString = intent.getDataString(); |
+ if (dataString.startsWith("http://") |
+ || dataString.startsWith("https://")) { |
list.add(newResolveInfo("chrome", "chrome")); |
} |
- if (intent.getDataString().startsWith("http://m.youtube.com") |
- || intent.getDataString().startsWith("http://youtube.com")) { |
+ if (dataString.startsWith("http://m.youtube.com") |
+ || dataString.startsWith("http://youtube.com")) { |
list.add(newResolveInfo("youtube", "youtube")); |
- } else if (intent.getDataString().startsWith(PLUS_STREAM_URL)) { |
+ } else if (dataString.startsWith(PLUS_STREAM_URL)) { |
list.add(newResolveInfo("plus", "plus")); |
- } else if (intent.getDataString().startsWith(CALENDAR_URL)) { |
+ } else if (dataString.startsWith(CALENDAR_URL)) { |
list.add(newResolveInfo("calendar", "calendar")); |
- } else if (intent.getDataString().startsWith("sms")) { |
+ } else if (dataString.startsWith("sms")) { |
list.add(newResolveInfo( |
TEXT_APP_1_PACKAGE_NAME, TEXT_APP_1_PACKAGE_NAME + ".cls")); |
list.add(newResolveInfo( |
TEXT_APP_2_PACKAGE_NAME, TEXT_APP_2_PACKAGE_NAME + ".cls")); |
+ } else if (dataString.startsWith(WEB_APK_SCOPE)) { |
+ list.add(newResolveInfo(WEB_APK_PACKAGE_NAME, WEB_APK_PACKAGE_NAME)); |
} else { |
list.add(newResolveInfo("foo", "foo")); |
} |
@@ -787,7 +826,8 @@ public class ExternalNavigationHandlerTest extends InstrumentationTestCase { |
public boolean isSpecializedHandlerAvailable(List<ResolveInfo> resolveInfos) { |
for (ResolveInfo resolveInfo : resolveInfos) { |
String packageName = resolveInfo.activityInfo.packageName; |
- if (packageName.equals("youtube") || packageName.equals("calendar")) { |
+ if (packageName.equals("youtube") || packageName.equals("calendar") |
+ || packageName.equals(WEB_APK_PACKAGE_NAME)) { |
return true; |
} |
} |
@@ -795,7 +835,12 @@ public class ExternalNavigationHandlerTest extends InstrumentationTestCase { |
} |
@Override |
- public String getPackageName() { |
+ public String getWebApkPackageName() { |
+ return mReferrerWebApkPackage; |
+ } |
+ |
+ @Override |
+ public String getBrowserPackageName() { |
return "test"; |
} |
@@ -852,6 +897,13 @@ public class ExternalNavigationHandlerTest extends InstrumentationTestCase { |
} |
@Override |
+ public void startChromeActivity(String url) { |
+ Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); |
+ intent.setClassName(getBrowserPackageName(), ""); |
+ startActivity(intent); |
+ } |
+ |
+ @Override |
public String getDefaultSmsPackageName() { |
return defaultSmsPackageName; |
} |
@@ -878,6 +930,10 @@ public class ExternalNavigationHandlerTest extends InstrumentationTestCase { |
mIsChromeAppInForeground = value; |
} |
+ public void setReferrerWebApkPackage(String referrerWebApkPackage) { |
+ mReferrerWebApkPackage = referrerWebApkPackage; |
+ } |
+ |
public Intent startActivityIntent = null; |
public boolean startIncognitoIntentCalled = false; |
@@ -888,6 +944,8 @@ public class ExternalNavigationHandlerTest extends InstrumentationTestCase { |
private String mReferrerUrlForClobbering; |
public boolean mIsChromeAppInForeground = true; |
+ private String mReferrerWebApkPackage = null; |
+ |
public boolean shouldRequestFileAccess; |
public boolean startFileIntentCalled; |
public String defaultSmsPackageName; |
@@ -914,12 +972,19 @@ public class ExternalNavigationHandlerTest extends InstrumentationTestCase { |
private boolean mChromeAppInForegroundRequired = true; |
private boolean mIsBackgroundTabNavigation; |
private boolean mHasUserGesture; |
+ private String mReferrerWebApkPackage = null; |
private TabRedirectHandler mRedirectHandler; |
private ExternalNavigationTestParams(String url) { |
mUrl = url; |
} |
+ public ExternalNavigationTestParams withReferrerWebApkPackage( |
+ String referrerWebApkPackage) { |
+ mReferrerWebApkPackage = referrerWebApkPackage; |
+ return this; |
+ } |
+ |
public ExternalNavigationTestParams withReferrer(String referrerUrl) { |
mReferrerUrl = referrerUrl; |
return this; |
@@ -965,11 +1030,16 @@ public class ExternalNavigationHandlerTest extends InstrumentationTestCase { |
public void expecting(OverrideUrlLoadingResult expectedOverrideResult, |
int otherExpectation) { |
boolean expectStartIncognito = (otherExpectation & START_INCOGNITO) != 0; |
- boolean expectStartActivity = (otherExpectation & START_ACTIVITY) != 0; |
+ boolean expectStartActivity = |
+ (otherExpectation & (START_CHROME | START_OTHER_ACTIVITY)) != 0; |
+ boolean expectStartChrome = (otherExpectation & START_CHROME) != 0; |
+ boolean expectStartOtherActivity = (otherExpectation & START_OTHER_ACTIVITY) != 0; |
boolean expectStartFile = (otherExpectation & START_FILE) != 0; |
- boolean expectSaneIntent = (otherExpectation & INTENT_SANITIZATION_EXCEPTION) == 0; |
+ boolean expectSaneIntent = expectStartOtherActivity |
+ && (otherExpectation & INTENT_SANITIZATION_EXCEPTION) == 0; |
mDelegate.reset(); |
+ mDelegate.setReferrerWebApkPackage(mReferrerWebApkPackage); |
ExternalNavigationParams params = new ExternalNavigationParams.Builder( |
mUrl, mIsIncognito, mReferrerUrl, |
@@ -981,11 +1051,23 @@ public class ExternalNavigationHandlerTest extends InstrumentationTestCase { |
.setHasUserGesture(mHasUserGesture) |
.build(); |
OverrideUrlLoadingResult result = mUrlHandler.shouldOverrideUrlLoading(params); |
- boolean startActivityCalled = mDelegate.startActivityIntent != null; |
+ boolean startActivityCalled = false; |
+ boolean startChromeCalled = false; |
+ if (mDelegate.startActivityIntent != null) { |
+ startActivityCalled = true; |
+ ComponentName component = mDelegate.startActivityIntent.getComponent(); |
+ if (component != null) { |
+ String packageName = component.getPackageName(); |
+ if (packageName != null) { |
+ startChromeCalled = packageName.equals(mDelegate.getBrowserPackageName()); |
+ } |
+ } |
+ } |
assertEquals(expectedOverrideResult, result); |
assertEquals(expectStartIncognito, mDelegate.startIncognitoIntentCalled); |
assertEquals(expectStartActivity, startActivityCalled); |
+ assertEquals(expectStartChrome, startChromeCalled); |
assertEquals(expectStartFile, mDelegate.startFileIntentCalled); |
if (startActivityCalled && expectSaneIntent) { |