| 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 static org.junit.Assert.assertEquals; | 7 import static org.junit.Assert.assertEquals; |
| 8 import static org.junit.Assert.assertTrue; | 8 import static org.junit.Assert.assertTrue; |
| 9 | 9 |
| 10 import android.content.Context; | 10 import android.content.Context; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 38 // These were copied from WebappRegistry for backward compatibility checking
. | 38 // These were copied from WebappRegistry for backward compatibility checking
. |
| 39 private static final String REGISTRY_FILE_NAME = "webapp_registry"; | 39 private static final String REGISTRY_FILE_NAME = "webapp_registry"; |
| 40 private static final String KEY_WEBAPP_SET = "webapp_set"; | 40 private static final String KEY_WEBAPP_SET = "webapp_set"; |
| 41 private static final String KEY_LAST_CLEANUP = "last_cleanup"; | 41 private static final String KEY_LAST_CLEANUP = "last_cleanup"; |
| 42 | 42 |
| 43 private static final int INITIAL_TIME = 0; | 43 private static final int INITIAL_TIME = 0; |
| 44 | 44 |
| 45 private SharedPreferences mSharedPreferences; | 45 private SharedPreferences mSharedPreferences; |
| 46 private boolean mCallbackCalled; | 46 private boolean mCallbackCalled; |
| 47 | 47 |
| 48 private class FetchCallback implements WebappRegistry.FetchCallback { | 48 private static class FetchCallback implements WebappRegistry.FetchCallback { |
| 49 boolean mCallbackCalled; |
| 50 |
| 49 Set<String> mExpected; | 51 Set<String> mExpected; |
| 50 | 52 |
| 51 FetchCallback(Set<String> expected) { | 53 FetchCallback(Set<String> expected) { |
| 54 mCallbackCalled = false; |
| 52 mExpected = expected; | 55 mExpected = expected; |
| 53 } | 56 } |
| 54 | 57 |
| 55 @Override | 58 @Override |
| 56 public void onWebappIdsRetrieved(Set<String> actual) { | 59 public void onWebappIdsRetrieved(Set<String> actual) { |
| 57 mCallbackCalled = true; | 60 mCallbackCalled = true; |
| 58 assertEquals(mExpected, actual); | 61 assertEquals(mExpected, actual); |
| 59 } | 62 } |
| 63 |
| 64 boolean getCallbackCalled() { |
| 65 return mCallbackCalled; |
| 66 } |
| 60 } | 67 } |
| 61 | 68 |
| 62 private class FetchStorageCallback implements WebappRegistry.FetchWebappData
StorageCallback { | 69 private static class FetchStorageCallback |
| 70 implements WebappRegistry.FetchWebappDataStorageCallback { |
| 63 Intent mShortcutIntent; | 71 Intent mShortcutIntent; |
| 72 boolean mMarkLaunched; |
| 73 boolean mCallbackCalled; |
| 64 | 74 |
| 65 FetchStorageCallback(Intent shortcutIntent) { | 75 FetchStorageCallback(Intent shortcutIntent, boolean markLaunched) { |
| 66 mCallbackCalled = false; | 76 mCallbackCalled = false; |
| 67 mShortcutIntent = shortcutIntent; | 77 mShortcutIntent = shortcutIntent; |
| 78 mMarkLaunched = markLaunched; |
| 68 } | 79 } |
| 69 | 80 |
| 70 @Override | 81 @Override |
| 71 public void onWebappDataStorageRetrieved(WebappDataStorage storage) { | 82 public void onWebappDataStorageRetrieved(WebappDataStorage storage) { |
| 72 mCallbackCalled = true; | 83 mCallbackCalled = true; |
| 73 storage.updateFromShortcutIntent(mShortcutIntent); | 84 storage.updateFromShortcutIntent(mShortcutIntent); |
| 85 storage.updateLastUsedTime(); |
| 86 if (mMarkLaunched) storage.setLaunched(); |
| 87 } |
| 88 |
| 89 boolean getCallbackCalled() { |
| 90 return mCallbackCalled; |
| 74 } | 91 } |
| 75 } | 92 } |
| 76 | 93 |
| 77 private class CallbackRunner implements Runnable { | 94 private static class FetchStorageByUrlCallback |
| 95 implements WebappRegistry.FetchWebappDataStorageCallback { |
| 96 String mUrl; |
| 97 String mScope; |
| 98 boolean mCallbackCalled; |
| 99 |
| 100 FetchStorageByUrlCallback(String url, String scope) { |
| 101 mCallbackCalled = false; |
| 102 mUrl = url; |
| 103 mScope = scope; |
| 104 } |
| 105 |
| 106 @Override |
| 107 public void onWebappDataStorageRetrieved(WebappDataStorage storage) { |
| 108 mCallbackCalled = true; |
| 109 assertEquals(mUrl, storage.getUrl()); |
| 110 assertEquals(mScope, storage.getScope()); |
| 111 } |
| 112 |
| 113 boolean getCallbackCalled() { |
| 114 return mCallbackCalled; |
| 115 } |
| 116 } |
| 117 |
| 118 private static class CallbackRunner implements Runnable { |
| 119 boolean mCallbackCalled; |
| 120 |
| 78 public CallbackRunner() { | 121 public CallbackRunner() { |
| 79 mCallbackCalled = false; | 122 mCallbackCalled = false; |
| 80 } | 123 } |
| 81 | 124 |
| 82 @Override | 125 @Override |
| 83 public void run() { | 126 public void run() { |
| 84 mCallbackCalled = true; | 127 mCallbackCalled = true; |
| 85 } | 128 } |
| 129 |
| 130 boolean getCallbackCalled() { |
| 131 return mCallbackCalled; |
| 132 } |
| 86 } | 133 } |
| 87 | 134 |
| 88 @Before | 135 @Before |
| 89 public void setUp() throws Exception { | 136 public void setUp() throws Exception { |
| 90 mSharedPreferences = Robolectric.application | 137 mSharedPreferences = Robolectric.application |
| 91 .getSharedPreferences(REGISTRY_FILE_NAME, Context.MODE_PRIVATE); | 138 .getSharedPreferences(REGISTRY_FILE_NAME, Context.MODE_PRIVATE); |
| 92 mSharedPreferences.edit().putLong(KEY_LAST_CLEANUP, INITIAL_TIME).commit
(); | 139 mSharedPreferences.edit().putLong(KEY_LAST_CLEANUP, INITIAL_TIME).commit
(); |
| 93 | 140 |
| 94 mCallbackCalled = false; | 141 mCallbackCalled = false; |
| 95 } | 142 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 109 BackgroundShadowAsyncTask.runBackgroundTasks(); | 156 BackgroundShadowAsyncTask.runBackgroundTasks(); |
| 110 | 157 |
| 111 Set<String> actual = mSharedPreferences.getStringSet( | 158 Set<String> actual = mSharedPreferences.getStringSet( |
| 112 WebappRegistry.KEY_WEBAPP_SET, Collections.<String>emptySet()); | 159 WebappRegistry.KEY_WEBAPP_SET, Collections.<String>emptySet()); |
| 113 assertEquals(1, actual.size()); | 160 assertEquals(1, actual.size()); |
| 114 assertTrue(actual.contains("test")); | 161 assertTrue(actual.contains("test")); |
| 115 } | 162 } |
| 116 | 163 |
| 117 @Test | 164 @Test |
| 118 @Feature({"Webapp"}) | 165 @Feature({"Webapp"}) |
| 119 public void testWebappRegistrationUpdatesLastUsed() throws Exception { | 166 public void testWebappRegistrationUpdatesLastUsedAndDoesNotMarkLaunched() th
rows Exception { |
| 120 long before = System.currentTimeMillis(); | |
| 121 | |
| 122 WebappRegistry.registerWebapp(Robolectric.application, "test", null); | 167 WebappRegistry.registerWebapp(Robolectric.application, "test", null); |
| 123 BackgroundShadowAsyncTask.runBackgroundTasks(); | 168 BackgroundShadowAsyncTask.runBackgroundTasks(); |
| 124 long after = System.currentTimeMillis(); | 169 long after = System.currentTimeMillis(); |
| 125 | 170 |
| 126 SharedPreferences webAppPrefs = Robolectric.application.getSharedPrefere
nces( | 171 SharedPreferences webAppPrefs = Robolectric.application.getSharedPrefere
nces( |
| 127 WebappDataStorage.SHARED_PREFS_FILE_PREFIX + "test", Context.MOD
E_PRIVATE); | 172 WebappDataStorage.SHARED_PREFS_FILE_PREFIX + "test", Context.MOD
E_PRIVATE); |
| 128 long actual = webAppPrefs.getLong(WebappDataStorage.KEY_LAST_USED, | 173 long actual = webAppPrefs.getLong(WebappDataStorage.KEY_LAST_USED, |
| 129 WebappDataStorage.LAST_USED_INVALID); | 174 WebappDataStorage.LAST_USED_INVALID); |
| 130 assertTrue("Timestamp is out of range", before <= actual && actual <= af
ter); | 175 assertTrue("Timestamp is out of range", actual <= after); |
| 176 |
| 177 assertTrue(!webAppPrefs.getBoolean(WebappDataStorage.KEY_LAUNCHED, false
)); |
| 131 } | 178 } |
| 132 | 179 |
| 133 @Test | 180 @Test |
| 134 @Feature({"Webapp"}) | 181 @Feature({"Webapp"}) |
| 135 public void testWebappIdsRetrieval() throws Exception { | 182 public void testWebappIdsRetrieval() throws Exception { |
| 136 final Set<String> expected = addWebappsToRegistry("first", "second"); | 183 final Set<String> expected = addWebappsToRegistry("first", "second"); |
| 137 | 184 |
| 138 WebappRegistry.getRegisteredWebappIds(Robolectric.application, new Fetch
Callback(expected)); | 185 FetchCallback callback = new FetchCallback(expected); |
| 186 WebappRegistry.getRegisteredWebappIds(Robolectric.application, callback)
; |
| 139 BackgroundShadowAsyncTask.runBackgroundTasks(); | 187 BackgroundShadowAsyncTask.runBackgroundTasks(); |
| 140 Robolectric.runUiThreadTasks(); | 188 Robolectric.runUiThreadTasks(); |
| 141 | 189 |
| 142 assertTrue(mCallbackCalled); | 190 assertTrue(callback.getCallbackCalled()); |
| 143 } | 191 } |
| 144 | 192 |
| 145 @Test | 193 @Test |
| 146 @Feature({"Webapp"}) | 194 @Feature({"Webapp"}) |
| 147 public void testWebappIdsRetrievalRegisterRetrival() throws Exception { | 195 public void testWebappIdsRetrievalRegisterRetrival() throws Exception { |
| 148 final Set<String> expected = addWebappsToRegistry("first"); | 196 final Set<String> expected = addWebappsToRegistry("first"); |
| 149 | 197 |
| 150 WebappRegistry.getRegisteredWebappIds(Robolectric.application, new Fetch
Callback(expected)); | 198 FetchCallback callback = new FetchCallback(expected); |
| 199 WebappRegistry.getRegisteredWebappIds(Robolectric.application, callback)
; |
| 151 BackgroundShadowAsyncTask.runBackgroundTasks(); | 200 BackgroundShadowAsyncTask.runBackgroundTasks(); |
| 152 Robolectric.runUiThreadTasks(); | 201 Robolectric.runUiThreadTasks(); |
| 153 | 202 |
| 154 assertTrue(mCallbackCalled); | 203 assertTrue(callback.getCallbackCalled()); |
| 155 mCallbackCalled = false; | |
| 156 | 204 |
| 157 WebappRegistry.registerWebapp(Robolectric.application, "second", null); | 205 WebappRegistry.registerWebapp(Robolectric.application, "second", null); |
| 158 BackgroundShadowAsyncTask.runBackgroundTasks(); | 206 BackgroundShadowAsyncTask.runBackgroundTasks(); |
| 159 | 207 |
| 160 // A copy of the expected set needs to be made as the SharedPreferences
is using the copy | 208 // A copy of the expected set needs to be made as the SharedPreferences
is using the copy |
| 161 // that was paassed to it. | 209 // that was paassed to it. |
| 162 final Set<String> secondExpected = new HashSet<String>(expected); | 210 final Set<String> secondExpected = new HashSet<String>(expected); |
| 163 secondExpected.add("second"); | 211 secondExpected.add("second"); |
| 164 | 212 |
| 165 WebappRegistry.getRegisteredWebappIds(Robolectric.application, | 213 callback = new FetchCallback(secondExpected); |
| 166 new FetchCallback(secondExpected)); | 214 WebappRegistry.getRegisteredWebappIds(Robolectric.application, callback)
; |
| 167 BackgroundShadowAsyncTask.runBackgroundTasks(); | 215 BackgroundShadowAsyncTask.runBackgroundTasks(); |
| 168 Robolectric.runUiThreadTasks(); | 216 Robolectric.runUiThreadTasks(); |
| 169 | 217 |
| 170 assertTrue(mCallbackCalled); | 218 assertTrue(callback.getCallbackCalled()); |
| 171 } | 219 } |
| 172 | 220 |
| 173 @Test | 221 @Test |
| 174 @Feature({"Webapp"}) | 222 @Feature({"Webapp"}) |
| 175 public void testUnregisterRunsCallback() throws Exception { | 223 public void testUnregisterRunsCallback() throws Exception { |
| 176 WebappRegistry.unregisterAllWebapps(Robolectric.application, new Callbac
kRunner()); | 224 CallbackRunner callback = new CallbackRunner(); |
| 225 WebappRegistry.unregisterAllWebapps(Robolectric.application, callback); |
| 177 BackgroundShadowAsyncTask.runBackgroundTasks(); | 226 BackgroundShadowAsyncTask.runBackgroundTasks(); |
| 178 Robolectric.runUiThreadTasks(); | 227 Robolectric.runUiThreadTasks(); |
| 179 | 228 |
| 180 assertTrue(mCallbackCalled); | 229 assertTrue(callback.getCallbackCalled()); |
| 181 } | 230 } |
| 182 | 231 |
| 183 @Test | 232 @Test |
| 184 @Feature({"Webapp"}) | 233 @Feature({"Webapp"}) |
| 185 public void testUnregisterClearsRegistry() throws Exception { | 234 public void testUnregisterClearsRegistry() throws Exception { |
| 186 addWebappsToRegistry("test"); | 235 addWebappsToRegistry("test"); |
| 187 | 236 |
| 188 WebappRegistry.unregisterAllWebapps(Robolectric.application, new Callbac
kRunner()); | 237 CallbackRunner callback = new CallbackRunner(); |
| 238 WebappRegistry.unregisterAllWebapps(Robolectric.application, callback); |
| 189 BackgroundShadowAsyncTask.runBackgroundTasks(); | 239 BackgroundShadowAsyncTask.runBackgroundTasks(); |
| 190 Robolectric.runUiThreadTasks(); | 240 Robolectric.runUiThreadTasks(); |
| 191 | 241 |
| 192 assertTrue(mCallbackCalled); | 242 assertTrue(callback.getCallbackCalled()); |
| 193 assertTrue(getRegisteredWebapps().isEmpty()); | 243 assertTrue(getRegisteredWebapps().isEmpty()); |
| 194 } | 244 } |
| 195 | 245 |
| 196 @Test | 246 @Test |
| 197 @Feature({"Webapp"}) | 247 @Feature({"Webapp"}) |
| 198 public void testUnregisterClearsWebappDataStorage() throws Exception { | 248 public void testUnregisterClearsWebappDataStorage() throws Exception { |
| 199 addWebappsToRegistry("test"); | 249 addWebappsToRegistry("test"); |
| 200 SharedPreferences webAppPrefs = Robolectric.application.getSharedPrefere
nces( | 250 SharedPreferences webAppPrefs = Robolectric.application.getSharedPrefere
nces( |
| 201 WebappDataStorage.SHARED_PREFS_FILE_PREFIX + "test", Context.MOD
E_PRIVATE); | 251 WebappDataStorage.SHARED_PREFS_FILE_PREFIX + "test", Context.MOD
E_PRIVATE); |
| 202 webAppPrefs.edit() | 252 webAppPrefs.edit() |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 300 WebappDataStorage.LAST_USED_INVALID); | 350 WebappDataStorage.LAST_USED_INVALID); |
| 301 assertEquals(WebappDataStorage.LAST_USED_INVALID, actualLastUsed); | 351 assertEquals(WebappDataStorage.LAST_USED_INVALID, actualLastUsed); |
| 302 | 352 |
| 303 long lastCleanup = mSharedPreferences.getLong(WebappRegistry.KEY_LAST_CL
EANUP, -1); | 353 long lastCleanup = mSharedPreferences.getLong(WebappRegistry.KEY_LAST_CL
EANUP, -1); |
| 304 assertEquals(currentTime, lastCleanup); | 354 assertEquals(currentTime, lastCleanup); |
| 305 } | 355 } |
| 306 | 356 |
| 307 @Test | 357 @Test |
| 308 @Feature({"Webapp"}) | 358 @Feature({"Webapp"}) |
| 309 public void testClearWebappHistoryRunsCallback() throws Exception { | 359 public void testClearWebappHistoryRunsCallback() throws Exception { |
| 310 WebappRegistry.clearWebappHistory(Robolectric.application, new CallbackR
unner()); | 360 CallbackRunner callback = new CallbackRunner(); |
| 361 WebappRegistry.clearWebappHistory(Robolectric.application, callback); |
| 311 BackgroundShadowAsyncTask.runBackgroundTasks(); | 362 BackgroundShadowAsyncTask.runBackgroundTasks(); |
| 312 Robolectric.runUiThreadTasks(); | 363 Robolectric.runUiThreadTasks(); |
| 313 | 364 |
| 314 assertTrue(mCallbackCalled); | 365 assertTrue(callback.getCallbackCalled()); |
| 315 } | 366 } |
| 316 | 367 |
| 317 @Test | 368 @Test |
| 318 @Feature({"Webapp"}) | 369 @Feature({"Webapp"}) |
| 319 public void testClearWebappHistory() throws Exception { | 370 public void testClearWebappHistory() throws Exception { |
| 320 final String webapp1Url = "https://www.google.com"; | 371 final String webapp1Url = "https://www.google.com"; |
| 321 final String webapp2Url = "https://drive.google.com"; | 372 final String webapp2Url = "https://drive.google.com"; |
| 322 Intent shortcutIntent1 = createShortcutIntent(webapp1Url); | 373 Intent shortcutIntent1 = createShortcutIntent(webapp1Url); |
| 323 Intent shortcutIntent2 = createShortcutIntent(webapp2Url); | 374 Intent shortcutIntent2 = createShortcutIntent(webapp2Url); |
| 324 | 375 |
| 325 WebappRegistry.registerWebapp(Robolectric.application, "webapp1", | 376 FetchStorageCallback storageCallback1 = new FetchStorageCallback(shortcu
tIntent1, true); |
| 326 new FetchStorageCallback(shortcutIntent1)); | 377 WebappRegistry.registerWebapp(Robolectric.application, "webapp1", storag
eCallback1); |
| 327 BackgroundShadowAsyncTask.runBackgroundTasks(); | 378 BackgroundShadowAsyncTask.runBackgroundTasks(); |
| 328 Robolectric.runUiThreadTasks(); | 379 Robolectric.runUiThreadTasks(); |
| 329 assertTrue(mCallbackCalled); | 380 assertTrue(storageCallback1.getCallbackCalled()); |
| 330 | 381 |
| 331 WebappRegistry.registerWebapp(Robolectric.application, "webapp2", | 382 FetchStorageCallback storageCallback2 = new FetchStorageCallback(shortcu
tIntent2, false); |
| 332 new FetchStorageCallback(shortcutIntent2)); | 383 WebappRegistry.registerWebapp(Robolectric.application, "webapp2", storag
eCallback2); |
| 333 BackgroundShadowAsyncTask.runBackgroundTasks(); | 384 BackgroundShadowAsyncTask.runBackgroundTasks(); |
| 334 Robolectric.runUiThreadTasks(); | 385 Robolectric.runUiThreadTasks(); |
| 335 assertTrue(mCallbackCalled); | 386 assertTrue(storageCallback2.getCallbackCalled()); |
| 336 | 387 |
| 337 SharedPreferences webapp1Prefs = Robolectric.application.getSharedPrefer
ences( | 388 SharedPreferences webapp1Prefs = Robolectric.application.getSharedPrefer
ences( |
| 338 WebappDataStorage.SHARED_PREFS_FILE_PREFIX + "webapp1", Context.
MODE_PRIVATE); | 389 WebappDataStorage.SHARED_PREFS_FILE_PREFIX + "webapp1", Context.
MODE_PRIVATE); |
| 339 SharedPreferences webapp2Prefs = Robolectric.application.getSharedPrefer
ences( | 390 SharedPreferences webapp2Prefs = Robolectric.application.getSharedPrefer
ences( |
| 340 WebappDataStorage.SHARED_PREFS_FILE_PREFIX + "webapp2", Context.
MODE_PRIVATE); | 391 WebappDataStorage.SHARED_PREFS_FILE_PREFIX + "webapp2", Context.
MODE_PRIVATE); |
| 341 | 392 |
| 342 WebappRegistry.clearWebappHistory(Robolectric.application, new CallbackR
unner()); | 393 CallbackRunner callback = new CallbackRunner(); |
| 394 WebappRegistry.clearWebappHistory(Robolectric.application, callback); |
| 343 BackgroundShadowAsyncTask.runBackgroundTasks(); | 395 BackgroundShadowAsyncTask.runBackgroundTasks(); |
| 344 Robolectric.runUiThreadTasks(); | 396 Robolectric.runUiThreadTasks(); |
| 345 assertTrue(mCallbackCalled); | 397 assertTrue(callback.getCallbackCalled()); |
| 346 | 398 |
| 347 Set<String> actual = mSharedPreferences.getStringSet( | 399 Set<String> actual = mSharedPreferences.getStringSet( |
| 348 WebappRegistry.KEY_WEBAPP_SET, Collections.<String>emptySet()); | 400 WebappRegistry.KEY_WEBAPP_SET, Collections.<String>emptySet()); |
| 349 assertEquals(2, actual.size()); | 401 assertEquals(2, actual.size()); |
| 350 assertTrue(actual.contains("webapp1")); | 402 assertTrue(actual.contains("webapp1")); |
| 351 assertTrue(actual.contains("webapp2")); | 403 assertTrue(actual.contains("webapp2")); |
| 352 | 404 |
| 353 // Verify that the last used time for both web apps is WebappDataStorage
.LAST_USED_UNSET. | 405 // Verify that the last used time for both web apps is WebappDataStorage
.LAST_USED_UNSET. |
| 354 long actualLastUsed = webapp1Prefs.getLong( | 406 long actualLastUsed = webapp1Prefs.getLong( |
| 355 WebappDataStorage.KEY_LAST_USED, WebappDataStorage.LAST_USED_UNS
ET); | 407 WebappDataStorage.KEY_LAST_USED, WebappDataStorage.LAST_USED_UNS
ET); |
| 356 assertEquals(WebappDataStorage.LAST_USED_UNSET, actualLastUsed); | 408 assertEquals(WebappDataStorage.LAST_USED_UNSET, actualLastUsed); |
| 357 actualLastUsed = webapp2Prefs.getLong( | 409 actualLastUsed = webapp2Prefs.getLong( |
| 358 WebappDataStorage.KEY_LAST_USED, WebappDataStorage.LAST_USED_UNS
ET); | 410 WebappDataStorage.KEY_LAST_USED, WebappDataStorage.LAST_USED_UNS
ET); |
| 359 assertEquals(WebappDataStorage.LAST_USED_UNSET, actualLastUsed); | 411 assertEquals(WebappDataStorage.LAST_USED_UNSET, actualLastUsed); |
| 360 | 412 |
| 413 // Verify that neither web app is marked as launched. |
| 414 assertTrue(!webapp1Prefs.getBoolean(WebappDataStorage.KEY_LAUNCHED, fals
e)); |
| 415 assertTrue(!webapp2Prefs.getBoolean(WebappDataStorage.KEY_LAUNCHED, fals
e)); |
| 416 |
| 361 // Verify that the URL and scope for both web apps is WebappDataStorage.
URL_INVALID. | 417 // Verify that the URL and scope for both web apps is WebappDataStorage.
URL_INVALID. |
| 362 String actualScope = webapp1Prefs.getString( | 418 String actualScope = webapp1Prefs.getString( |
| 363 WebappDataStorage.KEY_SCOPE, WebappDataStorage.URL_INVALID); | 419 WebappDataStorage.KEY_SCOPE, WebappDataStorage.URL_INVALID); |
| 364 assertEquals(WebappDataStorage.URL_INVALID, actualScope); | 420 assertEquals(WebappDataStorage.URL_INVALID, actualScope); |
| 365 String actualUrl = webapp1Prefs.getString( | 421 String actualUrl = webapp1Prefs.getString( |
| 366 WebappDataStorage.KEY_URL, WebappDataStorage.URL_INVALID); | 422 WebappDataStorage.KEY_URL, WebappDataStorage.URL_INVALID); |
| 367 assertEquals(WebappDataStorage.URL_INVALID, actualUrl); | 423 assertEquals(WebappDataStorage.URL_INVALID, actualUrl); |
| 368 actualScope = webapp2Prefs.getString( | 424 actualScope = webapp2Prefs.getString( |
| 369 WebappDataStorage.KEY_SCOPE, WebappDataStorage.URL_INVALID); | 425 WebappDataStorage.KEY_SCOPE, WebappDataStorage.URL_INVALID); |
| 370 assertEquals(WebappDataStorage.URL_INVALID, actualScope); | 426 assertEquals(WebappDataStorage.URL_INVALID, actualScope); |
| 371 actualUrl = webapp2Prefs.getString( | 427 actualUrl = webapp2Prefs.getString( |
| 372 WebappDataStorage.KEY_URL, WebappDataStorage.URL_INVALID); | 428 WebappDataStorage.KEY_URL, WebappDataStorage.URL_INVALID); |
| 373 assertEquals(WebappDataStorage.URL_INVALID, actualUrl); | 429 assertEquals(WebappDataStorage.URL_INVALID, actualUrl); |
| 374 } | 430 } |
| 375 | 431 |
| 376 @Test | 432 @Test |
| 377 @Feature({"Webapp"}) | 433 @Feature({"Webapp"}) |
| 378 public void testGetAfterClearWebappHistory() throws Exception { | 434 public void testGetAfterClearWebappHistory() throws Exception { |
| 379 WebappRegistry.registerWebapp(Robolectric.application, "webapp", null); | 435 WebappRegistry.registerWebapp(Robolectric.application, "webapp", null); |
| 380 BackgroundShadowAsyncTask.runBackgroundTasks(); | 436 BackgroundShadowAsyncTask.runBackgroundTasks(); |
| 381 | 437 |
| 382 SharedPreferences webappPrefs = Robolectric.application.getSharedPrefere
nces( | 438 SharedPreferences webappPrefs = Robolectric.application.getSharedPrefere
nces( |
| 383 WebappDataStorage.SHARED_PREFS_FILE_PREFIX + "webapp", Context.M
ODE_PRIVATE); | 439 WebappDataStorage.SHARED_PREFS_FILE_PREFIX + "webapp", Context.M
ODE_PRIVATE); |
| 384 WebappRegistry.clearWebappHistory(Robolectric.application, new CallbackR
unner()); | 440 CallbackRunner callback = new CallbackRunner(); |
| 441 WebappRegistry.clearWebappHistory(Robolectric.application, callback); |
| 385 BackgroundShadowAsyncTask.runBackgroundTasks(); | 442 BackgroundShadowAsyncTask.runBackgroundTasks(); |
| 386 Robolectric.runUiThreadTasks(); | 443 Robolectric.runUiThreadTasks(); |
| 387 assertTrue(mCallbackCalled); | 444 assertTrue(callback.getCallbackCalled()); |
| 388 | 445 |
| 389 // Open the webapp up to set the last used time. | 446 // Open the webapp up to set the last used time and launched. |
| 390 WebappRegistry.getWebappDataStorage(Robolectric.application, "webapp", | 447 FetchStorageCallback storageCallback = new FetchStorageCallback(null, tr
ue); |
| 391 new FetchStorageCallback(null)); | 448 WebappRegistry.getWebappDataStorage(Robolectric.application, "webapp", s
torageCallback); |
| 392 BackgroundShadowAsyncTask.runBackgroundTasks(); | 449 BackgroundShadowAsyncTask.runBackgroundTasks(); |
| 393 Robolectric.runUiThreadTasks(); | 450 Robolectric.runUiThreadTasks(); |
| 394 assertTrue(mCallbackCalled); | 451 assertTrue(storageCallback.getCallbackCalled()); |
| 395 | 452 |
| 396 // Verify that the last used time is valid. | 453 // Verify that the last used time is valid. |
| 397 long actualLastUsed = webappPrefs.getLong( | 454 long actualLastUsed = webappPrefs.getLong( |
| 398 WebappDataStorage.KEY_LAST_USED, WebappDataStorage.LAST_USED_INV
ALID); | 455 WebappDataStorage.KEY_LAST_USED, WebappDataStorage.LAST_USED_INV
ALID); |
| 399 assertTrue(WebappDataStorage.LAST_USED_INVALID != actualLastUsed); | 456 assertTrue(WebappDataStorage.LAST_USED_INVALID != actualLastUsed); |
| 400 assertTrue(WebappDataStorage.LAST_USED_UNSET != actualLastUsed); | 457 assertTrue(WebappDataStorage.LAST_USED_UNSET != actualLastUsed); |
| 458 |
| 459 // Verify that the app is marked as launched. |
| 460 assertTrue(webappPrefs.getBoolean(WebappDataStorage.KEY_LAUNCHED, false)
); |
| 401 } | 461 } |
| 402 | 462 |
| 403 @Test | 463 @Test |
| 404 @Feature({"Webapp"}) | 464 @Feature({"Webapp"}) |
| 405 public void testUpdateAfterClearWebappHistory() throws Exception { | 465 public void testUpdateAfterClearWebappHistory() throws Exception { |
| 406 final String webappUrl = "http://www.google.com"; | 466 final String webappUrl = "http://www.google.com"; |
| 467 final String webappScope = "http://www.google.com/"; |
| 407 final Intent shortcutIntent = createShortcutIntent(webappUrl); | 468 final Intent shortcutIntent = createShortcutIntent(webappUrl); |
| 408 WebappRegistry.registerWebapp(Robolectric.application, "webapp", | 469 WebappRegistry.registerWebapp(Robolectric.application, "webapp", |
| 409 new FetchStorageCallback(shortcutIntent)); | 470 new FetchStorageCallback(shortcutIntent, false)); |
| 410 BackgroundShadowAsyncTask.runBackgroundTasks(); | 471 BackgroundShadowAsyncTask.runBackgroundTasks(); |
| 411 Robolectric.runUiThreadTasks(); | 472 Robolectric.runUiThreadTasks(); |
| 412 assertTrue(mCallbackCalled); | |
| 413 | 473 |
| 414 SharedPreferences webappPrefs = Robolectric.application.getSharedPrefere
nces( | 474 SharedPreferences webappPrefs = Robolectric.application.getSharedPrefere
nces( |
| 415 WebappDataStorage.SHARED_PREFS_FILE_PREFIX + "webapp", Context.M
ODE_PRIVATE); | 475 WebappDataStorage.SHARED_PREFS_FILE_PREFIX + "webapp", Context.M
ODE_PRIVATE); |
| 416 | 476 |
| 477 // Verify that the app is not marked as launched. |
| 478 assertTrue(!webappPrefs.getBoolean(WebappDataStorage.KEY_LAUNCHED, false
)); |
| 479 |
| 417 // Verify that the URL and scope match the original in the intent. | 480 // Verify that the URL and scope match the original in the intent. |
| 418 String actualURL = webappPrefs.getString( | 481 String actualUrl = webappPrefs.getString( |
| 419 WebappDataStorage.KEY_URL, WebappDataStorage.URL_INVALID); | 482 WebappDataStorage.KEY_URL, WebappDataStorage.URL_INVALID); |
| 420 assertEquals(webappUrl, actualURL); | 483 assertEquals(webappUrl, actualUrl); |
| 421 String actualScope = webappPrefs.getString( | 484 String actualScope = webappPrefs.getString( |
| 422 WebappDataStorage.KEY_SCOPE, WebappDataStorage.URL_INVALID); | 485 WebappDataStorage.KEY_SCOPE, WebappDataStorage.URL_INVALID); |
| 423 assertEquals(webappUrl, actualScope); | 486 assertEquals(webappScope, actualScope); |
| 424 | 487 |
| 425 WebappRegistry.clearWebappHistory(Robolectric.application, new CallbackR
unner()); | 488 WebappRegistry.clearWebappHistory(Robolectric.application, new CallbackR
unner()); |
| 426 BackgroundShadowAsyncTask.runBackgroundTasks(); | 489 BackgroundShadowAsyncTask.runBackgroundTasks(); |
| 427 Robolectric.runUiThreadTasks(); | 490 Robolectric.runUiThreadTasks(); |
| 428 assertTrue(mCallbackCalled); | |
| 429 | 491 |
| 430 // Update the webapp from the intent again. | 492 // Update the webapp from the intent again. |
| 431 WebappRegistry.getWebappDataStorage(Robolectric.application, "webapp", | 493 WebappRegistry.getWebappDataStorage(Robolectric.application, "webapp", |
| 432 new FetchStorageCallback(shortcutIntent)); | 494 new FetchStorageCallback(shortcutIntent, true)); |
| 495 BackgroundShadowAsyncTask.runBackgroundTasks(); |
| 496 Robolectric.runUiThreadTasks(); |
| 497 |
| 498 // Verify that the app is marked as launched. |
| 499 assertTrue(webappPrefs.getBoolean(WebappDataStorage.KEY_LAUNCHED, false)
); |
| 500 |
| 501 // Verify that the URL and scope match the original in the intent. |
| 502 actualUrl = webappPrefs.getString(WebappDataStorage.KEY_URL, WebappDataS
torage.URL_INVALID); |
| 503 assertEquals(webappUrl, actualUrl); |
| 504 actualScope = webappPrefs.getString( |
| 505 WebappDataStorage.KEY_SCOPE, WebappDataStorage.URL_INVALID); |
| 506 assertEquals(webappScope, actualScope); |
| 507 } |
| 508 |
| 509 @Test |
| 510 @Feature({"Webapp"}) |
| 511 public void testGetWebappDataStorageForUrl() throws Exception { |
| 512 // Ensure that getWebappDataStorageForUrl returns the correct WebappData
Storage object. |
| 513 // URLs should return the WebappDataStorage with the longest scope that
the URL starts with. |
| 514 final String webapp1Url = "https://www.google.com/"; |
| 515 final String webapp2Url = "https://drive.google.com/"; |
| 516 final String webapp3Url = "https://www.google.com/drive/index.html"; |
| 517 final String webapp4Url = "https://www.google.com/drive/docs/index.html"
; |
| 518 |
| 519 final String webapp3Scope = "https://www.google.com/drive/"; |
| 520 final String webapp4Scope = "https://www.google.com/drive/docs/"; |
| 521 |
| 522 final String test1Url = "https://www.google.com/index.html"; |
| 523 final String test2Url = "https://www.google.com/drive/recent.html"; |
| 524 final String test3Url = "https://www.google.com/drive/docs/recent.html"; |
| 525 final String test4Url = "https://www.google.com/drive/docs/recent/index.
html"; |
| 526 final String test5Url = "https://drive.google.com/docs/recent/trash"; |
| 527 final String test6Url = "https://maps.google.com/"; |
| 528 |
| 529 Intent shortcutIntent1 = createShortcutIntent(webapp1Url); |
| 530 Intent shortcutIntent2 = createShortcutIntent(webapp2Url); |
| 531 Intent shortcutIntent3 = createShortcutIntent(webapp3Url); |
| 532 Intent shortcutIntent4 = createShortcutIntent(webapp4Url); |
| 533 |
| 534 // Register the four web apps. |
| 535 WebappRegistry.registerWebapp(Robolectric.application, "webapp1", |
| 536 new FetchStorageCallback(shortcutIntent1, true)); |
| 537 BackgroundShadowAsyncTask.runBackgroundTasks(); |
| 538 Robolectric.runUiThreadTasks(); |
| 539 |
| 540 WebappRegistry.registerWebapp(Robolectric.application, "webapp2", |
| 541 new FetchStorageCallback(shortcutIntent2, false)); |
| 542 BackgroundShadowAsyncTask.runBackgroundTasks(); |
| 543 Robolectric.runUiThreadTasks(); |
| 544 |
| 545 WebappRegistry.registerWebapp(Robolectric.application, "webapp3", |
| 546 new FetchStorageCallback(shortcutIntent3, true)); |
| 547 BackgroundShadowAsyncTask.runBackgroundTasks(); |
| 548 Robolectric.runUiThreadTasks(); |
| 549 |
| 550 WebappRegistry.registerWebapp(Robolectric.application, "webapp4", |
| 551 new FetchStorageCallback(shortcutIntent4, false)); |
| 552 BackgroundShadowAsyncTask.runBackgroundTasks(); |
| 553 Robolectric.runUiThreadTasks(); |
| 554 |
| 555 // test1Url should return webapp1. |
| 556 FetchStorageByUrlCallback callback = new FetchStorageByUrlCallback(webap
p1Url, webapp1Url); |
| 557 WebappRegistry.getWebappDataStorageForUrl(Robolectric.application, test1
Url, callback); |
| 558 BackgroundShadowAsyncTask.runBackgroundTasks(); |
| 559 Robolectric.runUiThreadTasks(); |
| 560 assertTrue(callback.getCallbackCalled()); |
| 561 |
| 562 // test2Url should return webapp3. |
| 563 callback = new FetchStorageByUrlCallback(webapp3Url, webapp3Scope); |
| 564 WebappRegistry.getWebappDataStorageForUrl(Robolectric.application, test2
Url, callback); |
| 565 BackgroundShadowAsyncTask.runBackgroundTasks(); |
| 566 Robolectric.runUiThreadTasks(); |
| 567 assertTrue(callback.getCallbackCalled()); |
| 568 |
| 569 // test3Url should return webapp4. |
| 570 callback = new FetchStorageByUrlCallback(webapp4Url, webapp4Scope); |
| 571 WebappRegistry.getWebappDataStorageForUrl(Robolectric.application, test3
Url, callback); |
| 572 BackgroundShadowAsyncTask.runBackgroundTasks(); |
| 573 Robolectric.runUiThreadTasks(); |
| 574 assertTrue(callback.getCallbackCalled()); |
| 575 |
| 576 // test4Url should return webapp4. |
| 577 callback = new FetchStorageByUrlCallback(webapp4Url, webapp4Scope); |
| 578 WebappRegistry.getWebappDataStorageForUrl(Robolectric.application, test4
Url, callback); |
| 579 BackgroundShadowAsyncTask.runBackgroundTasks(); |
| 580 Robolectric.runUiThreadTasks(); |
| 581 assertTrue(callback.getCallbackCalled()); |
| 582 |
| 583 // test5Url should return webapp2. |
| 584 callback = new FetchStorageByUrlCallback(webapp2Url, webapp2Url); |
| 585 WebappRegistry.getWebappDataStorageForUrl(Robolectric.application, test5
Url, callback); |
| 586 BackgroundShadowAsyncTask.runBackgroundTasks(); |
| 587 Robolectric.runUiThreadTasks(); |
| 588 assertTrue(callback.getCallbackCalled()); |
| 589 |
| 590 // test6Url doesn't correspond to a web app, so the storage returned is
null. |
| 591 // This must use a member variable; local variables must be final or eff
ectively final to be |
| 592 // accessible inside an inner class. |
| 593 mCallbackCalled = false; |
| 594 WebappRegistry.getWebappDataStorageForUrl(Robolectric.application, test6
Url, |
| 595 new WebappRegistry.FetchWebappDataStorageCallback() { |
| 596 @Override |
| 597 public void onWebappDataStorageRetrieved(WebappDataStorage s
torage) { |
| 598 assertEquals(null, storage); |
| 599 mCallbackCalled = true; |
| 600 } |
| 601 } |
| 602 ); |
| 433 BackgroundShadowAsyncTask.runBackgroundTasks(); | 603 BackgroundShadowAsyncTask.runBackgroundTasks(); |
| 434 Robolectric.runUiThreadTasks(); | 604 Robolectric.runUiThreadTasks(); |
| 435 assertTrue(mCallbackCalled); | 605 assertTrue(mCallbackCalled); |
| 436 | |
| 437 // Verify that the URL and scope match the original in the intent. | |
| 438 actualURL = webappPrefs.getString( | |
| 439 WebappDataStorage.KEY_URL, WebappDataStorage.URL_INVALID); | |
| 440 assertEquals(webappUrl, actualURL); | |
| 441 actualScope = webappPrefs.getString( | |
| 442 WebappDataStorage.KEY_SCOPE, WebappDataStorage.URL_INVALID); | |
| 443 assertEquals(webappUrl, actualScope); | |
| 444 } | 606 } |
| 445 | 607 |
| 446 private Set<String> addWebappsToRegistry(String... webapps) { | 608 private Set<String> addWebappsToRegistry(String... webapps) { |
| 447 final Set<String> expected = new HashSet<String>(Arrays.asList(webapps))
; | 609 final Set<String> expected = new HashSet<String>(Arrays.asList(webapps))
; |
| 448 mSharedPreferences.edit() | 610 mSharedPreferences.edit() |
| 449 .putStringSet(WebappRegistry.KEY_WEBAPP_SET, expected) | 611 .putStringSet(WebappRegistry.KEY_WEBAPP_SET, expected) |
| 450 .commit(); | 612 .commit(); |
| 451 return expected; | 613 return expected; |
| 452 } | 614 } |
| 453 | 615 |
| 454 private Set<String> getRegisteredWebapps() { | 616 private Set<String> getRegisteredWebapps() { |
| 455 return mSharedPreferences.getStringSet( | 617 return mSharedPreferences.getStringSet( |
| 456 WebappRegistry.KEY_WEBAPP_SET, Collections.<String>emptySet()); | 618 WebappRegistry.KEY_WEBAPP_SET, Collections.<String>emptySet()); |
| 457 } | 619 } |
| 458 | 620 |
| 459 private Intent createShortcutIntent(String url) { | 621 private Intent createShortcutIntent(String url) { |
| 460 return ShortcutHelper.createWebappShortcutIntent("id", "action", url, ur
l, "name", | 622 return ShortcutHelper.createWebappShortcutIntent("id", "action", url, |
| 461 "shortName", null, ShortcutHelper.WEBAPP_SHORTCUT_VERSION, 0, 0,
0, false); | 623 ShortcutHelper.getScopeFromUrl(url), "name", "shortName", null, |
| 624 ShortcutHelper.WEBAPP_SHORTCUT_VERSION, 0, 0, 0, false); |
| 462 } | 625 } |
| 463 } | 626 } |
| OLD | NEW |