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..c03286d740afb3677666477c70b9c4b074258b5a 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 |
@@ -10,6 +10,7 @@ import android.app.Instrumentation.ActivityResult; |
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 +30,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 +120,15 @@ public class AppBannerManagerTest extends ChromeTabbedActivityTestBase { |
} |
} |
+ private static class TestDataStorageObserver implements WebappDataStorage.Observer { |
+ public Bitmap mSplashImage; |
+ |
+ @Override |
+ public void onUpdateSplashScreenImage(Bitmap image) { |
+ mSplashImage = image; |
+ } |
+ } |
+ |
private static class InfobarListener implements InfoBarContainer.InfoBarAnimationListener { |
private boolean mDoneAnimating; |
@@ -448,4 +459,92 @@ public class AppBannerManagerTest extends ChromeTabbedActivityTestBase { |
})); |
assertTrue(waitUntilAppBannerInfoBarAppears(WEB_APP_TITLE)); |
} |
+ |
+ @SmallTest |
+ @Feature({"AppBanners"}) |
+ public void testWebAppSplashscreenIsDownloaded() throws Exception { |
+ // Add the observer for the webapp storage. |
+ final TestDataStorageObserver dataStorageObserver = new TestDataStorageObserver(); |
+ WebappDataStorage.setObserverForTests(dataStorageObserver); |
+ |
+ // 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 mDataStorageObserver.mSplashImage != null; |
+ } |
+ })); |
+ |
+ // Test that bitmap sizes match expectations. |
+ int idealSize = getActivity().getResources().getDimensionPixelSize( |
+ R.dimen.webapp_splash_image_size); |
+ assertEquals(idealSize, mDataStorageObserver.mSplashImage.getWidth()); |
+ assertEquals(idealSize, mDataStorageObserver.mSplashImage.getHeight()); |
+ } |
} |