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 @@ ...@@ -5,6 +5,7 @@
package org.chromium.chrome.browser.webapps; package org.chromium.chrome.browser.webapps;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
...@@ -79,9 +80,9 @@ public class WebApkHandlerDelegate { ...@@ -79,9 +80,9 @@ public class WebApkHandlerDelegate {
// Pass non-null URL parameter so that {@link WebApkInfo#create()} // Pass non-null URL parameter so that {@link WebApkInfo#create()}
// return value is non-null // return value is non-null
WebappInfo webApkInfo = WebappInfo.create(WebApkIntentDataProviderFactory.create( WebappInfo webApkInfo = WebappInfo.create(WebApkIntentDataProviderFactory.create(
packageInfo.packageName, "", ShortcutSource.UNKNOWN, false /* forceNavigation */, new Intent(), packageInfo.packageName, "", ShortcutSource.UNKNOWN,
false /* isSplashProvidedByWebApk */, null /* shareData */, false /* forceNavigation */, false /* isSplashProvidedByWebApk */,
null /* shareDataActivityClassName */)); null /* shareData */, null /* shareDataActivityClassName */));
if (webApkInfo == null) { if (webApkInfo == null) {
return; return;
} }
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
package org.chromium.chrome.browser.webapps; package org.chromium.chrome.browser.webapps;
import android.content.Intent;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import org.chromium.base.Callback; import org.chromium.base.Callback;
...@@ -88,8 +89,9 @@ public class WebApkInstaller { ...@@ -88,8 +89,9 @@ public class WebApkInstaller {
@Override @Override
public void onWebappDataStorageRetrieved(WebappDataStorage storage) { public void onWebappDataStorageRetrieved(WebappDataStorage storage) {
BrowserServicesIntentDataProvider intentDataProvider = BrowserServicesIntentDataProvider intentDataProvider =
WebApkIntentDataProviderFactory.create(packageName, null, WebApkIntentDataProviderFactory.create(new Intent(),
source, false /* forceNavigation */, packageName, null, source,
false /* forceNavigation */,
false /* canUseSplashFromContentProvider */, false /* canUseSplashFromContentProvider */,
null /* shareData */, null /* shareData */,
null /* shareDataActivityClassName */); null /* shareDataActivityClassName */);
......
...@@ -113,7 +113,7 @@ public class WebApkIntentDataProviderFactory { ...@@ -113,7 +113,7 @@ public class WebApkIntentDataProviderFactory {
boolean canUseSplashFromContentProvider = IntentUtils.safeGetBooleanExtra( boolean canUseSplashFromContentProvider = IntentUtils.safeGetBooleanExtra(
intent, WebApkConstants.EXTRA_SPLASH_PROVIDED_BY_WEBAPK, false); intent, WebApkConstants.EXTRA_SPLASH_PROVIDED_BY_WEBAPK, false);
return create(webApkPackageName, url, source, forceNavigation, return create(intent, webApkPackageName, url, source, forceNavigation,
canUseSplashFromContentProvider, shareData, shareDataActivityClassName); canUseSplashFromContentProvider, shareData, shareDataActivityClassName);
} }
...@@ -200,6 +200,7 @@ public class WebApkIntentDataProviderFactory { ...@@ -200,6 +200,7 @@ public class WebApkIntentDataProviderFactory {
* Constructs a BrowserServicesIntentDataProvider from the passed in parameters and <meta-data> * Constructs a BrowserServicesIntentDataProvider from the passed in parameters and <meta-data>
* in the WebAPK's Android manifest. * in the WebAPK's Android manifest.
* *
* @param intent Intent used to launch activity.
* @param webApkPackageName The package name of the WebAPK. * @param webApkPackageName The package name of the WebAPK.
* @param url Url that the WebAPK should navigate to when launched. * @param url Url that the WebAPK should navigate to when launched.
* @param source Source that the WebAPK was launched from. * @param source Source that the WebAPK was launched from.
...@@ -210,9 +211,10 @@ public class WebApkIntentDataProviderFactory { ...@@ -210,9 +211,10 @@ public class WebApkIntentDataProviderFactory {
* @param shareData Shared information from the share intent. * @param shareData Shared information from the share intent.
* @param shareDataActivityClassName Name of WebAPK activity which received share intent. * @param shareDataActivityClassName Name of WebAPK activity which received share intent.
*/ */
public static BrowserServicesIntentDataProvider create(String webApkPackageName, String url, public static BrowserServicesIntentDataProvider create(Intent intent, String webApkPackageName,
int source, boolean forceNavigation, boolean canUseSplashFromContentProvider, String url, int source, boolean forceNavigation,
ShareData shareData, String shareDataActivityClassName) { boolean canUseSplashFromContentProvider, ShareData shareData,
String shareDataActivityClassName) {
// Unlike non-WebAPK web apps, WebAPK ids are predictable. A malicious actor may send an // 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 // 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 // package name and the ShortcutSource from the launch intent and extract the remaining data
...@@ -322,7 +324,7 @@ public class WebApkIntentDataProviderFactory { ...@@ -322,7 +324,7 @@ public class WebApkIntentDataProviderFactory {
(canUseSplashFromContentProvider && Build.VERSION.SDK_INT >= Build.VERSION_CODES.N (canUseSplashFromContentProvider && Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
&& hasContentProviderForSplash(webApkPackageName)); && hasContentProviderForSplash(webApkPackageName));
return create(url, scope, return create(intent, url, scope,
new WebappIcon(webApkPackageName, new WebappIcon(webApkPackageName,
isPrimaryIconMaskable ? primaryMaskableIconId : primaryIconId), isPrimaryIconMaskable ? primaryMaskableIconId : primaryIconId),
new WebappIcon(webApkPackageName, splashIconId), name, shortName, displayMode, new WebappIcon(webApkPackageName, splashIconId), name, shortName, displayMode,
...@@ -335,6 +337,7 @@ public class WebApkIntentDataProviderFactory { ...@@ -335,6 +337,7 @@ public class WebApkIntentDataProviderFactory {
/** /**
* Construct a {@link BrowserServicesIntentDataProvider} instance. * Construct a {@link BrowserServicesIntentDataProvider} instance.
* @param intent Intent used to launch activity.
* @param url URL that the WebAPK should navigate to when launched. * @param url URL that the WebAPK should navigate to when launched.
* @param scope Scope for the WebAPK. * @param scope Scope for the WebAPK.
* @param primaryIcon Primary icon to show for the WebAPK. * @param primaryIcon Primary icon to show for the WebAPK.
...@@ -369,7 +372,7 @@ public class WebApkIntentDataProviderFactory { ...@@ -369,7 +372,7 @@ public class WebApkIntentDataProviderFactory {
* @param shortcutItems A list of shortcut items. * @param shortcutItems A list of shortcut items.
* @param webApkVersionCode WebAPK's version code. * @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, WebappIcon primaryIcon, WebappIcon splashIcon, String name, String shortName,
@WebDisplayMode int displayMode, int orientation, int source, long themeColor, @WebDisplayMode int displayMode, int orientation, int source, long themeColor,
long backgroundColor, int defaultBackgroundColor, boolean isPrimaryIconMaskable, long backgroundColor, int defaultBackgroundColor, boolean isPrimaryIconMaskable,
...@@ -416,7 +419,7 @@ public class WebApkIntentDataProviderFactory { ...@@ -416,7 +419,7 @@ public class WebApkIntentDataProviderFactory {
? (int) themeColor ? (int) themeColor
: WebappIntentDataProvider.getDefaultToolbarColor(); : WebappIntentDataProvider.getDefaultToolbarColor();
return new WebappIntentDataProvider( return new WebappIntentDataProvider(
toolbarColor, hasCustomToolbarColor, shareData, webappExtras, webApkExtras); intent, toolbarColor, hasCustomToolbarColor, shareData, webappExtras, webApkExtras);
} }
private static int computeSource(Intent intent, ShareData shareData) { private static int computeSource(Intent intent, ShareData shareData) {
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
package org.chromium.chrome.browser.webapps; package org.chromium.chrome.browser.webapps;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.text.TextUtils; import android.text.TextUtils;
...@@ -145,7 +146,7 @@ public class WebApkUpdateDataFetcher extends EmptyTabObserver { ...@@ -145,7 +146,7 @@ public class WebApkUpdateDataFetcher extends EmptyTabObserver {
int defaultBackgroundColor = SplashLayout.getDefaultBackgroundColor(appContext); int defaultBackgroundColor = SplashLayout.getDefaultBackgroundColor(appContext);
BrowserServicesIntentDataProvider intentDataProvider = BrowserServicesIntentDataProvider intentDataProvider =
WebApkIntentDataProviderFactory.create(mOldInfo.url(), scopeUrl, WebApkIntentDataProviderFactory.create(new Intent(), mOldInfo.url(), scopeUrl,
new WebappIcon(primaryIconBitmap), new WebappIcon(splashIconBitmap), name, new WebappIcon(primaryIconBitmap), new WebappIcon(splashIconBitmap), name,
shortName, displayMode, orientation, mOldInfo.source(), themeColor, shortName, displayMode, orientation, mOldInfo.source(), themeColor,
backgroundColor, defaultBackgroundColor, isPrimaryIconMaskable, backgroundColor, defaultBackgroundColor, isPrimaryIconMaskable,
......
...@@ -39,8 +39,10 @@ public class WebappIntentDataProvider extends BrowserServicesIntentDataProvider ...@@ -39,8 +39,10 @@ public class WebappIntentDataProvider extends BrowserServicesIntentDataProvider
return Color.WHITE; 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) { @NonNull WebappExtras webappExtras, @Nullable WebApkExtras webApkExtras) {
mIntent = intent;
mToolbarColor = toolbarColor; mToolbarColor = toolbarColor;
mHasCustomToolbarColor = hasCustomToolbarColor; mHasCustomToolbarColor = hasCustomToolbarColor;
mCloseButtonIcon = TintedDrawable.constructTintedDrawable( mCloseButtonIcon = TintedDrawable.constructTintedDrawable(
...@@ -49,7 +51,6 @@ public class WebappIntentDataProvider extends BrowserServicesIntentDataProvider ...@@ -49,7 +51,6 @@ public class WebappIntentDataProvider extends BrowserServicesIntentDataProvider
mWebappExtras = webappExtras; mWebappExtras = webappExtras;
mWebApkExtras = webApkExtras; mWebApkExtras = webApkExtras;
mActivityType = (webApkExtras != null) ? ActivityType.WEB_APK : ActivityType.WEBAPP; mActivityType = (webApkExtras != null) ? ActivityType.WEB_APK : ActivityType.WEBAPP;
mIntent = new Intent();
} }
@Override @Override
......
...@@ -100,7 +100,7 @@ public class WebappIntentDataProviderFactory { ...@@ -100,7 +100,7 @@ public class WebappIntentDataProviderFactory {
new WebappExtras(id, url, scope, new WebappIcon(icon, true /* isTrusted */), name, new WebappExtras(id, url, scope, new WebappIcon(icon, true /* isTrusted */), name,
shortName, displayMode, orientation, source, backgroundColor, shortName, displayMode, orientation, source, backgroundColor,
defaultBackgroundColor, isIconGenerated, isIconAdaptive, forceNavigation); defaultBackgroundColor, isIconGenerated, isIconAdaptive, forceNavigation);
return new WebappIntentDataProvider(toolbarColor, hasValidToolbarColor, return new WebappIntentDataProvider(intent, toolbarColor, hasValidToolbarColor,
null /* shareData */, webappExtras, null /* webApkExtras */); null /* shareData */, webappExtras, null /* webApkExtras */);
} }
} }
...@@ -532,4 +532,21 @@ public class IntentHandlerTest { ...@@ -532,4 +532,21 @@ public class IntentHandlerTest {
Assert.assertFalse( Assert.assertFalse(
intent.getBooleanExtra(IntentHandler.EXTRA_OPEN_NEW_INCOGNITO_TAB, true)); 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 @@ ...@@ -4,6 +4,7 @@
package org.chromium.chrome.browser.webapps; package org.chromium.chrome.browser.webapps;
import android.content.Intent;
import android.support.test.filters.MediumTest; import android.support.test.filters.MediumTest;
import org.junit.Assert; import org.junit.Assert;
...@@ -170,12 +171,12 @@ public class WebApkUpdateManagerTest { ...@@ -170,12 +171,12 @@ public class WebApkUpdateManagerTest {
WebappDataStorage storage = WebappDataStorage storage =
WebappRegistry.getInstance().getWebappDataStorage(WEBAPK_ID); WebappRegistry.getInstance().getWebappDataStorage(WEBAPK_ID);
BrowserServicesIntentDataProvider intentDataProvider = BrowserServicesIntentDataProvider intentDataProvider =
WebApkIntentDataProviderFactory.create("", creationData.scope, null, null, WebApkIntentDataProviderFactory.create(new Intent(), "", creationData.scope,
creationData.name, creationData.shortName, creationData.displayMode, null, null, creationData.name, creationData.shortName,
creationData.orientation, 0, creationData.themeColor, creationData.displayMode, creationData.orientation, 0,
creationData.backgroundColor, 0, creationData.isPrimaryIconMaskable, creationData.themeColor, creationData.backgroundColor, 0,
false /* isSplashIconMaskable */, "", creationData.isPrimaryIconMaskable, false /* isSplashIconMaskable */,
WebApkVersion.REQUEST_UPDATE_FOR_SHELL_APK_VERSION, "", WebApkVersion.REQUEST_UPDATE_FOR_SHELL_APK_VERSION,
creationData.manifestUrl, creationData.startUrl, creationData.manifestUrl, creationData.startUrl,
WebApkDistributor.BROWSER, creationData.iconUrlToMurmur2HashMap, null, WebApkDistributor.BROWSER, creationData.iconUrlToMurmur2HashMap, null,
false /* forceNavigation */, false /* isSplashProvidedByWebApk */, false /* forceNavigation */, false /* isSplashProvidedByWebApk */,
......
...@@ -385,7 +385,7 @@ public class WebApkUpdateManagerUnitTest { ...@@ -385,7 +385,7 @@ public class WebApkUpdateManagerUnitTest {
&& manifestData.shareTargetEncType.equals( && manifestData.shareTargetEncType.equals(
SHARE_TARGET_ENC_TYPE_MULTIPART), SHARE_TARGET_ENC_TYPE_MULTIPART),
manifestData.shareTargetFileNames, manifestData.shareTargetFileAccepts); manifestData.shareTargetFileNames, manifestData.shareTargetFileAccepts);
return WebApkIntentDataProviderFactory.create("", manifestData.scopeUrl, return WebApkIntentDataProviderFactory.create(new Intent(), "", manifestData.scopeUrl,
new WebappIcon(manifestData.primaryIcon), null, manifestData.name, new WebappIcon(manifestData.primaryIcon), null, manifestData.name,
manifestData.shortName, manifestData.displayMode, manifestData.orientation, -1, manifestData.shortName, manifestData.displayMode, manifestData.orientation, -1,
manifestData.themeColor, manifestData.backgroundColor, manifestData.themeColor, manifestData.backgroundColor,
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
package org.chromium.chrome.test.util.browser.webapps; package org.chromium.chrome.test.util.browser.webapps;
import android.content.Intent;
import android.graphics.Color; import android.graphics.Color;
import org.chromium.chrome.browser.ShortcutHelper; import org.chromium.chrome.browser.ShortcutHelper;
...@@ -51,8 +52,8 @@ public class WebApkIntentDataProviderBuilder { ...@@ -51,8 +52,8 @@ public class WebApkIntentDataProviderBuilder {
* Builds {@link BrowserServicesIntentDataProvider} object using options that have been set. * Builds {@link BrowserServicesIntentDataProvider} object using options that have been set.
*/ */
public BrowserServicesIntentDataProvider build() { public BrowserServicesIntentDataProvider build() {
return WebApkIntentDataProviderFactory.create(mUrl, mScope, null, null, null, null, return WebApkIntentDataProviderFactory.create(new Intent(), mUrl, mScope, null, null, null,
mDisplayMode, ScreenOrientationValues.DEFAULT, ShortcutSource.UNKNOWN, null, mDisplayMode, ScreenOrientationValues.DEFAULT, ShortcutSource.UNKNOWN,
ShortcutHelper.MANIFEST_COLOR_INVALID_OR_MISSING, ShortcutHelper.MANIFEST_COLOR_INVALID_OR_MISSING,
ShortcutHelper.MANIFEST_COLOR_INVALID_OR_MISSING, Color.WHITE, ShortcutHelper.MANIFEST_COLOR_INVALID_OR_MISSING, Color.WHITE,
false /* isPrimaryIconMaskable */, false /* isSplashIconMaskable */, 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