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

Side by Side Diff: chrome/browser/apps/ephemeral_app_browsertest.cc

Issue 397903002: Do not assign launch ordinals to ephemeral apps (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@ephemapp_unload_review
Patch Set: Changed implementation Created 6 years, 5 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 #include "chrome/browser/apps/ephemeral_app_browsertest.h" 5 #include "chrome/browser/apps/ephemeral_app_browsertest.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "apps/app_restore_service.h" 9 #include "apps/app_restore_service.h"
10 #include "apps/saved_files_service.h" 10 #include "apps/saved_files_service.h"
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
292 CloseAppWaitForUnload(app->id()); 292 CloseAppWaitForUnload(app->id());
293 return result; 293 return result;
294 } 294 }
295 295
296 // Verify that the event page of the app has not been loaded. 296 // Verify that the event page of the app has not been loaded.
297 void VerifyAppNotLoaded(const std::string& app_id) { 297 void VerifyAppNotLoaded(const std::string& app_id) {
298 EXPECT_FALSE(ExtensionSystem::Get(profile())-> 298 EXPECT_FALSE(ExtensionSystem::Get(profile())->
299 process_manager()->GetBackgroundHostForExtension(app_id)); 299 process_manager()->GetBackgroundHostForExtension(app_id));
300 } 300 }
301 301
302 // Verify properties of ephemeral apps.
303 void VerifyEphemeralApp(const std::string& app_id) {
304 EXPECT_TRUE(extensions::util::IsEphemeralApp(app_id, profile()));
305
306 // Ephemeral apps should not be synced.
307 scoped_ptr<AppSyncData> sync_change = GetLastSyncChangeForApp(app_id);
308 EXPECT_FALSE(sync_change.get());
309
310 // Ephemeral apps should not be assigned ordinals.
311 extensions::AppSorting* app_sorting =
312 ExtensionPrefs::Get(profile())->app_sorting();
313 EXPECT_FALSE(app_sorting->GetAppLaunchOrdinal(app_id).IsValid());
314 EXPECT_FALSE(app_sorting->GetPageOrdinal(app_id).IsValid());
315 }
316
302 // Verify that after ephemeral apps stop running, they reside in extension 317 // Verify that after ephemeral apps stop running, they reside in extension
303 // system in a disabled and unloaded state. 318 // system in a disabled and unloaded state.
304 void VerifyInactiveEphemeralApp(const std::string& app_id) { 319 void VerifyInactiveEphemeralApp(const std::string& app_id) {
305 EXPECT_TRUE( 320 EXPECT_TRUE(
306 ExtensionRegistry::Get(profile())->disabled_extensions().Contains( 321 ExtensionRegistry::Get(profile())->disabled_extensions().Contains(
307 app_id)); 322 app_id));
308 323
309 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile()); 324 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
310 EXPECT_TRUE(prefs->IsExtensionDisabled(app_id)); 325 EXPECT_TRUE(prefs->IsExtensionDisabled(app_id));
311 EXPECT_NE(0, 326 EXPECT_NE(0,
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
373 388
374 ASSERT_TRUE( 389 ASSERT_TRUE(
375 ExtensionRegistry::Get(profile())->disabled_extensions().Contains( 390 ExtensionRegistry::Get(profile())->disabled_extensions().Contains(
376 app->id())); 391 app->id()));
377 } 392 }
378 393
379 void PromoteEphemeralAppAndVerify( 394 void PromoteEphemeralAppAndVerify(
380 const Extension* app, 395 const Extension* app,
381 ExtensionRegistry::IncludeFlag expected_set) { 396 ExtensionRegistry::IncludeFlag expected_set) {
382 ASSERT_TRUE(app); 397 ASSERT_TRUE(app);
383 398 VerifyEphemeralApp(app->id());
384 // Ephemeral apps should not be synced.
385 scoped_ptr<AppSyncData> sync_change = GetFirstSyncChangeForApp(app->id());
386 EXPECT_FALSE(sync_change.get());
387 399
388 // Promote the app to a regular installed app. 400 // Promote the app to a regular installed app.
389 InstallObserver installed_observer(profile()); 401 InstallObserver installed_observer(profile());
390 PromoteEphemeralApp(app); 402 PromoteEphemeralApp(app);
391 VerifyPromotedApp(app->id(), expected_set); 403 VerifyPromotedApp(app->id(), expected_set);
392 404
393 // Check the notification parameters. 405 // Check the notification parameters.
394 const InstallObserver::InstallParameters& params = 406 const InstallObserver::InstallParameters& params =
395 installed_observer.Last(); 407 installed_observer.Last();
396 EXPECT_EQ(app->id(), params.id); 408 EXPECT_EQ(app->id(), params.id);
397 EXPECT_TRUE(params.is_update); 409 EXPECT_TRUE(params.is_update);
398 EXPECT_TRUE(params.from_ephemeral); 410 EXPECT_TRUE(params.from_ephemeral);
399 411
400 // The installation should now be synced. 412 // The installation should now be synced.
401 sync_change = GetFirstSyncChangeForApp(app->id()); 413 scoped_ptr<AppSyncData> sync_change = GetLastSyncChangeForApp(app->id());
402 VerifySyncChange(sync_change.get(), 414 VerifySyncChange(sync_change.get(),
403 expected_set == ExtensionRegistry::ENABLED); 415 expected_set == ExtensionRegistry::ENABLED);
404 } 416 }
405 417
406 void PromoteEphemeralAppFromSyncAndVerify( 418 void PromoteEphemeralAppFromSyncAndVerify(
407 const Extension* app, 419 const Extension* app,
408 bool enable_from_sync, 420 bool enable_from_sync,
409 ExtensionRegistry::IncludeFlag expected_set) { 421 ExtensionRegistry::IncludeFlag expected_set) {
410 ASSERT_TRUE(app); 422 ASSERT_TRUE(app);
423 VerifyEphemeralApp(app->id());
411 424
412 // Simulate an install from sync. 425 // Simulate an install from sync.
413 const syncer::StringOrdinal kAppLaunchOrdinal("x"); 426 const syncer::StringOrdinal kAppLaunchOrdinal("x");
414 const syncer::StringOrdinal kPageOrdinal("y"); 427 const syncer::StringOrdinal kPageOrdinal("y");
415 AppSyncData app_sync_data(*app, 428 AppSyncData app_sync_data(*app,
416 enable_from_sync, 429 enable_from_sync,
417 false /* incognito enabled */, 430 false /* incognito enabled */,
418 false /* remote install */, 431 false /* remote install */,
419 kAppLaunchOrdinal, 432 kAppLaunchOrdinal,
420 kPageOrdinal, 433 kPageOrdinal,
(...skipping 21 matching lines...) Expand all
442 sync_service->MergeDataAndStartSyncing( 455 sync_service->MergeDataAndStartSyncing(
443 syncer::APPS, 456 syncer::APPS,
444 syncer::SyncDataList(), 457 syncer::SyncDataList(),
445 scoped_ptr<syncer::SyncChangeProcessor>( 458 scoped_ptr<syncer::SyncChangeProcessor>(
446 new syncer::SyncChangeProcessorWrapperForTest( 459 new syncer::SyncChangeProcessorWrapperForTest(
447 &mock_sync_processor_)), 460 &mock_sync_processor_)),
448 scoped_ptr<syncer::SyncErrorFactory>( 461 scoped_ptr<syncer::SyncErrorFactory>(
449 new syncer::SyncErrorFactoryMock())); 462 new syncer::SyncErrorFactoryMock()));
450 } 463 }
451 464
452 scoped_ptr<AppSyncData> GetFirstSyncChangeForApp(const std::string& id) { 465 scoped_ptr<AppSyncData> GetLastSyncChangeForApp(const std::string& id) {
453 scoped_ptr<AppSyncData> sync_data; 466 scoped_ptr<AppSyncData> sync_data;
454 for (syncer::SyncChangeList::iterator it = 467 for (syncer::SyncChangeList::iterator it =
455 mock_sync_processor_.changes().begin(); 468 mock_sync_processor_.changes().begin();
456 it != mock_sync_processor_.changes().end(); ++it) { 469 it != mock_sync_processor_.changes().end(); ++it) {
457 sync_data.reset(new AppSyncData(*it)); 470 scoped_ptr<AppSyncData> data(new AppSyncData(*it));
458 if (sync_data->id() == id) 471 if (data->id() == id)
459 return sync_data.Pass(); 472 sync_data.reset(data.release());
460 } 473 }
461 474
462 return scoped_ptr<AppSyncData>(); 475 return sync_data.Pass();
463 } 476 }
464 477
465 void VerifySyncChange(const AppSyncData* sync_change, bool expect_enabled) { 478 void VerifySyncChange(const AppSyncData* sync_change, bool expect_enabled) {
466 ASSERT_TRUE(sync_change); 479 ASSERT_TRUE(sync_change);
467 EXPECT_TRUE(sync_change->page_ordinal().IsValid()); 480 EXPECT_TRUE(sync_change->page_ordinal().IsValid());
468 EXPECT_TRUE(sync_change->app_launch_ordinal().IsValid()); 481 EXPECT_TRUE(sync_change->app_launch_ordinal().IsValid());
469 EXPECT_FALSE(sync_change->uninstalled()); 482 EXPECT_FALSE(sync_change->uninstalled());
470 EXPECT_EQ(expect_enabled, sync_change->extension_sync_data().enabled()); 483 EXPECT_EQ(expect_enabled, sync_change->extension_sync_data().enabled());
471 } 484 }
472 485
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
566 ExtensionPrefs::Get(profile())->SetExtensionRunning(app->id(), true); 579 ExtensionPrefs::Get(profile())->SetExtensionRunning(app->id(), true);
567 580
568 ExtensionTestMessageListener restart_listener("restarted", false); 581 ExtensionTestMessageListener restart_listener("restarted", false);
569 apps::AppRestoreService::Get(profile())->HandleStartup(true); 582 apps::AppRestoreService::Get(profile())->HandleStartup(true);
570 EXPECT_TRUE(restart_listener.WaitUntilSatisfied()); 583 EXPECT_TRUE(restart_listener.WaitUntilSatisfied());
571 } 584 }
572 585
573 // Verify that an updated ephemeral app will still have its ephemeral flag 586 // Verify that an updated ephemeral app will still have its ephemeral flag
574 // enabled. 587 // enabled.
575 IN_PROC_BROWSER_TEST_F(EphemeralAppBrowserTest, UpdateEphemeralApp) { 588 IN_PROC_BROWSER_TEST_F(EphemeralAppBrowserTest, UpdateEphemeralApp) {
589 InitSyncService();
590
576 const Extension* app_v1 = InstallAndLaunchEphemeralApp(kMessagingReceiverApp); 591 const Extension* app_v1 = InstallAndLaunchEphemeralApp(kMessagingReceiverApp);
577 ASSERT_TRUE(app_v1); 592 ASSERT_TRUE(app_v1);
578 CloseAppWaitForUnload(app_v1->id());
579 VerifyInactiveEphemeralApp(app_v1->id());
580
581 std::string app_id = app_v1->id(); 593 std::string app_id = app_v1->id();
582 base::Version app_original_version = *app_v1->version(); 594 base::Version app_original_version = *app_v1->version();
583 app_v1 = NULL; // The extension object will be destroyed during update. 595
596 VerifyEphemeralApp(app_id);
597 CloseAppWaitForUnload(app_id);
598 VerifyInactiveEphemeralApp(app_id);
584 599
585 // Update to version 2 of the app. 600 // Update to version 2 of the app.
601 app_v1 = NULL; // The extension object will be destroyed during update.
586 InstallObserver installed_observer(profile()); 602 InstallObserver installed_observer(profile());
587 const Extension* app_v2 = 603 const Extension* app_v2 =
588 UpdateEphemeralApp(app_id, 604 UpdateEphemeralApp(app_id,
589 GetTestPath(kMessagingReceiverAppV2), 605 GetTestPath(kMessagingReceiverAppV2),
590 GetTestPath(kMessagingReceiverApp) 606 GetTestPath(kMessagingReceiverApp)
591 .ReplaceExtension(FILE_PATH_LITERAL(".pem"))); 607 .ReplaceExtension(FILE_PATH_LITERAL(".pem")));
592 608
593 // Check the notification parameters. 609 // Check the notification parameters.
594 const InstallObserver::InstallParameters& params = installed_observer.Last(); 610 const InstallObserver::InstallParameters& params = installed_observer.Last();
595 EXPECT_EQ(app_id, params.id); 611 EXPECT_EQ(app_id, params.id);
596 EXPECT_TRUE(params.is_update); 612 EXPECT_TRUE(params.is_update);
597 EXPECT_FALSE(params.from_ephemeral); 613 EXPECT_FALSE(params.from_ephemeral);
598 614
599 // The ephemeral flag should still be set. 615 // The ephemeral flag should still be set.
600 ASSERT_TRUE(app_v2); 616 ASSERT_TRUE(app_v2);
601 EXPECT_GT(app_v2->version()->CompareTo(app_original_version), 0); 617 EXPECT_GT(app_v2->version()->CompareTo(app_original_version), 0);
602 EXPECT_TRUE(extensions::util::IsEphemeralApp(app_v2->id(), profile())); 618 VerifyEphemeralApp(app_id);
603 619
604 // The app should still be disabled in extension system. 620 // The app should still be disabled in extension system.
605 VerifyInactiveEphemeralApp(app_id); 621 VerifyInactiveEphemeralApp(app_id);
606 } 622 }
607 623
608 // Verify that if notifications have been disabled for an ephemeral app, it will 624 // Verify that if notifications have been disabled for an ephemeral app, it will
609 // remain disabled even after being evicted from the cache. 625 // remain disabled even after being evicted from the cache.
610 IN_PROC_BROWSER_TEST_F(EphemeralAppBrowserTest, StickyNotificationSettings) { 626 IN_PROC_BROWSER_TEST_F(EphemeralAppBrowserTest, StickyNotificationSettings) {
611 const Extension* app = InstallAndLaunchEphemeralApp(kNotificationsTestApp); 627 const Extension* app = InstallAndLaunchEphemeralApp(kNotificationsTestApp);
612 ASSERT_TRUE(app); 628 ASSERT_TRUE(app);
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
773 ExtensionSystem::Get(profile())->extension_service(); 789 ExtensionSystem::Get(profile())->extension_service();
774 service->BlacklistExtensionForTest(app->id()); 790 service->BlacklistExtensionForTest(app->id());
775 ASSERT_TRUE( 791 ASSERT_TRUE(
776 ExtensionRegistry::Get(profile())->blacklisted_extensions().Contains( 792 ExtensionRegistry::Get(profile())->blacklisted_extensions().Contains(
777 app->id())); 793 app->id()));
778 794
779 // When promoted to a regular installed app, it should remain blacklisted. 795 // When promoted to a regular installed app, it should remain blacklisted.
780 PromoteEphemeralAppAndVerify(app, ExtensionRegistry::BLACKLISTED); 796 PromoteEphemeralAppAndVerify(app, ExtensionRegistry::BLACKLISTED);
781 797
782 // The app should be synced, but disabled. 798 // The app should be synced, but disabled.
783 scoped_ptr<AppSyncData> sync_change = GetFirstSyncChangeForApp(app->id()); 799 scoped_ptr<AppSyncData> sync_change = GetLastSyncChangeForApp(app->id());
784 VerifySyncChange(sync_change.get(), false); 800 VerifySyncChange(sync_change.get(), false);
785 } 801 }
786 802
787 // Checks the process of promoting an ephemeral app from sync while the app is 803 // Checks the process of promoting an ephemeral app from sync while the app is
788 // running. 804 // running.
789 IN_PROC_BROWSER_TEST_F(EphemeralAppBrowserTest, 805 IN_PROC_BROWSER_TEST_F(EphemeralAppBrowserTest,
790 PromoteAppFromSyncWhileRunning) { 806 PromoteAppFromSyncWhileRunning) {
791 InitSyncService(); 807 InitSyncService();
792 808
793 const Extension* app = InstallAndLaunchEphemeralApp(kNotificationsTestApp); 809 const Extension* app = InstallAndLaunchEphemeralApp(kNotificationsTestApp);
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
929 945
930 // Ensure that when the app is promoted to an installed app, the bit in the 946 // Ensure that when the app is promoted to an installed app, the bit in the
931 // creation flags is cleared. 947 // creation flags is cleared.
932 PromoteEphemeralApp(app); 948 PromoteEphemeralApp(app);
933 EXPECT_FALSE(extensions::util::IsEphemeralApp(app->id(), profile())); 949 EXPECT_FALSE(extensions::util::IsEphemeralApp(app->id(), profile()));
934 950
935 int creation_flags = 951 int creation_flags =
936 ExtensionPrefs::Get(profile())->GetCreationFlags(app->id()); 952 ExtensionPrefs::Get(profile())->GetCreationFlags(app->id());
937 EXPECT_EQ(0, creation_flags & Extension::IS_EPHEMERAL); 953 EXPECT_EQ(0, creation_flags & Extension::IS_EPHEMERAL);
938 } 954 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698