Chromium Code Reviews| 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.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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 } |
| OLD | NEW |