1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include <algorithm> 6 #include <set> 7 #include <vector> 8 9 #include "base/at_exit.h" 10 #include "base/basictypes.h" 11 #include "base/bind.h" 12 #include "base/command_line.h" 13 #include "base/files/file_enumerator.h" 14 #include "base/files/file_util.h" 15 #include "base/files/scoped_temp_dir.h" 16 #include "base/json/json_file_value_serializer.h" 17 #include "base/json/json_reader.h" 18 #include "base/json/json_string_value_serializer.h" 19 #include "base/memory/scoped_ptr.h" 20 #include "base/memory/weak_ptr.h" 21 #include "base/message_loop/message_loop.h" 22 #include "base/prefs/scoped_user_pref_update.h" 23 #include "base/stl_util.h" 24 #include "base/strings/string16.h" 25 #include "base/strings/string_number_conversions.h" 26 #include "base/strings/string_util.h" 27 #include "base/strings/utf_string_conversions.h" 28 #include "base/version.h" 29 #include "chrome/browser/browser_process.h" 30 #include "chrome/browser/chrome_notification_types.h" 31 #include "chrome/browser/extensions/app_sync_data.h" 32 #include "chrome/browser/extensions/blacklist.h" 33 #include "chrome/browser/extensions/chrome_app_sorting.h" 34 #include "chrome/browser/extensions/component_loader.h" 35 #include "chrome/browser/extensions/crx_installer.h" 36 #include "chrome/browser/extensions/default_apps.h" 37 #include "chrome/browser/extensions/extension_creator.h" 38 #include "chrome/browser/extensions/extension_error_reporter.h" 39 #include "chrome/browser/extensions/extension_error_ui.h" 40 #include "chrome/browser/extensions/extension_management_test_util.h" 41 #include "chrome/browser/extensions/extension_notification_observer.h" 42 #include "chrome/browser/extensions/extension_service.h" 43 #include "chrome/browser/extensions/extension_service_test_base.h" 44 #include "chrome/browser/extensions/extension_special_storage_policy.h" 45 #include "chrome/browser/extensions/extension_sync_data.h" 46 #include "chrome/browser/extensions/extension_sync_service.h" 47 #include "chrome/browser/extensions/extension_util.h" 48 #include "chrome/browser/extensions/external_install_error.h" 49 #include "chrome/browser/extensions/external_install_manager.h" 50 #include "chrome/browser/extensions/external_policy_loader.h" 51 #include "chrome/browser/extensions/external_pref_loader.h" 52 #include "chrome/browser/extensions/external_provider_impl.h" 53 #include "chrome/browser/extensions/fake_safe_browsing_database_manager.h" 54 #include "chrome/browser/extensions/installed_loader.h" 55 #include "chrome/browser/extensions/pack_extension_job.h" 56 #include "chrome/browser/extensions/pending_extension_info.h" 57 #include "chrome/browser/extensions/pending_extension_manager.h" 58 #include "chrome/browser/extensions/test_blacklist.h" 59 #include "chrome/browser/extensions/test_extension_system.h" 60 #include "chrome/browser/extensions/unpacked_installer.h" 61 #include "chrome/browser/extensions/updater/extension_updater.h" 62 #include "chrome/browser/prefs/pref_service_syncable.h" 63 #include "chrome/browser/supervised_user/supervised_user_service.h" 64 #include "chrome/browser/supervised_user/supervised_user_service_factory.h" 65 #include "chrome/browser/sync/profile_sync_service.h" 66 #include "chrome/browser/sync/profile_sync_service_factory.h" 67 #include "chrome/common/chrome_constants.h" 68 #include "chrome/common/chrome_switches.h" 69 #include "chrome/common/extensions/api/plugins/plugins_handler.h" 70 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h" 71 #include "chrome/common/extensions/manifest_handlers/content_scripts_handler.h" 72 #include "chrome/common/extensions/manifest_url_handler.h" 73 #include "chrome/common/pref_names.h" 74 #include "chrome/common/url_constants.h" 75 #include "chrome/test/base/scoped_browser_locale.h" 76 #include "chrome/test/base/testing_pref_service_syncable.h" 77 #include "chrome/test/base/testing_profile.h" 78 #include "components/crx_file/id_util.h" 79 #include "components/pref_registry/pref_registry_syncable.h" 80 #include "content/public/browser/dom_storage_context.h" 81 #include "content/public/browser/gpu_data_manager.h" 82 #include "content/public/browser/indexed_db_context.h" 83 #include "content/public/browser/notification_registrar.h" 84 #include "content/public/browser/notification_service.h" 85 #include "content/public/browser/plugin_service.h" 86 #include "content/public/browser/render_process_host.h" 87 #include "content/public/browser/storage_partition.h" 88 #include "content/public/common/content_constants.h" 89 #include "content/public/test/test_utils.h" 90 #include "extensions/browser/extension_registry.h" 91 #include "extensions/browser/extension_system.h" 92 #include "extensions/browser/external_provider_interface.h" 93 #include "extensions/browser/install_flag.h" 94 #include "extensions/browser/management_policy.h" 95 #include "extensions/browser/test_management_policy.h" 96 #include "extensions/browser/uninstall_reason.h" 97 #include "extensions/common/constants.h" 98 #include "extensions/common/extension.h" 99 #include "extensions/common/extension_builder.h" 100 #include "extensions/common/extension_l10n_util.h" 101 #include "extensions/common/extension_resource.h" 102 #include "extensions/common/feature_switch.h" 103 #include "extensions/common/manifest_constants.h" 104 #include "extensions/common/manifest_handlers/background_info.h" 105 #include "extensions/common/permissions/permission_set.h" 106 #include "extensions/common/permissions/permissions_data.h" 107 #include "extensions/common/switches.h" 108 #include "extensions/common/url_pattern.h" 109 #include "extensions/common/value_builder.h" 110 #include "gpu/config/gpu_info.h" 111 #include "grit/browser_resources.h" 112 #include "net/cookies/canonical_cookie.h" 113 #include "net/cookies/cookie_monster.h" 114 #include "net/cookies/cookie_options.h" 115 #include "net/url_request/url_request_context.h" 116 #include "net/url_request/url_request_context_getter.h" 117 #include "storage/browser/database/database_tracker.h" 118 #include "storage/browser/quota/quota_manager.h" 119 #include "storage/common/database/database_identifier.h" 120 #include "sync/api/fake_sync_change_processor.h" 121 #include "sync/api/string_ordinal.h" 122 #include "sync/api/sync_data.h" 123 #include "sync/api/sync_error_factory.h" 124 #include "sync/api/sync_error_factory_mock.h" 125 #include "sync/api/syncable_service.h" 126 #include "sync/protocol/app_specifics.pb.h" 127 #include "sync/protocol/extension_specifics.pb.h" 128 #include "sync/protocol/sync.pb.h" 129 #include "testing/gtest/include/gtest/gtest.h" 130 #include "testing/platform_test.h" 131 #include "url/gurl.h" 132 133 #if defined(OS_CHROMEOS) 134 #include "chrome/browser/chromeos/login/users/scoped_test_user_manager.h" 135 #include "chrome/browser/chromeos/settings/cros_settings.h" 136 #include "chrome/browser/chromeos/settings/device_settings_service.h" 137 #endif 138 139 // The blacklist tests rely on safe browsing. 140 #if defined(FULL_SAFE_BROWSING) || defined(MOBILE_SAFE_BROWSING) 141 #define ENABLE_BLACKLIST_TESTS 142 #endif 143 144 using base::DictionaryValue; 145 using base::ListValue; 146 using base::Value; 147 using content::BrowserContext; 148 using content::BrowserThread; 149 using content::DOMStorageContext; 150 using content::IndexedDBContext; 151 using content::PluginService; 152 using extensions::APIPermission; 153 using extensions::APIPermissionSet; 154 using extensions::AppSorting; 155 using extensions::Blacklist; 156 using extensions::CrxInstaller; 157 using extensions::Extension; 158 using extensions::ExtensionCreator; 159 using extensions::ExtensionPrefs; 160 using extensions::ExtensionRegistry; 161 using extensions::ExtensionResource; 162 using extensions::ExtensionSystem; 163 using extensions::FakeSafeBrowsingDatabaseManager; 164 using extensions::FeatureSwitch; 165 using extensions::Manifest; 166 using extensions::PermissionSet; 167 using extensions::TestExtensionSystem; 168 using extensions::UnloadedExtensionInfo; 169 using extensions::URLPatternSet; 170 171 namespace keys = extensions::manifest_keys; 172 173 namespace { 174 175 // Extension ids used during testing. 176 const char good0[] = "behllobkkfkfnphdnhnkndlbkcpglgmj"; 177 const char good1[] = "hpiknbiabeeppbpihjehijgoemciehgk"; 178 const char good2[] = "bjafgdebaacbbbecmhlhpofkepfkgcpa"; 179 const char all_zero[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; 180 const char good2048[] = "nmgjhmhbleinmjpbdhgajfjkbijcmgbh"; 181 const char good_crx[] = "ldnnhddmnhbkjipkidpdiheffobcpfmf"; 182 const char hosted_app[] = "kbmnembihfiondgfjekmnmcbddelicoi"; 183 const char page_action[] = "obcimlgaoabeegjmmpldobjndiealpln"; 184 const char theme_crx[] = "iamefpfkojoapidjnbafmgkgncegbkad"; 185 const char theme2_crx[] = "pjpgmfcmabopnnfonnhmdjglfpjjfkbf"; 186 const char permissions_crx[] = "eagpmdpfmaekmmcejjbmjoecnejeiiin"; 187 const char unpacked[] = "cbcdidchbppangcjoddlpdjlenngjldk"; 188 const char updates_from_webstore[] = "akjooamlhcgeopfifcmlggaebeocgokj"; 189 190 struct ExtensionsOrder { 191 bool operator()(const scoped_refptr<const Extension>& a, 192 const scoped_refptr<const Extension>& b) { 193 return a->name() < b->name(); 194 } 195 }; 196 197 static std::vector<base::string16> GetErrors() { 198 const std::vector<base::string16>* errors = 199 ExtensionErrorReporter::GetInstance()->GetErrors(); 200 std::vector<base::string16> ret_val; 201 202 for (std::vector<base::string16>::const_iterator iter = errors->begin(); 203 iter != errors->end(); ++iter) { 204 std::string utf8_error = base::UTF16ToUTF8(*iter); 205 if (utf8_error.find(".svn") == std::string::npos) { 206 ret_val.push_back(*iter); 207 } 208 } 209 210 // The tests rely on the errors being in a certain order, which can vary 211 // depending on how filesystem iteration works. 212 std::stable_sort(ret_val.begin(), ret_val.end()); 213 214 return ret_val; 215 } 216 217 static void AddPattern(URLPatternSet* extent, const std::string& pattern) { 218 int schemes = URLPattern::SCHEME_ALL; 219 extent->AddPattern(URLPattern(schemes, pattern)); 220 } 221 222 base::FilePath GetTemporaryFile() { 223 base::FilePath temp_file; 224 CHECK(base::CreateTemporaryFile(&temp_file)); 225 return temp_file; 226 } 227 228 bool WaitForCountNotificationsCallback(int *count) { 229 return --(*count) == 0; 230 } 231 232 } // namespace 233 234 class MockExtensionProvider : public extensions::ExternalProviderInterface { 235 public: 236 MockExtensionProvider( 237 VisitorInterface* visitor, 238 Manifest::Location location) 239 : location_(location), visitor_(visitor), visit_count_(0) { 240 } 241 242 virtual ~MockExtensionProvider() {} 243 244 void UpdateOrAddExtension(const std::string& id, 245 const std::string& version, 246 const base::FilePath& path) { 247 extension_map_[id] = std::make_pair(version, path); 248 } 249 250 void RemoveExtension(const std::string& id) { 251 extension_map_.erase(id); 252 } 253 254 // ExternalProvider implementation: 255 virtual void VisitRegisteredExtension() OVERRIDE { 256 visit_count_++; 257 for (DataMap::const_iterator i = extension_map_.begin(); 258 i != extension_map_.end(); ++i) { 259 Version version(i->second.first); 260 261 visitor_->OnExternalExtensionFileFound( 262 i->first, &version, i->second.second, location_, 263 Extension::NO_FLAGS, false); 264 } 265 visitor_->OnExternalProviderReady(this); 266 } 267 268 virtual bool HasExtension(const std::string& id) const OVERRIDE { 269 return extension_map_.find(id) != extension_map_.end(); 270 } 271 272 virtual bool GetExtensionDetails( 273 const std::string& id, 274 Manifest::Location* location, 275 scoped_ptr<Version>* version) const OVERRIDE { 276 DataMap::const_iterator it = extension_map_.find(id); 277 if (it == extension_map_.end()) 278 return false; 279 280 if (version) 281 version->reset(new Version(it->second.first)); 282 283 if (location) 284 *location = location_; 285 286 return true; 287 } 288 289 virtual bool IsReady() const OVERRIDE { 290 return true; 291 } 292 293 virtual void ServiceShutdown() OVERRIDE { 294 } 295 296 int visit_count() const { return visit_count_; } 297 void set_visit_count(int visit_count) { 298 visit_count_ = visit_count; 299 } 300 301 private: 302 typedef std::map< std::string, std::pair<std::string, base::FilePath> > 303 DataMap; 304 DataMap extension_map_; 305 Manifest::Location location_; 306 VisitorInterface* visitor_; 307 308 // visit_count_ tracks the number of calls to VisitRegisteredExtension(). 309 // Mutable because it must be incremented on each call to 310 // VisitRegisteredExtension(), which must be a const method to inherit 311 // from the class being mocked. 312 mutable int visit_count_; 313 314 DISALLOW_COPY_AND_ASSIGN(MockExtensionProvider); 315 }; 316 317 class MockProviderVisitor 318 : public extensions::ExternalProviderInterface::VisitorInterface { 319 public: 320 // The provider will return |fake_base_path| from 321 // GetBaseCrxFilePath(). User can test the behavior with 322 // and without an empty path using this parameter. 323 explicit MockProviderVisitor(base::FilePath fake_base_path) 324 : ids_found_(0), 325 fake_base_path_(fake_base_path), 326 expected_creation_flags_(Extension::NO_FLAGS) { 327 profile_.reset(new TestingProfile); 328 } 329 330 MockProviderVisitor(base::FilePath fake_base_path, 331 int expected_creation_flags) 332 : ids_found_(0), 333 fake_base_path_(fake_base_path), 334 expected_creation_flags_(expected_creation_flags) { 335 } 336 337 int Visit(const std::string& json_data) { 338 // Give the test json file to the provider for parsing. 339 provider_.reset(new extensions::ExternalProviderImpl( 340 this, 341 new extensions::ExternalTestingLoader(json_data, fake_base_path_), 342 profile_.get(), 343 Manifest::EXTERNAL_PREF, 344 Manifest::EXTERNAL_PREF_DOWNLOAD, 345 Extension::NO_FLAGS)); 346 347 // We also parse the file into a dictionary to compare what we get back 348 // from the provider. 349 JSONStringValueSerializer serializer(json_data); 350 base::Value* json_value = serializer.Deserialize(NULL, NULL); 351 352 if (!json_value || !json_value->IsType(base::Value::TYPE_DICTIONARY)) { 353 NOTREACHED() << "Unable to deserialize json data"; 354 return -1; 355 } else { 356 base::DictionaryValue* external_extensions = 357 static_cast<base::DictionaryValue*>(json_value); 358 prefs_.reset(external_extensions); 359 } 360 361 // Reset our counter. 362 ids_found_ = 0; 363 // Ask the provider to look up all extensions and return them. 364 provider_->VisitRegisteredExtension(); 365 366 return ids_found_; 367 } 368 369 virtual bool OnExternalExtensionFileFound(const std::string& id, 370 const Version* version, 371 const base::FilePath& path, 372 Manifest::Location unused, 373 int creation_flags, 374 bool mark_acknowledged) OVERRIDE { 375 EXPECT_EQ(expected_creation_flags_, creation_flags); 376 377 ++ids_found_; 378 base::DictionaryValue* pref; 379 // This tests is to make sure that the provider only notifies us of the 380 // values we gave it. So if the id we doesn't exist in our internal 381 // dictionary then something is wrong. 382 EXPECT_TRUE(prefs_->GetDictionary(id, &pref)) 383 << "Got back ID (" << id.c_str() << ") we weren't expecting"; 384 385 EXPECT_TRUE(path.IsAbsolute()); 386 if (!fake_base_path_.empty()) 387 EXPECT_TRUE(fake_base_path_.IsParent(path)); 388 389 if (pref) { 390 EXPECT_TRUE(provider_->HasExtension(id)); 391 392 // Ask provider if the extension we got back is registered. 393 Manifest::Location location = Manifest::INVALID_LOCATION; 394 scoped_ptr<Version> v1; 395 base::FilePath crx_path; 396 397 EXPECT_TRUE(provider_->GetExtensionDetails(id, NULL, &v1)); 398 EXPECT_STREQ(version->GetString().c_str(), v1->GetString().c_str()); 399 400 scoped_ptr<Version> v2; 401 EXPECT_TRUE(provider_->GetExtensionDetails(id, &location, &v2)); 402 EXPECT_STREQ(version->GetString().c_str(), v1->GetString().c_str()); 403 EXPECT_STREQ(version->GetString().c_str(), v2->GetString().c_str()); 404 EXPECT_EQ(Manifest::EXTERNAL_PREF, location); 405 406 // Remove it so we won't count it ever again. 407 prefs_->Remove(id, NULL); 408 } 409 return true; 410 } 411 412 virtual bool OnExternalExtensionUpdateUrlFound( 413 const std::string& id, 414 const std::string& install_parameter, 415 const GURL& update_url, 416 Manifest::Location location, 417 int creation_flags, 418 bool mark_acknowledged) OVERRIDE { 419 ++ids_found_; 420 base::DictionaryValue* pref; 421 // This tests is to make sure that the provider only notifies us of the 422 // values we gave it. So if the id we doesn't exist in our internal 423 // dictionary then something is wrong. 424 EXPECT_TRUE(prefs_->GetDictionary(id, &pref)) 425 << L"Got back ID (" << id.c_str() << ") we weren't expecting"; 426 EXPECT_EQ(Manifest::EXTERNAL_PREF_DOWNLOAD, location); 427 428 if (pref) { 429 EXPECT_TRUE(provider_->HasExtension(id)); 430 431 // External extensions with update URLs do not have versions. 432 scoped_ptr<Version> v1; 433 Manifest::Location location1 = Manifest::INVALID_LOCATION; 434 EXPECT_TRUE(provider_->GetExtensionDetails(id, &location1, &v1)); 435 EXPECT_FALSE(v1.get()); 436 EXPECT_EQ(Manifest::EXTERNAL_PREF_DOWNLOAD, location1); 437 438 std::string parsed_install_parameter; 439 pref->GetString("install_parameter", &parsed_install_parameter); 440 EXPECT_EQ(parsed_install_parameter, install_parameter); 441 442 // Remove it so we won't count it again. 443 prefs_->Remove(id, NULL); 444 } 445 return true; 446 } 447 448 virtual void OnExternalProviderReady( 449 const extensions::ExternalProviderInterface* provider) OVERRIDE { 450 EXPECT_EQ(provider, provider_.get()); 451 EXPECT_TRUE(provider->IsReady()); 452 } 453 454 private: 455 int ids_found_; 456 base::FilePath fake_base_path_; 457 int expected_creation_flags_; 458 scoped_ptr<extensions::ExternalProviderImpl> provider_; 459 scoped_ptr<base::DictionaryValue> prefs_; 460 scoped_ptr<TestingProfile> profile_; 461 462 DISALLOW_COPY_AND_ASSIGN(MockProviderVisitor); 463 }; 464 465 class ExtensionServiceTest : public extensions::ExtensionServiceTestBase, 466 public content::NotificationObserver { 467 public: 468 ExtensionServiceTest() 469 : unloaded_reason_(UnloadedExtensionInfo::REASON_UNDEFINED), 470 installed_(NULL), 471 was_update_(false), 472 override_external_install_prompt_( 473 FeatureSwitch::prompt_for_external_extensions(), 474 false), 475 expected_extensions_count_(0) { 476 registrar_.Add(this, 477 extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED, 478 content::NotificationService::AllSources()); 479 registrar_.Add(this, 480 extensions::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED, 481 content::NotificationService::AllSources()); 482 registrar_.Add( 483 this, 484 extensions::NOTIFICATION_EXTENSION_WILL_BE_INSTALLED_DEPRECATED, 485 content::NotificationService::AllSources()); 486 } 487 488 virtual void Observe(int type, 489 const content::NotificationSource& source, 490 const content::NotificationDetails& details) OVERRIDE { 491 switch (type) { 492 case extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED: { 493 const Extension* extension = 494 content::Details<const Extension>(details).ptr(); 495 loaded_.push_back(make_scoped_refptr(extension)); 496 // The tests rely on the errors being in a certain order, which can vary 497 // depending on how filesystem iteration works. 498 std::stable_sort(loaded_.begin(), loaded_.end(), ExtensionsOrder()); 499 break; 500 } 501 502 case extensions::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED: { 503 UnloadedExtensionInfo* unloaded_info = 504 content::Details<UnloadedExtensionInfo>(details).ptr(); 505 const Extension* e = unloaded_info->extension; 506 unloaded_id_ = e->id(); 507 unloaded_reason_ = unloaded_info->reason; 508 extensions::ExtensionList::iterator i = 509 std::find(loaded_.begin(), loaded_.end(), e); 510 // TODO(erikkay) fix so this can be an assert. Right now the tests 511 // are manually calling clear() on loaded_, so this isn't doable. 512 if (i == loaded_.end()) 513 return; 514 loaded_.erase(i); 515 break; 516 } 517 case extensions::NOTIFICATION_EXTENSION_WILL_BE_INSTALLED_DEPRECATED: { 518 const extensions::InstalledExtensionInfo* installed_info = 519 content::Details<const extensions::InstalledExtensionInfo>(details) 520 .ptr(); 521 installed_ = installed_info->extension; 522 was_update_ = installed_info->is_update; 523 old_name_ = installed_info->old_name; 524 break; 525 } 526 527 default: 528 DCHECK(false); 529 } 530 } 531 532 void AddMockExternalProvider( 533 extensions::ExternalProviderInterface* provider) { 534 service()->AddProviderForTesting(provider); 535 } 536 537 void MockSyncStartFlare(bool* was_called, 538 syncer::ModelType* model_type_passed_in, 539 syncer::ModelType model_type) { 540 *was_called = true; 541 *model_type_passed_in = model_type; 542 } 543 544 protected: 545 // Paths to some of the fake extensions. 546 base::FilePath good0_path() { 547 return data_dir() 548 .AppendASCII("good") 549 .AppendASCII("Extensions") 550 .AppendASCII(good0) 551 .AppendASCII("1.0.0.0"); 552 } 553 554 base::FilePath good1_path() { 555 return data_dir() 556 .AppendASCII("good") 557 .AppendASCII("Extensions") 558 .AppendASCII(good1) 559 .AppendASCII("2"); 560 } 561 562 base::FilePath good2_path() { 563 return data_dir() 564 .AppendASCII("good") 565 .AppendASCII("Extensions") 566 .AppendASCII(good2) 567 .AppendASCII("1.0"); 568 } 569 570 void TestExternalProvider(MockExtensionProvider* provider, 571 Manifest::Location location); 572 573 void PackCRX(const base::FilePath& dir_path, 574 const base::FilePath& pem_path, 575 const base::FilePath& crx_path) { 576 // Use the existing pem key, if provided. 577 base::FilePath pem_output_path; 578 if (pem_path.value().empty()) { 579 pem_output_path = crx_path.DirName().AppendASCII("temp.pem"); 580 } else { 581 ASSERT_TRUE(base::PathExists(pem_path)); 582 } 583 584 ASSERT_TRUE(base::DeleteFile(crx_path, false)); 585 586 scoped_ptr<ExtensionCreator> creator(new ExtensionCreator()); 587 ASSERT_TRUE(creator->Run(dir_path, 588 crx_path, 589 pem_path, 590 pem_output_path, 591 ExtensionCreator::kOverwriteCRX)); 592 593 ASSERT_TRUE(base::PathExists(crx_path)); 594 } 595 596 enum InstallState { 597 INSTALL_FAILED, 598 INSTALL_UPDATED, 599 INSTALL_NEW, 600 INSTALL_WITHOUT_LOAD, 601 }; 602 603 const Extension* PackAndInstallCRX(const base::FilePath& dir_path, 604 const base::FilePath& pem_path, 605 InstallState install_state, 606 int creation_flags) { 607 base::FilePath crx_path; 608 base::ScopedTempDir temp_dir; 609 EXPECT_TRUE(temp_dir.CreateUniqueTempDir()); 610 crx_path = temp_dir.path().AppendASCII("temp.crx"); 611 612 PackCRX(dir_path, pem_path, crx_path); 613 return InstallCRX(crx_path, install_state, creation_flags); 614 } 615 616 const Extension* PackAndInstallCRX(const base::FilePath& dir_path, 617 const base::FilePath& pem_path, 618 InstallState install_state) { 619 return PackAndInstallCRX(dir_path, pem_path, install_state, 620 Extension::NO_FLAGS); 621 } 622 623 const Extension* PackAndInstallCRX(const base::FilePath& dir_path, 624 InstallState install_state) { 625 return PackAndInstallCRX(dir_path, base::FilePath(), install_state, 626 Extension::NO_FLAGS); 627 } 628 629 // Attempts to install an extension. Use INSTALL_FAILED if the installation 630 // is expected to fail. 631 // If |install_state| is INSTALL_UPDATED, and |expected_old_name| is 632 // non-empty, expects that the existing extension's title was 633 // |expected_old_name|. 634 const Extension* InstallCRX(const base::FilePath& path, 635 InstallState install_state, 636 int creation_flags, 637 const std::string& expected_old_name) { 638 InstallCRXInternal(path, creation_flags); 639 return VerifyCrxInstall(path, install_state, expected_old_name); 640 } 641 642 // Attempts to install an extension. Use INSTALL_FAILED if the installation 643 // is expected to fail. 644 const Extension* InstallCRX(const base::FilePath& path, 645 InstallState install_state, 646 int creation_flags) { 647 return InstallCRX(path, install_state, creation_flags, std::string()); 648 } 649 650 // Attempts to install an extension. Use INSTALL_FAILED if the installation 651 // is expected to fail. 652 const Extension* InstallCRX(const base::FilePath& path, 653 InstallState install_state) { 654 return InstallCRX(path, install_state, Extension::NO_FLAGS); 655 } 656 657 const Extension* InstallCRXFromWebStore(const base::FilePath& path, 658 InstallState install_state) { 659 InstallCRXInternal(path, Extension::FROM_WEBSTORE); 660 return VerifyCrxInstall(path, install_state); 661 } 662 663 const Extension* InstallCRXWithLocation(const base::FilePath& crx_path, 664 Manifest::Location install_location, 665 InstallState install_state) { 666 EXPECT_TRUE(base::PathExists(crx_path)) 667 << "Path does not exist: "<< crx_path.value().c_str(); 668 // no client (silent install) 669 scoped_refptr<CrxInstaller> installer( 670 CrxInstaller::CreateSilent(service())); 671 installer->set_install_source(install_location); 672 673 content::WindowedNotificationObserver observer( 674 extensions::NOTIFICATION_CRX_INSTALLER_DONE, 675 content::NotificationService::AllSources()); 676 installer->InstallCrx(crx_path); 677 observer.Wait(); 678 679 return VerifyCrxInstall(crx_path, install_state); 680 } 681 682 // Verifies the result of a CRX installation. Used by InstallCRX. Set the 683 // |install_state| to INSTALL_FAILED if the installation is expected to fail. 684 // Returns an Extension pointer if the install succeeded, NULL otherwise. 685 const Extension* VerifyCrxInstall(const base::FilePath& path, 686 InstallState install_state) { 687 return VerifyCrxInstall(path, install_state, std::string()); 688 } 689 690 // Verifies the result of a CRX installation. Used by InstallCRX. Set the 691 // |install_state| to INSTALL_FAILED if the installation is expected to fail. 692 // If |install_state| is INSTALL_UPDATED, and |expected_old_name| is 693 // non-empty, expects that the existing extension's title was 694 // |expected_old_name|. 695 // Returns an Extension pointer if the install succeeded, NULL otherwise. 696 const Extension* VerifyCrxInstall(const base::FilePath& path, 697 InstallState install_state, 698 const std::string& expected_old_name) { 699 std::vector<base::string16> errors = GetErrors(); 700 const Extension* extension = NULL; 701 if (install_state != INSTALL_FAILED) { 702 if (install_state == INSTALL_NEW) 703 ++expected_extensions_count_; 704 705 EXPECT_TRUE(installed_) << path.value(); 706 // If and only if INSTALL_UPDATED, it should have the is_update flag. 707 EXPECT_EQ(install_state == INSTALL_UPDATED, was_update_) 708 << path.value(); 709 // If INSTALL_UPDATED, old_name_ should match the given string. 710 if (install_state == INSTALL_UPDATED && !expected_old_name.empty()) 711 EXPECT_EQ(expected_old_name, old_name_); 712 EXPECT_EQ(0u, errors.size()) << path.value(); 713 714 if (install_state == INSTALL_WITHOUT_LOAD) { 715 EXPECT_EQ(0u, loaded_.size()) << path.value(); 716 } else { 717 EXPECT_EQ(1u, loaded_.size()) << path.value(); 718 size_t actual_extension_count = 719 registry()->enabled_extensions().size() + 720 registry()->disabled_extensions().size(); 721 EXPECT_EQ(expected_extensions_count_, actual_extension_count) << 722 path.value(); 723 extension = loaded_[0].get(); 724 EXPECT_TRUE(service()->GetExtensionById(extension->id(), false)) 725 << path.value(); 726 } 727 728 for (std::vector<base::string16>::iterator err = errors.begin(); 729 err != errors.end(); ++err) { 730 LOG(ERROR) << *err; 731 } 732 } else { 733 EXPECT_FALSE(installed_) << path.value(); 734 EXPECT_EQ(0u, loaded_.size()) << path.value(); 735 EXPECT_EQ(1u, errors.size()) << path.value(); 736 } 737 738 installed_ = NULL; 739 was_update_ = false; 740 old_name_ = ""; 741 loaded_.clear(); 742 ExtensionErrorReporter::GetInstance()->ClearErrors(); 743 return extension; 744 } 745 746 enum UpdateState { 747 FAILED_SILENTLY, 748 FAILED, 749 UPDATED, 750 INSTALLED, 751 DISABLED, 752 ENABLED 753 }; 754 755 void BlackListWebGL() { 756 static const std::string json_blacklist = 757 "{\n" 758 " \"name\": \"gpu blacklist\",\n" 759 " \"version\": \"1.0\",\n" 760 " \"entries\": [\n" 761 " {\n" 762 " \"id\": 1,\n" 763 " \"features\": [\"webgl\"]\n" 764 " }\n" 765 " ]\n" 766 "}"; 767 gpu::GPUInfo gpu_info; 768 content::GpuDataManager::GetInstance()->InitializeForTesting( 769 json_blacklist, gpu_info); 770 } 771 772 // Helper method to set up a WindowedNotificationObserver to wait for a 773 // specific CrxInstaller to finish if we don't know the value of the 774 // |installer| yet. 775 static bool IsCrxInstallerDone(extensions::CrxInstaller** installer, 776 const content::NotificationSource& source, 777 const content::NotificationDetails& details) { 778 return content::Source<extensions::CrxInstaller>(source).ptr() == 779 *installer; 780 } 781 782 void PackCRXAndUpdateExtension(const std::string& id, 783 const base::FilePath& dir_path, 784 const base::FilePath& pem_path, 785 UpdateState expected_state) { 786 base::ScopedTempDir temp_dir; 787 EXPECT_TRUE(temp_dir.CreateUniqueTempDir()); 788 base::FilePath crx_path = temp_dir.path().AppendASCII("temp.crx"); 789 790 PackCRX(dir_path, pem_path, crx_path); 791 UpdateExtension(id, crx_path, expected_state); 792 } 793 794 void UpdateExtension(const std::string& id, 795 const base::FilePath& in_path, 796 UpdateState expected_state) { 797 ASSERT_TRUE(base::PathExists(in_path)); 798 799 // We need to copy this to a temporary location because Update() will delete 800 // it. 801 base::FilePath path = temp_dir().path(); 802 path = path.Append(in_path.BaseName()); 803 ASSERT_TRUE(base::CopyFile(in_path, path)); 804 805 int previous_enabled_extension_count = 806 registry()->enabled_extensions().size(); 807 int previous_installed_extension_count = 808 previous_enabled_extension_count + 809 registry()->disabled_extensions().size(); 810 811 extensions::CrxInstaller* installer = NULL; 812 content::WindowedNotificationObserver observer( 813 extensions::NOTIFICATION_CRX_INSTALLER_DONE, 814 base::Bind(&IsCrxInstallerDone, &installer)); 815 service()->UpdateExtension(id, path, true, &installer); 816 817 if (installer) 818 observer.Wait(); 819 else 820 base::RunLoop().RunUntilIdle(); 821 822 std::vector<base::string16> errors = GetErrors(); 823 int error_count = errors.size(); 824 int enabled_extension_count = registry()->enabled_extensions().size(); 825 int installed_extension_count = 826 enabled_extension_count + registry()->disabled_extensions().size(); 827 828 int expected_error_count = (expected_state == FAILED) ? 1 : 0; 829 EXPECT_EQ(expected_error_count, error_count) << path.value(); 830 831 if (expected_state <= FAILED) { 832 EXPECT_EQ(previous_enabled_extension_count, 833 enabled_extension_count); 834 EXPECT_EQ(previous_installed_extension_count, 835 installed_extension_count); 836 } else { 837 int expected_installed_extension_count = 838 (expected_state >= INSTALLED) ? 1 : 0; 839 int expected_enabled_extension_count = 840 (expected_state >= ENABLED) ? 1 : 0; 841 EXPECT_EQ(expected_installed_extension_count, 842 installed_extension_count); 843 EXPECT_EQ(expected_enabled_extension_count, 844 enabled_extension_count); 845 } 846 847 // Update() should the temporary input file. 848 EXPECT_FALSE(base::PathExists(path)); 849 } 850 851 void TerminateExtension(const std::string& id) { 852 const Extension* extension = service()->GetInstalledExtension(id); 853 if (!extension) { 854 ADD_FAILURE(); 855 return; 856 } 857 service()->TrackTerminatedExtensionForTest(extension); 858 } 859 860 size_t GetPrefKeyCount() { 861 const base::DictionaryValue* dict = 862 profile()->GetPrefs()->GetDictionary("extensions.settings"); 863 if (!dict) { 864 ADD_FAILURE(); 865 return 0; 866 } 867 return dict->size(); 868 } 869 870 void UninstallExtension(const std::string& id, bool use_helper) { 871 // Verify that the extension is installed. 872 base::FilePath extension_path = extensions_install_dir().AppendASCII(id); 873 EXPECT_TRUE(base::PathExists(extension_path)); 874 size_t pref_key_count = GetPrefKeyCount(); 875 EXPECT_GT(pref_key_count, 0u); 876 ValidateIntegerPref(id, "state", Extension::ENABLED); 877 878 // Uninstall it. 879 if (use_helper) { 880 EXPECT_TRUE(ExtensionService::UninstallExtensionHelper( 881 service(), id, extensions::UNINSTALL_REASON_FOR_TESTING)); 882 } else { 883 EXPECT_TRUE(service()->UninstallExtension( 884 id, 885 extensions::UNINSTALL_REASON_FOR_TESTING, 886 base::Bind(&base::DoNothing), 887 NULL)); 888 } 889 --expected_extensions_count_; 890 891 // We should get an unload notification. 892 EXPECT_FALSE(unloaded_id_.empty()); 893 EXPECT_EQ(id, unloaded_id_); 894 895 // Verify uninstalled state. 896 size_t new_pref_key_count = GetPrefKeyCount(); 897 if (new_pref_key_count == pref_key_count) { 898 ValidateIntegerPref(id, "state", 899 Extension::EXTERNAL_EXTENSION_UNINSTALLED); 900 } else { 901 EXPECT_EQ(new_pref_key_count, pref_key_count - 1); 902 } 903 904 // The extension should not be in the service anymore. 905 EXPECT_FALSE(service()->GetInstalledExtension(id)); 906 base::RunLoop().RunUntilIdle(); 907 908 // The directory should be gone. 909 EXPECT_FALSE(base::PathExists(extension_path)); 910 } 911 912 void ValidatePrefKeyCount(size_t count) { 913 EXPECT_EQ(count, GetPrefKeyCount()); 914 } 915 916 testing::AssertionResult ValidateBooleanPref( 917 const std::string& extension_id, 918 const std::string& pref_path, 919 bool expected_val) { 920 std::string msg = "while checking: "; 921 msg += extension_id; 922 msg += " "; 923 msg += pref_path; 924 msg += " == "; 925 msg += expected_val ? "true" : "false"; 926 927 PrefService* prefs = profile()->GetPrefs(); 928 const base::DictionaryValue* dict = 929 prefs->GetDictionary("extensions.settings"); 930 if (!dict) { 931 return testing::AssertionFailure() 932 << "extension.settings does not exist " << msg; 933 } 934 935 const base::DictionaryValue* pref = NULL; 936 if (!dict->GetDictionary(extension_id, &pref)) { 937 return testing::AssertionFailure() 938 << "extension pref does not exist " << msg; 939 } 940 941 bool val; 942 if (!pref->GetBoolean(pref_path, &val)) { 943 return testing::AssertionFailure() 944 << pref_path << " pref not found " << msg; 945 } 946 947 return expected_val == val 948 ? testing::AssertionSuccess() 949 : testing::AssertionFailure() << "base::Value is incorrect " << msg; 950 } 951 952 bool IsPrefExist(const std::string& extension_id, 953 const std::string& pref_path) { 954 const base::DictionaryValue* dict = 955 profile()->GetPrefs()->GetDictionary("extensions.settings"); 956 if (dict == NULL) return false; 957 const base::DictionaryValue* pref = NULL; 958 if (!dict->GetDictionary(extension_id, &pref)) { 959 return false; 960 } 961 if (pref == NULL) { 962 return false; 963 } 964 bool val; 965 if (!pref->GetBoolean(pref_path, &val)) { 966 return false; 967 } 968 return true; 969 } 970 971 void ValidateIntegerPref(const std::string& extension_id, 972 const std::string& pref_path, 973 int expected_val) { 974 std::string msg = " while checking: "; 975 msg += extension_id; 976 msg += " "; 977 msg += pref_path; 978 msg += " == "; 979 msg += base::IntToString(expected_val); 980 981 PrefService* prefs = profile()->GetPrefs(); 982 const base::DictionaryValue* dict = 983 prefs->GetDictionary("extensions.settings"); 984 ASSERT_TRUE(dict != NULL) << msg; 985 const base::DictionaryValue* pref = NULL; 986 ASSERT_TRUE(dict->GetDictionary(extension_id, &pref)) << msg; 987 EXPECT_TRUE(pref != NULL) << msg; 988 int val; 989 ASSERT_TRUE(pref->GetInteger(pref_path, &val)) << msg; 990 EXPECT_EQ(expected_val, val) << msg; 991 } 992 993 void ValidateStringPref(const std::string& extension_id, 994 const std::string& pref_path, 995 const std::string& expected_val) { 996 std::string msg = " while checking: "; 997 msg += extension_id; 998 msg += ".manifest."; 999 msg += pref_path; 1000 msg += " == "; 1001 msg += expected_val; 1002 1003 const base::DictionaryValue* dict = 1004 profile()->GetPrefs()->GetDictionary("extensions.settings"); 1005 ASSERT_TRUE(dict != NULL) << msg; 1006 const base::DictionaryValue* pref = NULL; 1007 std::string manifest_path = extension_id + ".manifest"; 1008 ASSERT_TRUE(dict->GetDictionary(manifest_path, &pref)) << msg; 1009 EXPECT_TRUE(pref != NULL) << msg; 1010 std::string val; 1011 ASSERT_TRUE(pref->GetString(pref_path, &val)) << msg; 1012 EXPECT_EQ(expected_val, val) << msg; 1013 } 1014 1015 void SetPref(const std::string& extension_id, 1016 const std::string& pref_path, 1017 base::Value* value, 1018 const std::string& msg) { 1019 DictionaryPrefUpdate update(profile()->GetPrefs(), "extensions.settings"); 1020 base::DictionaryValue* dict = update.Get(); 1021 ASSERT_TRUE(dict != NULL) << msg; 1022 base::DictionaryValue* pref = NULL; 1023 ASSERT_TRUE(dict->GetDictionary(extension_id, &pref)) << msg; 1024 EXPECT_TRUE(pref != NULL) << msg; 1025 pref->Set(pref_path, value); 1026 } 1027 1028 void SetPrefInteg(const std::string& extension_id, 1029 const std::string& pref_path, 1030 int value) { 1031 std::string msg = " while setting: "; 1032 msg += extension_id; 1033 msg += " "; 1034 msg += pref_path; 1035 msg += " = "; 1036 msg += base::IntToString(value); 1037 1038 SetPref(extension_id, pref_path, new base::FundamentalValue(value), msg); 1039 } 1040 1041 void SetPrefBool(const std::string& extension_id, 1042 const std::string& pref_path, 1043 bool value) { 1044 std::string msg = " while setting: "; 1045 msg += extension_id + " " + pref_path; 1046 msg += " = "; 1047 msg += (value ? "true" : "false"); 1048 1049 SetPref(extension_id, pref_path, new base::FundamentalValue(value), msg); 1050 } 1051 1052 void ClearPref(const std::string& extension_id, 1053 const std::string& pref_path) { 1054 std::string msg = " while clearing: "; 1055 msg += extension_id + " " + pref_path; 1056 1057 DictionaryPrefUpdate update(profile()->GetPrefs(), "extensions.settings"); 1058 base::DictionaryValue* dict = update.Get(); 1059 ASSERT_TRUE(dict != NULL) << msg; 1060 base::DictionaryValue* pref = NULL; 1061 ASSERT_TRUE(dict->GetDictionary(extension_id, &pref)) << msg; 1062 EXPECT_TRUE(pref != NULL) << msg; 1063 pref->Remove(pref_path, NULL); 1064 } 1065 1066 void SetPrefStringSet(const std::string& extension_id, 1067 const std::string& pref_path, 1068 const std::set<std::string>& value) { 1069 std::string msg = " while setting: "; 1070 msg += extension_id + " " + pref_path; 1071 1072 base::ListValue* list_value = new base::ListValue(); 1073 for (std::set<std::string>::const_iterator iter = value.begin(); 1074 iter != value.end(); ++iter) 1075 list_value->Append(new base::StringValue(*iter)); 1076 1077 SetPref(extension_id, pref_path, list_value, msg); 1078 } 1079 1080 void InitPluginService() { 1081 #if defined(ENABLE_PLUGINS) 1082 PluginService::GetInstance()->Init(); 1083 #endif 1084 } 1085 1086 void InitializeExtensionSyncService() { 1087 extension_sync_service_.reset(new ExtensionSyncService( 1088 profile(), ExtensionPrefs::Get(browser_context()), service())); 1089 } 1090 1091 void InitializeEmptyExtensionServiceWithTestingPrefs() { 1092 ExtensionServiceTestBase::ExtensionServiceInitParams params = 1093 CreateDefaultInitParams(); 1094 params.pref_file = base::FilePath(); 1095 InitializeExtensionService(params); 1096 } 1097 1098 extensions::ManagementPolicy* GetManagementPolicy() { 1099 return ExtensionSystem::Get(browser_context())->management_policy(); 1100 } 1101 1102 ExtensionSyncService* extension_sync_service() { 1103 return extension_sync_service_.get(); 1104 } 1105 1106 protected: 1107 typedef extensions::ExtensionManagementPrefUpdater<TestingPrefServiceSyncable> 1108 ManagementPrefUpdater; 1109 scoped_ptr<ExtensionSyncService> extension_sync_service_; 1110 extensions::ExtensionList loaded_; 1111 std::string unloaded_id_; 1112 UnloadedExtensionInfo::Reason unloaded_reason_; 1113 const Extension* installed_; 1114 bool was_update_; 1115 std::string old_name_; 1116 FeatureSwitch::ScopedOverride override_external_install_prompt_; 1117 1118 private: 1119 // Create a CrxInstaller and install the CRX file. 1120 // Instead of calling this method yourself, use InstallCRX(), which does extra 1121 // error checking. 1122 void InstallCRXInternal(const base::FilePath& crx_path) { 1123 InstallCRXInternal(crx_path, Extension::NO_FLAGS); 1124 } 1125 1126 void InstallCRXInternal(const base::FilePath& crx_path, int creation_flags) { 1127 ASSERT_TRUE(base::PathExists(crx_path)) 1128 << "Path does not exist: "<< crx_path.value().c_str(); 1129 scoped_refptr<CrxInstaller> installer( 1130 CrxInstaller::CreateSilent(service())); 1131 installer->set_creation_flags(creation_flags); 1132 if (!(creation_flags & Extension::WAS_INSTALLED_BY_DEFAULT)) 1133 installer->set_allow_silent_install(true); 1134 1135 content::WindowedNotificationObserver observer( 1136 extensions::NOTIFICATION_CRX_INSTALLER_DONE, 1137 content::Source<extensions::CrxInstaller>(installer.get())); 1138 1139 installer->InstallCrx(crx_path); 1140 1141 observer.Wait(); 1142 } 1143 1144 size_t expected_extensions_count_; 1145 content::NotificationRegistrar registrar_; 1146 }; 1147 1148 // Receives notifications from a PackExtensionJob, indicating either that 1149 // packing succeeded or that there was some error. 1150 class PackExtensionTestClient : public extensions::PackExtensionJob::Client { 1151 public: 1152 PackExtensionTestClient(const base::FilePath& expected_crx_path, 1153 const base::FilePath& expected_private_key_path); 1154 virtual void OnPackSuccess(const base::FilePath& crx_path, 1155 const base::FilePath& private_key_path) OVERRIDE; 1156 virtual void OnPackFailure(const std::string& error_message, 1157 ExtensionCreator::ErrorType type) OVERRIDE; 1158 1159 private: 1160 const base::FilePath expected_crx_path_; 1161 const base::FilePath expected_private_key_path_; 1162 DISALLOW_COPY_AND_ASSIGN(PackExtensionTestClient); 1163 }; 1164 1165 PackExtensionTestClient::PackExtensionTestClient( 1166 const base::FilePath& expected_crx_path, 1167 const base::FilePath& expected_private_key_path) 1168 : expected_crx_path_(expected_crx_path), 1169 expected_private_key_path_(expected_private_key_path) {} 1170 1171 // If packing succeeded, we make sure that the package names match our 1172 // expectations. 1173 void PackExtensionTestClient::OnPackSuccess( 1174 const base::FilePath& crx_path, 1175 const base::FilePath& private_key_path) { 1176 // We got the notification and processed it; we don't expect any further tasks 1177 // to be posted to the current thread, so we should stop blocking and continue 1178 // on with the rest of the test. 1179 // This call to |Quit()| matches the call to |Run()| in the 1180 // |PackPunctuatedExtension| test. 1181 base::MessageLoop::current()->Quit(); 1182 EXPECT_EQ(expected_crx_path_.value(), crx_path.value()); 1183 EXPECT_EQ(expected_private_key_path_.value(), private_key_path.value()); 1184 ASSERT_TRUE(base::PathExists(private_key_path)); 1185 } 1186 1187 // The tests are designed so that we never expect to see a packing error. 1188 void PackExtensionTestClient::OnPackFailure(const std::string& error_message, 1189 ExtensionCreator::ErrorType type) { 1190 if (type == ExtensionCreator::kCRXExists) 1191 FAIL() << "Packing should not fail."; 1192 else 1193 FAIL() << "Existing CRX should have been overwritten."; 1194 } 1195 1196 // Test loading good extensions from the profile directory. 1197 TEST_F(ExtensionServiceTest, LoadAllExtensionsFromDirectorySuccess) { 1198 InitPluginService(); 1199 InitializeGoodInstalledExtensionService(); 1200 service()->Init(); 1201 1202 uint32 expected_num_extensions = 3u; 1203 ASSERT_EQ(expected_num_extensions, loaded_.size()); 1204 1205 EXPECT_EQ(std::string(good0), loaded_[0]->id()); 1206 EXPECT_EQ(std::string("My extension 1"), 1207 loaded_[0]->name()); 1208 EXPECT_EQ(std::string("The first extension that I made."), 1209 loaded_[0]->description()); 1210 EXPECT_EQ(Manifest::INTERNAL, loaded_[0]->location()); 1211 EXPECT_TRUE(service()->GetExtensionById(loaded_[0]->id(), false)); 1212 EXPECT_EQ(expected_num_extensions, registry()->enabled_extensions().size()); 1213 1214 ValidatePrefKeyCount(3); 1215 ValidateIntegerPref(good0, "state", Extension::ENABLED); 1216 ValidateIntegerPref(good0, "location", Manifest::INTERNAL); 1217 ValidateIntegerPref(good1, "state", Extension::ENABLED); 1218 ValidateIntegerPref(good1, "location", Manifest::INTERNAL); 1219 ValidateIntegerPref(good2, "state", Extension::ENABLED); 1220 ValidateIntegerPref(good2, "location", Manifest::INTERNAL); 1221 1222 URLPatternSet expected_patterns; 1223 AddPattern(&expected_patterns, "file:///*"); 1224 AddPattern(&expected_patterns, "http://*.google.com/*"); 1225 AddPattern(&expected_patterns, "https://*.google.com/*"); 1226 const Extension* extension = loaded_[0].get(); 1227 const extensions::UserScriptList& scripts = 1228 extensions::ContentScriptsInfo::GetContentScripts(extension); 1229 ASSERT_EQ(2u, scripts.size()); 1230 EXPECT_EQ(expected_patterns, scripts[0].url_patterns()); 1231 EXPECT_EQ(2u, scripts[0].js_scripts().size()); 1232 ExtensionResource resource00(extension->id(), 1233 scripts[0].js_scripts()[0].extension_root(), 1234 scripts[0].js_scripts()[0].relative_path()); 1235 base::FilePath expected_path = 1236 base::MakeAbsoluteFilePath(extension->path().AppendASCII("script1.js")); 1237 EXPECT_TRUE(resource00.ComparePathWithDefault(expected_path)); 1238 ExtensionResource resource01(extension->id(), 1239 scripts[0].js_scripts()[1].extension_root(), 1240 scripts[0].js_scripts()[1].relative_path()); 1241 expected_path = 1242 base::MakeAbsoluteFilePath(extension->path().AppendASCII("script2.js")); 1243 EXPECT_TRUE(resource01.ComparePathWithDefault(expected_path)); 1244 EXPECT_TRUE(!extensions::PluginInfo::HasPlugins(extension)); 1245 EXPECT_EQ(1u, scripts[1].url_patterns().patterns().size()); 1246 EXPECT_EQ("http://*.news.com/*", 1247 scripts[1].url_patterns().begin()->GetAsString()); 1248 ExtensionResource resource10(extension->id(), 1249 scripts[1].js_scripts()[0].extension_root(), 1250 scripts[1].js_scripts()[0].relative_path()); 1251 expected_path = 1252 extension->path().AppendASCII("js_files").AppendASCII("script3.js"); 1253 expected_path = base::MakeAbsoluteFilePath(expected_path); 1254 EXPECT_TRUE(resource10.ComparePathWithDefault(expected_path)); 1255 1256 expected_patterns.ClearPatterns(); 1257 AddPattern(&expected_patterns, "http://*.google.com/*"); 1258 AddPattern(&expected_patterns, "https://*.google.com/*"); 1259 EXPECT_EQ( 1260 expected_patterns, 1261 extension->permissions_data()->active_permissions()->explicit_hosts()); 1262 1263 EXPECT_EQ(std::string(good1), loaded_[1]->id()); 1264 EXPECT_EQ(std::string("My extension 2"), loaded_[1]->name()); 1265 EXPECT_EQ(std::string(), loaded_[1]->description()); 1266 EXPECT_EQ(loaded_[1]->GetResourceURL("background.html"), 1267 extensions::BackgroundInfo::GetBackgroundURL(loaded_[1].get())); 1268 EXPECT_EQ(0u, 1269 extensions::ContentScriptsInfo::GetContentScripts(loaded_[1].get()) 1270 .size()); 1271 1272 // We don't parse the plugins section on Chrome OS. 1273 #if defined(OS_CHROMEOS) 1274 EXPECT_TRUE(!extensions::PluginInfo::HasPlugins(loaded_[1].get())); 1275 #else 1276 ASSERT_TRUE(extensions::PluginInfo::HasPlugins(loaded_[1].get())); 1277 const std::vector<extensions::PluginInfo>* plugins = 1278 extensions::PluginInfo::GetPlugins(loaded_[1].get()); 1279 ASSERT_TRUE(plugins); 1280 ASSERT_EQ(2u, plugins->size()); 1281 EXPECT_EQ(loaded_[1]->path().AppendASCII("content_plugin.dll").value(), 1282 plugins->at(0).path.value()); 1283 EXPECT_TRUE(plugins->at(0).is_public); 1284 EXPECT_EQ(loaded_[1]->path().AppendASCII("extension_plugin.dll").value(), 1285 plugins->at(1).path.value()); 1286 EXPECT_FALSE(plugins->at(1).is_public); 1287 #endif 1288 1289 EXPECT_EQ(Manifest::INTERNAL, loaded_[1]->location()); 1290 1291 int index = expected_num_extensions - 1; 1292 EXPECT_EQ(std::string(good2), loaded_[index]->id()); 1293 EXPECT_EQ(std::string("My extension 3"), loaded_[index]->name()); 1294 EXPECT_EQ(std::string(), loaded_[index]->description()); 1295 EXPECT_EQ(0u, 1296 extensions::ContentScriptsInfo::GetContentScripts( 1297 loaded_[index].get()).size()); 1298 EXPECT_EQ(Manifest::INTERNAL, loaded_[index]->location()); 1299 }; 1300 1301 // Test loading bad extensions from the profile directory. 1302 TEST_F(ExtensionServiceTest, LoadAllExtensionsFromDirectoryFail) { 1303 // Initialize the test dir with a bad Preferences/extensions. 1304 base::FilePath source_install_dir = 1305 data_dir().AppendASCII("bad").AppendASCII("Extensions"); 1306 base::FilePath pref_path = 1307 source_install_dir.DirName().Append(chrome::kPreferencesFilename); 1308 1309 InitializeInstalledExtensionService(pref_path, source_install_dir); 1310 1311 service()->Init(); 1312 1313 ASSERT_EQ(4u, GetErrors().size()); 1314 ASSERT_EQ(0u, loaded_.size()); 1315 1316 EXPECT_TRUE(MatchPattern(base::UTF16ToUTF8(GetErrors()[0]), 1317 std::string("Could not load extension from '*'. ") + 1318 extensions::manifest_errors::kManifestUnreadable)) << 1319 base::UTF16ToUTF8(GetErrors()[0]); 1320 1321 EXPECT_TRUE(MatchPattern(base::UTF16ToUTF8(GetErrors()[1]), 1322 std::string("Could not load extension from '*'. ") + 1323 extensions::manifest_errors::kManifestUnreadable)) << 1324 base::UTF16ToUTF8(GetErrors()[1]); 1325 1326 EXPECT_TRUE(MatchPattern(base::UTF16ToUTF8(GetErrors()[2]), 1327 std::string("Could not load extension from '*'. ") + 1328 extensions::manifest_errors::kMissingFile)) << 1329 base::UTF16ToUTF8(GetErrors()[2]); 1330 1331 EXPECT_TRUE(MatchPattern(base::UTF16ToUTF8(GetErrors()[3]), 1332 std::string("Could not load extension from '*'. ") + 1333 extensions::manifest_errors::kManifestUnreadable)) << 1334 base::UTF16ToUTF8(GetErrors()[3]); 1335 }; 1336 1337 // Test various cases for delayed install because of missing imports. 1338 TEST_F(ExtensionServiceTest, PendingImports) { 1339 InitPluginService(); 1340 1341 base::FilePath source_install_dir = 1342 data_dir().AppendASCII("pending_updates_with_imports").AppendASCII( 1343 "Extensions"); 1344 base::FilePath pref_path = 1345 source_install_dir.DirName().Append(chrome::kPreferencesFilename); 1346 1347 InitializeInstalledExtensionService(pref_path, source_install_dir); 1348 1349 // Verify there are no pending extensions initially. 1350 EXPECT_FALSE(service()->pending_extension_manager()->HasPendingExtensions()); 1351 1352 service()->Init(); 1353 // Wait for GarbageCollectExtensions task to complete. 1354 base::RunLoop().RunUntilIdle(); 1355 1356 // These extensions are used by the extensions we test below, they must be 1357 // installed. 1358 EXPECT_TRUE(base::PathExists(extensions_install_dir().AppendASCII( 1359 "bjafgdebaacbbbecmhlhpofkepfkgcpa/1.0"))); 1360 EXPECT_TRUE(base::PathExists(extensions_install_dir().AppendASCII( 1361 "hpiknbiabeeppbpihjehijgoemciehgk/2"))); 1362 1363 // Each of these extensions should have been rejected because of dependencies 1364 // that cannot be satisfied. 1365 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile()); 1366 EXPECT_FALSE( 1367 prefs->GetDelayedInstallInfo("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")); 1368 EXPECT_FALSE( 1369 prefs->GetInstalledExtensionInfo("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")); 1370 EXPECT_FALSE( 1371 prefs->GetDelayedInstallInfo("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb")); 1372 EXPECT_FALSE( 1373 prefs->GetInstalledExtensionInfo("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb")); 1374 EXPECT_FALSE( 1375 prefs->GetDelayedInstallInfo("cccccccccccccccccccccccccccccccc")); 1376 EXPECT_FALSE( 1377 prefs->GetInstalledExtensionInfo("cccccccccccccccccccccccccccccccc")); 1378 1379 // Make sure the import started for the extension with a dependency. 1380 EXPECT_TRUE( 1381 prefs->GetDelayedInstallInfo("behllobkkfkfnphdnhnkndlbkcpglgmj")); 1382 EXPECT_EQ(ExtensionPrefs::DELAY_REASON_WAIT_FOR_IMPORTS, 1383 prefs->GetDelayedInstallReason("behllobkkfkfnphdnhnkndlbkcpglgmj")); 1384 1385 EXPECT_FALSE(base::PathExists(extensions_install_dir().AppendASCII( 1386 "behllobkkfkfnphdnhnkndlbkcpglgmj/1.0.0.0"))); 1387 1388 EXPECT_TRUE(service()->pending_extension_manager()->HasPendingExtensions()); 1389 std::string pending_id("eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"); 1390 EXPECT_TRUE(service()->pending_extension_manager()->IsIdPending(pending_id)); 1391 // Remove it because we are not testing the pending extension manager's 1392 // ability to download and install extensions. 1393 EXPECT_TRUE(service()->pending_extension_manager()->Remove(pending_id)); 1394 } 1395 1396 // Test installing extensions. This test tries to install few extensions using 1397 // crx files. If you need to change those crx files, feel free to repackage 1398 // them, throw away the key used and change the id's above. 1399 TEST_F(ExtensionServiceTest, InstallExtension) { 1400 InitializeEmptyExtensionService(); 1401 1402 // Extensions not enabled. 1403 service()->set_extensions_enabled(false); 1404 base::FilePath path = data_dir().AppendASCII("good.crx"); 1405 InstallCRX(path, INSTALL_FAILED); 1406 service()->set_extensions_enabled(true); 1407 1408 ValidatePrefKeyCount(0); 1409 1410 // A simple extension that should install without error. 1411 path = data_dir().AppendASCII("good.crx"); 1412 InstallCRX(path, INSTALL_NEW); 1413 // TODO(erikkay): verify the contents of the installed extension. 1414 1415 int pref_count = 0; 1416 ValidatePrefKeyCount(++pref_count); 1417 ValidateIntegerPref(good_crx, "state", Extension::ENABLED); 1418 ValidateIntegerPref(good_crx, "location", Manifest::INTERNAL); 1419 1420 // An extension with page actions. 1421 path = data_dir().AppendASCII("page_action.crx"); 1422 InstallCRX(path, INSTALL_NEW); 1423 ValidatePrefKeyCount(++pref_count); 1424 ValidateIntegerPref(page_action, "state", Extension::ENABLED); 1425 ValidateIntegerPref(page_action, "location", Manifest::INTERNAL); 1426 1427 // Bad signature. 1428 path = data_dir().AppendASCII("bad_signature.crx"); 1429 InstallCRX(path, INSTALL_FAILED); 1430 ValidatePrefKeyCount(pref_count); 1431 1432 // 0-length extension file. 1433 path = data_dir().AppendASCII("not_an_extension.crx"); 1434 InstallCRX(path, INSTALL_FAILED); 1435 ValidatePrefKeyCount(pref_count); 1436 1437 // Bad magic number. 1438 path = data_dir().AppendASCII("bad_magic.crx"); 1439 InstallCRX(path, INSTALL_FAILED); 1440 ValidatePrefKeyCount(pref_count); 1441 1442 // Packed extensions may have folders or files that have underscores. 1443 // This will only cause a warning, rather than a fatal error. 1444 path = data_dir().AppendASCII("bad_underscore.crx"); 1445 InstallCRX(path, INSTALL_NEW); 1446 ValidatePrefKeyCount(++pref_count); 1447 1448 // A test for an extension with a 2048-bit public key. 1449 path = data_dir().AppendASCII("good2048.crx"); 1450 InstallCRX(path, INSTALL_NEW); 1451 ValidatePrefKeyCount(++pref_count); 1452 ValidateIntegerPref(good2048, "state", Extension::ENABLED); 1453 ValidateIntegerPref(good2048, "location", Manifest::INTERNAL); 1454 1455 // TODO(erikkay): add more tests for many of the failure cases. 1456 // TODO(erikkay): add tests for upgrade cases. 1457 } 1458 1459 struct MockExtensionRegistryObserver 1460 : public extensions::ExtensionRegistryObserver { 1461 virtual void OnExtensionWillBeInstalled( 1462 content::BrowserContext* browser_context, 1463 const Extension* extension, 1464 bool is_update, 1465 bool from_ephemeral, 1466 const std::string& old_name) OVERRIDE { 1467 last_extension_installed = extension->id(); 1468 } 1469 1470 virtual void OnExtensionUninstalled( 1471 content::BrowserContext* browser_context, 1472 const Extension* extension, 1473 extensions::UninstallReason reason) OVERRIDE { 1474 last_extension_uninstalled = extension->id(); 1475 } 1476 1477 std::string last_extension_installed; 1478 std::string last_extension_uninstalled; 1479 }; 1480 1481 // Test that correct notifications are sent to ExtensionRegistryObserver on 1482 // extension install and uninstall. 1483 TEST_F(ExtensionServiceTest, InstallObserverNotified) { 1484 InitializeEmptyExtensionService(); 1485 1486 extensions::ExtensionRegistry* registry( 1487 extensions::ExtensionRegistry::Get(profile())); 1488 MockExtensionRegistryObserver observer; 1489 registry->AddObserver(&observer); 1490 1491 // A simple extension that should install without error. 1492 ASSERT_TRUE(observer.last_extension_installed.empty()); 1493 base::FilePath path = data_dir().AppendASCII("good.crx"); 1494 InstallCRX(path, INSTALL_NEW); 1495 ASSERT_EQ(good_crx, observer.last_extension_installed); 1496 1497 // Uninstall the extension. 1498 ASSERT_TRUE(observer.last_extension_uninstalled.empty()); 1499 UninstallExtension(good_crx, false); 1500 ASSERT_EQ(good_crx, observer.last_extension_uninstalled); 1501 1502 registry->RemoveObserver(&observer); 1503 } 1504 1505 // Tests that flags passed to OnExternalExtensionFileFound() make it to the 1506 // extension object. 1507 TEST_F(ExtensionServiceTest, InstallingExternalExtensionWithFlags) { 1508 const char kPrefFromBookmark[] = "from_bookmark"; 1509 1510 InitializeEmptyExtensionService(); 1511 1512 base::FilePath path = data_dir().AppendASCII("good.crx"); 1513 service()->set_extensions_enabled(true); 1514 1515 // Register and install an external extension. 1516 Version version("1.0.0.0"); 1517 content::WindowedNotificationObserver observer( 1518 extensions::NOTIFICATION_CRX_INSTALLER_DONE, 1519 content::NotificationService::AllSources()); 1520 if (service()->OnExternalExtensionFileFound(good_crx, 1521 &version, 1522 path, 1523 Manifest::EXTERNAL_PREF, 1524 Extension::FROM_BOOKMARK, 1525 false /* mark_acknowledged */)) { 1526 observer.Wait(); 1527 } 1528 1529 const Extension* extension = service()->GetExtensionById(good_crx, false); 1530 ASSERT_TRUE(extension); 1531 ASSERT_TRUE(extension->from_bookmark()); 1532 ASSERT_TRUE(ValidateBooleanPref(good_crx, kPrefFromBookmark, true)); 1533 1534 // Upgrade to version 2.0, the flag should be preserved. 1535 path = data_dir().AppendASCII("good2.crx"); 1536 UpdateExtension(good_crx, path, ENABLED); 1537 ASSERT_TRUE(ValidateBooleanPref(good_crx, kPrefFromBookmark, true)); 1538 extension = service()->GetExtensionById(good_crx, false); 1539 ASSERT_TRUE(extension); 1540 ASSERT_TRUE(extension->from_bookmark()); 1541 } 1542 1543 // Test the handling of Extension::EXTERNAL_EXTENSION_UNINSTALLED 1544 TEST_F(ExtensionServiceTest, UninstallingExternalExtensions) { 1545 InitializeEmptyExtensionService(); 1546 1547 base::FilePath path = data_dir().AppendASCII("good.crx"); 1548 service()->set_extensions_enabled(true); 1549 1550 // Install an external extension. 1551 Version version("1.0.0.0"); 1552 content::WindowedNotificationObserver observer( 1553 extensions::NOTIFICATION_CRX_INSTALLER_DONE, 1554 content::NotificationService::AllSources()); 1555 if (service()->OnExternalExtensionFileFound(good_crx, 1556 &version, 1557 path, 1558 Manifest::EXTERNAL_PREF, 1559 Extension::NO_FLAGS, 1560 false)) { 1561 observer.Wait(); 1562 } 1563 1564 ASSERT_TRUE(service()->GetExtensionById(good_crx, false)); 1565 1566 // Uninstall it and check that its killbit gets set. 1567 UninstallExtension(good_crx, false); 1568 ValidateIntegerPref(good_crx, "state", 1569 Extension::EXTERNAL_EXTENSION_UNINSTALLED); 1570 1571 // Try to re-install it externally. This should fail because of the killbit. 1572 service()->OnExternalExtensionFileFound(good_crx, 1573 &version, 1574 path, 1575 Manifest::EXTERNAL_PREF, 1576 Extension::NO_FLAGS, 1577 false); 1578 base::RunLoop().RunUntilIdle(); 1579 ASSERT_TRUE(NULL == service()->GetExtensionById(good_crx, false)); 1580 ValidateIntegerPref(good_crx, "state", 1581 Extension::EXTERNAL_EXTENSION_UNINSTALLED); 1582 1583 version = Version("1.0.0.1"); 1584 // Repeat the same thing with a newer version of the extension. 1585 path = data_dir().AppendASCII("good2.crx"); 1586 service()->OnExternalExtensionFileFound(good_crx, 1587 &version, 1588 path, 1589 Manifest::EXTERNAL_PREF, 1590 Extension::NO_FLAGS, 1591 false); 1592 base::RunLoop().RunUntilIdle(); 1593 ASSERT_TRUE(NULL == service()->GetExtensionById(good_crx, false)); 1594 ValidateIntegerPref(good_crx, "state", 1595 Extension::EXTERNAL_EXTENSION_UNINSTALLED); 1596 1597 // Try adding the same extension from an external update URL. 1598 ASSERT_FALSE(service()->pending_extension_manager()->AddFromExternalUpdateUrl( 1599 good_crx, 1600 std::string(), 1601 GURL("http:://fake.update/url"), 1602 Manifest::EXTERNAL_PREF_DOWNLOAD, 1603 Extension::NO_FLAGS, 1604 false)); 1605 1606 ASSERT_FALSE(service()->pending_extension_manager()->IsIdPending(good_crx)); 1607 } 1608 1609 // Test that uninstalling an external extension does not crash when 1610 // the extension could not be loaded. 1611 // This extension shown in preferences file requires an experimental permission. 1612 // It could not be loaded without such permission. 1613 TEST_F(ExtensionServiceTest, UninstallingNotLoadedExtension) { 1614 base::FilePath source_install_dir = 1615 data_dir().AppendASCII("good").AppendASCII("Extensions"); 1616 // The preference contains an external extension 1617 // that requires 'experimental' permission. 1618 base::FilePath pref_path = source_install_dir 1619 .DirName() 1620 .AppendASCII("PreferencesExperimental"); 1621 1622 // Aforementioned extension will not be loaded if 1623 // there is no '--enable-experimental-extension-apis' command line flag. 1624 InitializeInstalledExtensionService(pref_path, source_install_dir); 1625 1626 service()->Init(); 1627 1628 // Check and try to uninstall it. 1629 // If we don't check whether the extension is loaded before we uninstall it 1630 // in CheckExternalUninstall, a crash will happen here because we will get or 1631 // dereference a NULL pointer (extension) inside UninstallExtension. 1632 MockExtensionProvider provider(NULL, Manifest::EXTERNAL_REGISTRY); 1633 service()->OnExternalProviderReady(&provider); 1634 } 1635 1636 // Test that external extensions with incorrect IDs are not installed. 1637 TEST_F(ExtensionServiceTest, FailOnWrongId) { 1638 InitializeEmptyExtensionService(); 1639 base::FilePath path = data_dir().AppendASCII("good.crx"); 1640 service()->set_extensions_enabled(true); 1641 1642 Version version("1.0.0.0"); 1643 1644 const std::string wrong_id = all_zero; 1645 const std::string correct_id = good_crx; 1646 ASSERT_NE(correct_id, wrong_id); 1647 1648 // Install an external extension with an ID from the external 1649 // source that is not equal to the ID in the extension manifest. 1650 content::WindowedNotificationObserver observer( 1651 extensions::NOTIFICATION_CRX_INSTALLER_DONE, 1652 content::NotificationService::AllSources()); 1653 service()->OnExternalExtensionFileFound(wrong_id, 1654 &version, 1655 path, 1656 Manifest::EXTERNAL_PREF, 1657 Extension::NO_FLAGS, 1658 false); 1659 1660 observer.Wait(); 1661 ASSERT_FALSE(service()->GetExtensionById(good_crx, false)); 1662 1663 // Try again with the right ID. Expect success. 1664 content::WindowedNotificationObserver observer2( 1665 extensions::NOTIFICATION_CRX_INSTALLER_DONE, 1666 content::NotificationService::AllSources()); 1667 if (service()->OnExternalExtensionFileFound(correct_id, 1668 &version, 1669 path, 1670 Manifest::EXTERNAL_PREF, 1671 Extension::NO_FLAGS, 1672 false)) { 1673 observer2.Wait(); 1674 } 1675 ASSERT_TRUE(service()->GetExtensionById(good_crx, false)); 1676 } 1677 1678 // Test that external extensions with incorrect versions are not installed. 1679 TEST_F(ExtensionServiceTest, FailOnWrongVersion) { 1680 InitializeEmptyExtensionService(); 1681 base::FilePath path = data_dir().AppendASCII("good.crx"); 1682 service()->set_extensions_enabled(true); 1683 1684 // Install an external extension with a version from the external 1685 // source that is not equal to the version in the extension manifest. 1686 Version wrong_version("1.2.3.4"); 1687 content::WindowedNotificationObserver observer( 1688 extensions::NOTIFICATION_CRX_INSTALLER_DONE, 1689 content::NotificationService::AllSources()); 1690 service()->OnExternalExtensionFileFound(good_crx, 1691 &wrong_version, 1692 path, 1693 Manifest::EXTERNAL_PREF, 1694 Extension::NO_FLAGS, 1695 false); 1696 1697 observer.Wait(); 1698 ASSERT_FALSE(service()->GetExtensionById(good_crx, false)); 1699 1700 // Try again with the right version. Expect success. 1701 service()->pending_extension_manager()->Remove(good_crx); 1702 Version correct_version("1.0.0.0"); 1703 content::WindowedNotificationObserver observer2( 1704 extensions::NOTIFICATION_CRX_INSTALLER_DONE, 1705 content::NotificationService::AllSources()); 1706 if (service()->OnExternalExtensionFileFound(good_crx, 1707 &correct_version, 1708 path, 1709 Manifest::EXTERNAL_PREF, 1710 Extension::NO_FLAGS, 1711 false)) { 1712 observer2.Wait(); 1713 } 1714 ASSERT_TRUE(service()->GetExtensionById(good_crx, false)); 1715 } 1716 1717 // Install a user script (they get converted automatically to an extension) 1718 TEST_F(ExtensionServiceTest, InstallUserScript) { 1719 // The details of script conversion are tested elsewhere, this just tests 1720 // integration with ExtensionService. 1721 InitializeEmptyExtensionService(); 1722 1723 base::FilePath path = data_dir().AppendASCII("user_script_basic.user.js"); 1724 1725 ASSERT_TRUE(base::PathExists(path)); 1726 scoped_refptr<CrxInstaller> installer(CrxInstaller::CreateSilent(service())); 1727 installer->set_allow_silent_install(true); 1728 installer->InstallUserScript( 1729 path, 1730 GURL("http://www.aaronboodman.com/scripts/user_script_basic.user.js")); 1731 1732 base::RunLoop().RunUntilIdle(); 1733 std::vector<base::string16> errors = GetErrors(); 1734 EXPECT_TRUE(installed_) << "Nothing was installed."; 1735 EXPECT_FALSE(was_update_) << path.value(); 1736 ASSERT_EQ(1u, loaded_.size()) << "Nothing was loaded."; 1737 EXPECT_EQ(0u, errors.size()) << "There were errors: " 1738 << JoinString(errors, ','); 1739 EXPECT_TRUE(service()->GetExtensionById(loaded_[0]->id(), false)) 1740 << path.value(); 1741 1742 installed_ = NULL; 1743 was_update_ = false; 1744 loaded_.clear(); 1745 ExtensionErrorReporter::GetInstance()->ClearErrors(); 1746 } 1747 1748 // Extensions don't install during shutdown. 1749 TEST_F(ExtensionServiceTest, InstallExtensionDuringShutdown) { 1750 InitializeEmptyExtensionService(); 1751 1752 // Simulate shutdown. 1753 service()->set_browser_terminating_for_test(true); 1754 1755 base::FilePath path = data_dir().AppendASCII("good.crx"); 1756 scoped_refptr<CrxInstaller> installer(CrxInstaller::CreateSilent(service())); 1757 installer->set_allow_silent_install(true); 1758 installer->InstallCrx(path); 1759 base::RunLoop().RunUntilIdle(); 1760 1761 EXPECT_FALSE(installed_) << "Extension installed during shutdown."; 1762 ASSERT_EQ(0u, loaded_.size()) << "Extension loaded during shutdown."; 1763 } 1764 1765 // This tests that the granted permissions preferences are correctly set when 1766 // installing an extension. 1767 TEST_F(ExtensionServiceTest, GrantedPermissions) { 1768 InitializeEmptyExtensionService(); 1769 base::FilePath path = data_dir().AppendASCII("permissions"); 1770 1771 base::FilePath pem_path = path.AppendASCII("unknown.pem"); 1772 path = path.AppendASCII("unknown"); 1773 1774 ASSERT_TRUE(base::PathExists(pem_path)); 1775 ASSERT_TRUE(base::PathExists(path)); 1776 1777 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile()); 1778 1779 APIPermissionSet expected_api_perms; 1780 URLPatternSet expected_host_perms; 1781 1782 // Make sure there aren't any granted permissions before the 1783 // extension is installed. 1784 scoped_refptr<PermissionSet> known_perms( 1785 prefs->GetGrantedPermissions(permissions_crx)); 1786 EXPECT_FALSE(known_perms.get()); 1787 1788 const Extension* extension = PackAndInstallCRX(path, pem_path, INSTALL_NEW); 1789 1790 EXPECT_EQ(0u, GetErrors().size()); 1791 ASSERT_EQ(1u, registry()->enabled_extensions().size()); 1792 EXPECT_EQ(permissions_crx, extension->id()); 1793 1794 // Verify that the valid API permissions have been recognized. 1795 expected_api_perms.insert(APIPermission::kTab); 1796 1797 AddPattern(&expected_host_perms, "http://*.google.com/*"); 1798 AddPattern(&expected_host_perms, "https://*.google.com/*"); 1799 AddPattern(&expected_host_perms, "http://*.google.com.hk/*"); 1800 AddPattern(&expected_host_perms, "http://www.example.com/*"); 1801 1802 known_perms = prefs->GetGrantedPermissions(extension->id()); 1803 EXPECT_TRUE(known_perms.get()); 1804 EXPECT_FALSE(known_perms->IsEmpty()); 1805 EXPECT_EQ(expected_api_perms, known_perms->apis()); 1806 EXPECT_FALSE(known_perms->HasEffectiveFullAccess()); 1807 EXPECT_EQ(expected_host_perms, known_perms->effective_hosts()); 1808 } 1809 1810 1811 #if !defined(OS_CHROMEOS) 1812 // This tests that the granted permissions preferences are correctly set for 1813 // default apps. 1814 TEST_F(ExtensionServiceTest, DefaultAppsGrantedPermissions) { 1815 InitializeEmptyExtensionService(); 1816 base::FilePath path = data_dir().AppendASCII("permissions"); 1817 1818 base::FilePath pem_path = path.AppendASCII("unknown.pem"); 1819 path = path.AppendASCII("unknown"); 1820 1821 ASSERT_TRUE(base::PathExists(pem_path)); 1822 ASSERT_TRUE(base::PathExists(path)); 1823 1824 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile()); 1825 1826 APIPermissionSet expected_api_perms; 1827 URLPatternSet expected_host_perms; 1828 1829 // Make sure there aren't any granted permissions before the 1830 // extension is installed. 1831 scoped_refptr<PermissionSet> known_perms( 1832 prefs->GetGrantedPermissions(permissions_crx)); 1833 EXPECT_FALSE(known_perms.get()); 1834 1835 const Extension* extension = PackAndInstallCRX( 1836 path, pem_path, INSTALL_NEW, Extension::WAS_INSTALLED_BY_DEFAULT); 1837 1838 EXPECT_EQ(0u, GetErrors().size()); 1839 ASSERT_EQ(1u, registry()->enabled_extensions().size()); 1840 EXPECT_EQ(permissions_crx, extension->id()); 1841 1842 // Verify that the valid API permissions have been recognized. 1843 expected_api_perms.insert(APIPermission::kTab); 1844 1845 known_perms = prefs->GetGrantedPermissions(extension->id()); 1846 EXPECT_TRUE(known_perms.get()); 1847 EXPECT_FALSE(known_perms->IsEmpty()); 1848 EXPECT_EQ(expected_api_perms, known_perms->apis()); 1849 EXPECT_FALSE(known_perms->HasEffectiveFullAccess()); 1850 } 1851 #endif 1852 1853 #if !defined(OS_POSIX) || defined(OS_MACOSX) 1854 // Tests that the granted permissions full_access bit gets set correctly when 1855 // an extension contains an NPAPI plugin. 1856 // Only run this on platforms that support NPAPI plugins. 1857 TEST_F(ExtensionServiceTest, GrantedFullAccessPermissions) { 1858 InitPluginService(); 1859 1860 InitializeEmptyExtensionService(); 1861 1862 ASSERT_TRUE(base::PathExists(good1_path())); 1863 const Extension* extension = PackAndInstallCRX(good1_path(), INSTALL_NEW); 1864 EXPECT_EQ(0u, GetErrors().size()); 1865 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 1866 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile()); 1867 1868 scoped_refptr<PermissionSet> permissions( 1869 prefs->GetGrantedPermissions(extension->id())); 1870 EXPECT_FALSE(permissions->IsEmpty()); 1871 EXPECT_TRUE(permissions->HasEffectiveFullAccess()); 1872 EXPECT_FALSE(permissions->apis().empty()); 1873 EXPECT_TRUE(permissions->HasAPIPermission(APIPermission::kPlugin)); 1874 1875 // Full access implies full host access too... 1876 EXPECT_TRUE(permissions->HasEffectiveAccessToAllHosts()); 1877 } 1878 #endif 1879 1880 // Tests that the extension is disabled when permissions are missing from 1881 // the extension's granted permissions preferences. (This simulates updating 1882 // the browser to a version which recognizes more permissions). 1883 TEST_F(ExtensionServiceTest, GrantedAPIAndHostPermissions) { 1884 InitializeEmptyExtensionService(); 1885 1886 base::FilePath path = 1887 data_dir().AppendASCII("permissions").AppendASCII("unknown"); 1888 1889 ASSERT_TRUE(base::PathExists(path)); 1890 1891 const Extension* extension = PackAndInstallCRX(path, INSTALL_NEW); 1892 1893 EXPECT_EQ(0u, GetErrors().size()); 1894 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 1895 std::string extension_id = extension->id(); 1896 1897 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile()); 1898 1899 APIPermissionSet expected_api_permissions; 1900 URLPatternSet expected_host_permissions; 1901 1902 expected_api_permissions.insert(APIPermission::kTab); 1903 AddPattern(&expected_host_permissions, "http://*.google.com/*"); 1904 AddPattern(&expected_host_permissions, "https://*.google.com/*"); 1905 AddPattern(&expected_host_permissions, "http://*.google.com.hk/*"); 1906 AddPattern(&expected_host_permissions, "http://www.example.com/*"); 1907 1908 std::set<std::string> host_permissions; 1909 1910 // Test that the extension is disabled when an API permission is missing from 1911 // the extension's granted api permissions preference. (This simulates 1912 // updating the browser to a version which recognizes a new API permission). 1913 SetPref(extension_id, "granted_permissions.api", 1914 new base::ListValue(), "granted_permissions.api"); 1915 service()->ReloadExtensionsForTest(); 1916 1917 EXPECT_EQ(1u, registry()->disabled_extensions().size()); 1918 extension = registry()->disabled_extensions().begin()->get(); 1919 1920 ASSERT_TRUE(prefs->IsExtensionDisabled(extension_id)); 1921 ASSERT_FALSE(service()->IsExtensionEnabled(extension_id)); 1922 ASSERT_TRUE(prefs->DidExtensionEscalatePermissions(extension_id)); 1923 1924 // Now grant and re-enable the extension, making sure the prefs are updated. 1925 service()->GrantPermissionsAndEnableExtension(extension); 1926 1927 ASSERT_FALSE(prefs->IsExtensionDisabled(extension_id)); 1928 ASSERT_TRUE(service()->IsExtensionEnabled(extension_id)); 1929 ASSERT_FALSE(prefs->DidExtensionEscalatePermissions(extension_id)); 1930 1931 scoped_refptr<PermissionSet> current_perms( 1932 prefs->GetGrantedPermissions(extension_id)); 1933 ASSERT_TRUE(current_perms.get()); 1934 ASSERT_FALSE(current_perms->IsEmpty()); 1935 ASSERT_FALSE(current_perms->HasEffectiveFullAccess()); 1936 ASSERT_EQ(expected_api_permissions, current_perms->apis()); 1937 ASSERT_EQ(expected_host_permissions, current_perms->effective_hosts()); 1938 1939 // Tests that the extension is disabled when a host permission is missing from 1940 // the extension's granted host permissions preference. (This simulates 1941 // updating the browser to a version which recognizes additional host 1942 // permissions). 1943 host_permissions.clear(); 1944 current_perms = NULL; 1945 1946 host_permissions.insert("http://*.google.com/*"); 1947 host_permissions.insert("https://*.google.com/*"); 1948 host_permissions.insert("http://*.google.com.hk/*"); 1949 1950 base::ListValue* api_permissions = new base::ListValue(); 1951 api_permissions->Append( 1952 new base::StringValue("tabs")); 1953 SetPref(extension_id, "granted_permissions.api", 1954 api_permissions, "granted_permissions.api"); 1955 SetPrefStringSet( 1956 extension_id, "granted_permissions.scriptable_host", host_permissions); 1957 1958 service()->ReloadExtensionsForTest(); 1959 1960 EXPECT_EQ(1u, registry()->disabled_extensions().size()); 1961 extension = registry()->disabled_extensions().begin()->get(); 1962 1963 ASSERT_TRUE(prefs->IsExtensionDisabled(extension_id)); 1964 ASSERT_FALSE(service()->IsExtensionEnabled(extension_id)); 1965 ASSERT_TRUE(prefs->DidExtensionEscalatePermissions(extension_id)); 1966 1967 // Now grant and re-enable the extension, making sure the prefs are updated. 1968 service()->GrantPermissionsAndEnableExtension(extension); 1969 1970 ASSERT_TRUE(service()->IsExtensionEnabled(extension_id)); 1971 ASSERT_FALSE(prefs->DidExtensionEscalatePermissions(extension_id)); 1972 1973 current_perms = prefs->GetGrantedPermissions(extension_id); 1974 ASSERT_TRUE(current_perms.get()); 1975 ASSERT_FALSE(current_perms->IsEmpty()); 1976 ASSERT_FALSE(current_perms->HasEffectiveFullAccess()); 1977 ASSERT_EQ(expected_api_permissions, current_perms->apis()); 1978 ASSERT_EQ(expected_host_permissions, current_perms->effective_hosts()); 1979 } 1980 1981 // Test Packaging and installing an extension. 1982 TEST_F(ExtensionServiceTest, PackExtension) { 1983 InitializeEmptyExtensionService(); 1984 base::FilePath input_directory = 1985 data_dir() 1986 .AppendASCII("good") 1987 .AppendASCII("Extensions") 1988 .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj") 1989 .AppendASCII("1.0.0.0"); 1990 1991 base::ScopedTempDir temp_dir; 1992 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 1993 base::FilePath output_directory = temp_dir.path(); 1994 1995 base::FilePath crx_path(output_directory.AppendASCII("ex1.crx")); 1996 base::FilePath privkey_path(output_directory.AppendASCII("privkey.pem")); 1997 1998 scoped_ptr<ExtensionCreator> creator(new ExtensionCreator()); 1999 ASSERT_TRUE(creator->Run(input_directory, crx_path, base::FilePath(), 2000 privkey_path, ExtensionCreator::kNoRunFlags)); 2001 ASSERT_TRUE(base::PathExists(crx_path)); 2002 ASSERT_TRUE(base::PathExists(privkey_path)); 2003 2004 // Repeat the run with the pem file gone, and no special flags 2005 // Should refuse to overwrite the existing crx. 2006 base::DeleteFile(privkey_path, false); 2007 ASSERT_FALSE(creator->Run(input_directory, crx_path, base::FilePath(), 2008 privkey_path, ExtensionCreator::kNoRunFlags)); 2009 2010 // OK, now try it with a flag to overwrite existing crx. Should work. 2011 ASSERT_TRUE(creator->Run(input_directory, crx_path, base::FilePath(), 2012 privkey_path, ExtensionCreator::kOverwriteCRX)); 2013 2014 // Repeat the run allowing existing crx, but the existing pem is still 2015 // an error. Should fail. 2016 ASSERT_FALSE(creator->Run(input_directory, crx_path, base::FilePath(), 2017 privkey_path, ExtensionCreator::kOverwriteCRX)); 2018 2019 ASSERT_TRUE(base::PathExists(privkey_path)); 2020 InstallCRX(crx_path, INSTALL_NEW); 2021 2022 // Try packing with invalid paths. 2023 creator.reset(new ExtensionCreator()); 2024 ASSERT_FALSE( 2025 creator->Run(base::FilePath(), base::FilePath(), base::FilePath(), 2026 base::FilePath(), ExtensionCreator::kOverwriteCRX)); 2027 2028 // Try packing an empty directory. Should fail because an empty directory is 2029 // not a valid extension. 2030 base::ScopedTempDir temp_dir2; 2031 ASSERT_TRUE(temp_dir2.CreateUniqueTempDir()); 2032 creator.reset(new ExtensionCreator()); 2033 ASSERT_FALSE(creator->Run(temp_dir2.path(), crx_path, privkey_path, 2034 base::FilePath(), ExtensionCreator::kOverwriteCRX)); 2035 2036 // Try packing with an invalid manifest. 2037 std::string invalid_manifest_content = "I am not a manifest."; 2038 ASSERT_TRUE(base::WriteFile( 2039 temp_dir2.path().Append(extensions::kManifestFilename), 2040 invalid_manifest_content.c_str(), invalid_manifest_content.size())); 2041 creator.reset(new ExtensionCreator()); 2042 ASSERT_FALSE(creator->Run(temp_dir2.path(), crx_path, privkey_path, 2043 base::FilePath(), ExtensionCreator::kOverwriteCRX)); 2044 2045 // Try packing with a private key that is a valid key, but invalid for the 2046 // extension. 2047 base::FilePath bad_private_key_dir = 2048 data_dir().AppendASCII("bad_private_key"); 2049 crx_path = output_directory.AppendASCII("bad_private_key.crx"); 2050 privkey_path = data_dir().AppendASCII("bad_private_key.pem"); 2051 ASSERT_FALSE(creator->Run(bad_private_key_dir, crx_path, base::FilePath(), 2052 privkey_path, ExtensionCreator::kOverwriteCRX)); 2053 } 2054 2055 // Test Packaging and installing an extension whose name contains punctuation. 2056 TEST_F(ExtensionServiceTest, PackPunctuatedExtension) { 2057 InitializeEmptyExtensionService(); 2058 base::FilePath input_directory = data_dir() 2059 .AppendASCII("good") 2060 .AppendASCII("Extensions") 2061 .AppendASCII(good0) 2062 .AppendASCII("1.0.0.0"); 2063 2064 base::ScopedTempDir temp_dir; 2065 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 2066 2067 // Extension names containing punctuation, and the expected names for the 2068 // packed extensions. 2069 const base::FilePath punctuated_names[] = { 2070 base::FilePath(FILE_PATH_LITERAL("this.extensions.name.has.periods")), 2071 base::FilePath(FILE_PATH_LITERAL(".thisextensionsnamestartswithaperiod")), 2072 base::FilePath(FILE_PATH_LITERAL("thisextensionhasaslashinitsname/")). 2073 NormalizePathSeparators(), 2074 }; 2075 const base::FilePath expected_crx_names[] = { 2076 base::FilePath(FILE_PATH_LITERAL("this.extensions.name.has.periods.crx")), 2077 base::FilePath( 2078 FILE_PATH_LITERAL(".thisextensionsnamestartswithaperiod.crx")), 2079 base::FilePath(FILE_PATH_LITERAL("thisextensionhasaslashinitsname.crx")), 2080 }; 2081 const base::FilePath expected_private_key_names[] = { 2082 base::FilePath(FILE_PATH_LITERAL("this.extensions.name.has.periods.pem")), 2083 base::FilePath( 2084 FILE_PATH_LITERAL(".thisextensionsnamestartswithaperiod.pem")), 2085 base::FilePath(FILE_PATH_LITERAL("thisextensionhasaslashinitsname.pem")), 2086 }; 2087 2088 for (size_t i = 0; i < arraysize(punctuated_names); ++i) { 2089 SCOPED_TRACE(punctuated_names[i].value().c_str()); 2090 base::FilePath output_dir = temp_dir.path().Append(punctuated_names[i]); 2091 2092 // Copy the extension into the output directory, as PackExtensionJob doesn't 2093 // let us choose where to output the packed extension. 2094 ASSERT_TRUE(base::CopyDirectory(input_directory, output_dir, true)); 2095 2096 base::FilePath expected_crx_path = 2097 temp_dir.path().Append(expected_crx_names[i]); 2098 base::FilePath expected_private_key_path = 2099 temp_dir.path().Append(expected_private_key_names[i]); 2100 PackExtensionTestClient pack_client(expected_crx_path, 2101 expected_private_key_path); 2102 scoped_refptr<extensions::PackExtensionJob> packer( 2103 new extensions::PackExtensionJob(&pack_client, output_dir, 2104 base::FilePath(), 2105 ExtensionCreator::kOverwriteCRX)); 2106 packer->Start(); 2107 2108 // The packer will post a notification task to the current thread's message 2109 // loop when it is finished. We manually run the loop here so that we 2110 // block and catch the notification; otherwise, the process would exit. 2111 // This call to |Run()| is matched by a call to |Quit()| in the 2112 // |PackExtensionTestClient|'s notification handling code. 2113 base::MessageLoop::current()->Run(); 2114 2115 if (HasFatalFailure()) 2116 return; 2117 2118 InstallCRX(expected_crx_path, INSTALL_NEW); 2119 } 2120 } 2121 2122 TEST_F(ExtensionServiceTest, PackExtensionContainingKeyFails) { 2123 InitializeEmptyExtensionService(); 2124 2125 base::ScopedTempDir extension_temp_dir; 2126 ASSERT_TRUE(extension_temp_dir.CreateUniqueTempDir()); 2127 base::FilePath input_directory = extension_temp_dir.path().AppendASCII("ext"); 2128 ASSERT_TRUE( 2129 base::CopyDirectory(data_dir() 2130 .AppendASCII("good") 2131 .AppendASCII("Extensions") 2132 .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj") 2133 .AppendASCII("1.0.0.0"), 2134 input_directory, 2135 /*recursive=*/true)); 2136 2137 base::ScopedTempDir output_temp_dir; 2138 ASSERT_TRUE(output_temp_dir.CreateUniqueTempDir()); 2139 base::FilePath output_directory = output_temp_dir.path(); 2140 2141 base::FilePath crx_path(output_directory.AppendASCII("ex1.crx")); 2142 base::FilePath privkey_path(output_directory.AppendASCII("privkey.pem")); 2143 2144 // Pack the extension once to get a private key. 2145 scoped_ptr<ExtensionCreator> creator(new ExtensionCreator()); 2146 ASSERT_TRUE(creator->Run(input_directory, crx_path, base::FilePath(), 2147 privkey_path, ExtensionCreator::kNoRunFlags)) 2148 << creator->error_message(); 2149 ASSERT_TRUE(base::PathExists(crx_path)); 2150 ASSERT_TRUE(base::PathExists(privkey_path)); 2151 2152 base::DeleteFile(crx_path, false); 2153 // Move the pem file into the extension. 2154 base::Move(privkey_path, 2155 input_directory.AppendASCII("privkey.pem")); 2156 2157 // This pack should fail because of the contained private key. 2158 EXPECT_FALSE(creator->Run(input_directory, crx_path, base::FilePath(), 2159 privkey_path, ExtensionCreator::kNoRunFlags)); 2160 EXPECT_THAT(creator->error_message(), 2161 testing::ContainsRegex( 2162 "extension includes the key file.*privkey.pem")); 2163 } 2164 2165 // Test Packaging and installing an extension using an openssl generated key. 2166 // The openssl is generated with the following: 2167 // > openssl genrsa -out privkey.pem 1024 2168 // > openssl pkcs8 -topk8 -nocrypt -in privkey.pem -out privkey_asn1.pem 2169 // The privkey.pem is a PrivateKey, and the pcks8 -topk8 creates a 2170 // PrivateKeyInfo ASN.1 structure, we our RSAPrivateKey expects. 2171 TEST_F(ExtensionServiceTest, PackExtensionOpenSSLKey) { 2172 InitializeEmptyExtensionService(); 2173 base::FilePath input_directory = 2174 data_dir() 2175 .AppendASCII("good") 2176 .AppendASCII("Extensions") 2177 .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj") 2178 .AppendASCII("1.0.0.0"); 2179 base::FilePath privkey_path( 2180 data_dir().AppendASCII("openssl_privkey_asn1.pem")); 2181 ASSERT_TRUE(base::PathExists(privkey_path)); 2182 2183 base::ScopedTempDir temp_dir; 2184 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 2185 base::FilePath output_directory = temp_dir.path(); 2186 2187 base::FilePath crx_path(output_directory.AppendASCII("ex1.crx")); 2188 2189 scoped_ptr<ExtensionCreator> creator(new ExtensionCreator()); 2190 ASSERT_TRUE(creator->Run(input_directory, crx_path, privkey_path, 2191 base::FilePath(), ExtensionCreator::kOverwriteCRX)); 2192 2193 InstallCRX(crx_path, INSTALL_NEW); 2194 } 2195 2196 #if defined(THREAD_SANITIZER) 2197 // Flaky under Tsan. http://crbug.com/377702 2198 #define MAYBE_InstallTheme DISABLED_InstallTheme 2199 #else 2200 #define MAYBE_InstallTheme InstallTheme 2201 #endif 2202 2203 TEST_F(ExtensionServiceTest, MAYBE_InstallTheme) { 2204 InitializeEmptyExtensionService(); 2205 service()->Init(); 2206 2207 // A theme. 2208 base::FilePath path = data_dir().AppendASCII("theme.crx"); 2209 InstallCRX(path, INSTALL_NEW); 2210 int pref_count = 0; 2211 ValidatePrefKeyCount(++pref_count); 2212 ValidateIntegerPref(theme_crx, "state", Extension::ENABLED); 2213 ValidateIntegerPref(theme_crx, "location", Manifest::INTERNAL); 2214 2215 // A theme when extensions are disabled. Themes can be installed, even when 2216 // extensions are disabled. 2217 service()->set_extensions_enabled(false); 2218 path = data_dir().AppendASCII("theme2.crx"); 2219 InstallCRX(path, INSTALL_NEW); 2220 ValidatePrefKeyCount(++pref_count); 2221 ValidateIntegerPref(theme2_crx, "state", Extension::ENABLED); 2222 ValidateIntegerPref(theme2_crx, "location", Manifest::INTERNAL); 2223 2224 // A theme with extension elements. Themes cannot have extension elements, 2225 // so any such elements (like content scripts) should be ignored. 2226 service()->set_extensions_enabled(true); 2227 { 2228 path = data_dir().AppendASCII("theme_with_extension.crx"); 2229 const Extension* extension = InstallCRX(path, INSTALL_NEW); 2230 ValidatePrefKeyCount(++pref_count); 2231 ASSERT_TRUE(extension); 2232 EXPECT_TRUE(extension->is_theme()); 2233 EXPECT_EQ( 2234 0u, 2235 extensions::ContentScriptsInfo::GetContentScripts(extension).size()); 2236 } 2237 2238 // A theme with image resources missing (misspelt path). 2239 path = data_dir().AppendASCII("theme_missing_image.crx"); 2240 InstallCRX(path, INSTALL_FAILED); 2241 ValidatePrefKeyCount(pref_count); 2242 } 2243 2244 TEST_F(ExtensionServiceTest, LoadLocalizedTheme) { 2245 // Load. 2246 InitializeEmptyExtensionService(); 2247 service()->Init(); 2248 2249 base::FilePath extension_path = data_dir().AppendASCII("theme_i18n"); 2250 2251 extensions::UnpackedInstaller::Create(service())->Load(extension_path); 2252 base::RunLoop().RunUntilIdle(); 2253 EXPECT_EQ(0u, GetErrors().size()); 2254 ASSERT_EQ(1u, loaded_.size()); 2255 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 2256 const Extension* theme = registry()->enabled_extensions().begin()->get(); 2257 EXPECT_EQ("name", theme->name()); 2258 EXPECT_EQ("description", theme->description()); 2259 2260 // Cleanup the "Cached Theme.pak" file. Ideally, this would be installed in a 2261 // temporary directory, but it automatically installs to the extension's 2262 // directory, and we don't want to copy the whole extension for a unittest. 2263 base::FilePath theme_file = extension_path.Append(chrome::kThemePackFilename); 2264 ASSERT_TRUE(base::PathExists(theme_file)); 2265 ASSERT_TRUE(base::DeleteFile(theme_file, false)); // Not recursive. 2266 } 2267 2268 // Tests that we can change the ID of an unpacked extension by adding a key 2269 // to its manifest. 2270 TEST_F(ExtensionServiceTest, UnpackedExtensionCanChangeID) { 2271 InitializeEmptyExtensionService(); 2272 2273 base::ScopedTempDir temp; 2274 ASSERT_TRUE(temp.CreateUniqueTempDir()); 2275 2276 base::FilePath extension_path = temp.path(); 2277 base::FilePath manifest_path = 2278 extension_path.Append(extensions::kManifestFilename); 2279 base::FilePath manifest_no_key = 2280 data_dir().AppendASCII("unpacked").AppendASCII("manifest_no_key.json"); 2281 2282 base::FilePath manifest_with_key = 2283 data_dir().AppendASCII("unpacked").AppendASCII("manifest_with_key.json"); 2284 2285 ASSERT_TRUE(base::PathExists(manifest_no_key)); 2286 ASSERT_TRUE(base::PathExists(manifest_with_key)); 2287 2288 // Load the unpacked extension with no key. 2289 base::CopyFile(manifest_no_key, manifest_path); 2290 extensions::UnpackedInstaller::Create(service())->Load(extension_path); 2291 2292 base::RunLoop().RunUntilIdle(); 2293 EXPECT_EQ(0u, GetErrors().size()); 2294 ASSERT_EQ(1u, loaded_.size()); 2295 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 2296 2297 // Add the key to the manifest. 2298 base::CopyFile(manifest_with_key, manifest_path); 2299 loaded_.clear(); 2300 2301 // Reload the extensions. 2302 service()->ReloadExtensionsForTest(); 2303 const Extension* extension = service()->GetExtensionById(unpacked, false); 2304 EXPECT_EQ(unpacked, extension->id()); 2305 ASSERT_EQ(1u, loaded_.size()); 2306 2307 // TODO(jstritar): Right now this just makes sure we don't crash and burn, but 2308 // we should also test that preferences are preserved. 2309 } 2310 2311 #if defined(OS_POSIX) 2312 TEST_F(ExtensionServiceTest, UnpackedExtensionMayContainSymlinkedFiles) { 2313 base::FilePath source_data_dir = 2314 data_dir().AppendASCII("unpacked").AppendASCII("symlinks_allowed"); 2315 2316 // Paths to test data files. 2317 base::FilePath source_manifest = source_data_dir.AppendASCII("manifest.json"); 2318 ASSERT_TRUE(base::PathExists(source_manifest)); 2319 base::FilePath source_icon = source_data_dir.AppendASCII("icon.png"); 2320 ASSERT_TRUE(base::PathExists(source_icon)); 2321 2322 // Set up the temporary extension directory. 2323 base::ScopedTempDir temp; 2324 ASSERT_TRUE(temp.CreateUniqueTempDir()); 2325 base::FilePath extension_path = temp.path(); 2326 base::FilePath manifest = extension_path.Append( 2327 extensions::kManifestFilename); 2328 base::FilePath icon_symlink = extension_path.AppendASCII("icon.png"); 2329 base::CopyFile(source_manifest, manifest); 2330 base::CreateSymbolicLink(source_icon, icon_symlink); 2331 2332 // Load extension. 2333 InitializeEmptyExtensionService(); 2334 extensions::UnpackedInstaller::Create(service())->Load(extension_path); 2335 base::RunLoop().RunUntilIdle(); 2336 2337 EXPECT_TRUE(GetErrors().empty()); 2338 ASSERT_EQ(1u, loaded_.size()); 2339 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 2340 } 2341 #endif 2342 2343 TEST_F(ExtensionServiceTest, UnpackedExtensionMayNotHaveUnderscore) { 2344 InitializeEmptyExtensionService(); 2345 base::FilePath extension_path = data_dir().AppendASCII("underscore_name"); 2346 extensions::UnpackedInstaller::Create(service())->Load(extension_path); 2347 base::RunLoop().RunUntilIdle(); 2348 EXPECT_EQ(1u, GetErrors().size()); 2349 EXPECT_EQ(0u, registry()->enabled_extensions().size()); 2350 } 2351 2352 TEST_F(ExtensionServiceTest, InstallLocalizedTheme) { 2353 InitializeEmptyExtensionService(); 2354 service()->Init(); 2355 2356 base::FilePath theme_path = data_dir().AppendASCII("theme_i18n"); 2357 2358 const Extension* theme = PackAndInstallCRX(theme_path, INSTALL_NEW); 2359 2360 EXPECT_EQ(0u, GetErrors().size()); 2361 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 2362 EXPECT_EQ("name", theme->name()); 2363 EXPECT_EQ("description", theme->description()); 2364 } 2365 2366 TEST_F(ExtensionServiceTest, InstallApps) { 2367 InitializeEmptyExtensionService(); 2368 2369 // An empty app. 2370 const Extension* app = 2371 PackAndInstallCRX(data_dir().AppendASCII("app1"), INSTALL_NEW); 2372 int pref_count = 0; 2373 ValidatePrefKeyCount(++pref_count); 2374 ASSERT_EQ(1u, registry()->enabled_extensions().size()); 2375 ValidateIntegerPref(app->id(), "state", Extension::ENABLED); 2376 ValidateIntegerPref(app->id(), "location", Manifest::INTERNAL); 2377 2378 // Another app with non-overlapping extent. Should succeed. 2379 PackAndInstallCRX(data_dir().AppendASCII("app2"), INSTALL_NEW); 2380 ValidatePrefKeyCount(++pref_count); 2381 2382 // A third app whose extent overlaps the first. Should fail. 2383 PackAndInstallCRX(data_dir().AppendASCII("app3"), INSTALL_FAILED); 2384 ValidatePrefKeyCount(pref_count); 2385 } 2386 2387 // Tests that file access is OFF by default. 2388 TEST_F(ExtensionServiceTest, DefaultFileAccess) { 2389 InitializeEmptyExtensionService(); 2390 const Extension* extension = PackAndInstallCRX( 2391 data_dir().AppendASCII("permissions").AppendASCII("files"), INSTALL_NEW); 2392 EXPECT_EQ(0u, GetErrors().size()); 2393 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 2394 EXPECT_FALSE( 2395 ExtensionPrefs::Get(profile())->AllowFileAccess(extension->id())); 2396 } 2397 2398 TEST_F(ExtensionServiceTest, UpdateApps) { 2399 InitializeEmptyExtensionService(); 2400 base::FilePath extensions_path = data_dir().AppendASCII("app_update"); 2401 2402 // First install v1 of a hosted app. 2403 const Extension* extension = 2404 InstallCRX(extensions_path.AppendASCII("v1.crx"), INSTALL_NEW); 2405 ASSERT_EQ(1u, registry()->enabled_extensions().size()); 2406 std::string id = extension->id(); 2407 ASSERT_EQ(std::string("1"), extension->version()->GetString()); 2408 2409 // Now try updating to v2. 2410 UpdateExtension(id, 2411 extensions_path.AppendASCII("v2.crx"), 2412 ENABLED); 2413 ASSERT_EQ(std::string("2"), 2414 service()->GetExtensionById(id, false)->version()->GetString()); 2415 } 2416 2417 // Verifies that the NTP page and launch ordinals are kept when updating apps. 2418 TEST_F(ExtensionServiceTest, UpdateAppsRetainOrdinals) { 2419 InitializeEmptyExtensionService(); 2420 AppSorting* sorting = ExtensionPrefs::Get(profile())->app_sorting(); 2421 base::FilePath extensions_path = data_dir().AppendASCII("app_update"); 2422 2423 // First install v1 of a hosted app. 2424 const Extension* extension = 2425 InstallCRX(extensions_path.AppendASCII("v1.crx"), INSTALL_NEW); 2426 ASSERT_EQ(1u, registry()->enabled_extensions().size()); 2427 std::string id = extension->id(); 2428 ASSERT_EQ(std::string("1"), extension->version()->GetString()); 2429 2430 // Modify the ordinals so we can distinguish them from the defaults. 2431 syncer::StringOrdinal new_page_ordinal = 2432 sorting->GetPageOrdinal(id).CreateAfter(); 2433 syncer::StringOrdinal new_launch_ordinal = 2434 sorting->GetAppLaunchOrdinal(id).CreateBefore(); 2435 2436 sorting->SetPageOrdinal(id, new_page_ordinal); 2437 sorting->SetAppLaunchOrdinal(id, new_launch_ordinal); 2438 2439 // Now try updating to v2. 2440 UpdateExtension(id, extensions_path.AppendASCII("v2.crx"), ENABLED); 2441 ASSERT_EQ(std::string("2"), 2442 service()->GetExtensionById(id, false)->version()->GetString()); 2443 2444 // Verify that the ordinals match. 2445 ASSERT_TRUE(new_page_ordinal.Equals(sorting->GetPageOrdinal(id))); 2446 ASSERT_TRUE(new_launch_ordinal.Equals(sorting->GetAppLaunchOrdinal(id))); 2447 } 2448 2449 // Ensures that the CWS has properly initialized ordinals. 2450 TEST_F(ExtensionServiceTest, EnsureCWSOrdinalsInitialized) { 2451 InitializeEmptyExtensionService(); 2452 service()->component_loader()->Add( 2453 IDR_WEBSTORE_MANIFEST, base::FilePath(FILE_PATH_LITERAL("web_store"))); 2454 service()->Init(); 2455 2456 AppSorting* sorting = ExtensionPrefs::Get(profile())->app_sorting(); 2457 EXPECT_TRUE( 2458 sorting->GetPageOrdinal(extensions::kWebStoreAppId).IsValid()); 2459 EXPECT_TRUE( 2460 sorting->GetAppLaunchOrdinal(extensions::kWebStoreAppId).IsValid()); 2461 } 2462 2463 TEST_F(ExtensionServiceTest, InstallAppsWithUnlimitedStorage) { 2464 InitializeEmptyExtensionService(); 2465 EXPECT_TRUE(registry()->enabled_extensions().is_empty()); 2466 2467 int pref_count = 0; 2468 2469 // Install app1 with unlimited storage. 2470 const Extension* extension = 2471 PackAndInstallCRX(data_dir().AppendASCII("app1"), INSTALL_NEW); 2472 ValidatePrefKeyCount(++pref_count); 2473 ASSERT_EQ(1u, registry()->enabled_extensions().size()); 2474 const std::string id1 = extension->id(); 2475 EXPECT_TRUE(extension->permissions_data()->HasAPIPermission( 2476 APIPermission::kUnlimitedStorage)); 2477 EXPECT_TRUE(extension->web_extent().MatchesURL( 2478 extensions::AppLaunchInfo::GetFullLaunchURL(extension))); 2479 const GURL origin1( 2480 extensions::AppLaunchInfo::GetFullLaunchURL(extension).GetOrigin()); 2481 EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited( 2482 origin1)); 2483 2484 // Install app2 from the same origin with unlimited storage. 2485 extension = PackAndInstallCRX(data_dir().AppendASCII("app2"), INSTALL_NEW); 2486 ValidatePrefKeyCount(++pref_count); 2487 ASSERT_EQ(2u, registry()->enabled_extensions().size()); 2488 const std::string id2 = extension->id(); 2489 EXPECT_TRUE(extension->permissions_data()->HasAPIPermission( 2490 APIPermission::kUnlimitedStorage)); 2491 EXPECT_TRUE(extension->web_extent().MatchesURL( 2492 extensions::AppLaunchInfo::GetFullLaunchURL(extension))); 2493 const GURL origin2( 2494 extensions::AppLaunchInfo::GetFullLaunchURL(extension).GetOrigin()); 2495 EXPECT_EQ(origin1, origin2); 2496 EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited( 2497 origin2)); 2498 2499 // Uninstall one of them, unlimited storage should still be granted 2500 // to the origin. 2501 UninstallExtension(id1, false); 2502 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 2503 EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited( 2504 origin1)); 2505 2506 // Uninstall the other, unlimited storage should be revoked. 2507 UninstallExtension(id2, false); 2508 EXPECT_EQ(0u, registry()->enabled_extensions().size()); 2509 EXPECT_FALSE( 2510 profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited( 2511 origin2)); 2512 } 2513 2514 TEST_F(ExtensionServiceTest, InstallAppsAndCheckStorageProtection) { 2515 InitializeEmptyExtensionService(); 2516 EXPECT_TRUE(registry()->enabled_extensions().is_empty()); 2517 2518 int pref_count = 0; 2519 2520 const Extension* extension = 2521 PackAndInstallCRX(data_dir().AppendASCII("app1"), INSTALL_NEW); 2522 ValidatePrefKeyCount(++pref_count); 2523 ASSERT_EQ(1u, registry()->enabled_extensions().size()); 2524 EXPECT_TRUE(extension->is_app()); 2525 const std::string id1 = extension->id(); 2526 const GURL origin1( 2527 extensions::AppLaunchInfo::GetFullLaunchURL(extension).GetOrigin()); 2528 EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageProtected( 2529 origin1)); 2530 2531 // App 4 has a different origin (maps.google.com). 2532 extension = PackAndInstallCRX(data_dir().AppendASCII("app4"), INSTALL_NEW); 2533 ValidatePrefKeyCount(++pref_count); 2534 ASSERT_EQ(2u, registry()->enabled_extensions().size()); 2535 const std::string id2 = extension->id(); 2536 const GURL origin2( 2537 extensions::AppLaunchInfo::GetFullLaunchURL(extension).GetOrigin()); 2538 ASSERT_NE(origin1, origin2); 2539 EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageProtected( 2540 origin2)); 2541 2542 UninstallExtension(id1, false); 2543 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 2544 2545 UninstallExtension(id2, false); 2546 2547 EXPECT_TRUE(registry()->enabled_extensions().is_empty()); 2548 EXPECT_FALSE( 2549 profile()->GetExtensionSpecialStoragePolicy()->IsStorageProtected( 2550 origin1)); 2551 EXPECT_FALSE( 2552 profile()->GetExtensionSpecialStoragePolicy()->IsStorageProtected( 2553 origin2)); 2554 } 2555 2556 // Test that when an extension version is reinstalled, nothing happens. 2557 TEST_F(ExtensionServiceTest, Reinstall) { 2558 InitializeEmptyExtensionService(); 2559 2560 // A simple extension that should install without error. 2561 base::FilePath path = data_dir().AppendASCII("good.crx"); 2562 InstallCRX(path, INSTALL_NEW); 2563 2564 ValidatePrefKeyCount(1); 2565 ValidateIntegerPref(good_crx, "state", Extension::ENABLED); 2566 ValidateIntegerPref(good_crx, "location", Manifest::INTERNAL); 2567 2568 // Reinstall the same version, it should overwrite the previous one. 2569 InstallCRX(path, INSTALL_UPDATED); 2570 2571 ValidatePrefKeyCount(1); 2572 ValidateIntegerPref(good_crx, "state", Extension::ENABLED); 2573 ValidateIntegerPref(good_crx, "location", Manifest::INTERNAL); 2574 } 2575 2576 // Test that we can determine if extensions came from the 2577 // Chrome web store. 2578 TEST_F(ExtensionServiceTest, FromWebStore) { 2579 InitializeEmptyExtensionService(); 2580 2581 // A simple extension that should install without error. 2582 base::FilePath path = data_dir().AppendASCII("good.crx"); 2583 // Not from web store. 2584 const Extension* extension = InstallCRX(path, INSTALL_NEW); 2585 std::string id = extension->id(); 2586 2587 ValidatePrefKeyCount(1); 2588 ASSERT_TRUE(ValidateBooleanPref(good_crx, "from_webstore", false)); 2589 ASSERT_FALSE(extension->from_webstore()); 2590 2591 // Test install from web store. 2592 InstallCRXFromWebStore(path, INSTALL_UPDATED); // From web store. 2593 2594 ValidatePrefKeyCount(1); 2595 ASSERT_TRUE(ValidateBooleanPref(good_crx, "from_webstore", true)); 2596 2597 // Reload so extension gets reinitialized with new value. 2598 service()->ReloadExtensionsForTest(); 2599 extension = service()->GetExtensionById(id, false); 2600 ASSERT_TRUE(extension->from_webstore()); 2601 2602 // Upgrade to version 2.0 2603 path = data_dir().AppendASCII("good2.crx"); 2604 UpdateExtension(good_crx, path, ENABLED); 2605 ValidatePrefKeyCount(1); 2606 ASSERT_TRUE(ValidateBooleanPref(good_crx, "from_webstore", true)); 2607 } 2608 2609 // Test upgrading a signed extension. 2610 TEST_F(ExtensionServiceTest, UpgradeSignedGood) { 2611 InitializeEmptyExtensionService(); 2612 2613 base::FilePath path = data_dir().AppendASCII("good.crx"); 2614 const Extension* extension = InstallCRX(path, INSTALL_NEW); 2615 std::string id = extension->id(); 2616 2617 ASSERT_EQ("1.0.0.0", extension->version()->GetString()); 2618 ASSERT_EQ(0u, GetErrors().size()); 2619 2620 // Upgrade to version 1.0.0.1. 2621 // Also test that the extension's old and new title are correctly retrieved. 2622 path = data_dir().AppendASCII("good2.crx"); 2623 InstallCRX(path, INSTALL_UPDATED, Extension::NO_FLAGS, "My extension 1"); 2624 extension = service()->GetExtensionById(id, false); 2625 2626 ASSERT_EQ("1.0.0.1", extension->version()->GetString()); 2627 ASSERT_EQ("My updated extension 1", extension->name()); 2628 ASSERT_EQ(0u, GetErrors().size()); 2629 } 2630 2631 // Test upgrading a signed extension with a bad signature. 2632 TEST_F(ExtensionServiceTest, UpgradeSignedBad) { 2633 InitializeEmptyExtensionService(); 2634 2635 base::FilePath path = data_dir().AppendASCII("good.crx"); 2636 InstallCRX(path, INSTALL_NEW); 2637 2638 // Try upgrading with a bad signature. This should fail during the unpack, 2639 // because the key will not match the signature. 2640 path = data_dir().AppendASCII("bad_signature.crx"); 2641 InstallCRX(path, INSTALL_FAILED); 2642 } 2643 2644 // Test a normal update via the UpdateExtension API 2645 TEST_F(ExtensionServiceTest, UpdateExtension) { 2646 InitializeEmptyExtensionService(); 2647 2648 base::FilePath path = data_dir().AppendASCII("good.crx"); 2649 2650 const Extension* good = InstallCRX(path, INSTALL_NEW); 2651 ASSERT_EQ("1.0.0.0", good->VersionString()); 2652 ASSERT_EQ(good_crx, good->id()); 2653 2654 path = data_dir().AppendASCII("good2.crx"); 2655 UpdateExtension(good_crx, path, ENABLED); 2656 ASSERT_EQ( 2657 "1.0.0.1", 2658 service()->GetExtensionById(good_crx, false)->version()->GetString()); 2659 } 2660 2661 // Extensions should not be updated during browser shutdown. 2662 TEST_F(ExtensionServiceTest, UpdateExtensionDuringShutdown) { 2663 InitializeEmptyExtensionService(); 2664 2665 // Install an extension. 2666 base::FilePath path = data_dir().AppendASCII("good.crx"); 2667 const Extension* good = InstallCRX(path, INSTALL_NEW); 2668 ASSERT_EQ(good_crx, good->id()); 2669 2670 // Simulate shutdown. 2671 service()->set_browser_terminating_for_test(true); 2672 2673 // Update should fail and extension should not be updated. 2674 path = data_dir().AppendASCII("good2.crx"); 2675 bool updated = service()->UpdateExtension(good_crx, path, true, NULL); 2676 ASSERT_FALSE(updated); 2677 ASSERT_EQ( 2678 "1.0.0.0", 2679 service()->GetExtensionById(good_crx, false)->version()->GetString()); 2680 } 2681 2682 // Test updating a not-already-installed extension - this should fail 2683 TEST_F(ExtensionServiceTest, UpdateNotInstalledExtension) { 2684 InitializeEmptyExtensionService(); 2685 2686 base::FilePath path = data_dir().AppendASCII("good.crx"); 2687 UpdateExtension(good_crx, path, UPDATED); 2688 base::RunLoop().RunUntilIdle(); 2689 2690 ASSERT_EQ(0u, registry()->enabled_extensions().size()); 2691 ASSERT_FALSE(installed_); 2692 ASSERT_EQ(0u, loaded_.size()); 2693 } 2694 2695 // Makes sure you can't downgrade an extension via UpdateExtension 2696 TEST_F(ExtensionServiceTest, UpdateWillNotDowngrade) { 2697 InitializeEmptyExtensionService(); 2698 2699 base::FilePath path = data_dir().AppendASCII("good2.crx"); 2700 2701 const Extension* good = InstallCRX(path, INSTALL_NEW); 2702 ASSERT_EQ("1.0.0.1", good->VersionString()); 2703 ASSERT_EQ(good_crx, good->id()); 2704 2705 // Change path from good2.crx -> good.crx 2706 path = data_dir().AppendASCII("good.crx"); 2707 UpdateExtension(good_crx, path, FAILED); 2708 ASSERT_EQ( 2709 "1.0.0.1", 2710 service()->GetExtensionById(good_crx, false)->version()->GetString()); 2711 } 2712 2713 // Make sure calling update with an identical version does nothing 2714 TEST_F(ExtensionServiceTest, UpdateToSameVersionIsNoop) { 2715 InitializeEmptyExtensionService(); 2716 2717 base::FilePath path = data_dir().AppendASCII("good.crx"); 2718 2719 const Extension* good = InstallCRX(path, INSTALL_NEW); 2720 ASSERT_EQ(good_crx, good->id()); 2721 UpdateExtension(good_crx, path, FAILED_SILENTLY); 2722 } 2723 2724 // Tests that updating an extension does not clobber old state. 2725 TEST_F(ExtensionServiceTest, UpdateExtensionPreservesState) { 2726 InitializeEmptyExtensionService(); 2727 2728 base::FilePath path = data_dir().AppendASCII("good.crx"); 2729 2730 const Extension* good = InstallCRX(path, INSTALL_NEW); 2731 ASSERT_EQ("1.0.0.0", good->VersionString()); 2732 ASSERT_EQ(good_crx, good->id()); 2733 2734 // Disable it and allow it to run in incognito. These settings should carry 2735 // over to the updated version. 2736 service()->DisableExtension(good->id(), Extension::DISABLE_USER_ACTION); 2737 extensions::util::SetIsIncognitoEnabled(good->id(), profile(), true); 2738 ExtensionPrefs::Get(profile()) 2739 ->SetDidExtensionEscalatePermissions(good, true); 2740 2741 path = data_dir().AppendASCII("good2.crx"); 2742 UpdateExtension(good_crx, path, INSTALLED); 2743 ASSERT_EQ(1u, registry()->disabled_extensions().size()); 2744 const Extension* good2 = service()->GetExtensionById(good_crx, true); 2745 ASSERT_EQ("1.0.0.1", good2->version()->GetString()); 2746 EXPECT_TRUE(extensions::util::IsIncognitoEnabled(good2->id(), profile())); 2747 EXPECT_TRUE(ExtensionPrefs::Get(profile()) 2748 ->DidExtensionEscalatePermissions(good2->id())); 2749 } 2750 2751 // Tests that updating preserves extension location. 2752 TEST_F(ExtensionServiceTest, UpdateExtensionPreservesLocation) { 2753 InitializeEmptyExtensionService(); 2754 2755 base::FilePath path = data_dir().AppendASCII("good.crx"); 2756 2757 const Extension* good = 2758 InstallCRXWithLocation(path, Manifest::EXTERNAL_PREF, INSTALL_NEW); 2759 2760 ASSERT_EQ("1.0.0.0", good->VersionString()); 2761 ASSERT_EQ(good_crx, good->id()); 2762 2763 path = data_dir().AppendASCII("good2.crx"); 2764 UpdateExtension(good_crx, path, ENABLED); 2765 const Extension* good2 = service()->GetExtensionById(good_crx, false); 2766 ASSERT_EQ("1.0.0.1", good2->version()->GetString()); 2767 EXPECT_EQ(good2->location(), Manifest::EXTERNAL_PREF); 2768 } 2769 2770 // Makes sure that LOAD extension types can downgrade. 2771 TEST_F(ExtensionServiceTest, LoadExtensionsCanDowngrade) { 2772 InitializeEmptyExtensionService(); 2773 2774 base::ScopedTempDir temp; 2775 ASSERT_TRUE(temp.CreateUniqueTempDir()); 2776 2777 // We'll write the extension manifest dynamically to a temporary path 2778 // to make it easier to change the version number. 2779 base::FilePath extension_path = temp.path(); 2780 base::FilePath manifest_path = 2781 extension_path.Append(extensions::kManifestFilename); 2782 ASSERT_FALSE(base::PathExists(manifest_path)); 2783 2784 // Start with version 2.0. 2785 base::DictionaryValue manifest; 2786 manifest.SetString("version", "2.0"); 2787 manifest.SetString("name", "LOAD Downgrade Test"); 2788 manifest.SetInteger("manifest_version", 2); 2789 2790 JSONFileValueSerializer serializer(manifest_path); 2791 ASSERT_TRUE(serializer.Serialize(manifest)); 2792 2793 extensions::UnpackedInstaller::Create(service())->Load(extension_path); 2794 base::RunLoop().RunUntilIdle(); 2795 2796 EXPECT_EQ(0u, GetErrors().size()); 2797 ASSERT_EQ(1u, loaded_.size()); 2798 EXPECT_EQ(Manifest::UNPACKED, loaded_[0]->location()); 2799 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 2800 EXPECT_EQ("2.0", loaded_[0]->VersionString()); 2801 2802 // Now set the version number to 1.0, reload the extensions and verify that 2803 // the downgrade was accepted. 2804 manifest.SetString("version", "1.0"); 2805 ASSERT_TRUE(serializer.Serialize(manifest)); 2806 2807 extensions::UnpackedInstaller::Create(service())->Load(extension_path); 2808 base::RunLoop().RunUntilIdle(); 2809 2810 EXPECT_EQ(0u, GetErrors().size()); 2811 ASSERT_EQ(1u, loaded_.size()); 2812 EXPECT_EQ(Manifest::UNPACKED, loaded_[0]->location()); 2813 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 2814 EXPECT_EQ("1.0", loaded_[0]->VersionString()); 2815 } 2816 2817 #if !defined(OS_POSIX) || defined(OS_MACOSX) 2818 // LOAD extensions with plugins require approval. 2819 // Only run this on platforms that support NPAPI plugins. 2820 TEST_F(ExtensionServiceTest, LoadExtensionsWithPlugins) { 2821 base::FilePath extension_with_plugin_path = good1_path(); 2822 base::FilePath extension_no_plugin_path = good2_path(); 2823 2824 InitPluginService(); 2825 InitializeEmptyExtensionService(); 2826 InitializeProcessManager(); 2827 service()->set_show_extensions_prompts(true); 2828 2829 // Start by canceling any install prompts. 2830 ExtensionInstallPrompt::g_auto_confirm_for_tests = 2831 ExtensionInstallPrompt::CANCEL; 2832 2833 // The extension that has a plugin should not install. 2834 extensions::UnpackedInstaller::Create(service()) 2835 ->Load(extension_with_plugin_path); 2836 base::RunLoop().RunUntilIdle(); 2837 EXPECT_EQ(0u, GetErrors().size()); 2838 EXPECT_EQ(0u, loaded_.size()); 2839 EXPECT_EQ(0u, registry()->enabled_extensions().size()); 2840 EXPECT_EQ(0u, registry()->disabled_extensions().size()); 2841 2842 // But the extension with no plugin should since there's no prompt. 2843 ExtensionErrorReporter::GetInstance()->ClearErrors(); 2844 extensions::UnpackedInstaller::Create(service()) 2845 ->Load(extension_no_plugin_path); 2846 base::RunLoop().RunUntilIdle(); 2847 EXPECT_EQ(0u, GetErrors().size()); 2848 EXPECT_EQ(1u, loaded_.size()); 2849 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 2850 EXPECT_EQ(0u, registry()->disabled_extensions().size()); 2851 EXPECT_TRUE(registry()->enabled_extensions().Contains(good2)); 2852 2853 // The plugin extension should install if we accept the dialog. 2854 ExtensionInstallPrompt::g_auto_confirm_for_tests = 2855 ExtensionInstallPrompt::ACCEPT; 2856 2857 ExtensionErrorReporter::GetInstance()->ClearErrors(); 2858 extensions::UnpackedInstaller::Create(service()) 2859 ->Load(extension_with_plugin_path); 2860 base::RunLoop().RunUntilIdle(); 2861 EXPECT_EQ(0u, GetErrors().size()); 2862 EXPECT_EQ(2u, loaded_.size()); 2863 EXPECT_EQ(2u, registry()->enabled_extensions().size()); 2864 EXPECT_EQ(0u, registry()->disabled_extensions().size()); 2865 EXPECT_TRUE(registry()->enabled_extensions().Contains(good1)); 2866 EXPECT_TRUE(registry()->enabled_extensions().Contains(good2)); 2867 2868 // Make sure the granted permissions have been setup. 2869 scoped_refptr<PermissionSet> permissions( 2870 ExtensionPrefs::Get(profile())->GetGrantedPermissions(good1)); 2871 EXPECT_FALSE(permissions->IsEmpty()); 2872 EXPECT_TRUE(permissions->HasEffectiveFullAccess()); 2873 EXPECT_FALSE(permissions->apis().empty()); 2874 EXPECT_TRUE(permissions->HasAPIPermission(APIPermission::kPlugin)); 2875 2876 // We should be able to reload the extension without getting another prompt. 2877 loaded_.clear(); 2878 ExtensionInstallPrompt::g_auto_confirm_for_tests = 2879 ExtensionInstallPrompt::CANCEL; 2880 2881 service()->ReloadExtension(good1); 2882 base::RunLoop().RunUntilIdle(); 2883 EXPECT_EQ(1u, loaded_.size()); 2884 EXPECT_EQ(2u, registry()->enabled_extensions().size()); 2885 EXPECT_EQ(0u, registry()->disabled_extensions().size()); 2886 } 2887 #endif // !defined(OS_POSIX) || defined(OS_MACOSX) 2888 2889 namespace { 2890 2891 bool IsExtension(const Extension* extension) { 2892 return extension->GetType() == Manifest::TYPE_EXTENSION; 2893 } 2894 2895 #if defined(ENABLE_BLACKLIST_TESTS) 2896 std::set<std::string> StringSet(const std::string& s) { 2897 std::set<std::string> set; 2898 set.insert(s); 2899 return set; 2900 } 2901 std::set<std::string> StringSet(const std::string& s1, const std::string& s2) { 2902 std::set<std::string> set = StringSet(s1); 2903 set.insert(s2); 2904 return set; 2905 } 2906 #endif // defined(ENABLE_BLACKLIST_TESTS) 2907 2908 } // namespace 2909 2910 // Test adding a pending extension. 2911 TEST_F(ExtensionServiceTest, AddPendingExtensionFromSync) { 2912 InitializeEmptyExtensionService(); 2913 2914 const std::string kFakeId(all_zero); 2915 const GURL kFakeUpdateURL("http:://fake.update/url"); 2916 const bool kFakeInstallSilently(true); 2917 const bool kFakeRemoteInstall(false); 2918 const bool kFakeInstalledByCustodian(false); 2919 2920 EXPECT_TRUE( 2921 service()->pending_extension_manager()->AddFromSync( 2922 kFakeId, 2923 kFakeUpdateURL, 2924 &IsExtension, 2925 kFakeInstallSilently, 2926 kFakeRemoteInstall, 2927 kFakeInstalledByCustodian)); 2928 2929 const extensions::PendingExtensionInfo* pending_extension_info; 2930 ASSERT_TRUE((pending_extension_info = 2931 service()->pending_extension_manager()->GetById(kFakeId))); 2932 EXPECT_EQ(kFakeUpdateURL, pending_extension_info->update_url()); 2933 EXPECT_EQ(&IsExtension, pending_extension_info->should_allow_install_); 2934 EXPECT_EQ(kFakeInstallSilently, pending_extension_info->install_silently()); 2935 // Use 2936 // EXPECT_TRUE(kFakeRemoteInstall == pending_extension_info->remote_install()) 2937 // instead of 2938 // EXPECT_EQ(kFakeRemoteInstall, pending_extension_info->remote_install()) 2939 // as gcc 4.7 issues the following warning on EXPECT_EQ(false, x), which is 2940 // turned into an error with -Werror=conversion-null: 2941 // converting 'false' to pointer type for argument 1 of 2942 // 'char testing::internal::IsNullLiteralHelper(testing::internal::Secret*)' 2943 // https://code.google.com/p/googletest/issues/detail?id=458 2944 EXPECT_TRUE(kFakeRemoteInstall == pending_extension_info->remote_install()); 2945 } 2946 2947 namespace { 2948 const char kGoodId[] = "ldnnhddmnhbkjipkidpdiheffobcpfmf"; 2949 const char kGoodUpdateURL[] = "http://good.update/url"; 2950 const bool kGoodIsFromSync = true; 2951 const bool kGoodInstallSilently = true; 2952 const bool kGoodRemoteInstall = false; 2953 const bool kGoodInstalledByCustodian = false; 2954 } // namespace 2955 2956 // Test updating a pending extension. 2957 TEST_F(ExtensionServiceTest, UpdatePendingExtension) { 2958 InitializeEmptyExtensionService(); 2959 EXPECT_TRUE( 2960 service()->pending_extension_manager()->AddFromSync( 2961 kGoodId, 2962 GURL(kGoodUpdateURL), 2963 &IsExtension, 2964 kGoodInstallSilently, 2965 kGoodRemoteInstall, 2966 kGoodInstalledByCustodian)); 2967 EXPECT_TRUE(service()->pending_extension_manager()->IsIdPending(kGoodId)); 2968 2969 base::FilePath path = data_dir().AppendASCII("good.crx"); 2970 UpdateExtension(kGoodId, path, ENABLED); 2971 2972 EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(kGoodId)); 2973 2974 const Extension* extension = service()->GetExtensionById(kGoodId, true); 2975 ASSERT_TRUE(extension); 2976 } 2977 2978 namespace { 2979 2980 bool IsTheme(const Extension* extension) { 2981 return extension->is_theme(); 2982 } 2983 2984 } // namespace 2985 2986 // Test updating a pending theme. 2987 // Disabled due to ASAN failure. http://crbug.com/108320 2988 TEST_F(ExtensionServiceTest, DISABLED_UpdatePendingTheme) { 2989 InitializeEmptyExtensionService(); 2990 EXPECT_TRUE(service()->pending_extension_manager()->AddFromSync( 2991 theme_crx, GURL(), &IsTheme, false, false, false)); 2992 EXPECT_TRUE(service()->pending_extension_manager()->IsIdPending(theme_crx)); 2993 2994 base::FilePath path = data_dir().AppendASCII("theme.crx"); 2995 UpdateExtension(theme_crx, path, ENABLED); 2996 2997 EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(theme_crx)); 2998 2999 const Extension* extension = service()->GetExtensionById(theme_crx, true); 3000 ASSERT_TRUE(extension); 3001 3002 EXPECT_FALSE( 3003 ExtensionPrefs::Get(profile())->IsExtensionDisabled(extension->id())); 3004 EXPECT_TRUE(service()->IsExtensionEnabled(theme_crx)); 3005 } 3006 3007 #if defined(OS_CHROMEOS) 3008 // Always fails on ChromeOS: http://crbug.com/79737 3009 #define MAYBE_UpdatePendingExternalCrx DISABLED_UpdatePendingExternalCrx 3010 #else 3011 #define MAYBE_UpdatePendingExternalCrx UpdatePendingExternalCrx 3012 #endif 3013 // Test updating a pending CRX as if the source is an external extension 3014 // with an update URL. In this case we don't know if the CRX is a theme 3015 // or not. 3016 TEST_F(ExtensionServiceTest, MAYBE_UpdatePendingExternalCrx) { 3017 InitializeEmptyExtensionService(); 3018 EXPECT_TRUE(service()->pending_extension_manager()->AddFromExternalUpdateUrl( 3019 theme_crx, 3020 std::string(), 3021 GURL(), 3022 Manifest::EXTERNAL_PREF_DOWNLOAD, 3023 Extension::NO_FLAGS, 3024 false)); 3025 3026 EXPECT_TRUE(service()->pending_extension_manager()->IsIdPending(theme_crx)); 3027 3028 base::FilePath path = data_dir().AppendASCII("theme.crx"); 3029 UpdateExtension(theme_crx, path, ENABLED); 3030 3031 EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(theme_crx)); 3032 3033 const Extension* extension = service()->GetExtensionById(theme_crx, true); 3034 ASSERT_TRUE(extension); 3035 3036 EXPECT_FALSE( 3037 ExtensionPrefs::Get(profile())->IsExtensionDisabled(extension->id())); 3038 EXPECT_TRUE(service()->IsExtensionEnabled(extension->id())); 3039 EXPECT_FALSE( 3040 extensions::util::IsIncognitoEnabled(extension->id(), profile())); 3041 } 3042 3043 // Test updating a pending CRX as if the source is an external extension 3044 // with an update URL. The external update should overwrite a sync update, 3045 // but a sync update should not overwrite a non-sync update. 3046 TEST_F(ExtensionServiceTest, UpdatePendingExternalCrxWinsOverSync) { 3047 InitializeEmptyExtensionService(); 3048 3049 // Add a crx to be installed from the update mechanism. 3050 EXPECT_TRUE( 3051 service()->pending_extension_manager()->AddFromSync( 3052 kGoodId, 3053 GURL(kGoodUpdateURL), 3054 &IsExtension, 3055 kGoodInstallSilently, 3056 kGoodRemoteInstall, 3057 kGoodInstalledByCustodian)); 3058 3059 // Check that there is a pending crx, with is_from_sync set to true. 3060 const extensions::PendingExtensionInfo* pending_extension_info; 3061 ASSERT_TRUE((pending_extension_info = 3062 service()->pending_extension_manager()->GetById(kGoodId))); 3063 EXPECT_TRUE(pending_extension_info->is_from_sync()); 3064 3065 // Add a crx to be updated, with the same ID, from a non-sync source. 3066 EXPECT_TRUE(service()->pending_extension_manager()->AddFromExternalUpdateUrl( 3067 kGoodId, 3068 std::string(), 3069 GURL(kGoodUpdateURL), 3070 Manifest::EXTERNAL_PREF_DOWNLOAD, 3071 Extension::NO_FLAGS, 3072 false)); 3073 3074 // Check that there is a pending crx, with is_from_sync set to false. 3075 ASSERT_TRUE((pending_extension_info = 3076 service()->pending_extension_manager()->GetById(kGoodId))); 3077 EXPECT_FALSE(pending_extension_info->is_from_sync()); 3078 EXPECT_EQ(Manifest::EXTERNAL_PREF_DOWNLOAD, 3079 pending_extension_info->install_source()); 3080 3081 // Add a crx to be installed from the update mechanism. 3082 EXPECT_FALSE( 3083 service()->pending_extension_manager()->AddFromSync( 3084 kGoodId, 3085 GURL(kGoodUpdateURL), 3086 &IsExtension, 3087 kGoodInstallSilently, 3088 kGoodRemoteInstall, 3089 kGoodInstalledByCustodian)); 3090 3091 // Check that the external, non-sync update was not overridden. 3092 ASSERT_TRUE((pending_extension_info = 3093 service()->pending_extension_manager()->GetById(kGoodId))); 3094 EXPECT_FALSE(pending_extension_info->is_from_sync()); 3095 EXPECT_EQ(Manifest::EXTERNAL_PREF_DOWNLOAD, 3096 pending_extension_info->install_source()); 3097 } 3098 3099 // Updating a theme should fail if the updater is explicitly told that 3100 // the CRX is not a theme. 3101 TEST_F(ExtensionServiceTest, UpdatePendingCrxThemeMismatch) { 3102 InitializeEmptyExtensionService(); 3103 EXPECT_TRUE(service()->pending_extension_manager()->AddFromSync( 3104 theme_crx, GURL(), &IsExtension, true, false, false)); 3105 3106 EXPECT_TRUE(service()->pending_extension_manager()->IsIdPending(theme_crx)); 3107 3108 base::FilePath path = data_dir().AppendASCII("theme.crx"); 3109 UpdateExtension(theme_crx, path, FAILED_SILENTLY); 3110 3111 EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(theme_crx)); 3112 3113 const Extension* extension = service()->GetExtensionById(theme_crx, true); 3114 ASSERT_FALSE(extension); 3115 } 3116 3117 // TODO(akalin): Test updating a pending extension non-silently once 3118 // we can mock out ExtensionInstallUI and inject our version into 3119 // UpdateExtension(). 3120 3121 // Test updating a pending extension which fails the should-install test. 3122 TEST_F(ExtensionServiceTest, UpdatePendingExtensionFailedShouldInstallTest) { 3123 InitializeEmptyExtensionService(); 3124 // Add pending extension with a flipped is_theme. 3125 EXPECT_TRUE( 3126 service()->pending_extension_manager()->AddFromSync( 3127 kGoodId, 3128 GURL(kGoodUpdateURL), 3129 &IsTheme, 3130 kGoodInstallSilently, 3131 kGoodRemoteInstall, 3132 kGoodInstalledByCustodian)); 3133 EXPECT_TRUE(service()->pending_extension_manager()->IsIdPending(kGoodId)); 3134 3135 base::FilePath path = data_dir().AppendASCII("good.crx"); 3136 UpdateExtension(kGoodId, path, UPDATED); 3137 3138 // TODO(akalin): Figure out how to check that the extensions 3139 // directory is cleaned up properly in OnExtensionInstalled(). 3140 3141 EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(kGoodId)); 3142 } 3143 3144 // TODO(akalin): Figure out how to test that installs of pending 3145 // unsyncable extensions are blocked. 3146 3147 // Test updating a pending extension for one that is not pending. 3148 TEST_F(ExtensionServiceTest, UpdatePendingExtensionNotPending) { 3149 InitializeEmptyExtensionService(); 3150 3151 base::FilePath path = data_dir().AppendASCII("good.crx"); 3152 UpdateExtension(kGoodId, path, UPDATED); 3153 3154 EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(kGoodId)); 3155 } 3156 3157 // Test updating a pending extension for one that is already 3158 // installed. 3159 TEST_F(ExtensionServiceTest, UpdatePendingExtensionAlreadyInstalled) { 3160 InitializeEmptyExtensionService(); 3161 3162 base::FilePath path = data_dir().AppendASCII("good.crx"); 3163 const Extension* good = InstallCRX(path, INSTALL_NEW); 3164 ASSERT_EQ(1u, registry()->enabled_extensions().size()); 3165 3166 EXPECT_FALSE(good->is_theme()); 3167 3168 // Use AddExtensionImpl() as AddFrom*() would balk. 3169 service()->pending_extension_manager()->AddExtensionImpl( 3170 good->id(), 3171 std::string(), 3172 extensions::ManifestURL::GetUpdateURL(good), 3173 Version(), 3174 &IsExtension, 3175 kGoodIsFromSync, 3176 kGoodInstallSilently, 3177 Manifest::INTERNAL, 3178 Extension::NO_FLAGS, 3179 false, 3180 kGoodRemoteInstall); 3181 UpdateExtension(good->id(), path, ENABLED); 3182 3183 EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(kGoodId)); 3184 } 3185 3186 #if defined(ENABLE_BLACKLIST_TESTS) 3187 // Tests blacklisting then unblacklisting extensions after the service has been 3188 // initialized. 3189 TEST_F(ExtensionServiceTest, SetUnsetBlacklistInPrefs) { 3190 extensions::TestBlacklist test_blacklist; 3191 // A profile with 3 extensions installed: good0, good1, and good2. 3192 InitializeGoodInstalledExtensionService(); 3193 test_blacklist.Attach(service()->blacklist_); 3194 service()->Init(); 3195 3196 const extensions::ExtensionSet& enabled_extensions = 3197 registry()->enabled_extensions(); 3198 const extensions::ExtensionSet& blacklisted_extensions = 3199 registry()->blacklisted_extensions(); 3200 3201 EXPECT_TRUE(enabled_extensions.Contains(good0) && 3202 !blacklisted_extensions.Contains(good0)); 3203 EXPECT_TRUE(enabled_extensions.Contains(good1) && 3204 !blacklisted_extensions.Contains(good1)); 3205 EXPECT_TRUE(enabled_extensions.Contains(good2) && 3206 !blacklisted_extensions.Contains(good2)); 3207 3208 EXPECT_FALSE(IsPrefExist(good0, "blacklist")); 3209 EXPECT_FALSE(IsPrefExist(good1, "blacklist")); 3210 EXPECT_FALSE(IsPrefExist(good2, "blacklist")); 3211 EXPECT_FALSE(IsPrefExist("invalid_id", "blacklist")); 3212 3213 // Blacklist good0 and good1 (and an invalid extension ID). 3214 test_blacklist.SetBlacklistState( 3215 good0, extensions::BLACKLISTED_MALWARE, true); 3216 test_blacklist.SetBlacklistState( 3217 good1, extensions::BLACKLISTED_MALWARE, true); 3218 test_blacklist.SetBlacklistState( 3219 "invalid_id", extensions::BLACKLISTED_MALWARE, true); 3220 base::RunLoop().RunUntilIdle(); 3221 3222 EXPECT_TRUE(!enabled_extensions.Contains(good0) && 3223 blacklisted_extensions.Contains(good0)); 3224 EXPECT_TRUE(!enabled_extensions.Contains(good1) && 3225 blacklisted_extensions.Contains(good1)); 3226 EXPECT_TRUE(enabled_extensions.Contains(good2) && 3227 !blacklisted_extensions.Contains(good2)); 3228 3229 EXPECT_TRUE(ValidateBooleanPref(good0, "blacklist", true)); 3230 EXPECT_TRUE(ValidateBooleanPref(good1, "blacklist", true)); 3231 EXPECT_FALSE(IsPrefExist(good2, "blacklist")); 3232 EXPECT_FALSE(IsPrefExist("invalid_id", "blacklist")); 3233 3234 // Un-blacklist good1 and blacklist good2. 3235 test_blacklist.Clear(false); 3236 test_blacklist.SetBlacklistState( 3237 good0, extensions::BLACKLISTED_MALWARE, true); 3238 test_blacklist.SetBlacklistState( 3239 good2, extensions::BLACKLISTED_MALWARE, true); 3240 test_blacklist.SetBlacklistState( 3241 "invalid_id", extensions::BLACKLISTED_MALWARE, true); 3242 base::RunLoop().RunUntilIdle(); 3243 3244 EXPECT_TRUE(!enabled_extensions.Contains(good0) && 3245 blacklisted_extensions.Contains(good0)); 3246 EXPECT_TRUE(enabled_extensions.Contains(good1) && 3247 !blacklisted_extensions.Contains(good1)); 3248 EXPECT_TRUE(!enabled_extensions.Contains(good2) && 3249 blacklisted_extensions.Contains(good2)); 3250 3251 EXPECT_TRUE(ValidateBooleanPref(good0, "blacklist", true)); 3252 EXPECT_FALSE(IsPrefExist(good1, "blacklist")); 3253 EXPECT_TRUE(ValidateBooleanPref(good2, "blacklist", true)); 3254 EXPECT_FALSE(IsPrefExist("invalid_id", "blacklist")); 3255 } 3256 #endif // defined(ENABLE_BLACKLIST_TESTS) 3257 3258 #if defined(ENABLE_BLACKLIST_TESTS) 3259 // Tests trying to install a blacklisted extension. 3260 TEST_F(ExtensionServiceTest, BlacklistedExtensionWillNotInstall) { 3261 scoped_refptr<FakeSafeBrowsingDatabaseManager> blacklist_db( 3262 new FakeSafeBrowsingDatabaseManager(true)); 3263 Blacklist::ScopedDatabaseManagerForTest scoped_blacklist_db(blacklist_db); 3264 3265 InitializeEmptyExtensionService(); 3266 service()->Init(); 3267 3268 // After blacklisting good_crx, we cannot install it. 3269 blacklist_db->SetUnsafe(good_crx).NotifyUpdate(); 3270 base::RunLoop().RunUntilIdle(); 3271 3272 base::FilePath path = data_dir().AppendASCII("good.crx"); 3273 // HACK: specify WAS_INSTALLED_BY_DEFAULT so that test machinery doesn't 3274 // decide to install this silently. Somebody should fix these tests, all 3275 // 6,000 lines of them. Hah! 3276 InstallCRX(path, INSTALL_FAILED, Extension::WAS_INSTALLED_BY_DEFAULT); 3277 EXPECT_EQ(0u, registry()->enabled_extensions().size()); 3278 } 3279 #endif // defined(ENABLE_BLACKLIST_TESTS) 3280 3281 #if defined(ENABLE_BLACKLIST_TESTS) 3282 // Unload blacklisted extension on policy change. 3283 TEST_F(ExtensionServiceTest, UnloadBlacklistedExtensionPolicy) { 3284 extensions::TestBlacklist test_blacklist; 3285 3286 // A profile with no extensions installed. 3287 InitializeEmptyExtensionServiceWithTestingPrefs(); 3288 test_blacklist.Attach(service()->blacklist_); 3289 3290 base::FilePath path = data_dir().AppendASCII("good.crx"); 3291 3292 const Extension* good = InstallCRX(path, INSTALL_NEW); 3293 EXPECT_EQ(good_crx, good->id()); 3294 UpdateExtension(good_crx, path, FAILED_SILENTLY); 3295 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 3296 3297 { 3298 ManagementPrefUpdater pref(profile_->GetTestingPrefService()); 3299 pref.SetIndividualExtensionInstallationAllowed(good_crx, true); 3300 } 3301 3302 test_blacklist.SetBlacklistState( 3303 good_crx, extensions::BLACKLISTED_MALWARE, true); 3304 base::RunLoop().RunUntilIdle(); 3305 3306 // The good_crx is blacklisted and the whitelist doesn't negate it. 3307 ASSERT_TRUE(ValidateBooleanPref(good_crx, "blacklist", true)); 3308 EXPECT_EQ(0u, registry()->enabled_extensions().size()); 3309 } 3310 #endif // defined(ENABLE_BLACKLIST_TESTS) 3311 3312 #if defined(ENABLE_BLACKLIST_TESTS) 3313 // Tests that a blacklisted extension is eventually unloaded on startup, if it 3314 // wasn't already. 3315 TEST_F(ExtensionServiceTest, WillNotLoadBlacklistedExtensionsFromDirectory) { 3316 extensions::TestBlacklist test_blacklist; 3317 3318 // A profile with 3 extensions installed: good0, good1, and good2. 3319 InitializeGoodInstalledExtensionService(); 3320 test_blacklist.Attach(service()->blacklist_); 3321 3322 // Blacklist good1 before the service initializes. 3323 test_blacklist.SetBlacklistState( 3324 good1, extensions::BLACKLISTED_MALWARE, false); 3325 3326 // Load extensions. 3327 service()->Init(); 3328 ASSERT_EQ(3u, loaded_.size()); // hasn't had time to blacklist yet 3329 3330 base::RunLoop().RunUntilIdle(); 3331 3332 ASSERT_EQ(1u, registry()->blacklisted_extensions().size()); 3333 ASSERT_EQ(2u, registry()->enabled_extensions().size()); 3334 3335 ASSERT_TRUE(registry()->enabled_extensions().Contains(good0)); 3336 ASSERT_TRUE(registry()->blacklisted_extensions().Contains(good1)); 3337 ASSERT_TRUE(registry()->enabled_extensions().Contains(good2)); 3338 } 3339 #endif // defined(ENABLE_BLACKLIST_TESTS) 3340 3341 #if defined(ENABLE_BLACKLIST_TESTS) 3342 // Tests extensions blacklisted in prefs on startup; one still blacklisted by 3343 // safe browsing, the other not. The not-blacklisted one should recover. 3344 TEST_F(ExtensionServiceTest, BlacklistedInPrefsFromStartup) { 3345 extensions::TestBlacklist test_blacklist; 3346 3347 InitializeGoodInstalledExtensionService(); 3348 test_blacklist.Attach(service()->blacklist_); 3349 ExtensionPrefs::Get(profile())->SetExtensionBlacklisted(good0, true); 3350 ExtensionPrefs::Get(profile())->SetExtensionBlacklisted(good1, true); 3351 3352 test_blacklist.SetBlacklistState( 3353 good1, extensions::BLACKLISTED_MALWARE, false); 3354 3355 // Extension service hasn't loaded yet, but IsExtensionEnabled reads out of 3356 // prefs. Ensure it takes into account the blacklist state (crbug.com/373842). 3357 EXPECT_FALSE(service()->IsExtensionEnabled(good0)); 3358 EXPECT_FALSE(service()->IsExtensionEnabled(good1)); 3359 EXPECT_TRUE(service()->IsExtensionEnabled(good2)); 3360 3361 service()->Init(); 3362 3363 EXPECT_EQ(2u, registry()->blacklisted_extensions().size()); 3364 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 3365 3366 EXPECT_TRUE(registry()->blacklisted_extensions().Contains(good0)); 3367 EXPECT_TRUE(registry()->blacklisted_extensions().Contains(good1)); 3368 EXPECT_TRUE(registry()->enabled_extensions().Contains(good2)); 3369 3370 // Give time for the blacklist to update. 3371 base::RunLoop().RunUntilIdle(); 3372 3373 EXPECT_EQ(1u, registry()->blacklisted_extensions().size()); 3374 EXPECT_EQ(2u, registry()->enabled_extensions().size()); 3375 3376 EXPECT_TRUE(registry()->enabled_extensions().Contains(good0)); 3377 EXPECT_TRUE(registry()->blacklisted_extensions().Contains(good1)); 3378 EXPECT_TRUE(registry()->enabled_extensions().Contains(good2)); 3379 } 3380 #endif // defined(ENABLE_BLACKLIST_TESTS) 3381 3382 #if defined(ENABLE_BLACKLIST_TESTS) 3383 // Extension is added to blacklist with BLACKLISTED_POTENTIALLY_UNWANTED state 3384 // after it is installed. It is then successfully re-enabled by the user. 3385 TEST_F(ExtensionServiceTest, GreylistedExtensionDisabled) { 3386 extensions::TestBlacklist test_blacklist; 3387 // A profile with 3 extensions installed: good0, good1, and good2. 3388 InitializeGoodInstalledExtensionService(); 3389 test_blacklist.Attach(service()->blacklist_); 3390 service()->Init(); 3391 3392 const extensions::ExtensionSet& enabled_extensions = 3393 registry()->enabled_extensions(); 3394 const extensions::ExtensionSet& disabled_extensions = 3395 registry()->disabled_extensions(); 3396 3397 EXPECT_TRUE(enabled_extensions.Contains(good0)); 3398 EXPECT_TRUE(enabled_extensions.Contains(good1)); 3399 EXPECT_TRUE(enabled_extensions.Contains(good2)); 3400 3401 // Blacklist good0 and good1 (and an invalid extension ID). 3402 test_blacklist.SetBlacklistState( 3403 good0, extensions::BLACKLISTED_CWS_POLICY_VIOLATION, true); 3404 test_blacklist.SetBlacklistState( 3405 good1, extensions::BLACKLISTED_POTENTIALLY_UNWANTED, true); 3406 test_blacklist.SetBlacklistState( 3407 "invalid_id", extensions::BLACKLISTED_MALWARE, true); 3408 base::RunLoop().RunUntilIdle(); 3409 3410 EXPECT_FALSE(enabled_extensions.Contains(good0)); 3411 EXPECT_TRUE(disabled_extensions.Contains(good0)); 3412 EXPECT_FALSE(enabled_extensions.Contains(good1)); 3413 EXPECT_TRUE(disabled_extensions.Contains(good1)); 3414 EXPECT_TRUE(enabled_extensions.Contains(good2)); 3415 EXPECT_FALSE(disabled_extensions.Contains(good2)); 3416 3417 ValidateIntegerPref( 3418 good0, "blacklist_state", extensions::BLACKLISTED_CWS_POLICY_VIOLATION); 3419 ValidateIntegerPref( 3420 good1, "blacklist_state", extensions::BLACKLISTED_POTENTIALLY_UNWANTED); 3421 3422 // Now user enables good0. 3423 service()->EnableExtension(good0); 3424 3425 EXPECT_TRUE(enabled_extensions.Contains(good0)); 3426 EXPECT_FALSE(disabled_extensions.Contains(good0)); 3427 EXPECT_FALSE(enabled_extensions.Contains(good1)); 3428 EXPECT_TRUE(disabled_extensions.Contains(good1)); 3429 3430 // Remove extensions from blacklist. 3431 test_blacklist.SetBlacklistState( 3432 good0, extensions::NOT_BLACKLISTED, true); 3433 test_blacklist.SetBlacklistState( 3434 good1, extensions::NOT_BLACKLISTED, true); 3435 base::RunLoop().RunUntilIdle(); 3436 3437 // All extensions are enabled. 3438 EXPECT_TRUE(enabled_extensions.Contains(good0)); 3439 EXPECT_FALSE(disabled_extensions.Contains(good0)); 3440 EXPECT_TRUE(enabled_extensions.Contains(good1)); 3441 EXPECT_FALSE(disabled_extensions.Contains(good1)); 3442 EXPECT_TRUE(enabled_extensions.Contains(good2)); 3443 EXPECT_FALSE(disabled_extensions.Contains(good2)); 3444 } 3445 #endif // defined(ENABLE_BLACKLIST_TESTS) 3446 3447 #if defined(ENABLE_BLACKLIST_TESTS) 3448 // When extension is removed from greylist, do not re-enable it if it is 3449 // disabled by user. 3450 TEST_F(ExtensionServiceTest, GreylistDontEnableManuallyDisabled) { 3451 extensions::TestBlacklist test_blacklist; 3452 // A profile with 3 extensions installed: good0, good1, and good2. 3453 InitializeGoodInstalledExtensionService(); 3454 test_blacklist.Attach(service()->blacklist_); 3455 service()->Init(); 3456 3457 const extensions::ExtensionSet& enabled_extensions = 3458 registry()->enabled_extensions(); 3459 const extensions::ExtensionSet& disabled_extensions = 3460 registry()->disabled_extensions(); 3461 3462 // Manually disable. 3463 service()->DisableExtension(good0, 3464 extensions::Extension::DISABLE_USER_ACTION); 3465 3466 test_blacklist.SetBlacklistState( 3467 good0, extensions::BLACKLISTED_CWS_POLICY_VIOLATION, true); 3468 test_blacklist.SetBlacklistState( 3469 good1, extensions::BLACKLISTED_POTENTIALLY_UNWANTED, true); 3470 test_blacklist.SetBlacklistState( 3471 good2, extensions::BLACKLISTED_SECURITY_VULNERABILITY, true); 3472 base::RunLoop().RunUntilIdle(); 3473 3474 // All extensions disabled. 3475 EXPECT_FALSE(enabled_extensions.Contains(good0)); 3476 EXPECT_TRUE(disabled_extensions.Contains(good0)); 3477 EXPECT_FALSE(enabled_extensions.Contains(good1)); 3478 EXPECT_TRUE(disabled_extensions.Contains(good1)); 3479 EXPECT_FALSE(enabled_extensions.Contains(good2)); 3480 EXPECT_TRUE(disabled_extensions.Contains(good2)); 3481 3482 // Greylisted extension can be enabled. 3483 service()->EnableExtension(good1); 3484 EXPECT_TRUE(enabled_extensions.Contains(good1)); 3485 EXPECT_FALSE(disabled_extensions.Contains(good1)); 3486 3487 // good1 is now manually disabled. 3488 service()->DisableExtension(good1, 3489 extensions::Extension::DISABLE_USER_ACTION); 3490 EXPECT_FALSE(enabled_extensions.Contains(good1)); 3491 EXPECT_TRUE(disabled_extensions.Contains(good1)); 3492 3493 // Remove extensions from blacklist. 3494 test_blacklist.SetBlacklistState( 3495 good0, extensions::NOT_BLACKLISTED, true); 3496 test_blacklist.SetBlacklistState( 3497 good1, extensions::NOT_BLACKLISTED, true); 3498 test_blacklist.SetBlacklistState( 3499 good2, extensions::NOT_BLACKLISTED, true); 3500 base::RunLoop().RunUntilIdle(); 3501 3502 // good0 and good1 remain disabled. 3503 EXPECT_FALSE(enabled_extensions.Contains(good0)); 3504 EXPECT_TRUE(disabled_extensions.Contains(good0)); 3505 EXPECT_FALSE(enabled_extensions.Contains(good1)); 3506 EXPECT_TRUE(disabled_extensions.Contains(good1)); 3507 EXPECT_TRUE(enabled_extensions.Contains(good2)); 3508 EXPECT_FALSE(disabled_extensions.Contains(good2)); 3509 } 3510 #endif // defined(ENABLE_BLACKLIST_TESTS) 3511 3512 #if defined(ENABLE_BLACKLIST_TESTS) 3513 // Blacklisted extension with unknown state are not enabled/disabled. 3514 TEST_F(ExtensionServiceTest, GreylistUnknownDontChange) { 3515 extensions::TestBlacklist test_blacklist; 3516 // A profile with 3 extensions installed: good0, good1, and good2. 3517 InitializeGoodInstalledExtensionService(); 3518 test_blacklist.Attach(service()->blacklist_); 3519 service()->Init(); 3520 3521 const extensions::ExtensionSet& enabled_extensions = 3522 registry()->enabled_extensions(); 3523 const extensions::ExtensionSet& disabled_extensions = 3524 registry()->disabled_extensions(); 3525 3526 test_blacklist.SetBlacklistState( 3527 good0, extensions::BLACKLISTED_CWS_POLICY_VIOLATION, true); 3528 test_blacklist.SetBlacklistState( 3529 good1, extensions::BLACKLISTED_POTENTIALLY_UNWANTED, true); 3530 base::RunLoop().RunUntilIdle(); 3531 3532 EXPECT_FALSE(enabled_extensions.Contains(good0)); 3533 EXPECT_TRUE(disabled_extensions.Contains(good0)); 3534 EXPECT_FALSE(enabled_extensions.Contains(good1)); 3535 EXPECT_TRUE(disabled_extensions.Contains(good1)); 3536 EXPECT_TRUE(enabled_extensions.Contains(good2)); 3537 EXPECT_FALSE(disabled_extensions.Contains(good2)); 3538 3539 test_blacklist.SetBlacklistState( 3540 good0, extensions::NOT_BLACKLISTED, true); 3541 test_blacklist.SetBlacklistState( 3542 good1, extensions::BLACKLISTED_UNKNOWN, true); 3543 test_blacklist.SetBlacklistState( 3544 good2, extensions::BLACKLISTED_UNKNOWN, true); 3545 base::RunLoop().RunUntilIdle(); 3546 3547 // good0 re-enabled, other remain as they were. 3548 EXPECT_TRUE(enabled_extensions.Contains(good0)); 3549 EXPECT_FALSE(disabled_extensions.Contains(good0)); 3550 EXPECT_FALSE(enabled_extensions.Contains(good1)); 3551 EXPECT_TRUE(disabled_extensions.Contains(good1)); 3552 EXPECT_TRUE(enabled_extensions.Contains(good2)); 3553 EXPECT_FALSE(disabled_extensions.Contains(good2)); 3554 } 3555 3556 // Tests that blacklisted extensions cannot be reloaded, both those loaded 3557 // before and after extension service startup. 3558 TEST_F(ExtensionServiceTest, ReloadBlacklistedExtension) { 3559 extensions::TestBlacklist test_blacklist; 3560 3561 InitializeGoodInstalledExtensionService(); 3562 test_blacklist.Attach(service()->blacklist_); 3563 3564 test_blacklist.SetBlacklistState( 3565 good1, extensions::BLACKLISTED_MALWARE, false); 3566 service()->Init(); 3567 test_blacklist.SetBlacklistState( 3568 good2, extensions::BLACKLISTED_MALWARE, false); 3569 base::RunLoop().RunUntilIdle(); 3570 3571 EXPECT_EQ(StringSet(good0), registry()->enabled_extensions().GetIDs()); 3572 EXPECT_EQ(StringSet(good1, good2), 3573 registry()->blacklisted_extensions().GetIDs()); 3574 3575 service()->ReloadExtension(good1); 3576 service()->ReloadExtension(good2); 3577 base::RunLoop().RunUntilIdle(); 3578 3579 EXPECT_EQ(StringSet(good0), registry()->enabled_extensions().GetIDs()); 3580 EXPECT_EQ(StringSet(good1, good2), 3581 registry()->blacklisted_extensions().GetIDs()); 3582 } 3583 3584 #endif // defined(ENABLE_BLACKLIST_TESTS) 3585 3586 // Will not install extension blacklisted by policy. 3587 TEST_F(ExtensionServiceTest, BlacklistedByPolicyWillNotInstall) { 3588 InitializeEmptyExtensionServiceWithTestingPrefs(); 3589 3590 // Blacklist everything. 3591 { 3592 ManagementPrefUpdater pref(profile_->GetTestingPrefService()); 3593 pref.SetBlacklistedByDefault(true); 3594 } 3595 3596 // Blacklist prevents us from installing good_crx. 3597 base::FilePath path = data_dir().AppendASCII("good.crx"); 3598 InstallCRX(path, INSTALL_FAILED); 3599 EXPECT_EQ(0u, registry()->enabled_extensions().size()); 3600 3601 // Now whitelist this particular extension. 3602 { 3603 ManagementPrefUpdater pref(profile_->GetTestingPrefService()); 3604 pref.SetIndividualExtensionInstallationAllowed(good_crx, true); 3605 } 3606 3607 // Ensure we can now install good_crx. 3608 InstallCRX(path, INSTALL_NEW); 3609 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 3610 } 3611 3612 // Extension blacklisted by policy get unloaded after installing. 3613 TEST_F(ExtensionServiceTest, BlacklistedByPolicyRemovedIfRunning) { 3614 InitializeEmptyExtensionServiceWithTestingPrefs(); 3615 3616 // Install good_crx. 3617 base::FilePath path = data_dir().AppendASCII("good.crx"); 3618 InstallCRX(path, INSTALL_NEW); 3619 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 3620 3621 { 3622 ManagementPrefUpdater pref(profile_->GetTestingPrefService()); 3623 // Blacklist this extension. 3624 pref.SetIndividualExtensionInstallationAllowed(good_crx, false); 3625 } 3626 3627 // Extension should not be running now. 3628 base::RunLoop().RunUntilIdle(); 3629 EXPECT_EQ(0u, registry()->enabled_extensions().size()); 3630 } 3631 3632 // Tests that component extensions are not blacklisted by policy. 3633 TEST_F(ExtensionServiceTest, ComponentExtensionWhitelisted) { 3634 InitializeEmptyExtensionServiceWithTestingPrefs(); 3635 3636 // Blacklist everything. 3637 { 3638 ManagementPrefUpdater pref(profile_->GetTestingPrefService()); 3639 pref.SetBlacklistedByDefault(true); 3640 } 3641 3642 // Install a component extension. 3643 base::FilePath path = data_dir() 3644 .AppendASCII("good") 3645 .AppendASCII("Extensions") 3646 .AppendASCII(good0) 3647 .AppendASCII("1.0.0.0"); 3648 std::string manifest; 3649 ASSERT_TRUE(base::ReadFileToString( 3650 path.Append(extensions::kManifestFilename), &manifest)); 3651 service()->component_loader()->Add(manifest, path); 3652 service()->Init(); 3653 3654 // Extension should be installed despite blacklist. 3655 ASSERT_EQ(1u, registry()->enabled_extensions().size()); 3656 EXPECT_TRUE(service()->GetExtensionById(good0, false)); 3657 3658 // Poke external providers and make sure the extension is still present. 3659 service()->CheckForExternalUpdates(); 3660 ASSERT_EQ(1u, registry()->enabled_extensions().size()); 3661 EXPECT_TRUE(service()->GetExtensionById(good0, false)); 3662 3663 // Extension should not be uninstalled on blacklist changes. 3664 { 3665 ManagementPrefUpdater pref(profile_->GetTestingPrefService()); 3666 pref.SetIndividualExtensionInstallationAllowed(good0, false); 3667 } 3668 base::RunLoop().RunUntilIdle(); 3669 ASSERT_EQ(1u, registry()->enabled_extensions().size()); 3670 EXPECT_TRUE(service()->GetExtensionById(good0, false)); 3671 } 3672 3673 // Tests that policy-installed extensions are not blacklisted by policy. 3674 TEST_F(ExtensionServiceTest, PolicyInstalledExtensionsWhitelisted) { 3675 InitializeEmptyExtensionServiceWithTestingPrefs(); 3676 3677 { 3678 ManagementPrefUpdater pref(profile_->GetTestingPrefService()); 3679 // Blacklist everything. 3680 pref.SetBlacklistedByDefault(true); 3681 // Mark good.crx for force-installation. 3682 pref.SetIndividualExtensionAutoInstalled( 3683 good_crx, "http://example.com/update_url", true); 3684 } 3685 3686 // Have policy force-install an extension. 3687 MockExtensionProvider* provider = 3688 new MockExtensionProvider(service(), Manifest::EXTERNAL_POLICY_DOWNLOAD); 3689 AddMockExternalProvider(provider); 3690 provider->UpdateOrAddExtension( 3691 good_crx, "1.0.0.0", data_dir().AppendASCII("good.crx")); 3692 3693 // Reloading extensions should find our externally registered extension 3694 // and install it. 3695 content::WindowedNotificationObserver observer( 3696 extensions::NOTIFICATION_CRX_INSTALLER_DONE, 3697 content::NotificationService::AllSources()); 3698 service()->CheckForExternalUpdates(); 3699 observer.Wait(); 3700 3701 // Extension should be installed despite blacklist. 3702 ASSERT_EQ(1u, registry()->enabled_extensions().size()); 3703 EXPECT_TRUE(service()->GetExtensionById(good_crx, false)); 3704 3705 // Blacklist update should not uninstall the extension. 3706 { 3707 ManagementPrefUpdater pref(profile_->GetTestingPrefService()); 3708 pref.SetIndividualExtensionInstallationAllowed(good0, false); 3709 } 3710 base::RunLoop().RunUntilIdle(); 3711 ASSERT_EQ(1u, registry()->enabled_extensions().size()); 3712 EXPECT_TRUE(service()->GetExtensionById(good_crx, false)); 3713 } 3714 3715 // Tests that extensions cannot be installed if the policy provider prohibits 3716 // it. This functionality is implemented in CrxInstaller::ConfirmInstall(). 3717 TEST_F(ExtensionServiceTest, ManagementPolicyProhibitsInstall) { 3718 InitializeEmptyExtensionService(); 3719 3720 GetManagementPolicy()->UnregisterAllProviders(); 3721 extensions::TestManagementPolicyProvider provider_( 3722 extensions::TestManagementPolicyProvider::PROHIBIT_LOAD); 3723 GetManagementPolicy()->RegisterProvider(&provider_); 3724 3725 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_FAILED); 3726 EXPECT_EQ(0u, registry()->enabled_extensions().size()); 3727 } 3728 3729 // Tests that extensions cannot be loaded from prefs if the policy provider 3730 // prohibits it. This functionality is implemented in InstalledLoader::Load(). 3731 TEST_F(ExtensionServiceTest, ManagementPolicyProhibitsLoadFromPrefs) { 3732 InitializeEmptyExtensionService(); 3733 3734 // Create a fake extension to be loaded as though it were read from prefs. 3735 base::FilePath path = 3736 data_dir().AppendASCII("management").AppendASCII("simple_extension"); 3737 base::DictionaryValue manifest; 3738 manifest.SetString(keys::kName, "simple_extension"); 3739 manifest.SetString(keys::kVersion, "1"); 3740 // UNPACKED is for extensions loaded from a directory. We use it here, even 3741 // though we're testing loading from prefs, so that we don't need to provide 3742 // an extension key. 3743 extensions::ExtensionInfo extension_info( 3744 &manifest, std::string(), path, Manifest::UNPACKED); 3745 3746 // Ensure we can load it with no management policy in place. 3747 GetManagementPolicy()->UnregisterAllProviders(); 3748 EXPECT_EQ(0u, registry()->enabled_extensions().size()); 3749 extensions::InstalledLoader(service()).Load(extension_info, false); 3750 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 3751 3752 const Extension* extension = 3753 (registry()->enabled_extensions().begin())->get(); 3754 EXPECT_TRUE( 3755 service()->UninstallExtension(extension->id(), 3756 extensions::UNINSTALL_REASON_FOR_TESTING, 3757 base::Bind(&base::DoNothing), 3758 NULL)); 3759 EXPECT_EQ(0u, registry()->enabled_extensions().size()); 3760 3761 // Ensure we cannot load it if management policy prohibits installation. 3762 extensions::TestManagementPolicyProvider provider_( 3763 extensions::TestManagementPolicyProvider::PROHIBIT_LOAD); 3764 GetManagementPolicy()->RegisterProvider(&provider_); 3765 3766 extensions::InstalledLoader(service()).Load(extension_info, false); 3767 EXPECT_EQ(0u, registry()->enabled_extensions().size()); 3768 } 3769 3770 // Tests disabling an extension when prohibited by the ManagementPolicy. 3771 TEST_F(ExtensionServiceTest, ManagementPolicyProhibitsDisable) { 3772 InitializeEmptyExtensionService(); 3773 3774 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 3775 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 3776 EXPECT_EQ(0u, registry()->disabled_extensions().size()); 3777 3778 GetManagementPolicy()->UnregisterAllProviders(); 3779 extensions::TestManagementPolicyProvider provider( 3780 extensions::TestManagementPolicyProvider::PROHIBIT_MODIFY_STATUS); 3781 GetManagementPolicy()->RegisterProvider(&provider); 3782 3783 // Attempt to disable it. 3784 service()->DisableExtension(good_crx, Extension::DISABLE_USER_ACTION); 3785 3786 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 3787 EXPECT_TRUE(service()->GetExtensionById(good_crx, false)); 3788 EXPECT_EQ(0u, registry()->disabled_extensions().size()); 3789 } 3790 3791 // Tests uninstalling an extension when prohibited by the ManagementPolicy. 3792 TEST_F(ExtensionServiceTest, ManagementPolicyProhibitsUninstall) { 3793 InitializeEmptyExtensionService(); 3794 3795 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 3796 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 3797 EXPECT_EQ(0u, registry()->disabled_extensions().size()); 3798 3799 GetManagementPolicy()->UnregisterAllProviders(); 3800 extensions::TestManagementPolicyProvider provider( 3801 extensions::TestManagementPolicyProvider::PROHIBIT_MODIFY_STATUS); 3802 GetManagementPolicy()->RegisterProvider(&provider); 3803 3804 // Attempt to uninstall it. 3805 EXPECT_FALSE( 3806 service()->UninstallExtension(good_crx, 3807 extensions::UNINSTALL_REASON_FOR_TESTING, 3808 base::Bind(&base::DoNothing), 3809 NULL)); 3810 3811 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 3812 EXPECT_TRUE(service()->GetExtensionById(good_crx, false)); 3813 } 3814 3815 // Tests that previously installed extensions that are now prohibited from 3816 // being installed are removed. 3817 TEST_F(ExtensionServiceTest, ManagementPolicyUnloadsAllProhibited) { 3818 InitializeEmptyExtensionService(); 3819 3820 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 3821 InstallCRX(data_dir().AppendASCII("page_action.crx"), INSTALL_NEW); 3822 EXPECT_EQ(2u, registry()->enabled_extensions().size()); 3823 EXPECT_EQ(0u, registry()->disabled_extensions().size()); 3824 3825 GetManagementPolicy()->UnregisterAllProviders(); 3826 extensions::TestManagementPolicyProvider provider( 3827 extensions::TestManagementPolicyProvider::PROHIBIT_LOAD); 3828 GetManagementPolicy()->RegisterProvider(&provider); 3829 3830 // Run the policy check. 3831 service()->CheckManagementPolicy(); 3832 EXPECT_EQ(0u, registry()->enabled_extensions().size()); 3833 EXPECT_EQ(0u, registry()->disabled_extensions().size()); 3834 } 3835 3836 // Tests that previously disabled extensions that are now required to be 3837 // enabled are re-enabled on reinstall. 3838 TEST_F(ExtensionServiceTest, ManagementPolicyRequiresEnable) { 3839 InitializeEmptyExtensionService(); 3840 3841 // Install, then disable, an extension. 3842 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 3843 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 3844 service()->DisableExtension(good_crx, Extension::DISABLE_USER_ACTION); 3845 EXPECT_EQ(1u, registry()->disabled_extensions().size()); 3846 3847 // Register an ExtensionMnagementPolicy that requires the extension to remain 3848 // enabled. 3849 GetManagementPolicy()->UnregisterAllProviders(); 3850 extensions::TestManagementPolicyProvider provider( 3851 extensions::TestManagementPolicyProvider::MUST_REMAIN_ENABLED); 3852 GetManagementPolicy()->RegisterProvider(&provider); 3853 3854 // Reinstall the extension. 3855 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_UPDATED); 3856 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 3857 EXPECT_EQ(0u, registry()->disabled_extensions().size()); 3858 } 3859 3860 // Flaky on windows; http://crbug.com/309833 3861 #if defined(OS_WIN) 3862 #define MAYBE_ExternalExtensionAutoAcknowledgement DISABLED_ExternalExtensionAutoAcknowledgement 3863 #else 3864 #define MAYBE_ExternalExtensionAutoAcknowledgement ExternalExtensionAutoAcknowledgement 3865 #endif 3866 TEST_F(ExtensionServiceTest, MAYBE_ExternalExtensionAutoAcknowledgement) { 3867 InitializeEmptyExtensionService(); 3868 service()->set_extensions_enabled(true); 3869 3870 { 3871 // Register and install an external extension. 3872 MockExtensionProvider* provider = 3873 new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF); 3874 AddMockExternalProvider(provider); 3875 provider->UpdateOrAddExtension( 3876 good_crx, "1.0.0.0", data_dir().AppendASCII("good.crx")); 3877 } 3878 { 3879 // Have policy force-install an extension. 3880 MockExtensionProvider* provider = new MockExtensionProvider( 3881 service(), Manifest::EXTERNAL_POLICY_DOWNLOAD); 3882 AddMockExternalProvider(provider); 3883 provider->UpdateOrAddExtension( 3884 page_action, "1.0.0.0", data_dir().AppendASCII("page_action.crx")); 3885 } 3886 3887 // Providers are set up. Let them run. 3888 int count = 2; 3889 content::WindowedNotificationObserver observer( 3890 extensions::NOTIFICATION_CRX_INSTALLER_DONE, 3891 base::Bind(&WaitForCountNotificationsCallback, &count)); 3892 service()->CheckForExternalUpdates(); 3893 3894 observer.Wait(); 3895 3896 ASSERT_EQ(2u, registry()->enabled_extensions().size()); 3897 EXPECT_TRUE(service()->GetExtensionById(good_crx, false)); 3898 EXPECT_TRUE(service()->GetExtensionById(page_action, false)); 3899 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile()); 3900 ASSERT_TRUE(!prefs->IsExternalExtensionAcknowledged(good_crx)); 3901 ASSERT_TRUE(prefs->IsExternalExtensionAcknowledged(page_action)); 3902 } 3903 3904 #if !defined(OS_CHROMEOS) 3905 // This tests if default apps are installed correctly. 3906 TEST_F(ExtensionServiceTest, DefaultAppsInstall) { 3907 InitializeEmptyExtensionService(); 3908 service()->set_extensions_enabled(true); 3909 3910 { 3911 std::string json_data = 3912 "{" 3913 " \"ldnnhddmnhbkjipkidpdiheffobcpfmf\" : {" 3914 " \"external_crx\": \"good.crx\"," 3915 " \"external_version\": \"1.0.0.0\"," 3916 " \"is_bookmark_app\": false" 3917 " }" 3918 "}"; 3919 default_apps::Provider* provider = new default_apps::Provider( 3920 profile(), 3921 service(), 3922 new extensions::ExternalTestingLoader(json_data, data_dir()), 3923 Manifest::INTERNAL, 3924 Manifest::INVALID_LOCATION, 3925 Extension::FROM_WEBSTORE | Extension::WAS_INSTALLED_BY_DEFAULT); 3926 3927 AddMockExternalProvider(provider); 3928 } 3929 3930 ASSERT_EQ(0u, registry()->enabled_extensions().size()); 3931 content::WindowedNotificationObserver observer( 3932 extensions::NOTIFICATION_CRX_INSTALLER_DONE, 3933 content::NotificationService::AllSources()); 3934 service()->CheckForExternalUpdates(); 3935 observer.Wait(); 3936 3937 ASSERT_EQ(1u, registry()->enabled_extensions().size()); 3938 EXPECT_TRUE(service()->GetExtensionById(good_crx, false)); 3939 const Extension* extension = service()->GetExtensionById(good_crx, false); 3940 EXPECT_TRUE(extension->from_webstore()); 3941 EXPECT_TRUE(extension->was_installed_by_default()); 3942 } 3943 #endif 3944 3945 // Tests disabling extensions 3946 TEST_F(ExtensionServiceTest, DisableExtension) { 3947 InitializeEmptyExtensionService(); 3948 3949 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 3950 EXPECT_TRUE(service()->GetExtensionById(good_crx, true)); 3951 EXPECT_TRUE(service()->GetExtensionById(good_crx, false)); 3952 3953 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 3954 EXPECT_EQ(0u, registry()->disabled_extensions().size()); 3955 EXPECT_EQ(0u, registry()->terminated_extensions().size()); 3956 EXPECT_EQ(0u, registry()->blacklisted_extensions().size()); 3957 3958 // Disable it. 3959 service()->DisableExtension(good_crx, Extension::DISABLE_USER_ACTION); 3960 3961 EXPECT_TRUE(service()->GetExtensionById(good_crx, true)); 3962 EXPECT_FALSE(service()->GetExtensionById(good_crx, false)); 3963 EXPECT_EQ(0u, registry()->enabled_extensions().size()); 3964 EXPECT_EQ(1u, registry()->disabled_extensions().size()); 3965 EXPECT_EQ(0u, registry()->terminated_extensions().size()); 3966 EXPECT_EQ(0u, registry()->blacklisted_extensions().size()); 3967 } 3968 3969 TEST_F(ExtensionServiceTest, TerminateExtension) { 3970 InitializeEmptyExtensionService(); 3971 3972 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 3973 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 3974 EXPECT_EQ(0u, registry()->disabled_extensions().size()); 3975 EXPECT_EQ(0u, registry()->terminated_extensions().size()); 3976 EXPECT_EQ(0u, registry()->blacklisted_extensions().size()); 3977 3978 TerminateExtension(good_crx); 3979 3980 EXPECT_EQ(0u, registry()->enabled_extensions().size()); 3981 EXPECT_EQ(0u, registry()->disabled_extensions().size()); 3982 EXPECT_EQ(1u, registry()->terminated_extensions().size()); 3983 EXPECT_EQ(0u, registry()->blacklisted_extensions().size()); 3984 } 3985 3986 TEST_F(ExtensionServiceTest, DisableTerminatedExtension) { 3987 InitializeEmptyExtensionService(); 3988 3989 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 3990 TerminateExtension(good_crx); 3991 EXPECT_TRUE(registry()->GetExtensionById( 3992 good_crx, extensions::ExtensionRegistry::TERMINATED)); 3993 3994 // Disable it. 3995 service()->DisableExtension(good_crx, Extension::DISABLE_USER_ACTION); 3996 3997 EXPECT_FALSE(registry()->GetExtensionById( 3998 good_crx, extensions::ExtensionRegistry::TERMINATED)); 3999 EXPECT_TRUE(service()->GetExtensionById(good_crx, true)); 4000 4001 EXPECT_EQ(0u, registry()->enabled_extensions().size()); 4002 EXPECT_EQ(1u, registry()->disabled_extensions().size()); 4003 EXPECT_EQ(0u, registry()->terminated_extensions().size()); 4004 EXPECT_EQ(0u, registry()->blacklisted_extensions().size()); 4005 } 4006 4007 // Tests disabling all extensions (simulating --disable-extensions flag). 4008 TEST_F(ExtensionServiceTest, DisableAllExtensions) { 4009 InitializeEmptyExtensionService(); 4010 4011 base::FilePath path = data_dir().AppendASCII("good.crx"); 4012 InstallCRX(path, INSTALL_NEW); 4013 4014 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 4015 EXPECT_EQ(0u, registry()->disabled_extensions().size()); 4016 4017 // Disable extensions. 4018 service()->set_extensions_enabled(false); 4019 service()->ReloadExtensionsForTest(); 4020 4021 // There shouldn't be extensions in either list. 4022 EXPECT_EQ(0u, registry()->enabled_extensions().size()); 4023 EXPECT_EQ(0u, registry()->disabled_extensions().size()); 4024 4025 // This shouldn't do anything when all extensions are disabled. 4026 service()->EnableExtension(good_crx); 4027 service()->ReloadExtensionsForTest(); 4028 4029 // There still shouldn't be extensions in either list. 4030 EXPECT_EQ(0u, registry()->enabled_extensions().size()); 4031 EXPECT_EQ(0u, registry()->disabled_extensions().size()); 4032 4033 // And then re-enable the extensions. 4034 service()->set_extensions_enabled(true); 4035 service()->ReloadExtensionsForTest(); 4036 4037 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 4038 EXPECT_EQ(0u, registry()->disabled_extensions().size()); 4039 } 4040 4041 // Tests reloading extensions. 4042 TEST_F(ExtensionServiceTest, ReloadExtensions) { 4043 InitializeEmptyExtensionService(); 4044 4045 // Simple extension that should install without error. 4046 base::FilePath path = data_dir().AppendASCII("good.crx"); 4047 InstallCRX(path, INSTALL_NEW, 4048 Extension::FROM_WEBSTORE | Extension::WAS_INSTALLED_BY_DEFAULT); 4049 const char* extension_id = good_crx; 4050 service()->DisableExtension(extension_id, Extension::DISABLE_USER_ACTION); 4051 4052 EXPECT_EQ(0u, registry()->enabled_extensions().size()); 4053 EXPECT_EQ(1u, registry()->disabled_extensions().size()); 4054 4055 service()->ReloadExtensionsForTest(); 4056 4057 // The creation flags should not change when reloading the extension. 4058 const Extension* extension = service()->GetExtensionById(good_crx, true); 4059 EXPECT_TRUE(extension->from_webstore()); 4060 EXPECT_TRUE(extension->was_installed_by_default()); 4061 EXPECT_FALSE(extension->from_bookmark()); 4062 4063 // Extension counts shouldn't change. 4064 EXPECT_EQ(0u, registry()->enabled_extensions().size()); 4065 EXPECT_EQ(1u, registry()->disabled_extensions().size()); 4066 4067 service()->EnableExtension(extension_id); 4068 4069 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 4070 EXPECT_EQ(0u, registry()->disabled_extensions().size()); 4071 4072 // Need to clear |loaded_| manually before reloading as the 4073 // EnableExtension() call above inserted into it and 4074 // UnloadAllExtensions() doesn't send out notifications. 4075 loaded_.clear(); 4076 service()->ReloadExtensionsForTest(); 4077 4078 // Extension counts shouldn't change. 4079 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 4080 EXPECT_EQ(0u, registry()->disabled_extensions().size()); 4081 } 4082 4083 // Tests reloading an extension. 4084 TEST_F(ExtensionServiceTest, ReloadExtension) { 4085 InitializeEmptyExtensionService(); 4086 InitializeProcessManager(); 4087 4088 // Simple extension that should install without error. 4089 const char* extension_id = "behllobkkfkfnphdnhnkndlbkcpglgmj"; 4090 base::FilePath ext = data_dir() 4091 .AppendASCII("good") 4092 .AppendASCII("Extensions") 4093 .AppendASCII(extension_id) 4094 .AppendASCII("1.0.0.0"); 4095 extensions::UnpackedInstaller::Create(service())->Load(ext); 4096 base::RunLoop().RunUntilIdle(); 4097 4098 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 4099 EXPECT_EQ(0u, registry()->disabled_extensions().size()); 4100 4101 service()->ReloadExtension(extension_id); 4102 4103 // Extension should be disabled now, waiting to be reloaded. 4104 EXPECT_EQ(0u, registry()->enabled_extensions().size()); 4105 EXPECT_EQ(1u, registry()->disabled_extensions().size()); 4106 EXPECT_EQ(Extension::DISABLE_RELOAD, 4107 ExtensionPrefs::Get(profile())->GetDisableReasons(extension_id)); 4108 4109 // Reloading again should not crash. 4110 service()->ReloadExtension(extension_id); 4111 4112 // Finish reloading 4113 base::RunLoop().RunUntilIdle(); 4114 4115 // Extension should be enabled again. 4116 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 4117 EXPECT_EQ(0u, registry()->disabled_extensions().size()); 4118 } 4119 4120 TEST_F(ExtensionServiceTest, UninstallExtension) { 4121 InitializeEmptyExtensionService(); 4122 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 4123 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 4124 UninstallExtension(good_crx, false); 4125 EXPECT_EQ(0u, registry()->enabled_extensions().size()); 4126 EXPECT_EQ(UnloadedExtensionInfo::REASON_UNINSTALL, unloaded_reason_); 4127 } 4128 4129 TEST_F(ExtensionServiceTest, UninstallTerminatedExtension) { 4130 InitializeEmptyExtensionService(); 4131 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 4132 TerminateExtension(good_crx); 4133 UninstallExtension(good_crx, false); 4134 EXPECT_EQ(UnloadedExtensionInfo::REASON_TERMINATE, unloaded_reason_); 4135 } 4136 4137 // Tests the uninstaller helper. 4138 TEST_F(ExtensionServiceTest, UninstallExtensionHelper) { 4139 InitializeEmptyExtensionService(); 4140 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 4141 UninstallExtension(good_crx, true); 4142 EXPECT_EQ(UnloadedExtensionInfo::REASON_UNINSTALL, unloaded_reason_); 4143 } 4144 4145 TEST_F(ExtensionServiceTest, UninstallExtensionHelperTerminated) { 4146 InitializeEmptyExtensionService(); 4147 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 4148 TerminateExtension(good_crx); 4149 UninstallExtension(good_crx, true); 4150 EXPECT_EQ(UnloadedExtensionInfo::REASON_TERMINATE, unloaded_reason_); 4151 } 4152 4153 // An extension disabled because of unsupported requirements should re-enabled 4154 // if updated to a version with supported requirements as long as there are no 4155 // other disable reasons. 4156 TEST_F(ExtensionServiceTest, UpgradingRequirementsEnabled) { 4157 InitializeEmptyExtensionService(); 4158 BlackListWebGL(); 4159 4160 base::FilePath path = data_dir().AppendASCII("requirements"); 4161 base::FilePath pem_path = 4162 data_dir().AppendASCII("requirements").AppendASCII("v1_good.pem"); 4163 const Extension* extension_v1 = PackAndInstallCRX(path.AppendASCII("v1_good"), 4164 pem_path, 4165 INSTALL_NEW); 4166 std::string id = extension_v1->id(); 4167 EXPECT_TRUE(service()->IsExtensionEnabled(id)); 4168 4169 base::FilePath v2_bad_requirements_crx = GetTemporaryFile(); 4170 4171 PackCRX(path.AppendASCII("v2_bad_requirements"), 4172 pem_path, 4173 v2_bad_requirements_crx); 4174 UpdateExtension(id, v2_bad_requirements_crx, INSTALLED); 4175 EXPECT_FALSE(service()->IsExtensionEnabled(id)); 4176 4177 base::FilePath v3_good_crx = GetTemporaryFile(); 4178 4179 PackCRX(path.AppendASCII("v3_good"), pem_path, v3_good_crx); 4180 UpdateExtension(id, v3_good_crx, ENABLED); 4181 EXPECT_TRUE(service()->IsExtensionEnabled(id)); 4182 } 4183 4184 // Extensions disabled through user action should stay disabled. 4185 TEST_F(ExtensionServiceTest, UpgradingRequirementsDisabled) { 4186 InitializeEmptyExtensionService(); 4187 BlackListWebGL(); 4188 4189 base::FilePath path = data_dir().AppendASCII("requirements"); 4190 base::FilePath pem_path = 4191 data_dir().AppendASCII("requirements").AppendASCII("v1_good.pem"); 4192 const Extension* extension_v1 = PackAndInstallCRX(path.AppendASCII("v1_good"), 4193 pem_path, 4194 INSTALL_NEW); 4195 std::string id = extension_v1->id(); 4196 service()->DisableExtension(id, Extension::DISABLE_USER_ACTION); 4197 EXPECT_FALSE(service()->IsExtensionEnabled(id)); 4198 4199 base::FilePath v2_bad_requirements_crx = GetTemporaryFile(); 4200 4201 PackCRX(path.AppendASCII("v2_bad_requirements"), 4202 pem_path, 4203 v2_bad_requirements_crx); 4204 UpdateExtension(id, v2_bad_requirements_crx, INSTALLED); 4205 EXPECT_FALSE(service()->IsExtensionEnabled(id)); 4206 4207 base::FilePath v3_good_crx = GetTemporaryFile(); 4208 4209 PackCRX(path.AppendASCII("v3_good"), pem_path, v3_good_crx); 4210 UpdateExtension(id, v3_good_crx, INSTALLED); 4211 EXPECT_FALSE(service()->IsExtensionEnabled(id)); 4212 } 4213 4214 // The extension should not re-enabled because it was disabled from a 4215 // permission increase. 4216 TEST_F(ExtensionServiceTest, UpgradingRequirementsPermissions) { 4217 InitializeEmptyExtensionService(); 4218 BlackListWebGL(); 4219 4220 base::FilePath path = data_dir().AppendASCII("requirements"); 4221 base::FilePath pem_path = 4222 data_dir().AppendASCII("requirements").AppendASCII("v1_good.pem"); 4223 const Extension* extension_v1 = PackAndInstallCRX(path.AppendASCII("v1_good"), 4224 pem_path, 4225 INSTALL_NEW); 4226 std::string id = extension_v1->id(); 4227 EXPECT_TRUE(service()->IsExtensionEnabled(id)); 4228 4229 base::FilePath v2_bad_requirements_and_permissions_crx = GetTemporaryFile(); 4230 4231 PackCRX(path.AppendASCII("v2_bad_requirements_and_permissions"), 4232 pem_path, 4233 v2_bad_requirements_and_permissions_crx); 4234 UpdateExtension(id, v2_bad_requirements_and_permissions_crx, INSTALLED); 4235 EXPECT_FALSE(service()->IsExtensionEnabled(id)); 4236 4237 base::FilePath v3_bad_permissions_crx = GetTemporaryFile(); 4238 4239 PackCRX(path.AppendASCII("v3_bad_permissions"), 4240 pem_path, 4241 v3_bad_permissions_crx); 4242 UpdateExtension(id, v3_bad_permissions_crx, INSTALLED); 4243 EXPECT_FALSE(service()->IsExtensionEnabled(id)); 4244 } 4245 4246 // Unpacked extensions are not allowed to be installed if they have unsupported 4247 // requirements. 4248 TEST_F(ExtensionServiceTest, UnpackedRequirements) { 4249 InitializeEmptyExtensionService(); 4250 BlackListWebGL(); 4251 4252 base::FilePath path = 4253 data_dir().AppendASCII("requirements").AppendASCII("v2_bad_requirements"); 4254 extensions::UnpackedInstaller::Create(service())->Load(path); 4255 base::RunLoop().RunUntilIdle(); 4256 EXPECT_EQ(1u, GetErrors().size()); 4257 EXPECT_EQ(0u, registry()->enabled_extensions().size()); 4258 } 4259 4260 class ExtensionCookieCallback { 4261 public: 4262 ExtensionCookieCallback() 4263 : result_(false), 4264 weak_factory_(base::MessageLoop::current()) {} 4265 4266 void SetCookieCallback(bool result) { 4267 base::MessageLoop::current()->PostTask(FROM_HERE, 4268 base::Bind(&base::MessageLoop::Quit, weak_factory_.GetWeakPtr())); 4269 result_ = result; 4270 } 4271 4272 void GetAllCookiesCallback(const net::CookieList& list) { 4273 base::MessageLoop::current()->PostTask(FROM_HERE, 4274 base::Bind(&base::MessageLoop::Quit, weak_factory_.GetWeakPtr())); 4275 list_ = list; 4276 } 4277 net::CookieList list_; 4278 bool result_; 4279 base::WeakPtrFactory<base::MessageLoop> weak_factory_; 4280 }; 4281 4282 // Verifies extension state is removed upon uninstall. 4283 TEST_F(ExtensionServiceTest, ClearExtensionData) { 4284 InitializeEmptyExtensionService(); 4285 ExtensionCookieCallback callback; 4286 4287 // Load a test extension. 4288 base::FilePath path = data_dir(); 4289 path = path.AppendASCII("good.crx"); 4290 const Extension* extension = InstallCRX(path, INSTALL_NEW); 4291 ASSERT_TRUE(extension); 4292 GURL ext_url(extension->url()); 4293 std::string origin_id = storage::GetIdentifierFromOrigin(ext_url); 4294 4295 // Set a cookie for the extension. 4296 net::CookieMonster* cookie_monster = profile() 4297 ->GetRequestContextForExtensions() 4298 ->GetURLRequestContext() 4299 ->cookie_store() 4300 ->GetCookieMonster(); 4301 ASSERT_TRUE(cookie_monster); 4302 net::CookieOptions options; 4303 cookie_monster->SetCookieWithOptionsAsync( 4304 ext_url, "dummy=value", options, 4305 base::Bind(&ExtensionCookieCallback::SetCookieCallback, 4306 base::Unretained(&callback))); 4307 base::RunLoop().RunUntilIdle(); 4308 EXPECT_TRUE(callback.result_); 4309 4310 cookie_monster->GetAllCookiesForURLAsync( 4311 ext_url, 4312 base::Bind(&ExtensionCookieCallback::GetAllCookiesCallback, 4313 base::Unretained(&callback))); 4314 base::RunLoop().RunUntilIdle(); 4315 EXPECT_EQ(1U, callback.list_.size()); 4316 4317 // Open a database. 4318 storage::DatabaseTracker* db_tracker = 4319 BrowserContext::GetDefaultStoragePartition(profile()) 4320 ->GetDatabaseTracker(); 4321 base::string16 db_name = base::UTF8ToUTF16("db"); 4322 base::string16 description = base::UTF8ToUTF16("db_description"); 4323 int64 size; 4324 db_tracker->DatabaseOpened(origin_id, db_name, description, 1, &size); 4325 db_tracker->DatabaseClosed(origin_id, db_name); 4326 std::vector<storage::OriginInfo> origins; 4327 db_tracker->GetAllOriginsInfo(&origins); 4328 EXPECT_EQ(1U, origins.size()); 4329 EXPECT_EQ(origin_id, origins[0].GetOriginIdentifier()); 4330 4331 // Create local storage. We only simulate this by creating the backing files. 4332 // Note: This test depends on details of how the dom_storage library 4333 // stores data in the host file system. 4334 base::FilePath lso_dir_path = 4335 profile()->GetPath().AppendASCII("Local Storage"); 4336 base::FilePath lso_file_path = lso_dir_path.AppendASCII(origin_id) 4337 .AddExtension(FILE_PATH_LITERAL(".localstorage")); 4338 EXPECT_TRUE(base::CreateDirectory(lso_dir_path)); 4339 EXPECT_EQ(0, base::WriteFile(lso_file_path, NULL, 0)); 4340 EXPECT_TRUE(base::PathExists(lso_file_path)); 4341 4342 // Create indexed db. Similarly, it is enough to only simulate this by 4343 // creating the directory on the disk. 4344 IndexedDBContext* idb_context = BrowserContext::GetDefaultStoragePartition( 4345 profile())->GetIndexedDBContext(); 4346 idb_context->SetTaskRunnerForTesting( 4347 base::MessageLoop::current()->message_loop_proxy().get()); 4348 base::FilePath idb_path = idb_context->GetFilePathForTesting(origin_id); 4349 EXPECT_TRUE(base::CreateDirectory(idb_path)); 4350 EXPECT_TRUE(base::DirectoryExists(idb_path)); 4351 4352 // Uninstall the extension. 4353 base::RunLoop run_loop; 4354 ASSERT_TRUE( 4355 service()->UninstallExtension(good_crx, 4356 extensions::UNINSTALL_REASON_FOR_TESTING, 4357 run_loop.QuitClosure(), 4358 NULL)); 4359 // The data deletion happens on the IO thread. 4360 run_loop.Run(); 4361 4362 // Check that the cookie is gone. 4363 cookie_monster->GetAllCookiesForURLAsync( 4364 ext_url, 4365 base::Bind(&ExtensionCookieCallback::GetAllCookiesCallback, 4366 base::Unretained(&callback))); 4367 base::RunLoop().RunUntilIdle(); 4368 EXPECT_EQ(0U, callback.list_.size()); 4369 4370 // The database should have vanished as well. 4371 origins.clear(); 4372 db_tracker->GetAllOriginsInfo(&origins); 4373 EXPECT_EQ(0U, origins.size()); 4374 4375 // Check that the LSO file has been removed. 4376 EXPECT_FALSE(base::PathExists(lso_file_path)); 4377 4378 // Check if the indexed db has disappeared too. 4379 EXPECT_FALSE(base::DirectoryExists(idb_path)); 4380 } 4381 4382 // Verifies app state is removed upon uninstall. 4383 TEST_F(ExtensionServiceTest, ClearAppData) { 4384 InitializeEmptyExtensionService(); 4385 ExtensionCookieCallback callback; 4386 4387 int pref_count = 0; 4388 4389 // Install app1 with unlimited storage. 4390 const Extension* extension = 4391 PackAndInstallCRX(data_dir().AppendASCII("app1"), INSTALL_NEW); 4392 ValidatePrefKeyCount(++pref_count); 4393 ASSERT_EQ(1u, registry()->enabled_extensions().size()); 4394 const std::string id1 = extension->id(); 4395 EXPECT_TRUE(extension->permissions_data()->HasAPIPermission( 4396 APIPermission::kUnlimitedStorage)); 4397 const GURL origin1( 4398 extensions::AppLaunchInfo::GetFullLaunchURL(extension).GetOrigin()); 4399 EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited( 4400 origin1)); 4401 std::string origin_id = storage::GetIdentifierFromOrigin(origin1); 4402 4403 // Install app2 from the same origin with unlimited storage. 4404 extension = PackAndInstallCRX(data_dir().AppendASCII("app2"), INSTALL_NEW); 4405 ValidatePrefKeyCount(++pref_count); 4406 ASSERT_EQ(2u, registry()->enabled_extensions().size()); 4407 const std::string id2 = extension->id(); 4408 EXPECT_TRUE(extension->permissions_data()->HasAPIPermission( 4409 APIPermission::kUnlimitedStorage)); 4410 EXPECT_TRUE(extension->web_extent().MatchesURL( 4411 extensions::AppLaunchInfo::GetFullLaunchURL(extension))); 4412 const GURL origin2( 4413 extensions::AppLaunchInfo::GetFullLaunchURL(extension).GetOrigin()); 4414 EXPECT_EQ(origin1, origin2); 4415 EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited( 4416 origin2)); 4417 4418 // Set a cookie for the extension. 4419 net::CookieMonster* cookie_monster = profile() 4420 ->GetRequestContext() 4421 ->GetURLRequestContext() 4422 ->cookie_store() 4423 ->GetCookieMonster(); 4424 ASSERT_TRUE(cookie_monster); 4425 net::CookieOptions options; 4426 cookie_monster->SetCookieWithOptionsAsync( 4427 origin1, "dummy=value", options, 4428 base::Bind(&ExtensionCookieCallback::SetCookieCallback, 4429 base::Unretained(&callback))); 4430 base::RunLoop().RunUntilIdle(); 4431 EXPECT_TRUE(callback.result_); 4432 4433 cookie_monster->GetAllCookiesForURLAsync( 4434 origin1, 4435 base::Bind(&ExtensionCookieCallback::GetAllCookiesCallback, 4436 base::Unretained(&callback))); 4437 base::RunLoop().RunUntilIdle(); 4438 EXPECT_EQ(1U, callback.list_.size()); 4439 4440 // Open a database. 4441 storage::DatabaseTracker* db_tracker = 4442 BrowserContext::GetDefaultStoragePartition(profile()) 4443 ->GetDatabaseTracker(); 4444 base::string16 db_name = base::UTF8ToUTF16("db"); 4445 base::string16 description = base::UTF8ToUTF16("db_description"); 4446 int64 size; 4447 db_tracker->DatabaseOpened(origin_id, db_name, description, 1, &size); 4448 db_tracker->DatabaseClosed(origin_id, db_name); 4449 std::vector<storage::OriginInfo> origins; 4450 db_tracker->GetAllOriginsInfo(&origins); 4451 EXPECT_EQ(1U, origins.size()); 4452 EXPECT_EQ(origin_id, origins[0].GetOriginIdentifier()); 4453 4454 // Create local storage. We only simulate this by creating the backing files. 4455 // Note: This test depends on details of how the dom_storage library 4456 // stores data in the host file system. 4457 base::FilePath lso_dir_path = 4458 profile()->GetPath().AppendASCII("Local Storage"); 4459 base::FilePath lso_file_path = lso_dir_path.AppendASCII(origin_id) 4460 .AddExtension(FILE_PATH_LITERAL(".localstorage")); 4461 EXPECT_TRUE(base::CreateDirectory(lso_dir_path)); 4462 EXPECT_EQ(0, base::WriteFile(lso_file_path, NULL, 0)); 4463 EXPECT_TRUE(base::PathExists(lso_file_path)); 4464 4465 // Create indexed db. Similarly, it is enough to only simulate this by 4466 // creating the directory on the disk. 4467 IndexedDBContext* idb_context = BrowserContext::GetDefaultStoragePartition( 4468 profile())->GetIndexedDBContext(); 4469 idb_context->SetTaskRunnerForTesting( 4470 base::MessageLoop::current()->message_loop_proxy().get()); 4471 base::FilePath idb_path = idb_context->GetFilePathForTesting(origin_id); 4472 EXPECT_TRUE(base::CreateDirectory(idb_path)); 4473 EXPECT_TRUE(base::DirectoryExists(idb_path)); 4474 4475 // Uninstall one of them, unlimited storage should still be granted 4476 // to the origin. 4477 UninstallExtension(id1, false); 4478 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 4479 EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited( 4480 origin1)); 4481 4482 // Check that the cookie is still there. 4483 cookie_monster->GetAllCookiesForURLAsync( 4484 origin1, 4485 base::Bind(&ExtensionCookieCallback::GetAllCookiesCallback, 4486 base::Unretained(&callback))); 4487 base::RunLoop().RunUntilIdle(); 4488 EXPECT_EQ(1U, callback.list_.size()); 4489 4490 // Now uninstall the other. Storage should be cleared for the apps. 4491 UninstallExtension(id2, false); 4492 EXPECT_EQ(0u, registry()->enabled_extensions().size()); 4493 EXPECT_FALSE( 4494 profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited( 4495 origin1)); 4496 4497 // Check that the cookie is gone. 4498 cookie_monster->GetAllCookiesForURLAsync( 4499 origin1, 4500 base::Bind(&ExtensionCookieCallback::GetAllCookiesCallback, 4501 base::Unretained(&callback))); 4502 base::RunLoop().RunUntilIdle(); 4503 EXPECT_EQ(0U, callback.list_.size()); 4504 4505 // The database should have vanished as well. 4506 origins.clear(); 4507 db_tracker->GetAllOriginsInfo(&origins); 4508 EXPECT_EQ(0U, origins.size()); 4509 4510 // Check that the LSO file has been removed. 4511 EXPECT_FALSE(base::PathExists(lso_file_path)); 4512 4513 // Check if the indexed db has disappeared too. 4514 EXPECT_FALSE(base::DirectoryExists(idb_path)); 4515 } 4516 4517 // Tests loading single extensions (like --load-extension) 4518 // Flaky crashes. http://crbug.com/231806 4519 TEST_F(ExtensionServiceTest, DISABLED_LoadExtension) { 4520 InitializeEmptyExtensionService(); 4521 4522 base::FilePath ext1 = data_dir() 4523 .AppendASCII("good") 4524 .AppendASCII("Extensions") 4525 .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj") 4526 .AppendASCII("1.0.0.0"); 4527 extensions::UnpackedInstaller::Create(service())->Load(ext1); 4528 base::RunLoop().RunUntilIdle(); 4529 EXPECT_EQ(0u, GetErrors().size()); 4530 ASSERT_EQ(1u, loaded_.size()); 4531 EXPECT_EQ(Manifest::UNPACKED, loaded_[0]->location()); 4532 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 4533 4534 ValidatePrefKeyCount(1); 4535 4536 base::FilePath no_manifest = 4537 data_dir() 4538 .AppendASCII("bad") 4539 // .AppendASCII("Extensions") 4540 .AppendASCII("cccccccccccccccccccccccccccccccc") 4541 .AppendASCII("1"); 4542 extensions::UnpackedInstaller::Create(service())->Load(no_manifest); 4543 base::RunLoop().RunUntilIdle(); 4544 EXPECT_EQ(1u, GetErrors().size()); 4545 ASSERT_EQ(1u, loaded_.size()); 4546 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 4547 4548 // Test uninstall. 4549 std::string id = loaded_[0]->id(); 4550 EXPECT_FALSE(unloaded_id_.length()); 4551 service()->UninstallExtension(id, 4552 extensions::UNINSTALL_REASON_FOR_TESTING, 4553 base::Bind(&base::DoNothing), 4554 NULL); 4555 base::RunLoop().RunUntilIdle(); 4556 EXPECT_EQ(id, unloaded_id_); 4557 ASSERT_EQ(0u, loaded_.size()); 4558 EXPECT_EQ(0u, registry()->enabled_extensions().size()); 4559 } 4560 4561 // Tests that we generate IDs when they are not specified in the manifest for 4562 // --load-extension. 4563 TEST_F(ExtensionServiceTest, GenerateID) { 4564 InitializeEmptyExtensionService(); 4565 4566 base::FilePath no_id_ext = data_dir().AppendASCII("no_id"); 4567 extensions::UnpackedInstaller::Create(service())->Load(no_id_ext); 4568 base::RunLoop().RunUntilIdle(); 4569 EXPECT_EQ(0u, GetErrors().size()); 4570 ASSERT_EQ(1u, loaded_.size()); 4571 ASSERT_TRUE(crx_file::id_util::IdIsValid(loaded_[0]->id())); 4572 EXPECT_EQ(loaded_[0]->location(), Manifest::UNPACKED); 4573 4574 ValidatePrefKeyCount(1); 4575 4576 std::string previous_id = loaded_[0]->id(); 4577 4578 // If we reload the same path, we should get the same extension ID. 4579 extensions::UnpackedInstaller::Create(service())->Load(no_id_ext); 4580 base::RunLoop().RunUntilIdle(); 4581 ASSERT_EQ(1u, loaded_.size()); 4582 ASSERT_EQ(previous_id, loaded_[0]->id()); 4583 } 4584 4585 TEST_F(ExtensionServiceTest, UnpackedValidatesLocales) { 4586 InitializeEmptyExtensionService(); 4587 4588 base::FilePath bad_locale = 4589 data_dir().AppendASCII("unpacked").AppendASCII("bad_messages_file"); 4590 extensions::UnpackedInstaller::Create(service())->Load(bad_locale); 4591 base::RunLoop().RunUntilIdle(); 4592 EXPECT_EQ(1u, GetErrors().size()); 4593 base::FilePath ms_messages_file = bad_locale.AppendASCII("_locales") 4594 .AppendASCII("ms") 4595 .AppendASCII("messages.json"); 4596 EXPECT_THAT(base::UTF16ToUTF8(GetErrors()[0]), testing::AllOf( 4597 testing::HasSubstr( 4598 base::UTF16ToUTF8(ms_messages_file.LossyDisplayName())), 4599 testing::HasSubstr("Dictionary keys must be quoted."))); 4600 ASSERT_EQ(0u, loaded_.size()); 4601 } 4602 4603 void ExtensionServiceTest::TestExternalProvider( 4604 MockExtensionProvider* provider, Manifest::Location location) { 4605 // Verify that starting with no providers loads no extensions. 4606 service()->Init(); 4607 ASSERT_EQ(0u, loaded_.size()); 4608 4609 provider->set_visit_count(0); 4610 4611 // Register a test extension externally using the mock registry provider. 4612 base::FilePath source_path = data_dir().AppendASCII("good.crx"); 4613 4614 // Add the extension. 4615 provider->UpdateOrAddExtension(good_crx, "1.0.0.0", source_path); 4616 4617 // Reloading extensions should find our externally registered extension 4618 // and install it. 4619 content::WindowedNotificationObserver observer( 4620 extensions::NOTIFICATION_CRX_INSTALLER_DONE, 4621 content::NotificationService::AllSources()); 4622 service()->CheckForExternalUpdates(); 4623 observer.Wait(); 4624 4625 ASSERT_EQ(0u, GetErrors().size()); 4626 ASSERT_EQ(1u, loaded_.size()); 4627 ASSERT_EQ(location, loaded_[0]->location()); 4628 ASSERT_EQ("1.0.0.0", loaded_[0]->version()->GetString()); 4629 ValidatePrefKeyCount(1); 4630 ValidateIntegerPref(good_crx, "state", Extension::ENABLED); 4631 ValidateIntegerPref(good_crx, "location", location); 4632 4633 // Reload extensions without changing anything. The extension should be 4634 // loaded again. 4635 loaded_.clear(); 4636 service()->ReloadExtensionsForTest(); 4637 base::RunLoop().RunUntilIdle(); 4638 ASSERT_EQ(0u, GetErrors().size()); 4639 ASSERT_EQ(1u, loaded_.size()); 4640 ValidatePrefKeyCount(1); 4641 ValidateIntegerPref(good_crx, "state", Extension::ENABLED); 4642 ValidateIntegerPref(good_crx, "location", location); 4643 4644 // Now update the extension with a new version. We should get upgraded. 4645 source_path = source_path.DirName().AppendASCII("good2.crx"); 4646 provider->UpdateOrAddExtension(good_crx, "1.0.0.1", source_path); 4647 4648 loaded_.clear(); 4649 content::WindowedNotificationObserver observer_2( 4650 extensions::NOTIFICATION_CRX_INSTALLER_DONE, 4651 content::NotificationService::AllSources()); 4652 service()->CheckForExternalUpdates(); 4653 observer_2.Wait(); 4654 ASSERT_EQ(0u, GetErrors().size()); 4655 ASSERT_EQ(1u, loaded_.size()); 4656 ASSERT_EQ("1.0.0.1", loaded_[0]->version()->GetString()); 4657 ValidatePrefKeyCount(1); 4658 ValidateIntegerPref(good_crx, "state", Extension::ENABLED); 4659 ValidateIntegerPref(good_crx, "location", location); 4660 4661 // Uninstall the extension and reload. Nothing should happen because the 4662 // preference should prevent us from reinstalling. 4663 std::string id = loaded_[0]->id(); 4664 bool no_uninstall = 4665 GetManagementPolicy()->MustRemainEnabled(loaded_[0].get(), NULL); 4666 service()->UninstallExtension(id, 4667 extensions::UNINSTALL_REASON_FOR_TESTING, 4668 base::Bind(&base::DoNothing), 4669 NULL); 4670 base::RunLoop().RunUntilIdle(); 4671 4672 base::FilePath install_path = extensions_install_dir().AppendASCII(id); 4673 if (no_uninstall) { 4674 // Policy controlled extensions should not have been touched by uninstall. 4675 ASSERT_TRUE(base::PathExists(install_path)); 4676 } else { 4677 // The extension should also be gone from the install directory. 4678 ASSERT_FALSE(base::PathExists(install_path)); 4679 loaded_.clear(); 4680 service()->CheckForExternalUpdates(); 4681 base::RunLoop().RunUntilIdle(); 4682 ASSERT_EQ(0u, loaded_.size()); 4683 ValidatePrefKeyCount(1); 4684 ValidateIntegerPref(good_crx, "state", 4685 Extension::EXTERNAL_EXTENSION_UNINSTALLED); 4686 ValidateIntegerPref(good_crx, "location", location); 4687 4688 // Now clear the preference and reinstall. 4689 SetPrefInteg(good_crx, "state", Extension::ENABLED); 4690 4691 loaded_.clear(); 4692 content::WindowedNotificationObserver observer( 4693 extensions::NOTIFICATION_CRX_INSTALLER_DONE, 4694 content::NotificationService::AllSources()); 4695 service()->CheckForExternalUpdates(); 4696 observer.Wait(); 4697 ASSERT_EQ(1u, loaded_.size()); 4698 } 4699 ValidatePrefKeyCount(1); 4700 ValidateIntegerPref(good_crx, "state", Extension::ENABLED); 4701 ValidateIntegerPref(good_crx, "location", location); 4702 4703 if (GetManagementPolicy()->MustRemainEnabled(loaded_[0].get(), NULL)) { 4704 EXPECT_EQ(2, provider->visit_count()); 4705 } else { 4706 // Now test an externally triggered uninstall (deleting the registry key or 4707 // the pref entry). 4708 provider->RemoveExtension(good_crx); 4709 4710 loaded_.clear(); 4711 service()->OnExternalProviderReady(provider); 4712 base::RunLoop().RunUntilIdle(); 4713 ASSERT_EQ(0u, loaded_.size()); 4714 ValidatePrefKeyCount(0); 4715 4716 // The extension should also be gone from the install directory. 4717 ASSERT_FALSE(base::PathExists(install_path)); 4718 4719 // Now test the case where user uninstalls and then the extension is removed 4720 // from the external provider. 4721 content::WindowedNotificationObserver observer( 4722 extensions::NOTIFICATION_CRX_INSTALLER_DONE, 4723 content::NotificationService::AllSources()); 4724 provider->UpdateOrAddExtension(good_crx, "1.0.0.1", source_path); 4725 service()->CheckForExternalUpdates(); 4726 observer.Wait(); 4727 4728 ASSERT_EQ(1u, loaded_.size()); 4729 ASSERT_EQ(0u, GetErrors().size()); 4730 4731 // User uninstalls. 4732 loaded_.clear(); 4733 service()->UninstallExtension(id, 4734 extensions::UNINSTALL_REASON_FOR_TESTING, 4735 base::Bind(&base::DoNothing), 4736 NULL); 4737 base::RunLoop().RunUntilIdle(); 4738 ASSERT_EQ(0u, loaded_.size()); 4739 4740 // Then remove the extension from the extension provider. 4741 provider->RemoveExtension(good_crx); 4742 4743 // Should still be at 0. 4744 loaded_.clear(); 4745 extensions::InstalledLoader(service()).LoadAllExtensions(); 4746 base::RunLoop().RunUntilIdle(); 4747 ASSERT_EQ(0u, loaded_.size()); 4748 ValidatePrefKeyCount(1); 4749 4750 EXPECT_EQ(5, provider->visit_count()); 4751 } 4752 } 4753 4754 // Tests the external installation feature 4755 #if defined(OS_WIN) 4756 TEST_F(ExtensionServiceTest, ExternalInstallRegistry) { 4757 // This should all work, even when normal extension installation is disabled. 4758 InitializeEmptyExtensionService(); 4759 service()->set_extensions_enabled(false); 4760 4761 // Now add providers. Extension system takes ownership of the objects. 4762 MockExtensionProvider* reg_provider = 4763 new MockExtensionProvider(service(), Manifest::EXTERNAL_REGISTRY); 4764 AddMockExternalProvider(reg_provider); 4765 TestExternalProvider(reg_provider, Manifest::EXTERNAL_REGISTRY); 4766 } 4767 #endif 4768 4769 TEST_F(ExtensionServiceTest, ExternalInstallPref) { 4770 InitializeEmptyExtensionService(); 4771 4772 // Now add providers. Extension system takes ownership of the objects. 4773 MockExtensionProvider* pref_provider = 4774 new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF); 4775 4776 AddMockExternalProvider(pref_provider); 4777 TestExternalProvider(pref_provider, Manifest::EXTERNAL_PREF); 4778 } 4779 4780 TEST_F(ExtensionServiceTest, ExternalInstallPrefUpdateUrl) { 4781 // This should all work, even when normal extension installation is disabled. 4782 InitializeEmptyExtensionService(); 4783 service()->set_extensions_enabled(false); 4784 4785 // TODO(skerner): The mock provider is not a good model of a provider 4786 // that works with update URLs, because it adds file and version info. 4787 // Extend the mock to work with update URLs. This test checks the 4788 // behavior that is common to all external extension visitors. The 4789 // browser test ExtensionManagementTest.ExternalUrlUpdate tests that 4790 // what the visitor does results in an extension being downloaded and 4791 // installed. 4792 MockExtensionProvider* pref_provider = 4793 new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF_DOWNLOAD); 4794 AddMockExternalProvider(pref_provider); 4795 TestExternalProvider(pref_provider, Manifest::EXTERNAL_PREF_DOWNLOAD); 4796 } 4797 4798 TEST_F(ExtensionServiceTest, ExternalInstallPolicyUpdateUrl) { 4799 // This should all work, even when normal extension installation is disabled. 4800 InitializeEmptyExtensionService(); 4801 service()->set_extensions_enabled(false); 4802 4803 // TODO(skerner): The mock provider is not a good model of a provider 4804 // that works with update URLs, because it adds file and version info. 4805 // Extend the mock to work with update URLs. This test checks the 4806 // behavior that is common to all external extension visitors. The 4807 // browser test ExtensionManagementTest.ExternalUrlUpdate tests that 4808 // what the visitor does results in an extension being downloaded and 4809 // installed. 4810 MockExtensionProvider* pref_provider = 4811 new MockExtensionProvider(service(), Manifest::EXTERNAL_POLICY_DOWNLOAD); 4812 AddMockExternalProvider(pref_provider); 4813 TestExternalProvider(pref_provider, Manifest::EXTERNAL_POLICY_DOWNLOAD); 4814 } 4815 4816 // Tests that external extensions get uninstalled when the external extension 4817 // providers can't account for them. 4818 TEST_F(ExtensionServiceTest, ExternalUninstall) { 4819 // Start the extensions service with one external extension already installed. 4820 base::FilePath source_install_dir = 4821 data_dir().AppendASCII("good").AppendASCII("Extensions"); 4822 base::FilePath pref_path = source_install_dir 4823 .DirName() 4824 .AppendASCII("PreferencesExternal"); 4825 4826 // This initializes the extensions service with no ExternalProviders. 4827 InitializeInstalledExtensionService(pref_path, source_install_dir); 4828 service()->set_extensions_enabled(false); 4829 4830 service()->Init(); 4831 4832 ASSERT_EQ(0u, GetErrors().size()); 4833 ASSERT_EQ(0u, loaded_.size()); 4834 4835 // Verify that it's not the disabled extensions flag causing it not to load. 4836 service()->set_extensions_enabled(true); 4837 service()->ReloadExtensionsForTest(); 4838 base::RunLoop().RunUntilIdle(); 4839 4840 ASSERT_EQ(0u, GetErrors().size()); 4841 ASSERT_EQ(0u, loaded_.size()); 4842 } 4843 4844 // Test that running multiple update checks simultaneously does not 4845 // keep the update from succeeding. 4846 TEST_F(ExtensionServiceTest, MultipleExternalUpdateCheck) { 4847 InitializeEmptyExtensionService(); 4848 4849 MockExtensionProvider* provider = 4850 new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF); 4851 AddMockExternalProvider(provider); 4852 4853 // Verify that starting with no providers loads no extensions. 4854 service()->Init(); 4855 ASSERT_EQ(0u, loaded_.size()); 4856 4857 // Start two checks for updates. 4858 provider->set_visit_count(0); 4859 service()->CheckForExternalUpdates(); 4860 service()->CheckForExternalUpdates(); 4861 base::RunLoop().RunUntilIdle(); 4862 4863 // Two calls should cause two checks for external extensions. 4864 EXPECT_EQ(2, provider->visit_count()); 4865 EXPECT_EQ(0u, GetErrors().size()); 4866 EXPECT_EQ(0u, loaded_.size()); 4867 4868 // Register a test extension externally using the mock registry provider. 4869 base::FilePath source_path = data_dir().AppendASCII("good.crx"); 4870 provider->UpdateOrAddExtension(good_crx, "1.0.0.0", source_path); 4871 4872 // Two checks for external updates should find the extension, and install it 4873 // once. 4874 content::WindowedNotificationObserver observer( 4875 extensions::NOTIFICATION_CRX_INSTALLER_DONE, 4876 content::NotificationService::AllSources()); 4877 provider->set_visit_count(0); 4878 service()->CheckForExternalUpdates(); 4879 service()->CheckForExternalUpdates(); 4880 observer.Wait(); 4881 EXPECT_EQ(2, provider->visit_count()); 4882 ASSERT_EQ(0u, GetErrors().size()); 4883 ASSERT_EQ(1u, loaded_.size()); 4884 ASSERT_EQ(Manifest::EXTERNAL_PREF, loaded_[0]->location()); 4885 ASSERT_EQ("1.0.0.0", loaded_[0]->version()->GetString()); 4886 ValidatePrefKeyCount(1); 4887 ValidateIntegerPref(good_crx, "state", Extension::ENABLED); 4888 ValidateIntegerPref(good_crx, "location", Manifest::EXTERNAL_PREF); 4889 4890 provider->RemoveExtension(good_crx); 4891 provider->set_visit_count(0); 4892 service()->CheckForExternalUpdates(); 4893 service()->CheckForExternalUpdates(); 4894 base::RunLoop().RunUntilIdle(); 4895 4896 // Two calls should cause two checks for external extensions. 4897 // Because the external source no longer includes good_crx, 4898 // good_crx will be uninstalled. So, expect that no extensions 4899 // are loaded. 4900 EXPECT_EQ(2, provider->visit_count()); 4901 EXPECT_EQ(0u, GetErrors().size()); 4902 EXPECT_EQ(0u, loaded_.size()); 4903 } 4904 4905 TEST_F(ExtensionServiceTest, ExternalPrefProvider) { 4906 InitializeEmptyExtensionService(); 4907 4908 // Test some valid extension records. 4909 // Set a base path to avoid erroring out on relative paths. 4910 // Paths starting with // are absolute on every platform we support. 4911 base::FilePath base_path(FILE_PATH_LITERAL("//base/path")); 4912 ASSERT_TRUE(base_path.IsAbsolute()); 4913 MockProviderVisitor visitor(base_path); 4914 std::string json_data = 4915 "{" 4916 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {" 4917 " \"external_crx\": \"RandomExtension.crx\"," 4918 " \"external_version\": \"1.0\"" 4919 " }," 4920 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\": {" 4921 " \"external_crx\": \"RandomExtension2.crx\"," 4922 " \"external_version\": \"2.0\"" 4923 " }," 4924 " \"cccccccccccccccccccccccccccccccc\": {" 4925 " \"external_update_url\": \"http:\\\\foo.com/update\"," 4926 " \"install_parameter\": \"id\"" 4927 " }" 4928 "}"; 4929 EXPECT_EQ(3, visitor.Visit(json_data)); 4930 4931 // Simulate an external_extensions.json file that contains seven invalid 4932 // records: 4933 // - One that is missing the 'external_crx' key. 4934 // - One that is missing the 'external_version' key. 4935 // - One that is specifying .. in the path. 4936 // - One that specifies both a file and update URL. 4937 // - One that specifies no file or update URL. 4938 // - One that has an update URL that is not well formed. 4939 // - One that contains a malformed version. 4940 // - One that has an invalid id. 4941 // - One that has a non-dictionary value. 4942 // - One that has an integer 'external_version' instead of a string. 4943 // The final extension is valid, and we check that it is read to make sure 4944 // failures don't stop valid records from being read. 4945 json_data = 4946 "{" 4947 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {" 4948 " \"external_version\": \"1.0\"" 4949 " }," 4950 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\": {" 4951 " \"external_crx\": \"RandomExtension.crx\"" 4952 " }," 4953 " \"cccccccccccccccccccccccccccccccc\": {" 4954 " \"external_crx\": \"..\\\\foo\\\\RandomExtension2.crx\"," 4955 " \"external_version\": \"2.0\"" 4956 " }," 4957 " \"dddddddddddddddddddddddddddddddd\": {" 4958 " \"external_crx\": \"RandomExtension2.crx\"," 4959 " \"external_version\": \"2.0\"," 4960 " \"external_update_url\": \"http:\\\\foo.com/update\"" 4961 " }," 4962 " \"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee\": {" 4963 " }," 4964 " \"ffffffffffffffffffffffffffffffff\": {" 4965 " \"external_update_url\": \"This string is not a valid URL\"" 4966 " }," 4967 " \"gggggggggggggggggggggggggggggggg\": {" 4968 " \"external_crx\": \"RandomExtension3.crx\"," 4969 " \"external_version\": \"This is not a valid version!\"" 4970 " }," 4971 " \"This is not a valid id!\": {}," 4972 " \"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh\": true," 4973 " \"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii\": {" 4974 " \"external_crx\": \"RandomExtension4.crx\"," 4975 " \"external_version\": 1.0" 4976 " }," 4977 " \"pppppppppppppppppppppppppppppppp\": {" 4978 " \"external_crx\": \"RandomValidExtension.crx\"," 4979 " \"external_version\": \"1.0\"" 4980 " }" 4981 "}"; 4982 EXPECT_EQ(1, visitor.Visit(json_data)); 4983 4984 // Check that if a base path is not provided, use of a relative 4985 // path fails. 4986 base::FilePath empty; 4987 MockProviderVisitor visitor_no_relative_paths(empty); 4988 4989 // Use absolute paths. Expect success. 4990 json_data = 4991 "{" 4992 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {" 4993 " \"external_crx\": \"//RandomExtension1.crx\"," 4994 " \"external_version\": \"3.0\"" 4995 " }," 4996 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\": {" 4997 " \"external_crx\": \"//path/to/RandomExtension2.crx\"," 4998 " \"external_version\": \"3.0\"" 4999 " }" 5000 "}"; 5001 EXPECT_EQ(2, visitor_no_relative_paths.Visit(json_data)); 5002 5003 // Use a relative path. Expect that it will error out. 5004 json_data = 5005 "{" 5006 " \"cccccccccccccccccccccccccccccccc\": {" 5007 " \"external_crx\": \"RandomExtension2.crx\"," 5008 " \"external_version\": \"3.0\"" 5009 " }" 5010 "}"; 5011 EXPECT_EQ(0, visitor_no_relative_paths.Visit(json_data)); 5012 5013 // Test supported_locales. 5014 json_data = 5015 "{" 5016 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {" 5017 " \"external_crx\": \"RandomExtension.crx\"," 5018 " \"external_version\": \"1.0\"," 5019 " \"supported_locales\": [ \"en\" ]" 5020 " }," 5021 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\": {" 5022 " \"external_crx\": \"RandomExtension2.crx\"," 5023 " \"external_version\": \"2.0\"," 5024 " \"supported_locales\": [ \"en-GB\" ]" 5025 " }," 5026 " \"cccccccccccccccccccccccccccccccc\": {" 5027 " \"external_crx\": \"RandomExtension2.crx\"," 5028 " \"external_version\": \"3.0\"," 5029 " \"supported_locales\": [ \"en_US\", \"fr\" ]" 5030 " }" 5031 "}"; 5032 { 5033 ScopedBrowserLocale guard("en-US"); 5034 EXPECT_EQ(2, visitor.Visit(json_data)); 5035 } 5036 5037 // Test keep_if_present. 5038 json_data = 5039 "{" 5040 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {" 5041 " \"external_crx\": \"RandomExtension.crx\"," 5042 " \"external_version\": \"1.0\"," 5043 " \"keep_if_present\": true" 5044 " }" 5045 "}"; 5046 { 5047 EXPECT_EQ(0, visitor.Visit(json_data)); 5048 } 5049 5050 // Test is_bookmark_app. 5051 MockProviderVisitor from_bookmark_visitor( 5052 base_path, Extension::FROM_BOOKMARK); 5053 json_data = 5054 "{" 5055 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {" 5056 " \"external_crx\": \"RandomExtension.crx\"," 5057 " \"external_version\": \"1.0\"," 5058 " \"is_bookmark_app\": true" 5059 " }" 5060 "}"; 5061 EXPECT_EQ(1, from_bookmark_visitor.Visit(json_data)); 5062 5063 // Test is_from_webstore. 5064 MockProviderVisitor from_webstore_visitor( 5065 base_path, Extension::FROM_WEBSTORE); 5066 json_data = 5067 "{" 5068 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {" 5069 " \"external_crx\": \"RandomExtension.crx\"," 5070 " \"external_version\": \"1.0\"," 5071 " \"is_from_webstore\": true" 5072 " }" 5073 "}"; 5074 EXPECT_EQ(1, from_webstore_visitor.Visit(json_data)); 5075 5076 // Test was_installed_by_eom. 5077 MockProviderVisitor was_installed_by_eom_visitor( 5078 base_path, Extension::WAS_INSTALLED_BY_OEM); 5079 json_data = 5080 "{" 5081 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {" 5082 " \"external_crx\": \"RandomExtension.crx\"," 5083 " \"external_version\": \"1.0\"," 5084 " \"was_installed_by_oem\": true" 5085 " }" 5086 "}"; 5087 EXPECT_EQ(1, was_installed_by_eom_visitor.Visit(json_data)); 5088 } 5089 5090 // Test loading good extensions from the profile directory. 5091 TEST_F(ExtensionServiceTest, LoadAndRelocalizeExtensions) { 5092 // Ensure we're testing in "en" and leave global state untouched. 5093 extension_l10n_util::ScopedLocaleForTest testLocale("en"); 5094 5095 // Initialize the test dir with a good Preferences/extensions. 5096 base::FilePath source_install_dir = data_dir().AppendASCII("l10n"); 5097 base::FilePath pref_path = 5098 source_install_dir.Append(chrome::kPreferencesFilename); 5099 InitializeInstalledExtensionService(pref_path, source_install_dir); 5100 5101 service()->Init(); 5102 5103 ASSERT_EQ(3u, loaded_.size()); 5104 5105 // This was equal to "sr" on load. 5106 ValidateStringPref(loaded_[0]->id(), keys::kCurrentLocale, "en"); 5107 5108 // These are untouched by re-localization. 5109 ValidateStringPref(loaded_[1]->id(), keys::kCurrentLocale, "en"); 5110 EXPECT_FALSE(IsPrefExist(loaded_[1]->id(), keys::kCurrentLocale)); 5111 5112 // This one starts with Serbian name, and gets re-localized into English. 5113 EXPECT_EQ("My name is simple.", loaded_[0]->name()); 5114 5115 // These are untouched by re-localization. 5116 EXPECT_EQ("My name is simple.", loaded_[1]->name()); 5117 EXPECT_EQ("no l10n", loaded_[2]->name()); 5118 } 5119 5120 class ExtensionsReadyRecorder : public content::NotificationObserver { 5121 public: 5122 ExtensionsReadyRecorder() : ready_(false) { 5123 registrar_.Add(this, 5124 extensions::NOTIFICATION_EXTENSIONS_READY_DEPRECATED, 5125 content::NotificationService::AllSources()); 5126 } 5127 5128 void set_ready(bool value) { ready_ = value; } 5129 bool ready() { return ready_; } 5130 5131 private: 5132 virtual void Observe(int type, 5133 const content::NotificationSource& source, 5134 const content::NotificationDetails& details) OVERRIDE { 5135 switch (type) { 5136 case extensions::NOTIFICATION_EXTENSIONS_READY_DEPRECATED: 5137 ready_ = true; 5138 break; 5139 default: 5140 NOTREACHED(); 5141 } 5142 } 5143 5144 content::NotificationRegistrar registrar_; 5145 bool ready_; 5146 }; 5147 5148 // Test that we get enabled/disabled correctly for all the pref/command-line 5149 // combinations. We don't want to derive from the ExtensionServiceTest class 5150 // for this test, so we use ExtensionServiceTestSimple. 5151 // 5152 // Also tests that we always fire EXTENSIONS_READY, no matter whether we are 5153 // enabled or not. 5154 TEST(ExtensionServiceTestSimple, Enabledness) { 5155 // Make sure the PluginService singleton is destroyed at the end of the test. 5156 base::ShadowingAtExitManager at_exit_manager; 5157 #if defined(ENABLE_PLUGINS) 5158 content::PluginService::GetInstance()->Init(); 5159 content::PluginService::GetInstance()->DisablePluginsDiscoveryForTesting(); 5160 #endif 5161 5162 ExtensionErrorReporter::Init(false); // no noisy errors 5163 ExtensionsReadyRecorder recorder; 5164 scoped_ptr<TestingProfile> profile(new TestingProfile()); 5165 content::TestBrowserThreadBundle thread_bundle_; 5166 #if defined OS_CHROMEOS 5167 chromeos::ScopedTestDeviceSettingsService device_settings_service; 5168 chromeos::ScopedTestCrosSettings cros_settings; 5169 scoped_ptr<chromeos::ScopedTestUserManager> user_manager( 5170 new chromeos::ScopedTestUserManager); 5171 #endif 5172 scoped_ptr<CommandLine> command_line; 5173 base::FilePath install_dir = profile->GetPath() 5174 .AppendASCII(extensions::kInstallDirectoryName); 5175 5176 // By default, we are enabled. 5177 command_line.reset(new CommandLine(CommandLine::NO_PROGRAM)); 5178 ExtensionService* service = static_cast<extensions::TestExtensionSystem*>( 5179 ExtensionSystem::Get(profile.get()))-> 5180 CreateExtensionService( 5181 command_line.get(), 5182 install_dir, 5183 false); 5184 EXPECT_TRUE(service->extensions_enabled()); 5185 service->Init(); 5186 base::RunLoop().RunUntilIdle(); 5187 EXPECT_TRUE(recorder.ready()); 5188 #if defined OS_CHROMEOS 5189 user_manager.reset(); 5190 #endif 5191 5192 // If either the command line or pref is set, we are disabled. 5193 recorder.set_ready(false); 5194 profile.reset(new TestingProfile()); 5195 command_line->AppendSwitch(switches::kDisableExtensions); 5196 service = static_cast<extensions::TestExtensionSystem*>( 5197 ExtensionSystem::Get(profile.get()))-> 5198 CreateExtensionService( 5199 command_line.get(), 5200 install_dir, 5201 false); 5202 EXPECT_FALSE(service->extensions_enabled()); 5203 service->Init(); 5204 base::RunLoop().RunUntilIdle(); 5205 EXPECT_TRUE(recorder.ready()); 5206 5207 recorder.set_ready(false); 5208 profile.reset(new TestingProfile()); 5209 profile->GetPrefs()->SetBoolean(prefs::kDisableExtensions, true); 5210 service = static_cast<extensions::TestExtensionSystem*>( 5211 ExtensionSystem::Get(profile.get()))-> 5212 CreateExtensionService( 5213 command_line.get(), 5214 install_dir, 5215 false); 5216 EXPECT_FALSE(service->extensions_enabled()); 5217 service->Init(); 5218 base::RunLoop().RunUntilIdle(); 5219 EXPECT_TRUE(recorder.ready()); 5220 5221 recorder.set_ready(false); 5222 profile.reset(new TestingProfile()); 5223 profile->GetPrefs()->SetBoolean(prefs::kDisableExtensions, true); 5224 command_line.reset(new CommandLine(CommandLine::NO_PROGRAM)); 5225 service = static_cast<extensions::TestExtensionSystem*>( 5226 ExtensionSystem::Get(profile.get()))-> 5227 CreateExtensionService( 5228 command_line.get(), 5229 install_dir, 5230 false); 5231 EXPECT_FALSE(service->extensions_enabled()); 5232 service->Init(); 5233 base::RunLoop().RunUntilIdle(); 5234 EXPECT_TRUE(recorder.ready()); 5235 5236 // Explicitly delete all the resources used in this test. 5237 profile.reset(); 5238 service = NULL; 5239 // Execute any pending deletion tasks. 5240 base::RunLoop().RunUntilIdle(); 5241 } 5242 5243 // Test loading extensions that require limited and unlimited storage quotas. 5244 TEST_F(ExtensionServiceTest, StorageQuota) { 5245 InitializeEmptyExtensionService(); 5246 5247 base::FilePath extensions_path = data_dir().AppendASCII("storage_quota"); 5248 5249 base::FilePath limited_quota_ext = 5250 extensions_path.AppendASCII("limited_quota") 5251 .AppendASCII("1.0"); 5252 5253 // The old permission name for unlimited quota was "unlimited_storage", but 5254 // we changed it to "unlimitedStorage". This tests both versions. 5255 base::FilePath unlimited_quota_ext = 5256 extensions_path.AppendASCII("unlimited_quota") 5257 .AppendASCII("1.0"); 5258 base::FilePath unlimited_quota_ext2 = 5259 extensions_path.AppendASCII("unlimited_quota") 5260 .AppendASCII("2.0"); 5261 extensions::UnpackedInstaller::Create(service())->Load(limited_quota_ext); 5262 extensions::UnpackedInstaller::Create(service())->Load(unlimited_quota_ext); 5263 extensions::UnpackedInstaller::Create(service())->Load(unlimited_quota_ext2); 5264 base::RunLoop().RunUntilIdle(); 5265 5266 ASSERT_EQ(3u, loaded_.size()); 5267 EXPECT_TRUE(profile()); 5268 EXPECT_FALSE(profile()->IsOffTheRecord()); 5269 EXPECT_FALSE( 5270 profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited( 5271 loaded_[0]->url())); 5272 EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited( 5273 loaded_[1]->url())); 5274 EXPECT_TRUE(profile()->GetExtensionSpecialStoragePolicy()->IsStorageUnlimited( 5275 loaded_[2]->url())); 5276 } 5277 5278 // Tests ComponentLoader::Add(). 5279 TEST_F(ExtensionServiceTest, ComponentExtensions) { 5280 InitializeEmptyExtensionService(); 5281 5282 // Component extensions should work even when extensions are disabled. 5283 service()->set_extensions_enabled(false); 5284 5285 base::FilePath path = data_dir() 5286 .AppendASCII("good") 5287 .AppendASCII("Extensions") 5288 .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj") 5289 .AppendASCII("1.0.0.0"); 5290 5291 std::string manifest; 5292 ASSERT_TRUE(base::ReadFileToString( 5293 path.Append(extensions::kManifestFilename), &manifest)); 5294 5295 service()->component_loader()->Add(manifest, path); 5296 service()->Init(); 5297 5298 // Note that we do not pump messages -- the extension should be loaded 5299 // immediately. 5300 5301 EXPECT_EQ(0u, GetErrors().size()); 5302 ASSERT_EQ(1u, loaded_.size()); 5303 EXPECT_EQ(Manifest::COMPONENT, loaded_[0]->location()); 5304 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 5305 5306 // Component extensions get a prefs entry on first install. 5307 ValidatePrefKeyCount(1); 5308 5309 // Reload all extensions, and make sure it comes back. 5310 std::string extension_id = (*registry()->enabled_extensions().begin())->id(); 5311 loaded_.clear(); 5312 service()->ReloadExtensionsForTest(); 5313 ASSERT_EQ(1u, registry()->enabled_extensions().size()); 5314 EXPECT_EQ(extension_id, (*registry()->enabled_extensions().begin())->id()); 5315 } 5316 5317 TEST_F(ExtensionServiceTest, DeferredSyncStartupPreInstalledComponent) { 5318 InitializeEmptyExtensionService(); 5319 InitializeExtensionSyncService(); 5320 5321 bool flare_was_called = false; 5322 syncer::ModelType triggered_type(syncer::UNSPECIFIED); 5323 base::WeakPtrFactory<ExtensionServiceTest> factory(this); 5324 extension_sync_service()->SetSyncStartFlare( 5325 base::Bind(&ExtensionServiceTest::MockSyncStartFlare, 5326 factory.GetWeakPtr(), 5327 &flare_was_called, // Safe due to WeakPtrFactory scope. 5328 &triggered_type)); // Safe due to WeakPtrFactory scope. 5329 5330 // Install a component extension. 5331 std::string manifest; 5332 ASSERT_TRUE(base::ReadFileToString( 5333 good0_path().Append(extensions::kManifestFilename), &manifest)); 5334 service()->component_loader()->Add(manifest, good0_path()); 5335 ASSERT_FALSE(service()->is_ready()); 5336 service()->Init(); 5337 ASSERT_TRUE(service()->is_ready()); 5338 5339 // Extensions added before service is_ready() don't trigger sync startup. 5340 EXPECT_FALSE(flare_was_called); 5341 ASSERT_EQ(syncer::UNSPECIFIED, triggered_type); 5342 } 5343 5344 TEST_F(ExtensionServiceTest, DeferredSyncStartupPreInstalledNormal) { 5345 InitializeGoodInstalledExtensionService(); 5346 InitializeExtensionSyncService(); 5347 5348 bool flare_was_called = false; 5349 syncer::ModelType triggered_type(syncer::UNSPECIFIED); 5350 base::WeakPtrFactory<ExtensionServiceTest> factory(this); 5351 extension_sync_service()->SetSyncStartFlare( 5352 base::Bind(&ExtensionServiceTest::MockSyncStartFlare, 5353 factory.GetWeakPtr(), 5354 &flare_was_called, // Safe due to WeakPtrFactory scope. 5355 &triggered_type)); // Safe due to WeakPtrFactory scope. 5356 5357 ASSERT_FALSE(service()->is_ready()); 5358 service()->Init(); 5359 ASSERT_EQ(3u, loaded_.size()); 5360 ASSERT_TRUE(service()->is_ready()); 5361 5362 // Extensions added before service is_ready() don't trigger sync startup. 5363 EXPECT_FALSE(flare_was_called); 5364 ASSERT_EQ(syncer::UNSPECIFIED, triggered_type); 5365 } 5366 5367 TEST_F(ExtensionServiceTest, DeferredSyncStartupOnInstall) { 5368 InitializeEmptyExtensionService(); 5369 InitializeExtensionSyncService(); 5370 service()->Init(); 5371 ASSERT_TRUE(service()->is_ready()); 5372 5373 bool flare_was_called = false; 5374 syncer::ModelType triggered_type(syncer::UNSPECIFIED); 5375 base::WeakPtrFactory<ExtensionServiceTest> factory(this); 5376 extension_sync_service()->SetSyncStartFlare( 5377 base::Bind(&ExtensionServiceTest::MockSyncStartFlare, 5378 factory.GetWeakPtr(), 5379 &flare_was_called, // Safe due to WeakPtrFactory scope. 5380 &triggered_type)); // Safe due to WeakPtrFactory scope. 5381 5382 base::FilePath path = data_dir().AppendASCII("good.crx"); 5383 InstallCRX(path, INSTALL_NEW); 5384 5385 EXPECT_TRUE(flare_was_called); 5386 EXPECT_EQ(syncer::EXTENSIONS, triggered_type); 5387 5388 // Reset. 5389 flare_was_called = false; 5390 triggered_type = syncer::UNSPECIFIED; 5391 5392 // Once sync starts, flare should no longer be invoked. 5393 extension_sync_service()->MergeDataAndStartSyncing( 5394 syncer::EXTENSIONS, 5395 syncer::SyncDataList(), 5396 scoped_ptr<syncer::SyncChangeProcessor>( 5397 new syncer::FakeSyncChangeProcessor), 5398 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 5399 path = data_dir().AppendASCII("page_action.crx"); 5400 InstallCRX(path, INSTALL_NEW); 5401 EXPECT_FALSE(flare_was_called); 5402 ASSERT_EQ(syncer::UNSPECIFIED, triggered_type); 5403 } 5404 5405 TEST_F(ExtensionServiceTest, DisableExtensionFromSync) { 5406 // Start the extensions service with one external extension already installed. 5407 base::FilePath source_install_dir = 5408 data_dir().AppendASCII("good").AppendASCII("Extensions"); 5409 base::FilePath pref_path = 5410 source_install_dir.DirName().Append(chrome::kPreferencesFilename); 5411 5412 InitializeInstalledExtensionService(pref_path, source_install_dir); 5413 InitializeExtensionSyncService(); 5414 5415 // The user has enabled sync. 5416 ProfileSyncService* sync_service = 5417 ProfileSyncServiceFactory::GetForProfile(profile()); 5418 sync_service->SetSyncSetupCompleted(); 5419 5420 service()->Init(); 5421 ASSERT_TRUE(service()->is_ready()); 5422 5423 ASSERT_EQ(3u, loaded_.size()); 5424 5425 // We start enabled. 5426 const Extension* extension = service()->GetExtensionById(good0, true); 5427 ASSERT_TRUE(extension); 5428 ASSERT_TRUE(service()->IsExtensionEnabled(good0)); 5429 extensions::ExtensionSyncData disable_good_crx( 5430 *extension, false, false, false); 5431 5432 // Then sync data arrives telling us to disable |good0|. 5433 syncer::SyncDataList sync_data; 5434 sync_data.push_back(disable_good_crx.GetSyncData()); 5435 extension_sync_service()->MergeDataAndStartSyncing( 5436 syncer::EXTENSIONS, 5437 sync_data, 5438 scoped_ptr<syncer::SyncChangeProcessor>( 5439 new syncer::FakeSyncChangeProcessor), 5440 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 5441 ASSERT_FALSE(service()->IsExtensionEnabled(good0)); 5442 } 5443 5444 TEST_F(ExtensionServiceTest, DontDisableExtensionWithPendingEnableFromSync) { 5445 // Start the extensions service with one external extension already installed. 5446 base::FilePath source_install_dir = 5447 data_dir().AppendASCII("good").AppendASCII("Extensions"); 5448 base::FilePath pref_path = 5449 source_install_dir.DirName().Append(chrome::kPreferencesFilename); 5450 5451 InitializeInstalledExtensionService(pref_path, source_install_dir); 5452 InitializeExtensionSyncService(); 5453 5454 // The user has enabled sync. 5455 ProfileSyncService* sync_service = 5456 ProfileSyncServiceFactory::GetForProfile(profile()); 5457 sync_service->SetSyncSetupCompleted(); 5458 5459 service()->Init(); 5460 ASSERT_TRUE(service()->is_ready()); 5461 ASSERT_EQ(3u, loaded_.size()); 5462 5463 const Extension* extension = service()->GetExtensionById(good0, true); 5464 ASSERT_TRUE(service()->IsExtensionEnabled(good0)); 5465 5466 // Disable extension before first sync data arrives. 5467 service()->DisableExtension(good0, Extension::DISABLE_USER_ACTION); 5468 ASSERT_FALSE(service()->IsExtensionEnabled(good0)); 5469 5470 // Enable extension - this is now the most recent state. 5471 service()->EnableExtension(good0); 5472 ASSERT_TRUE(service()->IsExtensionEnabled(good0)); 5473 5474 // Now sync data comes in that says to disable good0. This should be 5475 // ignored. 5476 extensions::ExtensionSyncData disable_good_crx( 5477 *extension, false, false, false); 5478 syncer::SyncDataList sync_data; 5479 sync_data.push_back(disable_good_crx.GetSyncData()); 5480 extension_sync_service()->MergeDataAndStartSyncing( 5481 syncer::EXTENSIONS, 5482 sync_data, 5483 scoped_ptr<syncer::SyncChangeProcessor>( 5484 new syncer::FakeSyncChangeProcessor), 5485 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 5486 5487 // The extension was enabled locally before the sync data arrived, so it 5488 // should still be enabled now. 5489 ASSERT_TRUE(service()->IsExtensionEnabled(good0)); 5490 } 5491 5492 TEST_F(ExtensionServiceTest, GetSyncData) { 5493 InitializeEmptyExtensionService(); 5494 InitializeExtensionSyncService(); 5495 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 5496 const Extension* extension = service()->GetInstalledExtension(good_crx); 5497 ASSERT_TRUE(extension); 5498 5499 extension_sync_service()->MergeDataAndStartSyncing( 5500 syncer::EXTENSIONS, 5501 syncer::SyncDataList(), 5502 scoped_ptr<syncer::SyncChangeProcessor>( 5503 new syncer::FakeSyncChangeProcessor), 5504 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 5505 5506 syncer::SyncDataList list = 5507 extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); 5508 ASSERT_EQ(list.size(), 1U); 5509 extensions::ExtensionSyncData data(list[0]); 5510 EXPECT_EQ(extension->id(), data.id()); 5511 EXPECT_FALSE(data.uninstalled()); 5512 EXPECT_EQ(service()->IsExtensionEnabled(good_crx), data.enabled()); 5513 EXPECT_EQ(extensions::util::IsIncognitoEnabled(good_crx, profile()), 5514 data.incognito_enabled()); 5515 EXPECT_TRUE(data.version().Equals(*extension->version())); 5516 EXPECT_EQ(extensions::ManifestURL::GetUpdateURL(extension), 5517 data.update_url()); 5518 EXPECT_EQ(extension->name(), data.name()); 5519 } 5520 5521 TEST_F(ExtensionServiceTest, GetSyncDataTerminated) { 5522 InitializeEmptyExtensionService(); 5523 InitializeExtensionSyncService(); 5524 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 5525 TerminateExtension(good_crx); 5526 const Extension* extension = service()->GetInstalledExtension(good_crx); 5527 ASSERT_TRUE(extension); 5528 5529 syncer::FakeSyncChangeProcessor processor; 5530 extension_sync_service()->MergeDataAndStartSyncing( 5531 syncer::EXTENSIONS, 5532 syncer::SyncDataList(), 5533 scoped_ptr<syncer::SyncChangeProcessor>( 5534 new syncer::FakeSyncChangeProcessor), 5535 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 5536 5537 syncer::SyncDataList list = 5538 extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); 5539 ASSERT_EQ(list.size(), 1U); 5540 extensions::ExtensionSyncData data(list[0]); 5541 EXPECT_EQ(extension->id(), data.id()); 5542 EXPECT_FALSE(data.uninstalled()); 5543 EXPECT_EQ(service()->IsExtensionEnabled(good_crx), data.enabled()); 5544 EXPECT_EQ(extensions::util::IsIncognitoEnabled(good_crx, profile()), 5545 data.incognito_enabled()); 5546 EXPECT_TRUE(data.version().Equals(*extension->version())); 5547 EXPECT_EQ(extensions::ManifestURL::GetUpdateURL(extension), 5548 data.update_url()); 5549 EXPECT_EQ(extension->name(), data.name()); 5550 } 5551 5552 TEST_F(ExtensionServiceTest, GetSyncDataFilter) { 5553 InitializeEmptyExtensionService(); 5554 InitializeExtensionSyncService(); 5555 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 5556 const Extension* extension = service()->GetInstalledExtension(good_crx); 5557 ASSERT_TRUE(extension); 5558 5559 syncer::FakeSyncChangeProcessor processor; 5560 extension_sync_service()->MergeDataAndStartSyncing( 5561 syncer::APPS, 5562 syncer::SyncDataList(), 5563 scoped_ptr<syncer::SyncChangeProcessor>( 5564 new syncer::FakeSyncChangeProcessor), 5565 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 5566 5567 syncer::SyncDataList list = 5568 extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); 5569 ASSERT_EQ(list.size(), 0U); 5570 } 5571 5572 TEST_F(ExtensionServiceTest, GetSyncExtensionDataUserSettings) { 5573 InitializeEmptyExtensionService(); 5574 InitializeProcessManager(); 5575 InitializeExtensionSyncService(); 5576 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 5577 const Extension* extension = service()->GetInstalledExtension(good_crx); 5578 ASSERT_TRUE(extension); 5579 5580 syncer::FakeSyncChangeProcessor processor; 5581 extension_sync_service()->MergeDataAndStartSyncing( 5582 syncer::EXTENSIONS, 5583 syncer::SyncDataList(), 5584 scoped_ptr<syncer::SyncChangeProcessor>( 5585 new syncer::FakeSyncChangeProcessor), 5586 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 5587 5588 { 5589 syncer::SyncDataList list = 5590 extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); 5591 ASSERT_EQ(list.size(), 1U); 5592 extensions::ExtensionSyncData data(list[0]); 5593 EXPECT_TRUE(data.enabled()); 5594 EXPECT_FALSE(data.incognito_enabled()); 5595 } 5596 5597 service()->DisableExtension(good_crx, Extension::DISABLE_USER_ACTION); 5598 { 5599 syncer::SyncDataList list = 5600 extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); 5601 ASSERT_EQ(list.size(), 1U); 5602 extensions::ExtensionSyncData data(list[0]); 5603 EXPECT_FALSE(data.enabled()); 5604 EXPECT_FALSE(data.incognito_enabled()); 5605 } 5606 5607 extensions::util::SetIsIncognitoEnabled(good_crx, profile(), true); 5608 { 5609 syncer::SyncDataList list = 5610 extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); 5611 ASSERT_EQ(list.size(), 1U); 5612 extensions::ExtensionSyncData data(list[0]); 5613 EXPECT_FALSE(data.enabled()); 5614 EXPECT_TRUE(data.incognito_enabled()); 5615 } 5616 5617 service()->EnableExtension(good_crx); 5618 { 5619 syncer::SyncDataList list = 5620 extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); 5621 ASSERT_EQ(list.size(), 1U); 5622 extensions::ExtensionSyncData data(list[0]); 5623 EXPECT_TRUE(data.enabled()); 5624 EXPECT_TRUE(data.incognito_enabled()); 5625 } 5626 } 5627 5628 TEST_F(ExtensionServiceTest, SyncForUninstalledExternalExtension) { 5629 InitializeEmptyExtensionService(); 5630 InitializeExtensionSyncService(); 5631 InstallCRXWithLocation( 5632 data_dir().AppendASCII("good.crx"), Manifest::EXTERNAL_PREF, INSTALL_NEW); 5633 const Extension* extension = service()->GetInstalledExtension(good_crx); 5634 ASSERT_TRUE(extension); 5635 5636 syncer::FakeSyncChangeProcessor processor; 5637 extension_sync_service()->MergeDataAndStartSyncing( 5638 syncer::EXTENSIONS, 5639 syncer::SyncDataList(), 5640 scoped_ptr<syncer::SyncChangeProcessor>( 5641 new syncer::FakeSyncChangeProcessor), 5642 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 5643 5644 UninstallExtension(good_crx, false); 5645 EXPECT_TRUE( 5646 ExtensionPrefs::Get(profile())->IsExternalExtensionUninstalled(good_crx)); 5647 5648 sync_pb::EntitySpecifics specifics; 5649 sync_pb::AppSpecifics* app_specifics = specifics.mutable_app(); 5650 sync_pb::ExtensionSpecifics* extension_specifics = 5651 app_specifics->mutable_extension(); 5652 extension_specifics->set_id(good_crx); 5653 extension_specifics->set_version("1.0"); 5654 extension_specifics->set_enabled(true); 5655 5656 syncer::SyncData sync_data = 5657 syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); 5658 syncer::SyncChange sync_change(FROM_HERE, 5659 syncer::SyncChange::ACTION_UPDATE, 5660 sync_data); 5661 syncer::SyncChangeList list(1); 5662 list[0] = sync_change; 5663 5664 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); 5665 EXPECT_TRUE( 5666 ExtensionPrefs::Get(profile())->IsExternalExtensionUninstalled(good_crx)); 5667 } 5668 5669 TEST_F(ExtensionServiceTest, GetSyncAppDataUserSettings) { 5670 InitializeEmptyExtensionService(); 5671 InitializeExtensionSyncService(); 5672 const Extension* app = 5673 PackAndInstallCRX(data_dir().AppendASCII("app"), INSTALL_NEW); 5674 ASSERT_TRUE(app); 5675 ASSERT_TRUE(app->is_app()); 5676 5677 syncer::FakeSyncChangeProcessor processor; 5678 extension_sync_service()->MergeDataAndStartSyncing( 5679 syncer::APPS, 5680 syncer::SyncDataList(), 5681 scoped_ptr<syncer::SyncChangeProcessor>( 5682 new syncer::FakeSyncChangeProcessor), 5683 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 5684 5685 syncer::StringOrdinal initial_ordinal = 5686 syncer::StringOrdinal::CreateInitialOrdinal(); 5687 { 5688 syncer::SyncDataList list = 5689 extension_sync_service()->GetAllSyncData(syncer::APPS); 5690 ASSERT_EQ(list.size(), 1U); 5691 5692 extensions::AppSyncData app_sync_data(list[0]); 5693 EXPECT_TRUE(initial_ordinal.Equals(app_sync_data.app_launch_ordinal())); 5694 EXPECT_TRUE(initial_ordinal.Equals(app_sync_data.page_ordinal())); 5695 } 5696 5697 AppSorting* sorting = ExtensionPrefs::Get(profile())->app_sorting(); 5698 sorting->SetAppLaunchOrdinal(app->id(), initial_ordinal.CreateAfter()); 5699 { 5700 syncer::SyncDataList list = 5701 extension_sync_service()->GetAllSyncData(syncer::APPS); 5702 ASSERT_EQ(list.size(), 1U); 5703 5704 extensions::AppSyncData app_sync_data(list[0]); 5705 EXPECT_TRUE(initial_ordinal.LessThan(app_sync_data.app_launch_ordinal())); 5706 EXPECT_TRUE(initial_ordinal.Equals(app_sync_data.page_ordinal())); 5707 } 5708 5709 sorting->SetPageOrdinal(app->id(), initial_ordinal.CreateAfter()); 5710 { 5711 syncer::SyncDataList list = 5712 extension_sync_service()->GetAllSyncData(syncer::APPS); 5713 ASSERT_EQ(list.size(), 1U); 5714 5715 extensions::AppSyncData app_sync_data(list[0]); 5716 EXPECT_TRUE(initial_ordinal.LessThan(app_sync_data.app_launch_ordinal())); 5717 EXPECT_TRUE(initial_ordinal.LessThan(app_sync_data.page_ordinal())); 5718 } 5719 } 5720 5721 // TODO (rdevlin.cronin): The OnExtensionMoved() method has been removed from 5722 // ExtensionService, so this test probably needs a new home. Unfortunately, it 5723 // relies pretty heavily on things like InitializeExtension[Sync]Service() and 5724 // PackAndInstallCRX(). When we clean up a bit more, this should move out. 5725 TEST_F(ExtensionServiceTest, GetSyncAppDataUserSettingsOnExtensionMoved) { 5726 InitializeEmptyExtensionService(); 5727 InitializeExtensionSyncService(); 5728 const size_t kAppCount = 3; 5729 const Extension* apps[kAppCount]; 5730 apps[0] = PackAndInstallCRX(data_dir().AppendASCII("app1"), INSTALL_NEW); 5731 apps[1] = PackAndInstallCRX(data_dir().AppendASCII("app2"), INSTALL_NEW); 5732 apps[2] = PackAndInstallCRX(data_dir().AppendASCII("app4"), INSTALL_NEW); 5733 for (size_t i = 0; i < kAppCount; ++i) { 5734 ASSERT_TRUE(apps[i]); 5735 ASSERT_TRUE(apps[i]->is_app()); 5736 } 5737 5738 syncer::FakeSyncChangeProcessor processor; 5739 extension_sync_service()->MergeDataAndStartSyncing( 5740 syncer::APPS, 5741 syncer::SyncDataList(), 5742 scoped_ptr<syncer::SyncChangeProcessor>( 5743 new syncer::FakeSyncChangeProcessor), 5744 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 5745 5746 ExtensionPrefs::Get(service()->GetBrowserContext()) 5747 ->app_sorting() 5748 ->OnExtensionMoved(apps[0]->id(), apps[1]->id(), apps[2]->id()); 5749 { 5750 syncer::SyncDataList list = 5751 extension_sync_service()->GetAllSyncData(syncer::APPS); 5752 ASSERT_EQ(list.size(), 3U); 5753 5754 extensions::AppSyncData data[kAppCount]; 5755 for (size_t i = 0; i < kAppCount; ++i) { 5756 data[i] = extensions::AppSyncData(list[i]); 5757 } 5758 5759 // The sync data is not always in the same order our apps were installed in, 5760 // so we do that sorting here so we can make sure the values are changed as 5761 // expected. 5762 syncer::StringOrdinal app_launch_ordinals[kAppCount]; 5763 for (size_t i = 0; i < kAppCount; ++i) { 5764 for (size_t j = 0; j < kAppCount; ++j) { 5765 if (apps[i]->id() == data[j].id()) 5766 app_launch_ordinals[i] = data[j].app_launch_ordinal(); 5767 } 5768 } 5769 5770 EXPECT_TRUE(app_launch_ordinals[1].LessThan(app_launch_ordinals[0])); 5771 EXPECT_TRUE(app_launch_ordinals[0].LessThan(app_launch_ordinals[2])); 5772 } 5773 } 5774 5775 TEST_F(ExtensionServiceTest, GetSyncDataList) { 5776 InitializeEmptyExtensionService(); 5777 InitializeExtensionSyncService(); 5778 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 5779 InstallCRX(data_dir().AppendASCII("page_action.crx"), INSTALL_NEW); 5780 InstallCRX(data_dir().AppendASCII("theme.crx"), INSTALL_NEW); 5781 InstallCRX(data_dir().AppendASCII("theme2.crx"), INSTALL_NEW); 5782 5783 syncer::FakeSyncChangeProcessor processor; 5784 extension_sync_service()->MergeDataAndStartSyncing( 5785 syncer::APPS, 5786 syncer::SyncDataList(), 5787 scoped_ptr<syncer::SyncChangeProcessor>( 5788 new syncer::FakeSyncChangeProcessor), 5789 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 5790 extension_sync_service()->MergeDataAndStartSyncing( 5791 syncer::EXTENSIONS, 5792 syncer::SyncDataList(), 5793 scoped_ptr<syncer::SyncChangeProcessor>( 5794 new syncer::FakeSyncChangeProcessor), 5795 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 5796 5797 service()->DisableExtension(page_action, Extension::DISABLE_USER_ACTION); 5798 TerminateExtension(theme2_crx); 5799 5800 EXPECT_EQ(0u, extension_sync_service()->GetAllSyncData(syncer::APPS).size()); 5801 EXPECT_EQ( 5802 2u, extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS).size()); 5803 } 5804 5805 TEST_F(ExtensionServiceTest, ProcessSyncDataUninstall) { 5806 InitializeEmptyExtensionService(); 5807 InitializeExtensionSyncService(); 5808 syncer::FakeSyncChangeProcessor processor; 5809 extension_sync_service()->MergeDataAndStartSyncing( 5810 syncer::EXTENSIONS, 5811 syncer::SyncDataList(), 5812 scoped_ptr<syncer::SyncChangeProcessor>( 5813 new syncer::FakeSyncChangeProcessor), 5814 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 5815 5816 sync_pb::EntitySpecifics specifics; 5817 sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); 5818 ext_specifics->set_id(good_crx); 5819 ext_specifics->set_version("1.0"); 5820 syncer::SyncData sync_data = 5821 syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); 5822 syncer::SyncChange sync_change(FROM_HERE, 5823 syncer::SyncChange::ACTION_DELETE, 5824 sync_data); 5825 syncer::SyncChangeList list(1); 5826 list[0] = sync_change; 5827 5828 // Should do nothing. 5829 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); 5830 EXPECT_FALSE(service()->GetExtensionById(good_crx, true)); 5831 5832 // Install the extension. 5833 base::FilePath extension_path = data_dir().AppendASCII("good.crx"); 5834 InstallCRX(extension_path, INSTALL_NEW); 5835 EXPECT_TRUE(service()->GetExtensionById(good_crx, true)); 5836 5837 // Should uninstall the extension. 5838 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); 5839 EXPECT_FALSE(service()->GetExtensionById(good_crx, true)); 5840 5841 // Should again do nothing. 5842 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); 5843 EXPECT_FALSE(service()->GetExtensionById(good_crx, true)); 5844 } 5845 5846 TEST_F(ExtensionServiceTest, ProcessSyncDataWrongType) { 5847 InitializeEmptyExtensionService(); 5848 InitializeExtensionSyncService(); 5849 5850 // Install the extension. 5851 base::FilePath extension_path = data_dir().AppendASCII("good.crx"); 5852 InstallCRX(extension_path, INSTALL_NEW); 5853 EXPECT_TRUE(service()->GetExtensionById(good_crx, true)); 5854 5855 sync_pb::EntitySpecifics specifics; 5856 sync_pb::AppSpecifics* app_specifics = specifics.mutable_app(); 5857 sync_pb::ExtensionSpecifics* extension_specifics = 5858 app_specifics->mutable_extension(); 5859 extension_specifics->set_id(good_crx); 5860 extension_specifics->set_version( 5861 service()->GetInstalledExtension(good_crx)->version()->GetString()); 5862 5863 { 5864 extension_specifics->set_enabled(true); 5865 syncer::SyncData sync_data = 5866 syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); 5867 syncer::SyncChange sync_change(FROM_HERE, 5868 syncer::SyncChange::ACTION_DELETE, 5869 sync_data); 5870 syncer::SyncChangeList list(1); 5871 list[0] = sync_change; 5872 5873 // Should do nothing 5874 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); 5875 EXPECT_TRUE(service()->GetExtensionById(good_crx, true)); 5876 } 5877 5878 { 5879 extension_specifics->set_enabled(false); 5880 syncer::SyncData sync_data = 5881 syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); 5882 syncer::SyncChange sync_change(FROM_HERE, 5883 syncer::SyncChange::ACTION_UPDATE, 5884 sync_data); 5885 syncer::SyncChangeList list(1); 5886 list[0] = sync_change; 5887 5888 // Should again do nothing. 5889 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); 5890 EXPECT_TRUE(service()->GetExtensionById(good_crx, false)); 5891 } 5892 } 5893 5894 TEST_F(ExtensionServiceTest, ProcessSyncDataSettings) { 5895 InitializeEmptyExtensionService(); 5896 InitializeProcessManager(); 5897 InitializeExtensionSyncService(); 5898 syncer::FakeSyncChangeProcessor processor; 5899 extension_sync_service()->MergeDataAndStartSyncing( 5900 syncer::EXTENSIONS, 5901 syncer::SyncDataList(), 5902 scoped_ptr<syncer::SyncChangeProcessor>( 5903 new syncer::FakeSyncChangeProcessor), 5904 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 5905 5906 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 5907 EXPECT_TRUE(service()->IsExtensionEnabled(good_crx)); 5908 EXPECT_FALSE(extensions::util::IsIncognitoEnabled(good_crx, profile())); 5909 5910 sync_pb::EntitySpecifics specifics; 5911 sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); 5912 ext_specifics->set_id(good_crx); 5913 ext_specifics->set_version( 5914 service()->GetInstalledExtension(good_crx)->version()->GetString()); 5915 ext_specifics->set_enabled(false); 5916 5917 { 5918 syncer::SyncData sync_data = 5919 syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); 5920 syncer::SyncChange sync_change(FROM_HERE, 5921 syncer::SyncChange::ACTION_UPDATE, 5922 sync_data); 5923 syncer::SyncChangeList list(1); 5924 list[0] = sync_change; 5925 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); 5926 EXPECT_FALSE(service()->IsExtensionEnabled(good_crx)); 5927 EXPECT_FALSE(extensions::util::IsIncognitoEnabled(good_crx, profile())); 5928 } 5929 5930 { 5931 ext_specifics->set_enabled(true); 5932 ext_specifics->set_incognito_enabled(true); 5933 syncer::SyncData sync_data = 5934 syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); 5935 syncer::SyncChange sync_change(FROM_HERE, 5936 syncer::SyncChange::ACTION_UPDATE, 5937 sync_data); 5938 syncer::SyncChangeList list(1); 5939 list[0] = sync_change; 5940 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); 5941 EXPECT_TRUE(service()->IsExtensionEnabled(good_crx)); 5942 EXPECT_TRUE(extensions::util::IsIncognitoEnabled(good_crx, profile())); 5943 } 5944 5945 { 5946 ext_specifics->set_enabled(false); 5947 ext_specifics->set_incognito_enabled(true); 5948 syncer::SyncData sync_data = 5949 syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); 5950 syncer::SyncChange sync_change(FROM_HERE, 5951 syncer::SyncChange::ACTION_UPDATE, 5952 sync_data); 5953 syncer::SyncChangeList list(1); 5954 list[0] = sync_change; 5955 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); 5956 EXPECT_FALSE(service()->IsExtensionEnabled(good_crx)); 5957 EXPECT_TRUE(extensions::util::IsIncognitoEnabled(good_crx, profile())); 5958 } 5959 5960 EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(good_crx)); 5961 } 5962 5963 TEST_F(ExtensionServiceTest, ProcessSyncDataTerminatedExtension) { 5964 InitializeExtensionServiceWithUpdater(); 5965 InitializeExtensionSyncService(); 5966 syncer::FakeSyncChangeProcessor processor; 5967 extension_sync_service()->MergeDataAndStartSyncing( 5968 syncer::EXTENSIONS, 5969 syncer::SyncDataList(), 5970 scoped_ptr<syncer::SyncChangeProcessor>( 5971 new syncer::FakeSyncChangeProcessor), 5972 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 5973 5974 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 5975 TerminateExtension(good_crx); 5976 EXPECT_TRUE(service()->IsExtensionEnabled(good_crx)); 5977 EXPECT_FALSE(extensions::util::IsIncognitoEnabled(good_crx, profile())); 5978 5979 sync_pb::EntitySpecifics specifics; 5980 sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); 5981 ext_specifics->set_id(good_crx); 5982 ext_specifics->set_version( 5983 service()->GetInstalledExtension(good_crx)->version()->GetString()); 5984 ext_specifics->set_enabled(false); 5985 ext_specifics->set_incognito_enabled(true); 5986 syncer::SyncData sync_data = 5987 syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); 5988 syncer::SyncChange sync_change(FROM_HERE, 5989 syncer::SyncChange::ACTION_UPDATE, 5990 sync_data); 5991 syncer::SyncChangeList list(1); 5992 list[0] = sync_change; 5993 5994 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); 5995 EXPECT_FALSE(service()->IsExtensionEnabled(good_crx)); 5996 EXPECT_TRUE(extensions::util::IsIncognitoEnabled(good_crx, profile())); 5997 5998 EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(good_crx)); 5999 } 6000 6001 TEST_F(ExtensionServiceTest, ProcessSyncDataVersionCheck) { 6002 InitializeExtensionServiceWithUpdater(); 6003 InitializeExtensionSyncService(); 6004 syncer::FakeSyncChangeProcessor processor; 6005 extension_sync_service()->MergeDataAndStartSyncing( 6006 syncer::EXTENSIONS, 6007 syncer::SyncDataList(), 6008 scoped_ptr<syncer::SyncChangeProcessor>( 6009 new syncer::FakeSyncChangeProcessor), 6010 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 6011 6012 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 6013 EXPECT_TRUE(service()->IsExtensionEnabled(good_crx)); 6014 EXPECT_FALSE(extensions::util::IsIncognitoEnabled(good_crx, profile())); 6015 6016 sync_pb::EntitySpecifics specifics; 6017 sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); 6018 ext_specifics->set_id(good_crx); 6019 ext_specifics->set_enabled(true); 6020 6021 { 6022 ext_specifics->set_version( 6023 service()->GetInstalledExtension(good_crx)->version()->GetString()); 6024 syncer::SyncData sync_data = 6025 syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); 6026 syncer::SyncChange sync_change(FROM_HERE, 6027 syncer::SyncChange::ACTION_UPDATE, 6028 sync_data); 6029 syncer::SyncChangeList list(1); 6030 list[0] = sync_change; 6031 6032 // Should do nothing if extension version == sync version. 6033 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); 6034 EXPECT_FALSE(service()->updater()->WillCheckSoon()); 6035 } 6036 6037 // Should do nothing if extension version > sync version (but see 6038 // the TODO in ProcessExtensionSyncData). 6039 { 6040 ext_specifics->set_version("0.0.0.0"); 6041 syncer::SyncData sync_data = 6042 syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); 6043 syncer::SyncChange sync_change(FROM_HERE, 6044 syncer::SyncChange::ACTION_UPDATE, 6045 sync_data); 6046 syncer::SyncChangeList list(1); 6047 list[0] = sync_change; 6048 6049 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); 6050 EXPECT_FALSE(service()->updater()->WillCheckSoon()); 6051 } 6052 6053 // Should kick off an update if extension version < sync version. 6054 { 6055 ext_specifics->set_version("9.9.9.9"); 6056 syncer::SyncData sync_data = 6057 syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); 6058 syncer::SyncChange sync_change(FROM_HERE, 6059 syncer::SyncChange::ACTION_UPDATE, 6060 sync_data); 6061 syncer::SyncChangeList list(1); 6062 list[0] = sync_change; 6063 6064 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); 6065 EXPECT_TRUE(service()->updater()->WillCheckSoon()); 6066 } 6067 6068 EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(good_crx)); 6069 } 6070 6071 TEST_F(ExtensionServiceTest, ProcessSyncDataNotInstalled) { 6072 InitializeExtensionServiceWithUpdater(); 6073 InitializeExtensionSyncService(); 6074 syncer::FakeSyncChangeProcessor processor; 6075 extension_sync_service()->MergeDataAndStartSyncing( 6076 syncer::EXTENSIONS, 6077 syncer::SyncDataList(), 6078 scoped_ptr<syncer::SyncChangeProcessor>( 6079 new syncer::FakeSyncChangeProcessor), 6080 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 6081 6082 sync_pb::EntitySpecifics specifics; 6083 sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); 6084 ext_specifics->set_id(good_crx); 6085 ext_specifics->set_enabled(false); 6086 ext_specifics->set_incognito_enabled(true); 6087 ext_specifics->set_update_url("http://www.google.com/"); 6088 ext_specifics->set_version("1.2.3.4"); 6089 syncer::SyncData sync_data = 6090 syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); 6091 syncer::SyncChange sync_change(FROM_HERE, 6092 syncer::SyncChange::ACTION_UPDATE, 6093 sync_data); 6094 syncer::SyncChangeList list(1); 6095 list[0] = sync_change; 6096 6097 EXPECT_TRUE(service()->IsExtensionEnabled(good_crx)); 6098 EXPECT_FALSE(extensions::util::IsIncognitoEnabled(good_crx, profile())); 6099 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); 6100 EXPECT_TRUE(service()->updater()->WillCheckSoon()); 6101 EXPECT_FALSE(service()->IsExtensionEnabled(good_crx)); 6102 EXPECT_TRUE(extensions::util::IsIncognitoEnabled(good_crx, profile())); 6103 6104 const extensions::PendingExtensionInfo* info; 6105 EXPECT_TRUE( 6106 (info = service()->pending_extension_manager()->GetById(good_crx))); 6107 EXPECT_EQ(ext_specifics->update_url(), info->update_url().spec()); 6108 EXPECT_TRUE(info->is_from_sync()); 6109 EXPECT_TRUE(info->install_silently()); 6110 EXPECT_EQ(Manifest::INTERNAL, info->install_source()); 6111 // TODO(akalin): Figure out a way to test |info.ShouldAllowInstall()|. 6112 } 6113 6114 TEST_F(ExtensionServiceTest, SupervisedUser_InstallOnlyAllowedByCustodian) { 6115 ExtensionServiceInitParams params = CreateDefaultInitParams(); 6116 params.profile_is_supervised = true; 6117 InitializeExtensionService(params); 6118 6119 SupervisedUserService* supervised_user_service = 6120 SupervisedUserServiceFactory::GetForProfile(profile()); 6121 GetManagementPolicy()->RegisterProvider(supervised_user_service); 6122 6123 base::FilePath path1 = data_dir().AppendASCII("good.crx"); 6124 base::FilePath path2 = data_dir().AppendASCII("good2048.crx"); 6125 const Extension* extensions[] = { 6126 InstallCRX(path1, INSTALL_FAILED), 6127 InstallCRX(path2, INSTALL_NEW, Extension::WAS_INSTALLED_BY_CUSTODIAN) 6128 }; 6129 6130 // Only the extension with the "installed by custodian" flag should have been 6131 // installed and enabled. 6132 EXPECT_FALSE(extensions[0]); 6133 ASSERT_TRUE(extensions[1]); 6134 EXPECT_TRUE(registry()->enabled_extensions().Contains(extensions[1]->id())); 6135 } 6136 6137 TEST_F(ExtensionServiceTest, SupervisedUser_UpdateWithoutPermissionIncrease) { 6138 ExtensionServiceInitParams params = CreateDefaultInitParams(); 6139 params.profile_is_supervised = true; 6140 InitializeExtensionService(params); 6141 6142 SupervisedUserService* supervised_user_service = 6143 SupervisedUserServiceFactory::GetForProfile(profile()); 6144 GetManagementPolicy()->RegisterProvider(supervised_user_service); 6145 6146 base::FilePath base_path = data_dir().AppendASCII("autoupdate"); 6147 base::FilePath pem_path = base_path.AppendASCII("key.pem"); 6148 6149 base::FilePath path = base_path.AppendASCII("v1"); 6150 const Extension* extension = 6151 PackAndInstallCRX(path, pem_path, INSTALL_NEW, 6152 Extension::WAS_INSTALLED_BY_CUSTODIAN); 6153 // The extension must now be installed and enabled. 6154 ASSERT_TRUE(extension); 6155 ASSERT_TRUE(registry()->enabled_extensions().Contains(extension->id())); 6156 6157 // Save the id, as the extension object will be destroyed during updating. 6158 std::string id = extension->id(); 6159 6160 std::string old_version = extension->VersionString(); 6161 6162 // Update to a new version. 6163 path = base_path.AppendASCII("v2"); 6164 PackCRXAndUpdateExtension(id, path, pem_path, ENABLED); 6165 6166 // The extension should still be there and enabled. 6167 extension = registry()->enabled_extensions().GetByID(id); 6168 ASSERT_TRUE(extension); 6169 // The version should have changed. 6170 EXPECT_NE(extension->VersionString(), old_version); 6171 } 6172 6173 TEST_F(ExtensionServiceTest, SupervisedUser_UpdateWithPermissionIncrease) { 6174 ExtensionServiceInitParams params = CreateDefaultInitParams(); 6175 params.profile_is_supervised = true; 6176 InitializeExtensionService(params); 6177 6178 SupervisedUserService* supervised_user_service = 6179 SupervisedUserServiceFactory::GetForProfile(profile()); 6180 GetManagementPolicy()->RegisterProvider(supervised_user_service); 6181 6182 base::FilePath base_path = data_dir().AppendASCII("permissions_increase"); 6183 base::FilePath pem_path = base_path.AppendASCII("permissions.pem"); 6184 6185 base::FilePath path = base_path.AppendASCII("v1"); 6186 const Extension* extension = 6187 PackAndInstallCRX(path, pem_path, INSTALL_NEW, 6188 Extension::WAS_INSTALLED_BY_CUSTODIAN); 6189 // The extension must now be installed and enabled. 6190 ASSERT_TRUE(extension); 6191 ASSERT_TRUE(registry()->enabled_extensions().Contains(extension->id())); 6192 6193 // Save the id, as the extension object will be destroyed during updating. 6194 std::string id = extension->id(); 6195 6196 std::string old_version = extension->VersionString(); 6197 6198 // Update to a new version with increased permissions. 6199 path = base_path.AppendASCII("v2"); 6200 PackCRXAndUpdateExtension(id, path, pem_path, DISABLED); 6201 6202 // The extension should still be there, but disabled. 6203 EXPECT_FALSE(registry()->enabled_extensions().Contains(id)); 6204 extension = registry()->disabled_extensions().GetByID(id); 6205 ASSERT_TRUE(extension); 6206 // The version should have changed. 6207 EXPECT_NE(extension->VersionString(), old_version); 6208 } 6209 6210 TEST_F(ExtensionServiceTest, 6211 SupervisedUser_SyncUninstallByCustodianSkipsPolicy) { 6212 InitializeEmptyExtensionService(); 6213 InitializeExtensionSyncService(); 6214 extension_sync_service()->MergeDataAndStartSyncing( 6215 syncer::EXTENSIONS, 6216 syncer::SyncDataList(), 6217 scoped_ptr<syncer::SyncChangeProcessor>( 6218 new syncer::FakeSyncChangeProcessor), 6219 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); 6220 6221 // Install two extensions. 6222 base::FilePath path1 = data_dir().AppendASCII("good.crx"); 6223 base::FilePath path2 = data_dir().AppendASCII("good2048.crx"); 6224 const Extension* extensions[] = { 6225 InstallCRX(path1, INSTALL_NEW), 6226 InstallCRX(path2, INSTALL_NEW, Extension::WAS_INSTALLED_BY_CUSTODIAN) 6227 }; 6228 6229 // Add a policy provider that will disallow any changes. 6230 extensions::TestManagementPolicyProvider provider( 6231 extensions::TestManagementPolicyProvider::PROHIBIT_MODIFY_STATUS); 6232 GetManagementPolicy()->RegisterProvider(&provider); 6233 6234 // Create a sync deletion for each extension. 6235 syncer::SyncChangeList change_list; 6236 for (size_t i = 0; i < arraysize(extensions); i++) { 6237 const std::string& id = extensions[i]->id(); 6238 sync_pb::EntitySpecifics specifics; 6239 sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); 6240 ext_specifics->set_id(id); 6241 ext_specifics->set_version("1.0"); 6242 ext_specifics->set_installed_by_custodian( 6243 extensions[i]->was_installed_by_custodian()); 6244 syncer::SyncData sync_data = 6245 syncer::SyncData::CreateLocalData(id, "Name", specifics); 6246 change_list.push_back(syncer::SyncChange(FROM_HERE, 6247 syncer::SyncChange::ACTION_DELETE, 6248 sync_data)); 6249 } 6250 6251 // Save the extension ids, as uninstalling destroys the Extension instance. 6252 std::string extension_ids[] = { 6253 extensions[0]->id(), 6254 extensions[1]->id() 6255 }; 6256 6257 // Now apply the uninstallations. 6258 extension_sync_service()->ProcessSyncChanges(FROM_HERE, change_list); 6259 6260 // Uninstalling the extension without installed_by_custodian should have been 6261 // blocked by policy, so it should still be there. 6262 EXPECT_TRUE(registry()->enabled_extensions().Contains(extension_ids[0])); 6263 6264 // But installed_by_custodian should result in bypassing the policy check. 6265 EXPECT_FALSE( 6266 registry()->GenerateInstalledExtensionsSet()->Contains(extension_ids[1])); 6267 } 6268 6269 TEST_F(ExtensionServiceTest, InstallPriorityExternalUpdateUrl) { 6270 InitializeEmptyExtensionService(); 6271 6272 base::FilePath path = data_dir().AppendASCII("good.crx"); 6273 InstallCRX(path, INSTALL_NEW); 6274 ValidatePrefKeyCount(1u); 6275 ValidateIntegerPref(good_crx, "state", Extension::ENABLED); 6276 ValidateIntegerPref(good_crx, "location", Manifest::INTERNAL); 6277 6278 extensions::PendingExtensionManager* pending = 6279 service()->pending_extension_manager(); 6280 EXPECT_FALSE(pending->IsIdPending(kGoodId)); 6281 6282 // Skip install when the location is the same. 6283 EXPECT_FALSE( 6284 service()->OnExternalExtensionUpdateUrlFound(kGoodId, 6285 std::string(), 6286 GURL(kGoodUpdateURL), 6287 Manifest::INTERNAL, 6288 Extension::NO_FLAGS, 6289 false)); 6290 EXPECT_FALSE(pending->IsIdPending(kGoodId)); 6291 6292 // Install when the location has higher priority. 6293 EXPECT_TRUE(service()->OnExternalExtensionUpdateUrlFound( 6294 kGoodId, 6295 std::string(), 6296 GURL(kGoodUpdateURL), 6297 Manifest::EXTERNAL_POLICY_DOWNLOAD, 6298 Extension::NO_FLAGS, 6299 false)); 6300 EXPECT_TRUE(pending->IsIdPending(kGoodId)); 6301 6302 // Try the low priority again. Should be rejected. 6303 EXPECT_FALSE(service()->OnExternalExtensionUpdateUrlFound( 6304 kGoodId, 6305 std::string(), 6306 GURL(kGoodUpdateURL), 6307 Manifest::EXTERNAL_PREF_DOWNLOAD, 6308 Extension::NO_FLAGS, 6309 false)); 6310 // The existing record should still be present in the pending extension 6311 // manager. 6312 EXPECT_TRUE(pending->IsIdPending(kGoodId)); 6313 6314 pending->Remove(kGoodId); 6315 6316 // Skip install when the location has the same priority as the installed 6317 // location. 6318 EXPECT_FALSE( 6319 service()->OnExternalExtensionUpdateUrlFound(kGoodId, 6320 std::string(), 6321 GURL(kGoodUpdateURL), 6322 Manifest::INTERNAL, 6323 Extension::NO_FLAGS, 6324 false)); 6325 6326 EXPECT_FALSE(pending->IsIdPending(kGoodId)); 6327 } 6328 6329 TEST_F(ExtensionServiceTest, InstallPriorityExternalLocalFile) { 6330 Version older_version("0.1.0.0"); 6331 Version newer_version("2.0.0.0"); 6332 6333 // We don't want the extension to be installed. A path that doesn't 6334 // point to a valid CRX ensures this. 6335 const base::FilePath kInvalidPathToCrx = base::FilePath(); 6336 6337 const int kCreationFlags = 0; 6338 const bool kDontMarkAcknowledged = false; 6339 6340 InitializeEmptyExtensionService(); 6341 6342 // The test below uses install source constants to test that 6343 // priority is enforced. It assumes a specific ranking of install 6344 // sources: Registry (EXTERNAL_REGISTRY) overrides external pref 6345 // (EXTERNAL_PREF), and external pref overrides user install (INTERNAL). 6346 // The following assertions verify these assumptions: 6347 ASSERT_EQ(Manifest::EXTERNAL_REGISTRY, 6348 Manifest::GetHigherPriorityLocation(Manifest::EXTERNAL_REGISTRY, 6349 Manifest::EXTERNAL_PREF)); 6350 ASSERT_EQ(Manifest::EXTERNAL_REGISTRY, 6351 Manifest::GetHigherPriorityLocation(Manifest::EXTERNAL_REGISTRY, 6352 Manifest::INTERNAL)); 6353 ASSERT_EQ(Manifest::EXTERNAL_PREF, 6354 Manifest::GetHigherPriorityLocation(Manifest::EXTERNAL_PREF, 6355 Manifest::INTERNAL)); 6356 6357 extensions::PendingExtensionManager* pending = 6358 service()->pending_extension_manager(); 6359 EXPECT_FALSE(pending->IsIdPending(kGoodId)); 6360 6361 { 6362 // Simulate an external source adding the extension as INTERNAL. 6363 content::WindowedNotificationObserver observer( 6364 extensions::NOTIFICATION_CRX_INSTALLER_DONE, 6365 content::NotificationService::AllSources()); 6366 EXPECT_TRUE(service()->OnExternalExtensionFileFound(kGoodId, 6367 &older_version, 6368 kInvalidPathToCrx, 6369 Manifest::INTERNAL, 6370 kCreationFlags, 6371 kDontMarkAcknowledged)); 6372 EXPECT_TRUE(pending->IsIdPending(kGoodId)); 6373 observer.Wait(); 6374 VerifyCrxInstall(kInvalidPathToCrx, INSTALL_FAILED); 6375 } 6376 6377 { 6378 // Simulate an external source adding the extension as EXTERNAL_PREF. 6379 content::WindowedNotificationObserver observer( 6380 extensions::NOTIFICATION_CRX_INSTALLER_DONE, 6381 content::NotificationService::AllSources()); 6382 EXPECT_TRUE(service()->OnExternalExtensionFileFound(kGoodId, 6383 &older_version, 6384 kInvalidPathToCrx, 6385 Manifest::EXTERNAL_PREF, 6386 kCreationFlags, 6387 kDontMarkAcknowledged)); 6388 EXPECT_TRUE(pending->IsIdPending(kGoodId)); 6389 observer.Wait(); 6390 VerifyCrxInstall(kInvalidPathToCrx, INSTALL_FAILED); 6391 } 6392 6393 // Simulate an external source adding as EXTERNAL_PREF again. 6394 // This is rejected because the version and the location are the same as 6395 // the previous installation, which is still pending. 6396 EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId, 6397 &older_version, 6398 kInvalidPathToCrx, 6399 Manifest::EXTERNAL_PREF, 6400 kCreationFlags, 6401 kDontMarkAcknowledged)); 6402 EXPECT_TRUE(pending->IsIdPending(kGoodId)); 6403 6404 // Try INTERNAL again. Should fail. 6405 EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId, 6406 &older_version, 6407 kInvalidPathToCrx, 6408 Manifest::INTERNAL, 6409 kCreationFlags, 6410 kDontMarkAcknowledged)); 6411 EXPECT_TRUE(pending->IsIdPending(kGoodId)); 6412 6413 { 6414 // Now the registry adds the extension. 6415 content::WindowedNotificationObserver observer( 6416 extensions::NOTIFICATION_CRX_INSTALLER_DONE, 6417 content::NotificationService::AllSources()); 6418 EXPECT_TRUE( 6419 service()->OnExternalExtensionFileFound(kGoodId, 6420 &older_version, 6421 kInvalidPathToCrx, 6422 Manifest::EXTERNAL_REGISTRY, 6423 kCreationFlags, 6424 kDontMarkAcknowledged)); 6425 EXPECT_TRUE(pending->IsIdPending(kGoodId)); 6426 observer.Wait(); 6427 VerifyCrxInstall(kInvalidPathToCrx, INSTALL_FAILED); 6428 } 6429 6430 // Registry outranks both external pref and internal, so both fail. 6431 EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId, 6432 &older_version, 6433 kInvalidPathToCrx, 6434 Manifest::EXTERNAL_PREF, 6435 kCreationFlags, 6436 kDontMarkAcknowledged)); 6437 EXPECT_TRUE(pending->IsIdPending(kGoodId)); 6438 6439 EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId, 6440 &older_version, 6441 kInvalidPathToCrx, 6442 Manifest::INTERNAL, 6443 kCreationFlags, 6444 kDontMarkAcknowledged)); 6445 EXPECT_TRUE(pending->IsIdPending(kGoodId)); 6446 6447 pending->Remove(kGoodId); 6448 6449 // Install the extension. 6450 base::FilePath path = data_dir().AppendASCII("good.crx"); 6451 const Extension* ext = InstallCRX(path, INSTALL_NEW); 6452 ValidatePrefKeyCount(1u); 6453 ValidateIntegerPref(good_crx, "state", Extension::ENABLED); 6454 ValidateIntegerPref(good_crx, "location", Manifest::INTERNAL); 6455 6456 // Now test the logic of OnExternalExtensionFileFound() when the extension 6457 // being added is already installed. 6458 6459 // Tests assume |older_version| is less than the installed version, and 6460 // |newer_version| is greater. Verify this: 6461 ASSERT_TRUE(older_version.IsOlderThan(ext->VersionString())); 6462 ASSERT_TRUE(ext->version()->IsOlderThan(newer_version.GetString())); 6463 6464 // An external install for the same location should fail if the version is 6465 // older, or the same, and succeed if the version is newer. 6466 6467 // Older than the installed version... 6468 EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId, 6469 &older_version, 6470 kInvalidPathToCrx, 6471 Manifest::INTERNAL, 6472 kCreationFlags, 6473 kDontMarkAcknowledged)); 6474 EXPECT_FALSE(pending->IsIdPending(kGoodId)); 6475 6476 // Same version as the installed version... 6477 EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId, 6478 ext->version(), 6479 kInvalidPathToCrx, 6480 Manifest::INTERNAL, 6481 kCreationFlags, 6482 kDontMarkAcknowledged)); 6483 EXPECT_FALSE(pending->IsIdPending(kGoodId)); 6484 6485 // Newer than the installed version... 6486 EXPECT_TRUE(service()->OnExternalExtensionFileFound(kGoodId, 6487 &newer_version, 6488 kInvalidPathToCrx, 6489 Manifest::INTERNAL, 6490 kCreationFlags, 6491 kDontMarkAcknowledged)); 6492 EXPECT_TRUE(pending->IsIdPending(kGoodId)); 6493 6494 // An external install for a higher priority install source should succeed 6495 // if the version is greater. |older_version| is not... 6496 EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId, 6497 &older_version, 6498 kInvalidPathToCrx, 6499 Manifest::EXTERNAL_PREF, 6500 kCreationFlags, 6501 kDontMarkAcknowledged)); 6502 EXPECT_TRUE(pending->IsIdPending(kGoodId)); 6503 6504 // |newer_version| is newer. 6505 EXPECT_TRUE(service()->OnExternalExtensionFileFound(kGoodId, 6506 &newer_version, 6507 kInvalidPathToCrx, 6508 Manifest::EXTERNAL_PREF, 6509 kCreationFlags, 6510 kDontMarkAcknowledged)); 6511 EXPECT_TRUE(pending->IsIdPending(kGoodId)); 6512 6513 // An external install for an even higher priority install source should 6514 // succeed if the version is greater. 6515 EXPECT_TRUE( 6516 service()->OnExternalExtensionFileFound(kGoodId, 6517 &newer_version, 6518 kInvalidPathToCrx, 6519 Manifest::EXTERNAL_REGISTRY, 6520 kCreationFlags, 6521 kDontMarkAcknowledged)); 6522 EXPECT_TRUE(pending->IsIdPending(kGoodId)); 6523 6524 // Because EXTERNAL_PREF is a lower priority source than EXTERNAL_REGISTRY, 6525 // adding from external pref will now fail. 6526 EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId, 6527 &newer_version, 6528 kInvalidPathToCrx, 6529 Manifest::EXTERNAL_PREF, 6530 kCreationFlags, 6531 kDontMarkAcknowledged)); 6532 EXPECT_TRUE(pending->IsIdPending(kGoodId)); 6533 } 6534 6535 TEST_F(ExtensionServiceTest, ConcurrentExternalLocalFile) { 6536 Version kVersion123("1.2.3"); 6537 Version kVersion124("1.2.4"); 6538 Version kVersion125("1.2.5"); 6539 const base::FilePath kInvalidPathToCrx = base::FilePath(); 6540 const int kCreationFlags = 0; 6541 const bool kDontMarkAcknowledged = false; 6542 6543 InitializeEmptyExtensionService(); 6544 6545 extensions::PendingExtensionManager* pending = 6546 service()->pending_extension_manager(); 6547 EXPECT_FALSE(pending->IsIdPending(kGoodId)); 6548 6549 // An external provider starts installing from a local crx. 6550 EXPECT_TRUE(service()->OnExternalExtensionFileFound(kGoodId, 6551 &kVersion123, 6552 kInvalidPathToCrx, 6553 Manifest::EXTERNAL_PREF, 6554 kCreationFlags, 6555 kDontMarkAcknowledged)); 6556 const extensions::PendingExtensionInfo* info; 6557 EXPECT_TRUE((info = pending->GetById(kGoodId))); 6558 EXPECT_TRUE(info->version().IsValid()); 6559 EXPECT_TRUE(info->version().Equals(kVersion123)); 6560 6561 // Adding a newer version overrides the currently pending version. 6562 EXPECT_TRUE(service()->OnExternalExtensionFileFound(kGoodId, 6563 &kVersion124, 6564 kInvalidPathToCrx, 6565 Manifest::EXTERNAL_PREF, 6566 kCreationFlags, 6567 kDontMarkAcknowledged)); 6568 EXPECT_TRUE((info = pending->GetById(kGoodId))); 6569 EXPECT_TRUE(info->version().IsValid()); 6570 EXPECT_TRUE(info->version().Equals(kVersion124)); 6571 6572 // Adding an older version fails. 6573 EXPECT_FALSE(service()->OnExternalExtensionFileFound(kGoodId, 6574 &kVersion123, 6575 kInvalidPathToCrx, 6576 Manifest::EXTERNAL_PREF, 6577 kCreationFlags, 6578 kDontMarkAcknowledged)); 6579 EXPECT_TRUE((info = pending->GetById(kGoodId))); 6580 EXPECT_TRUE(info->version().IsValid()); 6581 EXPECT_TRUE(info->version().Equals(kVersion124)); 6582 6583 // Adding an older version fails even when coming from a higher-priority 6584 // location. 6585 EXPECT_FALSE( 6586 service()->OnExternalExtensionFileFound(kGoodId, 6587 &kVersion123, 6588 kInvalidPathToCrx, 6589 Manifest::EXTERNAL_REGISTRY, 6590 kCreationFlags, 6591 kDontMarkAcknowledged)); 6592 EXPECT_TRUE((info = pending->GetById(kGoodId))); 6593 EXPECT_TRUE(info->version().IsValid()); 6594 EXPECT_TRUE(info->version().Equals(kVersion124)); 6595 6596 // Adding the latest version from the webstore overrides a specific version. 6597 GURL kUpdateUrl("http://example.com/update"); 6598 EXPECT_TRUE(service()->OnExternalExtensionUpdateUrlFound( 6599 kGoodId, 6600 std::string(), 6601 kUpdateUrl, 6602 Manifest::EXTERNAL_POLICY_DOWNLOAD, 6603 Extension::NO_FLAGS, 6604 false)); 6605 EXPECT_TRUE((info = pending->GetById(kGoodId))); 6606 EXPECT_FALSE(info->version().IsValid()); 6607 } 6608 6609 // This makes sure we can package and install CRX files that use whitelisted 6610 // permissions. 6611 TEST_F(ExtensionServiceTest, InstallWhitelistedExtension) { 6612 std::string test_id = "hdkklepkcpckhnpgjnmbdfhehckloojk"; 6613 CommandLine::ForCurrentProcess()->AppendSwitchASCII( 6614 extensions::switches::kWhitelistedExtensionID, test_id); 6615 6616 InitializeEmptyExtensionService(); 6617 base::FilePath path = data_dir().AppendASCII("permissions"); 6618 base::FilePath pem_path = path 6619 .AppendASCII("whitelist.pem"); 6620 path = path 6621 .AppendASCII("whitelist"); 6622 6623 const Extension* extension = PackAndInstallCRX(path, pem_path, INSTALL_NEW); 6624 EXPECT_EQ(0u, GetErrors().size()); 6625 ASSERT_EQ(1u, registry()->enabled_extensions().size()); 6626 EXPECT_EQ(test_id, extension->id()); 6627 } 6628 6629 // Test that when multiple sources try to install an extension, 6630 // we consistently choose the right one. To make tests easy to read, 6631 // methods that fake requests to install crx files in several ways 6632 // are provided. 6633 class ExtensionSourcePriorityTest : public ExtensionServiceTest { 6634 public: 6635 virtual void SetUp() { 6636 ExtensionServiceTest::SetUp(); 6637 6638 // All tests use a single extension. Put the id and path in member vars 6639 // that all methods can read. 6640 crx_id_ = kGoodId; 6641 crx_path_ = data_dir().AppendASCII("good.crx"); 6642 } 6643 6644 // Fake an external source adding a URL to fetch an extension from. 6645 bool AddPendingExternalPrefUrl() { 6646 return service()->pending_extension_manager()->AddFromExternalUpdateUrl( 6647 crx_id_, 6648 std::string(), 6649 GURL(), 6650 Manifest::EXTERNAL_PREF_DOWNLOAD, 6651 Extension::NO_FLAGS, 6652 false); 6653 } 6654 6655 // Fake an external file from external_extensions.json. 6656 bool AddPendingExternalPrefFileInstall() { 6657 Version version("1.0.0.0"); 6658 6659 return service()->OnExternalExtensionFileFound(crx_id_, 6660 &version, 6661 crx_path_, 6662 Manifest::EXTERNAL_PREF, 6663 Extension::NO_FLAGS, 6664 false); 6665 } 6666 6667 // Fake a request from sync to install an extension. 6668 bool AddPendingSyncInstall() { 6669 return service()->pending_extension_manager()->AddFromSync( 6670 crx_id_, 6671 GURL(kGoodUpdateURL), 6672 &IsExtension, 6673 kGoodInstallSilently, 6674 kGoodRemoteInstall, 6675 kGoodInstalledByCustodian); 6676 } 6677 6678 // Fake a policy install. 6679 bool AddPendingPolicyInstall() { 6680 // Get path to the CRX with id |kGoodId|. 6681 return service()->OnExternalExtensionUpdateUrlFound( 6682 crx_id_, 6683 std::string(), 6684 GURL(), 6685 Manifest::EXTERNAL_POLICY_DOWNLOAD, 6686 Extension::NO_FLAGS, 6687 false); 6688 } 6689 6690 // Get the install source of a pending extension. 6691 Manifest::Location GetPendingLocation() { 6692 const extensions::PendingExtensionInfo* info; 6693 EXPECT_TRUE( 6694 (info = service()->pending_extension_manager()->GetById(crx_id_))); 6695 return info->install_source(); 6696 } 6697 6698 // Is an extension pending from a sync request? 6699 bool GetPendingIsFromSync() { 6700 const extensions::PendingExtensionInfo* info; 6701 EXPECT_TRUE( 6702 (info = service()->pending_extension_manager()->GetById(crx_id_))); 6703 return info->is_from_sync(); 6704 } 6705 6706 // Is the CRX id these tests use pending? 6707 bool IsCrxPending() { 6708 return service()->pending_extension_manager()->IsIdPending(crx_id_); 6709 } 6710 6711 // Is an extension installed? 6712 bool IsCrxInstalled() { 6713 return (service()->GetExtensionById(crx_id_, true) != NULL); 6714 } 6715 6716 protected: 6717 // All tests use a single extension. Making the id and path member 6718 // vars avoids pasing the same argument to every method. 6719 std::string crx_id_; 6720 base::FilePath crx_path_; 6721 }; 6722 6723 // Test that a pending request for installation of an external CRX from 6724 // an update URL overrides a pending request to install the same extension 6725 // from sync. 6726 TEST_F(ExtensionSourcePriorityTest, PendingExternalFileOverSync) { 6727 InitializeEmptyExtensionService(); 6728 6729 ASSERT_FALSE(IsCrxInstalled()); 6730 6731 // Install pending extension from sync. 6732 content::WindowedNotificationObserver observer( 6733 extensions::NOTIFICATION_CRX_INSTALLER_DONE, 6734 content::NotificationService::AllSources()); 6735 EXPECT_TRUE(AddPendingSyncInstall()); 6736 ASSERT_EQ(Manifest::INTERNAL, GetPendingLocation()); 6737 EXPECT_TRUE(GetPendingIsFromSync()); 6738 ASSERT_FALSE(IsCrxInstalled()); 6739 6740 // Install pending as external prefs json would. 6741 AddPendingExternalPrefFileInstall(); 6742 ASSERT_EQ(Manifest::EXTERNAL_PREF, GetPendingLocation()); 6743 ASSERT_FALSE(IsCrxInstalled()); 6744 6745 // Another request from sync should be ignored. 6746 EXPECT_FALSE(AddPendingSyncInstall()); 6747 ASSERT_EQ(Manifest::EXTERNAL_PREF, GetPendingLocation()); 6748 ASSERT_FALSE(IsCrxInstalled()); 6749 6750 observer.Wait(); 6751 VerifyCrxInstall(crx_path_, INSTALL_NEW); 6752 ASSERT_TRUE(IsCrxInstalled()); 6753 } 6754 6755 // Test that an install of an external CRX from an update overrides 6756 // an install of the same extension from sync. 6757 TEST_F(ExtensionSourcePriorityTest, PendingExternalUrlOverSync) { 6758 InitializeEmptyExtensionService(); 6759 ASSERT_FALSE(IsCrxInstalled()); 6760 6761 EXPECT_TRUE(AddPendingSyncInstall()); 6762 ASSERT_EQ(Manifest::INTERNAL, GetPendingLocation()); 6763 EXPECT_TRUE(GetPendingIsFromSync()); 6764 ASSERT_FALSE(IsCrxInstalled()); 6765 6766 ASSERT_TRUE(AddPendingExternalPrefUrl()); 6767 ASSERT_EQ(Manifest::EXTERNAL_PREF_DOWNLOAD, GetPendingLocation()); 6768 EXPECT_FALSE(GetPendingIsFromSync()); 6769 ASSERT_FALSE(IsCrxInstalled()); 6770 6771 EXPECT_FALSE(AddPendingSyncInstall()); 6772 ASSERT_EQ(Manifest::EXTERNAL_PREF_DOWNLOAD, GetPendingLocation()); 6773 EXPECT_FALSE(GetPendingIsFromSync()); 6774 ASSERT_FALSE(IsCrxInstalled()); 6775 } 6776 6777 // Test that an external install request stops sync from installing 6778 // the same extension. 6779 TEST_F(ExtensionSourcePriorityTest, InstallExternalBlocksSyncRequest) { 6780 InitializeEmptyExtensionService(); 6781 ASSERT_FALSE(IsCrxInstalled()); 6782 6783 // External prefs starts an install. 6784 AddPendingExternalPrefFileInstall(); 6785 6786 // Crx installer was made, but has not yet run. 6787 ASSERT_FALSE(IsCrxInstalled()); 6788 6789 // Before the CRX installer runs, Sync requests that the same extension 6790 // be installed. Should fail, because an external source is pending. 6791 content::WindowedNotificationObserver observer( 6792 extensions::NOTIFICATION_CRX_INSTALLER_DONE, 6793 content::NotificationService::AllSources()); 6794 ASSERT_FALSE(AddPendingSyncInstall()); 6795 6796 // Wait for the external source to install. 6797 observer.Wait(); 6798 VerifyCrxInstall(crx_path_, INSTALL_NEW); 6799 ASSERT_TRUE(IsCrxInstalled()); 6800 6801 // Now that the extension is installed, sync request should fail 6802 // because the extension is already installed. 6803 ASSERT_FALSE(AddPendingSyncInstall()); 6804 } 6805 6806 // Test that installing an external extension displays a GlobalError. 6807 TEST_F(ExtensionServiceTest, ExternalInstallGlobalError) { 6808 FeatureSwitch::ScopedOverride prompt( 6809 FeatureSwitch::prompt_for_external_extensions(), true); 6810 6811 InitializeEmptyExtensionService(); 6812 MockExtensionProvider* provider = 6813 new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF); 6814 AddMockExternalProvider(provider); 6815 6816 service()->external_install_manager()->UpdateExternalExtensionAlert(); 6817 // Should return false, meaning there aren't any extensions that the user 6818 // needs to know about. 6819 EXPECT_FALSE( 6820 service()->external_install_manager()->HasExternalInstallError()); 6821 6822 // This is a normal extension, installed normally. 6823 // This should NOT trigger an alert. 6824 service()->set_extensions_enabled(true); 6825 base::FilePath path = data_dir().AppendASCII("good.crx"); 6826 InstallCRX(path, INSTALL_NEW); 6827 6828 service()->CheckForExternalUpdates(); 6829 base::RunLoop().RunUntilIdle(); 6830 EXPECT_FALSE( 6831 service()->external_install_manager()->HasExternalInstallError()); 6832 6833 // A hosted app, installed externally. 6834 // This should NOT trigger an alert. 6835 provider->UpdateOrAddExtension( 6836 hosted_app, "1.0.0.0", data_dir().AppendASCII("hosted_app.crx")); 6837 6838 content::WindowedNotificationObserver observer( 6839 extensions::NOTIFICATION_CRX_INSTALLER_DONE, 6840 content::NotificationService::AllSources()); 6841 service()->CheckForExternalUpdates(); 6842 observer.Wait(); 6843 EXPECT_FALSE( 6844 service()->external_install_manager()->HasExternalInstallError()); 6845 6846 // Another normal extension, but installed externally. 6847 // This SHOULD trigger an alert. 6848 provider->UpdateOrAddExtension( 6849 page_action, "1.0.0.0", data_dir().AppendASCII("page_action.crx")); 6850 6851 content::WindowedNotificationObserver observer2( 6852 extensions::NOTIFICATION_CRX_INSTALLER_DONE, 6853 content::NotificationService::AllSources()); 6854 service()->CheckForExternalUpdates(); 6855 observer2.Wait(); 6856 EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError()); 6857 } 6858 6859 // Test that external extensions are initially disabled, and that enabling 6860 // them clears the prompt. 6861 TEST_F(ExtensionServiceTest, ExternalInstallInitiallyDisabled) { 6862 FeatureSwitch::ScopedOverride prompt( 6863 FeatureSwitch::prompt_for_external_extensions(), true); 6864 6865 InitializeEmptyExtensionService(); 6866 MockExtensionProvider* provider = 6867 new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF); 6868 AddMockExternalProvider(provider); 6869 6870 provider->UpdateOrAddExtension( 6871 page_action, "1.0.0.0", data_dir().AppendASCII("page_action.crx")); 6872 6873 content::WindowedNotificationObserver observer( 6874 extensions::NOTIFICATION_CRX_INSTALLER_DONE, 6875 content::NotificationService::AllSources()); 6876 service()->CheckForExternalUpdates(); 6877 observer.Wait(); 6878 EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError()); 6879 EXPECT_FALSE(service()->IsExtensionEnabled(page_action)); 6880 6881 const Extension* extension = 6882 registry()->disabled_extensions().GetByID(page_action); 6883 EXPECT_TRUE(extension); 6884 EXPECT_EQ(page_action, extension->id()); 6885 6886 service()->EnableExtension(page_action); 6887 EXPECT_FALSE( 6888 service()->external_install_manager()->HasExternalInstallError()); 6889 EXPECT_TRUE(service()->IsExtensionEnabled(page_action)); 6890 } 6891 6892 // Test that installing multiple external extensions works. 6893 // Flaky on windows; http://crbug.com/295757 . 6894 #if defined(OS_WIN) 6895 #define MAYBE_ExternalInstallMultiple DISABLED_ExternalInstallMultiple 6896 #else 6897 #define MAYBE_ExternalInstallMultiple ExternalInstallMultiple 6898 #endif 6899 TEST_F(ExtensionServiceTest, MAYBE_ExternalInstallMultiple) { 6900 FeatureSwitch::ScopedOverride prompt( 6901 FeatureSwitch::prompt_for_external_extensions(), true); 6902 6903 InitializeEmptyExtensionService(); 6904 MockExtensionProvider* provider = 6905 new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF); 6906 AddMockExternalProvider(provider); 6907 6908 provider->UpdateOrAddExtension( 6909 page_action, "1.0.0.0", data_dir().AppendASCII("page_action.crx")); 6910 provider->UpdateOrAddExtension( 6911 good_crx, "1.0.0.0", data_dir().AppendASCII("good.crx")); 6912 provider->UpdateOrAddExtension( 6913 theme_crx, "2.0", data_dir().AppendASCII("theme.crx")); 6914 6915 int count = 3; 6916 content::WindowedNotificationObserver observer( 6917 extensions::NOTIFICATION_CRX_INSTALLER_DONE, 6918 base::Bind(&WaitForCountNotificationsCallback, &count)); 6919 service()->CheckForExternalUpdates(); 6920 observer.Wait(); 6921 EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError()); 6922 EXPECT_FALSE(service()->IsExtensionEnabled(page_action)); 6923 EXPECT_FALSE(service()->IsExtensionEnabled(good_crx)); 6924 EXPECT_FALSE(service()->IsExtensionEnabled(theme_crx)); 6925 6926 service()->EnableExtension(page_action); 6927 EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError()); 6928 EXPECT_FALSE(service() 6929 ->external_install_manager() 6930 ->HasExternalInstallBubbleForTesting()); 6931 6932 service()->EnableExtension(theme_crx); 6933 EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError()); 6934 EXPECT_FALSE(service() 6935 ->external_install_manager() 6936 ->HasExternalInstallBubbleForTesting()); 6937 6938 service()->EnableExtension(good_crx); 6939 EXPECT_FALSE( 6940 service()->external_install_manager()->HasExternalInstallError()); 6941 EXPECT_FALSE(service() 6942 ->external_install_manager() 6943 ->HasExternalInstallBubbleForTesting()); 6944 } 6945 6946 // Test that there is a bubble for external extensions that update 6947 // from the webstore if the profile is not new. 6948 TEST_F(ExtensionServiceTest, ExternalInstallUpdatesFromWebstoreOldProfile) { 6949 FeatureSwitch::ScopedOverride prompt( 6950 FeatureSwitch::prompt_for_external_extensions(), true); 6951 6952 // This sets up the ExtensionPrefs used by our ExtensionService to be 6953 // post-first run. 6954 ExtensionServiceInitParams params = CreateDefaultInitParams(); 6955 params.is_first_run = false; 6956 InitializeExtensionService(params); 6957 6958 base::FilePath crx_path = temp_dir().path().AppendASCII("webstore.crx"); 6959 PackCRX(data_dir().AppendASCII("update_from_webstore"), 6960 data_dir().AppendASCII("update_from_webstore.pem"), 6961 crx_path); 6962 6963 MockExtensionProvider* provider = 6964 new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF); 6965 AddMockExternalProvider(provider); 6966 provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path); 6967 6968 content::WindowedNotificationObserver observer( 6969 extensions::NOTIFICATION_CRX_INSTALLER_DONE, 6970 content::NotificationService::AllSources()); 6971 service()->CheckForExternalUpdates(); 6972 observer.Wait(); 6973 EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError()); 6974 EXPECT_TRUE(service() 6975 ->external_install_manager() 6976 ->HasExternalInstallBubbleForTesting()); 6977 EXPECT_FALSE(service()->IsExtensionEnabled(updates_from_webstore)); 6978 } 6979 6980 // Test that there is no bubble for external extensions if the profile is new. 6981 TEST_F(ExtensionServiceTest, ExternalInstallUpdatesFromWebstoreNewProfile) { 6982 FeatureSwitch::ScopedOverride prompt( 6983 FeatureSwitch::prompt_for_external_extensions(), true); 6984 6985 InitializeEmptyExtensionService(); 6986 6987 base::FilePath crx_path = temp_dir().path().AppendASCII("webstore.crx"); 6988 PackCRX(data_dir().AppendASCII("update_from_webstore"), 6989 data_dir().AppendASCII("update_from_webstore.pem"), 6990 crx_path); 6991 6992 MockExtensionProvider* provider = 6993 new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF); 6994 AddMockExternalProvider(provider); 6995 provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path); 6996 6997 content::WindowedNotificationObserver observer( 6998 extensions::NOTIFICATION_CRX_INSTALLER_DONE, 6999 content::NotificationService::AllSources()); 7000 service()->CheckForExternalUpdates(); 7001 observer.Wait(); 7002 EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError()); 7003 EXPECT_FALSE(service() 7004 ->external_install_manager() 7005 ->HasExternalInstallBubbleForTesting()); 7006 EXPECT_FALSE(service()->IsExtensionEnabled(updates_from_webstore)); 7007 } 7008 7009 // Test that clicking to remove the extension on an external install warning 7010 // uninstalls the extension. 7011 TEST_F(ExtensionServiceTest, ExternalInstallClickToRemove) { 7012 FeatureSwitch::ScopedOverride prompt( 7013 FeatureSwitch::prompt_for_external_extensions(), true); 7014 7015 ExtensionServiceInitParams params = CreateDefaultInitParams(); 7016 params.is_first_run = false; 7017 InitializeExtensionService(params); 7018 7019 base::FilePath crx_path = temp_dir().path().AppendASCII("webstore.crx"); 7020 PackCRX(data_dir().AppendASCII("update_from_webstore"), 7021 data_dir().AppendASCII("update_from_webstore.pem"), 7022 crx_path); 7023 7024 MockExtensionProvider* provider = 7025 new MockExtensionProvider(service_, Manifest::EXTERNAL_PREF); 7026 AddMockExternalProvider(provider); 7027 provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path); 7028 7029 content::WindowedNotificationObserver observer( 7030 extensions::NOTIFICATION_CRX_INSTALLER_DONE, 7031 content::NotificationService::AllSources()); 7032 service_->CheckForExternalUpdates(); 7033 observer.Wait(); 7034 EXPECT_TRUE(service_->external_install_manager()->HasExternalInstallError()); 7035 7036 // We check both enabled and disabled, since these are "eventually exclusive" 7037 // sets. 7038 EXPECT_TRUE(registry()->disabled_extensions().GetByID(updates_from_webstore)); 7039 EXPECT_FALSE(registry()->enabled_extensions().GetByID(updates_from_webstore)); 7040 7041 // Click the negative response. 7042 service_->external_install_manager()->error_for_testing()->InstallUIAbort( 7043 true); 7044 // The Extension should be uninstalled. 7045 EXPECT_FALSE(registry()->GetExtensionById(updates_from_webstore, 7046 ExtensionRegistry::EVERYTHING)); 7047 // The error should be removed. 7048 EXPECT_FALSE(service_->external_install_manager()->HasExternalInstallError()); 7049 } 7050 7051 // Test that clicking to keep the extension on an external install warning 7052 // re-enables the extension. 7053 TEST_F(ExtensionServiceTest, ExternalInstallClickToKeep) { 7054 FeatureSwitch::ScopedOverride prompt( 7055 FeatureSwitch::prompt_for_external_extensions(), true); 7056 7057 ExtensionServiceInitParams params = CreateDefaultInitParams(); 7058 params.is_first_run = false; 7059 InitializeExtensionService(params); 7060 7061 base::FilePath crx_path = temp_dir().path().AppendASCII("webstore.crx"); 7062 PackCRX(data_dir().AppendASCII("update_from_webstore"), 7063 data_dir().AppendASCII("update_from_webstore.pem"), 7064 crx_path); 7065 7066 MockExtensionProvider* provider = 7067 new MockExtensionProvider(service_, Manifest::EXTERNAL_PREF); 7068 AddMockExternalProvider(provider); 7069 provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path); 7070 7071 content::WindowedNotificationObserver observer( 7072 extensions::NOTIFICATION_CRX_INSTALLER_DONE, 7073 content::NotificationService::AllSources()); 7074 service_->CheckForExternalUpdates(); 7075 observer.Wait(); 7076 EXPECT_TRUE(service_->external_install_manager()->HasExternalInstallError()); 7077 7078 // We check both enabled and disabled, since these are "eventually exclusive" 7079 // sets. 7080 EXPECT_TRUE(registry()->disabled_extensions().GetByID(updates_from_webstore)); 7081 EXPECT_FALSE(registry()->enabled_extensions().GetByID(updates_from_webstore)); 7082 7083 // Accept the extension. 7084 service_->external_install_manager()->error_for_testing()->InstallUIProceed(); 7085 7086 // It should be enabled again. 7087 EXPECT_TRUE(registry()->enabled_extensions().GetByID(updates_from_webstore)); 7088 EXPECT_FALSE( 7089 registry()->disabled_extensions().GetByID(updates_from_webstore)); 7090 7091 // The error should be removed. 7092 EXPECT_FALSE(service_->external_install_manager()->HasExternalInstallError()); 7093 } 7094 7095 TEST_F(ExtensionServiceTest, InstallBlacklistedExtension) { 7096 InitializeEmptyExtensionService(); 7097 7098 scoped_refptr<Extension> extension = extensions::ExtensionBuilder() 7099 .SetManifest(extensions::DictionaryBuilder() 7100 .Set("name", "extension") 7101 .Set("version", "1.0") 7102 .Set("manifest_version", 2).Build()) 7103 .Build(); 7104 ASSERT_TRUE(extension.get()); 7105 const std::string& id = extension->id(); 7106 7107 std::set<std::string> id_set; 7108 id_set.insert(id); 7109 extensions::ExtensionNotificationObserver notifications( 7110 content::NotificationService::AllSources(), id_set); 7111 7112 // Installation should be allowed but the extension should never have been 7113 // loaded and it should be blacklisted in prefs. 7114 service()->OnExtensionInstalled( 7115 extension.get(), 7116 syncer::StringOrdinal(), 7117 (extensions::kInstallFlagIsBlacklistedForMalware | 7118 extensions::kInstallFlagInstallImmediately)); 7119 base::RunLoop().RunUntilIdle(); 7120 7121 // Extension was installed but not loaded. 7122 EXPECT_TRUE(notifications.CheckNotifications( 7123 extensions::NOTIFICATION_EXTENSION_WILL_BE_INSTALLED_DEPRECATED)); 7124 EXPECT_TRUE(service()->GetInstalledExtension(id)); 7125 7126 EXPECT_FALSE(registry()->enabled_extensions().Contains(id)); 7127 EXPECT_TRUE(registry()->blacklisted_extensions().Contains(id)); 7128 7129 EXPECT_TRUE(ExtensionPrefs::Get(profile())->IsExtensionBlacklisted(id)); 7130 EXPECT_TRUE( 7131 ExtensionPrefs::Get(profile())->IsBlacklistedExtensionAcknowledged(id)); 7132 } 7133 7134 // Tests a profile being destroyed correctly disables extensions. 7135 TEST_F(ExtensionServiceTest, DestroyingProfileClearsExtensions) { 7136 InitializeEmptyExtensionService(); 7137 7138 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); 7139 EXPECT_NE(UnloadedExtensionInfo::REASON_PROFILE_SHUTDOWN, unloaded_reason_); 7140 EXPECT_EQ(1u, registry()->enabled_extensions().size()); 7141 EXPECT_EQ(0u, registry()->disabled_extensions().size()); 7142 EXPECT_EQ(0u, registry()->terminated_extensions().size()); 7143 EXPECT_EQ(0u, registry()->blacklisted_extensions().size()); 7144 7145 service()->Observe(chrome::NOTIFICATION_PROFILE_DESTRUCTION_STARTED, 7146 content::Source<Profile>(profile()), 7147 content::NotificationService::NoDetails()); 7148 EXPECT_EQ(UnloadedExtensionInfo::REASON_PROFILE_SHUTDOWN, unloaded_reason_); 7149 EXPECT_EQ(0u, registry()->enabled_extensions().size()); 7150 EXPECT_EQ(0u, registry()->disabled_extensions().size()); 7151 EXPECT_EQ(0u, registry()->terminated_extensions().size()); 7152 EXPECT_EQ(0u, registry()->blacklisted_extensions().size()); 7153 } 7154