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