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

Side by Side Diff: chrome/android/javatests/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java

Issue 2553013004: Remove the app banner navigation heuristic. (Closed)
Patch Set: Add comments Created 4 years 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 unified diff | Download patch
OLDNEW
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698