Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1527)

Unified Diff: chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandlerTest.java

Issue 2005053002: WebAPKs: Open links which are outside of WebAPK scope in Chrome not in WebAPK (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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) {

Powered by Google App Engine
This is Rietveld 408576698