1 // Copyright 2014 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 "extensions/browser/extensions_test.h"
6
7 #include "components/keyed_service/content/browser_context_dependency_manager.h"
8 #include "components/pref_registry/pref_registry_syncable.h"
9 #include "components/prefs/pref_service_factory.h"
10 #include "components/prefs/testing_pref_store.h"
11 #include "content/public/common/content_client.h"
12 #include "content/public/common/network_service_util.h"
13 #include "content/public/test/test_browser_context.h"
14 #include "extensions/browser/extension_pref_value_map.h"
15 #include "extensions/browser/extension_prefs.h"
16 #include "extensions/browser/extension_prefs_factory.h"
17 #include "extensions/browser/test_extensions_browser_client.h"
18 #include "extensions/test/test_content_utility_client.h"
19 #include "services/network/public/mojom/cors_origin_pattern.mojom.h"
20
21 namespace {
22
CreateTestIncognitoContext()23 std::unique_ptr<content::TestBrowserContext> CreateTestIncognitoContext() {
24 std::unique_ptr<content::TestBrowserContext> incognito_context =
25 std::make_unique<content::TestBrowserContext>();
26 incognito_context->set_is_off_the_record(true);
27 return incognito_context;
28 }
29
30 class ExtensionTestBrowserContext : public content::TestBrowserContext {
31 private:
SetCorsOriginAccessListForOrigin(const url::Origin & source_origin,std::vector<network::mojom::CorsOriginPatternPtr> allow_patterns,std::vector<network::mojom::CorsOriginPatternPtr> block_patterns,base::OnceClosure closure)32 void SetCorsOriginAccessListForOrigin(
33 const url::Origin& source_origin,
34 std::vector<network::mojom::CorsOriginPatternPtr> allow_patterns,
35 std::vector<network::mojom::CorsOriginPatternPtr> block_patterns,
36 base::OnceClosure closure) override {
37 // This method is called for setting up Extensions, but can be ignored
38 // unless actual network requests need to be handled.
39 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
40 std::move(closure));
41 }
42 };
43
44 } // namespace
45
46 namespace extensions {
47
ExtensionsTest(std::unique_ptr<content::BrowserTaskEnvironment> task_environment)48 ExtensionsTest::ExtensionsTest(
49 std::unique_ptr<content::BrowserTaskEnvironment> task_environment)
50 : task_environment_(std::move(task_environment)),
51 rvh_test_enabler_(
52 std::make_unique<content::RenderViewHostTestEnabler>()) {}
53
~ExtensionsTest()54 ExtensionsTest::~ExtensionsTest() {
55 // Destroy the task runners before nulling the browser/utility clients, as
56 // posted tasks may use them.
57 rvh_test_enabler_.reset();
58 task_environment_.reset();
59 content::SetUtilityClientForTesting(nullptr);
60 }
61
SetExtensionsBrowserClient(std::unique_ptr<TestExtensionsBrowserClient> extensions_browser_client)62 void ExtensionsTest::SetExtensionsBrowserClient(
63 std::unique_ptr<TestExtensionsBrowserClient> extensions_browser_client) {
64 DCHECK(extensions_browser_client);
65 DCHECK(!extensions_browser_client_);
66 extensions_browser_client_ = std::move(extensions_browser_client);
67 }
68
SetUp()69 void ExtensionsTest::SetUp() {
70 content::ForceInProcessNetworkService(true);
71 content_utility_client_ = std::make_unique<TestContentUtilityClient>();
72 browser_context_ = std::make_unique<ExtensionTestBrowserContext>();
73 incognito_context_ = CreateTestIncognitoContext();
74
75 if (!extensions_browser_client_) {
76 extensions_browser_client_ =
77 std::make_unique<TestExtensionsBrowserClient>();
78 }
79 extensions_browser_client_->SetMainContext(browser_context_.get());
80
81 content::SetUtilityClientForTesting(content_utility_client_.get());
82 ExtensionsBrowserClient::Set(extensions_browser_client_.get());
83 extensions_browser_client_->set_extension_system_factory(
84 &extension_system_factory_);
85 extensions_browser_client_->SetIncognitoContext(incognito_context_.get());
86
87 // Set up all the dependencies of ExtensionPrefs.
88 extension_pref_value_map_.reset(new ExtensionPrefValueMap());
89 PrefServiceFactory factory;
90 factory.set_user_prefs(new TestingPrefStore());
91 factory.set_extension_prefs(new TestingPrefStore());
92 user_prefs::PrefRegistrySyncable* pref_registry =
93 new user_prefs::PrefRegistrySyncable();
94 // Prefs should be registered before the PrefService is created.
95 ExtensionPrefs::RegisterProfilePrefs(pref_registry);
96 pref_service_ = factory.Create(pref_registry);
97
98 std::unique_ptr<ExtensionPrefs> extension_prefs(ExtensionPrefs::Create(
99 browser_context(), pref_service_.get(),
100 browser_context()->GetPath().AppendASCII("Extensions"),
101 extension_pref_value_map_.get(), false /* extensions_disabled */,
102 std::vector<EarlyExtensionPrefsObserver*>()));
103
104 ExtensionPrefsFactory::GetInstance()->SetInstanceForTesting(
105 browser_context(), std::move(extension_prefs));
106
107 // Crashing here? Don't use this class in Chrome's unit_tests. See header.
108 BrowserContextDependencyManager::GetInstance()
109 ->CreateBrowserContextServicesForTest(browser_context_.get());
110 BrowserContextDependencyManager::GetInstance()
111 ->CreateBrowserContextServicesForTest(incognito_context_.get());
112 }
113
TearDown()114 void ExtensionsTest::TearDown() {
115 // Allows individual tests to have BrowserContextKeyedServiceFactory objects
116 // as member variables instead of singletons. The individual services will be
117 // cleaned up before the factories are destroyed.
118 BrowserContextDependencyManager::GetInstance()->DestroyBrowserContextServices(
119 incognito_context_.get());
120 BrowserContextDependencyManager::GetInstance()->DestroyBrowserContextServices(
121 browser_context_.get());
122
123 extensions_browser_client_.reset();
124 ExtensionsBrowserClient::Set(nullptr);
125
126 incognito_context_.reset();
127 browser_context_.reset();
128 pref_service_.reset();
129 }
130
131 } // namespace extensions
132