| 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 8c04ebb87fcb7afba65a75fc4b86a598662da12f..cbd5f165ee1c7b4afd720e1b4849f5755496d1b2 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
|
| @@ -22,14 +22,15 @@ import android.widget.TextView;
|
|
|
| import org.chromium.base.ThreadUtils;
|
| import org.chromium.base.test.util.Feature;
|
| -import org.chromium.base.test.util.RetryOnFailure;
|
| import org.chromium.chrome.R;
|
| import org.chromium.chrome.browser.ShortcutHelper;
|
| +import org.chromium.chrome.browser.engagement.SiteEngagementService;
|
| 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.infobar.InfoBarContainer.InfoBarAnimationListener;
|
| +import org.chromium.chrome.browser.profiles.Profile;
|
| import org.chromium.chrome.browser.webapps.WebappDataStorage;
|
| import org.chromium.chrome.test.ChromeTabbedActivityTestBase;
|
| import org.chromium.chrome.test.util.browser.TabLoadObserver;
|
| @@ -38,6 +39,7 @@ import org.chromium.content.browser.test.util.Criteria;
|
| import org.chromium.content.browser.test.util.CriteriaHelper;
|
| import org.chromium.content.browser.test.util.TouchCommon;
|
| import org.chromium.net.test.EmbeddedTestServer;
|
| +import org.chromium.ui.base.PageTransition;
|
|
|
| import java.util.ArrayList;
|
| import java.util.List;
|
| @@ -193,10 +195,7 @@ public class AppBannerManagerTest extends ChromeTabbedActivityTestBase {
|
| }
|
| });
|
|
|
| - // Navigations in this test are all of type ui::PAGE_TRANSITION_LINK, i.e. indirect.
|
| - // Force indirect navigations to be worth the same as direct for testing.
|
| - AppBannerManager.setEngagementWeights(1, 1);
|
| -
|
| + AppBannerManager.setTotalEngagementForTesting(10);
|
| mTestServer = EmbeddedTestServer.createAndStartServer(getInstrumentation().getContext());
|
| mNativeAppUrl = mTestServer.getURL(NATIVE_APP_PATH);
|
| mWebAppUrl = mTestServer.getURL(WEB_APP_PATH);
|
| @@ -208,6 +207,16 @@ public class AppBannerManagerTest extends ChromeTabbedActivityTestBase {
|
| super.tearDown();
|
| }
|
|
|
| + private void resetEngagementForUrl(final String url, final double engagement) {
|
| + ThreadUtils.runOnUiThreadBlocking(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + SiteEngagementService.getForProfile(Profile.getLastUsedProfile())
|
| + .resetScoreForUrl(url, engagement);
|
| + }
|
| + });
|
| + }
|
| +
|
| private void waitUntilNoInfoBarsExist() throws Exception {
|
| CriteriaHelper.pollUiThread(new Criteria() {
|
| @Override
|
| @@ -246,18 +255,18 @@ public class AppBannerManagerTest extends ChromeTabbedActivityTestBase {
|
|
|
| private void runFullNativeInstallPathway(String url, String expectedReferrer) throws Exception {
|
| // Visit a site that requests a banner.
|
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(url);
|
| - waitUntilAppDetailsRetrieved(1);
|
| - assertEquals(mDetailsDelegate.mReferrer, expectedReferrer);
|
| + resetEngagementForUrl(url, 0);
|
| + new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(url, PageTransition.TYPED);
|
| waitUntilNoInfoBarsExist();
|
|
|
| - // Indicate a day has passed, then revisit the page to get the banner to appear.
|
| + // Update engagement, then revisit the page to get the banner to appear.
|
| + resetEngagementForUrl(url, 10);
|
| InfoBarContainer container = getActivity().getActivityTab().getInfoBarContainer();
|
| final InfobarListener listener = new InfobarListener();
|
| container.setAnimationListener(listener);
|
| - AppBannerManager.setTimeDeltaForTesting(1);
|
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(url);
|
| - waitUntilAppDetailsRetrieved(2);
|
| + new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(url, PageTransition.TYPED);
|
| + waitUntilAppDetailsRetrieved(1);
|
| + assertEquals(mDetailsDelegate.mReferrer, expectedReferrer);
|
| waitUntilAppBannerInfoBarAppears(NATIVE_APP_TITLE);
|
| CriteriaHelper.pollUiThread(new Criteria() {
|
| @Override
|
| @@ -305,8 +314,9 @@ public class AppBannerManagerTest extends ChromeTabbedActivityTestBase {
|
| public void triggerWebAppBanner(String url, String expectedTitle, boolean installApp)
|
| throws Exception {
|
| // Visit the site in a new tab.
|
| + resetEngagementForUrl(url, 0);
|
| loadUrlInNewTab("about:blank");
|
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(url);
|
| + new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(url, PageTransition.TYPED);
|
|
|
| CriteriaHelper.pollUiThread(new Criteria() {
|
| @Override
|
| @@ -322,9 +332,9 @@ public class AppBannerManagerTest extends ChromeTabbedActivityTestBase {
|
| final InfobarListener listener = new InfobarListener();
|
| container.setAnimationListener(listener);
|
|
|
| - // Indicate a day has passed, then revisit the page to show the banner.
|
| - AppBannerManager.setTimeDeltaForTesting(1);
|
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(url);
|
| + // Update engagement, then revisit the page to get the banner to appear.
|
| + resetEngagementForUrl(url, 10);
|
| + new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(url, PageTransition.TYPED);
|
| CriteriaHelper.pollUiThread(new Criteria() {
|
| @Override
|
| public boolean isSatisfied() {
|
| @@ -351,7 +361,6 @@ public class AppBannerManagerTest extends ChromeTabbedActivityTestBase {
|
|
|
| @SmallTest
|
| @Feature({"AppBanners"})
|
| - @RetryOnFailure
|
| public void testFullNativeInstallPathwayFromId() throws Exception {
|
| runFullNativeInstallPathway(mNativeAppUrl, NATIVE_APP_BLANK_REFERRER);
|
| }
|
| @@ -365,63 +374,84 @@ public class AppBannerManagerTest extends ChromeTabbedActivityTestBase {
|
|
|
| @MediumTest
|
| @Feature({"AppBanners"})
|
| - @RetryOnFailure
|
| public void testBannerAppearsThenDoesNotAppearAgainForWeeks() throws Exception {
|
| // Visit a site that requests a banner.
|
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNativeAppUrl);
|
| - waitUntilAppDetailsRetrieved(1);
|
| + resetEngagementForUrl(mNativeAppUrl, 0);
|
| + new TabLoadObserver(getActivity().getActivityTab())
|
| + .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED);
|
| waitUntilNoInfoBarsExist();
|
|
|
| - // Indicate a day has passed, then revisit the page.
|
| - AppBannerManager.setTimeDeltaForTesting(1);
|
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNativeAppUrl);
|
| - waitUntilAppDetailsRetrieved(2);
|
| + // Update engagement, then revisit the page.
|
| + resetEngagementForUrl(mNativeAppUrl, 10);
|
| + new TabLoadObserver(getActivity().getActivityTab())
|
| + .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED);
|
| + waitUntilAppDetailsRetrieved(1);
|
| waitUntilAppBannerInfoBarAppears(NATIVE_APP_TITLE);
|
|
|
| // Revisit the page to make the banner go away, but don't explicitly dismiss it.
|
| // This hides the banner for two weeks.
|
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNativeAppUrl);
|
| - waitUntilAppDetailsRetrieved(3);
|
| + new TabLoadObserver(getActivity().getActivityTab())
|
| + .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED);
|
| + waitUntilAppDetailsRetrieved(2);
|
| waitUntilNoInfoBarsExist();
|
|
|
| // Wait a week until revisiting the page.
|
| AppBannerManager.setTimeDeltaForTesting(7);
|
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNativeAppUrl);
|
| - waitUntilAppDetailsRetrieved(4);
|
| + new TabLoadObserver(getActivity().getActivityTab())
|
| + .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED);
|
| + waitUntilAppDetailsRetrieved(3);
|
| waitUntilNoInfoBarsExist();
|
|
|
| AppBannerManager.setTimeDeltaForTesting(8);
|
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNativeAppUrl);
|
| - waitUntilAppDetailsRetrieved(5);
|
| + new TabLoadObserver(getActivity().getActivityTab())
|
| + .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED);
|
| + waitUntilAppDetailsRetrieved(4);
|
| waitUntilNoInfoBarsExist();
|
|
|
| // Wait two weeks until revisiting the page, which should pop up the banner.
|
| - AppBannerManager.setTimeDeltaForTesting(14);
|
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNativeAppUrl);
|
| - waitUntilAppDetailsRetrieved(6);
|
| - waitUntilNoInfoBarsExist();
|
| -
|
| AppBannerManager.setTimeDeltaForTesting(15);
|
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNativeAppUrl);
|
| - waitUntilAppDetailsRetrieved(7);
|
| + new TabLoadObserver(getActivity().getActivityTab())
|
| + .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED);
|
| + waitUntilAppDetailsRetrieved(5);
|
| waitUntilAppBannerInfoBarAppears(NATIVE_APP_TITLE);
|
| }
|
|
|
| @MediumTest
|
| @Feature({"AppBanners"})
|
| + public void testBannerAppearsThenDoesNotAppearAgainForCustomTime() throws Exception {
|
| + AppBannerManager.setDaysAfterDismissAndIgnoreForTesting(7, 7);
|
| + triggerWebAppBanner(mWebAppUrl, WEB_APP_TITLE, false);
|
| +
|
| + // Revisit the page to make the banner go away, but don't explicitly dismiss it.
|
| + // This hides the banner for two weeks.
|
| + new TabLoadObserver(getActivity().getActivityTab())
|
| + .fullyLoadUrl(mWebAppUrl, PageTransition.TYPED);
|
| + waitUntilNoInfoBarsExist();
|
| +
|
| + // Wait a week until revisiting the page. This should allow the banner.
|
| + AppBannerManager.setTimeDeltaForTesting(7);
|
| + new TabLoadObserver(getActivity().getActivityTab())
|
| + .fullyLoadUrl(mWebAppUrl, PageTransition.TYPED);
|
| + waitUntilAppBannerInfoBarAppears(WEB_APP_TITLE);
|
| + }
|
| +
|
| + @MediumTest
|
| + @Feature({"AppBanners"})
|
| public void testBlockedBannerDoesNotAppearAgainForMonths() throws Exception {
|
| // Visit a site that requests a banner.
|
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNativeAppUrl);
|
| - waitUntilAppDetailsRetrieved(1);
|
| + resetEngagementForUrl(mNativeAppUrl, 0);
|
| + new TabLoadObserver(getActivity().getActivityTab())
|
| + .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED);
|
| waitUntilNoInfoBarsExist();
|
|
|
| - // Indicate a day has passed, then revisit the page.
|
| + // Update engagement, then revisit the page.
|
| + resetEngagementForUrl(mNativeAppUrl, 10);
|
| InfoBarContainer container = getActivity().getActivityTab().getInfoBarContainer();
|
| final InfobarListener listener = new InfobarListener();
|
| container.setAnimationListener(listener);
|
| - AppBannerManager.setTimeDeltaForTesting(1);
|
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNativeAppUrl);
|
| - waitUntilAppDetailsRetrieved(2);
|
| + new TabLoadObserver(getActivity().getActivityTab())
|
| + .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED);
|
| + waitUntilAppDetailsRetrieved(1);
|
| waitUntilAppBannerInfoBarAppears(NATIVE_APP_TITLE);
|
|
|
| // Explicitly dismiss the banner.
|
| @@ -438,56 +468,97 @@ public class AppBannerManagerTest extends ChromeTabbedActivityTestBase {
|
|
|
| // Waiting two months shouldn't be long enough.
|
| AppBannerManager.setTimeDeltaForTesting(61);
|
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNativeAppUrl);
|
| - waitUntilAppDetailsRetrieved(3);
|
| + new TabLoadObserver(getActivity().getActivityTab())
|
| + .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED);
|
| + waitUntilAppDetailsRetrieved(2);
|
| waitUntilNoInfoBarsExist();
|
|
|
| AppBannerManager.setTimeDeltaForTesting(62);
|
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNativeAppUrl);
|
| - waitUntilAppDetailsRetrieved(4);
|
| + new TabLoadObserver(getActivity().getActivityTab())
|
| + .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED);
|
| + waitUntilAppDetailsRetrieved(3);
|
| waitUntilNoInfoBarsExist();
|
|
|
| // Waiting three months should allow banners to reappear.
|
| AppBannerManager.setTimeDeltaForTesting(91);
|
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNativeAppUrl);
|
| - waitUntilAppDetailsRetrieved(5);
|
| + new TabLoadObserver(getActivity().getActivityTab())
|
| + .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED);
|
| + waitUntilAppDetailsRetrieved(4);
|
| + waitUntilAppBannerInfoBarAppears(NATIVE_APP_TITLE);
|
| + }
|
| +
|
| + @MediumTest
|
| + @Feature({"AppBanners"})
|
| + public void testBlockedBannerDoesNotAppearAgainForCustomTime() throws Exception {
|
| + AppBannerManager.setDaysAfterDismissAndIgnoreForTesting(7, 7);
|
| +
|
| + // Update engagement, then visit a page which triggers a banner.
|
| + resetEngagementForUrl(mWebAppUrl, 10);
|
| + InfoBarContainer container = getActivity().getActivityTab().getInfoBarContainer();
|
| + final InfobarListener listener = new InfobarListener();
|
| + container.setAnimationListener(listener);
|
| + new TabLoadObserver(getActivity().getActivityTab())
|
| + .fullyLoadUrl(mWebAppUrl, PageTransition.TYPED);
|
| + waitUntilAppBannerInfoBarAppears(WEB_APP_TITLE);
|
| +
|
| + // Explicitly dismiss the banner.
|
| + CriteriaHelper.pollUiThread(new Criteria() {
|
| + @Override
|
| + public boolean isSatisfied() {
|
| + return listener.mDoneAnimating;
|
| + }
|
| + });
|
| + ArrayList<InfoBar> infobars = container.getInfoBarsForTesting();
|
| + View close = infobars.get(0).getView().findViewById(R.id.infobar_close_button);
|
| + TouchCommon.singleClickView(close);
|
| waitUntilNoInfoBarsExist();
|
|
|
| - AppBannerManager.setTimeDeltaForTesting(92);
|
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNativeAppUrl);
|
| - waitUntilAppDetailsRetrieved(6);
|
| - waitUntilAppBannerInfoBarAppears(NATIVE_APP_TITLE);
|
| + // Waiting seven days should be long enough.
|
| + AppBannerManager.setTimeDeltaForTesting(7);
|
| + new TabLoadObserver(getActivity().getActivityTab())
|
| + .fullyLoadUrl(mWebAppUrl, PageTransition.TYPED);
|
| + waitUntilAppBannerInfoBarAppears(WEB_APP_TITLE);
|
| }
|
|
|
| @MediumTest
|
| @Feature({"AppBanners"})
|
| - @RetryOnFailure
|
| public void testBitmapFetchersCanOverlapWithoutCrashing() throws Exception {
|
| // Visit a site that requests a banner rapidly and repeatedly.
|
| + resetEngagementForUrl(mNativeAppUrl, 10);
|
| for (int i = 1; i <= 10; i++) {
|
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNativeAppUrl);
|
| + new TabLoadObserver(getActivity().getActivityTab())
|
| + .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED);
|
|
|
| final Integer iteration = Integer.valueOf(i);
|
| - CriteriaHelper.pollUiThread(
|
| - Criteria.equals(iteration, new Callable<Integer>() {
|
| - @Override
|
| - public Integer call() {
|
| - return mDetailsDelegate.mNumRetrieved;
|
| - }
|
| - }));
|
| + CriteriaHelper.pollUiThread(Criteria.equals(iteration, new Callable<Integer>() {
|
| + @Override
|
| + public Integer call() {
|
| + return mDetailsDelegate.mNumRetrieved;
|
| + }
|
| + }));
|
| }
|
| }
|
|
|
| @SmallTest
|
| @Feature({"AppBanners"})
|
| - @RetryOnFailure
|
| public void testWebAppBannerAppears() throws Exception {
|
| triggerWebAppBanner(mWebAppUrl, WEB_APP_TITLE, false);
|
| }
|
|
|
| @SmallTest
|
| @Feature({"AppBanners"})
|
| - @RetryOnFailure
|
| + public void testWebAppBannerDoesNotAppearAfterInstall() throws Exception {
|
| + triggerWebAppBanner(mWebAppUrl, WEB_APP_TITLE, true);
|
| +
|
| + // The banner should not reshow after the site has been installed.
|
| + AppBannerManager.setTimeDeltaForTesting(100);
|
| + new TabLoadObserver(getActivity().getActivityTab())
|
| + .fullyLoadUrl(mWebAppUrl, PageTransition.TYPED);
|
| + waitUntilNoInfoBarsExist();
|
| + }
|
| +
|
| + @SmallTest
|
| + @Feature({"AppBanners"})
|
| public void testBannerFallsBackToShortName() throws Exception {
|
| triggerWebAppBanner(WebappTestPage.urlOfPageWithServiceWorkerAndManifest(
|
| mTestServer, WEB_APP_SHORT_TITLE_MANIFEST),
|
| @@ -496,7 +567,6 @@ public class AppBannerManagerTest extends ChromeTabbedActivityTestBase {
|
|
|
| @SmallTest
|
| @Feature({"AppBanners"})
|
| - @RetryOnFailure
|
| public void testWebAppSplashscreenIsDownloaded() throws Exception {
|
| // Sets the overriden factory to observer splash screen update.
|
| final TestDataStorageFactory dataStorageFactory = new TestDataStorageFactory();
|
|
|