Index: headless/lib/browser/headless_browser_context.cc |
diff --git a/headless/lib/browser/headless_browser_context.cc b/headless/lib/browser/headless_browser_context.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..aca83515ca995e4ab3e68191e662b99430b6769b |
--- /dev/null |
+++ b/headless/lib/browser/headless_browser_context.cc |
@@ -0,0 +1,163 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "headless/lib/browser/headless_browser_context.h" |
+ |
+#include "base/path_service.h" |
+#include "content/public/browser/browser_thread.h" |
+#include "content/public/browser/resource_context.h" |
+#include "content/public/browser/storage_partition.h" |
+#include "headless/lib/browser/headless_url_request_context_getter.h" |
+#include "net/url_request/url_request_context.h" |
+ |
+namespace headless { |
+ |
+// Contains net::URLRequestContextGetter required for resource loading. |
+// Must be destructed on the IO thread as per content::ResourceContext |
+// requirements. |
+class HeadlessResourceContext : public content::ResourceContext { |
+ public: |
+ HeadlessResourceContext(); |
+ ~HeadlessResourceContext() override; |
+ |
+ // ResourceContext implementation: |
+ net::HostResolver* GetHostResolver() override; |
+ net::URLRequestContext* GetRequestContext() override; |
+ |
+ // Configure the URL request context getter to be used for resource fetching. |
+ // Must be called before any of the other methods of this class are used. Must |
+ // be called on the browser UI thread. |
+ void set_url_request_context_getter( |
+ scoped_refptr<net::URLRequestContextGetter> url_request_context_getter) { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
+ url_request_context_getter_ = std::move(url_request_context_getter); |
+ } |
+ |
+ private: |
+ scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(HeadlessResourceContext); |
+}; |
+ |
+HeadlessResourceContext::HeadlessResourceContext() { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
+} |
+ |
+HeadlessResourceContext::~HeadlessResourceContext() { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
+} |
+ |
+net::HostResolver* HeadlessResourceContext::GetHostResolver() { |
+ CHECK(url_request_context_getter_); |
+ return url_request_context_getter_->GetURLRequestContext()->host_resolver(); |
+} |
+ |
+net::URLRequestContext* HeadlessResourceContext::GetRequestContext() { |
+ CHECK(url_request_context_getter_); |
+ return url_request_context_getter_->GetURLRequestContext(); |
+} |
+ |
+HeadlessBrowserContext::HeadlessBrowserContext( |
+ const HeadlessBrowser::Options& options) |
+ : resource_context_(new HeadlessResourceContext), options_(options) { |
+ InitWhileIOAllowed(); |
+} |
+ |
+HeadlessBrowserContext::~HeadlessBrowserContext() { |
+ if (resource_context_) { |
+ content::BrowserThread::DeleteSoon(content::BrowserThread::IO, FROM_HERE, |
+ resource_context_.release()); |
+ } |
+} |
+ |
+void HeadlessBrowserContext::InitWhileIOAllowed() { |
+ // TODO(skyostil): Allow the embedder to override this. |
+ PathService::Get(base::DIR_EXE, &path_); |
+} |
+ |
+scoped_ptr<content::ZoomLevelDelegate> |
+HeadlessBrowserContext::CreateZoomLevelDelegate( |
+ const base::FilePath& partition_path) { |
+ return scoped_ptr<content::ZoomLevelDelegate>(); |
+} |
+ |
+base::FilePath HeadlessBrowserContext::GetPath() const { |
+ return path_; |
+} |
+ |
+bool HeadlessBrowserContext::IsOffTheRecord() const { |
+ return false; |
+} |
+ |
+net::URLRequestContextGetter* HeadlessBrowserContext::GetRequestContext() { |
+ return GetDefaultStoragePartition(this)->GetURLRequestContext(); |
+} |
+ |
+net::URLRequestContextGetter* |
+HeadlessBrowserContext::GetRequestContextForRenderProcess( |
+ int renderer_child_id) { |
+ return GetRequestContext(); |
+} |
+ |
+net::URLRequestContextGetter* HeadlessBrowserContext::GetMediaRequestContext() { |
+ return GetRequestContext(); |
+} |
+ |
+net::URLRequestContextGetter* |
+HeadlessBrowserContext::GetMediaRequestContextForRenderProcess( |
+ int renderer_child_id) { |
+ return GetRequestContext(); |
+} |
+ |
+net::URLRequestContextGetter* |
+HeadlessBrowserContext::GetMediaRequestContextForStoragePartition( |
+ const base::FilePath& partition_path, |
+ bool in_memory) { |
+ return GetRequestContext(); |
+} |
+ |
+content::ResourceContext* HeadlessBrowserContext::GetResourceContext() { |
+ return resource_context_.get(); |
+} |
+ |
+content::DownloadManagerDelegate* |
+HeadlessBrowserContext::GetDownloadManagerDelegate() { |
+ return nullptr; |
+} |
+ |
+content::BrowserPluginGuestManager* HeadlessBrowserContext::GetGuestManager() { |
+ // TODO(altimin): Should be non-null? (is null in content/shell). |
+ return nullptr; |
+} |
+ |
+storage::SpecialStoragePolicy* |
+HeadlessBrowserContext::GetSpecialStoragePolicy() { |
+ return nullptr; |
+} |
+ |
+content::PushMessagingService* |
+HeadlessBrowserContext::GetPushMessagingService() { |
+ return nullptr; |
+} |
+ |
+content::SSLHostStateDelegate* |
+HeadlessBrowserContext::GetSSLHostStateDelegate() { |
+ return nullptr; |
+} |
+ |
+content::PermissionManager* HeadlessBrowserContext::GetPermissionManager() { |
+ return nullptr; |
+} |
+ |
+content::BackgroundSyncController* |
+HeadlessBrowserContext::GetBackgroundSyncController() { |
+ return nullptr; |
+} |
+ |
+void HeadlessBrowserContext::SetURLRequestContextGetter( |
+ scoped_refptr<net::URLRequestContextGetter> url_request_context_getter) { |
+ resource_context_->set_url_request_context_getter(url_request_context_getter); |
+} |
+ |
+} // namespace headless |