| OLD | NEW |
| 1 // Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <algorithm> | 5 #include <algorithm> |
| 6 #include <vector> | 6 #include <vector> |
| 7 | 7 |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/file_path.h" | 9 #include "base/file_path.h" |
| 10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 92 virtual void VisitRegisteredExtension( | 92 virtual void VisitRegisteredExtension( |
| 93 Visitor* visitor, const std::set<std::string>& ids_to_ignore) const { | 93 Visitor* visitor, const std::set<std::string>& ids_to_ignore) const { |
| 94 for (DataMap::const_iterator i = extension_map_.begin(); | 94 for (DataMap::const_iterator i = extension_map_.begin(); |
| 95 i != extension_map_.end(); ++i) { | 95 i != extension_map_.end(); ++i) { |
| 96 if (ids_to_ignore.find(i->first) != ids_to_ignore.end()) | 96 if (ids_to_ignore.find(i->first) != ids_to_ignore.end()) |
| 97 continue; | 97 continue; |
| 98 scoped_ptr<Version> version; | 98 scoped_ptr<Version> version; |
| 99 version.reset(Version::GetVersionFromString(i->second.first)); | 99 version.reset(Version::GetVersionFromString(i->second.first)); |
| 100 | 100 |
| 101 visitor->OnExternalExtensionFound( | 101 visitor->OnExternalExtensionFound( |
| 102 i->first, version.get(), i->second.second); | 102 i->first, version.get(), i->second.second, location_); |
| 103 } | 103 } |
| 104 } | 104 } |
| 105 | 105 |
| 106 virtual Version* RegisteredVersion(const std::string& id, | 106 virtual Version* RegisteredVersion(const std::string& id, |
| 107 Extension::Location* location) const { | 107 Extension::Location* location) const { |
| 108 DataMap::const_iterator it = extension_map_.find(id); | 108 DataMap::const_iterator it = extension_map_.find(id); |
| 109 if (it == extension_map_.end()) | 109 if (it == extension_map_.end()) |
| 110 return NULL; | 110 return NULL; |
| 111 | 111 |
| 112 if (location) | 112 if (location) |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 153 ids_found_ = 0; | 153 ids_found_ = 0; |
| 154 // Ask the provider to look up all extensions (and return the ones | 154 // Ask the provider to look up all extensions (and return the ones |
| 155 // found (that are not on the ignore list). | 155 // found (that are not on the ignore list). |
| 156 provider_->VisitRegisteredExtension(this, ignore_list); | 156 provider_->VisitRegisteredExtension(this, ignore_list); |
| 157 | 157 |
| 158 return ids_found_; | 158 return ids_found_; |
| 159 } | 159 } |
| 160 | 160 |
| 161 virtual void OnExternalExtensionFound(const std::string& id, | 161 virtual void OnExternalExtensionFound(const std::string& id, |
| 162 const Version* version, | 162 const Version* version, |
| 163 const FilePath& path) { | 163 const FilePath& path, |
| 164 Extension::Location unused) { |
| 164 ++ids_found_; | 165 ++ids_found_; |
| 165 DictionaryValue* pref; | 166 DictionaryValue* pref; |
| 166 // This tests is to make sure that the provider only notifies us of the | 167 // This tests is to make sure that the provider only notifies us of the |
| 167 // values we gave it. So if the id we doesn't exist in our internal | 168 // values we gave it. So if the id we doesn't exist in our internal |
| 168 // dictionary then something is wrong. | 169 // dictionary then something is wrong. |
| 169 EXPECT_TRUE(prefs_->GetDictionary(ASCIIToWide(id), &pref)) | 170 EXPECT_TRUE(prefs_->GetDictionary(ASCIIToWide(id), &pref)) |
| 170 << L"Got back ID (" << id.c_str() << ") we weren't expecting"; | 171 << L"Got back ID (" << id.c_str() << ") we weren't expecting"; |
| 171 | 172 |
| 172 if (pref) { | 173 if (pref) { |
| 173 // Ask provider if the extension we got back is registered. | 174 // Ask provider if the extension we got back is registered. |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 210 const FilePath& extensions_install_dir) { | 211 const FilePath& extensions_install_dir) { |
| 211 prefs_.reset(new PrefService(pref_file, NULL)); | 212 prefs_.reset(new PrefService(pref_file, NULL)); |
| 212 profile_.reset(new TestingProfile()); | 213 profile_.reset(new TestingProfile()); |
| 213 service_ = new ExtensionsService(profile_.get(), | 214 service_ = new ExtensionsService(profile_.get(), |
| 214 CommandLine::ForCurrentProcess(), | 215 CommandLine::ForCurrentProcess(), |
| 215 prefs_.get(), | 216 prefs_.get(), |
| 216 extensions_install_dir, | 217 extensions_install_dir, |
| 217 &loop_, | 218 &loop_, |
| 218 &loop_, | 219 &loop_, |
| 219 false); | 220 false); |
| 220 service_->SetExtensionsEnabled(true); | 221 service_->set_extensions_enabled(true); |
| 221 service_->set_show_extensions_prompts(false); | 222 service_->set_show_extensions_prompts(false); |
| 222 | 223 |
| 223 // When we start up, we want to make sure there is no external provider, | 224 // When we start up, we want to make sure there is no external provider, |
| 224 // since the ExtensionService on Windows will use the Registry as a default | 225 // since the ExtensionService on Windows will use the Registry as a default |
| 225 // provider and if there is something already registered there then it will | 226 // provider and if there is something already registered there then it will |
| 226 // interfere with the tests. Those tests that need an external provider | 227 // interfere with the tests. Those tests that need an external provider |
| 227 // will register one specifically. | 228 // will register one specifically. |
| 228 service_->ClearProvidersForTesting(); | 229 service_->ClearProvidersForTesting(); |
| 229 | 230 |
| 230 total_successes_ = 0; | 231 total_successes_ = 0; |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 301 case NotificationType::EXTENSION_INSTALLED: | 302 case NotificationType::EXTENSION_INSTALLED: |
| 302 case NotificationType::THEME_INSTALLED: | 303 case NotificationType::THEME_INSTALLED: |
| 303 installed_ = Details<Extension>(details).ptr(); | 304 installed_ = Details<Extension>(details).ptr(); |
| 304 break; | 305 break; |
| 305 | 306 |
| 306 default: | 307 default: |
| 307 DCHECK(false); | 308 DCHECK(false); |
| 308 } | 309 } |
| 309 } | 310 } |
| 310 | 311 |
| 311 void SetExtensionsEnabled(bool enabled) { | 312 void set_extensions_enabled(bool enabled) { |
| 312 service_->SetExtensionsEnabled(enabled); | 313 service_->set_extensions_enabled(enabled); |
| 313 } | 314 } |
| 314 | 315 |
| 315 void SetMockExternalProvider(Extension::Location location, | 316 void SetMockExternalProvider(Extension::Location location, |
| 316 ExternalExtensionProvider* provider) { | 317 ExternalExtensionProvider* provider) { |
| 317 service_->SetProviderForTesting(location, provider); | 318 service_->SetProviderForTesting(location, provider); |
| 318 } | 319 } |
| 319 | 320 |
| 320 protected: | 321 protected: |
| 321 // A class to record whether a ExtensionInstallCallback has fired, and | |
| 322 // to remember the args it was called with. | |
| 323 class CallbackRecorder { | |
| 324 public: | |
| 325 CallbackRecorder() : was_called_(false), path_(NULL), extension_(NULL) {} | |
| 326 | |
| 327 void CallbackFunc(const FilePath& path, Extension* extension) { | |
| 328 was_called_ = true; | |
| 329 path_.reset(new FilePath(path)); | |
| 330 extension_ = extension; | |
| 331 } | |
| 332 | |
| 333 bool was_called() { return was_called_; } | |
| 334 const FilePath* path() { return path_.get(); } | |
| 335 Extension* extension() { return extension_; } | |
| 336 | |
| 337 private: | |
| 338 bool was_called_; | |
| 339 scoped_ptr<FilePath> path_; | |
| 340 Extension* extension_; | |
| 341 }; | |
| 342 | |
| 343 void InstallExtension(const FilePath& path, | 322 void InstallExtension(const FilePath& path, |
| 344 bool should_succeed) { | 323 bool should_succeed) { |
| 345 ASSERT_TRUE(file_util::PathExists(path)); | 324 ASSERT_TRUE(file_util::PathExists(path)); |
| 346 service_->InstallExtension(path); | 325 service_->InstallExtension(path); |
| 347 loop_.RunAllPending(); | 326 loop_.RunAllPending(); |
| 348 std::vector<std::string> errors = GetErrors(); | 327 std::vector<std::string> errors = GetErrors(); |
| 349 if (should_succeed) { | 328 if (should_succeed) { |
| 350 ++total_successes_; | 329 ++total_successes_; |
| 351 | 330 |
| 352 EXPECT_TRUE(installed_) << path.value(); | 331 EXPECT_TRUE(installed_) << path.value(); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 366 EXPECT_EQ(0u, loaded_.size()) << path.value(); | 345 EXPECT_EQ(0u, loaded_.size()) << path.value(); |
| 367 EXPECT_EQ(1u, errors.size()) << path.value(); | 346 EXPECT_EQ(1u, errors.size()) << path.value(); |
| 368 } | 347 } |
| 369 | 348 |
| 370 installed_ = NULL; | 349 installed_ = NULL; |
| 371 loaded_.clear(); | 350 loaded_.clear(); |
| 372 ExtensionErrorReporter::GetInstance()->ClearErrors(); | 351 ExtensionErrorReporter::GetInstance()->ClearErrors(); |
| 373 } | 352 } |
| 374 | 353 |
| 375 void UpdateExtension(const std::string& id, const FilePath& path, | 354 void UpdateExtension(const std::string& id, const FilePath& path, |
| 376 bool should_succeed, bool use_callback, | 355 bool should_succeed, bool expect_report_on_failure) { |
| 377 bool expect_report_on_failure) { | |
| 378 ASSERT_TRUE(file_util::PathExists(path)); | 356 ASSERT_TRUE(file_util::PathExists(path)); |
| 379 | 357 |
| 380 CallbackRecorder callback_recorder; | 358 service_->UpdateExtension(id, path); |
| 381 ExtensionInstallCallback* callback = NULL; | |
| 382 if (use_callback) { | |
| 383 callback = NewCallback(&callback_recorder, | |
| 384 &CallbackRecorder::CallbackFunc); | |
| 385 } | |
| 386 | |
| 387 service_->UpdateExtension(id, path, false, callback); | |
| 388 loop_.RunAllPending(); | 359 loop_.RunAllPending(); |
| 389 std::vector<std::string> errors = GetErrors(); | 360 std::vector<std::string> errors = GetErrors(); |
| 390 | 361 |
| 391 if (use_callback) { | |
| 392 EXPECT_TRUE(callback_recorder.was_called()); | |
| 393 EXPECT_TRUE(path == *callback_recorder.path()); | |
| 394 } | |
| 395 | |
| 396 if (should_succeed) { | 362 if (should_succeed) { |
| 397 EXPECT_EQ(0u, errors.size()) << path.value(); | 363 EXPECT_EQ(0u, errors.size()) << path.value(); |
| 398 EXPECT_EQ(1u, service_->extensions()->size()); | 364 EXPECT_EQ(1u, service_->extensions()->size()); |
| 399 if (use_callback) { | |
| 400 EXPECT_EQ(service_->extensions()->at(0), callback_recorder.extension()); | |
| 401 } | |
| 402 } else { | 365 } else { |
| 403 if (expect_report_on_failure) { | 366 if (expect_report_on_failure) { |
| 404 EXPECT_EQ(1u, errors.size()) << path.value(); | 367 EXPECT_EQ(1u, errors.size()) << path.value(); |
| 405 } | 368 } |
| 406 if (use_callback) { | |
| 407 EXPECT_EQ(NULL, callback_recorder.extension()); | |
| 408 } | |
| 409 } | 369 } |
| 370 |
| 371 // Update() should delete the temporary input file. |
| 372 EXPECT_FALSE(file_util::PathExists(path)); |
| 410 } | 373 } |
| 411 | 374 |
| 412 void ValidatePrefKeyCount(size_t count) { | 375 void ValidatePrefKeyCount(size_t count) { |
| 413 DictionaryValue* dict = | 376 DictionaryValue* dict = |
| 414 prefs_->GetMutableDictionary(L"extensions.settings"); | 377 prefs_->GetMutableDictionary(L"extensions.settings"); |
| 415 ASSERT_TRUE(dict != NULL); | 378 ASSERT_TRUE(dict != NULL); |
| 416 EXPECT_EQ(count, dict->GetSize()); | 379 EXPECT_EQ(count, dict->GetSize()); |
| 417 } | 380 } |
| 418 | 381 |
| 419 void ValidatePref(const std::string& extension_id, | 382 void ValidatePref(const std::string& extension_id, |
| (...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 669 // crx files. If you need to change those crx files, feel free to repackage | 632 // crx files. If you need to change those crx files, feel free to repackage |
| 670 // them, throw away the key used and change the id's above. | 633 // them, throw away the key used and change the id's above. |
| 671 TEST_F(ExtensionsServiceTest, InstallExtension) { | 634 TEST_F(ExtensionsServiceTest, InstallExtension) { |
| 672 InitializeEmptyExtensionsService(); | 635 InitializeEmptyExtensionsService(); |
| 673 | 636 |
| 674 FilePath extensions_path; | 637 FilePath extensions_path; |
| 675 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &extensions_path)); | 638 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &extensions_path)); |
| 676 extensions_path = extensions_path.AppendASCII("extensions"); | 639 extensions_path = extensions_path.AppendASCII("extensions"); |
| 677 | 640 |
| 678 // Extensions not enabled. | 641 // Extensions not enabled. |
| 679 SetExtensionsEnabled(false); | 642 set_extensions_enabled(false); |
| 680 FilePath path = extensions_path.AppendASCII("good.crx"); | 643 FilePath path = extensions_path.AppendASCII("good.crx"); |
| 681 InstallExtension(path, false); | 644 InstallExtension(path, false); |
| 682 SetExtensionsEnabled(true); | 645 set_extensions_enabled(true); |
| 683 | 646 |
| 684 ValidatePrefKeyCount(0); | 647 ValidatePrefKeyCount(0); |
| 685 | 648 |
| 686 // A simple extension that should install without error. | 649 // A simple extension that should install without error. |
| 687 path = extensions_path.AppendASCII("good.crx"); | 650 path = extensions_path.AppendASCII("good.crx"); |
| 688 InstallExtension(path, true); | 651 InstallExtension(path, true); |
| 689 // TODO(erikkay): verify the contents of the installed extension. | 652 // TODO(erikkay): verify the contents of the installed extension. |
| 690 | 653 |
| 691 int pref_count = 0; | 654 int pref_count = 0; |
| 692 ValidatePrefKeyCount(++pref_count); | 655 ValidatePrefKeyCount(++pref_count); |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 794 // A theme. | 757 // A theme. |
| 795 FilePath path = extensions_path.AppendASCII("theme.crx"); | 758 FilePath path = extensions_path.AppendASCII("theme.crx"); |
| 796 InstallExtension(path, true); | 759 InstallExtension(path, true); |
| 797 int pref_count = 0; | 760 int pref_count = 0; |
| 798 ValidatePrefKeyCount(++pref_count); | 761 ValidatePrefKeyCount(++pref_count); |
| 799 ValidatePref(theme_crx, L"state", Extension::ENABLED); | 762 ValidatePref(theme_crx, L"state", Extension::ENABLED); |
| 800 ValidatePref(theme_crx, L"location", Extension::INTERNAL); | 763 ValidatePref(theme_crx, L"location", Extension::INTERNAL); |
| 801 | 764 |
| 802 // A theme when extensions are disabled. Themes can be installed, even when | 765 // A theme when extensions are disabled. Themes can be installed, even when |
| 803 // extensions are disabled. | 766 // extensions are disabled. |
| 804 SetExtensionsEnabled(false); | 767 set_extensions_enabled(false); |
| 805 path = extensions_path.AppendASCII("theme2.crx"); | 768 path = extensions_path.AppendASCII("theme2.crx"); |
| 806 InstallExtension(path, true); | 769 InstallExtension(path, true); |
| 807 ValidatePrefKeyCount(++pref_count); | 770 ValidatePrefKeyCount(++pref_count); |
| 808 ValidatePref(theme2_crx, L"state", Extension::ENABLED); | 771 ValidatePref(theme2_crx, L"state", Extension::ENABLED); |
| 809 ValidatePref(theme2_crx, L"location", Extension::INTERNAL); | 772 ValidatePref(theme2_crx, L"location", Extension::INTERNAL); |
| 810 | 773 |
| 811 // A theme with extension elements. Themes cannot have extension elements so | 774 // A theme with extension elements. Themes cannot have extension elements so |
| 812 // this test should fail. | 775 // this test should fail. |
| 813 SetExtensionsEnabled(true); | 776 set_extensions_enabled(true); |
| 814 path = extensions_path.AppendASCII("theme_with_extension.crx"); | 777 path = extensions_path.AppendASCII("theme_with_extension.crx"); |
| 815 InstallExtension(path, false); | 778 InstallExtension(path, false); |
| 816 ValidatePrefKeyCount(pref_count); | 779 ValidatePrefKeyCount(pref_count); |
| 817 | 780 |
| 818 // A theme with image resources missing (misspelt path). | 781 // A theme with image resources missing (misspelt path). |
| 819 path = extensions_path.AppendASCII("theme_missing_image.crx"); | 782 path = extensions_path.AppendASCII("theme_missing_image.crx"); |
| 820 InstallExtension(path, false); | 783 InstallExtension(path, false); |
| 821 ValidatePrefKeyCount(pref_count); | 784 ValidatePrefKeyCount(pref_count); |
| 822 } | 785 } |
| 823 | 786 |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 918 extensions_path = extensions_path.AppendASCII("extensions"); | 881 extensions_path = extensions_path.AppendASCII("extensions"); |
| 919 | 882 |
| 920 FilePath path = extensions_path.AppendASCII("good.crx"); | 883 FilePath path = extensions_path.AppendASCII("good.crx"); |
| 921 | 884 |
| 922 InstallExtension(path, true); | 885 InstallExtension(path, true); |
| 923 Extension* good = service_->extensions()->at(0); | 886 Extension* good = service_->extensions()->at(0); |
| 924 ASSERT_EQ("1.0.0.0", good->VersionString()); | 887 ASSERT_EQ("1.0.0.0", good->VersionString()); |
| 925 ASSERT_EQ(good_crx, good->id()); | 888 ASSERT_EQ(good_crx, good->id()); |
| 926 | 889 |
| 927 path = extensions_path.AppendASCII("good2.crx"); | 890 path = extensions_path.AppendASCII("good2.crx"); |
| 928 UpdateExtension(good_crx, path, true, true, true); | 891 UpdateExtension(good_crx, path, true, true); |
| 929 ASSERT_EQ("1.0.0.1", loaded_[0]->version()->GetString()); | 892 ASSERT_EQ("1.0.0.1", loaded_[0]->version()->GetString()); |
| 930 } | 893 } |
| 931 | 894 |
| 932 // Test doing an update without passing a completion callback | |
| 933 TEST_F(ExtensionsServiceTest, UpdateWithoutCallback) { | |
| 934 InitializeEmptyExtensionsService(); | |
| 935 FilePath extensions_path; | |
| 936 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &extensions_path)); | |
| 937 extensions_path = extensions_path.AppendASCII("extensions"); | |
| 938 | |
| 939 FilePath path = extensions_path.AppendASCII("good.crx"); | |
| 940 | |
| 941 InstallExtension(path, true); | |
| 942 Extension* good = service_->extensions()->at(0); | |
| 943 ASSERT_EQ("1.0.0.0", good->VersionString()); | |
| 944 ASSERT_EQ(good_crx, good->id()); | |
| 945 | |
| 946 path = extensions_path.AppendASCII("good2.crx"); | |
| 947 UpdateExtension(good_crx, path, true, false, true); | |
| 948 ASSERT_EQ("1.0.0.1", loaded_[0]->version()->GetString()); | |
| 949 } | |
| 950 | |
| 951 // Test updating a not-already-installed extension - this should fail | 895 // Test updating a not-already-installed extension - this should fail |
| 952 TEST_F(ExtensionsServiceTest, UpdateNotInstalledExtension) { | 896 TEST_F(ExtensionsServiceTest, UpdateNotInstalledExtension) { |
| 953 InitializeEmptyExtensionsService(); | 897 InitializeEmptyExtensionsService(); |
| 954 FilePath extensions_path; | 898 FilePath extensions_path; |
| 955 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &extensions_path)); | 899 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &extensions_path)); |
| 956 extensions_path = extensions_path.AppendASCII("extensions"); | 900 extensions_path = extensions_path.AppendASCII("extensions"); |
| 957 | 901 |
| 958 FilePath path = extensions_path.AppendASCII("good.crx"); | 902 FilePath path = extensions_path.AppendASCII("good.crx"); |
| 959 service_->UpdateExtension(good_crx, path, false, NULL); | 903 service_->UpdateExtension(good_crx, path); |
| 960 loop_.RunAllPending(); | 904 loop_.RunAllPending(); |
| 961 | 905 |
| 962 ASSERT_EQ(0u, service_->extensions()->size()); | 906 ASSERT_EQ(0u, service_->extensions()->size()); |
| 963 ASSERT_FALSE(installed_); | 907 ASSERT_FALSE(installed_); |
| 964 ASSERT_EQ(0u, loaded_.size()); | 908 ASSERT_EQ(0u, loaded_.size()); |
| 965 } | 909 } |
| 966 | 910 |
| 967 // Makes sure you can't downgrade an extension via UpdateExtension | 911 // Makes sure you can't downgrade an extension via UpdateExtension |
| 968 TEST_F(ExtensionsServiceTest, UpdateWillNotDowngrade) { | 912 TEST_F(ExtensionsServiceTest, UpdateWillNotDowngrade) { |
| 969 InitializeEmptyExtensionsService(); | 913 InitializeEmptyExtensionsService(); |
| 970 FilePath extensions_path; | 914 FilePath extensions_path; |
| 971 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &extensions_path)); | 915 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &extensions_path)); |
| 972 extensions_path = extensions_path.AppendASCII("extensions"); | 916 extensions_path = extensions_path.AppendASCII("extensions"); |
| 973 | 917 |
| 974 FilePath path = extensions_path.AppendASCII("good2.crx"); | 918 FilePath path = extensions_path.AppendASCII("good2.crx"); |
| 975 | 919 |
| 976 InstallExtension(path, true); | 920 InstallExtension(path, true); |
| 977 Extension* good = service_->extensions()->at(0); | 921 Extension* good = service_->extensions()->at(0); |
| 978 ASSERT_EQ("1.0.0.1", good->VersionString()); | 922 ASSERT_EQ("1.0.0.1", good->VersionString()); |
| 979 ASSERT_EQ(good_crx, good->id()); | 923 ASSERT_EQ(good_crx, good->id()); |
| 980 | 924 |
| 981 // Change path from good2.crx -> good.crx | 925 // Change path from good2.crx -> good.crx |
| 982 path = extensions_path.AppendASCII("good.crx"); | 926 path = extensions_path.AppendASCII("good.crx"); |
| 983 UpdateExtension(good_crx, path, false, true, true); | 927 UpdateExtension(good_crx, path, false, true); |
| 984 ASSERT_EQ("1.0.0.1", service_->extensions()->at(0)->VersionString()); | 928 ASSERT_EQ("1.0.0.1", service_->extensions()->at(0)->VersionString()); |
| 985 } | 929 } |
| 986 | 930 |
| 987 // Make sure calling update with an identical version does nothing | 931 // Make sure calling update with an identical version does nothing |
| 988 TEST_F(ExtensionsServiceTest, UpdateToSameVersionIsNoop) { | 932 TEST_F(ExtensionsServiceTest, UpdateToSameVersionIsNoop) { |
| 989 InitializeEmptyExtensionsService(); | 933 InitializeEmptyExtensionsService(); |
| 990 FilePath extensions_path; | 934 FilePath extensions_path; |
| 991 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &extensions_path)); | 935 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &extensions_path)); |
| 992 extensions_path = extensions_path.AppendASCII("extensions"); | 936 extensions_path = extensions_path.AppendASCII("extensions"); |
| 993 | 937 |
| 994 FilePath path = extensions_path.AppendASCII("good.crx"); | 938 FilePath path = extensions_path.AppendASCII("good.crx"); |
| 995 | 939 |
| 996 InstallExtension(path, true); | 940 InstallExtension(path, true); |
| 997 Extension* good = service_->extensions()->at(0); | 941 Extension* good = service_->extensions()->at(0); |
| 998 ASSERT_EQ(good_crx, good->id()); | 942 ASSERT_EQ(good_crx, good->id()); |
| 999 UpdateExtension(good_crx, path, false, true, false); | 943 UpdateExtension(good_crx, path, false, false); |
| 1000 } | 944 } |
| 1001 | 945 |
| 1002 // Tests uninstalling normal extensions | 946 // Tests uninstalling normal extensions |
| 1003 TEST_F(ExtensionsServiceTest, UninstallExtension) { | 947 TEST_F(ExtensionsServiceTest, UninstallExtension) { |
| 1004 InitializeEmptyExtensionsService(); | 948 InitializeEmptyExtensionsService(); |
| 1005 FilePath extensions_path; | 949 FilePath extensions_path; |
| 1006 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &extensions_path)); | 950 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &extensions_path)); |
| 1007 extensions_path = extensions_path.AppendASCII("extensions"); | 951 extensions_path = extensions_path.AppendASCII("extensions"); |
| 1008 | 952 |
| 1009 // A simple extension that should install without error. | 953 // A simple extension that should install without error. |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1128 // --load-extension doesn't add entries to prefs | 1072 // --load-extension doesn't add entries to prefs |
| 1129 ValidatePrefKeyCount(0); | 1073 ValidatePrefKeyCount(0); |
| 1130 } | 1074 } |
| 1131 | 1075 |
| 1132 // Tests the external installation feature | 1076 // Tests the external installation feature |
| 1133 #if defined(OS_WIN) | 1077 #if defined(OS_WIN) |
| 1134 | 1078 |
| 1135 TEST_F(ExtensionsServiceTest, ExternalInstallRegistry) { | 1079 TEST_F(ExtensionsServiceTest, ExternalInstallRegistry) { |
| 1136 // This should all work, even when normal extension installation is disabled. | 1080 // This should all work, even when normal extension installation is disabled. |
| 1137 InitializeEmptyExtensionsService(); | 1081 InitializeEmptyExtensionsService(); |
| 1138 SetExtensionsEnabled(false); | 1082 set_extensions_enabled(false); |
| 1139 // Verify that starting with no providers loads no extensions. | 1083 // Verify that starting with no providers loads no extensions. |
| 1140 service_->Init(); | 1084 service_->Init(); |
| 1141 loop_.RunAllPending(); | 1085 loop_.RunAllPending(); |
| 1142 ASSERT_EQ(0u, loaded_.size()); | 1086 ASSERT_EQ(0u, loaded_.size()); |
| 1143 | 1087 |
| 1144 // Now add providers. Extension system takes ownership of the objects. | 1088 // Now add providers. Extension system takes ownership of the objects. |
| 1145 MockExtensionProvider* reg_provider = | 1089 MockExtensionProvider* reg_provider = |
| 1146 new MockExtensionProvider(Extension::EXTERNAL_REGISTRY); | 1090 new MockExtensionProvider(Extension::EXTERNAL_REGISTRY); |
| 1147 SetMockExternalProvider(Extension::EXTERNAL_REGISTRY, reg_provider); | 1091 SetMockExternalProvider(Extension::EXTERNAL_REGISTRY, reg_provider); |
| 1148 | 1092 |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1333 service_->LoadAllExtensions(); | 1277 service_->LoadAllExtensions(); |
| 1334 loop_.RunAllPending(); | 1278 loop_.RunAllPending(); |
| 1335 ASSERT_EQ(0u, loaded_.size()); | 1279 ASSERT_EQ(0u, loaded_.size()); |
| 1336 ValidatePrefKeyCount(0); | 1280 ValidatePrefKeyCount(0); |
| 1337 | 1281 |
| 1338 // The extension should also be gone from the install directory. | 1282 // The extension should also be gone from the install directory. |
| 1339 ASSERT_FALSE(file_util::PathExists(install_path)); | 1283 ASSERT_FALSE(file_util::PathExists(install_path)); |
| 1340 | 1284 |
| 1341 // It should still work if extensions are disabled (disableness doesn't | 1285 // It should still work if extensions are disabled (disableness doesn't |
| 1342 // apply to externally registered extensions). | 1286 // apply to externally registered extensions). |
| 1343 SetExtensionsEnabled(false); | 1287 set_extensions_enabled(false); |
| 1344 | 1288 |
| 1345 pref_provider->UpdateOrAddExtension(good_crx, "1.0", source_path); | 1289 pref_provider->UpdateOrAddExtension(good_crx, "1.0", source_path); |
| 1346 service_->CheckForExternalUpdates(); | 1290 service_->CheckForExternalUpdates(); |
| 1347 loop_.RunAllPending(); | 1291 loop_.RunAllPending(); |
| 1348 | 1292 |
| 1349 ASSERT_EQ(1u, loaded_.size()); | 1293 ASSERT_EQ(1u, loaded_.size()); |
| 1350 ASSERT_EQ(0u, GetErrors().size()); | 1294 ASSERT_EQ(0u, GetErrors().size()); |
| 1351 } | 1295 } |
| 1352 | 1296 |
| 1353 TEST_F(ExtensionsServiceTest, ExternalPrefProvider) { | 1297 TEST_F(ExtensionsServiceTest, ExternalPrefProvider) { |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1470 | 1414 |
| 1471 recorder.set_ready(false); | 1415 recorder.set_ready(false); |
| 1472 command_line.reset(new CommandLine(L"")); | 1416 command_line.reset(new CommandLine(L"")); |
| 1473 service = new ExtensionsService(&profile, command_line.get(), | 1417 service = new ExtensionsService(&profile, command_line.get(), |
| 1474 profile.GetPrefs(), install_dir, &loop, &loop, false); | 1418 profile.GetPrefs(), install_dir, &loop, &loop, false); |
| 1475 EXPECT_TRUE(service->extensions_enabled()); | 1419 EXPECT_TRUE(service->extensions_enabled()); |
| 1476 service->Init(); | 1420 service->Init(); |
| 1477 loop.RunAllPending(); | 1421 loop.RunAllPending(); |
| 1478 EXPECT_TRUE(recorder.ready()); | 1422 EXPECT_TRUE(recorder.ready()); |
| 1479 } | 1423 } |
| OLD | NEW |