| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.chrome.browser.banners; | 5 package org.chromium.chrome.browser.banners; |
| 6 | 6 |
| 7 import android.app.Activity; | 7 import android.app.Activity; |
| 8 import android.app.Instrumentation.ActivityMonitor; | 8 import android.app.Instrumentation.ActivityMonitor; |
| 9 import android.app.Instrumentation.ActivityResult; | 9 import android.app.Instrumentation.ActivityResult; |
| 10 import android.content.Context; | 10 import android.content.Context; |
| 11 import android.content.Intent; | 11 import android.content.Intent; |
| 12 import android.content.IntentFilter; | 12 import android.content.IntentFilter; |
| 13 import android.content.pm.PackageInfo; | 13 import android.content.pm.PackageInfo; |
| 14 import android.graphics.Bitmap; | 14 import android.graphics.Bitmap; |
| 15 import android.test.mock.MockPackageManager; | 15 import android.test.mock.MockPackageManager; |
| 16 import android.test.suitebuilder.annotation.MediumTest; | 16 import android.test.suitebuilder.annotation.MediumTest; |
| 17 import android.test.suitebuilder.annotation.SmallTest; | 17 import android.test.suitebuilder.annotation.SmallTest; |
| 18 import android.text.TextUtils; | 18 import android.text.TextUtils; |
| 19 import android.view.View; | 19 import android.view.View; |
| 20 import android.widget.Button; | 20 import android.widget.Button; |
| 21 import android.widget.TextView; | 21 import android.widget.TextView; |
| 22 | 22 |
| 23 import org.chromium.base.ThreadUtils; | 23 import org.chromium.base.ThreadUtils; |
| 24 import org.chromium.base.test.util.Feature; | 24 import org.chromium.base.test.util.Feature; |
| 25 import org.chromium.base.test.util.RetryOnFailure; | |
| 26 import org.chromium.chrome.R; | 25 import org.chromium.chrome.R; |
| 27 import org.chromium.chrome.browser.ShortcutHelper; | 26 import org.chromium.chrome.browser.ShortcutHelper; |
| 27 import org.chromium.chrome.browser.engagement.SiteEngagementService; |
| 28 import org.chromium.chrome.browser.infobar.AppBannerInfoBarAndroid; | 28 import org.chromium.chrome.browser.infobar.AppBannerInfoBarAndroid; |
| 29 import org.chromium.chrome.browser.infobar.AppBannerInfoBarDelegateAndroid; | 29 import org.chromium.chrome.browser.infobar.AppBannerInfoBarDelegateAndroid; |
| 30 import org.chromium.chrome.browser.infobar.InfoBar; | 30 import org.chromium.chrome.browser.infobar.InfoBar; |
| 31 import org.chromium.chrome.browser.infobar.InfoBarContainer; | 31 import org.chromium.chrome.browser.infobar.InfoBarContainer; |
| 32 import org.chromium.chrome.browser.infobar.InfoBarContainer.InfoBarAnimationList
ener; | 32 import org.chromium.chrome.browser.infobar.InfoBarContainer.InfoBarAnimationList
ener; |
| 33 import org.chromium.chrome.browser.profiles.Profile; |
| 33 import org.chromium.chrome.browser.webapps.WebappDataStorage; | 34 import org.chromium.chrome.browser.webapps.WebappDataStorage; |
| 34 import org.chromium.chrome.test.ChromeTabbedActivityTestBase; | 35 import org.chromium.chrome.test.ChromeTabbedActivityTestBase; |
| 35 import org.chromium.chrome.test.util.browser.TabLoadObserver; | 36 import org.chromium.chrome.test.util.browser.TabLoadObserver; |
| 36 import org.chromium.chrome.test.util.browser.WebappTestPage; | 37 import org.chromium.chrome.test.util.browser.WebappTestPage; |
| 37 import org.chromium.content.browser.test.util.Criteria; | 38 import org.chromium.content.browser.test.util.Criteria; |
| 38 import org.chromium.content.browser.test.util.CriteriaHelper; | 39 import org.chromium.content.browser.test.util.CriteriaHelper; |
| 39 import org.chromium.content.browser.test.util.TouchCommon; | 40 import org.chromium.content.browser.test.util.TouchCommon; |
| 40 import org.chromium.net.test.EmbeddedTestServer; | 41 import org.chromium.net.test.EmbeddedTestServer; |
| 42 import org.chromium.ui.base.PageTransition; |
| 41 | 43 |
| 42 import java.util.ArrayList; | 44 import java.util.ArrayList; |
| 43 import java.util.List; | 45 import java.util.List; |
| 44 import java.util.concurrent.Callable; | 46 import java.util.concurrent.Callable; |
| 45 | 47 |
| 46 /** | 48 /** |
| 47 * Tests the app banners. | 49 * Tests the app banners. |
| 48 */ | 50 */ |
| 49 public class AppBannerManagerTest extends ChromeTabbedActivityTestBase { | 51 public class AppBannerManagerTest extends ChromeTabbedActivityTestBase { |
| 50 private static final String NATIVE_APP_PATH = | 52 private static final String NATIVE_APP_PATH = |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 | 188 |
| 187 // Must be set after native has loaded. | 189 // Must be set after native has loaded. |
| 188 mDetailsDelegate = new MockAppDetailsDelegate(); | 190 mDetailsDelegate = new MockAppDetailsDelegate(); |
| 189 ThreadUtils.runOnUiThreadBlocking(new Runnable() { | 191 ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| 190 @Override | 192 @Override |
| 191 public void run() { | 193 public void run() { |
| 192 AppBannerManager.setAppDetailsDelegate(mDetailsDelegate); | 194 AppBannerManager.setAppDetailsDelegate(mDetailsDelegate); |
| 193 } | 195 } |
| 194 }); | 196 }); |
| 195 | 197 |
| 196 // Navigations in this test are all of type ui::PAGE_TRANSITION_LINK, i.
e. indirect. | 198 AppBannerManager.setTotalEngagementForTesting(10); |
| 197 // Force indirect navigations to be worth the same as direct for testing
. | |
| 198 AppBannerManager.setEngagementWeights(1, 1); | |
| 199 | |
| 200 mTestServer = EmbeddedTestServer.createAndStartServer(getInstrumentation
().getContext()); | 199 mTestServer = EmbeddedTestServer.createAndStartServer(getInstrumentation
().getContext()); |
| 201 mNativeAppUrl = mTestServer.getURL(NATIVE_APP_PATH); | 200 mNativeAppUrl = mTestServer.getURL(NATIVE_APP_PATH); |
| 202 mWebAppUrl = mTestServer.getURL(WEB_APP_PATH); | 201 mWebAppUrl = mTestServer.getURL(WEB_APP_PATH); |
| 203 } | 202 } |
| 204 | 203 |
| 205 @Override | 204 @Override |
| 206 protected void tearDown() throws Exception { | 205 protected void tearDown() throws Exception { |
| 207 mTestServer.stopAndDestroyServer(); | 206 mTestServer.stopAndDestroyServer(); |
| 208 super.tearDown(); | 207 super.tearDown(); |
| 209 } | 208 } |
| 210 | 209 |
| 210 private void resetEngagementForUrl(final String url, final double engagement
) { |
| 211 ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| 212 @Override |
| 213 public void run() { |
| 214 SiteEngagementService.getForProfile(Profile.getLastUsedProfile()
) |
| 215 .resetScoreForUrl(url, engagement); |
| 216 } |
| 217 }); |
| 218 } |
| 219 |
| 211 private void waitUntilNoInfoBarsExist() throws Exception { | 220 private void waitUntilNoInfoBarsExist() throws Exception { |
| 212 CriteriaHelper.pollUiThread(new Criteria() { | 221 CriteriaHelper.pollUiThread(new Criteria() { |
| 213 @Override | 222 @Override |
| 214 public boolean isSatisfied() { | 223 public boolean isSatisfied() { |
| 215 return getInfoBars().isEmpty(); | 224 return getInfoBars().isEmpty(); |
| 216 } | 225 } |
| 217 }); | 226 }); |
| 218 } | 227 } |
| 219 | 228 |
| 220 private void waitUntilAppDetailsRetrieved(final int numExpected) throws Exce
ption { | 229 private void waitUntilAppDetailsRetrieved(final int numExpected) throws Exce
ption { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 239 TextView textView = (TextView) infobars.get(0).getView().findVie
wById( | 248 TextView textView = (TextView) infobars.get(0).getView().findVie
wById( |
| 240 R.id.infobar_message); | 249 R.id.infobar_message); |
| 241 if (textView == null) return false; | 250 if (textView == null) return false; |
| 242 return TextUtils.equals(textView.getText(), title); | 251 return TextUtils.equals(textView.getText(), title); |
| 243 } | 252 } |
| 244 }); | 253 }); |
| 245 } | 254 } |
| 246 | 255 |
| 247 private void runFullNativeInstallPathway(String url, String expectedReferrer
) throws Exception { | 256 private void runFullNativeInstallPathway(String url, String expectedReferrer
) throws Exception { |
| 248 // Visit a site that requests a banner. | 257 // Visit a site that requests a banner. |
| 249 new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(url); | 258 resetEngagementForUrl(url, 0); |
| 250 waitUntilAppDetailsRetrieved(1); | 259 new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(url, Pa
geTransition.TYPED); |
| 251 assertEquals(mDetailsDelegate.mReferrer, expectedReferrer); | |
| 252 waitUntilNoInfoBarsExist(); | 260 waitUntilNoInfoBarsExist(); |
| 253 | 261 |
| 254 // Indicate a day has passed, then revisit the page to get the banner to
appear. | 262 // Update engagement, then revisit the page to get the banner to appear. |
| 263 resetEngagementForUrl(url, 10); |
| 255 InfoBarContainer container = getActivity().getActivityTab().getInfoBarCo
ntainer(); | 264 InfoBarContainer container = getActivity().getActivityTab().getInfoBarCo
ntainer(); |
| 256 final InfobarListener listener = new InfobarListener(); | 265 final InfobarListener listener = new InfobarListener(); |
| 257 container.setAnimationListener(listener); | 266 container.setAnimationListener(listener); |
| 258 AppBannerManager.setTimeDeltaForTesting(1); | 267 new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(url, Pa
geTransition.TYPED); |
| 259 new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(url); | 268 waitUntilAppDetailsRetrieved(1); |
| 260 waitUntilAppDetailsRetrieved(2); | 269 assertEquals(mDetailsDelegate.mReferrer, expectedReferrer); |
| 261 waitUntilAppBannerInfoBarAppears(NATIVE_APP_TITLE); | 270 waitUntilAppBannerInfoBarAppears(NATIVE_APP_TITLE); |
| 262 CriteriaHelper.pollUiThread(new Criteria() { | 271 CriteriaHelper.pollUiThread(new Criteria() { |
| 263 @Override | 272 @Override |
| 264 public boolean isSatisfied() { | 273 public boolean isSatisfied() { |
| 265 return listener.mDoneAnimating; | 274 return listener.mDoneAnimating; |
| 266 } | 275 } |
| 267 }); | 276 }); |
| 268 | 277 |
| 269 // Check that the button asks if the user wants to install the app. | 278 // Check that the button asks if the user wants to install the app. |
| 270 InfoBar infobar = container.getInfoBarsForTesting().get(0); | 279 InfoBar infobar = container.getInfoBarsForTesting().get(0); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 298 @Override | 307 @Override |
| 299 public boolean isSatisfied() { | 308 public boolean isSatisfied() { |
| 300 return TextUtils.equals(button.getText(), openText); | 309 return TextUtils.equals(button.getText(), openText); |
| 301 } | 310 } |
| 302 }); | 311 }); |
| 303 } | 312 } |
| 304 | 313 |
| 305 public void triggerWebAppBanner(String url, String expectedTitle, boolean in
stallApp) | 314 public void triggerWebAppBanner(String url, String expectedTitle, boolean in
stallApp) |
| 306 throws Exception { | 315 throws Exception { |
| 307 // Visit the site in a new tab. | 316 // Visit the site in a new tab. |
| 317 resetEngagementForUrl(url, 0); |
| 308 loadUrlInNewTab("about:blank"); | 318 loadUrlInNewTab("about:blank"); |
| 309 new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(url); | 319 new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(url, Pa
geTransition.TYPED); |
| 310 | 320 |
| 311 CriteriaHelper.pollUiThread(new Criteria() { | 321 CriteriaHelper.pollUiThread(new Criteria() { |
| 312 @Override | 322 @Override |
| 313 public boolean isSatisfied() { | 323 public boolean isSatisfied() { |
| 314 AppBannerManager manager = getActivity().getActivityTab().getApp
BannerManager(); | 324 AppBannerManager manager = getActivity().getActivityTab().getApp
BannerManager(); |
| 315 return !manager.isActiveForTesting(); | 325 return !manager.isActiveForTesting(); |
| 316 } | 326 } |
| 317 }); | 327 }); |
| 318 waitUntilNoInfoBarsExist(); | 328 waitUntilNoInfoBarsExist(); |
| 319 | 329 |
| 320 // Add the animation listener in. | 330 // Add the animation listener in. |
| 321 InfoBarContainer container = getActivity().getActivityTab().getInfoBarCo
ntainer(); | 331 InfoBarContainer container = getActivity().getActivityTab().getInfoBarCo
ntainer(); |
| 322 final InfobarListener listener = new InfobarListener(); | 332 final InfobarListener listener = new InfobarListener(); |
| 323 container.setAnimationListener(listener); | 333 container.setAnimationListener(listener); |
| 324 | 334 |
| 325 // Indicate a day has passed, then revisit the page to show the banner. | 335 // Update engagement, then revisit the page to get the banner to appear. |
| 326 AppBannerManager.setTimeDeltaForTesting(1); | 336 resetEngagementForUrl(url, 10); |
| 327 new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(url); | 337 new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(url, Pa
geTransition.TYPED); |
| 328 CriteriaHelper.pollUiThread(new Criteria() { | 338 CriteriaHelper.pollUiThread(new Criteria() { |
| 329 @Override | 339 @Override |
| 330 public boolean isSatisfied() { | 340 public boolean isSatisfied() { |
| 331 AppBannerManager manager = getActivity().getActivityTab().getApp
BannerManager(); | 341 AppBannerManager manager = getActivity().getActivityTab().getApp
BannerManager(); |
| 332 return !manager.isActiveForTesting(); | 342 return !manager.isActiveForTesting(); |
| 333 } | 343 } |
| 334 }); | 344 }); |
| 335 waitUntilAppBannerInfoBarAppears(expectedTitle); | 345 waitUntilAppBannerInfoBarAppears(expectedTitle); |
| 336 | 346 |
| 337 if (!installApp) return; | 347 if (!installApp) return; |
| 338 | 348 |
| 339 CriteriaHelper.pollUiThread(new Criteria() { | 349 CriteriaHelper.pollUiThread(new Criteria() { |
| 340 @Override | 350 @Override |
| 341 public boolean isSatisfied() { | 351 public boolean isSatisfied() { |
| 342 return listener.mDoneAnimating; | 352 return listener.mDoneAnimating; |
| 343 } | 353 } |
| 344 }); | 354 }); |
| 345 | 355 |
| 346 // Click the button to trigger the adding of the shortcut. | 356 // Click the button to trigger the adding of the shortcut. |
| 347 InfoBar infobar = container.getInfoBarsForTesting().get(0); | 357 InfoBar infobar = container.getInfoBarsForTesting().get(0); |
| 348 final Button button = (Button) infobar.getView().findViewById(R.id.butto
n_primary); | 358 final Button button = (Button) infobar.getView().findViewById(R.id.butto
n_primary); |
| 349 TouchCommon.singleClickView(button); | 359 TouchCommon.singleClickView(button); |
| 350 } | 360 } |
| 351 | 361 |
| 352 @SmallTest | 362 @SmallTest |
| 353 @Feature({"AppBanners"}) | 363 @Feature({"AppBanners"}) |
| 354 @RetryOnFailure | |
| 355 public void testFullNativeInstallPathwayFromId() throws Exception { | 364 public void testFullNativeInstallPathwayFromId() throws Exception { |
| 356 runFullNativeInstallPathway(mNativeAppUrl, NATIVE_APP_BLANK_REFERRER); | 365 runFullNativeInstallPathway(mNativeAppUrl, NATIVE_APP_BLANK_REFERRER); |
| 357 } | 366 } |
| 358 | 367 |
| 359 @SmallTest | 368 @SmallTest |
| 360 @Feature({"AppBanners"}) | 369 @Feature({"AppBanners"}) |
| 361 public void testFullNativeInstallPathwayFromUrl() throws Exception { | 370 public void testFullNativeInstallPathwayFromUrl() throws Exception { |
| 362 runFullNativeInstallPathway( | 371 runFullNativeInstallPathway( |
| 363 mTestServer.getURL(NATIVE_APP_URL_WITH_MANIFEST_PATH), NATIVE_AP
P_REFERRER); | 372 mTestServer.getURL(NATIVE_APP_URL_WITH_MANIFEST_PATH), NATIVE_AP
P_REFERRER); |
| 364 } | 373 } |
| 365 | 374 |
| 366 @MediumTest | 375 @MediumTest |
| 367 @Feature({"AppBanners"}) | 376 @Feature({"AppBanners"}) |
| 368 @RetryOnFailure | |
| 369 public void testBannerAppearsThenDoesNotAppearAgainForWeeks() throws Excepti
on { | 377 public void testBannerAppearsThenDoesNotAppearAgainForWeeks() throws Excepti
on { |
| 370 // Visit a site that requests a banner. | 378 // Visit a site that requests a banner. |
| 371 new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNative
AppUrl); | 379 resetEngagementForUrl(mNativeAppUrl, 0); |
| 372 waitUntilAppDetailsRetrieved(1); | 380 new TabLoadObserver(getActivity().getActivityTab()) |
| 381 .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED); |
| 373 waitUntilNoInfoBarsExist(); | 382 waitUntilNoInfoBarsExist(); |
| 374 | 383 |
| 375 // Indicate a day has passed, then revisit the page. | 384 // Update engagement, then revisit the page. |
| 376 AppBannerManager.setTimeDeltaForTesting(1); | 385 resetEngagementForUrl(mNativeAppUrl, 10); |
| 377 new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNative
AppUrl); | 386 new TabLoadObserver(getActivity().getActivityTab()) |
| 378 waitUntilAppDetailsRetrieved(2); | 387 .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED); |
| 388 waitUntilAppDetailsRetrieved(1); |
| 379 waitUntilAppBannerInfoBarAppears(NATIVE_APP_TITLE); | 389 waitUntilAppBannerInfoBarAppears(NATIVE_APP_TITLE); |
| 380 | 390 |
| 381 // Revisit the page to make the banner go away, but don't explicitly dis
miss it. | 391 // Revisit the page to make the banner go away, but don't explicitly dis
miss it. |
| 382 // This hides the banner for two weeks. | 392 // This hides the banner for two weeks. |
| 383 new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNative
AppUrl); | 393 new TabLoadObserver(getActivity().getActivityTab()) |
| 384 waitUntilAppDetailsRetrieved(3); | 394 .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED); |
| 395 waitUntilAppDetailsRetrieved(2); |
| 385 waitUntilNoInfoBarsExist(); | 396 waitUntilNoInfoBarsExist(); |
| 386 | 397 |
| 387 // Wait a week until revisiting the page. | 398 // Wait a week until revisiting the page. |
| 388 AppBannerManager.setTimeDeltaForTesting(7); | 399 AppBannerManager.setTimeDeltaForTesting(7); |
| 389 new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNative
AppUrl); | 400 new TabLoadObserver(getActivity().getActivityTab()) |
| 401 .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED); |
| 402 waitUntilAppDetailsRetrieved(3); |
| 403 waitUntilNoInfoBarsExist(); |
| 404 |
| 405 AppBannerManager.setTimeDeltaForTesting(8); |
| 406 new TabLoadObserver(getActivity().getActivityTab()) |
| 407 .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED); |
| 390 waitUntilAppDetailsRetrieved(4); | 408 waitUntilAppDetailsRetrieved(4); |
| 391 waitUntilNoInfoBarsExist(); | 409 waitUntilNoInfoBarsExist(); |
| 392 | 410 |
| 393 AppBannerManager.setTimeDeltaForTesting(8); | 411 // Wait two weeks until revisiting the page, which should pop up the ban
ner. |
| 394 new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNative
AppUrl); | 412 AppBannerManager.setTimeDeltaForTesting(15); |
| 413 new TabLoadObserver(getActivity().getActivityTab()) |
| 414 .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED); |
| 395 waitUntilAppDetailsRetrieved(5); | 415 waitUntilAppDetailsRetrieved(5); |
| 416 waitUntilAppBannerInfoBarAppears(NATIVE_APP_TITLE); |
| 417 } |
| 418 |
| 419 @MediumTest |
| 420 @Feature({"AppBanners"}) |
| 421 public void testBannerAppearsThenDoesNotAppearAgainForCustomTime() throws Ex
ception { |
| 422 AppBannerManager.setDaysAfterDismissAndIgnoreForTesting(7, 7); |
| 423 triggerWebAppBanner(mWebAppUrl, WEB_APP_TITLE, false); |
| 424 |
| 425 // Revisit the page to make the banner go away, but don't explicitly dis
miss it. |
| 426 // This hides the banner for two weeks. |
| 427 new TabLoadObserver(getActivity().getActivityTab()) |
| 428 .fullyLoadUrl(mWebAppUrl, PageTransition.TYPED); |
| 396 waitUntilNoInfoBarsExist(); | 429 waitUntilNoInfoBarsExist(); |
| 397 | 430 |
| 398 // Wait two weeks until revisiting the page, which should pop up the ban
ner. | 431 // Wait a week until revisiting the page. This should allow the banner. |
| 399 AppBannerManager.setTimeDeltaForTesting(14); | 432 AppBannerManager.setTimeDeltaForTesting(7); |
| 400 new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNative
AppUrl); | 433 new TabLoadObserver(getActivity().getActivityTab()) |
| 401 waitUntilAppDetailsRetrieved(6); | 434 .fullyLoadUrl(mWebAppUrl, PageTransition.TYPED); |
| 402 waitUntilNoInfoBarsExist(); | 435 waitUntilAppBannerInfoBarAppears(WEB_APP_TITLE); |
| 403 | |
| 404 AppBannerManager.setTimeDeltaForTesting(15); | |
| 405 new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNative
AppUrl); | |
| 406 waitUntilAppDetailsRetrieved(7); | |
| 407 waitUntilAppBannerInfoBarAppears(NATIVE_APP_TITLE); | |
| 408 } | 436 } |
| 409 | 437 |
| 410 @MediumTest | 438 @MediumTest |
| 411 @Feature({"AppBanners"}) | 439 @Feature({"AppBanners"}) |
| 412 public void testBlockedBannerDoesNotAppearAgainForMonths() throws Exception
{ | 440 public void testBlockedBannerDoesNotAppearAgainForMonths() throws Exception
{ |
| 413 // Visit a site that requests a banner. | 441 // Visit a site that requests a banner. |
| 414 new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNative
AppUrl); | 442 resetEngagementForUrl(mNativeAppUrl, 0); |
| 415 waitUntilAppDetailsRetrieved(1); | 443 new TabLoadObserver(getActivity().getActivityTab()) |
| 444 .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED); |
| 416 waitUntilNoInfoBarsExist(); | 445 waitUntilNoInfoBarsExist(); |
| 417 | 446 |
| 418 // Indicate a day has passed, then revisit the page. | 447 // Update engagement, then revisit the page. |
| 448 resetEngagementForUrl(mNativeAppUrl, 10); |
| 419 InfoBarContainer container = getActivity().getActivityTab().getInfoBarCo
ntainer(); | 449 InfoBarContainer container = getActivity().getActivityTab().getInfoBarCo
ntainer(); |
| 420 final InfobarListener listener = new InfobarListener(); | 450 final InfobarListener listener = new InfobarListener(); |
| 421 container.setAnimationListener(listener); | 451 container.setAnimationListener(listener); |
| 422 AppBannerManager.setTimeDeltaForTesting(1); | 452 new TabLoadObserver(getActivity().getActivityTab()) |
| 423 new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNative
AppUrl); | 453 .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED); |
| 424 waitUntilAppDetailsRetrieved(2); | 454 waitUntilAppDetailsRetrieved(1); |
| 425 waitUntilAppBannerInfoBarAppears(NATIVE_APP_TITLE); | 455 waitUntilAppBannerInfoBarAppears(NATIVE_APP_TITLE); |
| 426 | 456 |
| 427 // Explicitly dismiss the banner. | 457 // Explicitly dismiss the banner. |
| 428 CriteriaHelper.pollUiThread(new Criteria() { | 458 CriteriaHelper.pollUiThread(new Criteria() { |
| 429 @Override | 459 @Override |
| 430 public boolean isSatisfied() { | 460 public boolean isSatisfied() { |
| 431 return listener.mDoneAnimating; | 461 return listener.mDoneAnimating; |
| 432 } | 462 } |
| 433 }); | 463 }); |
| 434 ArrayList<InfoBar> infobars = container.getInfoBarsForTesting(); | 464 ArrayList<InfoBar> infobars = container.getInfoBarsForTesting(); |
| 435 View close = infobars.get(0).getView().findViewById(R.id.infobar_close_b
utton); | 465 View close = infobars.get(0).getView().findViewById(R.id.infobar_close_b
utton); |
| 436 TouchCommon.singleClickView(close); | 466 TouchCommon.singleClickView(close); |
| 437 waitUntilNoInfoBarsExist(); | 467 waitUntilNoInfoBarsExist(); |
| 438 | 468 |
| 439 // Waiting two months shouldn't be long enough. | 469 // Waiting two months shouldn't be long enough. |
| 440 AppBannerManager.setTimeDeltaForTesting(61); | 470 AppBannerManager.setTimeDeltaForTesting(61); |
| 441 new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNative
AppUrl); | 471 new TabLoadObserver(getActivity().getActivityTab()) |
| 442 waitUntilAppDetailsRetrieved(3); | 472 .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED); |
| 473 waitUntilAppDetailsRetrieved(2); |
| 443 waitUntilNoInfoBarsExist(); | 474 waitUntilNoInfoBarsExist(); |
| 444 | 475 |
| 445 AppBannerManager.setTimeDeltaForTesting(62); | 476 AppBannerManager.setTimeDeltaForTesting(62); |
| 446 new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNative
AppUrl); | 477 new TabLoadObserver(getActivity().getActivityTab()) |
| 447 waitUntilAppDetailsRetrieved(4); | 478 .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED); |
| 479 waitUntilAppDetailsRetrieved(3); |
| 448 waitUntilNoInfoBarsExist(); | 480 waitUntilNoInfoBarsExist(); |
| 449 | 481 |
| 450 // Waiting three months should allow banners to reappear. | 482 // Waiting three months should allow banners to reappear. |
| 451 AppBannerManager.setTimeDeltaForTesting(91); | 483 AppBannerManager.setTimeDeltaForTesting(91); |
| 452 new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNative
AppUrl); | 484 new TabLoadObserver(getActivity().getActivityTab()) |
| 453 waitUntilAppDetailsRetrieved(5); | 485 .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED); |
| 454 waitUntilNoInfoBarsExist(); | 486 waitUntilAppDetailsRetrieved(4); |
| 455 | |
| 456 AppBannerManager.setTimeDeltaForTesting(92); | |
| 457 new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNative
AppUrl); | |
| 458 waitUntilAppDetailsRetrieved(6); | |
| 459 waitUntilAppBannerInfoBarAppears(NATIVE_APP_TITLE); | 487 waitUntilAppBannerInfoBarAppears(NATIVE_APP_TITLE); |
| 460 } | 488 } |
| 461 | 489 |
| 462 @MediumTest | 490 @MediumTest |
| 463 @Feature({"AppBanners"}) | 491 @Feature({"AppBanners"}) |
| 464 @RetryOnFailure | 492 public void testBlockedBannerDoesNotAppearAgainForCustomTime() throws Except
ion { |
| 493 AppBannerManager.setDaysAfterDismissAndIgnoreForTesting(7, 7); |
| 494 |
| 495 // Update engagement, then visit a page which triggers a banner. |
| 496 resetEngagementForUrl(mWebAppUrl, 10); |
| 497 InfoBarContainer container = getActivity().getActivityTab().getInfoBarCo
ntainer(); |
| 498 final InfobarListener listener = new InfobarListener(); |
| 499 container.setAnimationListener(listener); |
| 500 new TabLoadObserver(getActivity().getActivityTab()) |
| 501 .fullyLoadUrl(mWebAppUrl, PageTransition.TYPED); |
| 502 waitUntilAppBannerInfoBarAppears(WEB_APP_TITLE); |
| 503 |
| 504 // Explicitly dismiss the banner. |
| 505 CriteriaHelper.pollUiThread(new Criteria() { |
| 506 @Override |
| 507 public boolean isSatisfied() { |
| 508 return listener.mDoneAnimating; |
| 509 } |
| 510 }); |
| 511 ArrayList<InfoBar> infobars = container.getInfoBarsForTesting(); |
| 512 View close = infobars.get(0).getView().findViewById(R.id.infobar_close_b
utton); |
| 513 TouchCommon.singleClickView(close); |
| 514 waitUntilNoInfoBarsExist(); |
| 515 |
| 516 // Waiting seven days should be long enough. |
| 517 AppBannerManager.setTimeDeltaForTesting(7); |
| 518 new TabLoadObserver(getActivity().getActivityTab()) |
| 519 .fullyLoadUrl(mWebAppUrl, PageTransition.TYPED); |
| 520 waitUntilAppBannerInfoBarAppears(WEB_APP_TITLE); |
| 521 } |
| 522 |
| 523 @MediumTest |
| 524 @Feature({"AppBanners"}) |
| 465 public void testBitmapFetchersCanOverlapWithoutCrashing() throws Exception { | 525 public void testBitmapFetchersCanOverlapWithoutCrashing() throws Exception { |
| 466 // Visit a site that requests a banner rapidly and repeatedly. | 526 // Visit a site that requests a banner rapidly and repeatedly. |
| 527 resetEngagementForUrl(mNativeAppUrl, 10); |
| 467 for (int i = 1; i <= 10; i++) { | 528 for (int i = 1; i <= 10; i++) { |
| 468 new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNa
tiveAppUrl); | 529 new TabLoadObserver(getActivity().getActivityTab()) |
| 530 .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED); |
| 469 | 531 |
| 470 final Integer iteration = Integer.valueOf(i); | 532 final Integer iteration = Integer.valueOf(i); |
| 471 CriteriaHelper.pollUiThread( | 533 CriteriaHelper.pollUiThread(Criteria.equals(iteration, new Callable<
Integer>() { |
| 472 Criteria.equals(iteration, new Callable<Integer>() { | 534 @Override |
| 473 @Override | 535 public Integer call() { |
| 474 public Integer call() { | 536 return mDetailsDelegate.mNumRetrieved; |
| 475 return mDetailsDelegate.mNumRetrieved; | 537 } |
| 476 } | 538 })); |
| 477 })); | |
| 478 } | 539 } |
| 479 } | 540 } |
| 480 | 541 |
| 481 @SmallTest | 542 @SmallTest |
| 482 @Feature({"AppBanners"}) | 543 @Feature({"AppBanners"}) |
| 483 @RetryOnFailure | |
| 484 public void testWebAppBannerAppears() throws Exception { | 544 public void testWebAppBannerAppears() throws Exception { |
| 485 triggerWebAppBanner(mWebAppUrl, WEB_APP_TITLE, false); | 545 triggerWebAppBanner(mWebAppUrl, WEB_APP_TITLE, false); |
| 486 } | 546 } |
| 487 | 547 |
| 488 @SmallTest | 548 @SmallTest |
| 489 @Feature({"AppBanners"}) | 549 @Feature({"AppBanners"}) |
| 490 @RetryOnFailure | 550 public void testWebAppBannerDoesNotAppearAfterInstall() throws Exception { |
| 551 triggerWebAppBanner(mWebAppUrl, WEB_APP_TITLE, true); |
| 552 |
| 553 // The banner should not reshow after the site has been installed. |
| 554 AppBannerManager.setTimeDeltaForTesting(100); |
| 555 new TabLoadObserver(getActivity().getActivityTab()) |
| 556 .fullyLoadUrl(mWebAppUrl, PageTransition.TYPED); |
| 557 waitUntilNoInfoBarsExist(); |
| 558 } |
| 559 |
| 560 @SmallTest |
| 561 @Feature({"AppBanners"}) |
| 491 public void testBannerFallsBackToShortName() throws Exception { | 562 public void testBannerFallsBackToShortName() throws Exception { |
| 492 triggerWebAppBanner(WebappTestPage.urlOfPageWithServiceWorkerAndManifest
( | 563 triggerWebAppBanner(WebappTestPage.urlOfPageWithServiceWorkerAndManifest
( |
| 493 mTestServer, WEB_APP_SHORT_TITLE_MANIFEST), | 564 mTestServer, WEB_APP_SHORT_TITLE_MANIFEST), |
| 494 WEB_APP_SHORT_TITLE, false); | 565 WEB_APP_SHORT_TITLE, false); |
| 495 } | 566 } |
| 496 | 567 |
| 497 @SmallTest | 568 @SmallTest |
| 498 @Feature({"AppBanners"}) | 569 @Feature({"AppBanners"}) |
| 499 @RetryOnFailure | |
| 500 public void testWebAppSplashscreenIsDownloaded() throws Exception { | 570 public void testWebAppSplashscreenIsDownloaded() throws Exception { |
| 501 // Sets the overriden factory to observer splash screen update. | 571 // Sets the overriden factory to observer splash screen update. |
| 502 final TestDataStorageFactory dataStorageFactory = new TestDataStorageFac
tory(); | 572 final TestDataStorageFactory dataStorageFactory = new TestDataStorageFac
tory(); |
| 503 WebappDataStorage.setFactoryForTests(dataStorageFactory); | 573 WebappDataStorage.setFactoryForTests(dataStorageFactory); |
| 504 | 574 |
| 505 triggerWebAppBanner(mWebAppUrl, WEB_APP_TITLE, true); | 575 triggerWebAppBanner(mWebAppUrl, WEB_APP_TITLE, true); |
| 506 | 576 |
| 507 // Make sure that the splash screen icon was downloaded. | 577 // Make sure that the splash screen icon was downloaded. |
| 508 CriteriaHelper.pollUiThread(new Criteria() { | 578 CriteriaHelper.pollUiThread(new Criteria() { |
| 509 @Override | 579 @Override |
| 510 public boolean isSatisfied() { | 580 public boolean isSatisfied() { |
| 511 return dataStorageFactory.mSplashImage != null; | 581 return dataStorageFactory.mSplashImage != null; |
| 512 } | 582 } |
| 513 }); | 583 }); |
| 514 | 584 |
| 515 // Test that bitmap sizes match expectations. | 585 // Test that bitmap sizes match expectations. |
| 516 int idealSize = getActivity().getResources().getDimensionPixelSize( | 586 int idealSize = getActivity().getResources().getDimensionPixelSize( |
| 517 R.dimen.webapp_splash_image_size_ideal); | 587 R.dimen.webapp_splash_image_size_ideal); |
| 518 Bitmap splashImage = ShortcutHelper.decodeBitmapFromString(dataStorageFa
ctory.mSplashImage); | 588 Bitmap splashImage = ShortcutHelper.decodeBitmapFromString(dataStorageFa
ctory.mSplashImage); |
| 519 assertEquals(idealSize, splashImage.getWidth()); | 589 assertEquals(idealSize, splashImage.getWidth()); |
| 520 assertEquals(idealSize, splashImage.getHeight()); | 590 assertEquals(idealSize, splashImage.getHeight()); |
| 521 } | 591 } |
| 522 } | 592 } |
| OLD | NEW |