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" |
+ + "+dGjR0tLS8lkMlhy/XQL5CmKomiaJoSYm5tTFEXXdUrr/7vA+BaLxerr61m1iuG67vz8fCgUcl2X" |
+ + "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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()); |
+ } |
+} |