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

Side by Side Diff: chrome/android/javatests/src/org/chromium/chrome/browser/webapps/AddToHomescreenManagerTest.java

Issue 2342183002: Call AddToHomescreenDataFetcher::Observer callbacks when manifest fetch times out (Closed)
Patch Set: Merge branch 'reorder_functions' into remove_unneeded_var Created 4 years, 3 months 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.webapps; 5 package org.chromium.chrome.browser.webapps;
6 6
7 import android.app.Activity; 7 import android.app.Activity;
8 import android.content.Context; 8 import android.content.Context;
9 import android.content.Intent; 9 import android.content.Intent;
10 import android.graphics.Bitmap; 10 import android.graphics.Bitmap;
11 import android.os.Environment; 11 import android.os.Environment;
12 import android.test.suitebuilder.annotation.MediumTest;
12 import android.test.suitebuilder.annotation.SmallTest; 13 import android.test.suitebuilder.annotation.SmallTest;
13 14
14 import org.chromium.base.ThreadUtils; 15 import org.chromium.base.ThreadUtils;
15 import org.chromium.base.test.util.CommandLineFlags; 16 import org.chromium.base.test.util.CommandLineFlags;
16 import org.chromium.base.test.util.Feature; 17 import org.chromium.base.test.util.Feature;
17 import org.chromium.base.test.util.Restriction; 18 import org.chromium.base.test.util.Restriction;
18 import org.chromium.base.test.util.RetryOnFailure; 19 import org.chromium.base.test.util.RetryOnFailure;
19 import org.chromium.base.test.util.UrlUtils; 20 import org.chromium.base.test.util.UrlUtils;
20 import org.chromium.chrome.R; 21 import org.chromium.chrome.R;
21 import org.chromium.chrome.browser.ChromeActivity; 22 import org.chromium.chrome.browser.ChromeActivity;
22 import org.chromium.chrome.browser.ShortcutHelper; 23 import org.chromium.chrome.browser.ShortcutHelper;
23 import org.chromium.chrome.browser.tab.Tab; 24 import org.chromium.chrome.browser.tab.Tab;
24 import org.chromium.chrome.browser.tabmodel.TabModel; 25 import org.chromium.chrome.browser.tabmodel.TabModel;
25 import org.chromium.chrome.test.ChromeActivityTestCaseBase; 26 import org.chromium.chrome.test.ChromeActivityTestCaseBase;
26 import org.chromium.chrome.test.util.browser.TabLoadObserver; 27 import org.chromium.chrome.test.util.browser.TabLoadObserver;
28 import org.chromium.content.browser.test.util.CallbackHelper;
27 import org.chromium.content.browser.test.util.Criteria; 29 import org.chromium.content.browser.test.util.Criteria;
28 import org.chromium.content.browser.test.util.CriteriaHelper; 30 import org.chromium.content.browser.test.util.CriteriaHelper;
29 import org.chromium.content.common.ContentSwitches; 31 import org.chromium.content.common.ContentSwitches;
30 import org.chromium.net.test.EmbeddedTestServer; 32 import org.chromium.net.test.EmbeddedTestServer;
31 33
32 import java.util.concurrent.Callable; 34 import java.util.concurrent.Callable;
35 import java.util.concurrent.TimeUnit;
33 36
34 /** 37 /**
35 * Tests org.chromium.chrome.browser.webapps.AddToHomescreenManager and its C++ counterpart. 38 * Tests org.chromium.chrome.browser.webapps.AddToHomescreenManager and its C++ counterpart.
36 */ 39 */
37 @RetryOnFailure 40 @RetryOnFailure
38 public class AddToHomescreenManagerTest extends ChromeActivityTestCaseBase<Chrom eActivity> { 41 public class AddToHomescreenManagerTest extends ChromeActivityTestCaseBase<Chrom eActivity> {
39 private static final String WEBAPP_ACTION_NAME = "WEBAPP_ACTION"; 42 private static final String WEBAPP_ACTION_NAME = "WEBAPP_ACTION";
40 43
41 private static final String WEBAPP_TITLE = "Webapp shortcut"; 44 private static final String WEBAPP_TITLE = "Webapp shortcut";
42 private static final String WEBAPP_HTML = UrlUtils.encodeHtmlDataUri( 45 private static final String WEBAPP_HTML = UrlUtils.encodeHtmlDataUri(
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 108
106 @Override 109 @Override
107 public void updateSplashScreenImage(Bitmap splashScreenImage) { 110 public void updateSplashScreenImage(Bitmap splashScreenImage) {
108 assertNull(mSplashImage); 111 assertNull(mSplashImage);
109 mSplashImage = splashScreenImage; 112 mSplashImage = splashScreenImage;
110 } 113 }
111 } 114 }
112 } 115 }
113 116
114 /** 117 /**
118 * Test AddToHomescreenManager subclass which tracks whether the native call backs
119 * (a proxy for the AddToHomescreenDataFetcher::Observer callbacks) have bee n called.
120 */
121 private static class AddToHomescreenManagerCallbackTracker extends AddToHome screenManager {
122 public CallbackHelper mCallbackHelper;
123 public boolean mDialogShown = false;
124 public boolean mGotUserTitle = false;
125 public boolean mReadyToAdd = false;
126
127 public AddToHomescreenManagerCallbackTracker(Activity activity, Tab tab) {
128 super(activity, tab);
129
130 mCallbackHelper = new CallbackHelper();
131
132 AddToHomescreenManager.Observer observer = new AddToHomescreenManage r.Observer() {
133 @Override
134 public void onUserTitleAvailable(String title) {
135 mGotUserTitle = true;
136 mCallbackHelper.notifyCalled();
137 }
138
139 @Override
140 public void onReadyToAdd(Bitmap icon) {
141 mReadyToAdd = true;
142 mCallbackHelper.notifyCalled();
143 }
144 };
145 setObserver(observer);
146 }
147
148 public void waitForCallbacks(int numCallbacks, int numSecondsTimeout) th rows Exception {
149 mCallbackHelper.waitForCallback(0, numCallbacks, numSecondsTimeout, TimeUnit.SECONDS);
150 }
151
152 @Override
153 public void showDialog() {
154 mDialogShown = true;
155 mCallbackHelper.notifyCalled();
156 }
157 }
158
159 /**
115 * Test AddToHomescreenManager subclass which mocks showing the add-to-homes creen dialog and 160 * Test AddToHomescreenManager subclass which mocks showing the add-to-homes creen dialog and
116 * adds the shortcut to the home screen once it is ready. 161 * adds the shortcut to the home screen once it is ready.
117 */ 162 */
118 private static class TestAddToHomescreenManager extends AddToHomescreenManag er { 163 private static class TestAddToHomescreenManager extends AddToHomescreenManag er {
119 private String mTitle; 164 private String mTitle;
120 165
121 /** 166 /**
122 * Creates an instance of {@link TestAddToHomescreenManager}. 167 * Creates an instance of {@link TestAddToHomescreenManager}.
123 * @param title The title that the user entered into the add-to-homescre en dialog. 168 * @param title The title that the user entered into the add-to-homescre en dialog.
124 */ 169 */
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
271 // Test that bitmap sizes match expectations. 316 // Test that bitmap sizes match expectations.
272 int idealSize = mActivity.getResources().getDimensionPixelSize( 317 int idealSize = mActivity.getResources().getDimensionPixelSize(
273 R.dimen.webapp_splash_image_size_ideal); 318 R.dimen.webapp_splash_image_size_ideal);
274 assertEquals(idealSize, dataStorageFactory.mSplashImage.getWidth()); 319 assertEquals(idealSize, dataStorageFactory.mSplashImage.getWidth());
275 assertEquals(idealSize, dataStorageFactory.mSplashImage.getHeight()) ; 320 assertEquals(idealSize, dataStorageFactory.mSplashImage.getHeight()) ;
276 } finally { 321 } finally {
277 testServer.stopAndDestroyServer(); 322 testServer.stopAndDestroyServer();
278 } 323 }
279 } 324 }
280 325
326 /**
327 * Tests whether the AddToHomescreen native callbacks are called when:
328 * - WebAPKs are enabled.
329 * - the Web Manifest fetch times out.
330 */
331 @MediumTest
332 @Feature("{Webapp}")
333 public void testAddWebappShortcutManifestFetchTimesOut() throws Exception {
dominickn 2016/09/19 05:41:44 Can you test both the non-WebAPK and WebAPK paths
pkotwicz 2016/09/19 23:34:02 I have added a test for the non-WebAPK case. Shou
dominickn 2016/09/20 00:15:12 Sorry, mistyped. But OnDidDetermineWebApkCompatibi
pkotwicz 2016/09/20 01:52:35 I have added a test for a non-PWA
334 ChromeWebApkHost.initForTesting(true);
335
336 EmbeddedTestServer testServer = EmbeddedTestServer.createAndStartFileSer ver(
337 getInstrumentation().getContext(), Environment.getExternalStorag eDirectory());
338 // Register handler for "slow?1000" URL.
dominickn 2016/09/19 05:41:44 Nit: it's slow?10000 in the test file
339 testServer.addDefaultHandlers(testServer.getURL("/chrome/test/data/banne rs"));
340
341 TabLoadObserver tabLoadObserver = new TabLoadObserver(mTab);
342 tabLoadObserver.fullyLoadUrl(
343 testServer.getURL("/chrome/test/data/banners/manifest_times_out_ test_page.html"));
344
345 AddToHomescreenManagerCallbackTracker manager =
346 new AddToHomescreenManagerCallbackTracker(mActivity, mTab);
347 startManagerOnUiThread(manager);
348
349 // The AddToHomescreenDataFetcher timeout fires after 4 seconds. Wait 10 seconds to ensure
350 // that we do not miss the AddToHomescreenDataFetcher timeout timer firi ng.
351 manager.waitForCallbacks(3, 10);
352
353 assertTrue(manager.mDialogShown);
354 // This callback enables the text field in the add-to-homescreen dialog.
355 assertTrue(manager.mGotUserTitle);
356 // This callback enables the "Add" button in the add-to-homescreen dialo g.
357 assertTrue(manager.mReadyToAdd);
358
359 destroyManagerOnUiThread(manager);
360 }
361
281 private void loadUrl(String url, String expectedPageTitle) throws Exception { 362 private void loadUrl(String url, String expectedPageTitle) throws Exception {
282 new TabLoadObserver(mTab, expectedPageTitle, null).fullyLoadUrl(url); 363 new TabLoadObserver(mTab, expectedPageTitle, null).fullyLoadUrl(url);
283 } 364 }
284 365
285 private void addShortcutToTab(final Tab tab, final String title) throws Exce ption { 366 private void addShortcutToTab(Tab tab, String title) throws Exception {
286 // Add the shortcut. 367 // Add the shortcut.
287 Callable<AddToHomescreenManager> callable = 368 TestAddToHomescreenManager manager = new TestAddToHomescreenManager(mAct ivity, tab, title);
288 new Callable<AddToHomescreenManager>() { 369 startManagerOnUiThread(manager);
289 @Override
290 public AddToHomescreenManager call() {
291 AddToHomescreenManager manager =
292 new TestAddToHomescreenManager(mActivity, tab, title);
293 manager.start();
294 return manager;
295 }
296 };
297 final AddToHomescreenManager manager =
298 ThreadUtils.runOnUiThreadBlockingNoException(callable);
299 370
300 // Make sure that the shortcut was added. 371 // Make sure that the shortcut was added.
301 CriteriaHelper.pollUiThread(new Criteria() { 372 CriteriaHelper.pollUiThread(new Criteria() {
302 @Override 373 @Override
303 public boolean isSatisfied() { 374 public boolean isSatisfied() {
304 return mShortcutHelperDelegate.mBroadcastedIntent != null; 375 return mShortcutHelperDelegate.mBroadcastedIntent != null;
305 } 376 }
306 }); 377 });
307 378
379 destroyManagerOnUiThread(manager);
380 }
381
382 private void startManagerOnUiThread(final AddToHomescreenManager manager) {
308 ThreadUtils.runOnUiThreadBlocking(new Runnable() { 383 ThreadUtils.runOnUiThreadBlocking(new Runnable() {
309 @Override 384 @Override
310 public void run() { 385 public void run() {
386 manager.start();
387 }
388 });
389 }
390
391 private void destroyManagerOnUiThread(final AddToHomescreenManager manager) {
392 ThreadUtils.runOnUiThreadBlocking(new Runnable() {
393 @Override
394 public void run() {
311 manager.destroy(); 395 manager.destroy();
312 } 396 }
313 }); 397 });
314 } 398 }
315 399
316 /** 400 /**
317 * Spawns popup via window.open() at {@link url}. 401 * Spawns popup via window.open() at {@link url}.
318 */ 402 */
319 private Tab spawnPopupInBackground(final String url) throws InterruptedExcep tion { 403 private Tab spawnPopupInBackground(final String url) throws InterruptedExcep tion {
320 ThreadUtils.runOnUiThreadBlocking(new Runnable() { 404 ThreadUtils.runOnUiThreadBlocking(new Runnable() {
(...skipping 12 matching lines...) Expand all
333 public Integer call() { 417 public Integer call() {
334 return getActivity().getTabModelSelector().getModel(false).getCo unt(); 418 return getActivity().getTabModelSelector().getModel(false).getCo unt();
335 } 419 }
336 })); 420 }));
337 421
338 TabModel tabModel = getActivity().getTabModelSelector().getModel(false); 422 TabModel tabModel = getActivity().getTabModelSelector().getModel(false);
339 assertEquals(0, tabModel.indexOf(mTab)); 423 assertEquals(0, tabModel.indexOf(mTab));
340 return getActivity().getTabModelSelector().getModel(false).getTabAt(1); 424 return getActivity().getTabModelSelector().getModel(false).getTabAt(1);
341 } 425 }
342 } 426 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698