| Index: chrome/android/javatests/src/org/chromium/chrome/browser/webapps/ManifestUpgradeDetectorTest.java
|
| diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/ManifestUpgradeDetectorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/ManifestUpgradeDetectorTest.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..7796849449f91ea0e79a7a07df8e5e83fa35cc02
|
| --- /dev/null
|
| +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/ManifestUpgradeDetectorTest.java
|
| @@ -0,0 +1,302 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +package org.chromium.chrome.browser.webapps;
|
| +
|
| +import android.content.Context;
|
| +import android.content.Intent;
|
| +import android.net.Uri;
|
| +import android.os.Environment;
|
| +import android.test.suitebuilder.annotation.MediumTest;
|
| +
|
| +import org.chromium.base.ThreadUtils;
|
| +import org.chromium.blink_public.platform.WebDisplayMode;
|
| +import org.chromium.chrome.browser.ShortcutHelper;
|
| +import org.chromium.chrome.browser.tab.Tab;
|
| +import org.chromium.chrome.test.ChromeTabbedActivityTestBase;
|
| +import org.chromium.chrome.test.util.browser.TabLoadObserver;
|
| +import org.chromium.content.browser.test.util.Criteria;
|
| +import org.chromium.content.browser.test.util.CriteriaHelper;
|
| +import org.chromium.content_public.common.ScreenOrientationValues;
|
| +import org.chromium.net.test.EmbeddedTestServer;
|
| +import org.chromium.webapk.lib.common.WebApkConstants;
|
| +
|
| +import java.util.HashSet;
|
| +import java.util.Set;
|
| +
|
| +/**
|
| + * Tests the ManifestUpgradeDetector.
|
| + */
|
| +public class ManifestUpgradeDetectorTest extends ChromeTabbedActivityTestBase {
|
| + private static final String WEBAPK_ID = WebApkConstants.WEBAPK_ID_PREFIX + "webapp_id";
|
| + private static final String WEBAPK_NAME = "Manifest test app";
|
| + private static final String WEBAPK_SHORT_NAME = "App";
|
| + private static final int WEBAPK_ORIENTATION = ScreenOrientationValues.LANDSCAPE;
|
| + private static final String WEBAPK_ICON =
|
| + "iVBORw0KGgoAAAANSUhEUgAAAJAAAACQCAIAAABoJHXvAAAAA3NCSVQICAjb4U/gAAAIrElEQVR4"
|
| + + "nO2d208T3RbA9557p61tqRcwXMJFBSEoETABA4lPEB9Iviclxnf/A/8C/wJfSXz0DRNfvL2JREsg"
|
| + + "eIsCNQhELtZaoJ1pO52ZfR5WOunRc/w+vpxzyOKs3wMhZSaZzi9r77XXXjvwmzdvMgIP0mE/AHEw"
|
| + + "SBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgy"
|
| + + "SBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgy"
|
| + + "SBgySBgySBgySBgySBgySBgySBgySBgySBgySBgyjo4wIcRhP8L/AuWwH+A/gBCCcy7LMvxea45z"
|
| + + "zjkPLoM/wc/gc1zgFiaEkCRJkqRKpWLbtu/7siwrigKehBC+77uu6/s+51xRFFVVZVmWJMn3fdB8"
|
| + + "2N/gwGAVFkRVuVx2HOf48eN9fX0dHR0NDQ3xeNwwDM6567rFYnF3dzebzW5ubn79+nVra2t/f991"
|
| + + "XcMwFEXB6AylMHjRnPN8Pt/c3Dw+Pj44OJhIJP70xmw2u7q6+v79+1Qqtbu7C6MoLvAJC8LCsqxr"
|
| + + "167duHHDNE3GmO/7nucxxjjnkiTBNb7vw+gnSZIsy8lkMplM9vf3M8YePnwYi8V83z/Ub3Ng8Alj"
|
| + + "jHHOLcu6devWxMQEY8zzPNCjqmpwDZiQZbk2jFzX9TxPURSY1TAmlsiEQawUCoWxsbGJiQnXdSGY"
|
| + + "JElijK2srCwsLKytreVyuXK5zDkPh8N1dXVNTU3nzp1rb28PhUIwdWFUBSATxjmvVCqnTp2anJz0"
|
| + + "fR88SZKUy+Wmpqbm5uYcx4HRD2JOCOF5nu/7qqqePHmyt7d3aGiop6dH0zSkQYZPWKlUGh0djUQi"
|
| + + "wUiYz+fv3r27vLwci8UMw2D/vIgOzGWz2cePHz979qy/v79UKum6jm4CY+iECSE0Tbt48WKwBJZl"
|
| + + "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"
|
| + + "AAAAAElFTkSuQmCC";
|
| + private static final String WEBAPK_START_URL_PATH =
|
| + "/chrome/test/data/webapps/manifest_test_page.html";
|
| + private static final String WEBAPK_WEB_MANIFEST_URL =
|
| + "/chrome/test/data/webapps/manifest.json";
|
| + private static final String[] WEBAPK_ICON_SET = {"/chrome/test/data/webapps/image-512px.png"};
|
| + private static final String[] WEBAPK_ICON_SET_2 =
|
| + {"/chrome/test/data/banners/launcher-icon-1x.png"};
|
| +
|
| + private String mStartUrl;
|
| + private Set<String> mIconUrls;
|
| + private ManifestUpgradeDetector mDetector;
|
| + private EmbeddedTestServer mTestServer;
|
| +
|
| + private static class TestManifestUpgradeDetector extends ManifestUpgradeDetector {
|
| + private boolean mIsUpgraded;
|
| + private WebappInfo mInfo;
|
| + private boolean mIsDataAvaliable = false;
|
| + public TestManifestUpgradeDetector(Context context, Tab tab, WebappInfo info) {
|
| + super(context, tab, info);
|
| + }
|
| +
|
| + public boolean isDataAvaliable() {
|
| + return mIsDataAvaliable;
|
| + }
|
| +
|
| + @Override
|
| + public void updateMetadataAndRequestUpdateIfNeeded(boolean isUpgraded,
|
| + final Set<String> iconUrls, WebappInfo newInfo) {
|
| + mIsDataAvaliable = true;
|
| + mIsUpgraded = isUpgraded;
|
| + mInfo = newInfo;
|
| + }
|
| + }
|
| +
|
| + @Override
|
| + protected void setUp() throws Exception {
|
| + super.setUp();
|
| + final Context context = getInstrumentation().getTargetContext();
|
| + mTestServer = EmbeddedTestServer.createAndStartFileServer(
|
| + context, Environment.getExternalStorageDirectory());
|
| + mStartUrl = mTestServer.getURL(WEBAPK_START_URL_PATH);
|
| + mIconUrls = new HashSet<String>();
|
| + for (String path : WEBAPK_ICON_SET) {
|
| + mIconUrls.add(mTestServer.getURL(path));
|
| + }
|
| + }
|
| +
|
| + @Override
|
| + protected void tearDown() throws Exception {
|
| + mTestServer.stopAndDestroyServer();
|
| + super.tearDown();
|
| + }
|
| +
|
| + @Override
|
| + public void startMainActivity() throws InterruptedException {
|
| + startMainActivityOnBlankPage();
|
| + }
|
| +
|
| + private void registerWebApk(final Intent intent) {
|
| + WebappRegistry.registerWebapp(getInstrumentation().getTargetContext(), WEBAPK_ID,
|
| + new WebappRegistry.FetchWebappDataStorageCallback() {
|
| + @Override
|
| + public void onWebappDataStorageRetrieved(WebappDataStorage storage) {
|
| + storage.updateFromShortcutIntent(intent, true);
|
| + if (mIconUrls != null) {
|
| + storage.setIconUrls(mIconUrls);
|
| + }
|
| + }
|
| + }
|
| + );
|
| + }
|
| +
|
| + private Intent createIntent() {
|
| + Intent intent = new Intent();
|
| + intent.setData(Uri.parse(WebappActivity.WEBAPP_SCHEME + "://" + WEBAPK_ID));
|
| + intent.putExtra(ShortcutHelper.EXTRA_ID, WEBAPK_ID)
|
| + .putExtra(ShortcutHelper.EXTRA_URL, "about:blank")
|
| + .putExtra(ShortcutHelper.EXTRA_NAME, WEBAPK_NAME)
|
| + .putExtra(ShortcutHelper.EXTRA_SHORT_NAME, WEBAPK_SHORT_NAME)
|
| + .putExtra(ShortcutHelper.EXTRA_ICON, WEBAPK_ICON)
|
| + .putExtra(ShortcutHelper.EXTRA_ORIENTATION, WEBAPK_ORIENTATION)
|
| + .putExtra(ShortcutHelper.EXTRA_URL, mStartUrl)
|
| + .putExtra(ShortcutHelper.EXTRA_WEB_MANIFEST_URL,
|
| + mTestServer.getURL(WEBAPK_WEB_MANIFEST_URL));
|
| + return intent;
|
| + }
|
| +
|
| + private void waitUntilManifestDataAvailable(final Intent intent) throws Exception {
|
| + registerWebApk(intent);
|
| + loadUrlInNewTab("about:blank");
|
| + final Tab tab = getActivity().getActivityTab();
|
| + ThreadUtils.runOnUiThreadBlocking(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + WebappInfo info = WebappInfo.create(intent);
|
| + mDetector = new TestManifestUpgradeDetector(getInstrumentation().getTargetContext(),
|
| + tab, info);
|
| + mDetector.start();
|
| + }
|
| + });
|
| +
|
| + new TabLoadObserver(tab).fullyLoadUrl(mStartUrl);
|
| + CriteriaHelper.pollUiThread(new Criteria() {
|
| + @Override
|
| + public boolean isSatisfied() {
|
| + return ((TestManifestUpgradeDetector) mDetector).mIsDataAvaliable;
|
| + }
|
| + });
|
| + }
|
| +
|
| + @MediumTest
|
| + public void testManifestDoesNotUpgrade() throws Exception {
|
| + waitUntilManifestDataAvailable(createIntent());
|
| +
|
| + assertFalse(((TestManifestUpgradeDetector) mDetector).mIsUpgraded);
|
| + }
|
| +
|
| + @MediumTest
|
| + public void testStartUrlChangeShouldReturnUpgradeTrue() throws Exception {
|
| + String currentStartUrl =
|
| + "/chrome/test/data/webapps/manifest_test_page_test_start_url_change.html";
|
| + mStartUrl = mTestServer.getURL(currentStartUrl);
|
| + waitUntilManifestDataAvailable(createIntent());
|
| +
|
| + assertTrue(((TestManifestUpgradeDetector) mDetector).mIsUpgraded);
|
| + assertEquals(mTestServer.getURL(WEBAPK_START_URL_PATH),
|
| + ((TestManifestUpgradeDetector) mDetector).mInfo.uri().toString());
|
| + }
|
| +
|
| + @MediumTest
|
| + public void testWebappShortNameChangeReturnsUpgradeTrue()
|
| + throws Exception {
|
| + String currentShortName = "New short name";
|
| + Intent intent = createIntent();
|
| + intent.putExtra(ShortcutHelper.EXTRA_SHORT_NAME, currentShortName);
|
| + waitUntilManifestDataAvailable(intent);
|
| +
|
| + assertTrue(((TestManifestUpgradeDetector) mDetector).mIsUpgraded);
|
| + assertEquals(WEBAPK_SHORT_NAME,
|
| + ((TestManifestUpgradeDetector) mDetector).mInfo.shortName());
|
| + }
|
| +
|
| + @MediumTest
|
| + public void testWebappBackgroundColorChangeReturnsUpgradeTrue() throws Exception {
|
| + long backgroundColor = 0xFFCCFFFF;
|
| + Intent intent = createIntent();
|
| + intent.putExtra(ShortcutHelper.EXTRA_BACKGROUND_COLOR, backgroundColor);
|
| + waitUntilManifestDataAvailable(intent);
|
| +
|
| + assertTrue(((TestManifestUpgradeDetector) mDetector).mIsUpgraded);
|
| + assertEquals(ShortcutHelper.MANIFEST_COLOR_INVALID_OR_MISSING,
|
| + ((TestManifestUpgradeDetector) mDetector).mInfo.backgroundColor());
|
| + }
|
| +
|
| + @MediumTest
|
| + public void testWebappIconUrlsChangeReturnsUpgradeTrue() throws Exception {
|
| + mIconUrls.clear();
|
| + for (String path : WEBAPK_ICON_SET_2) {
|
| + mIconUrls.add(mTestServer.getURL(path));
|
| + }
|
| + waitUntilManifestDataAvailable(createIntent());
|
| +
|
| + assertTrue(((TestManifestUpgradeDetector) mDetector).mIsUpgraded);
|
| + }
|
| +
|
| + @MediumTest
|
| + public void testUpgradeReturnsFalseWhenNoCachedIconUrlsAndNoOtherChanges()
|
| + throws Exception {
|
| + mIconUrls = null;
|
| + waitUntilManifestDataAvailable(createIntent());
|
| +
|
| + assertFalse(((TestManifestUpgradeDetector) mDetector).mIsUpgraded);
|
| + }
|
| +
|
| + @MediumTest
|
| + public void testWebappNameChangeShouldReturnUpgradeFalse() throws Exception {
|
| + String currentName = "New name";
|
| + Intent intent = createIntent();
|
| + intent.putExtra(ShortcutHelper.EXTRA_NAME, currentName);
|
| + waitUntilManifestDataAvailable(intent);
|
| +
|
| + assertFalse(((TestManifestUpgradeDetector) mDetector).mIsUpgraded);
|
| + assertEquals(WEBAPK_NAME,
|
| + ((TestManifestUpgradeDetector) mDetector).mInfo.name());
|
| + }
|
| +
|
| + @MediumTest
|
| + public void testWebappOrientationChangeReturnsUpgradeFalse()
|
| + throws Exception {
|
| + int currentOrientation = ScreenOrientationValues.DEFAULT;
|
| + Intent intent = createIntent();
|
| + intent.putExtra(ShortcutHelper.EXTRA_ORIENTATION, currentOrientation);
|
| + waitUntilManifestDataAvailable(intent);
|
| +
|
| + assertFalse(((TestManifestUpgradeDetector) mDetector).mIsUpgraded);
|
| + assertEquals(WEBAPK_ORIENTATION,
|
| + ((TestManifestUpgradeDetector) mDetector).mInfo.orientation());
|
| + }
|
| +
|
| + @MediumTest
|
| + public void testWebappThemeColorChangeReturnsUpgradeFalse()
|
| + throws Exception {
|
| + long currentthemeColor = 0xFFCCFFFF;
|
| + Intent intent = createIntent();
|
| + intent.putExtra(ShortcutHelper.EXTRA_THEME_COLOR, currentthemeColor);
|
| + waitUntilManifestDataAvailable(intent);
|
| +
|
| + assertFalse(((TestManifestUpgradeDetector) mDetector).mIsUpgraded);
|
| + assertEquals(ShortcutHelper.MANIFEST_COLOR_INVALID_OR_MISSING,
|
| + ((TestManifestUpgradeDetector) mDetector).mInfo.themeColor());
|
| + }
|
| +
|
| + @MediumTest
|
| + public void testWebappDisplayModeChangeReturnsUpgradeFalse()
|
| + throws Exception {
|
| + int currentdisplayMode = WebDisplayMode.Fullscreen;
|
| + Intent intent = createIntent();
|
| + intent.putExtra(ShortcutHelper.EXTRA_DISPLAY_MODE, currentdisplayMode);
|
| + waitUntilManifestDataAvailable(intent);
|
| +
|
| + assertFalse(((TestManifestUpgradeDetector) mDetector).mIsUpgraded);
|
| + assertEquals(WebDisplayMode.Standalone,
|
| + ((TestManifestUpgradeDetector) mDetector).mInfo.displayMode());
|
| + }
|
| +}
|
|
|