Commit 84760bf2 authored by Peter Kotwicz's avatar Peter Kotwicz Committed by Commit Bot

[Webapps Refactor] Make WebappIntentDataProvider#getIntent() more intuitive

This CL:
- Changes WebappIntentDataProvider#getIntent() to return intent
used to build WebappActivity instead of empty intent.
- Adds a test for return value of IntentHandler.shouldIgnoreIntent()
for webapp intents

BUG=985328

Change-Id: I2bfc7d136627c0fb982856e3cd95870a18dae343
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2208116Reviewed-by: default avatarYaron Friedman <yfriedman@chromium.org>
Reviewed-by: default avatarPeter Conn <peconn@chromium.org>
Commit-Queue: Peter Kotwicz <pkotwicz@chromium.org>
Cr-Commit-Position: refs/heads/master@{#770614}
parent 0588b2b2
......@@ -5,6 +5,7 @@
package org.chromium.chrome.browser.webapps;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
......@@ -79,9 +80,9 @@ public class WebApkHandlerDelegate {
// Pass non-null URL parameter so that {@link WebApkInfo#create()}
// return value is non-null
WebappInfo webApkInfo = WebappInfo.create(WebApkIntentDataProviderFactory.create(
packageInfo.packageName, "", ShortcutSource.UNKNOWN, false /* forceNavigation */,
false /* isSplashProvidedByWebApk */, null /* shareData */,
null /* shareDataActivityClassName */));
new Intent(), packageInfo.packageName, "", ShortcutSource.UNKNOWN,
false /* forceNavigation */, false /* isSplashProvidedByWebApk */,
null /* shareData */, null /* shareDataActivityClassName */));
if (webApkInfo == null) {
return;
}
......
......@@ -4,6 +4,7 @@
package org.chromium.chrome.browser.webapps;
import android.content.Intent;
import android.graphics.Bitmap;
import org.chromium.base.Callback;
......@@ -88,8 +89,9 @@ public class WebApkInstaller {
@Override
public void onWebappDataStorageRetrieved(WebappDataStorage storage) {
BrowserServicesIntentDataProvider intentDataProvider =
WebApkIntentDataProviderFactory.create(packageName, null,
source, false /* forceNavigation */,
WebApkIntentDataProviderFactory.create(new Intent(),
packageName, null, source,
false /* forceNavigation */,
false /* canUseSplashFromContentProvider */,
null /* shareData */,
null /* shareDataActivityClassName */);
......
......@@ -113,7 +113,7 @@ public class WebApkIntentDataProviderFactory {
boolean canUseSplashFromContentProvider = IntentUtils.safeGetBooleanExtra(
intent, WebApkConstants.EXTRA_SPLASH_PROVIDED_BY_WEBAPK, false);
return create(webApkPackageName, url, source, forceNavigation,
return create(intent, webApkPackageName, url, source, forceNavigation,
canUseSplashFromContentProvider, shareData, shareDataActivityClassName);
}
......@@ -200,6 +200,7 @@ public class WebApkIntentDataProviderFactory {
* Constructs a BrowserServicesIntentDataProvider from the passed in parameters and <meta-data>
* in the WebAPK's Android manifest.
*
* @param intent Intent used to launch activity.
* @param webApkPackageName The package name of the WebAPK.
* @param url Url that the WebAPK should navigate to when launched.
* @param source Source that the WebAPK was launched from.
......@@ -210,9 +211,10 @@ public class WebApkIntentDataProviderFactory {
* @param shareData Shared information from the share intent.
* @param shareDataActivityClassName Name of WebAPK activity which received share intent.
*/
public static BrowserServicesIntentDataProvider create(String webApkPackageName, String url,
int source, boolean forceNavigation, boolean canUseSplashFromContentProvider,
ShareData shareData, String shareDataActivityClassName) {
public static BrowserServicesIntentDataProvider create(Intent intent, String webApkPackageName,
String url, int source, boolean forceNavigation,
boolean canUseSplashFromContentProvider, ShareData shareData,
String shareDataActivityClassName) {
// Unlike non-WebAPK web apps, WebAPK ids are predictable. A malicious actor may send an
// intent with a valid start URL and arbitrary other data. Only use the start URL, the
// package name and the ShortcutSource from the launch intent and extract the remaining data
......@@ -322,7 +324,7 @@ public class WebApkIntentDataProviderFactory {
(canUseSplashFromContentProvider && Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
&& hasContentProviderForSplash(webApkPackageName));
return create(url, scope,
return create(intent, url, scope,
new WebappIcon(webApkPackageName,
isPrimaryIconMaskable ? primaryMaskableIconId : primaryIconId),
new WebappIcon(webApkPackageName, splashIconId), name, shortName, displayMode,
......@@ -335,6 +337,7 @@ public class WebApkIntentDataProviderFactory {
/**
* Construct a {@link BrowserServicesIntentDataProvider} instance.
* @param intent Intent used to launch activity.
* @param url URL that the WebAPK should navigate to when launched.
* @param scope Scope for the WebAPK.
* @param primaryIcon Primary icon to show for the WebAPK.
......@@ -369,7 +372,7 @@ public class WebApkIntentDataProviderFactory {
* @param shortcutItems A list of shortcut items.
* @param webApkVersionCode WebAPK's version code.
*/
public static BrowserServicesIntentDataProvider create(String url, String scope,
public static BrowserServicesIntentDataProvider create(Intent intent, String url, String scope,
WebappIcon primaryIcon, WebappIcon splashIcon, String name, String shortName,
@WebDisplayMode int displayMode, int orientation, int source, long themeColor,
long backgroundColor, int defaultBackgroundColor, boolean isPrimaryIconMaskable,
......@@ -416,7 +419,7 @@ public class WebApkIntentDataProviderFactory {
? (int) themeColor
: WebappIntentDataProvider.getDefaultToolbarColor();
return new WebappIntentDataProvider(
toolbarColor, hasCustomToolbarColor, shareData, webappExtras, webApkExtras);
intent, toolbarColor, hasCustomToolbarColor, shareData, webappExtras, webApkExtras);
}
private static int computeSource(Intent intent, ShareData shareData) {
......
......@@ -5,6 +5,7 @@
package org.chromium.chrome.browser.webapps;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.text.TextUtils;
......@@ -145,7 +146,7 @@ public class WebApkUpdateDataFetcher extends EmptyTabObserver {
int defaultBackgroundColor = SplashLayout.getDefaultBackgroundColor(appContext);
BrowserServicesIntentDataProvider intentDataProvider =
WebApkIntentDataProviderFactory.create(mOldInfo.url(), scopeUrl,
WebApkIntentDataProviderFactory.create(new Intent(), mOldInfo.url(), scopeUrl,
new WebappIcon(primaryIconBitmap), new WebappIcon(splashIconBitmap), name,
shortName, displayMode, orientation, mOldInfo.source(), themeColor,
backgroundColor, defaultBackgroundColor, isPrimaryIconMaskable,
......
......@@ -39,8 +39,10 @@ public class WebappIntentDataProvider extends BrowserServicesIntentDataProvider
return Color.WHITE;
}
WebappIntentDataProvider(int toolbarColor, boolean hasCustomToolbarColor, ShareData shareData,
WebappIntentDataProvider(@NonNull Intent intent, int toolbarColor,
boolean hasCustomToolbarColor, @Nullable ShareData shareData,
@NonNull WebappExtras webappExtras, @Nullable WebApkExtras webApkExtras) {
mIntent = intent;
mToolbarColor = toolbarColor;
mHasCustomToolbarColor = hasCustomToolbarColor;
mCloseButtonIcon = TintedDrawable.constructTintedDrawable(
......@@ -49,7 +51,6 @@ public class WebappIntentDataProvider extends BrowserServicesIntentDataProvider
mWebappExtras = webappExtras;
mWebApkExtras = webApkExtras;
mActivityType = (webApkExtras != null) ? ActivityType.WEB_APK : ActivityType.WEBAPP;
mIntent = new Intent();
}
@Override
......
......@@ -100,7 +100,7 @@ public class WebappIntentDataProviderFactory {
new WebappExtras(id, url, scope, new WebappIcon(icon, true /* isTrusted */), name,
shortName, displayMode, orientation, source, backgroundColor,
defaultBackgroundColor, isIconGenerated, isIconAdaptive, forceNavigation);
return new WebappIntentDataProvider(toolbarColor, hasValidToolbarColor,
return new WebappIntentDataProvider(intent, toolbarColor, hasValidToolbarColor,
null /* shareData */, webappExtras, null /* webApkExtras */);
}
}
......@@ -532,4 +532,21 @@ public class IntentHandlerTest {
Assert.assertFalse(
intent.getBooleanExtra(IntentHandler.EXTRA_OPEN_NEW_INCOGNITO_TAB, true));
}
/**
* Test that IntentHandler#shouldIgnoreIntent() returns false for Webapp launch intents.
*/
@Test
@SmallTest
@Feature({"Android-AppBase"})
public void testShouldIgnoreIntentWebapp() {
Intent webappLauncherActivityIntent =
WebappTestHelper.createMinimalWebappIntent("id", GOOGLE_URL);
WebappLauncherActivity.LaunchData launchData = new WebappLauncherActivity.LaunchData("id",
GOOGLE_URL, null /* webApkPackageName */, false /* isSplashProvidedByWebApk */);
Intent intent = WebappLauncherActivity.createIntentToLaunchForWebapp(
webappLauncherActivityIntent, launchData, 0);
Assert.assertFalse(mIntentHandler.shouldIgnoreIntent(intent));
}
}
......@@ -4,6 +4,7 @@
package org.chromium.chrome.browser.webapps;
import android.content.Intent;
import android.support.test.filters.MediumTest;
import org.junit.Assert;
......@@ -170,12 +171,12 @@ public class WebApkUpdateManagerTest {
WebappDataStorage storage =
WebappRegistry.getInstance().getWebappDataStorage(WEBAPK_ID);
BrowserServicesIntentDataProvider intentDataProvider =
WebApkIntentDataProviderFactory.create("", creationData.scope, null, null,
creationData.name, creationData.shortName, creationData.displayMode,
creationData.orientation, 0, creationData.themeColor,
creationData.backgroundColor, 0, creationData.isPrimaryIconMaskable,
false /* isSplashIconMaskable */, "",
WebApkVersion.REQUEST_UPDATE_FOR_SHELL_APK_VERSION,
WebApkIntentDataProviderFactory.create(new Intent(), "", creationData.scope,
null, null, creationData.name, creationData.shortName,
creationData.displayMode, creationData.orientation, 0,
creationData.themeColor, creationData.backgroundColor, 0,
creationData.isPrimaryIconMaskable, false /* isSplashIconMaskable */,
"", WebApkVersion.REQUEST_UPDATE_FOR_SHELL_APK_VERSION,
creationData.manifestUrl, creationData.startUrl,
WebApkDistributor.BROWSER, creationData.iconUrlToMurmur2HashMap, null,
false /* forceNavigation */, false /* isSplashProvidedByWebApk */,
......
......@@ -385,7 +385,7 @@ public class WebApkUpdateManagerUnitTest {
&& manifestData.shareTargetEncType.equals(
SHARE_TARGET_ENC_TYPE_MULTIPART),
manifestData.shareTargetFileNames, manifestData.shareTargetFileAccepts);
return WebApkIntentDataProviderFactory.create("", manifestData.scopeUrl,
return WebApkIntentDataProviderFactory.create(new Intent(), "", manifestData.scopeUrl,
new WebappIcon(manifestData.primaryIcon), null, manifestData.name,
manifestData.shortName, manifestData.displayMode, manifestData.orientation, -1,
manifestData.themeColor, manifestData.backgroundColor,
......
......@@ -4,6 +4,7 @@
package org.chromium.chrome.test.util.browser.webapps;
import android.content.Intent;
import android.graphics.Color;
import org.chromium.chrome.browser.ShortcutHelper;
......@@ -51,8 +52,8 @@ public class WebApkIntentDataProviderBuilder {
* Builds {@link BrowserServicesIntentDataProvider} object using options that have been set.
*/
public BrowserServicesIntentDataProvider build() {
return WebApkIntentDataProviderFactory.create(mUrl, mScope, null, null, null, null,
mDisplayMode, ScreenOrientationValues.DEFAULT, ShortcutSource.UNKNOWN,
return WebApkIntentDataProviderFactory.create(new Intent(), mUrl, mScope, null, null, null,
null, mDisplayMode, ScreenOrientationValues.DEFAULT, ShortcutSource.UNKNOWN,
ShortcutHelper.MANIFEST_COLOR_INVALID_OR_MISSING,
ShortcutHelper.MANIFEST_COLOR_INVALID_OR_MISSING, Color.WHITE,
false /* isPrimaryIconMaskable */, false /* isSplashIconMaskable */,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment