OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/files/file_util.h" | 5 #include "base/files/file_util.h" |
6 #include "chrome/browser/extensions/api/developer_private/developer_private_api.
h" | 6 #include "chrome/browser/extensions/api/developer_private/developer_private_api.
h" |
7 #include "chrome/browser/extensions/extension_function_test_utils.h" | 7 #include "chrome/browser/extensions/extension_function_test_utils.h" |
8 #include "chrome/browser/extensions/extension_service.h" | 8 #include "chrome/browser/extensions/extension_service.h" |
9 #include "chrome/browser/extensions/extension_service_test_base.h" | 9 #include "chrome/browser/extensions/extension_service_test_base.h" |
10 #include "chrome/browser/extensions/extension_util.h" | 10 #include "chrome/browser/extensions/extension_util.h" |
(...skipping 15 matching lines...) Expand all Loading... |
26 class DeveloperPrivateApiUnitTest : public ExtensionServiceTestBase { | 26 class DeveloperPrivateApiUnitTest : public ExtensionServiceTestBase { |
27 protected: | 27 protected: |
28 DeveloperPrivateApiUnitTest() {} | 28 DeveloperPrivateApiUnitTest() {} |
29 ~DeveloperPrivateApiUnitTest() override {} | 29 ~DeveloperPrivateApiUnitTest() override {} |
30 | 30 |
31 // A wrapper around extension_function_test_utils::RunFunction that runs with | 31 // A wrapper around extension_function_test_utils::RunFunction that runs with |
32 // the associated browser, no flags, and can take stack-allocated arguments. | 32 // the associated browser, no flags, and can take stack-allocated arguments. |
33 bool RunFunction(const scoped_refptr<UIThreadExtensionFunction>& function, | 33 bool RunFunction(const scoped_refptr<UIThreadExtensionFunction>& function, |
34 const base::ListValue& args); | 34 const base::ListValue& args); |
35 | 35 |
| 36 // Loads an unpacked extension that is backed by a real directory, allowing |
| 37 // it to be reloaded. |
| 38 const Extension* LoadUnpackedExtension(); |
| 39 |
| 40 // Tests a developer private function (T) that sets an extension pref, and |
| 41 // verifies it with |has_pref|. |
| 42 template<typename T> |
| 43 void TestExtensionPrefSetting( |
| 44 bool (*has_pref)(const std::string&, content::BrowserContext*)); |
| 45 |
36 Browser* browser() { return browser_.get(); } | 46 Browser* browser() { return browser_.get(); } |
37 | 47 |
38 private: | 48 private: |
39 // ExtensionServiceTestBase: | 49 // ExtensionServiceTestBase: |
40 void SetUp() override; | 50 void SetUp() override; |
41 void TearDown() override; | 51 void TearDown() override; |
42 | 52 |
43 // The browser (and accompanying window). | 53 // The browser (and accompanying window). |
44 scoped_ptr<TestBrowserWindow> browser_window_; | 54 scoped_ptr<TestBrowserWindow> browser_window_; |
45 scoped_ptr<Browser> browser_; | 55 scoped_ptr<Browser> browser_; |
46 | 56 |
| 57 ScopedVector<TestExtensionDir> test_extension_dirs_; |
| 58 |
47 DISALLOW_COPY_AND_ASSIGN(DeveloperPrivateApiUnitTest); | 59 DISALLOW_COPY_AND_ASSIGN(DeveloperPrivateApiUnitTest); |
48 }; | 60 }; |
49 | 61 |
50 bool DeveloperPrivateApiUnitTest::RunFunction( | 62 bool DeveloperPrivateApiUnitTest::RunFunction( |
51 const scoped_refptr<UIThreadExtensionFunction>& function, | 63 const scoped_refptr<UIThreadExtensionFunction>& function, |
52 const base::ListValue& args) { | 64 const base::ListValue& args) { |
53 return extension_function_test_utils::RunFunction( | 65 return extension_function_test_utils::RunFunction( |
54 function.get(), | 66 function.get(), |
55 make_scoped_ptr(args.DeepCopy()), | 67 make_scoped_ptr(args.DeepCopy()), |
56 browser(), | 68 browser(), |
57 extension_function_test_utils::NONE); | 69 extension_function_test_utils::NONE); |
58 } | 70 } |
59 | 71 |
60 void DeveloperPrivateApiUnitTest::SetUp() { | 72 const Extension* DeveloperPrivateApiUnitTest::LoadUnpackedExtension() { |
61 ExtensionServiceTestBase::SetUp(); | |
62 InitializeEmptyExtensionService(); | |
63 | |
64 browser_window_.reset(new TestBrowserWindow()); | |
65 Browser::CreateParams params(profile(), chrome::HOST_DESKTOP_TYPE_NATIVE); | |
66 params.type = Browser::TYPE_TABBED; | |
67 params.window = browser_window_.get(); | |
68 browser_.reset(new Browser(params)); | |
69 } | |
70 | |
71 void DeveloperPrivateApiUnitTest::TearDown() { | |
72 browser_.reset(); | |
73 browser_window_.reset(); | |
74 ExtensionServiceTestBase::TearDown(); | |
75 } | |
76 | |
77 // Test developerPrivate.allowIncognito. | |
78 TEST_F(DeveloperPrivateApiUnitTest, DeveloperPrivateAllowIncognito) { | |
79 const char kManifest[] = | 73 const char kManifest[] = |
80 "{" | 74 "{" |
81 " \"name\": \"foo\"," | 75 " \"name\": \"foo\"," |
82 " \"version\": \"1.0\"," | 76 " \"version\": \"1.0\"," |
83 " \"manifest_version\": 2" | 77 " \"manifest_version\": 2" |
84 "}"; | 78 "}"; |
85 | 79 |
86 // Sadly, we need a "real" directory here, because toggling incognito causes | 80 test_extension_dirs_.push_back(new TestExtensionDir); |
87 // a reload (which needs a path). | 81 TestExtensionDir* dir = test_extension_dirs_.back(); |
88 TestExtensionDir dir; | 82 dir->WriteManifest(kManifest); |
89 dir.WriteManifest(kManifest); | |
90 | 83 |
91 // TODO(devlin): We should extract out methods to load an unpacked extension | 84 // TODO(devlin): We should extract out methods to load an unpacked extension |
92 // synchronously. We do it in ExtensionBrowserTest, but that's not helpful | 85 // synchronously. We do it in ExtensionBrowserTest, but that's not helpful |
93 // for unittests. | 86 // for unittests. |
94 TestExtensionRegistryObserver registry_observer(registry()); | 87 TestExtensionRegistryObserver registry_observer(registry()); |
95 scoped_refptr<UnpackedInstaller> installer( | 88 scoped_refptr<UnpackedInstaller> installer( |
96 UnpackedInstaller::Create(service())); | 89 UnpackedInstaller::Create(service())); |
97 installer->Load(dir.unpacked_path()); | 90 installer->Load(dir->unpacked_path()); |
98 base::FilePath extension_path = | 91 base::FilePath extension_path = |
99 base::MakeAbsoluteFilePath(dir.unpacked_path()); | 92 base::MakeAbsoluteFilePath(dir->unpacked_path()); |
100 const Extension* extension = nullptr; | 93 const Extension* extension = nullptr; |
101 do { | 94 do { |
102 extension = registry_observer.WaitForExtensionLoaded(); | 95 extension = registry_observer.WaitForExtensionLoaded(); |
103 } while (extension->path() != extension_path); | 96 } while (extension->path() != extension_path); |
104 std::string extension_id = extension->id(); | 97 // The fact that unpacked extensions get file access by default is an |
| 98 // irrelevant detail to these tests. Disable it. |
| 99 ExtensionPrefs::Get(browser_context())->SetAllowFileAccess(extension->id(), |
| 100 false); |
| 101 return extension; |
| 102 } |
105 | 103 |
106 scoped_refptr<api::DeveloperPrivateAllowIncognitoFunction> function( | 104 template<typename T> |
107 new api::DeveloperPrivateAllowIncognitoFunction()); | 105 void DeveloperPrivateApiUnitTest::TestExtensionPrefSetting( |
| 106 bool (*has_pref)(const std::string&, content::BrowserContext*)) { |
| 107 // Sadly, we need a "real" directory here, because toggling incognito causes |
| 108 // a reload (which needs a path). |
| 109 std::string extension_id = LoadUnpackedExtension()->id(); |
| 110 |
| 111 scoped_refptr<UIThreadExtensionFunction> function(new T()); |
108 | 112 |
109 base::ListValue enable_args; | 113 base::ListValue enable_args; |
110 enable_args.AppendString(extension_id); | 114 enable_args.AppendString(extension_id); |
111 enable_args.AppendBoolean(true); | 115 enable_args.AppendBoolean(true); |
112 | 116 |
113 EXPECT_FALSE(util::IsIncognitoEnabled(extension_id, profile())); | 117 EXPECT_FALSE(has_pref(extension_id, profile())); |
| 118 |
| 119 // Pref-setting should require a user action. |
| 120 EXPECT_FALSE(RunFunction(function, enable_args)); |
| 121 EXPECT_EQ(std::string("This action requires a user gesture."), |
| 122 function->GetError()); |
| 123 |
| 124 ExtensionFunction::ScopedUserGestureForTests scoped_user_gesture; |
| 125 function = new T(); |
114 EXPECT_TRUE(RunFunction(function, enable_args)); | 126 EXPECT_TRUE(RunFunction(function, enable_args)); |
115 EXPECT_TRUE(util::IsIncognitoEnabled(extension_id, profile())); | 127 EXPECT_TRUE(has_pref(extension_id, profile())); |
116 | 128 |
117 base::ListValue disable_args; | 129 base::ListValue disable_args; |
118 disable_args.AppendString(extension_id); | 130 disable_args.AppendString(extension_id); |
119 disable_args.AppendBoolean(false); | 131 disable_args.AppendBoolean(false); |
120 function = new api::DeveloperPrivateAllowIncognitoFunction(); | 132 function = new T(); |
121 EXPECT_TRUE(RunFunction(function, disable_args)); | 133 EXPECT_TRUE(RunFunction(function, disable_args)); |
122 EXPECT_FALSE(util::IsIncognitoEnabled(extension_id, profile())); | 134 EXPECT_FALSE(has_pref(extension_id, profile())); |
| 135 } |
| 136 |
| 137 void DeveloperPrivateApiUnitTest::SetUp() { |
| 138 ExtensionServiceTestBase::SetUp(); |
| 139 InitializeEmptyExtensionService(); |
| 140 |
| 141 browser_window_.reset(new TestBrowserWindow()); |
| 142 Browser::CreateParams params(profile(), chrome::HOST_DESKTOP_TYPE_NATIVE); |
| 143 params.type = Browser::TYPE_TABBED; |
| 144 params.window = browser_window_.get(); |
| 145 browser_.reset(new Browser(params)); |
| 146 } |
| 147 |
| 148 void DeveloperPrivateApiUnitTest::TearDown() { |
| 149 test_extension_dirs_.clear(); |
| 150 browser_.reset(); |
| 151 browser_window_.reset(); |
| 152 ExtensionServiceTestBase::TearDown(); |
| 153 } |
| 154 |
| 155 // Test developerPrivate.allowIncognito. |
| 156 TEST_F(DeveloperPrivateApiUnitTest, DeveloperPrivateAllowIncognito) { |
| 157 TestExtensionPrefSetting<api::DeveloperPrivateAllowIncognitoFunction>( |
| 158 &util::IsIncognitoEnabled); |
| 159 } |
| 160 |
| 161 // Test developerPrivate.reload. |
| 162 TEST_F(DeveloperPrivateApiUnitTest, DeveloperPrivateReload) { |
| 163 const Extension* extension = LoadUnpackedExtension(); |
| 164 std::string extension_id = extension->id(); |
| 165 scoped_refptr<UIThreadExtensionFunction> function( |
| 166 new api::DeveloperPrivateReloadFunction()); |
| 167 base::ListValue reload_args; |
| 168 reload_args.AppendString(extension_id); |
| 169 |
| 170 TestExtensionRegistryObserver registry_observer(registry()); |
| 171 EXPECT_TRUE(RunFunction(function, reload_args)); |
| 172 const Extension* unloaded_extension = |
| 173 registry_observer.WaitForExtensionUnloaded(); |
| 174 EXPECT_EQ(extension, unloaded_extension); |
| 175 const Extension* reloaded_extension = |
| 176 registry_observer.WaitForExtensionLoaded(); |
| 177 EXPECT_EQ(extension_id, reloaded_extension->id()); |
| 178 } |
| 179 |
| 180 // Test developerPrivate.allowFileAccess. |
| 181 TEST_F(DeveloperPrivateApiUnitTest, DeveloperPrivateAllowFileAccess) { |
| 182 TestExtensionPrefSetting<api::DeveloperPrivateAllowFileAccessFunction>( |
| 183 &util::AllowFileAccess); |
123 } | 184 } |
124 | 185 |
125 } // namespace extensions | 186 } // namespace extensions |
OLD | NEW |