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