Index: chrome/android/javatests/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java |
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java |
index 80cef4a5d1bba99c3f779c8a4cec1a2ee316fa56..5a1a236dbb976246080382dae326b11b19a2799f 100644 |
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java |
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java |
@@ -7,9 +7,11 @@ package org.chromium.chrome.browser.banners; |
import android.app.Activity; |
import android.app.Instrumentation.ActivityMonitor; |
import android.app.Instrumentation.ActivityResult; |
+import android.content.Context; |
import android.content.Intent; |
import android.content.IntentFilter; |
import android.content.pm.PackageInfo; |
+import android.graphics.Bitmap; |
import android.net.Uri; |
import android.test.mock.MockPackageManager; |
import android.test.suitebuilder.annotation.MediumTest; |
@@ -29,6 +31,7 @@ import org.chromium.chrome.browser.infobar.AppBannerInfoBarAndroid; |
import org.chromium.chrome.browser.infobar.AppBannerInfoBarDelegateAndroid; |
import org.chromium.chrome.browser.infobar.InfoBar; |
import org.chromium.chrome.browser.infobar.InfoBarContainer; |
+import org.chromium.chrome.browser.webapps.WebappDataStorage; |
import org.chromium.chrome.test.ChromeTabbedActivityTestBase; |
import org.chromium.chrome.test.util.TestHttpServerClient; |
import org.chromium.chrome.test.util.browser.TabLoadObserver; |
@@ -118,6 +121,28 @@ public class AppBannerManagerTest extends ChromeTabbedActivityTestBase { |
} |
} |
+ private static class TestDataStorageFactory extends WebappDataStorage.Factory { |
+ public Bitmap mSplashImage; |
+ |
+ @Override |
+ public WebappDataStorage create(final Context context, final String webappId) { |
+ return new WebappDataStorageWrapper(context, webappId); |
+ } |
+ |
+ private class WebappDataStorageWrapper extends WebappDataStorage { |
+ |
+ public WebappDataStorageWrapper(Context context, String webappId) { |
+ super(context, webappId); |
+ } |
+ |
+ @Override |
+ public void updateSplashScreenImage(Bitmap splashScreenImage) { |
+ assertNull(mSplashImage); |
+ mSplashImage = splashScreenImage; |
+ } |
+ } |
+ } |
+ |
private static class InfobarListener implements InfoBarContainer.InfoBarAnimationListener { |
private boolean mDoneAnimating; |
@@ -448,4 +473,92 @@ public class AppBannerManagerTest extends ChromeTabbedActivityTestBase { |
})); |
assertTrue(waitUntilAppBannerInfoBarAppears(WEB_APP_TITLE)); |
} |
+ |
+ @SmallTest |
+ @Feature({"AppBanners"}) |
+ public void testWebAppSplashscreenIsDownloaded() throws Exception { |
+ // Sets the overriden factory to observer splash screen update. |
+ final TestDataStorageFactory dataStorageFactory = new TestDataStorageFactory(); |
+ WebappDataStorage.setFactoryForTests(dataStorageFactory); |
+ |
+ // Create a Tab that doesn't have the AppBannerManager enabled. This prevents race |
+ // conditions between service worker activation and AppBannerManager getting triggered. |
+ // This race condition is a known problem, which is why the specs include wiggle room for |
+ // how many times a site must be visited. |
+ AppBannerManager.setIsEnabledForTesting(false); |
+ loadUrlInNewTab("about:blank"); |
+ |
+ // Visit a site that can have a banner, then wait until the service worker is activated. |
+ assertTrue(CriteriaHelper.pollForUIThreadCriteria( |
+ new TabLoadObserver(getActivity().getActivityTab(), WEB_APP_URL))); |
+ assertTrue(CriteriaHelper.pollForUIThreadCriteria(new Criteria() { |
+ @Override |
+ public boolean isSatisfied() { |
+ String url = getActivity().getActivityTab().getUrl(); |
+ Uri uri = Uri.parse(url); |
+ return TextUtils.equals(uri.getFragment(), "sw_activated"); |
+ } |
+ })); |
+ AppBannerManager.setIsEnabledForTesting(true); |
+ |
+ // Revisit the site in a new tab, which will have the AppBannerManager enabled. |
+ loadUrlInNewTab("about:blank"); |
+ assertTrue(CriteriaHelper.pollForUIThreadCriteria( |
+ new TabLoadObserver(getActivity().getActivityTab(), WEB_APP_URL))); |
+ |
+ assertTrue(CriteriaHelper.pollForUIThreadCriteria(new Criteria() { |
+ @Override |
+ public boolean isSatisfied() { |
+ AppBannerManager manager = |
+ getActivity().getActivityTab().getAppBannerManagerForTesting(); |
+ return !manager.isFetcherActiveForTesting(); |
+ } |
+ })); |
+ assertTrue(waitUntilNoInfoBarsExist()); |
+ |
+ // Add the animation listener in. |
+ InfoBarContainer container = getActivity().getActivityTab().getInfoBarContainer(); |
+ final InfobarListener listener = new InfobarListener(); |
+ container.setAnimationListener(listener); |
+ |
+ // Indicate a day has passed, then revisit the page to show the banner. |
+ AppBannerManager.setTimeDeltaForTesting(1); |
+ assertTrue(CriteriaHelper.pollForUIThreadCriteria( |
+ new TabLoadObserver(getActivity().getActivityTab(), WEB_APP_URL))); |
+ assertTrue(CriteriaHelper.pollForUIThreadCriteria(new Criteria() { |
+ @Override |
+ public boolean isSatisfied() { |
+ AppBannerManager manager = |
+ getActivity().getActivityTab().getAppBannerManagerForTesting(); |
+ return !manager.isFetcherActiveForTesting(); |
+ } |
+ })); |
+ assertTrue(waitUntilAppBannerInfoBarAppears(WEB_APP_TITLE)); |
+ assertTrue(CriteriaHelper.pollForUIThreadCriteria(new Criteria() { |
+ @Override |
+ public boolean isSatisfied() { |
+ return listener.mDoneAnimating; |
+ } |
+ })); |
+ |
+ // Click the button to trigger the adding of the shortcut. |
+ InfoBar infobar = container.getInfoBars().get(0); |
+ final Button button = |
+ (Button) infobar.getContentWrapper().findViewById(R.id.button_primary); |
+ TouchCommon.singleClickView(button); |
+ |
+ // Make sure that the splash screen icon was downloaded. |
+ assertTrue(CriteriaHelper.pollForUIThreadCriteria(new Criteria() { |
+ @Override |
+ public boolean isSatisfied() { |
+ return dataStorageFactory.mSplashImage != null; |
+ } |
+ })); |
+ |
+ // Test that bitmap sizes match expectations. |
+ int idealSize = getActivity().getResources().getDimensionPixelSize( |
+ R.dimen.webapp_splash_image_size); |
+ assertEquals(idealSize, dataStorageFactory.mSplashImage.getWidth()); |
+ assertEquals(idealSize, dataStorageFactory.mSplashImage.getHeight()); |
+ } |
} |