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

Unified Diff: chrome/android/javatests/src/org/chromium/chrome/browser/webapps/ManifestUpgradeDetectorTest.java

Issue 2124513002: Introduce ManifestUpgradeDetector for WebAPK to detect web manifest changes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove ManifestUpgradeDetector.Observer. Created 4 years, 5 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/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());
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698