Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(966)

Side by Side Diff: headless/lib/browser/headless_browser_context_impl.cc

Issue 2181413002: [headless] Remove default browser context. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Small fixes Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "headless/lib/browser/headless_browser_context_impl.h" 5 #include "headless/lib/browser/headless_browser_context_impl.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <string>
9 #include <utility>
10 #include <vector>
8 11
9 #include "base/memory/ptr_util.h" 12 #include "base/memory/ptr_util.h"
10 #include "base/path_service.h" 13 #include "base/path_service.h"
11 #include "content/public/browser/browser_thread.h" 14 #include "content/public/browser/browser_thread.h"
12 #include "content/public/browser/resource_context.h" 15 #include "content/public/browser/resource_context.h"
13 #include "content/public/browser/storage_partition.h" 16 #include "content/public/browser/storage_partition.h"
17 #include "headless/lib/browser/headless_browser_context_options.h"
14 #include "headless/lib/browser/headless_browser_impl.h" 18 #include "headless/lib/browser/headless_browser_impl.h"
15 #include "headless/lib/browser/headless_url_request_context_getter.h" 19 #include "headless/lib/browser/headless_url_request_context_getter.h"
16 #include "headless/public/util/black_hole_protocol_handler.h" 20 #include "headless/public/util/black_hole_protocol_handler.h"
17 #include "headless/public/util/in_memory_protocol_handler.h" 21 #include "headless/public/util/in_memory_protocol_handler.h"
18 #include "net/url_request/url_request_context.h" 22 #include "net/url_request/url_request_context.h"
19 23
20 namespace headless { 24 namespace headless {
21 25
22 namespace { 26 namespace {
23 const char kHeadlessMojomProtocol[] = "headless-mojom"; 27 const char kHeadlessMojomProtocol[] = "headless-mojom";
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 CHECK(url_request_context_getter_); 70 CHECK(url_request_context_getter_);
67 return url_request_context_getter_->GetURLRequestContext()->host_resolver(); 71 return url_request_context_getter_->GetURLRequestContext()->host_resolver();
68 } 72 }
69 73
70 net::URLRequestContext* HeadlessResourceContext::GetRequestContext() { 74 net::URLRequestContext* HeadlessResourceContext::GetRequestContext() {
71 CHECK(url_request_context_getter_); 75 CHECK(url_request_context_getter_);
72 return url_request_context_getter_->GetURLRequestContext(); 76 return url_request_context_getter_->GetURLRequestContext();
73 } 77 }
74 78
75 HeadlessBrowserContextImpl::HeadlessBrowserContextImpl( 79 HeadlessBrowserContextImpl::HeadlessBrowserContextImpl(
76 ProtocolHandlerMap protocol_handlers, 80 HeadlessBrowserImpl* browser,
77 HeadlessBrowser::Options* options) 81 HeadlessBrowserContextOptions context_options)
78 : protocol_handlers_(std::move(protocol_handlers)), 82 : browser_(browser),
79 options_(options), 83 context_options_(std::move(context_options)),
80 resource_context_(new HeadlessResourceContext) { 84 resource_context_(new HeadlessResourceContext) {
81 InitWhileIOAllowed(); 85 InitWhileIOAllowed();
82 } 86 }
83 87
84 HeadlessBrowserContextImpl::~HeadlessBrowserContextImpl() { 88 HeadlessBrowserContextImpl::~HeadlessBrowserContextImpl() {
85 ShutdownStoragePartitions(); 89 ShutdownStoragePartitions();
90
86 if (resource_context_) { 91 if (resource_context_) {
87 content::BrowserThread::DeleteSoon(content::BrowserThread::IO, FROM_HERE, 92 content::BrowserThread::DeleteSoon(content::BrowserThread::IO, FROM_HERE,
88 resource_context_.release()); 93 resource_context_.release());
89 } 94 }
95
96 auto all_web_contents = GetAllWebContents();
Sami 2016/08/03 11:20:30 Should we do this first before getting rid of the
altimin 2016/08/03 11:54:10 Very well spotted, thanks.
97 for (auto* web_contents : all_web_contents) {
98 web_contents->Close();
99 }
90 } 100 }
91 101
92 // static 102 // static
93 HeadlessBrowserContextImpl* HeadlessBrowserContextImpl::From( 103 HeadlessBrowserContextImpl* HeadlessBrowserContextImpl::From(
94 HeadlessBrowserContext* browser_context) { 104 HeadlessBrowserContext* browser_context) {
95 return reinterpret_cast<HeadlessBrowserContextImpl*>(browser_context); 105 return reinterpret_cast<HeadlessBrowserContextImpl*>(browser_context);
96 } 106 }
97 107
108 HeadlessWebContents::Builder
109 HeadlessBrowserContextImpl::CreateWebContentsBuilder() {
110 DCHECK(browser_->BrowserMainThread()->BelongsToCurrentThread());
111 return HeadlessWebContents::Builder(this);
112 }
113
98 void HeadlessBrowserContextImpl::InitWhileIOAllowed() { 114 void HeadlessBrowserContextImpl::InitWhileIOAllowed() {
99 // TODO(skyostil): Allow the embedder to override this. 115 if (!context_options_.user_data_dir().empty()) {
100 PathService::Get(base::DIR_EXE, &path_); 116 path_ = context_options_.user_data_dir();
117 } else {
118 PathService::Get(base::DIR_EXE, &path_);
119 }
101 BrowserContext::Initialize(this, path_); 120 BrowserContext::Initialize(this, path_);
102 } 121 }
103 122
104 std::unique_ptr<content::ZoomLevelDelegate> 123 std::unique_ptr<content::ZoomLevelDelegate>
105 HeadlessBrowserContextImpl::CreateZoomLevelDelegate( 124 HeadlessBrowserContextImpl::CreateZoomLevelDelegate(
106 const base::FilePath& partition_path) { 125 const base::FilePath& partition_path) {
107 return std::unique_ptr<content::ZoomLevelDelegate>(); 126 return std::unique_ptr<content::ZoomLevelDelegate>();
108 } 127 }
109 128
110 base::FilePath HeadlessBrowserContextImpl::GetPath() const { 129 base::FilePath HeadlessBrowserContextImpl::GetPath() const {
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
156 175
157 net::URLRequestContextGetter* HeadlessBrowserContextImpl::CreateRequestContext( 176 net::URLRequestContextGetter* HeadlessBrowserContextImpl::CreateRequestContext(
158 content::ProtocolHandlerMap* protocol_handlers, 177 content::ProtocolHandlerMap* protocol_handlers,
159 content::URLRequestInterceptorScopedVector request_interceptors) { 178 content::URLRequestInterceptorScopedVector request_interceptors) {
160 scoped_refptr<HeadlessURLRequestContextGetter> url_request_context_getter( 179 scoped_refptr<HeadlessURLRequestContextGetter> url_request_context_getter(
161 new HeadlessURLRequestContextGetter( 180 new HeadlessURLRequestContextGetter(
162 content::BrowserThread::GetTaskRunnerForThread( 181 content::BrowserThread::GetTaskRunnerForThread(
163 content::BrowserThread::IO), 182 content::BrowserThread::IO),
164 content::BrowserThread::GetTaskRunnerForThread( 183 content::BrowserThread::GetTaskRunnerForThread(
165 content::BrowserThread::FILE), 184 content::BrowserThread::FILE),
166 protocol_handlers, std::move(protocol_handlers_), 185 protocol_handlers, context_options_.TakeProtocolHandlers(),
167 std::move(request_interceptors), options())); 186 std::move(request_interceptors), &context_options_));
168 resource_context_->set_url_request_context_getter(url_request_context_getter); 187 resource_context_->set_url_request_context_getter(url_request_context_getter);
169 return url_request_context_getter.get(); 188 return url_request_context_getter.get();
170 } 189 }
171 190
172 net::URLRequestContextGetter* 191 net::URLRequestContextGetter*
173 HeadlessBrowserContextImpl::CreateRequestContextForStoragePartition( 192 HeadlessBrowserContextImpl::CreateRequestContextForStoragePartition(
174 const base::FilePath& partition_path, 193 const base::FilePath& partition_path,
175 bool in_memory, 194 bool in_memory,
176 content::ProtocolHandlerMap* protocol_handlers, 195 content::ProtocolHandlerMap* protocol_handlers,
177 content::URLRequestInterceptorScopedVector request_interceptors) { 196 content::URLRequestInterceptorScopedVector request_interceptors) {
178 return nullptr; 197 return nullptr;
179 } 198 }
180 199
181 net::URLRequestContextGetter* 200 net::URLRequestContextGetter*
182 HeadlessBrowserContextImpl::CreateMediaRequestContext() { 201 HeadlessBrowserContextImpl::CreateMediaRequestContext() {
183 return resource_context_->url_request_context_getter(); 202 return resource_context_->url_request_context_getter();
184 } 203 }
185 204
186 net::URLRequestContextGetter* 205 net::URLRequestContextGetter*
187 HeadlessBrowserContextImpl::CreateMediaRequestContextForStoragePartition( 206 HeadlessBrowserContextImpl::CreateMediaRequestContextForStoragePartition(
188 const base::FilePath& partition_path, 207 const base::FilePath& partition_path,
189 bool in_memory) { 208 bool in_memory) {
190 return nullptr; 209 return nullptr;
191 } 210 }
192 211
193 void HeadlessBrowserContextImpl::SetOptionsForTesting( 212 std::vector<HeadlessWebContents*>
194 HeadlessBrowser::Options* options) { 213 HeadlessBrowserContextImpl::GetAllWebContents() {
195 options_ = options; 214 std::vector<HeadlessWebContents*> result;
215
216 result.reserve(web_contents_map_.size());
217
218 for (const auto& web_contents_pair : web_contents_map_) {
219 result.push_back(web_contents_pair.second);
220 }
221
222 return result;
223 }
224
225 void HeadlessBrowserContextImpl::RegisterWebContents(
226 HeadlessWebContentsImpl* web_contents) {
227 web_contents_map_[web_contents->GetDevtoolsAgentHostId()] = web_contents;
228 }
229
230 void HeadlessBrowserContextImpl::UnregisterWebContents(
231 HeadlessWebContentsImpl* web_contents) {
232 auto it = web_contents_map_.find(web_contents->GetDevtoolsAgentHostId());
233 DCHECK(it != web_contents_map_.end());
234 web_contents_map_.erase(it);
235 }
236
237 HeadlessBrowserImpl* HeadlessBrowserContextImpl::browser() const {
238 return browser_;
196 } 239 }
197 240
198 HeadlessBrowserContext::Builder::Builder(HeadlessBrowserImpl* browser) 241 HeadlessBrowserContext::Builder::Builder(HeadlessBrowserImpl* browser)
199 : browser_(browser), enable_http_and_https_if_mojo_used_(false) {} 242 : browser_(browser),
243 options_(new HeadlessBrowserContextOptions(browser->options())),
244 enable_http_and_https_if_mojo_used_(false) {}
200 245
201 HeadlessBrowserContext::Builder::~Builder() = default; 246 HeadlessBrowserContext::Builder::~Builder() = default;
202 247
203 HeadlessBrowserContext::Builder::Builder(Builder&&) = default; 248 HeadlessBrowserContext::Builder::Builder(Builder&&) = default;
204 249
205 HeadlessBrowserContext::Builder& 250 HeadlessBrowserContext::Builder&
206 HeadlessBrowserContext::Builder::SetProtocolHandlers( 251 HeadlessBrowserContext::Builder::SetProtocolHandlers(
207 ProtocolHandlerMap protocol_handlers) { 252 ProtocolHandlerMap protocol_handlers) {
208 protocol_handlers_ = std::move(protocol_handlers); 253 options_->protocol_handlers_ = std::move(protocol_handlers);
209 return *this; 254 return *this;
210 } 255 }
211 256
257 HeadlessBrowserContext::Builder& HeadlessBrowserContext::Builder::SetUserAgent(
258 const std::string& user_agent) {
259 options_->user_agent_ = user_agent;
260 return *this;
261 }
262
263 HeadlessBrowserContext::Builder&
264 HeadlessBrowserContext::Builder::SetProxyServer(
265 const net::HostPortPair& proxy_server) {
266 options_->proxy_server_ = proxy_server;
267 return *this;
268 }
269
270 HeadlessBrowserContext::Builder&
271 HeadlessBrowserContext::Builder::SetHostResolverRules(
272 const std::string& host_resolver_rules) {
273 options_->host_resolver_rules_ = host_resolver_rules;
274 return *this;
275 }
276
277 HeadlessBrowserContext::Builder&
278 HeadlessBrowserContext::Builder::SetUserDataDir(
279 const base::FilePath& user_data_dir) {
280 options_->user_data_dir_ = user_data_dir;
281 return *this;
282 }
283
212 HeadlessBrowserContext::Builder& 284 HeadlessBrowserContext::Builder&
213 HeadlessBrowserContext::Builder::AddJsMojoBindings( 285 HeadlessBrowserContext::Builder::AddJsMojoBindings(
214 const std::string& mojom_name, 286 const std::string& mojom_name,
215 const std::string& js_bindings) { 287 const std::string& js_bindings) {
216 mojo_bindings_.emplace_back(mojom_name, js_bindings); 288 mojo_bindings_.emplace_back(mojom_name, js_bindings);
217 return *this; 289 return *this;
218 } 290 }
219 291
220 HeadlessBrowserContext::Builder& 292 HeadlessBrowserContext::Builder&
221 HeadlessBrowserContext::Builder::EnableUnsafeNetworkAccessWithMojoBindings( 293 HeadlessBrowserContext::Builder::EnableUnsafeNetworkAccessWithMojoBindings(
222 bool enable_http_and_https_if_mojo_used) { 294 bool enable_http_and_https_if_mojo_used) {
223 enable_http_and_https_if_mojo_used_ = enable_http_and_https_if_mojo_used; 295 enable_http_and_https_if_mojo_used_ = enable_http_and_https_if_mojo_used;
224 return *this; 296 return *this;
225 } 297 }
226 298
227 std::unique_ptr<HeadlessBrowserContext> 299 std::unique_ptr<HeadlessBrowserContext>
228 HeadlessBrowserContext::Builder::Build() { 300 HeadlessBrowserContext::Builder::Build() {
229 if (!mojo_bindings_.empty()) { 301 if (!mojo_bindings_.empty()) {
230 std::unique_ptr<InMemoryProtocolHandler> headless_mojom_protocol_handler( 302 std::unique_ptr<InMemoryProtocolHandler> headless_mojom_protocol_handler(
231 new InMemoryProtocolHandler()); 303 new InMemoryProtocolHandler());
232 for (const MojoBindings& binding : mojo_bindings_) { 304 for (const MojoBindings& binding : mojo_bindings_) {
233 headless_mojom_protocol_handler->InsertResponse( 305 headless_mojom_protocol_handler->InsertResponse(
234 binding.mojom_name, 306 binding.mojom_name,
235 InMemoryProtocolHandler::Response(binding.js_bindings, 307 InMemoryProtocolHandler::Response(binding.js_bindings,
236 "application/javascript")); 308 "application/javascript"));
237 } 309 }
238 DCHECK(protocol_handlers_.find(kHeadlessMojomProtocol) == 310 DCHECK(options_->protocol_handlers_.find(kHeadlessMojomProtocol) ==
239 protocol_handlers_.end()); 311 options_->protocol_handlers_.end());
240 protocol_handlers_[kHeadlessMojomProtocol] = 312 options_->protocol_handlers_[kHeadlessMojomProtocol] =
241 std::move(headless_mojom_protocol_handler); 313 std::move(headless_mojom_protocol_handler);
242 314
243 // Unless you know what you're doing it's unsafe to allow http/https for a 315 // Unless you know what you're doing it's unsafe to allow http/https for a
244 // context with mojo bindings. 316 // context with mojo bindings.
245 if (!enable_http_and_https_if_mojo_used_) { 317 if (!enable_http_and_https_if_mojo_used_) {
246 protocol_handlers_[url::kHttpScheme] = 318 options_->protocol_handlers_[url::kHttpScheme] =
247 base::WrapUnique(new BlackHoleProtocolHandler()); 319 base::WrapUnique(new BlackHoleProtocolHandler());
248 protocol_handlers_[url::kHttpsScheme] = 320 options_->protocol_handlers_[url::kHttpsScheme] =
249 base::WrapUnique(new BlackHoleProtocolHandler()); 321 base::WrapUnique(new BlackHoleProtocolHandler());
250 } 322 }
251 } 323 }
252 324
253 return base::WrapUnique(new HeadlessBrowserContextImpl( 325 return base::WrapUnique(
254 std::move(protocol_handlers_), browser_->options())); 326 new HeadlessBrowserContextImpl(browser_, std::move(*options_)));
255 } 327 }
256 328
257 HeadlessBrowserContext::Builder::MojoBindings::MojoBindings() {} 329 HeadlessBrowserContext::Builder::MojoBindings::MojoBindings() {}
258 330
259 HeadlessBrowserContext::Builder::MojoBindings::MojoBindings( 331 HeadlessBrowserContext::Builder::MojoBindings::MojoBindings(
260 const std::string& mojom_name, 332 const std::string& mojom_name,
261 const std::string& js_bindings) 333 const std::string& js_bindings)
262 : mojom_name(mojom_name), js_bindings(js_bindings) {} 334 : mojom_name(mojom_name), js_bindings(js_bindings) {}
263 335
264 HeadlessBrowserContext::Builder::MojoBindings::~MojoBindings() {} 336 HeadlessBrowserContext::Builder::MojoBindings::~MojoBindings() {}
265 337
266 } // namespace headless 338 } // namespace headless
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698