12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/at_exit.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/files/file_enumerator.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_file_value_serializer.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_reader.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_string_value_serializer.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 21ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h" 221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/prefs/scoped_user_pref_update.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h" 24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/version.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h" 307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/app_sync_data.h" 3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/extensions/blacklist.h" 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/extensions/chrome_app_sorting.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/component_loader.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/crx_installer.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/default_apps.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_creator.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_error_reporter.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_error_ui.h" 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/extension_management_test_util.h" 41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/extensions/extension_notification_observer.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/extensions/extension_service_test_base.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_special_storage_policy.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_sync_data.h" 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/extensions/extension_sync_service.h" 478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/extensions/extension_util.h" 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/extensions/external_install_error.h" 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/extensions/external_install_manager.h" 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/external_policy_loader.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/external_pref_loader.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/external_provider_impl.h" 5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/extensions/fake_safe_browsing_database_manager.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/installed_loader.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/pack_extension_job.h" 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/extensions/pending_extension_info.h" 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/extensions/pending_extension_manager.h" 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/extensions/test_blacklist.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/test_extension_system.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/unpacked_installer.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/updater/extension_updater.h" 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/prefs/pref_service_syncable.h" 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_service.h" 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_service_factory.h" 6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service.h" 6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_factory.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/api/plugins/plugins_handler.h" 70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/common/extensions/manifest_handlers/app_launch_info.h" 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/manifest_handlers/content_scripts_handler.h" 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/manifest_url_handler.h" 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/test/base/scoped_browser_locale.h" 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/test/base/testing_pref_service_syncable.h" 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "components/crx_file/id_util.h" 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h" 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/dom_storage_context.h" 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/gpu_data_manager.h" 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/indexed_db_context.h" 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h" 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/plugin_service.h" 867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/public/browser/render_process_host.h" 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/storage_partition.h" 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_constants.h" 897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/public/test/test_utils.h" 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_registry.h" 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h" 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/external_provider_interface.h" 93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "extensions/browser/install_flag.h" 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/management_policy.h" 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/test_management_policy.h" 965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/browser/uninstall_reason.h" 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/constants.h" 98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h" 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension_builder.h" 100c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/extension_l10n_util.h" 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/extension_resource.h" 102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "extensions/common/feature_switch.h" 103d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "extensions/common/manifest_constants.h" 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/manifest_handlers/background_info.h" 1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "extensions/common/permissions/permission_set.h" 10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "extensions/common/permissions/permissions_data.h" 107e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "extensions/common/switches.h" 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/url_pattern.h" 109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/value_builder.h" 11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/config/gpu_info.h" 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/browser_resources.h" 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/canonical_cookie.h" 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_monster.h" 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_options.h" 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h" 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/database/database_tracker.h" 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/quota/quota_manager.h" 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/database/database_identifier.h" 120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "sync/api/fake_sync_change_processor.h" 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/string_ordinal.h" 12268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "sync/api/sync_data.h" 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/sync_error_factory.h" 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/sync_error_factory_mock.h" 1257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "sync/api/syncable_service.h" 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/app_specifics.pb.h" 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/extension_specifics.pb.h" 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/sync.pb.h" 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/platform_test.h" 1317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS) 1346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/scoped_test_user_manager.h" 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h" 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/device_settings_service.h" 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// The blacklist tests rely on safe browsing. 14068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(FULL_SAFE_BROWSING) || defined(MOBILE_SAFE_BROWSING) 14168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#define ENABLE_BLACKLIST_TESTS 14268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif 14368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing base::DictionaryValue; 145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing base::ListValue; 146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing base::Value; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserContext; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DOMStorageContext; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::IndexedDBContext; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::PluginService; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::APIPermission; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::APIPermissionSet; 154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using extensions::AppSorting; 15568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)using extensions::Blacklist; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::CrxInstaller; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::ExtensionCreator; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::ExtensionPrefs; 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using extensions::ExtensionRegistry; 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using extensions::ExtensionResource; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::ExtensionSystem; 16368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)using extensions::FakeSafeBrowsingDatabaseManager; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::FeatureSwitch; 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using extensions::Manifest; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::PermissionSet; 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using extensions::TestExtensionSystem; 168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using extensions::UnloadedExtensionInfo; 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using extensions::URLPatternSet; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace keys = extensions::manifest_keys; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Extension ids used during testing. 17668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char good0[] = "behllobkkfkfnphdnhnkndlbkcpglgmj"; 17768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char good1[] = "hpiknbiabeeppbpihjehijgoemciehgk"; 17868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char good2[] = "bjafgdebaacbbbecmhlhpofkepfkgcpa"; 179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const char all_zero[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; 18068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char good2048[] = "nmgjhmhbleinmjpbdhgajfjkbijcmgbh"; 18168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char good_crx[] = "ldnnhddmnhbkjipkidpdiheffobcpfmf"; 18268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char hosted_app[] = "kbmnembihfiondgfjekmnmcbddelicoi"; 18368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char page_action[] = "obcimlgaoabeegjmmpldobjndiealpln"; 18468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char theme_crx[] = "iamefpfkojoapidjnbafmgkgncegbkad"; 18568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char theme2_crx[] = "pjpgmfcmabopnnfonnhmdjglfpjjfkbf"; 18668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char permissions_crx[] = "eagpmdpfmaekmmcejjbmjoecnejeiiin"; 18768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char unpacked[] = "cbcdidchbppangcjoddlpdjlenngjldk"; 18868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char updates_from_webstore[] = "akjooamlhcgeopfifcmlggaebeocgokj"; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ExtensionsOrder { 191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool operator()(const scoped_refptr<const Extension>& a, 192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const scoped_refptr<const Extension>& b) { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return a->name() < b->name(); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static std::vector<base::string16> GetErrors() { 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::vector<base::string16>* errors = 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionErrorReporter::GetInstance()->GetErrors(); 2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<base::string16> ret_val; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (std::vector<base::string16>::const_iterator iter = errors->begin(); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != errors->end(); ++iter) { 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string utf8_error = base::UTF16ToUTF8(*iter); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (utf8_error.find(".svn") == std::string::npos) { 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret_val.push_back(*iter); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The tests rely on the errors being in a certain order, which can vary 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // depending on how filesystem iteration works. 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::stable_sort(ret_val.begin(), ret_val.end()); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ret_val; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void AddPattern(URLPatternSet* extent, const std::string& pattern) { 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int schemes = URLPattern::SCHEME_ALL; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extent->AddPattern(URLPattern(schemes, pattern)); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath GetTemporaryFile() { 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath temp_file; 224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CHECK(base::CreateTemporaryFile(&temp_file)); 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return temp_file; 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool WaitForCountNotificationsCallback(int *count) { 2297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return --(*count) == 0; 2307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 2317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockExtensionProvider : public extensions::ExternalProviderInterface { 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockExtensionProvider( 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitorInterface* visitor, 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::Location location) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : location_(location), visitor_(visitor), visit_count_(0) { 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MockExtensionProvider() {} 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateOrAddExtension(const std::string& id, 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& version, 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path) { 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_map_[id] = std::make_pair(version, path); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveExtension(const std::string& id) { 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_map_.erase(id); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ExternalProvider implementation: 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void VisitRegisteredExtension() OVERRIDE { 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visit_count_++; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (DataMap::const_iterator i = extension_map_.begin(); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != extension_map_.end(); ++i) { 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Version version(i->second.first); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visitor_->OnExternalExtensionFileFound( 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i->first, &version, i->second.second, location_, 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::NO_FLAGS, false); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visitor_->OnExternalProviderReady(this); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool HasExtension(const std::string& id) const OVERRIDE { 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension_map_.find(id) != extension_map_.end(); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool GetExtensionDetails( 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& id, 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::Location* location, 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Version>* version) const OVERRIDE { 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DataMap::const_iterator it = extension_map_.find(id); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it == extension_map_.end()) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (version) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) version->reset(new Version(it->second.first)); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (location) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *location = location_; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsReady() const OVERRIDE { 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ServiceShutdown() OVERRIDE { 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int visit_count() const { return visit_count_; } 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_visit_count(int visit_count) { 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visit_count_ = visit_count; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::map< std::string, std::pair<std::string, base::FilePath> > 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DataMap; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DataMap extension_map_; 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::Location location_; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitorInterface* visitor_; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // visit_count_ tracks the number of calls to VisitRegisteredExtension(). 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mutable because it must be incremented on each call to 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // VisitRegisteredExtension(), which must be a const method to inherit 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from the class being mocked. 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mutable int visit_count_; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MockExtensionProvider); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockProviderVisitor 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public extensions::ExternalProviderInterface::VisitorInterface { 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The provider will return |fake_base_path| from 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GetBaseCrxFilePath(). User can test the behavior with 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and without an empty path using this parameter. 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit MockProviderVisitor(base::FilePath fake_base_path) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : ids_found_(0), 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_base_path_(fake_base_path), 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_creation_flags_(Extension::NO_FLAGS) { 327868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) profile_.reset(new TestingProfile); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockProviderVisitor(base::FilePath fake_base_path, 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int expected_creation_flags) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : ids_found_(0), 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_base_path_(fake_base_path), 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_creation_flags_(expected_creation_flags) { 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int Visit(const std::string& json_data) { 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Give the test json file to the provider for parsing. 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider_.reset(new extensions::ExternalProviderImpl( 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new extensions::ExternalTestingLoader(json_data, fake_base_path_), 342868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) profile_.get(), 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::EXTERNAL_PREF, 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::EXTERNAL_PREF_DOWNLOAD, 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::NO_FLAGS)); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We also parse the file into a dictionary to compare what we get back 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from the provider. 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONStringValueSerializer serializer(json_data); 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Value* json_value = serializer.Deserialize(NULL, NULL); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!json_value || !json_value->IsType(base::Value::TYPE_DICTIONARY)) { 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Unable to deserialize json data"; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* external_extensions = 3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<base::DictionaryValue*>(json_value); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs_.reset(external_extensions); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset our counter. 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ids_found_ = 0; 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ask the provider to look up all extensions and return them. 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider_->VisitRegisteredExtension(); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ids_found_; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnExternalExtensionFileFound(const std::string& id, 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Version* version, 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::Location unused, 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int creation_flags, 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool mark_acknowledged) OVERRIDE { 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_creation_flags_, creation_flags); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++ids_found_; 3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* pref; 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This tests is to make sure that the provider only notifies us of the 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // values we gave it. So if the id we doesn't exist in our internal 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // dictionary then something is wrong. 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prefs_->GetDictionary(id, &pref)) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "Got back ID (" << id.c_str() << ") we weren't expecting"; 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(path.IsAbsolute()); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!fake_base_path_.empty()) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_base_path_.IsParent(path)); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pref) { 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(provider_->HasExtension(id)); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ask provider if the extension we got back is registered. 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::Location location = Manifest::INVALID_LOCATION; 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Version> v1; 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath crx_path; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(provider_->GetExtensionDetails(id, NULL, &v1)); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ(version->GetString().c_str(), v1->GetString().c_str()); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Version> v2; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(provider_->GetExtensionDetails(id, &location, &v2)); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ(version->GetString().c_str(), v1->GetString().c_str()); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ(version->GetString().c_str(), v2->GetString().c_str()); 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(Manifest::EXTERNAL_PREF, location); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove it so we won't count it ever again. 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs_->Remove(id, NULL); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnExternalExtensionUpdateUrlFound( 413effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const std::string& id, 414effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const std::string& install_parameter, 415effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const GURL& update_url, 4164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Manifest::Location location, 4174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int creation_flags, 4184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool mark_acknowledged) OVERRIDE { 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++ids_found_; 4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* pref; 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This tests is to make sure that the provider only notifies us of the 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // values we gave it. So if the id we doesn't exist in our internal 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // dictionary then something is wrong. 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prefs_->GetDictionary(id, &pref)) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << L"Got back ID (" << id.c_str() << ") we weren't expecting"; 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(Manifest::EXTERNAL_PREF_DOWNLOAD, location); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pref) { 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(provider_->HasExtension(id)); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // External extensions with update URLs do not have versions. 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Version> v1; 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::Location location1 = Manifest::INVALID_LOCATION; 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(provider_->GetExtensionDetails(id, &location1, &v1)); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v1.get()); 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(Manifest::EXTERNAL_PREF_DOWNLOAD, location1); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 438effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::string parsed_install_parameter; 439effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch pref->GetString("install_parameter", &parsed_install_parameter); 440effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(parsed_install_parameter, install_parameter); 441effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove it so we won't count it again. 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs_->Remove(id, NULL); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnExternalProviderReady( 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::ExternalProviderInterface* provider) OVERRIDE { 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(provider, provider_.get()); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(provider->IsReady()); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ids_found_; 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath fake_base_path_; 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_creation_flags_; 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<extensions::ExternalProviderImpl> provider_; 4595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::DictionaryValue> prefs_; 460868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<TestingProfile> profile_; 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MockProviderVisitor); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class ExtensionServiceTest : public extensions::ExtensionServiceTestBase, 466f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public content::NotificationObserver { 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionServiceTest() 469cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : unloaded_reason_(UnloadedExtensionInfo::REASON_UNDEFINED), 470cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) installed_(NULL), 471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) was_update_(false), 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) override_external_install_prompt_( 473cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FeatureSwitch::prompt_for_external_extensions(), 474f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) false), 475f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) expected_extensions_count_(0) { 4760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch registrar_.Add(this, 4775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED, 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 479cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) registrar_.Add(this, 4805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED, 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 4825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) registrar_.Add( 4835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) this, 4845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_EXTENSION_WILL_BE_INSTALLED_DEPRECATED, 4855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) content::NotificationService::AllSources()); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationDetails& details) OVERRIDE { 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 4925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED: { 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Details<const Extension>(details).ptr(); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loaded_.push_back(make_scoped_refptr(extension)); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The tests rely on the errors being in a certain order, which can vary 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // depending on how filesystem iteration works. 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::stable_sort(loaded_.begin(), loaded_.end(), ExtensionsOrder()); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case extensions::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED: { 503cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UnloadedExtensionInfo* unloaded_info = 504cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content::Details<UnloadedExtensionInfo>(details).ptr(); 505cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const Extension* e = unloaded_info->extension; 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unloaded_id_ = e->id(); 507cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) unloaded_reason_ = unloaded_info->reason; 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionList::iterator i = 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::find(loaded_.begin(), loaded_.end(), e); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(erikkay) fix so this can be an assert. Right now the tests 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // are manually calling clear() on loaded_, so this isn't doable. 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i == loaded_.end()) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loaded_.erase(i); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case extensions::NOTIFICATION_EXTENSION_WILL_BE_INSTALLED_DEPRECATED: { 518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const extensions::InstalledExtensionInfo* installed_info = 519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::Details<const extensions::InstalledExtensionInfo>(details) 520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .ptr(); 521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) installed_ = installed_info->extension; 522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) was_update_ = installed_info->is_update; 52390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) old_name_ = installed_info->old_name; 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(false); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddMockExternalProvider( 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExternalProviderInterface* provider) { 534f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->AddProviderForTesting(provider); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void MockSyncStartFlare(bool* was_called, 5387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch syncer::ModelType* model_type_passed_in, 5397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch syncer::ModelType model_type) { 5407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch *was_called = true; 5417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch *model_type_passed_in = model_type; 5427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 5437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 54568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Paths to some of the fake extensions. 54668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::FilePath good0_path() { 547f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return data_dir() 548f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("good") 549f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("Extensions") 550f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII(good0) 551f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("1.0.0.0"); 55268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 55368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 55468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::FilePath good1_path() { 555f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return data_dir() 556f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("good") 557f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("Extensions") 558f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII(good1) 559f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("2"); 56068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 56168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 56268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::FilePath good2_path() { 563f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return data_dir() 564f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("good") 565f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("Extensions") 566f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII(good2) 567f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("1.0"); 56868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 56968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void TestExternalProvider(MockExtensionProvider* provider, 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::Location location); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void PackCRX(const base::FilePath& dir_path, 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& pem_path, 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& crx_path) { 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use the existing pem key, if provided. 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath pem_output_path; 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pem_path.value().empty()) { 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pem_output_path = crx_path.DirName().AppendASCII("temp.pem"); 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(pem_path)); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::DeleteFile(crx_path, false)); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ExtensionCreator> creator(new ExtensionCreator()); 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(creator->Run(dir_path, 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crx_path, 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pem_path, 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pem_output_path, 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionCreator::kOverwriteCRX)); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(crx_path)); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum InstallState { 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INSTALL_FAILED, 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INSTALL_UPDATED, 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) INSTALL_NEW, 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) INSTALL_WITHOUT_LOAD, 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Extension* PackAndInstallCRX(const base::FilePath& dir_path, 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& pem_path, 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallState install_state, 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int creation_flags) { 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath crx_path; 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir; 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(temp_dir.CreateUniqueTempDir()); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crx_path = temp_dir.path().AppendASCII("temp.crx"); 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PackCRX(dir_path, pem_path, crx_path); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InstallCRX(crx_path, install_state, creation_flags); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Extension* PackAndInstallCRX(const base::FilePath& dir_path, 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& pem_path, 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallState install_state) { 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PackAndInstallCRX(dir_path, pem_path, install_state, 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::NO_FLAGS); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Extension* PackAndInstallCRX(const base::FilePath& dir_path, 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallState install_state) { 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PackAndInstallCRX(dir_path, base::FilePath(), install_state, 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::NO_FLAGS); 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Attempts to install an extension. Use INSTALL_FAILED if the installation 63090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // is expected to fail. 63190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // If |install_state| is INSTALL_UPDATED, and |expected_old_name| is 63290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // non-empty, expects that the existing extension's title was 63390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // |expected_old_name|. 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Extension* InstallCRX(const base::FilePath& path, 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallState install_state, 63690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int creation_flags, 63790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::string& expected_old_name) { 638f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) InstallCRXInternal(path, creation_flags); 639f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return VerifyCrxInstall(path, install_state, expected_old_name); 64090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 64190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 64290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Attempts to install an extension. Use INSTALL_FAILED if the installation 64390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // is expected to fail. 64490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const Extension* InstallCRX(const base::FilePath& path, 64590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) InstallState install_state, 64690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int creation_flags) { 647f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return InstallCRX(path, install_state, creation_flags, std::string()); 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Attempts to install an extension. Use INSTALL_FAILED if the installation 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is expected to fail. 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Extension* InstallCRX(const base::FilePath& path, 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallState install_state) { 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InstallCRX(path, install_state, Extension::NO_FLAGS); 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Extension* InstallCRXFromWebStore(const base::FilePath& path, 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallState install_state) { 659f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) InstallCRXInternal(path, Extension::FROM_WEBSTORE); 660f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return VerifyCrxInstall(path, install_state); 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Extension* InstallCRXWithLocation(const base::FilePath& crx_path, 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::Location install_location, 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallState install_state) { 6667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(base::PathExists(crx_path)) 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "Path does not exist: "<< crx_path.value().c_str(); 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // no client (silent install) 669f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_refptr<CrxInstaller> installer( 670f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) CrxInstaller::CreateSilent(service())); 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer->set_install_source(install_location); 672f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 673f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver observer( 6745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_CRX_INSTALLER_DONE, 675f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NotificationService::AllSources()); 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer->InstallCrx(crx_path); 677f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) observer.Wait(); 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 679f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return VerifyCrxInstall(crx_path, install_state); 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 682f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Verifies the result of a CRX installation. Used by InstallCRX. Set the 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |install_state| to INSTALL_FAILED if the installation is expected to fail. 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns an Extension pointer if the install succeeded, NULL otherwise. 685f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const Extension* VerifyCrxInstall(const base::FilePath& path, 686f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) InstallState install_state) { 687f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return VerifyCrxInstall(path, install_state, std::string()); 68890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 68990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 690f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Verifies the result of a CRX installation. Used by InstallCRX. Set the 69190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // |install_state| to INSTALL_FAILED if the installation is expected to fail. 69290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // If |install_state| is INSTALL_UPDATED, and |expected_old_name| is 69390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // non-empty, expects that the existing extension's title was 69490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // |expected_old_name|. 69590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Returns an Extension pointer if the install succeeded, NULL otherwise. 696f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const Extension* VerifyCrxInstall(const base::FilePath& path, 697f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) InstallState install_state, 698f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& expected_old_name) { 6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<base::string16> errors = GetErrors(); 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = NULL; 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (install_state != INSTALL_FAILED) { 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (install_state == INSTALL_NEW) 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++expected_extensions_count_; 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(installed_) << path.value(); 706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If and only if INSTALL_UPDATED, it should have the is_update flag. 707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(install_state == INSTALL_UPDATED, was_update_) 708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) << path.value(); 70990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // If INSTALL_UPDATED, old_name_ should match the given string. 71090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (install_state == INSTALL_UPDATED && !expected_old_name.empty()) 71190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(expected_old_name, old_name_); 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, errors.size()) << path.value(); 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (install_state == INSTALL_WITHOUT_LOAD) { 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, loaded_.size()) << path.value(); 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, loaded_.size()) << path.value(); 718f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t actual_extension_count = 719f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) registry()->enabled_extensions().size() + 720f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) registry()->disabled_extensions().size(); 7213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(expected_extensions_count_, actual_extension_count) << 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) path.value(); 723868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension = loaded_[0].get(); 724f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->GetExtensionById(extension->id(), false)) 725868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) << path.value(); 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (std::vector<base::string16>::iterator err = errors.begin(); 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) err != errors.end(); ++err) { 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << *err; 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(installed_) << path.value(); 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, loaded_.size()) << path.value(); 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, errors.size()) << path.value(); 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installed_ = NULL; 739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) was_update_ = false; 74090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) old_name_ = ""; 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loaded_.clear(); 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionErrorReporter::GetInstance()->ClearErrors(); 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension; 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum UpdateState { 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FAILED_SILENTLY, 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FAILED, 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UPDATED, 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INSTALLED, 7515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DISABLED, 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ENABLED 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BlackListWebGL() { 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const std::string json_blacklist = 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "{\n" 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"name\": \"gpu blacklist\",\n" 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"version\": \"1.0\",\n" 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"entries\": [\n" 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " {\n" 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"id\": 1,\n" 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"features\": [\"webgl\"]\n" 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }\n" 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " ]\n" 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}"; 76790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gpu::GPUInfo gpu_info; 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::GpuDataManager::GetInstance()->InitializeForTesting( 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) json_blacklist, gpu_info); 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 772f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Helper method to set up a WindowedNotificationObserver to wait for a 773f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // specific CrxInstaller to finish if we don't know the value of the 774f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // |installer| yet. 775f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static bool IsCrxInstallerDone(extensions::CrxInstaller** installer, 776f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const content::NotificationSource& source, 777f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const content::NotificationDetails& details) { 778f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return content::Source<extensions::CrxInstaller>(source).ptr() == 779f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *installer; 780f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 781f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 7825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void PackCRXAndUpdateExtension(const std::string& id, 7835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const base::FilePath& dir_path, 7845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const base::FilePath& pem_path, 7855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) UpdateState expected_state) { 7865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::ScopedTempDir temp_dir; 7875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(temp_dir.CreateUniqueTempDir()); 7885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath crx_path = temp_dir.path().AppendASCII("temp.crx"); 7895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 7905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PackCRX(dir_path, pem_path, crx_path); 7915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) UpdateExtension(id, crx_path, expected_state); 7925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 7935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 794f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void UpdateExtension(const std::string& id, 795f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const base::FilePath& in_path, 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateState expected_state) { 7977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(in_path)); 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need to copy this to a temporary location because Update() will delete 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it. 801f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = temp_dir().path(); 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.Append(in_path.BaseName()); 8037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::CopyFile(in_path, path)); 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int previous_enabled_extension_count = 806f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) registry()->enabled_extensions().size(); 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int previous_installed_extension_count = 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) previous_enabled_extension_count + 809f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) registry()->disabled_extensions().size(); 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch extensions::CrxInstaller* installer = NULL; 812f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver observer( 8135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_CRX_INSTALLER_DONE, 814f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Bind(&IsCrxInstallerDone, &installer)); 815f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->UpdateExtension(id, path, true, &installer); 8167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 817f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (installer) 818f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) observer.Wait(); 819f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) else 820ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<base::string16> errors = GetErrors(); 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_count = errors.size(); 824f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int enabled_extension_count = registry()->enabled_extensions().size(); 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int installed_extension_count = 826f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) enabled_extension_count + registry()->disabled_extensions().size(); 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_error_count = (expected_state == FAILED) ? 1 : 0; 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_error_count, error_count) << path.value(); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expected_state <= FAILED) { 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(previous_enabled_extension_count, 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_extension_count); 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(previous_installed_extension_count, 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installed_extension_count); 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_installed_extension_count = 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (expected_state >= INSTALLED) ? 1 : 0; 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_enabled_extension_count = 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (expected_state >= ENABLED) ? 1 : 0; 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_installed_extension_count, 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installed_extension_count); 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_enabled_extension_count, 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_extension_count); 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update() should the temporary input file. 8487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(path)); 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void TerminateExtension(const std::string& id) { 852f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const Extension* extension = service()->GetInstalledExtension(id); 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!extension) { 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE(); 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 857f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->TrackTerminatedExtensionForTest(extension); 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t GetPrefKeyCount() { 8615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* dict = 862f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) profile()->GetPrefs()->GetDictionary("extensions.settings"); 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dict) { 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE(); 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dict->size(); 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UninstallExtension(const std::string& id, bool use_helper) { 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the extension is installed. 872f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath extension_path = extensions_install_dir().AppendASCII(id); 8737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(base::PathExists(extension_path)); 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t pref_key_count = GetPrefKeyCount(); 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(pref_key_count, 0u); 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidateIntegerPref(id, "state", Extension::ENABLED); 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Uninstall it. 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (use_helper) { 880116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(ExtensionService::UninstallExtensionHelper( 8815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) service(), id, extensions::UNINSTALL_REASON_FOR_TESTING)); 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 883116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(service()->UninstallExtension( 8845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) id, 8855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::UNINSTALL_REASON_FOR_TESTING, 8865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&base::DoNothing), 8875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NULL)); 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --expected_extensions_count_; 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should get an unload notification. 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(unloaded_id_.empty()); 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(id, unloaded_id_); 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify uninstalled state. 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t new_pref_key_count = GetPrefKeyCount(); 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (new_pref_key_count == pref_key_count) { 8981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ValidateIntegerPref(id, "state", 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::EXTERNAL_EXTENSION_UNINSTALLED); 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(new_pref_key_count, pref_key_count - 1); 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The extension should not be in the service anymore. 905f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->GetInstalledExtension(id)); 906ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The directory should be gone. 9097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(extension_path)); 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ValidatePrefKeyCount(size_t count) { 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(count, GetPrefKeyCount()); 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 91668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) testing::AssertionResult ValidateBooleanPref( 91768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const std::string& extension_id, 91868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const std::string& pref_path, 91968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool expected_val) { 92068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::string msg = "while checking: "; 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg += extension_id; 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg += " "; 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg += pref_path; 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg += " == "; 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg += expected_val ? "true" : "false"; 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 927f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PrefService* prefs = profile()->GetPrefs(); 9285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* dict = 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetDictionary("extensions.settings"); 93068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!dict) { 93168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return testing::AssertionFailure() 93268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) << "extension.settings does not exist " << msg; 93368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 93468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 9355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* pref = NULL; 93668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!dict->GetDictionary(extension_id, &pref)) { 93768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return testing::AssertionFailure() 93868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) << "extension pref does not exist " << msg; 93968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 94068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool val; 94268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!pref->GetBoolean(pref_path, &val)) { 94368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return testing::AssertionFailure() 94468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) << pref_path << " pref not found " << msg; 94568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 94668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 94768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return expected_val == val 94868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ? testing::AssertionSuccess() 9495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : testing::AssertionFailure() << "base::Value is incorrect " << msg; 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsPrefExist(const std::string& extension_id, 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& pref_path) { 9545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* dict = 955f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) profile()->GetPrefs()->GetDictionary("extensions.settings"); 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dict == NULL) return false; 9575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* pref = NULL; 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dict->GetDictionary(extension_id, &pref)) { 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pref == NULL) { 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool val; 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!pref->GetBoolean(pref_path, &val)) { 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ValidateIntegerPref(const std::string& extension_id, 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& pref_path, 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_val) { 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string msg = " while checking: "; 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg += extension_id; 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg += " "; 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg += pref_path; 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg += " == "; 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg += base::IntToString(expected_val); 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 981f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PrefService* prefs = profile()->GetPrefs(); 9825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* dict = 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetDictionary("extensions.settings"); 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(dict != NULL) << msg; 9855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* pref = NULL; 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(dict->GetDictionary(extension_id, &pref)) << msg; 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pref != NULL) << msg; 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int val; 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(pref->GetInteger(pref_path, &val)) << msg; 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_val, val) << msg; 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ValidateStringPref(const std::string& extension_id, 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& pref_path, 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& expected_val) { 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string msg = " while checking: "; 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg += extension_id; 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg += ".manifest."; 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg += pref_path; 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg += " == "; 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg += expected_val; 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* dict = 1004f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) profile()->GetPrefs()->GetDictionary("extensions.settings"); 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(dict != NULL) << msg; 10065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* pref = NULL; 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string manifest_path = extension_id + ".manifest"; 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(dict->GetDictionary(manifest_path, &pref)) << msg; 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pref != NULL) << msg; 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string val; 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(pref->GetString(pref_path, &val)) << msg; 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_val, val) << msg; 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetPref(const std::string& extension_id, 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& pref_path, 10175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Value* value, 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& msg) { 1019f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DictionaryPrefUpdate update(profile()->GetPrefs(), "extensions.settings"); 10205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* dict = update.Get(); 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(dict != NULL) << msg; 10225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* pref = NULL; 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(dict->GetDictionary(extension_id, &pref)) << msg; 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pref != NULL) << msg; 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pref->Set(pref_path, value); 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetPrefInteg(const std::string& extension_id, 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& pref_path, 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int value) { 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string msg = " while setting: "; 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg += extension_id; 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg += " "; 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg += pref_path; 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg += " = "; 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg += base::IntToString(value); 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SetPref(extension_id, pref_path, new base::FundamentalValue(value), msg); 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetPrefBool(const std::string& extension_id, 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& pref_path, 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool value) { 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string msg = " while setting: "; 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg += extension_id + " " + pref_path; 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg += " = "; 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg += (value ? "true" : "false"); 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SetPref(extension_id, pref_path, new base::FundamentalValue(value), msg); 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ClearPref(const std::string& extension_id, 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& pref_path) { 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string msg = " while clearing: "; 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg += extension_id + " " + pref_path; 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1057f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DictionaryPrefUpdate update(profile()->GetPrefs(), "extensions.settings"); 10585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* dict = update.Get(); 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(dict != NULL) << msg; 10605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* pref = NULL; 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(dict->GetDictionary(extension_id, &pref)) << msg; 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pref != NULL) << msg; 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pref->Remove(pref_path, NULL); 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetPrefStringSet(const std::string& extension_id, 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& pref_path, 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::set<std::string>& value) { 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string msg = " while setting: "; 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg += extension_id + " " + pref_path; 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue* list_value = new base::ListValue(); 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::set<std::string>::const_iterator iter = value.begin(); 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != value.end(); ++iter) 10753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) list_value->Append(new base::StringValue(*iter)); 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetPref(extension_id, pref_path, list_value, msg); 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void InitPluginService() { 10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_PLUGINS) 10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PluginService::GetInstance()->Init(); 10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1086f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void InitializeExtensionSyncService() { 1087f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service_.reset(new ExtensionSyncService( 1088f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) profile(), ExtensionPrefs::Get(browser_context()), service())); 1089f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 1090f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 10911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void InitializeEmptyExtensionServiceWithTestingPrefs() { 10921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ExtensionServiceTestBase::ExtensionServiceInitParams params = 10931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateDefaultInitParams(); 10941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.pref_file = base::FilePath(); 10951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci InitializeExtensionService(params); 10961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 10971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1098f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::ManagementPolicy* GetManagementPolicy() { 1099f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return ExtensionSystem::Get(browser_context())->management_policy(); 1100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 1101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ExtensionSyncService* extension_sync_service() { 1103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return extension_sync_service_.get(); 1104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 1105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 11071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef extensions::ExtensionManagementPrefUpdater<TestingPrefServiceSyncable> 11081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ManagementPrefUpdater; 1109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<ExtensionSyncService> extension_sync_service_; 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionList loaded_; 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string unloaded_id_; 1112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UnloadedExtensionInfo::Reason unloaded_reason_; 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* installed_; 1114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool was_update_; 111590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string old_name_; 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FeatureSwitch::ScopedOverride override_external_install_prompt_; 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Create a CrxInstaller and install the CRX file. 1120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Instead of calling this method yourself, use InstallCRX(), which does extra 1121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // error checking. 1122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void InstallCRXInternal(const base::FilePath& crx_path) { 1123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) InstallCRXInternal(crx_path, Extension::NO_FLAGS); 1124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void InstallCRXInternal(const base::FilePath& crx_path, int creation_flags) { 1127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_TRUE(base::PathExists(crx_path)) 1128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << "Path does not exist: "<< crx_path.value().c_str(); 1129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_refptr<CrxInstaller> installer( 1130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) CrxInstaller::CreateSilent(service())); 1131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) installer->set_creation_flags(creation_flags); 1132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!(creation_flags & Extension::WAS_INSTALLED_BY_DEFAULT)) 1133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) installer->set_allow_silent_install(true); 1134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver observer( 11365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_CRX_INSTALLER_DONE, 11371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::Source<extensions::CrxInstaller>(installer.get())); 1138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) installer->InstallCrx(crx_path); 1140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) observer.Wait(); 1142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t expected_extensions_count_; 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationRegistrar registrar_; 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Receives notifications from a PackExtensionJob, indicating either that 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// packing succeeded or that there was some error. 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PackExtensionTestClient : public extensions::PackExtensionJob::Client { 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PackExtensionTestClient(const base::FilePath& expected_crx_path, 11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& expected_private_key_path); 11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnPackSuccess(const base::FilePath& crx_path, 11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& private_key_path) OVERRIDE; 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnPackFailure(const std::string& error_message, 11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionCreator::ErrorType type) OVERRIDE; 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath expected_crx_path_; 11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath expected_private_key_path_; 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PackExtensionTestClient); 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PackExtensionTestClient::PackExtensionTestClient( 11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& expected_crx_path, 11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& expected_private_key_path) 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : expected_crx_path_(expected_crx_path), 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_private_key_path_(expected_private_key_path) {} 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If packing succeeded, we make sure that the package names match our 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// expectations. 11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PackExtensionTestClient::OnPackSuccess( 11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& crx_path, 11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& private_key_path) { 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We got the notification and processed it; we don't expect any further tasks 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to be posted to the current thread, so we should stop blocking and continue 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on with the rest of the test. 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This call to |Quit()| matches the call to |Run()| in the 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |PackPunctuatedExtension| test. 118190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_crx_path_.value(), crx_path.value()); 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_private_key_path_.value(), private_key_path.value()); 11847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(private_key_path)); 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The tests are designed so that we never expect to see a packing error. 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PackExtensionTestClient::OnPackFailure(const std::string& error_message, 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionCreator::ErrorType type) { 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type == ExtensionCreator::kCRXExists) 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FAIL() << "Packing should not fail."; 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FAIL() << "Existing CRX should have been overwritten."; 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test loading good extensions from the profile directory. 11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, LoadAllExtensionsFromDirectorySuccess) { 11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitPluginService(); 119968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) InitializeGoodInstalledExtensionService(); 1200f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->Init(); 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 expected_num_extensions = 3u; 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(expected_num_extensions, loaded_.size()); 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(good0), loaded_[0]->id()); 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("My extension 1"), 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loaded_[0]->name()); 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("The first extension that I made."), 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loaded_[0]->description()); 12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(Manifest::INTERNAL, loaded_[0]->location()); 1211f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->GetExtensionById(loaded_[0]->id(), false)); 1212f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(expected_num_extensions, registry()->enabled_extensions().size()); 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(3); 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidateIntegerPref(good0, "state", Extension::ENABLED); 12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateIntegerPref(good0, "location", Manifest::INTERNAL); 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidateIntegerPref(good1, "state", Extension::ENABLED); 12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateIntegerPref(good1, "location", Manifest::INTERNAL); 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidateIntegerPref(good2, "state", Extension::ENABLED); 12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateIntegerPref(good2, "location", Manifest::INTERNAL); 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLPatternSet expected_patterns; 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPattern(&expected_patterns, "file:///*"); 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPattern(&expected_patterns, "http://*.google.com/*"); 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPattern(&expected_patterns, "https://*.google.com/*"); 1226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const Extension* extension = loaded_[0].get(); 12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::UserScriptList& scripts = 12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ContentScriptsInfo::GetContentScripts(extension); 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u, scripts.size()); 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_patterns, scripts[0].url_patterns()); 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2u, scripts[0].js_scripts().size()); 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionResource resource00(extension->id(), 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scripts[0].js_scripts()[0].extension_root(), 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scripts[0].js_scripts()[0].relative_path()); 1235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath expected_path = 1236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MakeAbsoluteFilePath(extension->path().AppendASCII("script1.js")); 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(resource00.ComparePathWithDefault(expected_path)); 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionResource resource01(extension->id(), 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scripts[0].js_scripts()[1].extension_root(), 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scripts[0].js_scripts()[1].relative_path()); 1241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) expected_path = 1242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MakeAbsoluteFilePath(extension->path().AppendASCII("script2.js")); 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(resource01.ComparePathWithDefault(expected_path)); 12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(!extensions::PluginInfo::HasPlugins(extension)); 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, scripts[1].url_patterns().patterns().size()); 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("http://*.news.com/*", 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scripts[1].url_patterns().begin()->GetAsString()); 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionResource resource10(extension->id(), 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scripts[1].js_scripts()[0].extension_root(), 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scripts[1].js_scripts()[0].relative_path()); 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_path = 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension->path().AppendASCII("js_files").AppendASCII("script3.js"); 1253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) expected_path = base::MakeAbsoluteFilePath(expected_path); 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(resource10.ComparePathWithDefault(expected_path)); 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_patterns.ClearPatterns(); 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPattern(&expected_patterns, "http://*.google.com/*"); 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPattern(&expected_patterns, "https://*.google.com/*"); 125946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ( 126046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) expected_patterns, 126146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) extension->permissions_data()->active_permissions()->explicit_hosts()); 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(good1), loaded_[1]->id()); 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("My extension 2"), loaded_[1]->name()); 1265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(), loaded_[1]->description()); 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(loaded_[1]->GetResourceURL("background.html"), 1267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extensions::BackgroundInfo::GetBackgroundURL(loaded_[1].get())); 1268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(0u, 1269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extensions::ContentScriptsInfo::GetContentScripts(loaded_[1].get()) 1270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) .size()); 12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't parse the plugins section on Chrome OS. 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 12747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_TRUE(!extensions::PluginInfo::HasPlugins(loaded_[1].get())); 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(extensions::PluginInfo::HasPlugins(loaded_[1].get())); 12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<extensions::PluginInfo>* plugins = 1278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extensions::PluginInfo::GetPlugins(loaded_[1].get()); 12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(plugins); 12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(2u, plugins->size()); 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(loaded_[1]->path().AppendASCII("content_plugin.dll").value(), 12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugins->at(0).path.value()); 12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(plugins->at(0).is_public); 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(loaded_[1]->path().AppendASCII("extension_plugin.dll").value(), 12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugins->at(1).path.value()); 12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(plugins->at(1).is_public); 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(Manifest::INTERNAL, loaded_[1]->location()); 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index = expected_num_extensions - 1; 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(good2), loaded_[index]->id()); 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("My extension 3"), loaded_[index]->name()); 1294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(), loaded_[index]->description()); 1295868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(0u, 1296868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extensions::ContentScriptsInfo::GetContentScripts( 1297868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) loaded_[index].get()).size()); 12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(Manifest::INTERNAL, loaded_[index]->location()); 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test loading bad extensions from the profile directory. 13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, LoadAllExtensionsFromDirectoryFail) { 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialize the test dir with a bad Preferences/extensions. 1304f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath source_install_dir = 1305f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data_dir().AppendASCII("bad").AppendASCII("Extensions"); 13065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath pref_path = 13075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) source_install_dir.DirName().Append(chrome::kPreferencesFilename); 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeInstalledExtensionService(pref_path, source_install_dir); 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1311f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->Init(); 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(4u, GetErrors().size()); 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0u, loaded_.size()); 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(MatchPattern(base::UTF16ToUTF8(GetErrors()[0]), 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string("Could not load extension from '*'. ") + 1318d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) extensions::manifest_errors::kManifestUnreadable)) << 13195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF16ToUTF8(GetErrors()[0]); 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(MatchPattern(base::UTF16ToUTF8(GetErrors()[1]), 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string("Could not load extension from '*'. ") + 1323d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) extensions::manifest_errors::kManifestUnreadable)) << 13245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF16ToUTF8(GetErrors()[1]); 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(MatchPattern(base::UTF16ToUTF8(GetErrors()[2]), 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string("Could not load extension from '*'. ") + 1328d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) extensions::manifest_errors::kMissingFile)) << 13295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF16ToUTF8(GetErrors()[2]); 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(MatchPattern(base::UTF16ToUTF8(GetErrors()[3]), 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string("Could not load extension from '*'. ") + 1333d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) extensions::manifest_errors::kManifestUnreadable)) << 13345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF16ToUTF8(GetErrors()[3]); 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1337eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Test various cases for delayed install because of missing imports. 1338eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(ExtensionServiceTest, PendingImports) { 1339eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch InitPluginService(); 1340eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1341f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath source_install_dir = 1342f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data_dir().AppendASCII("pending_updates_with_imports").AppendASCII( 1343f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) "Extensions"); 13445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath pref_path = 13455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) source_install_dir.DirName().Append(chrome::kPreferencesFilename); 1346eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1347eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch InitializeInstalledExtensionService(pref_path, source_install_dir); 1348eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1349eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Verify there are no pending extensions initially. 1350f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->pending_extension_manager()->HasPendingExtensions()); 1351eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1352f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->Init(); 1353eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Wait for GarbageCollectExtensions task to complete. 1354ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 1355eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1356eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // These extensions are used by the extensions we test below, they must be 1357eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // installed. 1358f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(base::PathExists(extensions_install_dir().AppendASCII( 1359eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "bjafgdebaacbbbecmhlhpofkepfkgcpa/1.0"))); 1360f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(base::PathExists(extensions_install_dir().AppendASCII( 1361eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "hpiknbiabeeppbpihjehijgoemciehgk/2"))); 1362eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1363eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Each of these extensions should have been rejected because of dependencies 1364eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // that cannot be satisfied. 1365f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ExtensionPrefs* prefs = ExtensionPrefs::Get(profile()); 1366eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE( 1367eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch prefs->GetDelayedInstallInfo("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")); 1368eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE( 1369eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch prefs->GetInstalledExtensionInfo("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")); 1370eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE( 1371eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch prefs->GetDelayedInstallInfo("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb")); 1372eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE( 1373eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch prefs->GetInstalledExtensionInfo("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb")); 1374eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE( 1375eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch prefs->GetDelayedInstallInfo("cccccccccccccccccccccccccccccccc")); 1376eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE( 1377eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch prefs->GetInstalledExtensionInfo("cccccccccccccccccccccccccccccccc")); 1378eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1379eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Make sure the import started for the extension with a dependency. 1380eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE( 1381eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch prefs->GetDelayedInstallInfo("behllobkkfkfnphdnhnkndlbkcpglgmj")); 1382eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(ExtensionPrefs::DELAY_REASON_WAIT_FOR_IMPORTS, 1383eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch prefs->GetDelayedInstallReason("behllobkkfkfnphdnhnkndlbkcpglgmj")); 1384eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1385f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(base::PathExists(extensions_install_dir().AppendASCII( 1386eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "behllobkkfkfnphdnhnkndlbkcpglgmj/1.0.0.0"))); 1387eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1388f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->pending_extension_manager()->HasPendingExtensions()); 1389eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string pending_id("eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"); 1390f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->pending_extension_manager()->IsIdPending(pending_id)); 1391eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Remove it because we are not testing the pending extension manager's 1392eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // ability to download and install extensions. 1393f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->pending_extension_manager()->Remove(pending_id)); 1394eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1395eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test installing extensions. This test tries to install few extensions using 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// crx files. If you need to change those crx files, feel free to repackage 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// them, throw away the key used and change the id's above. 13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, InstallExtension) { 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Extensions not enabled. 1403f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->set_extensions_enabled(false); 1404f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("good.crx"); 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallCRX(path, INSTALL_FAILED); 1406f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->set_extensions_enabled(true); 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(0); 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A simple extension that should install without error. 1411f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path = data_dir().AppendASCII("good.crx"); 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallCRX(path, INSTALL_NEW); 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(erikkay): verify the contents of the installed extension. 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pref_count = 0; 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(++pref_count); 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidateIntegerPref(good_crx, "state", Extension::ENABLED); 14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateIntegerPref(good_crx, "location", Manifest::INTERNAL); 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An extension with page actions. 1421f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path = data_dir().AppendASCII("page_action.crx"); 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallCRX(path, INSTALL_NEW); 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(++pref_count); 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidateIntegerPref(page_action, "state", Extension::ENABLED); 14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateIntegerPref(page_action, "location", Manifest::INTERNAL); 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Bad signature. 1428f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path = data_dir().AppendASCII("bad_signature.crx"); 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallCRX(path, INSTALL_FAILED); 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(pref_count); 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 0-length extension file. 1433f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path = data_dir().AppendASCII("not_an_extension.crx"); 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallCRX(path, INSTALL_FAILED); 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(pref_count); 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Bad magic number. 1438f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path = data_dir().AppendASCII("bad_magic.crx"); 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallCRX(path, INSTALL_FAILED); 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(pref_count); 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Packed extensions may have folders or files that have underscores. 14433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // This will only cause a warning, rather than a fatal error. 1444f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path = data_dir().AppendASCII("bad_underscore.crx"); 14453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) InstallCRX(path, INSTALL_NEW); 14463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ValidatePrefKeyCount(++pref_count); 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 144868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // A test for an extension with a 2048-bit public key. 1449f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path = data_dir().AppendASCII("good2048.crx"); 145068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) InstallCRX(path, INSTALL_NEW); 145168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ValidatePrefKeyCount(++pref_count); 145268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ValidateIntegerPref(good2048, "state", Extension::ENABLED); 145368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ValidateIntegerPref(good2048, "location", Manifest::INTERNAL); 145468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(erikkay): add more tests for many of the failure cases. 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(erikkay): add tests for upgrade cases. 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1459f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)struct MockExtensionRegistryObserver 1460f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) : public extensions::ExtensionRegistryObserver { 1461f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void OnExtensionWillBeInstalled( 1462f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) content::BrowserContext* browser_context, 1463f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const Extension* extension, 1464f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool is_update, 1465f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool from_ephemeral, 1466f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& old_name) OVERRIDE { 1467ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch last_extension_installed = extension->id(); 1468ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 1469ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 14705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void OnExtensionUninstalled( 14715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) content::BrowserContext* browser_context, 14725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const Extension* extension, 14735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::UninstallReason reason) OVERRIDE { 1474ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch last_extension_uninstalled = extension->id(); 1475ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 1476ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1477ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::string last_extension_installed; 1478ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::string last_extension_uninstalled; 1479ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}; 1480ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1481f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Test that correct notifications are sent to ExtensionRegistryObserver on 1482ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// extension install and uninstall. 1483ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(ExtensionServiceTest, InstallObserverNotified) { 1484ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch InitializeEmptyExtensionService(); 1485ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1486f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::ExtensionRegistry* registry( 1487f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::ExtensionRegistry::Get(profile())); 1488f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) MockExtensionRegistryObserver observer; 1489f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) registry->AddObserver(&observer); 1490ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1491ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // A simple extension that should install without error. 1492ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ASSERT_TRUE(observer.last_extension_installed.empty()); 1493f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("good.crx"); 1494ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch InstallCRX(path, INSTALL_NEW); 1495ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ASSERT_EQ(good_crx, observer.last_extension_installed); 1496ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1497ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Uninstall the extension. 1498ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ASSERT_TRUE(observer.last_extension_uninstalled.empty()); 1499ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch UninstallExtension(good_crx, false); 1500ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ASSERT_EQ(good_crx, observer.last_extension_uninstalled); 1501ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1502f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) registry->RemoveObserver(&observer); 1503ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 1504ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that flags passed to OnExternalExtensionFileFound() make it to the 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extension object. 15072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, InstallingExternalExtensionWithFlags) { 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kPrefFromBookmark[] = "from_bookmark"; 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1512f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("good.crx"); 1513f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->set_extensions_enabled(true); 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Register and install an external extension. 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Version version("1.0.0.0"); 1517f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver observer( 15185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_CRX_INSTALLER_DONE, 1519f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NotificationService::AllSources()); 1520f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (service()->OnExternalExtensionFileFound(good_crx, 1521f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &version, 1522f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path, 1523f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Manifest::EXTERNAL_PREF, 1524f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Extension::FROM_BOOKMARK, 1525f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) false /* mark_acknowledged */)) { 1526f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) observer.Wait(); 15277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1529f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const Extension* extension = service()->GetExtensionById(good_crx, false); 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension); 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension->from_bookmark()); 153268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_TRUE(ValidateBooleanPref(good_crx, kPrefFromBookmark, true)); 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Upgrade to version 2.0, the flag should be preserved. 1535f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path = data_dir().AppendASCII("good2.crx"); 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateExtension(good_crx, path, ENABLED); 153768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_TRUE(ValidateBooleanPref(good_crx, kPrefFromBookmark, true)); 1538f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension = service()->GetExtensionById(good_crx, false); 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension); 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension->from_bookmark()); 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the handling of Extension::EXTERNAL_EXTENSION_UNINSTALLED 15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UninstallingExternalExtensions) { 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1547f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("good.crx"); 1548f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->set_extensions_enabled(true); 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Install an external extension. 1551f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Version version("1.0.0.0"); 1552f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver observer( 15535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_CRX_INSTALLER_DONE, 1554f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NotificationService::AllSources()); 1555f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (service()->OnExternalExtensionFileFound(good_crx, 1556f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &version, 1557f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path, 1558f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Manifest::EXTERNAL_PREF, 1559f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Extension::NO_FLAGS, 1560f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) false)) { 1561f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) observer.Wait(); 15627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 15637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1564f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE(service()->GetExtensionById(good_crx, false)); 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Uninstall it and check that its killbit gets set. 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UninstallExtension(good_crx, false); 15681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ValidateIntegerPref(good_crx, "state", 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::EXTERNAL_EXTENSION_UNINSTALLED); 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try to re-install it externally. This should fail because of the killbit. 1572f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->OnExternalExtensionFileFound(good_crx, 1573f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &version, 1574f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path, 1575f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Manifest::EXTERNAL_PREF, 1576f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Extension::NO_FLAGS, 1577f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) false); 1578ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 1579f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE(NULL == service()->GetExtensionById(good_crx, false)); 15801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ValidateIntegerPref(good_crx, "state", 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::EXTERNAL_EXTENSION_UNINSTALLED); 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) version = Version("1.0.0.1"); 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Repeat the same thing with a newer version of the extension. 1585f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path = data_dir().AppendASCII("good2.crx"); 1586f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->OnExternalExtensionFileFound(good_crx, 1587f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &version, 1588f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path, 1589f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Manifest::EXTERNAL_PREF, 1590f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Extension::NO_FLAGS, 1591f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) false); 1592ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 1593f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE(NULL == service()->GetExtensionById(good_crx, false)); 15941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ValidateIntegerPref(good_crx, "state", 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::EXTERNAL_EXTENSION_UNINSTALLED); 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try adding the same extension from an external update URL. 1598f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_FALSE(service()->pending_extension_manager()->AddFromExternalUpdateUrl( 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) good_crx, 1600effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::string(), 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http:://fake.update/url"), 16024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Manifest::EXTERNAL_PREF_DOWNLOAD, 16034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Extension::NO_FLAGS, 16044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) false)); 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1606f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_FALSE(service()->pending_extension_manager()->IsIdPending(good_crx)); 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that uninstalling an external extension does not crash when 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the extension could not be loaded. 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This extension shown in preferences file requires an experimental permission. 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It could not be loaded without such permission. 16132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UninstallingNotLoadedExtension) { 1614f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath source_install_dir = 1615f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data_dir().AppendASCII("good").AppendASCII("Extensions"); 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The preference contains an external extension 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that requires 'experimental' permission. 16182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath pref_path = source_install_dir 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .DirName() 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .AppendASCII("PreferencesExperimental"); 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Aforementioned extension will not be loaded if 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // there is no '--enable-experimental-extension-apis' command line flag. 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeInstalledExtensionService(pref_path, source_install_dir); 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1626f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->Init(); 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check and try to uninstall it. 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we don't check whether the extension is loaded before we uninstall it 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in CheckExternalUninstall, a crash will happen here because we will get or 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // dereference a NULL pointer (extension) inside UninstallExtension. 16322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockExtensionProvider provider(NULL, Manifest::EXTERNAL_REGISTRY); 1633f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->OnExternalProviderReady(&provider); 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that external extensions with incorrect IDs are not installed. 16372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, FailOnWrongId) { 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 1639f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("good.crx"); 1640f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->set_extensions_enabled(true); 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Version version("1.0.0.0"); 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string wrong_id = all_zero; 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string correct_id = good_crx; 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(correct_id, wrong_id); 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Install an external extension with an ID from the external 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // source that is not equal to the ID in the extension manifest. 1650f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver observer( 16515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_CRX_INSTALLER_DONE, 1652f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NotificationService::AllSources()); 1653f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->OnExternalExtensionFileFound(wrong_id, 1654f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &version, 1655f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path, 1656f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Manifest::EXTERNAL_PREF, 1657f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Extension::NO_FLAGS, 1658f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) false); 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1660f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) observer.Wait(); 1661f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_FALSE(service()->GetExtensionById(good_crx, false)); 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try again with the right ID. Expect success. 1664f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver observer2( 16655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_CRX_INSTALLER_DONE, 1666f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NotificationService::AllSources()); 1667f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (service()->OnExternalExtensionFileFound(correct_id, 1668f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &version, 1669f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path, 1670f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Manifest::EXTERNAL_PREF, 1671f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Extension::NO_FLAGS, 1672f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) false)) { 1673f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) observer2.Wait(); 16747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1675f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE(service()->GetExtensionById(good_crx, false)); 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that external extensions with incorrect versions are not installed. 16792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, FailOnWrongVersion) { 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 1681f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("good.crx"); 1682f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->set_extensions_enabled(true); 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Install an external extension with a version from the external 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // source that is not equal to the version in the extension manifest. 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Version wrong_version("1.2.3.4"); 1687f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver observer( 16885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_CRX_INSTALLER_DONE, 1689f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NotificationService::AllSources()); 1690f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->OnExternalExtensionFileFound(good_crx, 1691f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &wrong_version, 1692f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path, 1693f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Manifest::EXTERNAL_PREF, 1694f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Extension::NO_FLAGS, 1695f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) false); 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1697f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) observer.Wait(); 1698f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_FALSE(service()->GetExtensionById(good_crx, false)); 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try again with the right version. Expect success. 1701f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->pending_extension_manager()->Remove(good_crx); 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Version correct_version("1.0.0.0"); 1703f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver observer2( 17045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_CRX_INSTALLER_DONE, 1705f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NotificationService::AllSources()); 1706f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (service()->OnExternalExtensionFileFound(good_crx, 1707f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &correct_version, 1708f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path, 1709f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Manifest::EXTERNAL_PREF, 1710f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Extension::NO_FLAGS, 1711f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) false)) { 1712f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) observer2.Wait(); 17137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1714f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE(service()->GetExtensionById(good_crx, false)); 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Install a user script (they get converted automatically to an extension) 17182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, InstallUserScript) { 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The details of script conversion are tested elsewhere, this just tests 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // integration with ExtensionService. 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1723f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("user_script_basic.user.js"); 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(path)); 1726f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_refptr<CrxInstaller> installer(CrxInstaller::CreateSilent(service())); 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer->set_allow_silent_install(true); 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer->InstallUserScript( 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path, 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http://www.aaronboodman.com/scripts/user_script_basic.user.js")); 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1732ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 17335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<base::string16> errors = GetErrors(); 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(installed_) << "Nothing was installed."; 1735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(was_update_) << path.value(); 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, loaded_.size()) << "Nothing was loaded."; 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, errors.size()) << "There were errors: " 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << JoinString(errors, ','); 1739f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->GetExtensionById(loaded_[0]->id(), false)) 1740f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) << path.value(); 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installed_ = NULL; 1743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) was_update_ = false; 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loaded_.clear(); 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionErrorReporter::GetInstance()->ClearErrors(); 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Extensions don't install during shutdown. 17492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, InstallExtensionDuringShutdown) { 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate shutdown. 1753f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->set_browser_terminating_for_test(true); 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("good.crx"); 1756f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_refptr<CrxInstaller> installer(CrxInstaller::CreateSilent(service())); 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer->set_allow_silent_install(true); 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer->InstallCrx(path); 1759ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(installed_) << "Extension installed during shutdown."; 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0u, loaded_.size()) << "Extension loaded during shutdown."; 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This tests that the granted permissions preferences are correctly set when 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// installing an extension. 17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, GrantedPermissions) { 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 1769f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("permissions"); 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath pem_path = path.AppendASCII("unknown.pem"); 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.AppendASCII("unknown"); 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(pem_path)); 17757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(path)); 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1777f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ExtensionPrefs* prefs = ExtensionPrefs::Get(profile()); 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) APIPermissionSet expected_api_perms; 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLPatternSet expected_host_perms; 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure there aren't any granted permissions before the 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // extension is installed. 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<PermissionSet> known_perms( 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetGrantedPermissions(permissions_crx)); 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(known_perms.get()); 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = PackAndInstallCRX(path, pem_path, INSTALL_NEW); 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, GetErrors().size()); 1791f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ(1u, registry()->enabled_extensions().size()); 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(permissions_crx, extension->id()); 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the valid API permissions have been recognized. 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_api_perms.insert(APIPermission::kTab); 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPattern(&expected_host_perms, "http://*.google.com/*"); 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPattern(&expected_host_perms, "https://*.google.com/*"); 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPattern(&expected_host_perms, "http://*.google.com.hk/*"); 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPattern(&expected_host_perms, "http://www.example.com/*"); 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) known_perms = prefs->GetGrantedPermissions(extension->id()); 18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(known_perms.get()); 18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(known_perms->IsEmpty()); 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_api_perms, known_perms->apis()); 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(known_perms->HasEffectiveFullAccess()); 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_host_perms, known_perms->effective_hosts()); 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_CHROMEOS) 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This tests that the granted permissions preferences are correctly set for 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// default apps. 18142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, DefaultAppsGrantedPermissions) { 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 1816f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("permissions"); 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath pem_path = path.AppendASCII("unknown.pem"); 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.AppendASCII("unknown"); 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(pem_path)); 18227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(path)); 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1824f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ExtensionPrefs* prefs = ExtensionPrefs::Get(profile()); 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) APIPermissionSet expected_api_perms; 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLPatternSet expected_host_perms; 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure there aren't any granted permissions before the 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // extension is installed. 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<PermissionSet> known_perms( 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetGrantedPermissions(permissions_crx)); 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(known_perms.get()); 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = PackAndInstallCRX( 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path, pem_path, INSTALL_NEW, Extension::WAS_INSTALLED_BY_DEFAULT); 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, GetErrors().size()); 1839f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ(1u, registry()->enabled_extensions().size()); 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(permissions_crx, extension->id()); 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the valid API permissions have been recognized. 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_api_perms.insert(APIPermission::kTab); 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) known_perms = prefs->GetGrantedPermissions(extension->id()); 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(known_perms.get()); 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(known_perms->IsEmpty()); 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_api_perms, known_perms->apis()); 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(known_perms->HasEffectiveFullAccess()); 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1853cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if !defined(OS_POSIX) || defined(OS_MACOSX) 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the granted permissions full_access bit gets set correctly when 1855cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// an extension contains an NPAPI plugin. 1856cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Only run this on platforms that support NPAPI plugins. 18572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, GrantedFullAccessPermissions) { 18582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitPluginService(); 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 186268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_TRUE(base::PathExists(good1_path())); 186368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const Extension* extension = PackAndInstallCRX(good1_path(), INSTALL_NEW); 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, GetErrors().size()); 1865f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 1866f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ExtensionPrefs* prefs = ExtensionPrefs::Get(profile()); 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<PermissionSet> permissions( 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetGrantedPermissions(extension->id())); 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(permissions->IsEmpty()); 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(permissions->HasEffectiveFullAccess()); 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(permissions->apis().empty()); 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(permissions->HasAPIPermission(APIPermission::kPlugin)); 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Full access implies full host access too... 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(permissions->HasEffectiveAccessToAllHosts()); 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the extension is disabled when permissions are missing from 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the extension's granted permissions preferences. (This simulates updating 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the browser to a version which recognizes more permissions). 18832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, GrantedAPIAndHostPermissions) { 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1886f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = 1887f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data_dir().AppendASCII("permissions").AppendASCII("unknown"); 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(path)); 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = PackAndInstallCRX(path, INSTALL_NEW); 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, GetErrors().size()); 1894f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string extension_id = extension->id(); 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1897f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ExtensionPrefs* prefs = ExtensionPrefs::Get(profile()); 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) APIPermissionSet expected_api_permissions; 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLPatternSet expected_host_permissions; 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_api_permissions.insert(APIPermission::kTab); 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPattern(&expected_host_permissions, "http://*.google.com/*"); 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPattern(&expected_host_permissions, "https://*.google.com/*"); 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPattern(&expected_host_permissions, "http://*.google.com.hk/*"); 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPattern(&expected_host_permissions, "http://www.example.com/*"); 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<std::string> host_permissions; 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that the extension is disabled when an API permission is missing from 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the extension's granted api permissions preference. (This simulates 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // updating the browser to a version which recognizes a new API permission). 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetPref(extension_id, "granted_permissions.api", 19145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new base::ListValue(), "granted_permissions.api"); 1915f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->ReloadExtensionsForTest(); 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1917f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->disabled_extensions().size()); 1918f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension = registry()->disabled_extensions().begin()->get(); 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(prefs->IsExtensionDisabled(extension_id)); 1921f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_FALSE(service()->IsExtensionEnabled(extension_id)); 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(prefs->DidExtensionEscalatePermissions(extension_id)); 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now grant and re-enable the extension, making sure the prefs are updated. 1925f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->GrantPermissionsAndEnableExtension(extension); 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(prefs->IsExtensionDisabled(extension_id)); 1928f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE(service()->IsExtensionEnabled(extension_id)); 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(prefs->DidExtensionEscalatePermissions(extension_id)); 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<PermissionSet> current_perms( 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetGrantedPermissions(extension_id)); 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(current_perms.get()); 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(current_perms->IsEmpty()); 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(current_perms->HasEffectiveFullAccess()); 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(expected_api_permissions, current_perms->apis()); 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(expected_host_permissions, current_perms->effective_hosts()); 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tests that the extension is disabled when a host permission is missing from 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the extension's granted host permissions preference. (This simulates 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // updating the browser to a version which recognizes additional host 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // permissions). 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_permissions.clear(); 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_perms = NULL; 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_permissions.insert("http://*.google.com/*"); 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_permissions.insert("https://*.google.com/*"); 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_permissions.insert("http://*.google.com.hk/*"); 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue* api_permissions = new base::ListValue(); 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) api_permissions->Append( 19523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) new base::StringValue("tabs")); 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetPref(extension_id, "granted_permissions.api", 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) api_permissions, "granted_permissions.api"); 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetPrefStringSet( 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_id, "granted_permissions.scriptable_host", host_permissions); 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1958f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->ReloadExtensionsForTest(); 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1960f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->disabled_extensions().size()); 1961f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension = registry()->disabled_extensions().begin()->get(); 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(prefs->IsExtensionDisabled(extension_id)); 1964f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_FALSE(service()->IsExtensionEnabled(extension_id)); 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(prefs->DidExtensionEscalatePermissions(extension_id)); 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now grant and re-enable the extension, making sure the prefs are updated. 1968f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->GrantPermissionsAndEnableExtension(extension); 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1970f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE(service()->IsExtensionEnabled(extension_id)); 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(prefs->DidExtensionEscalatePermissions(extension_id)); 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_perms = prefs->GetGrantedPermissions(extension_id); 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(current_perms.get()); 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(current_perms->IsEmpty()); 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(current_perms->HasEffectiveFullAccess()); 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(expected_api_permissions, current_perms->apis()); 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(expected_host_permissions, current_perms->effective_hosts()); 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test Packaging and installing an extension. 19822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, PackExtension) { 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 1984f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath input_directory = 1985f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data_dir() 1986f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("good") 1987f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("Extensions") 1988f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj") 1989f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("1.0.0.0"); 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir; 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 19932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath output_directory = temp_dir.path(); 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath crx_path(output_directory.AppendASCII("ex1.crx")); 19962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath privkey_path(output_directory.AppendASCII("privkey.pem")); 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ExtensionCreator> creator(new ExtensionCreator()); 19992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(creator->Run(input_directory, crx_path, base::FilePath(), 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) privkey_path, ExtensionCreator::kNoRunFlags)); 20017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(crx_path)); 20027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(privkey_path)); 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Repeat the run with the pem file gone, and no special flags 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should refuse to overwrite the existing crx. 20067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::DeleteFile(privkey_path, false); 20072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(creator->Run(input_directory, crx_path, base::FilePath(), 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) privkey_path, ExtensionCreator::kNoRunFlags)); 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OK, now try it with a flag to overwrite existing crx. Should work. 20112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(creator->Run(input_directory, crx_path, base::FilePath(), 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) privkey_path, ExtensionCreator::kOverwriteCRX)); 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Repeat the run allowing existing crx, but the existing pem is still 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // an error. Should fail. 20162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(creator->Run(input_directory, crx_path, base::FilePath(), 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) privkey_path, ExtensionCreator::kOverwriteCRX)); 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(privkey_path)); 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallCRX(crx_path, INSTALL_NEW); 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try packing with invalid paths. 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) creator.reset(new ExtensionCreator()); 20242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE( 20252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) creator->Run(base::FilePath(), base::FilePath(), base::FilePath(), 20262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(), ExtensionCreator::kOverwriteCRX)); 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try packing an empty directory. Should fail because an empty directory is 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not a valid extension. 20302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir2; 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp_dir2.CreateUniqueTempDir()); 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) creator.reset(new ExtensionCreator()); 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(creator->Run(temp_dir2.path(), crx_path, privkey_path, 20342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(), ExtensionCreator::kOverwriteCRX)); 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try packing with an invalid manifest. 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string invalid_manifest_content = "I am not a manifest."; 2038a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(base::WriteFile( 20392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temp_dir2.path().Append(extensions::kManifestFilename), 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invalid_manifest_content.c_str(), invalid_manifest_content.size())); 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) creator.reset(new ExtensionCreator()); 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(creator->Run(temp_dir2.path(), crx_path, privkey_path, 20432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(), ExtensionCreator::kOverwriteCRX)); 2044a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2045a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Try packing with a private key that is a valid key, but invalid for the 2046a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // extension. 2047f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath bad_private_key_dir = 2048f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data_dir().AppendASCII("bad_private_key"); 2049a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) crx_path = output_directory.AppendASCII("bad_private_key.crx"); 2050f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) privkey_path = data_dir().AppendASCII("bad_private_key.pem"); 2051a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_FALSE(creator->Run(bad_private_key_dir, crx_path, base::FilePath(), 2052a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) privkey_path, ExtensionCreator::kOverwriteCRX)); 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test Packaging and installing an extension whose name contains punctuation. 20562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, PackPunctuatedExtension) { 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 2058f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath input_directory = data_dir() 2059f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("good") 2060f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("Extensions") 2061f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII(good0) 2062f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("1.0.0.0"); 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir; 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Extension names containing punctuation, and the expected names for the 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // packed extensions. 20692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath punctuated_names[] = { 20702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("this.extensions.name.has.periods")), 20712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL(".thisextensionsnamestartswithaperiod")), 20722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("thisextensionhasaslashinitsname/")). 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NormalizePathSeparators(), 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 20752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath expected_crx_names[] = { 20762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("this.extensions.name.has.periods.crx")), 20772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath( 20782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FILE_PATH_LITERAL(".thisextensionsnamestartswithaperiod.crx")), 20792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("thisextensionhasaslashinitsname.crx")), 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 20812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath expected_private_key_names[] = { 20822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("this.extensions.name.has.periods.pem")), 20832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath( 20842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FILE_PATH_LITERAL(".thisextensionsnamestartswithaperiod.pem")), 20852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("thisextensionhasaslashinitsname.pem")), 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(punctuated_names); ++i) { 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE(punctuated_names[i].value().c_str()); 20902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath output_dir = temp_dir.path().Append(punctuated_names[i]); 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Copy the extension into the output directory, as PackExtensionJob doesn't 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // let us choose where to output the packed extension. 20947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::CopyDirectory(input_directory, output_dir, true)); 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath expected_crx_path = 20972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temp_dir.path().Append(expected_crx_names[i]); 20982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath expected_private_key_path = 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp_dir.path().Append(expected_private_key_names[i]); 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PackExtensionTestClient pack_client(expected_crx_path, 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_private_key_path); 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<extensions::PackExtensionJob> packer( 21032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new extensions::PackExtensionJob(&pack_client, output_dir, 21042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(), 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionCreator::kOverwriteCRX)); 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) packer->Start(); 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The packer will post a notification task to the current thread's message 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // loop when it is finished. We manually run the loop here so that we 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // block and catch the notification; otherwise, the process would exit. 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This call to |Run()| is matched by a call to |Quit()| in the 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |PackExtensionTestClient|'s notification handling code. 211390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasFatalFailure()) 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallCRX(expected_crx_path, INSTALL_NEW); 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, PackExtensionContainingKeyFails) { 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir extension_temp_dir; 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension_temp_dir.CreateUniqueTempDir()); 21272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath input_directory = extension_temp_dir.path().AppendASCII("ext"); 2128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE( 2129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::CopyDirectory(data_dir() 2130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("good") 2131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("Extensions") 2132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj") 2133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("1.0.0.0"), 2134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) input_directory, 2135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) /*recursive=*/true)); 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir output_temp_dir; 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(output_temp_dir.CreateUniqueTempDir()); 21392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath output_directory = output_temp_dir.path(); 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath crx_path(output_directory.AppendASCII("ex1.crx")); 21422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath privkey_path(output_directory.AppendASCII("privkey.pem")); 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pack the extension once to get a private key. 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ExtensionCreator> creator(new ExtensionCreator()); 21462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(creator->Run(input_directory, crx_path, base::FilePath(), 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) privkey_path, ExtensionCreator::kNoRunFlags)) 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << creator->error_message(); 21497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(crx_path)); 21507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(privkey_path)); 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::DeleteFile(crx_path, false); 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move the pem file into the extension. 2154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Move(privkey_path, 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_directory.AppendASCII("privkey.pem")); 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This pack should fail because of the contained private key. 21582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(creator->Run(input_directory, crx_path, base::FilePath(), 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) privkey_path, ExtensionCreator::kNoRunFlags)); 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_THAT(creator->error_message(), 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::ContainsRegex( 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "extension includes the key file.*privkey.pem")); 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test Packaging and installing an extension using an openssl generated key. 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The openssl is generated with the following: 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// > openssl genrsa -out privkey.pem 1024 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// > openssl pkcs8 -topk8 -nocrypt -in privkey.pem -out privkey_asn1.pem 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The privkey.pem is a PrivateKey, and the pcks8 -topk8 creates a 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PrivateKeyInfo ASN.1 structure, we our RSAPrivateKey expects. 21712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, PackExtensionOpenSSLKey) { 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 2173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath input_directory = 2174f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data_dir() 2175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("good") 2176f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("Extensions") 2177f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj") 2178f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("1.0.0.0"); 2179f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath privkey_path( 2180f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data_dir().AppendASCII("openssl_privkey_asn1.pem")); 21817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(privkey_path)); 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir; 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 21852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath output_directory = temp_dir.path(); 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath crx_path(output_directory.AppendASCII("ex1.crx")); 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ExtensionCreator> creator(new ExtensionCreator()); 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(creator->Run(input_directory, crx_path, privkey_path, 21912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(), ExtensionCreator::kOverwriteCRX)); 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallCRX(crx_path, INSTALL_NEW); 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(THREAD_SANITIZER) 2197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Flaky under Tsan. http://crbug.com/377702 2198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define MAYBE_InstallTheme DISABLED_InstallTheme 2199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#else 2200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define MAYBE_InstallTheme InstallTheme 2201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 2202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ExtensionServiceTest, MAYBE_InstallTheme) { 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 2205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->Init(); 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A theme. 2208f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("theme.crx"); 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallCRX(path, INSTALL_NEW); 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pref_count = 0; 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(++pref_count); 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidateIntegerPref(theme_crx, "state", Extension::ENABLED); 22132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateIntegerPref(theme_crx, "location", Manifest::INTERNAL); 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A theme when extensions are disabled. Themes can be installed, even when 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // extensions are disabled. 2217f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->set_extensions_enabled(false); 2218f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path = data_dir().AppendASCII("theme2.crx"); 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallCRX(path, INSTALL_NEW); 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(++pref_count); 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidateIntegerPref(theme2_crx, "state", Extension::ENABLED); 22222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateIntegerPref(theme2_crx, "location", Manifest::INTERNAL); 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A theme with extension elements. Themes cannot have extension elements, 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so any such elements (like content scripts) should be ignored. 2226f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->set_extensions_enabled(true); 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2228f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path = data_dir().AppendASCII("theme_with_extension.crx"); 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = InstallCRX(path, INSTALL_NEW); 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(++pref_count); 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension); 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->is_theme()); 22332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ( 22342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0u, 22352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ContentScriptsInfo::GetContentScripts(extension).size()); 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A theme with image resources missing (misspelt path). 2239f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path = data_dir().AppendASCII("theme_missing_image.crx"); 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallCRX(path, INSTALL_FAILED); 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(pref_count); 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, LoadLocalizedTheme) { 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load. 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 2247f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->Init(); 22483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2249f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath extension_path = data_dir().AppendASCII("theme_i18n"); 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2251f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::UnpackedInstaller::Create(service())->Load(extension_path); 2252ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, GetErrors().size()); 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, loaded_.size()); 2255f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 2256f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const Extension* theme = registry()->enabled_extensions().begin()->get(); 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("name", theme->name()); 22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("description", theme->description()); 22592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Cleanup the "Cached Theme.pak" file. Ideally, this would be installed in a 22612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // temporary directory, but it automatically installs to the extension's 22622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // directory, and we don't want to copy the whole extension for a unittest. 22632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath theme_file = extension_path.Append(chrome::kThemePackFilename); 22647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(theme_file)); 22657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::DeleteFile(theme_file, false)); // Not recursive. 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we can change the ID of an unpacked extension by adding a key 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to its manifest. 22702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UnpackedExtensionCanChangeID) { 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp; 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp.CreateUniqueTempDir()); 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath extension_path = temp.path(); 22772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath manifest_path = 22782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension_path.Append(extensions::kManifestFilename); 2279f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath manifest_no_key = 2280f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data_dir().AppendASCII("unpacked").AppendASCII("manifest_no_key.json"); 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2282f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath manifest_with_key = 2283f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data_dir().AppendASCII("unpacked").AppendASCII("manifest_with_key.json"); 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(manifest_no_key)); 22867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(manifest_with_key)); 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load the unpacked extension with no key. 22897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::CopyFile(manifest_no_key, manifest_path); 2290f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::UnpackedInstaller::Create(service())->Load(extension_path); 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2292ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, GetErrors().size()); 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, loaded_.size()); 2295f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add the key to the manifest. 22987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::CopyFile(manifest_with_key, manifest_path); 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loaded_.clear(); 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reload the extensions. 2302f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->ReloadExtensionsForTest(); 2303f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const Extension* extension = service()->GetExtensionById(unpacked, false); 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unpacked, extension->id()); 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, loaded_.size()); 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(jstritar): Right now this just makes sure we don't crash and burn, but 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we should also test that preferences are preserved. 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) 23122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UnpackedExtensionMayContainSymlinkedFiles) { 2313f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath source_data_dir = 2314f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data_dir().AppendASCII("unpacked").AppendASCII("symlinks_allowed"); 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Paths to test data files. 23172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath source_manifest = source_data_dir.AppendASCII("manifest.json"); 23187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(source_manifest)); 23192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath source_icon = source_data_dir.AppendASCII("icon.png"); 23207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(source_icon)); 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up the temporary extension directory. 23232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp; 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp.CreateUniqueTempDir()); 23252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath extension_path = temp.path(); 23262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath manifest = extension_path.Append( 23272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::kManifestFilename); 23282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath icon_symlink = extension_path.AppendASCII("icon.png"); 23297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::CopyFile(source_manifest, manifest); 2330f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::CreateSymbolicLink(source_icon, icon_symlink); 23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load extension. 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 2334f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::UnpackedInstaller::Create(service())->Load(extension_path); 2335ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GetErrors().empty()); 23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, loaded_.size()); 2339f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(ExtensionServiceTest, UnpackedExtensionMayNotHaveUnderscore) { 23443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) InitializeEmptyExtensionService(); 2345f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath extension_path = data_dir().AppendASCII("underscore_name"); 2346f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::UnpackedInstaller::Create(service())->Load(extension_path); 23473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 23483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(1u, GetErrors().size()); 2349f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->enabled_extensions().size()); 23503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 23513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 23522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, InstallLocalizedTheme) { 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 2354f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->Init(); 23553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2356f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath theme_path = data_dir().AppendASCII("theme_i18n"); 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* theme = PackAndInstallCRX(theme_path, INSTALL_NEW); 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, GetErrors().size()); 2361f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("name", theme->name()); 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("description", theme->description()); 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, InstallApps) { 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An empty app. 2370f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const Extension* app = 2371f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PackAndInstallCRX(data_dir().AppendASCII("app1"), INSTALL_NEW); 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pref_count = 0; 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(++pref_count); 2374f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ(1u, registry()->enabled_extensions().size()); 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidateIntegerPref(app->id(), "state", Extension::ENABLED); 23762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateIntegerPref(app->id(), "location", Manifest::INTERNAL); 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Another app with non-overlapping extent. Should succeed. 2379f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PackAndInstallCRX(data_dir().AppendASCII("app2"), INSTALL_NEW); 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(++pref_count); 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A third app whose extent overlaps the first. Should fail. 2383f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PackAndInstallCRX(data_dir().AppendASCII("app3"), INSTALL_FAILED); 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(pref_count); 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that file access is OFF by default. 23882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, DefaultFileAccess) { 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 2390f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const Extension* extension = PackAndInstallCRX( 2391f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data_dir().AppendASCII("permissions").AppendASCII("files"), INSTALL_NEW); 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, GetErrors().size()); 2393f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 2394a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE( 2395f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ExtensionPrefs::Get(profile())->AllowFileAccess(extension->id())); 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpdateApps) { 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 2400f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath extensions_path = data_dir().AppendASCII("app_update"); 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First install v1 of a hosted app. 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallCRX(extensions_path.AppendASCII("v1.crx"), INSTALL_NEW); 2405f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ(1u, registry()->enabled_extensions().size()); 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string id = extension->id(); 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(std::string("1"), extension->version()->GetString()); 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now try updating to v2. 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateExtension(id, 24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions_path.AppendASCII("v2.crx"), 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ENABLED); 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(std::string("2"), 2414f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->GetExtensionById(id, false)->version()->GetString()); 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that the NTP page and launch ordinals are kept when updating apps. 24182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpdateAppsRetainOrdinals) { 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 2420f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) AppSorting* sorting = ExtensionPrefs::Get(profile())->app_sorting(); 2421f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath extensions_path = data_dir().AppendASCII("app_update"); 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First install v1 of a hosted app. 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallCRX(extensions_path.AppendASCII("v1.crx"), INSTALL_NEW); 2426f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ(1u, registry()->enabled_extensions().size()); 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string id = extension->id(); 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(std::string("1"), extension->version()->GetString()); 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Modify the ordinals so we can distinguish them from the defaults. 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::StringOrdinal new_page_ordinal = 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sorting->GetPageOrdinal(id).CreateAfter(); 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::StringOrdinal new_launch_ordinal = 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sorting->GetAppLaunchOrdinal(id).CreateBefore(); 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sorting->SetPageOrdinal(id, new_page_ordinal); 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sorting->SetAppLaunchOrdinal(id, new_launch_ordinal); 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now try updating to v2. 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateExtension(id, extensions_path.AppendASCII("v2.crx"), ENABLED); 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(std::string("2"), 2442f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->GetExtensionById(id, false)->version()->GetString()); 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the ordinals match. 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(new_page_ordinal.Equals(sorting->GetPageOrdinal(id))); 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(new_launch_ordinal.Equals(sorting->GetAppLaunchOrdinal(id))); 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that the CWS has properly initialized ordinals. 24502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, EnsureCWSOrdinalsInitialized) { 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 2452f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->component_loader()->Add( 24532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_WEBSTORE_MANIFEST, base::FilePath(FILE_PATH_LITERAL("web_store"))); 2454f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->Init(); 24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2456f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) AppSorting* sorting = ExtensionPrefs::Get(profile())->app_sorting(); 24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE( 24581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sorting->GetPageOrdinal(extensions::kWebStoreAppId).IsValid()); 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE( 24601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sorting->GetAppLaunchOrdinal(extensions::kWebStoreAppId).IsValid()); 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, InstallAppsWithUnlimitedStorage) { 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 2465f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(registry()->enabled_extensions().is_empty()); 24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pref_count = 0; 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Install app1 with unlimited storage. 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = 2471f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PackAndInstallCRX(data_dir().AppendASCII("app1"), INSTALL_NEW); 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(++pref_count); 2473f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ(1u, registry()->enabled_extensions().size()); 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string id1 = extension->id(); 247546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(extension->permissions_data()->HasAPIPermission( 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) APIPermission::kUnlimitedStorage)); 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->web_extent().MatchesURL( 2478868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extensions::AppLaunchInfo::GetFullLaunchURL(extension))); 2479868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const GURL origin1( 2480868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extensions::AppLaunchInfo::GetFullLaunchURL(extension).GetOrigin()); 2481f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited( 2482f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) origin1)); 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Install app2 from the same origin with unlimited storage. 2485f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension = PackAndInstallCRX(data_dir().AppendASCII("app2"), INSTALL_NEW); 24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(++pref_count); 2487f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ(2u, registry()->enabled_extensions().size()); 24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string id2 = extension->id(); 248946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(extension->permissions_data()->HasAPIPermission( 24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) APIPermission::kUnlimitedStorage)); 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->web_extent().MatchesURL( 2492868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extensions::AppLaunchInfo::GetFullLaunchURL(extension))); 2493868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const GURL origin2( 2494868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extensions::AppLaunchInfo::GetFullLaunchURL(extension).GetOrigin()); 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(origin1, origin2); 2496f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited( 2497f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) origin2)); 24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Uninstall one of them, unlimited storage should still be granted 25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to the origin. 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UninstallExtension(id1, false); 2502f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 2503f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited( 2504f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) origin1)); 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Uninstall the other, unlimited storage should be revoked. 25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UninstallExtension(id2, false); 2508f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->enabled_extensions().size()); 2509f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE( 2510f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited( 2511f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) origin2)); 25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, InstallAppsAndCheckStorageProtection) { 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 2516f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(registry()->enabled_extensions().is_empty()); 25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pref_count = 0; 25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = 2521f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PackAndInstallCRX(data_dir().AppendASCII("app1"), INSTALL_NEW); 25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(++pref_count); 2523f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ(1u, registry()->enabled_extensions().size()); 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->is_app()); 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string id1 = extension->id(); 2526868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const GURL origin1( 2527868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extensions::AppLaunchInfo::GetFullLaunchURL(extension).GetOrigin()); 2528f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageProtected( 2529f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) origin1)); 25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // App 4 has a different origin (maps.google.com). 2532f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension = PackAndInstallCRX(data_dir().AppendASCII("app4"), INSTALL_NEW); 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(++pref_count); 2534f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ(2u, registry()->enabled_extensions().size()); 25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string id2 = extension->id(); 2536868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const GURL origin2( 2537868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extensions::AppLaunchInfo::GetFullLaunchURL(extension).GetOrigin()); 25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(origin1, origin2); 2539f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageProtected( 2540f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) origin2)); 25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UninstallExtension(id1, false); 2543f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UninstallExtension(id2, false); 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2547f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(registry()->enabled_extensions().is_empty()); 2548f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE( 2549f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) profile()->GetExtensionSpecialStoragePolicy()->IsStorageProtected( 2550f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) origin1)); 2551f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE( 2552f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) profile()->GetExtensionSpecialStoragePolicy()->IsStorageProtected( 2553f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) origin2)); 25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that when an extension version is reinstalled, nothing happens. 25572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, Reinstall) { 25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A simple extension that should install without error. 2561f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("good.crx"); 25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallCRX(path, INSTALL_NEW); 25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(1); 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidateIntegerPref(good_crx, "state", Extension::ENABLED); 25662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateIntegerPref(good_crx, "location", Manifest::INTERNAL); 25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reinstall the same version, it should overwrite the previous one. 25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallCRX(path, INSTALL_UPDATED); 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(1); 25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidateIntegerPref(good_crx, "state", Extension::ENABLED); 25732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateIntegerPref(good_crx, "location", Manifest::INTERNAL); 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we can determine if extensions came from the 25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Chrome web store. 25782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, FromWebStore) { 25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A simple extension that should install without error. 2582f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("good.crx"); 25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Not from web store. 25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = InstallCRX(path, INSTALL_NEW); 25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string id = extension->id(); 25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(1); 258868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_TRUE(ValidateBooleanPref(good_crx, "from_webstore", false)); 25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(extension->from_webstore()); 25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test install from web store. 25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallCRXFromWebStore(path, INSTALL_UPDATED); // From web store. 25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(1); 259568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_TRUE(ValidateBooleanPref(good_crx, "from_webstore", true)); 25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reload so extension gets reinitialized with new value. 2598f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->ReloadExtensionsForTest(); 2599f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension = service()->GetExtensionById(id, false); 26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension->from_webstore()); 26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Upgrade to version 2.0 2603f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path = data_dir().AppendASCII("good2.crx"); 26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateExtension(good_crx, path, ENABLED); 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(1); 260668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_TRUE(ValidateBooleanPref(good_crx, "from_webstore", true)); 26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test upgrading a signed extension. 26102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpgradeSignedGood) { 26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2613f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("good.crx"); 26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = InstallCRX(path, INSTALL_NEW); 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string id = extension->id(); 26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ("1.0.0.0", extension->version()->GetString()); 26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0u, GetErrors().size()); 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 262090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Upgrade to version 1.0.0.1. 262190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Also test that the extension's old and new title are correctly retrieved. 2622f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path = data_dir().AppendASCII("good2.crx"); 262390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) InstallCRX(path, INSTALL_UPDATED, Extension::NO_FLAGS, "My extension 1"); 2624f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension = service()->GetExtensionById(id, false); 26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ("1.0.0.1", extension->version()->GetString()); 262790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ("My updated extension 1", extension->name()); 26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0u, GetErrors().size()); 26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test upgrading a signed extension with a bad signature. 26322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpgradeSignedBad) { 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("good.crx"); 26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallCRX(path, INSTALL_NEW); 26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try upgrading with a bad signature. This should fail during the unpack, 26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // because the key will not match the signature. 2640f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path = data_dir().AppendASCII("bad_signature.crx"); 26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallCRX(path, INSTALL_FAILED); 26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test a normal update via the UpdateExtension API 26452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpdateExtension) { 26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2648f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("good.crx"); 26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* good = InstallCRX(path, INSTALL_NEW); 26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ("1.0.0.0", good->VersionString()); 26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(good_crx, good->id()); 26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2654f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path = data_dir().AppendASCII("good2.crx"); 26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateExtension(good_crx, path, ENABLED); 2656f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ( 2657f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) "1.0.0.1", 2658f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->GetExtensionById(good_crx, false)->version()->GetString()); 26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Extensions should not be updated during browser shutdown. 26622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpdateExtensionDuringShutdown) { 26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Install an extension. 2666f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("good.crx"); 26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* good = InstallCRX(path, INSTALL_NEW); 26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(good_crx, good->id()); 26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate shutdown. 2671f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->set_browser_terminating_for_test(true); 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update should fail and extension should not be updated. 2674f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path = data_dir().AppendASCII("good2.crx"); 2675f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool updated = service()->UpdateExtension(good_crx, path, true, NULL); 26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(updated); 2677f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ( 2678f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) "1.0.0.0", 2679f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->GetExtensionById(good_crx, false)->version()->GetString()); 26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test updating a not-already-installed extension - this should fail 26832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpdateNotInstalledExtension) { 26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2686f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("good.crx"); 26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateExtension(good_crx, path, UPDATED); 2688ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2690f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ(0u, registry()->enabled_extensions().size()); 26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(installed_); 26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0u, loaded_.size()); 26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure you can't downgrade an extension via UpdateExtension 26962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpdateWillNotDowngrade) { 26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2699f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("good2.crx"); 27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* good = InstallCRX(path, INSTALL_NEW); 27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ("1.0.0.1", good->VersionString()); 27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(good_crx, good->id()); 27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Change path from good2.crx -> good.crx 2706f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path = data_dir().AppendASCII("good.crx"); 27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateExtension(good_crx, path, FAILED); 2708f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ( 2709f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) "1.0.0.1", 2710f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->GetExtensionById(good_crx, false)->version()->GetString()); 27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure calling update with an identical version does nothing 27142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpdateToSameVersionIsNoop) { 27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2717f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("good.crx"); 27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* good = InstallCRX(path, INSTALL_NEW); 27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(good_crx, good->id()); 27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateExtension(good_crx, path, FAILED_SILENTLY); 27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that updating an extension does not clobber old state. 27252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpdateExtensionPreservesState) { 27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2728f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("good.crx"); 27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* good = InstallCRX(path, INSTALL_NEW); 27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ("1.0.0.0", good->VersionString()); 27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(good_crx, good->id()); 27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable it and allow it to run in incognito. These settings should carry 27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // over to the updated version. 2736f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->DisableExtension(good->id(), Extension::DISABLE_USER_ACTION); 2737f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::util::SetIsIncognitoEnabled(good->id(), profile(), true); 2738f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ExtensionPrefs::Get(profile()) 2739a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->SetDidExtensionEscalatePermissions(good, true); 27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2741f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path = data_dir().AppendASCII("good2.crx"); 27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateExtension(good_crx, path, INSTALLED); 2743f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ(1u, registry()->disabled_extensions().size()); 2744f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const Extension* good2 = service()->GetExtensionById(good_crx, true); 27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ("1.0.0.1", good2->version()->GetString()); 2746f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(extensions::util::IsIncognitoEnabled(good2->id(), profile())); 2747f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(ExtensionPrefs::Get(profile()) 2748a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->DidExtensionEscalatePermissions(good2->id())); 27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that updating preserves extension location. 27522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpdateExtensionPreservesLocation) { 27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("good.crx"); 27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* good = 27582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstallCRXWithLocation(path, Manifest::EXTERNAL_PREF, INSTALL_NEW); 27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ("1.0.0.0", good->VersionString()); 27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(good_crx, good->id()); 27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2763f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path = data_dir().AppendASCII("good2.crx"); 27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateExtension(good_crx, path, ENABLED); 2765f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const Extension* good2 = service()->GetExtensionById(good_crx, false); 27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ("1.0.0.1", good2->version()->GetString()); 27672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(good2->location(), Manifest::EXTERNAL_PREF); 27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure that LOAD extension types can downgrade. 27712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, LoadExtensionsCanDowngrade) { 27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp; 27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp.CreateUniqueTempDir()); 27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We'll write the extension manifest dynamically to a temporary path 27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to make it easier to change the version number. 27792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath extension_path = temp.path(); 27802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath manifest_path = 27812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension_path.Append(extensions::kManifestFilename); 27827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_FALSE(base::PathExists(manifest_path)); 27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start with version 2.0. 27855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue manifest; 27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.SetString("version", "2.0"); 27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.SetString("name", "LOAD Downgrade Test"); 27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.SetInteger("manifest_version", 2); 27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONFileValueSerializer serializer(manifest_path); 27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(serializer.Serialize(manifest)); 27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2793f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::UnpackedInstaller::Create(service())->Load(extension_path); 2794ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, GetErrors().size()); 27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, loaded_.size()); 27982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(Manifest::UNPACKED, loaded_[0]->location()); 2799f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("2.0", loaded_[0]->VersionString()); 28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now set the version number to 1.0, reload the extensions and verify that 28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the downgrade was accepted. 28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.SetString("version", "1.0"); 28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(serializer.Serialize(manifest)); 28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2807f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::UnpackedInstaller::Create(service())->Load(extension_path); 2808ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, GetErrors().size()); 28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, loaded_.size()); 28122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(Manifest::UNPACKED, loaded_[0]->location()); 2813f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("1.0", loaded_[0]->VersionString()); 28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2817cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if !defined(OS_POSIX) || defined(OS_MACOSX) 28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LOAD extensions with plugins require approval. 2819cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Only run this on platforms that support NPAPI plugins. 28202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, LoadExtensionsWithPlugins) { 282168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::FilePath extension_with_plugin_path = good1_path(); 282268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::FilePath extension_no_plugin_path = good2_path(); 28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitPluginService(); 28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 2826f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) InitializeProcessManager(); 2827f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->set_show_extensions_prompts(true); 28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start by canceling any install prompts. 28305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ExtensionInstallPrompt::g_auto_confirm_for_tests = 28315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ExtensionInstallPrompt::CANCEL; 28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The extension that has a plugin should not install. 2834f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::UnpackedInstaller::Create(service()) 2835f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ->Load(extension_with_plugin_path); 2836ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, GetErrors().size()); 28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, loaded_.size()); 2839f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->enabled_extensions().size()); 2840f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->disabled_extensions().size()); 28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // But the extension with no plugin should since there's no prompt. 2843ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ExtensionErrorReporter::GetInstance()->ClearErrors(); 2844f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::UnpackedInstaller::Create(service()) 2845f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ->Load(extension_no_plugin_path); 2846ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, GetErrors().size()); 28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, loaded_.size()); 2849f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 2850f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->disabled_extensions().size()); 2851f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(registry()->enabled_extensions().Contains(good2)); 28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The plugin extension should install if we accept the dialog. 28545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ExtensionInstallPrompt::g_auto_confirm_for_tests = 28555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ExtensionInstallPrompt::ACCEPT; 28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2857ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ExtensionErrorReporter::GetInstance()->ClearErrors(); 2858f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::UnpackedInstaller::Create(service()) 2859f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ->Load(extension_with_plugin_path); 2860ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, GetErrors().size()); 28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2u, loaded_.size()); 2863f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(2u, registry()->enabled_extensions().size()); 2864f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->disabled_extensions().size()); 2865f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(registry()->enabled_extensions().Contains(good1)); 2866f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(registry()->enabled_extensions().Contains(good2)); 28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the granted permissions have been setup. 28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<PermissionSet> permissions( 2870f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ExtensionPrefs::Get(profile())->GetGrantedPermissions(good1)); 28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(permissions->IsEmpty()); 28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(permissions->HasEffectiveFullAccess()); 28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(permissions->apis().empty()); 28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(permissions->HasAPIPermission(APIPermission::kPlugin)); 28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should be able to reload the extension without getting another prompt. 28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loaded_.clear(); 28785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ExtensionInstallPrompt::g_auto_confirm_for_tests = 28795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ExtensionInstallPrompt::CANCEL; 28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2881f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->ReloadExtension(good1); 2882ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, loaded_.size()); 2884f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(2u, registry()->enabled_extensions().size()); 2885f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->disabled_extensions().size()); 28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2887cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif // !defined(OS_POSIX) || defined(OS_MACOSX) 28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2891868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool IsExtension(const Extension* extension) { 2892868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return extension->GetType() == Manifest::TYPE_EXTENSION; 28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(ENABLE_BLACKLIST_TESTS) 2896cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::set<std::string> StringSet(const std::string& s) { 2897cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::set<std::string> set; 2898cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) set.insert(s); 2899cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return set; 2900cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2901cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::set<std::string> StringSet(const std::string& s1, const std::string& s2) { 2902cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::set<std::string> set = StringSet(s1); 2903cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) set.insert(s2); 2904cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return set; 2905cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2906cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif // defined(ENABLE_BLACKLIST_TESTS) 2907cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test adding a pending extension. 29112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, AddPendingExtensionFromSync) { 29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string kFakeId(all_zero); 29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL kFakeUpdateURL("http:://fake.update/url"); 29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool kFakeInstallSilently(true); 2917cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const bool kFakeRemoteInstall(false); 2918116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const bool kFakeInstalledByCustodian(false); 29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2920cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE( 2921116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service()->pending_extension_manager()->AddFromSync( 2922116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kFakeId, 2923116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kFakeUpdateURL, 2924116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &IsExtension, 2925116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kFakeInstallSilently, 2926116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kFakeRemoteInstall, 2927116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kFakeInstalledByCustodian)); 29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::PendingExtensionInfo* pending_extension_info; 2930f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE((pending_extension_info = 2931f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->pending_extension_manager()->GetById(kFakeId))); 29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFakeUpdateURL, pending_extension_info->update_url()); 29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(&IsExtension, pending_extension_info->should_allow_install_); 29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFakeInstallSilently, pending_extension_info->install_silently()); 2935cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Use 2936cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // EXPECT_TRUE(kFakeRemoteInstall == pending_extension_info->remote_install()) 2937cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // instead of 2938cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // EXPECT_EQ(kFakeRemoteInstall, pending_extension_info->remote_install()) 2939cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // as gcc 4.7 issues the following warning on EXPECT_EQ(false, x), which is 2940cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // turned into an error with -Werror=conversion-null: 2941cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // converting 'false' to pointer type for argument 1 of 2942cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // 'char testing::internal::IsNullLiteralHelper(testing::internal::Secret*)' 2943cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // https://code.google.com/p/googletest/issues/detail?id=458 2944cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(kFakeRemoteInstall == pending_extension_info->remote_install()); 29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kGoodId[] = "ldnnhddmnhbkjipkidpdiheffobcpfmf"; 29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kGoodUpdateURL[] = "http://good.update/url"; 29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const bool kGoodIsFromSync = true; 29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const bool kGoodInstallSilently = true; 2952cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const bool kGoodRemoteInstall = false; 2953116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst bool kGoodInstalledByCustodian = false; 29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test updating a pending extension. 29572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpdatePendingExtension) { 29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 2959cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE( 2960116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service()->pending_extension_manager()->AddFromSync( 2961116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kGoodId, 2962116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL(kGoodUpdateURL), 2963116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &IsExtension, 2964116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kGoodInstallSilently, 2965116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kGoodRemoteInstall, 2966116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kGoodInstalledByCustodian)); 2967f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->pending_extension_manager()->IsIdPending(kGoodId)); 2968f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 2969f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("good.crx"); 29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateExtension(kGoodId, path, ENABLED); 29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2972f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(kGoodId)); 29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2974f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const Extension* extension = service()->GetExtensionById(kGoodId, true); 29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension); 29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2980868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool IsTheme(const Extension* extension) { 2981868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return extension->is_theme(); 29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test updating a pending theme. 29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Disabled due to ASAN failure. http://crbug.com/108320 29882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, DISABLED_UpdatePendingTheme) { 29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 2990f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->pending_extension_manager()->AddFromSync( 2991116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch theme_crx, GURL(), &IsTheme, false, false, false)); 2992f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->pending_extension_manager()->IsIdPending(theme_crx)); 29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2994f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("theme.crx"); 29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateExtension(theme_crx, path, ENABLED); 29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2997f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(theme_crx)); 29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2999f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const Extension* extension = service()->GetExtensionById(theme_crx, true); 30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension); 30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3002f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE( 3003f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ExtensionPrefs::Get(profile())->IsExtensionDisabled(extension->id())); 3004f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->IsExtensionEnabled(theme_crx)); 30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Always fails on ChromeOS: http://crbug.com/79737 30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_UpdatePendingExternalCrx DISABLED_UpdatePendingExternalCrx 30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_UpdatePendingExternalCrx UpdatePendingExternalCrx 30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test updating a pending CRX as if the source is an external extension 30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with an update URL. In this case we don't know if the CRX is a theme 30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// or not. 30162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, MAYBE_UpdatePendingExternalCrx) { 30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 3018f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->pending_extension_manager()->AddFromExternalUpdateUrl( 3019effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch theme_crx, 3020effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::string(), 3021effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch GURL(), 3022effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Manifest::EXTERNAL_PREF_DOWNLOAD, 3023effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Extension::NO_FLAGS, 30244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) false)); 30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3026f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->pending_extension_manager()->IsIdPending(theme_crx)); 30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3028f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("theme.crx"); 30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateExtension(theme_crx, path, ENABLED); 30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3031f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(theme_crx)); 30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3033f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const Extension* extension = service()->GetExtensionById(theme_crx, true); 30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension); 30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3036f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE( 3037f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ExtensionPrefs::Get(profile())->IsExtensionDisabled(extension->id())); 3038f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->IsExtensionEnabled(extension->id())); 3039f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE( 3040f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::util::IsIncognitoEnabled(extension->id(), profile())); 30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test updating a pending CRX as if the source is an external extension 30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with an update URL. The external update should overwrite a sync update, 30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// but a sync update should not overwrite a non-sync update. 30462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpdatePendingExternalCrxWinsOverSync) { 30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a crx to be installed from the update mechanism. 3050cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE( 3051116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service()->pending_extension_manager()->AddFromSync( 3052116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kGoodId, 3053116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL(kGoodUpdateURL), 3054116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &IsExtension, 3055116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kGoodInstallSilently, 3056116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kGoodRemoteInstall, 3057116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kGoodInstalledByCustodian)); 30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that there is a pending crx, with is_from_sync set to true. 30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::PendingExtensionInfo* pending_extension_info; 3061f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE((pending_extension_info = 3062f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->pending_extension_manager()->GetById(kGoodId))); 30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pending_extension_info->is_from_sync()); 30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a crx to be updated, with the same ID, from a non-sync source. 3066f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->pending_extension_manager()->AddFromExternalUpdateUrl( 3067effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch kGoodId, 3068effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::string(), 3069effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch GURL(kGoodUpdateURL), 3070effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Manifest::EXTERNAL_PREF_DOWNLOAD, 3071effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Extension::NO_FLAGS, 3072effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch false)); 30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that there is a pending crx, with is_from_sync set to false. 3075f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE((pending_extension_info = 3076f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->pending_extension_manager()->GetById(kGoodId))); 30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pending_extension_info->is_from_sync()); 30782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(Manifest::EXTERNAL_PREF_DOWNLOAD, 30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_extension_info->install_source()); 30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a crx to be installed from the update mechanism. 3082cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE( 3083116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service()->pending_extension_manager()->AddFromSync( 3084116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kGoodId, 3085116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL(kGoodUpdateURL), 3086116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &IsExtension, 3087116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kGoodInstallSilently, 3088116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kGoodRemoteInstall, 3089116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kGoodInstalledByCustodian)); 30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the external, non-sync update was not overridden. 3092f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE((pending_extension_info = 3093f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->pending_extension_manager()->GetById(kGoodId))); 30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pending_extension_info->is_from_sync()); 30952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(Manifest::EXTERNAL_PREF_DOWNLOAD, 30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_extension_info->install_source()); 30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Updating a theme should fail if the updater is explicitly told that 31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the CRX is not a theme. 31012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpdatePendingCrxThemeMismatch) { 31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 3103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->pending_extension_manager()->AddFromSync( 3104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch theme_crx, GURL(), &IsExtension, true, false, false)); 31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->pending_extension_manager()->IsIdPending(theme_crx)); 31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("theme.crx"); 31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateExtension(theme_crx, path, FAILED_SILENTLY); 31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(theme_crx)); 31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const Extension* extension = service()->GetExtensionById(theme_crx, true); 31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(extension); 31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(akalin): Test updating a pending extension non-silently once 31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we can mock out ExtensionInstallUI and inject our version into 31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// UpdateExtension(). 31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test updating a pending extension which fails the should-install test. 31222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpdatePendingExtensionFailedShouldInstallTest) { 31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add pending extension with a flipped is_theme. 3125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE( 3126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service()->pending_extension_manager()->AddFromSync( 3127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kGoodId, 3128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL(kGoodUpdateURL), 3129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &IsTheme, 3130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kGoodInstallSilently, 3131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kGoodRemoteInstall, 3132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kGoodInstalledByCustodian)); 3133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->pending_extension_manager()->IsIdPending(kGoodId)); 3134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("good.crx"); 31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateExtension(kGoodId, path, UPDATED); 31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(akalin): Figure out how to check that the extensions 31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // directory is cleaned up properly in OnExtensionInstalled(). 31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(kGoodId)); 31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(akalin): Figure out how to test that installs of pending 31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unsyncable extensions are blocked. 31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test updating a pending extension for one that is not pending. 31482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpdatePendingExtensionNotPending) { 31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3151f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("good.crx"); 31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateExtension(kGoodId, path, UPDATED); 31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(kGoodId)); 31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test updating a pending extension for one that is already 31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// installed. 31592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpdatePendingExtensionAlreadyInstalled) { 31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3162f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("good.crx"); 31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* good = InstallCRX(path, INSTALL_NEW); 3164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ(1u, registry()->enabled_extensions().size()); 31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(good->is_theme()); 31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use AddExtensionImpl() as AddFrom*() would balk. 3169f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->pending_extension_manager()->AddExtensionImpl( 3170effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch good->id(), 3171effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::string(), 3172effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch extensions::ManifestURL::GetUpdateURL(good), 3173effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Version(), 3174effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &IsExtension, 3175effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch kGoodIsFromSync, 3176effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch kGoodInstallSilently, 3177effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Manifest::INTERNAL, 3178effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Extension::NO_FLAGS, 3179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) false, 3180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kGoodRemoteInstall); 31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateExtension(good->id(), path, ENABLED); 31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3183f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(kGoodId)); 31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 318668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(ENABLE_BLACKLIST_TESTS) 318768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Tests blacklisting then unblacklisting extensions after the service has been 318868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// initialized. 31892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, SetUnsetBlacklistInPrefs) { 31905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extensions::TestBlacklist test_blacklist; 319168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // A profile with 3 extensions installed: good0, good1, and good2. 319268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) InitializeGoodInstalledExtensionService(); 3193f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) test_blacklist.Attach(service()->blacklist_); 3194f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->Init(); 319568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 31965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const extensions::ExtensionSet& enabled_extensions = 3197f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) registry()->enabled_extensions(); 31985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const extensions::ExtensionSet& blacklisted_extensions = 3199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) registry()->blacklisted_extensions(); 32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(enabled_extensions.Contains(good0) && 32025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !blacklisted_extensions.Contains(good0)); 32035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(enabled_extensions.Contains(good1) && 32045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !blacklisted_extensions.Contains(good1)); 32055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(enabled_extensions.Contains(good2) && 32065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !blacklisted_extensions.Contains(good2)); 32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 320868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(IsPrefExist(good0, "blacklist")); 32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(IsPrefExist(good1, "blacklist")); 321068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(IsPrefExist(good2, "blacklist")); 32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(IsPrefExist("invalid_id", "blacklist")); 32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 321368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Blacklist good0 and good1 (and an invalid extension ID). 32145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_blacklist.SetBlacklistState( 32155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) good0, extensions::BLACKLISTED_MALWARE, true); 32165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_blacklist.SetBlacklistState( 32175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) good1, extensions::BLACKLISTED_MALWARE, true); 32185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_blacklist.SetBlacklistState( 32195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "invalid_id", extensions::BLACKLISTED_MALWARE, true); 322068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(!enabled_extensions.Contains(good0) && 32235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blacklisted_extensions.Contains(good0)); 32245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(!enabled_extensions.Contains(good1) && 32255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blacklisted_extensions.Contains(good1)); 32265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(enabled_extensions.Contains(good2) && 32275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !blacklisted_extensions.Contains(good2)); 32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 322968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(ValidateBooleanPref(good0, "blacklist", true)); 323068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(ValidateBooleanPref(good1, "blacklist", true)); 323168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(IsPrefExist(good2, "blacklist")); 323268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(IsPrefExist("invalid_id", "blacklist")); 32332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 323468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Un-blacklist good1 and blacklist good2. 32355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_blacklist.Clear(false); 32365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_blacklist.SetBlacklistState( 32375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) good0, extensions::BLACKLISTED_MALWARE, true); 32385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_blacklist.SetBlacklistState( 32395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) good2, extensions::BLACKLISTED_MALWARE, true); 32405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_blacklist.SetBlacklistState( 32415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "invalid_id", extensions::BLACKLISTED_MALWARE, true); 3242ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(!enabled_extensions.Contains(good0) && 32455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blacklisted_extensions.Contains(good0)); 32465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(enabled_extensions.Contains(good1) && 32475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !blacklisted_extensions.Contains(good1)); 32485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(!enabled_extensions.Contains(good2) && 32495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blacklisted_extensions.Contains(good2)); 32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(ValidateBooleanPref(good0, "blacklist", true)); 325268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(IsPrefExist(good1, "blacklist")); 325368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(ValidateBooleanPref(good2, "blacklist", true)); 325468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(IsPrefExist("invalid_id", "blacklist")); 32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 325668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif // defined(ENABLE_BLACKLIST_TESTS) 32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(ENABLE_BLACKLIST_TESTS) 325968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Tests trying to install a blacklisted extension. 32602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, BlacklistedExtensionWillNotInstall) { 326168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scoped_refptr<FakeSafeBrowsingDatabaseManager> blacklist_db( 326268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) new FakeSafeBrowsingDatabaseManager(true)); 326368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Blacklist::ScopedDatabaseManagerForTest scoped_blacklist_db(blacklist_db); 32642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 326568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) InitializeEmptyExtensionService(); 3266f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->Init(); 32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 326868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // After blacklisting good_crx, we cannot install it. 326968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) blacklist_db->SetUnsafe(good_crx).NotifyUpdate(); 327068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3272f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("good.crx"); 3273a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // HACK: specify WAS_INSTALLED_BY_DEFAULT so that test machinery doesn't 3274a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // decide to install this silently. Somebody should fix these tests, all 3275a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // 6,000 lines of them. Hah! 3276a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) InstallCRX(path, INSTALL_FAILED, Extension::WAS_INSTALLED_BY_DEFAULT); 3277f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->enabled_extensions().size()); 32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 327968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif // defined(ENABLE_BLACKLIST_TESTS) 32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 328168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(ENABLE_BLACKLIST_TESTS) 32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Unload blacklisted extension on policy change. 32832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UnloadBlacklistedExtensionPolicy) { 32845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extensions::TestBlacklist test_blacklist; 328568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 328668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // A profile with no extensions installed. 32871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci InitializeEmptyExtensionServiceWithTestingPrefs(); 3288f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) test_blacklist.Attach(service()->blacklist_); 328968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3290f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("good.crx"); 32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* good = InstallCRX(path, INSTALL_NEW); 32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(good_crx, good->id()); 32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateExtension(good_crx, path, FAILED_SILENTLY); 3295f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 32981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ManagementPrefUpdater pref(profile_->GetTestingPrefService()); 32991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pref.SetIndividualExtensionInstallationAllowed(good_crx, true); 33001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_blacklist.SetBlacklistState( 33035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) good_crx, extensions::BLACKLISTED_MALWARE, true); 3304ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The good_crx is blacklisted and the whitelist doesn't negate it. 330768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_TRUE(ValidateBooleanPref(good_crx, "blacklist", true)); 3308f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->enabled_extensions().size()); 33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 331068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif // defined(ENABLE_BLACKLIST_TESTS) 33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 331268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(ENABLE_BLACKLIST_TESTS) 331368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Tests that a blacklisted extension is eventually unloaded on startup, if it 331468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// wasn't already. 33152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, WillNotLoadBlacklistedExtensionsFromDirectory) { 33165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extensions::TestBlacklist test_blacklist; 331768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 331868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // A profile with 3 extensions installed: good0, good1, and good2. 331968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) InitializeGoodInstalledExtensionService(); 3320f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) test_blacklist.Attach(service()->blacklist_); 33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 332268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Blacklist good1 before the service initializes. 33235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_blacklist.SetBlacklistState( 33245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) good1, extensions::BLACKLISTED_MALWARE, false); 332568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 332668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Load extensions. 3327f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->Init(); 332868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_EQ(3u, loaded_.size()); // hasn't had time to blacklist yet 33292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3330ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3332f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ(1u, registry()->blacklisted_extensions().size()); 3333f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ(2u, registry()->enabled_extensions().size()); 33345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3335f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE(registry()->enabled_extensions().Contains(good0)); 3336f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE(registry()->blacklisted_extensions().Contains(good1)); 3337f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE(registry()->enabled_extensions().Contains(good2)); 333868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 333968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif // defined(ENABLE_BLACKLIST_TESTS) 334068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 334168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(ENABLE_BLACKLIST_TESTS) 334268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Tests extensions blacklisted in prefs on startup; one still blacklisted by 334368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// safe browsing, the other not. The not-blacklisted one should recover. 334468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(ExtensionServiceTest, BlacklistedInPrefsFromStartup) { 33455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extensions::TestBlacklist test_blacklist; 334668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 334768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) InitializeGoodInstalledExtensionService(); 3348f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) test_blacklist.Attach(service()->blacklist_); 3349f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ExtensionPrefs::Get(profile())->SetExtensionBlacklisted(good0, true); 3350f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ExtensionPrefs::Get(profile())->SetExtensionBlacklisted(good1, true); 335168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 33525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_blacklist.SetBlacklistState( 33535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) good1, extensions::BLACKLISTED_MALWARE, false); 33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Extension service hasn't loaded yet, but IsExtensionEnabled reads out of 3356cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // prefs. Ensure it takes into account the blacklist state (crbug.com/373842). 3357f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->IsExtensionEnabled(good0)); 3358f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->IsExtensionEnabled(good1)); 3359f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->IsExtensionEnabled(good2)); 3360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3361f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->Init(); 33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3363f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(2u, registry()->blacklisted_extensions().size()); 3364f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 336568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3366f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(registry()->blacklisted_extensions().Contains(good0)); 3367f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(registry()->blacklisted_extensions().Contains(good1)); 3368f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(registry()->enabled_extensions().Contains(good2)); 336968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 337068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Give time for the blacklist to update. 337168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 337268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3373f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->blacklisted_extensions().size()); 3374f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(2u, registry()->enabled_extensions().size()); 33755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3376f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(registry()->enabled_extensions().Contains(good0)); 3377f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(registry()->blacklisted_extensions().Contains(good1)); 3378f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(registry()->enabled_extensions().Contains(good2)); 33795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 33805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // defined(ENABLE_BLACKLIST_TESTS) 33815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(ENABLE_BLACKLIST_TESTS) 33835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Extension is added to blacklist with BLACKLISTED_POTENTIALLY_UNWANTED state 33845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// after it is installed. It is then successfully re-enabled by the user. 33855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ExtensionServiceTest, GreylistedExtensionDisabled) { 33865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extensions::TestBlacklist test_blacklist; 33875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // A profile with 3 extensions installed: good0, good1, and good2. 33885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitializeGoodInstalledExtensionService(); 3389f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) test_blacklist.Attach(service()->blacklist_); 3390f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->Init(); 33915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const extensions::ExtensionSet& enabled_extensions = 3393f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) registry()->enabled_extensions(); 33945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const extensions::ExtensionSet& disabled_extensions = 3395f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) registry()->disabled_extensions(); 33965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(enabled_extensions.Contains(good0)); 33985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(enabled_extensions.Contains(good1)); 33995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(enabled_extensions.Contains(good2)); 34005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 34015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Blacklist good0 and good1 (and an invalid extension ID). 34025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_blacklist.SetBlacklistState( 34035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) good0, extensions::BLACKLISTED_CWS_POLICY_VIOLATION, true); 34045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_blacklist.SetBlacklistState( 34055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) good1, extensions::BLACKLISTED_POTENTIALLY_UNWANTED, true); 34065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_blacklist.SetBlacklistState( 34075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "invalid_id", extensions::BLACKLISTED_MALWARE, true); 34085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 34095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 34105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(enabled_extensions.Contains(good0)); 34115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(disabled_extensions.Contains(good0)); 34125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(enabled_extensions.Contains(good1)); 34135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(disabled_extensions.Contains(good1)); 34145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(enabled_extensions.Contains(good2)); 34155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(disabled_extensions.Contains(good2)); 34165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 34175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ValidateIntegerPref( 34185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) good0, "blacklist_state", extensions::BLACKLISTED_CWS_POLICY_VIOLATION); 34195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ValidateIntegerPref( 34205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) good1, "blacklist_state", extensions::BLACKLISTED_POTENTIALLY_UNWANTED); 34215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 34225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Now user enables good0. 3423f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->EnableExtension(good0); 34245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 34255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(enabled_extensions.Contains(good0)); 34265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(disabled_extensions.Contains(good0)); 34275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(enabled_extensions.Contains(good1)); 34285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(disabled_extensions.Contains(good1)); 34295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 34305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Remove extensions from blacklist. 34315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_blacklist.SetBlacklistState( 34325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) good0, extensions::NOT_BLACKLISTED, true); 34335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_blacklist.SetBlacklistState( 34345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) good1, extensions::NOT_BLACKLISTED, true); 34355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // All extensions are enabled. 34385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(enabled_extensions.Contains(good0)); 34395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(disabled_extensions.Contains(good0)); 34405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(enabled_extensions.Contains(good1)); 34415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(disabled_extensions.Contains(good1)); 34425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(enabled_extensions.Contains(good2)); 34435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(disabled_extensions.Contains(good2)); 34445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 34455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // defined(ENABLE_BLACKLIST_TESTS) 34465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 34475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(ENABLE_BLACKLIST_TESTS) 34485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// When extension is removed from greylist, do not re-enable it if it is 34495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// disabled by user. 34505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ExtensionServiceTest, GreylistDontEnableManuallyDisabled) { 34515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extensions::TestBlacklist test_blacklist; 34525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // A profile with 3 extensions installed: good0, good1, and good2. 34535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitializeGoodInstalledExtensionService(); 3454f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) test_blacklist.Attach(service()->blacklist_); 3455f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->Init(); 34565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 34575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const extensions::ExtensionSet& enabled_extensions = 3458f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) registry()->enabled_extensions(); 34595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const extensions::ExtensionSet& disabled_extensions = 3460f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) registry()->disabled_extensions(); 34615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 34625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Manually disable. 3463f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->DisableExtension(good0, 3464f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::Extension::DISABLE_USER_ACTION); 34655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 34665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_blacklist.SetBlacklistState( 34675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) good0, extensions::BLACKLISTED_CWS_POLICY_VIOLATION, true); 34685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_blacklist.SetBlacklistState( 34695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) good1, extensions::BLACKLISTED_POTENTIALLY_UNWANTED, true); 34705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_blacklist.SetBlacklistState( 34715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) good2, extensions::BLACKLISTED_SECURITY_VULNERABILITY, true); 34725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 34735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 34745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // All extensions disabled. 34755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(enabled_extensions.Contains(good0)); 34765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(disabled_extensions.Contains(good0)); 34775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(enabled_extensions.Contains(good1)); 34785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(disabled_extensions.Contains(good1)); 34795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(enabled_extensions.Contains(good2)); 34805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(disabled_extensions.Contains(good2)); 34815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 34825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Greylisted extension can be enabled. 3483f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->EnableExtension(good1); 34845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(enabled_extensions.Contains(good1)); 34855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(disabled_extensions.Contains(good1)); 34865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 34875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // good1 is now manually disabled. 3488f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->DisableExtension(good1, 3489f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::Extension::DISABLE_USER_ACTION); 34905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(enabled_extensions.Contains(good1)); 34915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(disabled_extensions.Contains(good1)); 34925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 34935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Remove extensions from blacklist. 34945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_blacklist.SetBlacklistState( 34955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) good0, extensions::NOT_BLACKLISTED, true); 34965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_blacklist.SetBlacklistState( 34975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) good1, extensions::NOT_BLACKLISTED, true); 34985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_blacklist.SetBlacklistState( 34995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) good2, extensions::NOT_BLACKLISTED, true); 35005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 35015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 35025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // good0 and good1 remain disabled. 35035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(enabled_extensions.Contains(good0)); 35045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(disabled_extensions.Contains(good0)); 35055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(enabled_extensions.Contains(good1)); 35065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(disabled_extensions.Contains(good1)); 35075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(enabled_extensions.Contains(good2)); 35085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(disabled_extensions.Contains(good2)); 35095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 35105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // defined(ENABLE_BLACKLIST_TESTS) 35115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 35125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(ENABLE_BLACKLIST_TESTS) 35135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Blacklisted extension with unknown state are not enabled/disabled. 35145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ExtensionServiceTest, GreylistUnknownDontChange) { 35155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extensions::TestBlacklist test_blacklist; 35165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // A profile with 3 extensions installed: good0, good1, and good2. 35175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitializeGoodInstalledExtensionService(); 3518f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) test_blacklist.Attach(service()->blacklist_); 3519f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->Init(); 35205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 35215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const extensions::ExtensionSet& enabled_extensions = 3522f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) registry()->enabled_extensions(); 35235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const extensions::ExtensionSet& disabled_extensions = 3524f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) registry()->disabled_extensions(); 35255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 35265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_blacklist.SetBlacklistState( 35275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) good0, extensions::BLACKLISTED_CWS_POLICY_VIOLATION, true); 35285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_blacklist.SetBlacklistState( 35295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) good1, extensions::BLACKLISTED_POTENTIALLY_UNWANTED, true); 35305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 35315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 35325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(enabled_extensions.Contains(good0)); 35335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(disabled_extensions.Contains(good0)); 35345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(enabled_extensions.Contains(good1)); 35355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(disabled_extensions.Contains(good1)); 35365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(enabled_extensions.Contains(good2)); 35375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(disabled_extensions.Contains(good2)); 35385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 35395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_blacklist.SetBlacklistState( 35405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) good0, extensions::NOT_BLACKLISTED, true); 35415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_blacklist.SetBlacklistState( 35425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) good1, extensions::BLACKLISTED_UNKNOWN, true); 35435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_blacklist.SetBlacklistState( 35445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) good2, extensions::BLACKLISTED_UNKNOWN, true); 35455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 35465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 35475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // good0 re-enabled, other remain as they were. 35485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(enabled_extensions.Contains(good0)); 35495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(disabled_extensions.Contains(good0)); 35505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(enabled_extensions.Contains(good1)); 35515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(disabled_extensions.Contains(good1)); 35525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(enabled_extensions.Contains(good2)); 35535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(disabled_extensions.Contains(good2)); 35545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3555cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3556cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Tests that blacklisted extensions cannot be reloaded, both those loaded 3557cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// before and after extension service startup. 3558cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ExtensionServiceTest, ReloadBlacklistedExtension) { 3559cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) extensions::TestBlacklist test_blacklist; 3560cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3561cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InitializeGoodInstalledExtensionService(); 3562f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) test_blacklist.Attach(service()->blacklist_); 3563cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3564cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_blacklist.SetBlacklistState( 3565cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) good1, extensions::BLACKLISTED_MALWARE, false); 3566f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->Init(); 3567cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_blacklist.SetBlacklistState( 3568cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) good2, extensions::BLACKLISTED_MALWARE, false); 3569cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 3570cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3571f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(StringSet(good0), registry()->enabled_extensions().GetIDs()); 3572cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(StringSet(good1, good2), 3573f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) registry()->blacklisted_extensions().GetIDs()); 3574cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3575f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->ReloadExtension(good1); 3576f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->ReloadExtension(good2); 3577cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 3578cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3579f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(StringSet(good0), registry()->enabled_extensions().GetIDs()); 3580cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(StringSet(good1, good2), 3581f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) registry()->blacklisted_extensions().GetIDs()); 3582cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 3583cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 358468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif // defined(ENABLE_BLACKLIST_TESTS) 35855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Will not install extension blacklisted by policy. 35872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, BlacklistedByPolicyWillNotInstall) { 35881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci InitializeEmptyExtensionServiceWithTestingPrefs(); 35895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Blacklist everything. 35915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 35921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ManagementPrefUpdater pref(profile_->GetTestingPrefService()); 35931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pref.SetBlacklistedByDefault(true); 35945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Blacklist prevents us from installing good_crx. 3597f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("good.crx"); 35985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallCRX(path, INSTALL_FAILED); 3599f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->enabled_extensions().size()); 36005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now whitelist this particular extension. 36025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 36031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ManagementPrefUpdater pref(profile_->GetTestingPrefService()); 36041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pref.SetIndividualExtensionInstallationAllowed(good_crx, true); 36055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure we can now install good_crx. 36085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallCRX(path, INSTALL_NEW); 3609f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 36105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Extension blacklisted by policy get unloaded after installing. 36132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, BlacklistedByPolicyRemovedIfRunning) { 36141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci InitializeEmptyExtensionServiceWithTestingPrefs(); 36155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Install good_crx. 3617f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("good.crx"); 36185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallCRX(path, INSTALL_NEW); 3619f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 36221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ManagementPrefUpdater pref(profile_->GetTestingPrefService()); 36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Blacklist this extension. 36241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pref.SetIndividualExtensionInstallationAllowed(good_crx, false); 36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Extension should not be running now. 3628ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 3629f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->enabled_extensions().size()); 36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that component extensions are not blacklisted by policy. 36332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ComponentExtensionWhitelisted) { 36341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci InitializeEmptyExtensionServiceWithTestingPrefs(); 36355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Blacklist everything. 36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 36381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ManagementPrefUpdater pref(profile_->GetTestingPrefService()); 36391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pref.SetBlacklistedByDefault(true); 36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Install a component extension. 3643f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir() 3644f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("good") 3645f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("Extensions") 3646f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII(good0) 3647f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("1.0.0.0"); 36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string manifest; 364958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(base::ReadFileToString( 36502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) path.Append(extensions::kManifestFilename), &manifest)); 3651f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->component_loader()->Add(manifest, path); 3652f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->Init(); 36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Extension should be installed despite blacklist. 3655f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ(1u, registry()->enabled_extensions().size()); 3656f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->GetExtensionById(good0, false)); 36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Poke external providers and make sure the extension is still present. 3659f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->CheckForExternalUpdates(); 3660f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ(1u, registry()->enabled_extensions().size()); 3661f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->GetExtensionById(good0, false)); 36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Extension should not be uninstalled on blacklist changes. 36645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 36651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ManagementPrefUpdater pref(profile_->GetTestingPrefService()); 36661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pref.SetIndividualExtensionInstallationAllowed(good0, false); 36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3668ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 3669f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ(1u, registry()->enabled_extensions().size()); 3670f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->GetExtensionById(good0, false)); 36715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that policy-installed extensions are not blacklisted by policy. 36742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, PolicyInstalledExtensionsWhitelisted) { 36751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci InitializeEmptyExtensionServiceWithTestingPrefs(); 36765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 36781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ManagementPrefUpdater pref(profile_->GetTestingPrefService()); 36792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Blacklist everything. 36801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pref.SetBlacklistedByDefault(true); 36812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Mark good.crx for force-installation. 36821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pref.SetIndividualExtensionAutoInstalled( 36831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci good_crx, "http://example.com/update_url", true); 36845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Have policy force-install an extension. 36875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockExtensionProvider* provider = 3688f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new MockExtensionProvider(service(), Manifest::EXTERNAL_POLICY_DOWNLOAD); 36895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddMockExternalProvider(provider); 3690f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) provider->UpdateOrAddExtension( 3691f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) good_crx, "1.0.0.0", data_dir().AppendASCII("good.crx")); 36925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reloading extensions should find our externally registered extension 36945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and install it. 3695f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver observer( 36965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_CRX_INSTALLER_DONE, 3697f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NotificationService::AllSources()); 3698f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->CheckForExternalUpdates(); 3699f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) observer.Wait(); 37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Extension should be installed despite blacklist. 3702f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ(1u, registry()->enabled_extensions().size()); 3703f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->GetExtensionById(good_crx, false)); 37045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Blacklist update should not uninstall the extension. 37065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 37071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ManagementPrefUpdater pref(profile_->GetTestingPrefService()); 37081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pref.SetIndividualExtensionInstallationAllowed(good0, false); 37095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3710ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 3711f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ(1u, registry()->enabled_extensions().size()); 3712f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->GetExtensionById(good_crx, false)); 37135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that extensions cannot be installed if the policy provider prohibits 37165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it. This functionality is implemented in CrxInstaller::ConfirmInstall(). 37172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ManagementPolicyProhibitsInstall) { 37185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 37195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3720f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GetManagementPolicy()->UnregisterAllProviders(); 37215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::TestManagementPolicyProvider provider_( 37225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::TestManagementPolicyProvider::PROHIBIT_LOAD); 3723f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GetManagementPolicy()->RegisterProvider(&provider_); 37245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_FAILED); 3726f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->enabled_extensions().size()); 37275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that extensions cannot be loaded from prefs if the policy provider 37305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// prohibits it. This functionality is implemented in InstalledLoader::Load(). 37312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ManagementPolicyProhibitsLoadFromPrefs) { 37325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 37335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a fake extension to be loaded as though it were read from prefs. 3735f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = 3736f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data_dir().AppendASCII("management").AppendASCII("simple_extension"); 37375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue manifest; 37385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.SetString(keys::kName, "simple_extension"); 37395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.SetString(keys::kVersion, "1"); 37402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // UNPACKED is for extensions loaded from a directory. We use it here, even 37415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // though we're testing loading from prefs, so that we don't need to provide 37425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // an extension key. 3743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::ExtensionInfo extension_info( 3744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &manifest, std::string(), path, Manifest::UNPACKED); 37455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure we can load it with no management policy in place. 3747f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GetManagementPolicy()->UnregisterAllProviders(); 3748f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->enabled_extensions().size()); 3749f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::InstalledLoader(service()).Load(extension_info, false); 3750f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 37515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3752f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const Extension* extension = 3753f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) (registry()->enabled_extensions().begin())->get(); 37545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE( 37555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) service()->UninstallExtension(extension->id(), 37565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::UNINSTALL_REASON_FOR_TESTING, 37575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&base::DoNothing), 37585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NULL)); 3759f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->enabled_extensions().size()); 37605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure we cannot load it if management policy prohibits installation. 37625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::TestManagementPolicyProvider provider_( 37635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::TestManagementPolicyProvider::PROHIBIT_LOAD); 3764f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GetManagementPolicy()->RegisterProvider(&provider_); 37655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3766f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::InstalledLoader(service()).Load(extension_info, false); 3767f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->enabled_extensions().size()); 37685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests disabling an extension when prohibited by the ManagementPolicy. 37712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ManagementPolicyProhibitsDisable) { 37725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 37735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3774f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 3775f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 3776f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->disabled_extensions().size()); 37775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3778f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GetManagementPolicy()->UnregisterAllProviders(); 37795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::TestManagementPolicyProvider provider( 37805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::TestManagementPolicyProvider::PROHIBIT_MODIFY_STATUS); 3781f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GetManagementPolicy()->RegisterProvider(&provider); 37825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Attempt to disable it. 3784f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->DisableExtension(good_crx, Extension::DISABLE_USER_ACTION); 37855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3786f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 3787f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->GetExtensionById(good_crx, false)); 3788f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->disabled_extensions().size()); 37895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests uninstalling an extension when prohibited by the ManagementPolicy. 37922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ManagementPolicyProhibitsUninstall) { 37935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 37945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 3796f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 3797f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->disabled_extensions().size()); 37985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3799f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GetManagementPolicy()->UnregisterAllProviders(); 38005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::TestManagementPolicyProvider provider( 38015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::TestManagementPolicyProvider::PROHIBIT_MODIFY_STATUS); 3802f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GetManagementPolicy()->RegisterProvider(&provider); 38035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Attempt to uninstall it. 38055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE( 38065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) service()->UninstallExtension(good_crx, 38075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::UNINSTALL_REASON_FOR_TESTING, 38085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&base::DoNothing), 38095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NULL)); 38105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3811f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 3812f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->GetExtensionById(good_crx, false)); 38135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that previously installed extensions that are now prohibited from 38165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// being installed are removed. 38172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ManagementPolicyUnloadsAllProhibited) { 38185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 38195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3820f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 3821f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) InstallCRX(data_dir().AppendASCII("page_action.crx"), INSTALL_NEW); 3822f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(2u, registry()->enabled_extensions().size()); 3823f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->disabled_extensions().size()); 38245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3825f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GetManagementPolicy()->UnregisterAllProviders(); 38265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::TestManagementPolicyProvider provider( 38275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::TestManagementPolicyProvider::PROHIBIT_LOAD); 3828f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GetManagementPolicy()->RegisterProvider(&provider); 38295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Run the policy check. 3831f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->CheckManagementPolicy(); 3832f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->enabled_extensions().size()); 3833f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->disabled_extensions().size()); 38345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that previously disabled extensions that are now required to be 38375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// enabled are re-enabled on reinstall. 38382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ManagementPolicyRequiresEnable) { 38395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 38405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Install, then disable, an extension. 3842f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 3843f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 3844f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->DisableExtension(good_crx, Extension::DISABLE_USER_ACTION); 3845f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->disabled_extensions().size()); 38465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Register an ExtensionMnagementPolicy that requires the extension to remain 38485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // enabled. 3849f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GetManagementPolicy()->UnregisterAllProviders(); 38505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::TestManagementPolicyProvider provider( 38515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::TestManagementPolicyProvider::MUST_REMAIN_ENABLED); 3852f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GetManagementPolicy()->RegisterProvider(&provider); 38535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reinstall the extension. 3855f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_UPDATED); 3856f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 3857f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->disabled_extensions().size()); 38585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Flaky on windows; http://crbug.com/309833 38618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(OS_WIN) 38628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#define MAYBE_ExternalExtensionAutoAcknowledgement DISABLED_ExternalExtensionAutoAcknowledgement 38638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#else 38648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#define MAYBE_ExternalExtensionAutoAcknowledgement ExternalExtensionAutoAcknowledgement 38658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif 38665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ExtensionServiceTest, MAYBE_ExternalExtensionAutoAcknowledgement) { 38675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 3868f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->set_extensions_enabled(true); 38695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 38715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Register and install an external extension. 38725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockExtensionProvider* provider = 3873f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF); 38745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddMockExternalProvider(provider); 3875f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) provider->UpdateOrAddExtension( 3876f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) good_crx, "1.0.0.0", data_dir().AppendASCII("good.crx")); 38775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 38795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Have policy force-install an extension. 3880f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) MockExtensionProvider* provider = new MockExtensionProvider( 3881f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service(), Manifest::EXTERNAL_POLICY_DOWNLOAD); 38825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddMockExternalProvider(provider); 3883f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) provider->UpdateOrAddExtension( 3884f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) page_action, "1.0.0.0", data_dir().AppendASCII("page_action.crx")); 38855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Providers are set up. Let them run. 38887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int count = 2; 3889f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver observer( 38905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_CRX_INSTALLER_DONE, 3891f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Bind(&WaitForCountNotificationsCallback, &count)); 3892f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->CheckForExternalUpdates(); 3893f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3894f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) observer.Wait(); 38955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3896f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ(2u, registry()->enabled_extensions().size()); 3897f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->GetExtensionById(good_crx, false)); 3898f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->GetExtensionById(page_action, false)); 3899f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ExtensionPrefs* prefs = ExtensionPrefs::Get(profile()); 39005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(!prefs->IsExternalExtensionAcknowledged(good_crx)); 39015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(prefs->IsExternalExtensionAcknowledged(page_action)); 39025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_CHROMEOS) 39055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This tests if default apps are installed correctly. 39062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, DefaultAppsInstall) { 39075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 3908f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->set_extensions_enabled(true); 39095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 39115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string json_data = 39125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "{" 39135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"ldnnhddmnhbkjipkidpdiheffobcpfmf\" : {" 39145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_crx\": \"good.crx\"," 39155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_version\": \"1.0.0.0\"," 39165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"is_bookmark_app\": false" 39175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }" 39185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}"; 3919f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) default_apps::Provider* provider = new default_apps::Provider( 3920f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) profile(), 3921f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service(), 3922f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new extensions::ExternalTestingLoader(json_data, data_dir()), 3923f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Manifest::INTERNAL, 3924f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Manifest::INVALID_LOCATION, 3925f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Extension::FROM_WEBSTORE | Extension::WAS_INSTALLED_BY_DEFAULT); 39265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddMockExternalProvider(provider); 39285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3930f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ(0u, registry()->enabled_extensions().size()); 3931f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver observer( 39325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_CRX_INSTALLER_DONE, 3933f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NotificationService::AllSources()); 3934f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->CheckForExternalUpdates(); 3935f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) observer.Wait(); 39365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3937f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ(1u, registry()->enabled_extensions().size()); 3938f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->GetExtensionById(good_crx, false)); 3939f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const Extension* extension = service()->GetExtensionById(good_crx, false); 39405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->from_webstore()); 39415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->was_installed_by_default()); 39425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 39445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests disabling extensions 39462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, DisableExtension) { 39475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 39485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3949f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 3950f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->GetExtensionById(good_crx, true)); 3951f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->GetExtensionById(good_crx, false)); 39525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3953f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 3954f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->disabled_extensions().size()); 3955f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->terminated_extensions().size()); 3956f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->blacklisted_extensions().size()); 39575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable it. 3959f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->DisableExtension(good_crx, Extension::DISABLE_USER_ACTION); 39605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3961f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->GetExtensionById(good_crx, true)); 3962f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->GetExtensionById(good_crx, false)); 3963f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->enabled_extensions().size()); 3964f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->disabled_extensions().size()); 3965f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->terminated_extensions().size()); 3966f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->blacklisted_extensions().size()); 39675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 39685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ExtensionServiceTest, TerminateExtension) { 39705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitializeEmptyExtensionService(); 39715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3972f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 3973f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 3974f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->disabled_extensions().size()); 3975f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->terminated_extensions().size()); 3976f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->blacklisted_extensions().size()); 39775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TerminateExtension(good_crx); 39795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3980f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->enabled_extensions().size()); 3981f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->disabled_extensions().size()); 3982f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->terminated_extensions().size()); 3983f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->blacklisted_extensions().size()); 39845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, DisableTerminatedExtension) { 39875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 39885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3989f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 39905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TerminateExtension(good_crx); 3991f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(registry()->GetExtensionById( 3992effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch good_crx, extensions::ExtensionRegistry::TERMINATED)); 39935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable it. 3995f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->DisableExtension(good_crx, Extension::DISABLE_USER_ACTION); 39965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3997f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(registry()->GetExtensionById( 3998effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch good_crx, extensions::ExtensionRegistry::TERMINATED)); 3999f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->GetExtensionById(good_crx, true)); 40005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4001f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->enabled_extensions().size()); 4002f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->disabled_extensions().size()); 4003f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->terminated_extensions().size()); 4004f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->blacklisted_extensions().size()); 40055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests disabling all extensions (simulating --disable-extensions flag). 40082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, DisableAllExtensions) { 40095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 40105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4011f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("good.crx"); 40125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallCRX(path, INSTALL_NEW); 40135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4014f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 4015f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->disabled_extensions().size()); 40165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable extensions. 4018f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->set_extensions_enabled(false); 4019f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->ReloadExtensionsForTest(); 40205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There shouldn't be extensions in either list. 4022f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->enabled_extensions().size()); 4023f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->disabled_extensions().size()); 40245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This shouldn't do anything when all extensions are disabled. 4026f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->EnableExtension(good_crx); 4027f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->ReloadExtensionsForTest(); 40285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There still shouldn't be extensions in either list. 4030f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->enabled_extensions().size()); 4031f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->disabled_extensions().size()); 40325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And then re-enable the extensions. 4034f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->set_extensions_enabled(true); 4035f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->ReloadExtensionsForTest(); 40365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4037f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 4038f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->disabled_extensions().size()); 40395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests reloading extensions. 40422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ReloadExtensions) { 40435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 40445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simple extension that should install without error. 4046f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("good.crx"); 40475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallCRX(path, INSTALL_NEW, 40485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::FROM_WEBSTORE | Extension::WAS_INSTALLED_BY_DEFAULT); 40495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* extension_id = good_crx; 4050f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->DisableExtension(extension_id, Extension::DISABLE_USER_ACTION); 40515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4052f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->enabled_extensions().size()); 4053f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->disabled_extensions().size()); 40545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->ReloadExtensionsForTest(); 40565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The creation flags should not change when reloading the extension. 4058f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const Extension* extension = service()->GetExtensionById(good_crx, true); 40595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->from_webstore()); 40605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->was_installed_by_default()); 40615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(extension->from_bookmark()); 40625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Extension counts shouldn't change. 4064f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->enabled_extensions().size()); 4065f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->disabled_extensions().size()); 40665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4067f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->EnableExtension(extension_id); 40685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4069f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 4070f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->disabled_extensions().size()); 40715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Need to clear |loaded_| manually before reloading as the 40735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // EnableExtension() call above inserted into it and 40745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // UnloadAllExtensions() doesn't send out notifications. 40755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loaded_.clear(); 4076f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->ReloadExtensionsForTest(); 40775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Extension counts shouldn't change. 4079f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 4080f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->disabled_extensions().size()); 40815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests reloading an extension. 40842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ReloadExtension) { 40852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitializeEmptyExtensionService(); 4086f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) InitializeProcessManager(); 40872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 40882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Simple extension that should install without error. 40892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* extension_id = "behllobkkfkfnphdnhnkndlbkcpglgmj"; 4090f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath ext = data_dir() 4091f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("good") 4092f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("Extensions") 4093f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII(extension_id) 4094f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("1.0.0.0"); 4095f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::UnpackedInstaller::Create(service())->Load(ext); 4096ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 40972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4098f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 4099f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->disabled_extensions().size()); 41002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->ReloadExtension(extension_id); 41022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 41032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Extension should be disabled now, waiting to be reloaded. 4104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->enabled_extensions().size()); 4105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->disabled_extensions().size()); 4106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(Extension::DISABLE_RELOAD, 4107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ExtensionPrefs::Get(profile())->GetDisableReasons(extension_id)); 41082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 41092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Reloading again should not crash. 4110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->ReloadExtension(extension_id); 41112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 41122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Finish reloading 4113ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 41142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 41152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Extension should be enabled again. 4116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 4117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->disabled_extensions().size()); 41182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 41192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 41202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UninstallExtension) { 41215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 4122f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 4123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 41245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UninstallExtension(good_crx, false); 4125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->enabled_extensions().size()); 4126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(UnloadedExtensionInfo::REASON_UNINSTALL, unloaded_reason_); 41275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UninstallTerminatedExtension) { 41305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 4131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 41325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TerminateExtension(good_crx); 41335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UninstallExtension(good_crx, false); 4134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(UnloadedExtensionInfo::REASON_TERMINATE, unloaded_reason_); 41355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests the uninstaller helper. 41382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UninstallExtensionHelper) { 41395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 4140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 41415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UninstallExtension(good_crx, true); 4142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(UnloadedExtensionInfo::REASON_UNINSTALL, unloaded_reason_); 41435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UninstallExtensionHelperTerminated) { 41465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 4147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 41485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TerminateExtension(good_crx); 41495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UninstallExtension(good_crx, true); 4150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(UnloadedExtensionInfo::REASON_TERMINATE, unloaded_reason_); 41515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An extension disabled because of unsupported requirements should re-enabled 41545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if updated to a version with supported requirements as long as there are no 41555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// other disable reasons. 41562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpgradingRequirementsEnabled) { 41575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 41585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlackListWebGL(); 41595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4160f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("requirements"); 4161f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath pem_path = 4162f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data_dir().AppendASCII("requirements").AppendASCII("v1_good.pem"); 41635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension_v1 = PackAndInstallCRX(path.AppendASCII("v1_good"), 41645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pem_path, 41655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INSTALL_NEW); 41665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string id = extension_v1->id(); 4167f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->IsExtensionEnabled(id)); 41685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath v2_bad_requirements_crx = GetTemporaryFile(); 41702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 41712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PackCRX(path.AppendASCII("v2_bad_requirements"), 41722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pem_path, 41732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) v2_bad_requirements_crx); 41742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateExtension(id, v2_bad_requirements_crx, INSTALLED); 4175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->IsExtensionEnabled(id)); 41765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath v3_good_crx = GetTemporaryFile(); 41782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 41792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PackCRX(path.AppendASCII("v3_good"), pem_path, v3_good_crx); 41802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateExtension(id, v3_good_crx, ENABLED); 4181f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->IsExtensionEnabled(id)); 41825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Extensions disabled through user action should stay disabled. 41852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpgradingRequirementsDisabled) { 41865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 41875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlackListWebGL(); 41885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4189f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("requirements"); 4190f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath pem_path = 4191f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data_dir().AppendASCII("requirements").AppendASCII("v1_good.pem"); 41925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension_v1 = PackAndInstallCRX(path.AppendASCII("v1_good"), 41935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pem_path, 41945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INSTALL_NEW); 41955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string id = extension_v1->id(); 4196f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->DisableExtension(id, Extension::DISABLE_USER_ACTION); 4197f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->IsExtensionEnabled(id)); 41985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath v2_bad_requirements_crx = GetTemporaryFile(); 42002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 42012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PackCRX(path.AppendASCII("v2_bad_requirements"), 42022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pem_path, 42032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) v2_bad_requirements_crx); 42042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateExtension(id, v2_bad_requirements_crx, INSTALLED); 4205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->IsExtensionEnabled(id)); 42065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath v3_good_crx = GetTemporaryFile(); 42082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 42092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PackCRX(path.AppendASCII("v3_good"), pem_path, v3_good_crx); 42102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateExtension(id, v3_good_crx, INSTALLED); 4211f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->IsExtensionEnabled(id)); 42125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The extension should not re-enabled because it was disabled from a 42155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// permission increase. 42162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UpgradingRequirementsPermissions) { 42175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 42185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlackListWebGL(); 42195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4220f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("requirements"); 4221f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath pem_path = 4222f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data_dir().AppendASCII("requirements").AppendASCII("v1_good.pem"); 42235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension_v1 = PackAndInstallCRX(path.AppendASCII("v1_good"), 42245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pem_path, 42255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INSTALL_NEW); 42265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string id = extension_v1->id(); 4227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->IsExtensionEnabled(id)); 42285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath v2_bad_requirements_and_permissions_crx = GetTemporaryFile(); 42302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 42312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PackCRX(path.AppendASCII("v2_bad_requirements_and_permissions"), 42322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pem_path, 42332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) v2_bad_requirements_and_permissions_crx); 42342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateExtension(id, v2_bad_requirements_and_permissions_crx, INSTALLED); 4235f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->IsExtensionEnabled(id)); 42365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath v3_bad_permissions_crx = GetTemporaryFile(); 42382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 42392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PackCRX(path.AppendASCII("v3_bad_permissions"), 42402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pem_path, 42412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) v3_bad_permissions_crx); 42422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateExtension(id, v3_bad_permissions_crx, INSTALLED); 4243f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->IsExtensionEnabled(id)); 42445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Unpacked extensions are not allowed to be installed if they have unsupported 42475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// requirements. 42482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, UnpackedRequirements) { 42495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 42505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlackListWebGL(); 42515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4252f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = 4253f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data_dir().AppendASCII("requirements").AppendASCII("v2_bad_requirements"); 4254f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::UnpackedInstaller::Create(service())->Load(path); 4255ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 42565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, GetErrors().size()); 4257f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->enabled_extensions().size()); 42585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionCookieCallback { 42615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 42625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionCookieCallback() 42635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : result_(false), 426490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) weak_factory_(base::MessageLoop::current()) {} 42655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetCookieCallback(bool result) { 426790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, 426890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Bind(&base::MessageLoop::Quit, weak_factory_.GetWeakPtr())); 42695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_ = result; 42705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetAllCookiesCallback(const net::CookieList& list) { 427390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, 427490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Bind(&base::MessageLoop::Quit, weak_factory_.GetWeakPtr())); 42755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_ = list; 42765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CookieList list_; 42785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result_; 427990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::WeakPtrFactory<base::MessageLoop> weak_factory_; 42805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 42815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies extension state is removed upon uninstall. 42832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ClearExtensionData) { 42845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 42855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionCookieCallback callback; 42865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load a test extension. 4288f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir(); 42895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.AppendASCII("good.crx"); 42905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = InstallCRX(path, INSTALL_NEW); 42915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension); 42925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL ext_url(extension->url()); 429303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::string origin_id = storage::GetIdentifierFromOrigin(ext_url); 42945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set a cookie for the extension. 4296f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) net::CookieMonster* cookie_monster = profile() 4297f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ->GetRequestContextForExtensions() 4298f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ->GetURLRequestContext() 4299f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ->cookie_store() 4300f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ->GetCookieMonster(); 43015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(cookie_monster); 43025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CookieOptions options; 43035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookie_monster->SetCookieWithOptionsAsync( 43045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext_url, "dummy=value", options, 43055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ExtensionCookieCallback::SetCookieCallback, 43065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(&callback))); 4307ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 43085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(callback.result_); 43095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookie_monster->GetAllCookiesForURLAsync( 43115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext_url, 43125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ExtensionCookieCallback::GetAllCookiesCallback, 43135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(&callback))); 4314ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 43155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1U, callback.list_.size()); 43165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Open a database. 431803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::DatabaseTracker* db_tracker = 4319f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) BrowserContext::GetDefaultStoragePartition(profile()) 4320f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ->GetDatabaseTracker(); 43215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 db_name = base::UTF8ToUTF16("db"); 43225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 description = base::UTF8ToUTF16("db_description"); 43235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 size; 43245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_tracker->DatabaseOpened(origin_id, db_name, description, 1, &size); 43255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_tracker->DatabaseClosed(origin_id, db_name); 432603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::vector<storage::OriginInfo> origins; 43275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_tracker->GetAllOriginsInfo(&origins); 43285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1U, origins.size()); 43297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(origin_id, origins[0].GetOriginIdentifier()); 43305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create local storage. We only simulate this by creating the backing files. 43325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: This test depends on details of how the dom_storage library 43335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // stores data in the host file system. 43342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath lso_dir_path = 4335f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) profile()->GetPath().AppendASCII("Local Storage"); 43367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::FilePath lso_file_path = lso_dir_path.AppendASCII(origin_id) 43377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) .AddExtension(FILE_PATH_LITERAL(".localstorage")); 4338a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(base::CreateDirectory(lso_dir_path)); 4339a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0, base::WriteFile(lso_file_path, NULL, 0)); 43407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(base::PathExists(lso_file_path)); 43415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create indexed db. Similarly, it is enough to only simulate this by 43435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // creating the directory on the disk. 4344f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) IndexedDBContext* idb_context = BrowserContext::GetDefaultStoragePartition( 4345f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) profile())->GetIndexedDBContext(); 4346eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch idb_context->SetTaskRunnerForTesting( 4347eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::MessageLoop::current()->message_loop_proxy().get()); 43482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath idb_path = idb_context->GetFilePathForTesting(origin_id); 4349a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(base::CreateDirectory(idb_path)); 43507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(base::DirectoryExists(idb_path)); 43515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Uninstall the extension. 43535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::RunLoop run_loop; 43545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE( 43555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) service()->UninstallExtension(good_crx, 43565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::UNINSTALL_REASON_FOR_TESTING, 43575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) run_loop.QuitClosure(), 43585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NULL)); 43595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // The data deletion happens on the IO thread. 43605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) run_loop.Run(); 43615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the cookie is gone. 43635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookie_monster->GetAllCookiesForURLAsync( 43645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext_url, 43655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ExtensionCookieCallback::GetAllCookiesCallback, 43665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(&callback))); 4367ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 43685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0U, callback.list_.size()); 43695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The database should have vanished as well. 43715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origins.clear(); 43725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_tracker->GetAllOriginsInfo(&origins); 43735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0U, origins.size()); 43745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the LSO file has been removed. 43767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(lso_file_path)); 43775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if the indexed db has disappeared too. 43797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::DirectoryExists(idb_path)); 43805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies app state is removed upon uninstall. 43832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ClearAppData) { 43845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 43855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionCookieCallback callback; 43865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pref_count = 0; 43885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Install app1 with unlimited storage. 43905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = 4391f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PackAndInstallCRX(data_dir().AppendASCII("app1"), INSTALL_NEW); 43925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(++pref_count); 4393f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ(1u, registry()->enabled_extensions().size()); 43945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string id1 = extension->id(); 439546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(extension->permissions_data()->HasAPIPermission( 43965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) APIPermission::kUnlimitedStorage)); 4397868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const GURL origin1( 4398868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extensions::AppLaunchInfo::GetFullLaunchURL(extension).GetOrigin()); 4399f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited( 4400f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) origin1)); 440103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::string origin_id = storage::GetIdentifierFromOrigin(origin1); 44025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Install app2 from the same origin with unlimited storage. 4404f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension = PackAndInstallCRX(data_dir().AppendASCII("app2"), INSTALL_NEW); 44055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(++pref_count); 4406f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ(2u, registry()->enabled_extensions().size()); 44075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string id2 = extension->id(); 440846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(extension->permissions_data()->HasAPIPermission( 44095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) APIPermission::kUnlimitedStorage)); 44105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->web_extent().MatchesURL( 4411868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extensions::AppLaunchInfo::GetFullLaunchURL(extension))); 4412868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const GURL origin2( 4413868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extensions::AppLaunchInfo::GetFullLaunchURL(extension).GetOrigin()); 44145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(origin1, origin2); 4415f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited( 4416f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) origin2)); 44175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set a cookie for the extension. 4419f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) net::CookieMonster* cookie_monster = profile() 4420f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ->GetRequestContext() 4421f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ->GetURLRequestContext() 4422f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ->cookie_store() 4423f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ->GetCookieMonster(); 44245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(cookie_monster); 44255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CookieOptions options; 44265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookie_monster->SetCookieWithOptionsAsync( 44275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin1, "dummy=value", options, 44285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ExtensionCookieCallback::SetCookieCallback, 44295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(&callback))); 4430ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 44315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(callback.result_); 44325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookie_monster->GetAllCookiesForURLAsync( 44345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin1, 44355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ExtensionCookieCallback::GetAllCookiesCallback, 44365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(&callback))); 4437ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 44385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1U, callback.list_.size()); 44395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Open a database. 444103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::DatabaseTracker* db_tracker = 4442f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) BrowserContext::GetDefaultStoragePartition(profile()) 4443f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ->GetDatabaseTracker(); 44445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 db_name = base::UTF8ToUTF16("db"); 44455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 description = base::UTF8ToUTF16("db_description"); 44465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 size; 44475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_tracker->DatabaseOpened(origin_id, db_name, description, 1, &size); 44485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_tracker->DatabaseClosed(origin_id, db_name); 444903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::vector<storage::OriginInfo> origins; 44505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_tracker->GetAllOriginsInfo(&origins); 44515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1U, origins.size()); 44527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(origin_id, origins[0].GetOriginIdentifier()); 44535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create local storage. We only simulate this by creating the backing files. 44555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: This test depends on details of how the dom_storage library 44565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // stores data in the host file system. 44572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath lso_dir_path = 4458f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) profile()->GetPath().AppendASCII("Local Storage"); 44597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::FilePath lso_file_path = lso_dir_path.AppendASCII(origin_id) 44607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) .AddExtension(FILE_PATH_LITERAL(".localstorage")); 4461a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(base::CreateDirectory(lso_dir_path)); 4462a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0, base::WriteFile(lso_file_path, NULL, 0)); 44637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(base::PathExists(lso_file_path)); 44645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create indexed db. Similarly, it is enough to only simulate this by 44665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // creating the directory on the disk. 4467f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) IndexedDBContext* idb_context = BrowserContext::GetDefaultStoragePartition( 4468f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) profile())->GetIndexedDBContext(); 4469eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch idb_context->SetTaskRunnerForTesting( 4470eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::MessageLoop::current()->message_loop_proxy().get()); 44712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath idb_path = idb_context->GetFilePathForTesting(origin_id); 4472a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(base::CreateDirectory(idb_path)); 44737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(base::DirectoryExists(idb_path)); 44745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Uninstall one of them, unlimited storage should still be granted 44765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to the origin. 44775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UninstallExtension(id1, false); 4478f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 4479f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited( 4480f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) origin1)); 44815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the cookie is still there. 44835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookie_monster->GetAllCookiesForURLAsync( 44845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin1, 44855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ExtensionCookieCallback::GetAllCookiesCallback, 44865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(&callback))); 4487ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 44885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1U, callback.list_.size()); 44895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now uninstall the other. Storage should be cleared for the apps. 44915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UninstallExtension(id2, false); 4492f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->enabled_extensions().size()); 4493f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE( 4494f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited( 4495f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) origin1)); 44965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the cookie is gone. 44985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookie_monster->GetAllCookiesForURLAsync( 44995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin1, 45005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ExtensionCookieCallback::GetAllCookiesCallback, 45015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(&callback))); 4502ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 45035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0U, callback.list_.size()); 45045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The database should have vanished as well. 45065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origins.clear(); 45075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_tracker->GetAllOriginsInfo(&origins); 45085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0U, origins.size()); 45095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the LSO file has been removed. 45117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(lso_file_path)); 45125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if the indexed db has disappeared too. 45147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::DirectoryExists(idb_path)); 45155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 45165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests loading single extensions (like --load-extension) 4518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Flaky crashes. http://crbug.com/231806 4519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ExtensionServiceTest, DISABLED_LoadExtension) { 45205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 45215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4522f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath ext1 = data_dir() 4523f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("good") 4524f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("Extensions") 4525f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj") 4526f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("1.0.0.0"); 4527f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::UnpackedInstaller::Create(service())->Load(ext1); 4528ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 45295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, GetErrors().size()); 45305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, loaded_.size()); 45312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(Manifest::UNPACKED, loaded_[0]->location()); 4532f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 45335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(1); 45355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4536f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath no_manifest = 4537f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data_dir() 4538f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("bad") 4539f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // .AppendASCII("Extensions") 4540f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("cccccccccccccccccccccccccccccccc") 4541f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("1"); 4542f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::UnpackedInstaller::Create(service())->Load(no_manifest); 4543ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 45445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, GetErrors().size()); 45455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, loaded_.size()); 4546f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 45475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test uninstall. 45495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string id = loaded_[0]->id(); 45505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(unloaded_id_.length()); 45515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) service()->UninstallExtension(id, 45525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::UNINSTALL_REASON_FOR_TESTING, 45535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&base::DoNothing), 45545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NULL); 4555ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 45565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(id, unloaded_id_); 45575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0u, loaded_.size()); 4558f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->enabled_extensions().size()); 45595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 45605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we generate IDs when they are not specified in the manifest for 45625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// --load-extension. 45632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, GenerateID) { 45645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 45655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4566f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath no_id_ext = data_dir().AppendASCII("no_id"); 4567f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::UnpackedInstaller::Create(service())->Load(no_id_ext); 4568ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 45695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, GetErrors().size()); 45705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, loaded_.size()); 457103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(crx_file::id_util::IdIsValid(loaded_[0]->id())); 45722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(loaded_[0]->location(), Manifest::UNPACKED); 45735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(1); 45755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string previous_id = loaded_[0]->id(); 45775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we reload the same path, we should get the same extension ID. 4579f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::UnpackedInstaller::Create(service())->Load(no_id_ext); 4580ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 45815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, loaded_.size()); 45825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(previous_id, loaded_[0]->id()); 45835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 45845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4585d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST_F(ExtensionServiceTest, UnpackedValidatesLocales) { 4586d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) InitializeEmptyExtensionService(); 4587d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 4588f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath bad_locale = 4589f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data_dir().AppendASCII("unpacked").AppendASCII("bad_messages_file"); 4590f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::UnpackedInstaller::Create(service())->Load(bad_locale); 4591d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 4592d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(1u, GetErrors().size()); 4593d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::FilePath ms_messages_file = bad_locale.AppendASCII("_locales") 4594d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) .AppendASCII("ms") 4595d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) .AppendASCII("messages.json"); 45965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_THAT(base::UTF16ToUTF8(GetErrors()[0]), testing::AllOf( 45975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) testing::HasSubstr( 45985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF16ToUTF8(ms_messages_file.LossyDisplayName())), 4599d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) testing::HasSubstr("Dictionary keys must be quoted."))); 4600d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ASSERT_EQ(0u, loaded_.size()); 4601d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 4602d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 46035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionServiceTest::TestExternalProvider( 46042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockExtensionProvider* provider, Manifest::Location location) { 46055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that starting with no providers loads no extensions. 4606f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->Init(); 46075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0u, loaded_.size()); 46085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider->set_visit_count(0); 46105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Register a test extension externally using the mock registry provider. 4612f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath source_path = data_dir().AppendASCII("good.crx"); 46135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add the extension. 46155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider->UpdateOrAddExtension(good_crx, "1.0.0.0", source_path); 46165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reloading extensions should find our externally registered extension 46185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and install it. 4619f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver observer( 46205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_CRX_INSTALLER_DONE, 4621f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NotificationService::AllSources()); 4622f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->CheckForExternalUpdates(); 4623f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) observer.Wait(); 46245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0u, GetErrors().size()); 46265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, loaded_.size()); 46275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(location, loaded_[0]->location()); 46285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ("1.0.0.0", loaded_[0]->version()->GetString()); 46295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(1); 46305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidateIntegerPref(good_crx, "state", Extension::ENABLED); 46315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidateIntegerPref(good_crx, "location", location); 46325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reload extensions without changing anything. The extension should be 46345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // loaded again. 46355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loaded_.clear(); 4636f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->ReloadExtensionsForTest(); 4637ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 46385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0u, GetErrors().size()); 46395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, loaded_.size()); 46405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(1); 46415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidateIntegerPref(good_crx, "state", Extension::ENABLED); 46425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidateIntegerPref(good_crx, "location", location); 46435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now update the extension with a new version. We should get upgraded. 46455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_path = source_path.DirName().AppendASCII("good2.crx"); 46465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider->UpdateOrAddExtension(good_crx, "1.0.0.1", source_path); 46475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loaded_.clear(); 4649f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver observer_2( 46505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_CRX_INSTALLER_DONE, 4651f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NotificationService::AllSources()); 4652f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->CheckForExternalUpdates(); 4653f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) observer_2.Wait(); 46545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0u, GetErrors().size()); 46555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, loaded_.size()); 46565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ("1.0.0.1", loaded_[0]->version()->GetString()); 46575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(1); 46585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidateIntegerPref(good_crx, "state", Extension::ENABLED); 46595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidateIntegerPref(good_crx, "location", location); 46605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Uninstall the extension and reload. Nothing should happen because the 46625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // preference should prevent us from reinstalling. 46635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string id = loaded_[0]->id(); 4664868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool no_uninstall = 4665f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GetManagementPolicy()->MustRemainEnabled(loaded_[0].get(), NULL); 46665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) service()->UninstallExtension(id, 46675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::UNINSTALL_REASON_FOR_TESTING, 46685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&base::DoNothing), 46695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NULL); 4670ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 46715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4672f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath install_path = extensions_install_dir().AppendASCII(id); 46732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (no_uninstall) { 46745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Policy controlled extensions should not have been touched by uninstall. 46757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(install_path)); 46765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 46775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The extension should also be gone from the install directory. 46787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_FALSE(base::PathExists(install_path)); 46795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loaded_.clear(); 4680f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->CheckForExternalUpdates(); 4681ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 46825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0u, loaded_.size()); 46835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(1); 46845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidateIntegerPref(good_crx, "state", 46855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::EXTERNAL_EXTENSION_UNINSTALLED); 46865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidateIntegerPref(good_crx, "location", location); 46875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now clear the preference and reinstall. 46895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetPrefInteg(good_crx, "state", Extension::ENABLED); 46905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loaded_.clear(); 4692f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver observer( 46935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_CRX_INSTALLER_DONE, 4694f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NotificationService::AllSources()); 4695f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->CheckForExternalUpdates(); 4696f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) observer.Wait(); 46975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, loaded_.size()); 46985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(1); 47005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidateIntegerPref(good_crx, "state", Extension::ENABLED); 47015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidateIntegerPref(good_crx, "location", location); 47025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4703f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (GetManagementPolicy()->MustRemainEnabled(loaded_[0].get(), NULL)) { 47045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, provider->visit_count()); 47055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 47065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now test an externally triggered uninstall (deleting the registry key or 47075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the pref entry). 47085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider->RemoveExtension(good_crx); 47095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loaded_.clear(); 4711f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->OnExternalProviderReady(provider); 4712ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 47135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0u, loaded_.size()); 47145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(0); 47155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The extension should also be gone from the install directory. 47177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_FALSE(base::PathExists(install_path)); 47185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now test the case where user uninstalls and then the extension is removed 47205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from the external provider. 4721f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver observer( 47225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_CRX_INSTALLER_DONE, 4723f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NotificationService::AllSources()); 47245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider->UpdateOrAddExtension(good_crx, "1.0.0.1", source_path); 4725f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->CheckForExternalUpdates(); 4726f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) observer.Wait(); 47275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, loaded_.size()); 47295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0u, GetErrors().size()); 47305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // User uninstalls. 47325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loaded_.clear(); 47335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) service()->UninstallExtension(id, 47345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::UNINSTALL_REASON_FOR_TESTING, 47355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&base::DoNothing), 47365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NULL); 4737ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 47385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0u, loaded_.size()); 47395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Then remove the extension from the extension provider. 47415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider->RemoveExtension(good_crx); 47425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should still be at 0. 47445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loaded_.clear(); 4745f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::InstalledLoader(service()).LoadAllExtensions(); 4746ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 47475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0u, loaded_.size()); 47485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(1); 47495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, provider->visit_count()); 47515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 47535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests the external installation feature 47555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 47562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ExternalInstallRegistry) { 47575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This should all work, even when normal extension installation is disabled. 47585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 4759f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->set_extensions_enabled(false); 47605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now add providers. Extension system takes ownership of the objects. 47625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockExtensionProvider* reg_provider = 4763f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new MockExtensionProvider(service(), Manifest::EXTERNAL_REGISTRY); 47645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddMockExternalProvider(reg_provider); 47652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestExternalProvider(reg_provider, Manifest::EXTERNAL_REGISTRY); 47665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 47675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 47685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ExternalInstallPref) { 47705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 47715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now add providers. Extension system takes ownership of the objects. 47735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockExtensionProvider* pref_provider = 4774f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF); 47755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddMockExternalProvider(pref_provider); 47772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestExternalProvider(pref_provider, Manifest::EXTERNAL_PREF); 47785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 47795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ExternalInstallPrefUpdateUrl) { 47815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This should all work, even when normal extension installation is disabled. 47825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 4783f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->set_extensions_enabled(false); 47845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(skerner): The mock provider is not a good model of a provider 47865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that works with update URLs, because it adds file and version info. 47875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Extend the mock to work with update URLs. This test checks the 47885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // behavior that is common to all external extension visitors. The 47895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // browser test ExtensionManagementTest.ExternalUrlUpdate tests that 47905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // what the visitor does results in an extension being downloaded and 47915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // installed. 47925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockExtensionProvider* pref_provider = 4793f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF_DOWNLOAD); 47945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddMockExternalProvider(pref_provider); 47952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestExternalProvider(pref_provider, Manifest::EXTERNAL_PREF_DOWNLOAD); 47965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 47975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ExternalInstallPolicyUpdateUrl) { 47995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This should all work, even when normal extension installation is disabled. 48005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 4801f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->set_extensions_enabled(false); 48025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(skerner): The mock provider is not a good model of a provider 48045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that works with update URLs, because it adds file and version info. 48055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Extend the mock to work with update URLs. This test checks the 48065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // behavior that is common to all external extension visitors. The 48075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // browser test ExtensionManagementTest.ExternalUrlUpdate tests that 48085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // what the visitor does results in an extension being downloaded and 48095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // installed. 48105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockExtensionProvider* pref_provider = 4811f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new MockExtensionProvider(service(), Manifest::EXTERNAL_POLICY_DOWNLOAD); 48125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddMockExternalProvider(pref_provider); 48132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestExternalProvider(pref_provider, Manifest::EXTERNAL_POLICY_DOWNLOAD); 48145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 48155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that external extensions get uninstalled when the external extension 48175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// providers can't account for them. 48182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ExternalUninstall) { 48195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start the extensions service with one external extension already installed. 4820f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath source_install_dir = 4821f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data_dir().AppendASCII("good").AppendASCII("Extensions"); 48222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath pref_path = source_install_dir 48235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .DirName() 48245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .AppendASCII("PreferencesExternal"); 48255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This initializes the extensions service with no ExternalProviders. 48275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeInstalledExtensionService(pref_path, source_install_dir); 4828f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->set_extensions_enabled(false); 48295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4830f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->Init(); 48315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0u, GetErrors().size()); 48335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0u, loaded_.size()); 48345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that it's not the disabled extensions flag causing it not to load. 4836f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->set_extensions_enabled(true); 4837f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->ReloadExtensionsForTest(); 4838ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 48395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0u, GetErrors().size()); 48415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0u, loaded_.size()); 48425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 48435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that running multiple update checks simultaneously does not 48455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// keep the update from succeeding. 48462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, MultipleExternalUpdateCheck) { 48475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 48485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockExtensionProvider* provider = 4850f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF); 48515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddMockExternalProvider(provider); 48525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that starting with no providers loads no extensions. 4854f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->Init(); 48555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0u, loaded_.size()); 48565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start two checks for updates. 48585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider->set_visit_count(0); 4859f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->CheckForExternalUpdates(); 4860f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->CheckForExternalUpdates(); 4861ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 48625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Two calls should cause two checks for external extensions. 48645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, provider->visit_count()); 48655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, GetErrors().size()); 48665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, loaded_.size()); 48675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Register a test extension externally using the mock registry provider. 4869f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath source_path = data_dir().AppendASCII("good.crx"); 48705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider->UpdateOrAddExtension(good_crx, "1.0.0.0", source_path); 48715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Two checks for external updates should find the extension, and install it 48735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // once. 4874f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver observer( 48755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_CRX_INSTALLER_DONE, 4876f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NotificationService::AllSources()); 48775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider->set_visit_count(0); 4878f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->CheckForExternalUpdates(); 4879f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->CheckForExternalUpdates(); 4880f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) observer.Wait(); 48815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, provider->visit_count()); 48825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0u, GetErrors().size()); 48835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, loaded_.size()); 48842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(Manifest::EXTERNAL_PREF, loaded_[0]->location()); 48855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ("1.0.0.0", loaded_[0]->version()->GetString()); 48865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(1); 48875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidateIntegerPref(good_crx, "state", Extension::ENABLED); 48882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateIntegerPref(good_crx, "location", Manifest::EXTERNAL_PREF); 48895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider->RemoveExtension(good_crx); 48915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider->set_visit_count(0); 4892f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->CheckForExternalUpdates(); 4893f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->CheckForExternalUpdates(); 4894ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 48955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Two calls should cause two checks for external extensions. 48975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Because the external source no longer includes good_crx, 48985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // good_crx will be uninstalled. So, expect that no extensions 48995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // are loaded. 49005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, provider->visit_count()); 49015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, GetErrors().size()); 49025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, loaded_.size()); 49035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 49045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ExternalPrefProvider) { 49065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 49075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test some valid extension records. 49095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set a base path to avoid erroring out on relative paths. 49105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Paths starting with // are absolute on every platform we support. 49112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath base_path(FILE_PATH_LITERAL("//base/path")); 49125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(base_path.IsAbsolute()); 49135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockProviderVisitor visitor(base_path); 49145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string json_data = 49155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "{" 49165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {" 49175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_crx\": \"RandomExtension.crx\"," 49185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_version\": \"1.0\"" 49195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }," 49205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\": {" 49215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_crx\": \"RandomExtension2.crx\"," 49225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_version\": \"2.0\"" 49235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }," 49245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"cccccccccccccccccccccccccccccccc\": {" 4925effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch " \"external_update_url\": \"http:\\\\foo.com/update\"," 4926effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch " \"install_parameter\": \"id\"" 49275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }" 49285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}"; 49295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, visitor.Visit(json_data)); 49305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate an external_extensions.json file that contains seven invalid 49325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // records: 49335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - One that is missing the 'external_crx' key. 49345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - One that is missing the 'external_version' key. 49355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - One that is specifying .. in the path. 49365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - One that specifies both a file and update URL. 49375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - One that specifies no file or update URL. 49385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - One that has an update URL that is not well formed. 49395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - One that contains a malformed version. 49405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - One that has an invalid id. 49415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - One that has a non-dictionary value. 49425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - One that has an integer 'external_version' instead of a string. 49435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The final extension is valid, and we check that it is read to make sure 49445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // failures don't stop valid records from being read. 49455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) json_data = 49465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "{" 49475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {" 49485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_version\": \"1.0\"" 49495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }," 49505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\": {" 49515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_crx\": \"RandomExtension.crx\"" 49525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }," 49535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"cccccccccccccccccccccccccccccccc\": {" 49545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_crx\": \"..\\\\foo\\\\RandomExtension2.crx\"," 49555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_version\": \"2.0\"" 49565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }," 49575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"dddddddddddddddddddddddddddddddd\": {" 49585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_crx\": \"RandomExtension2.crx\"," 49595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_version\": \"2.0\"," 49605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_update_url\": \"http:\\\\foo.com/update\"" 49615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }," 49625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee\": {" 49635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }," 49645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"ffffffffffffffffffffffffffffffff\": {" 49655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_update_url\": \"This string is not a valid URL\"" 49665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }," 49675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"gggggggggggggggggggggggggggggggg\": {" 49685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_crx\": \"RandomExtension3.crx\"," 49695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_version\": \"This is not a valid version!\"" 49705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }," 49715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"This is not a valid id!\": {}," 49725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh\": true," 49735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii\": {" 49745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_crx\": \"RandomExtension4.crx\"," 49755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_version\": 1.0" 49765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }," 49775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"pppppppppppppppppppppppppppppppp\": {" 49785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_crx\": \"RandomValidExtension.crx\"," 49795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_version\": \"1.0\"" 49805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }" 49815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}"; 49825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, visitor.Visit(json_data)); 49835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that if a base path is not provided, use of a relative 49855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // path fails. 49862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath empty; 49875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockProviderVisitor visitor_no_relative_paths(empty); 49885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use absolute paths. Expect success. 49905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) json_data = 49915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "{" 49925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {" 49935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_crx\": \"//RandomExtension1.crx\"," 49945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_version\": \"3.0\"" 49955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }," 49965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\": {" 49975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_crx\": \"//path/to/RandomExtension2.crx\"," 49985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_version\": \"3.0\"" 49995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }" 50005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}"; 50015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, visitor_no_relative_paths.Visit(json_data)); 50025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use a relative path. Expect that it will error out. 50045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) json_data = 50055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "{" 50065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"cccccccccccccccccccccccccccccccc\": {" 50075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_crx\": \"RandomExtension2.crx\"," 50085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_version\": \"3.0\"" 50095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }" 50105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}"; 50115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, visitor_no_relative_paths.Visit(json_data)); 50125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test supported_locales. 50145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) json_data = 50155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "{" 50165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {" 50175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_crx\": \"RandomExtension.crx\"," 50185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_version\": \"1.0\"," 50195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"supported_locales\": [ \"en\" ]" 50205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }," 50215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\": {" 50225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_crx\": \"RandomExtension2.crx\"," 50235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_version\": \"2.0\"," 50245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"supported_locales\": [ \"en-GB\" ]" 50255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }," 50265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"cccccccccccccccccccccccccccccccc\": {" 50275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_crx\": \"RandomExtension2.crx\"," 50285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_version\": \"3.0\"," 50295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"supported_locales\": [ \"en_US\", \"fr\" ]" 50305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }" 50315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}"; 50325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 50335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedBrowserLocale guard("en-US"); 50345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, visitor.Visit(json_data)); 50355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5037868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Test keep_if_present. 5038868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) json_data = 5039868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "{" 5040868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {" 5041868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) " \"external_crx\": \"RandomExtension.crx\"," 5042868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) " \"external_version\": \"1.0\"," 5043868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) " \"keep_if_present\": true" 5044868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) " }" 5045868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "}"; 5046868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) { 5047868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(0, visitor.Visit(json_data)); 5048868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 5049868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 50505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test is_bookmark_app. 50515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockProviderVisitor from_bookmark_visitor( 50525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base_path, Extension::FROM_BOOKMARK); 50535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) json_data = 50545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "{" 50555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {" 50565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_crx\": \"RandomExtension.crx\"," 50575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"external_version\": \"1.0\"," 50585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"is_bookmark_app\": true" 50595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }" 50605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}"; 50615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, from_bookmark_visitor.Visit(json_data)); 50622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 50632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test is_from_webstore. 50642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockProviderVisitor from_webstore_visitor( 50652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base_path, Extension::FROM_WEBSTORE); 50662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) json_data = 50672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "{" 50682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {" 50692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"external_crx\": \"RandomExtension.crx\"," 50702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"external_version\": \"1.0\"," 50712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"is_from_webstore\": true" 50722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " }" 50732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "}"; 50742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, from_webstore_visitor.Visit(json_data)); 5075c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 5076c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Test was_installed_by_eom. 5077c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch MockProviderVisitor was_installed_by_eom_visitor( 5078c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base_path, Extension::WAS_INSTALLED_BY_OEM); 5079c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch json_data = 5080c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "{" 5081c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {" 5082c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch " \"external_crx\": \"RandomExtension.crx\"," 5083c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch " \"external_version\": \"1.0\"," 5084c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch " \"was_installed_by_oem\": true" 5085c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch " }" 5086c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "}"; 5087c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(1, was_installed_by_eom_visitor.Visit(json_data)); 50885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 50895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test loading good extensions from the profile directory. 50912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, LoadAndRelocalizeExtensions) { 50925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure we're testing in "en" and leave global state untouched. 50935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_l10n_util::ScopedLocaleForTest testLocale("en"); 50945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialize the test dir with a good Preferences/extensions. 5096f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath source_install_dir = data_dir().AppendASCII("l10n"); 50975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath pref_path = 50985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) source_install_dir.Append(chrome::kPreferencesFilename); 50995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeInstalledExtensionService(pref_path, source_install_dir); 51005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->Init(); 51025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3u, loaded_.size()); 51045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This was equal to "sr" on load. 51065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidateStringPref(loaded_[0]->id(), keys::kCurrentLocale, "en"); 51075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These are untouched by re-localization. 51095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidateStringPref(loaded_[1]->id(), keys::kCurrentLocale, "en"); 51105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(IsPrefExist(loaded_[1]->id(), keys::kCurrentLocale)); 51115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This one starts with Serbian name, and gets re-localized into English. 51135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("My name is simple.", loaded_[0]->name()); 51145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These are untouched by re-localization. 51165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("My name is simple.", loaded_[1]->name()); 51175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("no l10n", loaded_[2]->name()); 51185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 51195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionsReadyRecorder : public content::NotificationObserver { 51215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 51225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionsReadyRecorder() : ready_(false) { 51235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) registrar_.Add(this, 51245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_EXTENSIONS_READY_DEPRECATED, 51255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 51265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 51275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_ready(bool value) { ready_ = value; } 51295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ready() { return ready_; } 51305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 51325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 51335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 51342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationDetails& details) OVERRIDE { 51355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 51365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case extensions::NOTIFICATION_EXTENSIONS_READY_DEPRECATED: 51375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ready_ = true; 51385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 51395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 51405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 51415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 51425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 51435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationRegistrar registrar_; 51455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ready_; 51465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 51475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we get enabled/disabled correctly for all the pref/command-line 51495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// combinations. We don't want to derive from the ExtensionServiceTest class 51505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for this test, so we use ExtensionServiceTestSimple. 51515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 51525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Also tests that we always fire EXTENSIONS_READY, no matter whether we are 51535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// enabled or not. 51545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionServiceTestSimple, Enabledness) { 51552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make sure the PluginService singleton is destroyed at the end of the test. 51562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ShadowingAtExitManager at_exit_manager; 5157ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(ENABLE_PLUGINS) 5158ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch content::PluginService::GetInstance()->Init(); 5159ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch content::PluginService::GetInstance()->DisablePluginsDiscoveryForTesting(); 5160ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif 51612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 51625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionErrorReporter::Init(false); // no noisy errors 51635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionsReadyRecorder recorder; 51645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TestingProfile> profile(new TestingProfile()); 5165ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch content::TestBrowserThreadBundle thread_bundle_; 5166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined OS_CHROMEOS 5167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::ScopedTestDeviceSettingsService device_settings_service; 5168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::ScopedTestCrosSettings cros_settings; 5169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<chromeos::ScopedTestUserManager> user_manager( 5170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new chromeos::ScopedTestUserManager); 5171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 51725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<CommandLine> command_line; 51732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath install_dir = profile->GetPath() 517490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) .AppendASCII(extensions::kInstallDirectoryName); 51752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 51765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // By default, we are enabled. 51775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.reset(new CommandLine(CommandLine::NO_PROGRAM)); 51785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionService* service = static_cast<extensions::TestExtensionSystem*>( 51795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionSystem::Get(profile.get()))-> 51805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateExtensionService( 51815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.get(), 51825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) install_dir, 51835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false); 51845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(service->extensions_enabled()); 51855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service->Init(); 5186ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 51875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(recorder.ready()); 5188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined OS_CHROMEOS 5189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_manager.reset(); 5190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 51915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If either the command line or pref is set, we are disabled. 51935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) recorder.set_ready(false); 51945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile.reset(new TestingProfile()); 51955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch(switches::kDisableExtensions); 51965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service = static_cast<extensions::TestExtensionSystem*>( 51975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionSystem::Get(profile.get()))-> 51985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateExtensionService( 51995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.get(), 52005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) install_dir, 52015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false); 52025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(service->extensions_enabled()); 52035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service->Init(); 5204ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 52055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(recorder.ready()); 52065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) recorder.set_ready(false); 52085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile.reset(new TestingProfile()); 52095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile->GetPrefs()->SetBoolean(prefs::kDisableExtensions, true); 52105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service = static_cast<extensions::TestExtensionSystem*>( 52115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionSystem::Get(profile.get()))-> 52125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateExtensionService( 52135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.get(), 52145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) install_dir, 52155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false); 52165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(service->extensions_enabled()); 52175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service->Init(); 5218ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 52195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(recorder.ready()); 52205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) recorder.set_ready(false); 52225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile.reset(new TestingProfile()); 52235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile->GetPrefs()->SetBoolean(prefs::kDisableExtensions, true); 52245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.reset(new CommandLine(CommandLine::NO_PROGRAM)); 52255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service = static_cast<extensions::TestExtensionSystem*>( 52265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionSystem::Get(profile.get()))-> 52275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateExtensionService( 52285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.get(), 52295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) install_dir, 52305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false); 52315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(service->extensions_enabled()); 52325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service->Init(); 5233ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 52345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(recorder.ready()); 52355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Explicitly delete all the resources used in this test. 52375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile.reset(); 52385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service = NULL; 52395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Execute any pending deletion tasks. 5240ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 52415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 52425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test loading extensions that require limited and unlimited storage quotas. 52442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, StorageQuota) { 52455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 52465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5247f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath extensions_path = data_dir().AppendASCII("storage_quota"); 52485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath limited_quota_ext = 52505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions_path.AppendASCII("limited_quota") 52515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .AppendASCII("1.0"); 52525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The old permission name for unlimited quota was "unlimited_storage", but 52545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we changed it to "unlimitedStorage". This tests both versions. 52552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath unlimited_quota_ext = 52565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions_path.AppendASCII("unlimited_quota") 52575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .AppendASCII("1.0"); 52582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath unlimited_quota_ext2 = 52595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions_path.AppendASCII("unlimited_quota") 52605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .AppendASCII("2.0"); 5261f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::UnpackedInstaller::Create(service())->Load(limited_quota_ext); 5262f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::UnpackedInstaller::Create(service())->Load(unlimited_quota_ext); 5263f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::UnpackedInstaller::Create(service())->Load(unlimited_quota_ext2); 5264ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 52655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3u, loaded_.size()); 5267f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(profile()); 5268f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(profile()->IsOffTheRecord()); 5269f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE( 5270f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited( 5271f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) loaded_[0]->url())); 5272f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited( 52735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loaded_[1]->url())); 5274f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited( 52755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loaded_[2]->url())); 52765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 52775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests ComponentLoader::Add(). 52792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ComponentExtensions) { 52805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 52815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Component extensions should work even when extensions are disabled. 5283f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->set_extensions_enabled(false); 52845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5285f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir() 5286f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("good") 5287f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("Extensions") 5288f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj") 5289f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .AppendASCII("1.0.0.0"); 52905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string manifest; 529258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(base::ReadFileToString( 52932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) path.Append(extensions::kManifestFilename), &manifest)); 52945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5295f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->component_loader()->Add(manifest, path); 5296f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->Init(); 52975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that we do not pump messages -- the extension should be loaded 52995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // immediately. 53005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, GetErrors().size()); 53025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, loaded_.size()); 53032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(Manifest::COMPONENT, loaded_[0]->location()); 5304f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 53055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Component extensions get a prefs entry on first install. 53072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidatePrefKeyCount(1); 53085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reload all extensions, and make sure it comes back. 5310f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string extension_id = (*registry()->enabled_extensions().begin())->id(); 53115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loaded_.clear(); 5312f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->ReloadExtensionsForTest(); 5313f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ(1u, registry()->enabled_extensions().size()); 5314f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(extension_id, (*registry()->enabled_extensions().begin())->id()); 53155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 53165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53177dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(ExtensionServiceTest, DeferredSyncStartupPreInstalledComponent) { 53187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch InitializeEmptyExtensionService(); 53191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) InitializeExtensionSyncService(); 53207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 53217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool flare_was_called = false; 53227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch syncer::ModelType triggered_type(syncer::UNSPECIFIED); 53237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::WeakPtrFactory<ExtensionServiceTest> factory(this); 5324f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->SetSyncStartFlare( 53257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Bind(&ExtensionServiceTest::MockSyncStartFlare, 53267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch factory.GetWeakPtr(), 53277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &flare_was_called, // Safe due to WeakPtrFactory scope. 53287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &triggered_type)); // Safe due to WeakPtrFactory scope. 53297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 53307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Install a component extension. 53317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::string manifest; 533258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(base::ReadFileToString( 533368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) good0_path().Append(extensions::kManifestFilename), &manifest)); 5334f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->component_loader()->Add(manifest, good0_path()); 5335f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_FALSE(service()->is_ready()); 5336f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->Init(); 5337f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE(service()->is_ready()); 53387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 53397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Extensions added before service is_ready() don't trigger sync startup. 53407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(flare_was_called); 53417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_EQ(syncer::UNSPECIFIED, triggered_type); 53427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 53437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 53447dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(ExtensionServiceTest, DeferredSyncStartupPreInstalledNormal) { 534568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) InitializeGoodInstalledExtensionService(); 53461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) InitializeExtensionSyncService(); 53477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 53487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool flare_was_called = false; 53497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch syncer::ModelType triggered_type(syncer::UNSPECIFIED); 53507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::WeakPtrFactory<ExtensionServiceTest> factory(this); 5351f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->SetSyncStartFlare( 53527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Bind(&ExtensionServiceTest::MockSyncStartFlare, 53537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch factory.GetWeakPtr(), 53547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &flare_was_called, // Safe due to WeakPtrFactory scope. 53557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &triggered_type)); // Safe due to WeakPtrFactory scope. 53567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5357f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_FALSE(service()->is_ready()); 5358f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->Init(); 535968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_EQ(3u, loaded_.size()); 5360f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE(service()->is_ready()); 53617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 53627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Extensions added before service is_ready() don't trigger sync startup. 53637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(flare_was_called); 53647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_EQ(syncer::UNSPECIFIED, triggered_type); 53657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 53667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 53677dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(ExtensionServiceTest, DeferredSyncStartupOnInstall) { 53687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch InitializeEmptyExtensionService(); 53691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) InitializeExtensionSyncService(); 5370f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->Init(); 5371f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE(service()->is_ready()); 53727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 53737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool flare_was_called = false; 53747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch syncer::ModelType triggered_type(syncer::UNSPECIFIED); 53757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::WeakPtrFactory<ExtensionServiceTest> factory(this); 5376f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->SetSyncStartFlare( 53777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Bind(&ExtensionServiceTest::MockSyncStartFlare, 53787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch factory.GetWeakPtr(), 53797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &flare_was_called, // Safe due to WeakPtrFactory scope. 53807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &triggered_type)); // Safe due to WeakPtrFactory scope. 53817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5382f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("good.crx"); 53837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch InstallCRX(path, INSTALL_NEW); 53847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 53857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(flare_was_called); 53867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(syncer::EXTENSIONS, triggered_type); 53877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 53887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Reset. 53897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch flare_was_called = false; 53907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch triggered_type = syncer::UNSPECIFIED; 53917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 53927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Once sync starts, flare should no longer be invoked. 5393f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->MergeDataAndStartSyncing( 5394a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::EXTENSIONS, 5395a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::SyncDataList(), 5396a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncChangeProcessor>( 5397a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::FakeSyncChangeProcessor), 53987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 5399f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path = data_dir().AppendASCII("page_action.crx"); 54007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch InstallCRX(path, INSTALL_NEW); 54017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(flare_was_called); 54027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_EQ(syncer::UNSPECIFIED, triggered_type); 54037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 54047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5405f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(ExtensionServiceTest, DisableExtensionFromSync) { 5406f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Start the extensions service with one external extension already installed. 5407f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath source_install_dir = 5408f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data_dir().AppendASCII("good").AppendASCII("Extensions"); 54095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath pref_path = 54105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) source_install_dir.DirName().Append(chrome::kPreferencesFilename); 5411f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5412f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) InitializeInstalledExtensionService(pref_path, source_install_dir); 5413f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) InitializeExtensionSyncService(); 5414f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5415f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The user has enabled sync. 5416f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ProfileSyncService* sync_service = 5417f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ProfileSyncServiceFactory::GetForProfile(profile()); 5418f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) sync_service->SetSyncSetupCompleted(); 5419f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5420f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->Init(); 5421f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE(service()->is_ready()); 5422f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5423f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_EQ(3u, loaded_.size()); 5424f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5425f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // We start enabled. 5426f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const Extension* extension = service()->GetExtensionById(good0, true); 5427f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_TRUE(extension); 5428f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE(service()->IsExtensionEnabled(good0)); 5429cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) extensions::ExtensionSyncData disable_good_crx( 5430cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) *extension, false, false, false); 5431f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5432f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Then sync data arrives telling us to disable |good0|. 5433f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::SyncDataList sync_data; 5434f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) sync_data.push_back(disable_good_crx.GetSyncData()); 5435f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->MergeDataAndStartSyncing( 5436a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::EXTENSIONS, 5437a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sync_data, 5438a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncChangeProcessor>( 5439a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::FakeSyncChangeProcessor), 5440f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 5441f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_FALSE(service()->IsExtensionEnabled(good0)); 5442f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 5443f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5444f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(ExtensionServiceTest, DontDisableExtensionWithPendingEnableFromSync) { 5445f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Start the extensions service with one external extension already installed. 5446f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath source_install_dir = 5447f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data_dir().AppendASCII("good").AppendASCII("Extensions"); 54485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath pref_path = 54495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) source_install_dir.DirName().Append(chrome::kPreferencesFilename); 5450f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5451f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) InitializeInstalledExtensionService(pref_path, source_install_dir); 5452f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) InitializeExtensionSyncService(); 5453f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5454f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The user has enabled sync. 5455f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ProfileSyncService* sync_service = 5456f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ProfileSyncServiceFactory::GetForProfile(profile()); 5457f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) sync_service->SetSyncSetupCompleted(); 5458f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5459f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->Init(); 5460f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE(service()->is_ready()); 5461f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_EQ(3u, loaded_.size()); 5462f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5463f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const Extension* extension = service()->GetExtensionById(good0, true); 5464f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE(service()->IsExtensionEnabled(good0)); 5465f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5466f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Disable extension before first sync data arrives. 5467f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->DisableExtension(good0, Extension::DISABLE_USER_ACTION); 5468f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_FALSE(service()->IsExtensionEnabled(good0)); 5469f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5470f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Enable extension - this is now the most recent state. 5471f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->EnableExtension(good0); 5472f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE(service()->IsExtensionEnabled(good0)); 5473f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5474f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Now sync data comes in that says to disable good0. This should be 5475f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // ignored. 5476cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) extensions::ExtensionSyncData disable_good_crx( 5477cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) *extension, false, false, false); 5478f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::SyncDataList sync_data; 5479f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) sync_data.push_back(disable_good_crx.GetSyncData()); 5480f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->MergeDataAndStartSyncing( 5481a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::EXTENSIONS, 5482a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sync_data, 5483a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncChangeProcessor>( 5484a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::FakeSyncChangeProcessor), 5485f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 5486f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5487f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The extension was enabled locally before the sync data arrived, so it 5488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // should still be enabled now. 5489f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE(service()->IsExtensionEnabled(good0)); 5490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 5491f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 54922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, GetSyncData) { 54935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 54941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) InitializeExtensionSyncService(); 5495f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 5496f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const Extension* extension = service()->GetInstalledExtension(good_crx); 54975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension); 54985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5499f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->MergeDataAndStartSyncing( 5500a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::EXTENSIONS, 5501a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::SyncDataList(), 5502a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncChangeProcessor>( 5503a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::FakeSyncChangeProcessor), 55045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 55055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5506f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) syncer::SyncDataList list = 5507f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); 55085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(list.size(), 1U); 55095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionSyncData data(list[0]); 55105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(extension->id(), data.id()); 55115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(data.uninstalled()); 5512f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(service()->IsExtensionEnabled(good_crx), data.enabled()); 5513f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(extensions::util::IsIncognitoEnabled(good_crx, profile()), 55148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) data.incognito_enabled()); 55155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(data.version().Equals(*extension->version())); 55162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(extensions::ManifestURL::GetUpdateURL(extension), 55172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data.update_url()); 55185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(extension->name(), data.name()); 55195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 55205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, GetSyncDataTerminated) { 55225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 55231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) InitializeExtensionSyncService(); 5524f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 55255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TerminateExtension(good_crx); 5526f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const Extension* extension = service()->GetInstalledExtension(good_crx); 55275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension); 55285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5529a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::FakeSyncChangeProcessor processor; 5530f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->MergeDataAndStartSyncing( 5531a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::EXTENSIONS, 5532a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::SyncDataList(), 5533a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncChangeProcessor>( 5534a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::FakeSyncChangeProcessor), 55355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 55365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5537f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) syncer::SyncDataList list = 5538f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); 55395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(list.size(), 1U); 55405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionSyncData data(list[0]); 55415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(extension->id(), data.id()); 55425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(data.uninstalled()); 5543f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(service()->IsExtensionEnabled(good_crx), data.enabled()); 5544f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(extensions::util::IsIncognitoEnabled(good_crx, profile()), 55458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) data.incognito_enabled()); 55465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(data.version().Equals(*extension->version())); 55472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(extensions::ManifestURL::GetUpdateURL(extension), 55482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data.update_url()); 55495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(extension->name(), data.name()); 55505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 55515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, GetSyncDataFilter) { 55535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 55541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) InitializeExtensionSyncService(); 5555f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 5556f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const Extension* extension = service()->GetInstalledExtension(good_crx); 55575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension); 55585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5559a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::FakeSyncChangeProcessor processor; 5560f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->MergeDataAndStartSyncing( 5561a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::APPS, 55621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) syncer::SyncDataList(), 5563a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncChangeProcessor>( 5564a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::FakeSyncChangeProcessor), 55655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 55665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5567f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) syncer::SyncDataList list = 5568f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); 55695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(list.size(), 0U); 55705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 55715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, GetSyncExtensionDataUserSettings) { 55735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 5574f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) InitializeProcessManager(); 55751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) InitializeExtensionSyncService(); 5576f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 5577f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const Extension* extension = service()->GetInstalledExtension(good_crx); 55785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension); 55795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5580a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::FakeSyncChangeProcessor processor; 5581f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->MergeDataAndStartSyncing( 5582a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::EXTENSIONS, 5583a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::SyncDataList(), 5584a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncChangeProcessor>( 5585a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::FakeSyncChangeProcessor), 55865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 55875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5589f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) syncer::SyncDataList list = 5590f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); 55915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(list.size(), 1U); 55925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionSyncData data(list[0]); 5593f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(data.enabled()); 5594f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(data.incognito_enabled()); 5595f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 5596f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5597f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->DisableExtension(good_crx, Extension::DISABLE_USER_ACTION); 5598f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) { 5599f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) syncer::SyncDataList list = 5600f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); 5601f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_EQ(list.size(), 1U); 5602f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) extensions::ExtensionSyncData data(list[0]); 5603f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(data.enabled()); 56045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(data.incognito_enabled()); 56055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5607f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::util::SetIsIncognitoEnabled(good_crx, profile(), true); 56085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5609f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) syncer::SyncDataList list = 5610f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); 56115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(list.size(), 1U); 56125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionSyncData data(list[0]); 5613f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(data.enabled()); 5614f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(data.incognito_enabled()); 5615f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 5616f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5617f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->EnableExtension(good_crx); 5618f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) { 5619f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) syncer::SyncDataList list = 5620f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); 5621f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_EQ(list.size(), 1U); 5622f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) extensions::ExtensionSyncData data(list[0]); 5623f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(data.enabled()); 56245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(data.incognito_enabled()); 56255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 56275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, SyncForUninstalledExternalExtension) { 56295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 56301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) InitializeExtensionSyncService(); 5631f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) InstallCRXWithLocation( 5632f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data_dir().AppendASCII("good.crx"), Manifest::EXTERNAL_PREF, INSTALL_NEW); 5633f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const Extension* extension = service()->GetInstalledExtension(good_crx); 56345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension); 56355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5636a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::FakeSyncChangeProcessor processor; 5637f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->MergeDataAndStartSyncing( 5638a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::EXTENSIONS, 5639a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::SyncDataList(), 5640a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncChangeProcessor>( 5641a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::FakeSyncChangeProcessor), 56425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 56435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UninstallExtension(good_crx, false); 5645f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE( 5646f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ExtensionPrefs::Get(profile())->IsExternalExtensionUninstalled(good_crx)); 56475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::EntitySpecifics specifics; 56495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::AppSpecifics* app_specifics = specifics.mutable_app(); 56505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::ExtensionSpecifics* extension_specifics = 56515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_specifics->mutable_extension(); 56525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_specifics->set_id(good_crx); 56535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_specifics->set_version("1.0"); 5654f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) extension_specifics->set_enabled(true); 56555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncData sync_data = 56575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); 56585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChange sync_change(FROM_HERE, 56595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChange::ACTION_UPDATE, 56605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_data); 56615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChangeList list(1); 56625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list[0] = sync_change; 56635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5664f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); 5665f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE( 5666f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ExtensionPrefs::Get(profile())->IsExternalExtensionUninstalled(good_crx)); 56675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 56685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, GetSyncAppDataUserSettings) { 56705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 56711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) InitializeExtensionSyncService(); 56725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* app = 5673f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PackAndInstallCRX(data_dir().AppendASCII("app"), INSTALL_NEW); 56745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(app); 56755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(app->is_app()); 56765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5677a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::FakeSyncChangeProcessor processor; 5678f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->MergeDataAndStartSyncing( 5679a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::APPS, 56801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) syncer::SyncDataList(), 5681a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncChangeProcessor>( 5682a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::FakeSyncChangeProcessor), 56835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 56845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::StringOrdinal initial_ordinal = 56865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::StringOrdinal::CreateInitialOrdinal(); 56875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5688f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) syncer::SyncDataList list = 5689f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->GetAllSyncData(syncer::APPS); 56905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(list.size(), 1U); 56915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::AppSyncData app_sync_data(list[0]); 56935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(initial_ordinal.Equals(app_sync_data.app_launch_ordinal())); 56945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(initial_ordinal.Equals(app_sync_data.page_ordinal())); 56955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5697f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) AppSorting* sorting = ExtensionPrefs::Get(profile())->app_sorting(); 56985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sorting->SetAppLaunchOrdinal(app->id(), initial_ordinal.CreateAfter()); 56995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5700f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) syncer::SyncDataList list = 5701f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->GetAllSyncData(syncer::APPS); 57025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(list.size(), 1U); 57035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::AppSyncData app_sync_data(list[0]); 57055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(initial_ordinal.LessThan(app_sync_data.app_launch_ordinal())); 57065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(initial_ordinal.Equals(app_sync_data.page_ordinal())); 57075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sorting->SetPageOrdinal(app->id(), initial_ordinal.CreateAfter()); 57105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5711f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) syncer::SyncDataList list = 5712f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->GetAllSyncData(syncer::APPS); 57135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(list.size(), 1U); 57145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::AppSyncData app_sync_data(list[0]); 57165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(initial_ordinal.LessThan(app_sync_data.app_launch_ordinal())); 57175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(initial_ordinal.LessThan(app_sync_data.page_ordinal())); 57185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 57205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 572123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// TODO (rdevlin.cronin): The OnExtensionMoved() method has been removed from 572223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// ExtensionService, so this test probably needs a new home. Unfortunately, it 572323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// relies pretty heavily on things like InitializeExtension[Sync]Service() and 572423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// PackAndInstallCRX(). When we clean up a bit more, this should move out. 57252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, GetSyncAppDataUserSettingsOnExtensionMoved) { 57265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 57271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) InitializeExtensionSyncService(); 57285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t kAppCount = 3; 57295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* apps[kAppCount]; 5730f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) apps[0] = PackAndInstallCRX(data_dir().AppendASCII("app1"), INSTALL_NEW); 5731f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) apps[1] = PackAndInstallCRX(data_dir().AppendASCII("app2"), INSTALL_NEW); 5732f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) apps[2] = PackAndInstallCRX(data_dir().AppendASCII("app4"), INSTALL_NEW); 57335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < kAppCount; ++i) { 57345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(apps[i]); 57355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(apps[i]->is_app()); 57365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5738a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::FakeSyncChangeProcessor processor; 5739f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->MergeDataAndStartSyncing( 5740a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::APPS, 57411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) syncer::SyncDataList(), 5742a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncChangeProcessor>( 5743a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::FakeSyncChangeProcessor), 57445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 57455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5746f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ExtensionPrefs::Get(service()->GetBrowserContext()) 574723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ->app_sorting() 574823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ->OnExtensionMoved(apps[0]->id(), apps[1]->id(), apps[2]->id()); 57495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5750f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) syncer::SyncDataList list = 5751f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->GetAllSyncData(syncer::APPS); 57525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(list.size(), 3U); 57535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::AppSyncData data[kAppCount]; 57555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < kAppCount; ++i) { 57565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data[i] = extensions::AppSyncData(list[i]); 57575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The sync data is not always in the same order our apps were installed in, 57605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so we do that sorting here so we can make sure the values are changed as 57615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expected. 57625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::StringOrdinal app_launch_ordinals[kAppCount]; 57635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < kAppCount; ++i) { 57645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t j = 0; j < kAppCount; ++j) { 57655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (apps[i]->id() == data[j].id()) 57665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_launch_ordinals[i] = data[j].app_launch_ordinal(); 57675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(app_launch_ordinals[1].LessThan(app_launch_ordinals[0])); 57715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(app_launch_ordinals[0].LessThan(app_launch_ordinals[2])); 57725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 57745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, GetSyncDataList) { 57765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 57771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) InitializeExtensionSyncService(); 5778f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 5779f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) InstallCRX(data_dir().AppendASCII("page_action.crx"), INSTALL_NEW); 5780f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) InstallCRX(data_dir().AppendASCII("theme.crx"), INSTALL_NEW); 5781f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) InstallCRX(data_dir().AppendASCII("theme2.crx"), INSTALL_NEW); 57825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5783a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::FakeSyncChangeProcessor processor; 5784f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->MergeDataAndStartSyncing( 5785a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::APPS, 5786a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::SyncDataList(), 5787a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncChangeProcessor>( 5788a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::FakeSyncChangeProcessor), 57895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 5790f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->MergeDataAndStartSyncing( 5791a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::EXTENSIONS, 5792a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::SyncDataList(), 5793a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncChangeProcessor>( 5794a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::FakeSyncChangeProcessor), 57955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 57965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5797f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->DisableExtension(page_action, Extension::DISABLE_USER_ACTION); 57985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TerminateExtension(theme2_crx); 57995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5800f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, extension_sync_service()->GetAllSyncData(syncer::APPS).size()); 5801f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ( 5802f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 2u, extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS).size()); 58035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 58045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ProcessSyncDataUninstall) { 58065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 58071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) InitializeExtensionSyncService(); 5808a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::FakeSyncChangeProcessor processor; 5809f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->MergeDataAndStartSyncing( 5810a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::EXTENSIONS, 5811a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::SyncDataList(), 5812a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncChangeProcessor>( 5813a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::FakeSyncChangeProcessor), 58145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 58155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::EntitySpecifics specifics; 58175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); 58185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext_specifics->set_id(good_crx); 58195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext_specifics->set_version("1.0"); 58205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncData sync_data = 58215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); 58225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChange sync_change(FROM_HERE, 58235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChange::ACTION_DELETE, 58245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_data); 58255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChangeList list(1); 58265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list[0] = sync_change; 58275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should do nothing. 5829f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); 5830f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->GetExtensionById(good_crx, true)); 58315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Install the extension. 5833f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath extension_path = data_dir().AppendASCII("good.crx"); 58345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallCRX(extension_path, INSTALL_NEW); 5835f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->GetExtensionById(good_crx, true)); 58365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should uninstall the extension. 5838f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); 5839f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->GetExtensionById(good_crx, true)); 58405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should again do nothing. 5842f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); 5843f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->GetExtensionById(good_crx, true)); 58445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 58455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ProcessSyncDataWrongType) { 58475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 58481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) InitializeExtensionSyncService(); 58495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Install the extension. 5851f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath extension_path = data_dir().AppendASCII("good.crx"); 58525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallCRX(extension_path, INSTALL_NEW); 5853f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->GetExtensionById(good_crx, true)); 58545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::EntitySpecifics specifics; 58565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::AppSpecifics* app_specifics = specifics.mutable_app(); 58575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::ExtensionSpecifics* extension_specifics = 58585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_specifics->mutable_extension(); 58595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_specifics->set_id(good_crx); 58605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_specifics->set_version( 5861f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->GetInstalledExtension(good_crx)->version()->GetString()); 58625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5864f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) extension_specifics->set_enabled(true); 58655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncData sync_data = 58665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); 58675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChange sync_change(FROM_HERE, 58685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChange::ACTION_DELETE, 58695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_data); 58705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChangeList list(1); 58715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list[0] = sync_change; 58725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should do nothing 5874f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); 5875f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->GetExtensionById(good_crx, true)); 58765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5879f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) extension_specifics->set_enabled(false); 58805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncData sync_data = 58815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); 58825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChange sync_change(FROM_HERE, 58835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChange::ACTION_UPDATE, 58845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_data); 58855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChangeList list(1); 58865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list[0] = sync_change; 58875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should again do nothing. 5889f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); 5890f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->GetExtensionById(good_crx, false)); 58915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 58935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ProcessSyncDataSettings) { 58955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 5896f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) InitializeProcessManager(); 58971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) InitializeExtensionSyncService(); 5898a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::FakeSyncChangeProcessor processor; 5899f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->MergeDataAndStartSyncing( 5900a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::EXTENSIONS, 5901a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::SyncDataList(), 5902a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncChangeProcessor>( 5903a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::FakeSyncChangeProcessor), 59045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 59055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5906f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 5907f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->IsExtensionEnabled(good_crx)); 5908f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(extensions::util::IsIncognitoEnabled(good_crx, profile())); 59095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::EntitySpecifics specifics; 59115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); 59125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext_specifics->set_id(good_crx); 59135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext_specifics->set_version( 5914f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->GetInstalledExtension(good_crx)->version()->GetString()); 5915f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ext_specifics->set_enabled(false); 59165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 59185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncData sync_data = 59195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); 59205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChange sync_change(FROM_HERE, 59215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChange::ACTION_UPDATE, 59225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_data); 59235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChangeList list(1); 59245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list[0] = sync_change; 5925f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); 5926f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->IsExtensionEnabled(good_crx)); 5927f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(extensions::util::IsIncognitoEnabled(good_crx, profile())); 59285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 59295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5931f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ext_specifics->set_enabled(true); 59325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext_specifics->set_incognito_enabled(true); 59335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncData sync_data = 59345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); 59355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChange sync_change(FROM_HERE, 59365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChange::ACTION_UPDATE, 59375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_data); 59385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChangeList list(1); 59395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list[0] = sync_change; 5940f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); 5941f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->IsExtensionEnabled(good_crx)); 5942f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(extensions::util::IsIncognitoEnabled(good_crx, profile())); 59435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 59445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5945f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) { 5946f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ext_specifics->set_enabled(false); 5947f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ext_specifics->set_incognito_enabled(true); 5948f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::SyncData sync_data = 5949f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); 5950f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::SyncChange sync_change(FROM_HERE, 5951f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::SyncChange::ACTION_UPDATE, 5952f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) sync_data); 5953f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::SyncChangeList list(1); 5954f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) list[0] = sync_change; 5955f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); 5956f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->IsExtensionEnabled(good_crx)); 5957f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(extensions::util::IsIncognitoEnabled(good_crx, profile())); 5958f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 5959f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5960f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(good_crx)); 59615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 59625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ProcessSyncDataTerminatedExtension) { 59645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeExtensionServiceWithUpdater(); 59651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) InitializeExtensionSyncService(); 5966a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::FakeSyncChangeProcessor processor; 5967f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->MergeDataAndStartSyncing( 5968a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::EXTENSIONS, 5969a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::SyncDataList(), 5970a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncChangeProcessor>( 5971a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::FakeSyncChangeProcessor), 59725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 59735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5974f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 59755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TerminateExtension(good_crx); 5976f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->IsExtensionEnabled(good_crx)); 5977f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(extensions::util::IsIncognitoEnabled(good_crx, profile())); 59785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::EntitySpecifics specifics; 59805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); 59815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext_specifics->set_id(good_crx); 59825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext_specifics->set_version( 5983f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->GetInstalledExtension(good_crx)->version()->GetString()); 5984f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ext_specifics->set_enabled(false); 59855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext_specifics->set_incognito_enabled(true); 59865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncData sync_data = 59875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); 59885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChange sync_change(FROM_HERE, 59895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChange::ACTION_UPDATE, 59905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_data); 59915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChangeList list(1); 59925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list[0] = sync_change; 59935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5994f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); 5995f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->IsExtensionEnabled(good_crx)); 5996f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(extensions::util::IsIncognitoEnabled(good_crx, profile())); 59975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5998f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(good_crx)); 59995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 60005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ProcessSyncDataVersionCheck) { 60025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeExtensionServiceWithUpdater(); 60031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) InitializeExtensionSyncService(); 6004a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::FakeSyncChangeProcessor processor; 6005f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->MergeDataAndStartSyncing( 6006a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::EXTENSIONS, 6007a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::SyncDataList(), 6008a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncChangeProcessor>( 6009a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::FakeSyncChangeProcessor), 60105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 60115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6012f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 6013f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->IsExtensionEnabled(good_crx)); 6014f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(extensions::util::IsIncognitoEnabled(good_crx, profile())); 60155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::EntitySpecifics specifics; 60175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); 60185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext_specifics->set_id(good_crx); 6019f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ext_specifics->set_enabled(true); 60205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 60225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext_specifics->set_version( 6023f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->GetInstalledExtension(good_crx)->version()->GetString()); 60245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncData sync_data = 60255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); 60265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChange sync_change(FROM_HERE, 60275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChange::ACTION_UPDATE, 60285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_data); 60295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChangeList list(1); 60305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list[0] = sync_change; 60315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should do nothing if extension version == sync version. 6033f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); 6034f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->updater()->WillCheckSoon()); 60355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 60365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should do nothing if extension version > sync version (but see 60385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the TODO in ProcessExtensionSyncData). 60395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 60405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext_specifics->set_version("0.0.0.0"); 60415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncData sync_data = 60425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); 60435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChange sync_change(FROM_HERE, 60445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChange::ACTION_UPDATE, 60455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_data); 60465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChangeList list(1); 60475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list[0] = sync_change; 60485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6049f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); 6050f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->updater()->WillCheckSoon()); 60515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 60525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should kick off an update if extension version < sync version. 60545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 60555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext_specifics->set_version("9.9.9.9"); 60565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncData sync_data = 60575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); 60585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChange sync_change(FROM_HERE, 60595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChange::ACTION_UPDATE, 60605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_data); 60615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChangeList list(1); 60625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list[0] = sync_change; 60635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6064f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); 6065f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->updater()->WillCheckSoon()); 60665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 60675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6068f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(good_crx)); 60695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 60705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ProcessSyncDataNotInstalled) { 60725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeExtensionServiceWithUpdater(); 60731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) InitializeExtensionSyncService(); 6074a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::FakeSyncChangeProcessor processor; 6075f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->MergeDataAndStartSyncing( 6076a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::EXTENSIONS, 6077a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) syncer::SyncDataList(), 6078a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::SyncChangeProcessor>( 6079a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::FakeSyncChangeProcessor), 60805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 60815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::EntitySpecifics specifics; 60835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); 60845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext_specifics->set_id(good_crx); 6085f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ext_specifics->set_enabled(false); 60865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext_specifics->set_incognito_enabled(true); 60875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext_specifics->set_update_url("http://www.google.com/"); 60885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext_specifics->set_version("1.2.3.4"); 60895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncData sync_data = 60905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); 60915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChange sync_change(FROM_HERE, 60925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChange::ACTION_UPDATE, 60935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_data); 60945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::SyncChangeList list(1); 60955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list[0] = sync_change; 60965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6097f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->IsExtensionEnabled(good_crx)); 6098f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(extensions::util::IsIncognitoEnabled(good_crx, profile())); 6099f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); 6100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->updater()->WillCheckSoon()); 6101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->IsExtensionEnabled(good_crx)); 6102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(extensions::util::IsIncognitoEnabled(good_crx, profile())); 61035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::PendingExtensionInfo* info; 6105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE( 6106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) (info = service()->pending_extension_manager()->GetById(good_crx))); 61075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ext_specifics->update_url(), info->update_url().spec()); 61085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(info->is_from_sync()); 61095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(info->install_silently()); 61102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(Manifest::INTERNAL, info->install_source()); 61115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(akalin): Figure out a way to test |info.ShouldAllowInstall()|. 61125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 61135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ExtensionServiceTest, SupervisedUser_InstallOnlyAllowedByCustodian) { 61155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ExtensionServiceInitParams params = CreateDefaultInitParams(); 61165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) params.profile_is_supervised = true; 61175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) InitializeExtensionService(params); 61185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 61195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SupervisedUserService* supervised_user_service = 61205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SupervisedUserServiceFactory::GetForProfile(profile()); 61215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetManagementPolicy()->RegisterProvider(supervised_user_service); 61225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 61235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath path1 = data_dir().AppendASCII("good.crx"); 61245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath path2 = data_dir().AppendASCII("good2048.crx"); 61255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const Extension* extensions[] = { 61265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) InstallCRX(path1, INSTALL_FAILED), 61275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) InstallCRX(path2, INSTALL_NEW, Extension::WAS_INSTALLED_BY_CUSTODIAN) 61285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) }; 61295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 61305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Only the extension with the "installed by custodian" flag should have been 61315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // installed and enabled. 61325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(extensions[0]); 61335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(extensions[1]); 61345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(registry()->enabled_extensions().Contains(extensions[1]->id())); 61355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 61365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 61375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ExtensionServiceTest, SupervisedUser_UpdateWithoutPermissionIncrease) { 61385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ExtensionServiceInitParams params = CreateDefaultInitParams(); 61395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) params.profile_is_supervised = true; 61405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) InitializeExtensionService(params); 61415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 61425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SupervisedUserService* supervised_user_service = 61435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SupervisedUserServiceFactory::GetForProfile(profile()); 61445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetManagementPolicy()->RegisterProvider(supervised_user_service); 61455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 61465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath base_path = data_dir().AppendASCII("autoupdate"); 61475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath pem_path = base_path.AppendASCII("key.pem"); 61485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 61495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath path = base_path.AppendASCII("v1"); 61505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const Extension* extension = 61515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PackAndInstallCRX(path, pem_path, INSTALL_NEW, 61525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Extension::WAS_INSTALLED_BY_CUSTODIAN); 61535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // The extension must now be installed and enabled. 61545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(extension); 61555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(registry()->enabled_extensions().Contains(extension->id())); 61565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 61575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Save the id, as the extension object will be destroyed during updating. 61585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string id = extension->id(); 61595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 61605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string old_version = extension->VersionString(); 61615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 61625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Update to a new version. 61635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) path = base_path.AppendASCII("v2"); 61645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PackCRXAndUpdateExtension(id, path, pem_path, ENABLED); 61655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 61665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // The extension should still be there and enabled. 61675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extension = registry()->enabled_extensions().GetByID(id); 61685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(extension); 61695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // The version should have changed. 61705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_NE(extension->VersionString(), old_version); 61715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 61725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 61735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ExtensionServiceTest, SupervisedUser_UpdateWithPermissionIncrease) { 61745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ExtensionServiceInitParams params = CreateDefaultInitParams(); 61755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) params.profile_is_supervised = true; 61765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) InitializeExtensionService(params); 61775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 61785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SupervisedUserService* supervised_user_service = 61795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SupervisedUserServiceFactory::GetForProfile(profile()); 61805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetManagementPolicy()->RegisterProvider(supervised_user_service); 61815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 61825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath base_path = data_dir().AppendASCII("permissions_increase"); 61835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath pem_path = base_path.AppendASCII("permissions.pem"); 61845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 61855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath path = base_path.AppendASCII("v1"); 61865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const Extension* extension = 61875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PackAndInstallCRX(path, pem_path, INSTALL_NEW, 61885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Extension::WAS_INSTALLED_BY_CUSTODIAN); 61895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // The extension must now be installed and enabled. 61905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(extension); 61915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(registry()->enabled_extensions().Contains(extension->id())); 61925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 61935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Save the id, as the extension object will be destroyed during updating. 61945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string id = extension->id(); 61955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 61965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string old_version = extension->VersionString(); 61975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 61985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Update to a new version with increased permissions. 61995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) path = base_path.AppendASCII("v2"); 62005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PackCRXAndUpdateExtension(id, path, pem_path, DISABLED); 62015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 62025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // The extension should still be there, but disabled. 62035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(registry()->enabled_extensions().Contains(id)); 62045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extension = registry()->disabled_extensions().GetByID(id); 62055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(extension); 62065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // The version should have changed. 62075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_NE(extension->VersionString(), old_version); 62085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 62095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 62105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ExtensionServiceTest, 62115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SupervisedUser_SyncUninstallByCustodianSkipsPolicy) { 62125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) InitializeEmptyExtensionService(); 62135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) InitializeExtensionSyncService(); 62145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extension_sync_service()->MergeDataAndStartSyncing( 62155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) syncer::EXTENSIONS, 62165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) syncer::SyncDataList(), 62175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<syncer::SyncChangeProcessor>( 62185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new syncer::FakeSyncChangeProcessor), 62195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 62205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 62215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Install two extensions. 62225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath path1 = data_dir().AppendASCII("good.crx"); 62235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath path2 = data_dir().AppendASCII("good2048.crx"); 62245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const Extension* extensions[] = { 62255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) InstallCRX(path1, INSTALL_NEW), 62265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) InstallCRX(path2, INSTALL_NEW, Extension::WAS_INSTALLED_BY_CUSTODIAN) 62275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) }; 62285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 62295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Add a policy provider that will disallow any changes. 62305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::TestManagementPolicyProvider provider( 62315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::TestManagementPolicyProvider::PROHIBIT_MODIFY_STATUS); 62325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetManagementPolicy()->RegisterProvider(&provider); 62335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 62345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Create a sync deletion for each extension. 62355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) syncer::SyncChangeList change_list; 62365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for (size_t i = 0; i < arraysize(extensions); i++) { 62375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string& id = extensions[i]->id(); 62385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_pb::EntitySpecifics specifics; 62395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); 62405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ext_specifics->set_id(id); 62415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ext_specifics->set_version("1.0"); 62425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ext_specifics->set_installed_by_custodian( 62435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions[i]->was_installed_by_custodian()); 62445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) syncer::SyncData sync_data = 62455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) syncer::SyncData::CreateLocalData(id, "Name", specifics); 62465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) change_list.push_back(syncer::SyncChange(FROM_HERE, 62475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) syncer::SyncChange::ACTION_DELETE, 62485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_data)); 62495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 62505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 62515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Save the extension ids, as uninstalling destroys the Extension instance. 62525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string extension_ids[] = { 62535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions[0]->id(), 62545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions[1]->id() 62555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) }; 62565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 62575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Now apply the uninstallations. 62585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extension_sync_service()->ProcessSyncChanges(FROM_HERE, change_list); 62595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 62605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Uninstalling the extension without installed_by_custodian should have been 62615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // blocked by policy, so it should still be there. 62625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(registry()->enabled_extensions().Contains(extension_ids[0])); 62635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 62645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // But installed_by_custodian should result in bypassing the policy check. 62655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE( 62665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) registry()->GenerateInstalledExtensionsSet()->Contains(extension_ids[1])); 62675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 62685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 62692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, InstallPriorityExternalUpdateUrl) { 62705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 62715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6272f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("good.crx"); 62735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallCRX(path, INSTALL_NEW); 62745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(1u); 62755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidateIntegerPref(good_crx, "state", Extension::ENABLED); 62762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateIntegerPref(good_crx, "location", Manifest::INTERNAL); 62775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::PendingExtensionManager* pending = 6279f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->pending_extension_manager(); 62805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pending->IsIdPending(kGoodId)); 62815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Skip install when the location is the same. 6283f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE( 6284f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->OnExternalExtensionUpdateUrlFound(kGoodId, 6285f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string(), 6286f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GURL(kGoodUpdateURL), 6287f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Manifest::INTERNAL, 6288f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Extension::NO_FLAGS, 6289f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) false)); 62905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pending->IsIdPending(kGoodId)); 62915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Install when the location has higher priority. 6293f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->OnExternalExtensionUpdateUrlFound( 6294effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch kGoodId, 6295effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::string(), 6296effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch GURL(kGoodUpdateURL), 6297effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Manifest::EXTERNAL_POLICY_DOWNLOAD, 6298effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Extension::NO_FLAGS, 6299effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch false)); 63005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pending->IsIdPending(kGoodId)); 63015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try the low priority again. Should be rejected. 6303f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->OnExternalExtensionUpdateUrlFound( 6304effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch kGoodId, 6305effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::string(), 6306effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch GURL(kGoodUpdateURL), 6307effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Manifest::EXTERNAL_PREF_DOWNLOAD, 6308effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Extension::NO_FLAGS, 6309effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch false)); 63105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The existing record should still be present in the pending extension 63115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // manager. 63125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pending->IsIdPending(kGoodId)); 63135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending->Remove(kGoodId); 63155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Skip install when the location has the same priority as the installed 63175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // location. 6318f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE( 6319f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->OnExternalExtensionUpdateUrlFound(kGoodId, 6320f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string(), 6321f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GURL(kGoodUpdateURL), 6322f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Manifest::INTERNAL, 6323f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Extension::NO_FLAGS, 6324f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) false)); 63255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pending->IsIdPending(kGoodId)); 63275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 63285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, InstallPriorityExternalLocalFile) { 63305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Version older_version("0.1.0.0"); 63315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Version newer_version("2.0.0.0"); 63325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't want the extension to be installed. A path that doesn't 63345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // point to a valid CRX ensures this. 63352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath kInvalidPathToCrx = base::FilePath(); 63365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kCreationFlags = 0; 63385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool kDontMarkAcknowledged = false; 63395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 63415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The test below uses install source constants to test that 63435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // priority is enforced. It assumes a specific ranking of install 63445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sources: Registry (EXTERNAL_REGISTRY) overrides external pref 63455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (EXTERNAL_PREF), and external pref overrides user install (INTERNAL). 63465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The following assertions verify these assumptions: 63472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(Manifest::EXTERNAL_REGISTRY, 63482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::GetHigherPriorityLocation(Manifest::EXTERNAL_REGISTRY, 63492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::EXTERNAL_PREF)); 63502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(Manifest::EXTERNAL_REGISTRY, 63512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::GetHigherPriorityLocation(Manifest::EXTERNAL_REGISTRY, 63522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::INTERNAL)); 63532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(Manifest::EXTERNAL_PREF, 63542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::GetHigherPriorityLocation(Manifest::EXTERNAL_PREF, 63552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::INTERNAL)); 63565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::PendingExtensionManager* pending = 6358f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->pending_extension_manager(); 63595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pending->IsIdPending(kGoodId)); 63605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6361f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) { 6362f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Simulate an external source adding the extension as INTERNAL. 6363f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver observer( 63645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_CRX_INSTALLER_DONE, 6365f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NotificationService::AllSources()); 6366f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->OnExternalExtensionFileFound(kGoodId, 6367f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &older_version, 6368f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kInvalidPathToCrx, 6369f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Manifest::INTERNAL, 6370f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kCreationFlags, 6371f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kDontMarkAcknowledged)); 6372f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(pending->IsIdPending(kGoodId)); 6373f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) observer.Wait(); 6374f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) VerifyCrxInstall(kInvalidPathToCrx, INSTALL_FAILED); 6375f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 63765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6377f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) { 6378f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Simulate an external source adding the extension as EXTERNAL_PREF. 6379f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver observer( 63805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_CRX_INSTALLER_DONE, 6381f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NotificationService::AllSources()); 6382f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->OnExternalExtensionFileFound(kGoodId, 6383f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &older_version, 6384f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kInvalidPathToCrx, 6385f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Manifest::EXTERNAL_PREF, 6386f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kCreationFlags, 6387f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kDontMarkAcknowledged)); 6388f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(pending->IsIdPending(kGoodId)); 6389f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) observer.Wait(); 6390f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) VerifyCrxInstall(kInvalidPathToCrx, INSTALL_FAILED); 6391f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 63925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate an external source adding as EXTERNAL_PREF again. 63942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This is rejected because the version and the location are the same as 63952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the previous installation, which is still pending. 6396f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId, 6397f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &older_version, 6398f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kInvalidPathToCrx, 6399f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Manifest::EXTERNAL_PREF, 6400f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kCreationFlags, 6401f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kDontMarkAcknowledged)); 64025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pending->IsIdPending(kGoodId)); 64035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 64045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try INTERNAL again. Should fail. 6405f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId, 6406f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &older_version, 6407f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kInvalidPathToCrx, 6408f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Manifest::INTERNAL, 6409f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kCreationFlags, 6410f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kDontMarkAcknowledged)); 64115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pending->IsIdPending(kGoodId)); 64125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6413f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) { 6414f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Now the registry adds the extension. 6415f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver observer( 64165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_CRX_INSTALLER_DONE, 6417f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NotificationService::AllSources()); 6418f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE( 6419f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->OnExternalExtensionFileFound(kGoodId, 6420f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &older_version, 6421f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kInvalidPathToCrx, 6422f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Manifest::EXTERNAL_REGISTRY, 6423f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kCreationFlags, 6424f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kDontMarkAcknowledged)); 6425f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(pending->IsIdPending(kGoodId)); 6426f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) observer.Wait(); 6427f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) VerifyCrxInstall(kInvalidPathToCrx, INSTALL_FAILED); 6428f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 64295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 64305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Registry outranks both external pref and internal, so both fail. 6431f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId, 6432f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &older_version, 6433f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kInvalidPathToCrx, 6434f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Manifest::EXTERNAL_PREF, 6435f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kCreationFlags, 6436f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kDontMarkAcknowledged)); 64375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pending->IsIdPending(kGoodId)); 64385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6439f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId, 6440f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &older_version, 6441f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kInvalidPathToCrx, 6442f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Manifest::INTERNAL, 6443f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kCreationFlags, 6444f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kDontMarkAcknowledged)); 64455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pending->IsIdPending(kGoodId)); 64465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 64475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending->Remove(kGoodId); 64485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 64495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Install the extension. 6450f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("good.crx"); 64515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* ext = InstallCRX(path, INSTALL_NEW); 64525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidatePrefKeyCount(1u); 64535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValidateIntegerPref(good_crx, "state", Extension::ENABLED); 64542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValidateIntegerPref(good_crx, "location", Manifest::INTERNAL); 64555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 64565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now test the logic of OnExternalExtensionFileFound() when the extension 64575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // being added is already installed. 64585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 64595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tests assume |older_version| is less than the installed version, and 64605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |newer_version| is greater. Verify this: 64615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(older_version.IsOlderThan(ext->VersionString())); 64625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ext->version()->IsOlderThan(newer_version.GetString())); 64635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 64645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An external install for the same location should fail if the version is 64655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // older, or the same, and succeed if the version is newer. 64665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 64675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Older than the installed version... 6468f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId, 6469f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &older_version, 6470f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kInvalidPathToCrx, 6471f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Manifest::INTERNAL, 6472f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kCreationFlags, 6473f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kDontMarkAcknowledged)); 64745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pending->IsIdPending(kGoodId)); 64755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 64765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Same version as the installed version... 6477f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId, 6478f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ext->version(), 6479f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kInvalidPathToCrx, 6480f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Manifest::INTERNAL, 6481f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kCreationFlags, 6482f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kDontMarkAcknowledged)); 64835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pending->IsIdPending(kGoodId)); 64845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 64855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Newer than the installed version... 6486f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->OnExternalExtensionFileFound(kGoodId, 6487f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &newer_version, 6488f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kInvalidPathToCrx, 6489f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Manifest::INTERNAL, 6490f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kCreationFlags, 6491f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kDontMarkAcknowledged)); 64925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pending->IsIdPending(kGoodId)); 64935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 64945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An external install for a higher priority install source should succeed 64955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if the version is greater. |older_version| is not... 6496f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId, 6497f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &older_version, 6498f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kInvalidPathToCrx, 6499f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Manifest::EXTERNAL_PREF, 6500f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kCreationFlags, 6501f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kDontMarkAcknowledged)); 65025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pending->IsIdPending(kGoodId)); 65035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |newer_version| is newer. 6505f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->OnExternalExtensionFileFound(kGoodId, 6506f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &newer_version, 6507f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kInvalidPathToCrx, 6508f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Manifest::EXTERNAL_PREF, 6509f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kCreationFlags, 6510f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kDontMarkAcknowledged)); 65115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pending->IsIdPending(kGoodId)); 65125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An external install for an even higher priority install source should 65145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // succeed if the version is greater. 65155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE( 6516f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->OnExternalExtensionFileFound(kGoodId, 6517f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &newer_version, 6518f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kInvalidPathToCrx, 6519f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Manifest::EXTERNAL_REGISTRY, 6520f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kCreationFlags, 6521f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kDontMarkAcknowledged)); 65225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pending->IsIdPending(kGoodId)); 65235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Because EXTERNAL_PREF is a lower priority source than EXTERNAL_REGISTRY, 65255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // adding from external pref will now fail. 6526f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId, 6527f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &newer_version, 6528f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kInvalidPathToCrx, 6529f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Manifest::EXTERNAL_PREF, 6530f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kCreationFlags, 6531f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kDontMarkAcknowledged)); 65325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pending->IsIdPending(kGoodId)); 65335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 65345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ConcurrentExternalLocalFile) { 65365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Version kVersion123("1.2.3"); 65375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Version kVersion124("1.2.4"); 65385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Version kVersion125("1.2.5"); 65392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath kInvalidPathToCrx = base::FilePath(); 65405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kCreationFlags = 0; 65415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool kDontMarkAcknowledged = false; 65425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 65445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::PendingExtensionManager* pending = 6546f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->pending_extension_manager(); 65475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pending->IsIdPending(kGoodId)); 65485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An external provider starts installing from a local crx. 6550f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->OnExternalExtensionFileFound(kGoodId, 6551f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &kVersion123, 6552f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kInvalidPathToCrx, 6553f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Manifest::EXTERNAL_PREF, 6554f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kCreationFlags, 6555f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kDontMarkAcknowledged)); 65565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::PendingExtensionInfo* info; 65575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE((info = pending->GetById(kGoodId))); 65585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(info->version().IsValid()); 65595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(info->version().Equals(kVersion123)); 65605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adding a newer version overrides the currently pending version. 6562f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->OnExternalExtensionFileFound(kGoodId, 6563f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &kVersion124, 6564f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kInvalidPathToCrx, 6565f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Manifest::EXTERNAL_PREF, 6566f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kCreationFlags, 6567f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kDontMarkAcknowledged)); 65685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE((info = pending->GetById(kGoodId))); 65695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(info->version().IsValid()); 65705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(info->version().Equals(kVersion124)); 65715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adding an older version fails. 6573f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId, 6574f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &kVersion123, 6575f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kInvalidPathToCrx, 6576f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Manifest::EXTERNAL_PREF, 6577f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kCreationFlags, 6578f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kDontMarkAcknowledged)); 65795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE((info = pending->GetById(kGoodId))); 65805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(info->version().IsValid()); 65815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(info->version().Equals(kVersion124)); 65825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adding an older version fails even when coming from a higher-priority 65845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // location. 65855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE( 6586f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->OnExternalExtensionFileFound(kGoodId, 6587f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &kVersion123, 6588f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kInvalidPathToCrx, 6589f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Manifest::EXTERNAL_REGISTRY, 6590f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kCreationFlags, 6591f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kDontMarkAcknowledged)); 65925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE((info = pending->GetById(kGoodId))); 65935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(info->version().IsValid()); 65945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(info->version().Equals(kVersion124)); 65955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adding the latest version from the webstore overrides a specific version. 65975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL kUpdateUrl("http://example.com/update"); 6598f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->OnExternalExtensionUpdateUrlFound( 6599effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch kGoodId, 6600effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::string(), 6601effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch kUpdateUrl, 6602effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Manifest::EXTERNAL_POLICY_DOWNLOAD, 6603effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Extension::NO_FLAGS, 6604effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch false)); 66055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE((info = pending->GetById(kGoodId))); 66065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(info->version().IsValid()); 66075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 66085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This makes sure we can package and install CRX files that use whitelisted 66105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// permissions. 66112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, InstallWhitelistedExtension) { 66125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string test_id = "hdkklepkcpckhnpgjnmbdfhehckloojk"; 66135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine::ForCurrentProcess()->AppendSwitchASCII( 6614e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch extensions::switches::kWhitelistedExtensionID, test_id); 66155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 6617f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("permissions"); 66182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath pem_path = path 66195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .AppendASCII("whitelist.pem"); 66205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path 66215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .AppendASCII("whitelist"); 66225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = PackAndInstallCRX(path, pem_path, INSTALL_NEW); 66245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, GetErrors().size()); 6625f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ(1u, registry()->enabled_extensions().size()); 66265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_id, extension->id()); 66275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 66285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that when multiple sources try to install an extension, 66305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we consistently choose the right one. To make tests easy to read, 66315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// methods that fake requests to install crx files in several ways 66325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are provided. 66335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionSourcePriorityTest : public ExtensionServiceTest { 66345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 66352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUp() { 66365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionServiceTest::SetUp(); 66375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // All tests use a single extension. Put the id and path in member vars 66395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that all methods can read. 66405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crx_id_ = kGoodId; 6641f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) crx_path_ = data_dir().AppendASCII("good.crx"); 66425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 66435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fake an external source adding a URL to fetch an extension from. 66455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool AddPendingExternalPrefUrl() { 6646f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return service()->pending_extension_manager()->AddFromExternalUpdateUrl( 6647effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch crx_id_, 6648effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::string(), 6649effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch GURL(), 6650effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Manifest::EXTERNAL_PREF_DOWNLOAD, 6651effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Extension::NO_FLAGS, 6652effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch false); 66535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 66545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fake an external file from external_extensions.json. 66565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool AddPendingExternalPrefFileInstall() { 66575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Version version("1.0.0.0"); 66585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6659f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return service()->OnExternalExtensionFileFound(crx_id_, 6660f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &version, 6661f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) crx_path_, 6662f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Manifest::EXTERNAL_PREF, 6663f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Extension::NO_FLAGS, 6664f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) false); 66655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 66665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fake a request from sync to install an extension. 66685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool AddPendingSyncInstall() { 6669f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return service()->pending_extension_manager()->AddFromSync( 6670cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) crx_id_, 6671cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GURL(kGoodUpdateURL), 6672cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) &IsExtension, 6673cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kGoodInstallSilently, 6674116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kGoodRemoteInstall, 6675116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kGoodInstalledByCustodian); 66765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 66775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fake a policy install. 66795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool AddPendingPolicyInstall() { 66805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get path to the CRX with id |kGoodId|. 6681f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return service()->OnExternalExtensionUpdateUrlFound( 6682effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch crx_id_, 6683effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::string(), 6684effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch GURL(), 6685effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Manifest::EXTERNAL_POLICY_DOWNLOAD, 6686effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Extension::NO_FLAGS, 6687effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch false); 66885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 66895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the install source of a pending extension. 66912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::Location GetPendingLocation() { 66925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::PendingExtensionInfo* info; 6693f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE( 6694f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) (info = service()->pending_extension_manager()->GetById(crx_id_))); 66955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return info->install_source(); 66965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 66975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Is an extension pending from a sync request? 66995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool GetPendingIsFromSync() { 67005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::PendingExtensionInfo* info; 6701f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE( 6702f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) (info = service()->pending_extension_manager()->GetById(crx_id_))); 67035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return info->is_from_sync(); 67045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 67055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Is the CRX id these tests use pending? 67075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsCrxPending() { 6708f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return service()->pending_extension_manager()->IsIdPending(crx_id_); 67095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 67105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Is an extension installed? 67125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsCrxInstalled() { 6713f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return (service()->GetExtensionById(crx_id_, true) != NULL); 67145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 67155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 67175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // All tests use a single extension. Making the id and path member 67185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // vars avoids pasing the same argument to every method. 67195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string crx_id_; 67202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath crx_path_; 67215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 67225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that a pending request for installation of an external CRX from 67245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// an update URL overrides a pending request to install the same extension 67255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from sync. 67265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionSourcePriorityTest, PendingExternalFileOverSync) { 67275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 67285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(IsCrxInstalled()); 67305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Install pending extension from sync. 6732f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver observer( 67335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_CRX_INSTALLER_DONE, 6734f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NotificationService::AllSources()); 67355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddPendingSyncInstall()); 67362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(Manifest::INTERNAL, GetPendingLocation()); 67375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GetPendingIsFromSync()); 67385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(IsCrxInstalled()); 67395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Install pending as external prefs json would. 67415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPendingExternalPrefFileInstall(); 67422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(Manifest::EXTERNAL_PREF, GetPendingLocation()); 67435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(IsCrxInstalled()); 67445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Another request from sync should be ignored. 67465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(AddPendingSyncInstall()); 67472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(Manifest::EXTERNAL_PREF, GetPendingLocation()); 67485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(IsCrxInstalled()); 67495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6750f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) observer.Wait(); 6751f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) VerifyCrxInstall(crx_path_, INSTALL_NEW); 67525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(IsCrxInstalled()); 67535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 67545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that an install of an external CRX from an update overrides 67565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// an install of the same extension from sync. 67575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionSourcePriorityTest, PendingExternalUrlOverSync) { 67585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 67595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(IsCrxInstalled()); 67605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(AddPendingSyncInstall()); 67622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(Manifest::INTERNAL, GetPendingLocation()); 67635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GetPendingIsFromSync()); 67645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(IsCrxInstalled()); 67655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(AddPendingExternalPrefUrl()); 67672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(Manifest::EXTERNAL_PREF_DOWNLOAD, GetPendingLocation()); 67685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(GetPendingIsFromSync()); 67695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(IsCrxInstalled()); 67705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(AddPendingSyncInstall()); 67722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(Manifest::EXTERNAL_PREF_DOWNLOAD, GetPendingLocation()); 67735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(GetPendingIsFromSync()); 67745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(IsCrxInstalled()); 67755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 67765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that an external install request stops sync from installing 67785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the same extension. 67795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionSourcePriorityTest, InstallExternalBlocksSyncRequest) { 67805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 67815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(IsCrxInstalled()); 67825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // External prefs starts an install. 67845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPendingExternalPrefFileInstall(); 67855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Crx installer was made, but has not yet run. 67875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(IsCrxInstalled()); 67885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Before the CRX installer runs, Sync requests that the same extension 67905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be installed. Should fail, because an external source is pending. 6791f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver observer( 67925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_CRX_INSTALLER_DONE, 6793f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NotificationService::AllSources()); 67945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(AddPendingSyncInstall()); 67955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the external source to install. 6797f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) observer.Wait(); 6798f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) VerifyCrxInstall(crx_path_, INSTALL_NEW); 67995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(IsCrxInstalled()); 68005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now that the extension is installed, sync request should fail 68025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // because the extension is already installed. 68035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(AddPendingSyncInstall()); 68045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 68055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that installing an external extension displays a GlobalError. 68072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ExternalInstallGlobalError) { 68085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FeatureSwitch::ScopedOverride prompt( 68095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FeatureSwitch::prompt_for_external_extensions(), true); 68105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 68125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockExtensionProvider* provider = 6813f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF); 68145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddMockExternalProvider(provider); 68155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6816116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service()->external_install_manager()->UpdateExternalExtensionAlert(); 68175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should return false, meaning there aren't any extensions that the user 68185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // needs to know about. 6819116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE( 6820116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service()->external_install_manager()->HasExternalInstallError()); 68215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is a normal extension, installed normally. 68235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This should NOT trigger an alert. 6824f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->set_extensions_enabled(true); 6825f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = data_dir().AppendASCII("good.crx"); 68265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallCRX(path, INSTALL_NEW); 68275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6828f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->CheckForExternalUpdates(); 6829ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 6830116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE( 6831116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service()->external_install_manager()->HasExternalInstallError()); 68325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A hosted app, installed externally. 68342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This should NOT trigger an alert. 6835f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) provider->UpdateOrAddExtension( 6836f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) hosted_app, "1.0.0.0", data_dir().AppendASCII("hosted_app.crx")); 68375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6838f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver observer( 68395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_CRX_INSTALLER_DONE, 6840f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NotificationService::AllSources()); 6841f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->CheckForExternalUpdates(); 6842f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) observer.Wait(); 6843116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE( 6844116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service()->external_install_manager()->HasExternalInstallError()); 68455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Another normal extension, but installed externally. 68475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This SHOULD trigger an alert. 6848f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) provider->UpdateOrAddExtension( 6849f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) page_action, "1.0.0.0", data_dir().AppendASCII("page_action.crx")); 68505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6851f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver observer2( 68525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_CRX_INSTALLER_DONE, 6853f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NotificationService::AllSources()); 6854f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->CheckForExternalUpdates(); 6855f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) observer2.Wait(); 6856116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError()); 68575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 68585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that external extensions are initially disabled, and that enabling 68605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// them clears the prompt. 68612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ExtensionServiceTest, ExternalInstallInitiallyDisabled) { 68625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FeatureSwitch::ScopedOverride prompt( 68635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FeatureSwitch::prompt_for_external_extensions(), true); 68645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 68665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockExtensionProvider* provider = 6867f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF); 68685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddMockExternalProvider(provider); 68695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6870f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) provider->UpdateOrAddExtension( 6871f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) page_action, "1.0.0.0", data_dir().AppendASCII("page_action.crx")); 68725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6873f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver observer( 68745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_CRX_INSTALLER_DONE, 6875f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NotificationService::AllSources()); 6876f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->CheckForExternalUpdates(); 6877f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) observer.Wait(); 6878116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError()); 6879f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->IsExtensionEnabled(page_action)); 68805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = 6882f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) registry()->disabled_extensions().GetByID(page_action); 68835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension); 68845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(page_action, extension->id()); 68855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6886f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->EnableExtension(page_action); 6887116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE( 6888116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service()->external_install_manager()->HasExternalInstallError()); 6889f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->IsExtensionEnabled(page_action)); 68905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 68915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that installing multiple external extensions works. 689368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Flaky on windows; http://crbug.com/295757 . 689468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(OS_WIN) 689568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#define MAYBE_ExternalInstallMultiple DISABLED_ExternalInstallMultiple 689668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#else 689768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#define MAYBE_ExternalInstallMultiple ExternalInstallMultiple 689868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif 689968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(ExtensionServiceTest, MAYBE_ExternalInstallMultiple) { 69005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FeatureSwitch::ScopedOverride prompt( 69015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FeatureSwitch::prompt_for_external_extensions(), true); 69025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 69035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeEmptyExtensionService(); 69045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockExtensionProvider* provider = 6905f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF); 69065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddMockExternalProvider(provider); 69075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6908f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) provider->UpdateOrAddExtension( 6909f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) page_action, "1.0.0.0", data_dir().AppendASCII("page_action.crx")); 6910f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) provider->UpdateOrAddExtension( 6911f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) good_crx, "1.0.0.0", data_dir().AppendASCII("good.crx")); 6912f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) provider->UpdateOrAddExtension( 6913f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) theme_crx, "2.0", data_dir().AppendASCII("theme.crx")); 69145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 69157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int count = 3; 6916f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver observer( 69175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_CRX_INSTALLER_DONE, 6918f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Bind(&WaitForCountNotificationsCallback, &count)); 6919f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->CheckForExternalUpdates(); 6920f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) observer.Wait(); 6921116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError()); 6922f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->IsExtensionEnabled(page_action)); 6923f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->IsExtensionEnabled(good_crx)); 6924f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->IsExtensionEnabled(theme_crx)); 6925f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 6926f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->EnableExtension(page_action); 6927116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError()); 6928116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(service() 6929116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ->external_install_manager() 6930116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ->HasExternalInstallBubbleForTesting()); 6931116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 6932f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->EnableExtension(theme_crx); 6933116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError()); 6934116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(service() 6935116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ->external_install_manager() 6936116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ->HasExternalInstallBubbleForTesting()); 6937116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 6938f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->EnableExtension(good_crx); 6939116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE( 6940116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service()->external_install_manager()->HasExternalInstallError()); 6941116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(service() 6942116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ->external_install_manager() 6943116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ->HasExternalInstallBubbleForTesting()); 69445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 69455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Test that there is a bubble for external extensions that update 6947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// from the webstore if the profile is not new. 6948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ExtensionServiceTest, ExternalInstallUpdatesFromWebstoreOldProfile) { 69495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FeatureSwitch::ScopedOverride prompt( 6950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FeatureSwitch::prompt_for_external_extensions(), true); 69515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This sets up the ExtensionPrefs used by our ExtensionService to be 6953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // post-first run. 69548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ExtensionServiceInitParams params = CreateDefaultInitParams(); 69558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) params.is_first_run = false; 69568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) InitializeExtensionService(params); 69575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6958f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath crx_path = temp_dir().path().AppendASCII("webstore.crx"); 6959f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PackCRX(data_dir().AppendASCII("update_from_webstore"), 6960f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data_dir().AppendASCII("update_from_webstore.pem"), 6961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) crx_path); 6962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockExtensionProvider* provider = 6964f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF); 6965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AddMockExternalProvider(provider); 6966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path); 69675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6968f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver observer( 69695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_CRX_INSTALLER_DONE, 6970f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NotificationService::AllSources()); 6971f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->CheckForExternalUpdates(); 6972f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) observer.Wait(); 6973116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError()); 6974116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(service() 6975116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ->external_install_manager() 6976116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ->HasExternalInstallBubbleForTesting()); 6977f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->IsExtensionEnabled(updates_from_webstore)); 6978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 69795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Test that there is no bubble for external extensions if the profile is new. 6981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ExtensionServiceTest, ExternalInstallUpdatesFromWebstoreNewProfile) { 6982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FeatureSwitch::ScopedOverride prompt( 6983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FeatureSwitch::prompt_for_external_extensions(), true); 6984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InitializeEmptyExtensionService(); 6986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6987f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath crx_path = temp_dir().path().AppendASCII("webstore.crx"); 6988f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PackCRX(data_dir().AppendASCII("update_from_webstore"), 6989f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data_dir().AppendASCII("update_from_webstore.pem"), 6990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) crx_path); 6991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockExtensionProvider* provider = 6993f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF); 6994c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AddMockExternalProvider(provider); 6995c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path); 6996c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6997f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver observer( 69985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_CRX_INSTALLER_DONE, 6999f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NotificationService::AllSources()); 7000f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->CheckForExternalUpdates(); 7001f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) observer.Wait(); 7002116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError()); 7003116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(service() 7004116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ->external_install_manager() 7005116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ->HasExternalInstallBubbleForTesting()); 7006f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(service()->IsExtensionEnabled(updates_from_webstore)); 70075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7008a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 7009116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Test that clicking to remove the extension on an external install warning 7010116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// uninstalls the extension. 7011116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ExtensionServiceTest, ExternalInstallClickToRemove) { 7012116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FeatureSwitch::ScopedOverride prompt( 7013116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FeatureSwitch::prompt_for_external_extensions(), true); 7014116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7015116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ExtensionServiceInitParams params = CreateDefaultInitParams(); 7016116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch params.is_first_run = false; 7017116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch InitializeExtensionService(params); 7018116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7019116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::FilePath crx_path = temp_dir().path().AppendASCII("webstore.crx"); 7020116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PackCRX(data_dir().AppendASCII("update_from_webstore"), 7021116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch data_dir().AppendASCII("update_from_webstore.pem"), 7022116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch crx_path); 7023116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7024116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MockExtensionProvider* provider = 7025116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new MockExtensionProvider(service_, Manifest::EXTERNAL_PREF); 7026116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AddMockExternalProvider(provider); 7027116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path); 7028116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7029116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::WindowedNotificationObserver observer( 70305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_CRX_INSTALLER_DONE, 7031116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::NotificationService::AllSources()); 7032116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service_->CheckForExternalUpdates(); 7033116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch observer.Wait(); 7034116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(service_->external_install_manager()->HasExternalInstallError()); 7035116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7036116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // We check both enabled and disabled, since these are "eventually exclusive" 7037116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // sets. 7038116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(registry()->disabled_extensions().GetByID(updates_from_webstore)); 7039116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(registry()->enabled_extensions().GetByID(updates_from_webstore)); 7040116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7041116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Click the negative response. 7042116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service_->external_install_manager()->error_for_testing()->InstallUIAbort( 7043116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch true); 7044116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // The Extension should be uninstalled. 7045116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(registry()->GetExtensionById(updates_from_webstore, 7046116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ExtensionRegistry::EVERYTHING)); 7047116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // The error should be removed. 7048116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(service_->external_install_manager()->HasExternalInstallError()); 7049116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 7050116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7051116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Test that clicking to keep the extension on an external install warning 7052116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// re-enables the extension. 7053116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ExtensionServiceTest, ExternalInstallClickToKeep) { 7054116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FeatureSwitch::ScopedOverride prompt( 7055116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FeatureSwitch::prompt_for_external_extensions(), true); 7056116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7057116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ExtensionServiceInitParams params = CreateDefaultInitParams(); 7058116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch params.is_first_run = false; 7059116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch InitializeExtensionService(params); 7060116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7061116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::FilePath crx_path = temp_dir().path().AppendASCII("webstore.crx"); 7062116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PackCRX(data_dir().AppendASCII("update_from_webstore"), 7063116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch data_dir().AppendASCII("update_from_webstore.pem"), 7064116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch crx_path); 7065116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7066116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MockExtensionProvider* provider = 7067116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new MockExtensionProvider(service_, Manifest::EXTERNAL_PREF); 7068116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AddMockExternalProvider(provider); 7069116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path); 7070116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7071116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::WindowedNotificationObserver observer( 70725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_CRX_INSTALLER_DONE, 7073116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::NotificationService::AllSources()); 7074116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service_->CheckForExternalUpdates(); 7075116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch observer.Wait(); 7076116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(service_->external_install_manager()->HasExternalInstallError()); 7077116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7078116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // We check both enabled and disabled, since these are "eventually exclusive" 7079116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // sets. 7080116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(registry()->disabled_extensions().GetByID(updates_from_webstore)); 7081116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(registry()->enabled_extensions().GetByID(updates_from_webstore)); 7082116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7083116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Accept the extension. 7084116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service_->external_install_manager()->error_for_testing()->InstallUIProceed(); 7085116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7086116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // It should be enabled again. 7087116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(registry()->enabled_extensions().GetByID(updates_from_webstore)); 7088116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE( 7089116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch registry()->disabled_extensions().GetByID(updates_from_webstore)); 7090116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7091116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // The error should be removed. 7092116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(service_->external_install_manager()->HasExternalInstallError()); 7093116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 7094116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7095a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(ExtensionServiceTest, InstallBlacklistedExtension) { 7096a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) InitializeEmptyExtensionService(); 7097a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 7098a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_refptr<Extension> extension = extensions::ExtensionBuilder() 7099a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .SetManifest(extensions::DictionaryBuilder() 7100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Set("name", "extension") 7101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Set("version", "1.0") 7102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Set("manifest_version", 2).Build()) 7103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) .Build(); 7104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_TRUE(extension.get()); 7105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& id = extension->id(); 7106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 7107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::set<std::string> id_set; 7108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) id_set.insert(id); 7109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) extensions::ExtensionNotificationObserver notifications( 7110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) content::NotificationService::AllSources(), id_set); 7111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 7112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Installation should be allowed but the extension should never have been 7113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // loaded and it should be blacklisted in prefs. 7114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->OnExtensionInstalled( 7115a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) extension.get(), 7116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) syncer::StringOrdinal(), 7117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) (extensions::kInstallFlagIsBlacklistedForMalware | 7118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::kInstallFlagInstallImmediately)); 7119ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::RunLoop().RunUntilIdle(); 7120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 7121a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Extension was installed but not loaded. 7122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(notifications.CheckNotifications( 71235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_EXTENSION_WILL_BE_INSTALLED_DEPRECATED)); 7124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(service()->GetInstalledExtension(id)); 71255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(registry()->enabled_extensions().Contains(id)); 7127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(registry()->blacklisted_extensions().Contains(id)); 71285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(ExtensionPrefs::Get(profile())->IsExtensionBlacklisted(id)); 7130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE( 7131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ExtensionPrefs::Get(profile())->IsBlacklistedExtensionAcknowledged(id)); 7132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 71334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Tests a profile being destroyed correctly disables extensions. 7135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ExtensionServiceTest, DestroyingProfileClearsExtensions) { 7136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InitializeEmptyExtensionService(); 7137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 7138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 7139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_NE(UnloadedExtensionInfo::REASON_PROFILE_SHUTDOWN, unloaded_reason_); 7140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1u, registry()->enabled_extensions().size()); 7141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->disabled_extensions().size()); 7142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->terminated_extensions().size()); 7143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->blacklisted_extensions().size()); 7144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 7145f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service()->Observe(chrome::NOTIFICATION_PROFILE_DESTRUCTION_STARTED, 7146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) content::Source<Profile>(profile()), 7147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) content::NotificationService::NoDetails()); 7148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(UnloadedExtensionInfo::REASON_PROFILE_SHUTDOWN, unloaded_reason_); 7149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->enabled_extensions().size()); 7150f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->disabled_extensions().size()); 7151f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->terminated_extensions().size()); 7152f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0u, registry()->blacklisted_extensions().size()); 7153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 7154