OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 "base/message_loop.h" | 5 #include "base/message_loop.h" |
6 #include "base/path_service.h" | 6 #include "base/path_service.h" |
7 #include "base/scoped_temp_dir.h" | 7 #include "base/scoped_temp_dir.h" |
8 #include "base/stl_util-inl.h" | 8 #include "base/stl_util-inl.h" |
9 #include "base/string_number_conversions.h" | 9 #include "base/string_number_conversions.h" |
10 #include "base/stringprintf.h" | 10 #include "base/stringprintf.h" |
11 #include "chrome/browser/browser_thread.h" | 11 #include "chrome/browser/browser_thread.h" |
12 #include "chrome/browser/extensions/extension_prefs.h" | 12 #include "chrome/browser/extensions/extension_prefs.h" |
13 #include "chrome/browser/extensions/test_extension_prefs.h" | 13 #include "chrome/browser/extensions/test_extension_prefs.h" |
| 14 #include "chrome/browser/prefs/pref_change_registrar.h" |
14 #include "chrome/browser/prefs/pref_service.h" | 15 #include "chrome/browser/prefs/pref_service.h" |
15 #include "chrome/common/chrome_paths.h" | 16 #include "chrome/common/chrome_paths.h" |
16 #include "chrome/common/extensions/extension_constants.h" | 17 #include "chrome/common/extensions/extension_constants.h" |
| 18 #include "chrome/common/notification_details.h" |
| 19 #include "chrome/common/notification_observer_mock.h" |
| 20 #include "chrome/common/notification_source.h" |
17 #include "testing/gtest/include/gtest/gtest.h" | 21 #include "testing/gtest/include/gtest/gtest.h" |
18 | 22 |
19 using base::Time; | 23 using base::Time; |
20 using base::TimeDelta; | 24 using base::TimeDelta; |
21 | 25 |
| 26 const char kPref1[] = "path1.subpath"; |
| 27 const char kPref2[] = "path2"; |
| 28 const char kPref3[] = "path3"; |
| 29 const char kPref4[] = "path4"; |
| 30 |
| 31 // Default values in case an extension pref value is not overridden. |
| 32 const char kDefaultPref1[] = "default pref 1"; |
| 33 const char kDefaultPref2[] = "default pref 2"; |
| 34 const char kDefaultPref3[] = "default pref 3"; |
| 35 const char kDefaultPref4[] = "default pref 4"; |
| 36 |
22 static void AddPattern(ExtensionExtent* extent, const std::string& pattern) { | 37 static void AddPattern(ExtensionExtent* extent, const std::string& pattern) { |
23 int schemes = URLPattern::SCHEME_ALL; | 38 int schemes = URLPattern::SCHEME_ALL; |
24 extent->AddPattern(URLPattern(schemes, pattern)); | 39 extent->AddPattern(URLPattern(schemes, pattern)); |
25 } | 40 } |
26 | 41 |
27 static void AssertEqualExtents(ExtensionExtent* extent1, | 42 static void AssertEqualExtents(ExtensionExtent* extent1, |
28 ExtensionExtent* extent2) { | 43 ExtensionExtent* extent2) { |
29 std::vector<URLPattern> patterns1 = extent1->patterns(); | 44 std::vector<URLPattern> patterns1 = extent1->patterns(); |
30 std::vector<URLPattern> patterns2 = extent2->patterns(); | 45 std::vector<URLPattern> patterns2 = extent2->patterns(); |
31 std::set<std::string> strings1; | 46 std::set<std::string> strings1; |
(...skipping 16 matching lines...) Expand all Loading... |
48 | 63 |
49 // This function will get called once, and is the right place to do operations | 64 // This function will get called once, and is the right place to do operations |
50 // on ExtensionPrefs that write data. | 65 // on ExtensionPrefs that write data. |
51 virtual void Initialize() = 0; | 66 virtual void Initialize() = 0; |
52 | 67 |
53 // This function will be called twice - once while the original ExtensionPrefs | 68 // This function will be called twice - once while the original ExtensionPrefs |
54 // object is still alive, and once after recreation. Thus, it tests that | 69 // object is still alive, and once after recreation. Thus, it tests that |
55 // things don't break after any ExtensionPrefs startup work. | 70 // things don't break after any ExtensionPrefs startup work. |
56 virtual void Verify() = 0; | 71 virtual void Verify() = 0; |
57 | 72 |
| 73 // This function is called to Register preference default values. |
| 74 virtual void RegisterPreferences() {} |
| 75 |
58 virtual void SetUp() { | 76 virtual void SetUp() { |
| 77 RegisterPreferences(); |
59 Initialize(); | 78 Initialize(); |
60 } | 79 } |
61 | 80 |
62 virtual void TearDown() { | 81 virtual void TearDown() { |
63 Verify(); | 82 Verify(); |
64 | 83 |
65 // Reset ExtensionPrefs, and re-verify. | 84 // Reset ExtensionPrefs, and re-verify. |
66 prefs_.RecreateExtensionPrefs(); | 85 prefs_.RecreateExtensionPrefs(); |
| 86 RegisterPreferences(); |
67 Verify(); | 87 Verify(); |
68 } | 88 } |
69 | 89 |
70 protected: | 90 protected: |
71 ExtensionPrefs* prefs() { return prefs_.prefs(); } | 91 ExtensionPrefs* prefs() { return prefs_.prefs(); } |
72 | 92 |
73 TestExtensionPrefs prefs_; | 93 TestExtensionPrefs prefs_; |
74 | 94 |
75 private: | 95 private: |
76 DISALLOW_COPY_AND_ASSIGN(ExtensionPrefsTest); | 96 DISALLOW_COPY_AND_ASSIGN(ExtensionPrefsTest); |
(...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
518 EXPECT_EQ(launch_index + 1, new_launch_index); | 538 EXPECT_EQ(launch_index + 1, new_launch_index); |
519 | 539 |
520 // This extension doesn't exist, so it should return -1. | 540 // This extension doesn't exist, so it should return -1. |
521 EXPECT_EQ(-1, prefs()->GetAppLaunchIndex("foo")); | 541 EXPECT_EQ(-1, prefs()->GetAppLaunchIndex("foo")); |
522 } | 542 } |
523 | 543 |
524 private: | 544 private: |
525 scoped_refptr<Extension> extension_; | 545 scoped_refptr<Extension> extension_; |
526 }; | 546 }; |
527 TEST_F(ExtensionPrefsAppLaunchIndex, ExtensionPrefsAppLaunchIndex) {} | 547 TEST_F(ExtensionPrefsAppLaunchIndex, ExtensionPrefsAppLaunchIndex) {} |
| 548 |
| 549 namespace keys = extension_manifest_keys; |
| 550 |
| 551 class ExtensionPrefsPreferencesBase : public ExtensionPrefsTest { |
| 552 public: |
| 553 ExtensionPrefsPreferencesBase() |
| 554 : ExtensionPrefsTest(), |
| 555 ext1_(NULL), |
| 556 ext2_(NULL), |
| 557 ext3_(NULL), |
| 558 installed() { |
| 559 DictionaryValue simple_dict; |
| 560 std::string error; |
| 561 |
| 562 simple_dict.SetString(keys::kVersion, "1.0.0.0"); |
| 563 simple_dict.SetString(keys::kName, "unused"); |
| 564 |
| 565 ext1_scoped_ = Extension::Create( |
| 566 prefs_.temp_dir().AppendASCII("ext1_"), Extension::INVALID, |
| 567 simple_dict, false, &error); |
| 568 ext2_scoped_ = Extension::Create( |
| 569 prefs_.temp_dir().AppendASCII("ext2_"), Extension::INVALID, |
| 570 simple_dict, false, &error); |
| 571 ext3_scoped_ = Extension::Create( |
| 572 prefs_.temp_dir().AppendASCII("ext3_"), Extension::INVALID, |
| 573 simple_dict, false, &error); |
| 574 |
| 575 ext1_ = ext1_scoped_.get(); |
| 576 ext2_ = ext2_scoped_.get(); |
| 577 ext3_ = ext3_scoped_.get(); |
| 578 |
| 579 for (size_t i = 0; i < arraysize(installed); ++i) |
| 580 installed[i] = false; |
| 581 } |
| 582 |
| 583 void RegisterPreferences() { |
| 584 prefs()->pref_service()->RegisterStringPref(kPref1, kDefaultPref1); |
| 585 prefs()->pref_service()->RegisterStringPref(kPref2, kDefaultPref2); |
| 586 prefs()->pref_service()->RegisterStringPref(kPref3, kDefaultPref3); |
| 587 prefs()->pref_service()->RegisterStringPref(kPref4, kDefaultPref4); |
| 588 } |
| 589 |
| 590 void InstallExtControlledPref(Extension *ext, |
| 591 const std::string& key, |
| 592 Value* val) { |
| 593 // Install extension the first time a preference is set for it. |
| 594 Extension* extensions[] = {ext1_, ext2_, ext3_}; |
| 595 for (int i = 0; i < 3; ++i) { |
| 596 if (ext == extensions[i] && !installed[i]) { |
| 597 prefs()->OnExtensionInstalled(ext, Extension::ENABLED, true); |
| 598 installed[i] = true; |
| 599 break; |
| 600 } |
| 601 } |
| 602 |
| 603 prefs()->SetExtensionControlledPref(ext->id(), key, val); |
| 604 } |
| 605 |
| 606 void UninstallExtension(const std::string& extension_id) { |
| 607 prefs()->OnExtensionUninstalled(extension_id, Extension::INTERNAL, false); |
| 608 } |
| 609 |
| 610 // Weak references, for convenience. |
| 611 Extension* ext1_; |
| 612 Extension* ext2_; |
| 613 Extension* ext3_; |
| 614 |
| 615 // Flags indicating whether each of the extensions has been installed, yet. |
| 616 bool installed[3]; |
| 617 |
| 618 private: |
| 619 scoped_refptr<Extension> ext1_scoped_; |
| 620 scoped_refptr<Extension> ext2_scoped_; |
| 621 scoped_refptr<Extension> ext3_scoped_; |
| 622 }; |
| 623 |
| 624 class ExtensionPrefsInstallOneExtension |
| 625 : public ExtensionPrefsPreferencesBase { |
| 626 virtual void Initialize() { |
| 627 InstallExtControlledPref(ext1_, kPref1, Value::CreateStringValue("val1")); |
| 628 } |
| 629 virtual void Verify() { |
| 630 std::string actual = prefs()->pref_service()->GetString(kPref1); |
| 631 EXPECT_EQ("val1", actual); |
| 632 } |
| 633 }; |
| 634 TEST_F(ExtensionPrefsInstallOneExtension, ExtensionPrefsInstallOneExtension) {} |
| 635 |
| 636 // Make sure the last-installed extension wins for each preference. |
| 637 class ExtensionPrefsInstallOverwrittenExtensions |
| 638 : public ExtensionPrefsPreferencesBase { |
| 639 virtual void Initialize() { |
| 640 InstallExtControlledPref(ext1_, kPref1, Value::CreateStringValue("val1")); |
| 641 InstallExtControlledPref(ext2_, kPref1, Value::CreateStringValue("val2")); |
| 642 InstallExtControlledPref(ext3_, kPref1, Value::CreateStringValue("val3")); |
| 643 |
| 644 InstallExtControlledPref(ext1_, kPref2, Value::CreateStringValue("val4")); |
| 645 InstallExtControlledPref(ext2_, kPref2, Value::CreateStringValue("val5")); |
| 646 |
| 647 InstallExtControlledPref(ext1_, kPref1, Value::CreateStringValue("val6")); |
| 648 InstallExtControlledPref(ext1_, kPref2, Value::CreateStringValue("val7")); |
| 649 InstallExtControlledPref(ext1_, kPref3, Value::CreateStringValue("val8")); |
| 650 } |
| 651 virtual void Verify() { |
| 652 std::string actual; |
| 653 actual = prefs()->pref_service()->GetString(kPref1); |
| 654 EXPECT_EQ("val3", actual); |
| 655 actual = prefs()->pref_service()->GetString(kPref2); |
| 656 EXPECT_EQ("val5", actual); |
| 657 actual = prefs()->pref_service()->GetString(kPref3); |
| 658 EXPECT_EQ("val8", actual); |
| 659 } |
| 660 }; |
| 661 TEST_F(ExtensionPrefsInstallOverwrittenExtensions, |
| 662 ExtensionPrefsInstallOverwrittenExtensions) {} |
| 663 |
| 664 // Make sure the last-installed extension wins even if other extensions set |
| 665 // the same or different preferences later. |
| 666 class ExtensionPrefsInstallInterleavedExtensions |
| 667 : public ExtensionPrefsPreferencesBase { |
| 668 virtual void Initialize() { |
| 669 InstallExtControlledPref(ext1_, kPref1, Value::CreateStringValue("val1")); |
| 670 InstallExtControlledPref(ext2_, kPref2, Value::CreateStringValue("val2")); |
| 671 InstallExtControlledPref(ext3_, kPref3, Value::CreateStringValue("val3")); |
| 672 |
| 673 InstallExtControlledPref(ext3_, kPref3, Value::CreateStringValue("val4")); |
| 674 InstallExtControlledPref(ext2_, kPref3, Value::CreateStringValue("val5")); |
| 675 InstallExtControlledPref(ext1_, kPref3, Value::CreateStringValue("val6")); |
| 676 |
| 677 InstallExtControlledPref(ext3_, kPref1, Value::CreateStringValue("val7")); |
| 678 } |
| 679 virtual void Verify() { |
| 680 std::string actual; |
| 681 actual = prefs()->pref_service()->GetString(kPref1); |
| 682 EXPECT_EQ("val7", actual); |
| 683 actual = prefs()->pref_service()->GetString(kPref2); |
| 684 EXPECT_EQ("val2", actual); |
| 685 actual = prefs()->pref_service()->GetString(kPref3); |
| 686 EXPECT_EQ("val4", actual); |
| 687 } |
| 688 }; |
| 689 TEST_F(ExtensionPrefsInstallInterleavedExtensions, |
| 690 ExtensionPrefsInstallInterleavedExtensions) {} |
| 691 |
| 692 class ExtensionPrefsUninstallOnlyExtension |
| 693 : public ExtensionPrefsPreferencesBase { |
| 694 virtual void Initialize() { |
| 695 InstallExtControlledPref(ext1_, kPref1, Value::CreateStringValue("val1")); |
| 696 InstallExtControlledPref(ext1_, kPref2, Value::CreateStringValue("val2")); |
| 697 |
| 698 UninstallExtension(ext1_->id()); |
| 699 } |
| 700 virtual void Verify() { |
| 701 std::string actual; |
| 702 actual = prefs()->pref_service()->GetString(kPref1); |
| 703 EXPECT_EQ(kDefaultPref1, actual); |
| 704 actual = prefs()->pref_service()->GetString(kPref2); |
| 705 EXPECT_EQ(kDefaultPref2, actual); |
| 706 } |
| 707 }; |
| 708 TEST_F(ExtensionPrefsUninstallOnlyExtension, |
| 709 ExtensionPrefsUninstallOnlyExtension) {} |
| 710 |
| 711 // Tests uninstalling an extension that wasn't winning for any preferences. |
| 712 class ExtensionPrefsUninstallIrrelevantExtension |
| 713 : public ExtensionPrefsPreferencesBase { |
| 714 virtual void Initialize() { |
| 715 InstallExtControlledPref(ext1_, kPref1, Value::CreateStringValue("val1")); |
| 716 InstallExtControlledPref(ext2_, kPref1, Value::CreateStringValue("val2")); |
| 717 |
| 718 InstallExtControlledPref(ext1_, kPref2, Value::CreateStringValue("val3")); |
| 719 InstallExtControlledPref(ext2_, kPref2, Value::CreateStringValue("val4")); |
| 720 |
| 721 UninstallExtension(ext1_->id()); |
| 722 } |
| 723 virtual void Verify() { |
| 724 std::string actual; |
| 725 actual = prefs()->pref_service()->GetString(kPref1); |
| 726 EXPECT_EQ("val2", actual); |
| 727 actual = prefs()->pref_service()->GetString(kPref2); |
| 728 EXPECT_EQ("val4", actual); |
| 729 } |
| 730 }; |
| 731 TEST_F(ExtensionPrefsUninstallIrrelevantExtension, |
| 732 ExtensionPrefsUninstallIrrelevantExtension) {} |
| 733 |
| 734 // Tests uninstalling an extension that was winning for all preferences. |
| 735 class ExtensionPrefsUninstallExtensionFromTop |
| 736 : public ExtensionPrefsPreferencesBase { |
| 737 virtual void Initialize() { |
| 738 InstallExtControlledPref(ext1_, kPref1, Value::CreateStringValue("val1")); |
| 739 InstallExtControlledPref(ext2_, kPref1, Value::CreateStringValue("val2")); |
| 740 InstallExtControlledPref(ext3_, kPref1, Value::CreateStringValue("val3")); |
| 741 |
| 742 InstallExtControlledPref(ext1_, kPref2, Value::CreateStringValue("val4")); |
| 743 InstallExtControlledPref(ext3_, kPref2, Value::CreateStringValue("val5")); |
| 744 |
| 745 UninstallExtension(ext3_->id()); |
| 746 } |
| 747 virtual void Verify() { |
| 748 std::string actual; |
| 749 actual = prefs()->pref_service()->GetString(kPref1); |
| 750 EXPECT_EQ("val2", actual); |
| 751 actual = prefs()->pref_service()->GetString(kPref2); |
| 752 EXPECT_EQ("val4", actual); |
| 753 } |
| 754 }; |
| 755 TEST_F(ExtensionPrefsUninstallExtensionFromTop, |
| 756 ExtensionPrefsUninstallExtensionFromTop) {} |
| 757 |
| 758 // Tests uninstalling an extension that was winning for only some preferences. |
| 759 class ExtensionPrefsUninstallExtensionFromMiddle |
| 760 : public ExtensionPrefsPreferencesBase { |
| 761 virtual void Initialize() { |
| 762 InstallExtControlledPref(ext1_, kPref1, Value::CreateStringValue("val1")); |
| 763 InstallExtControlledPref(ext2_, kPref1, Value::CreateStringValue("val2")); |
| 764 InstallExtControlledPref(ext3_, kPref1, Value::CreateStringValue("val3")); |
| 765 |
| 766 InstallExtControlledPref(ext1_, kPref2, Value::CreateStringValue("val4")); |
| 767 InstallExtControlledPref(ext2_, kPref2, Value::CreateStringValue("val5")); |
| 768 |
| 769 InstallExtControlledPref(ext1_, kPref3, Value::CreateStringValue("val6")); |
| 770 |
| 771 InstallExtControlledPref(ext2_, kPref4, Value::CreateStringValue("val7")); |
| 772 |
| 773 UninstallExtension(ext2_->id()); |
| 774 } |
| 775 virtual void Verify() { |
| 776 std::string actual; |
| 777 actual = prefs()->pref_service()->GetString(kPref1); |
| 778 EXPECT_EQ("val3", actual); |
| 779 actual = prefs()->pref_service()->GetString(kPref2); |
| 780 EXPECT_EQ("val4", actual); |
| 781 actual = prefs()->pref_service()->GetString(kPref3); |
| 782 EXPECT_EQ("val6", actual); |
| 783 actual = prefs()->pref_service()->GetString(kPref4); |
| 784 EXPECT_EQ(kDefaultPref4, actual); |
| 785 } |
| 786 }; |
| 787 TEST_F(ExtensionPrefsUninstallExtensionFromMiddle, |
| 788 ExtensionPrefsUninstallExtensionFromMiddle) {} |
| 789 |
| 790 // Tests triggering of notifications to registered observers |
| 791 class ExtensionPrefsNotifyWhenNeeded |
| 792 : public ExtensionPrefsPreferencesBase { |
| 793 virtual void Initialize() { |
| 794 using testing::_; |
| 795 using testing::Mock; |
| 796 using testing::StrEq; |
| 797 |
| 798 scoped_ptr<NotificationObserverMock> observer( |
| 799 new NotificationObserverMock()); |
| 800 PrefChangeRegistrar registrar; |
| 801 registrar.Init(prefs()->pref_service()); |
| 802 registrar.Add(kPref1, observer.get()); |
| 803 |
| 804 EXPECT_CALL(*observer, Observe(_, _, _)); |
| 805 InstallExtControlledPref(ext1_, kPref1, |
| 806 Value::CreateStringValue("https://www.chromium.org")); |
| 807 Mock::VerifyAndClearExpectations(observer.get()); |
| 808 |
| 809 EXPECT_CALL(*observer, Observe(_, _, _)).Times(0); |
| 810 InstallExtControlledPref(ext1_, kPref1, |
| 811 Value::CreateStringValue("https://www.chromium.org")); |
| 812 Mock::VerifyAndClearExpectations(observer.get()); |
| 813 |
| 814 EXPECT_CALL(*observer, Observe(_, _, _)).Times(2); |
| 815 InstallExtControlledPref(ext1_, kPref1, |
| 816 Value::CreateStringValue("chrome://newtab")); |
| 817 |
| 818 UninstallExtension(ext1_->id()); |
| 819 registrar.Remove(kPref1, observer.get()); |
| 820 } |
| 821 virtual void Verify() { |
| 822 std::string actual = prefs()->pref_service()->GetString(kPref1); |
| 823 EXPECT_EQ(kDefaultPref1, actual); |
| 824 } |
| 825 }; |
| 826 TEST_F(ExtensionPrefsNotifyWhenNeeded, |
| 827 ExtensionPrefsNotifyWhenNeeded) {} |
| 828 |
| 829 // Tests disabling an extension |
| 830 class ExtensionPrefsDisableExt |
| 831 : public ExtensionPrefsPreferencesBase { |
| 832 virtual void Initialize() { |
| 833 InstallExtControlledPref(ext1_, kPref1, Value::CreateStringValue("val1")); |
| 834 std::string actual = prefs()->pref_service()->GetString(kPref1); |
| 835 EXPECT_EQ("val1", actual); |
| 836 prefs()->SetExtensionState(ext1_, Extension::DISABLED); |
| 837 } |
| 838 virtual void Verify() { |
| 839 std::string actual = prefs()->pref_service()->GetString(kPref1); |
| 840 EXPECT_EQ(kDefaultPref1, actual); |
| 841 } |
| 842 }; |
| 843 TEST_F(ExtensionPrefsDisableExt, ExtensionPrefsDisableExt) {} |
| 844 |
| 845 // Tests disabling and reenabling an extension |
| 846 class ExtensionPrefsReenableExt |
| 847 : public ExtensionPrefsPreferencesBase { |
| 848 virtual void Initialize() { |
| 849 InstallExtControlledPref(ext1_, kPref1, Value::CreateStringValue("val1")); |
| 850 prefs()->SetExtensionState(ext1_, Extension::DISABLED); |
| 851 prefs()->SetExtensionState(ext1_, Extension::ENABLED); |
| 852 } |
| 853 virtual void Verify() { |
| 854 std::string actual = prefs()->pref_service()->GetString(kPref1); |
| 855 EXPECT_EQ("val1", actual); |
| 856 } |
| 857 }; |
| 858 TEST_F(ExtensionPrefsDisableExt, ExtensionPrefsReenableExt) {} |
OLD | NEW |