summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--extensions/browser/BUILD.gn4
-rw-r--r--extensions/browser/api/extensions_api_client.cc3
-rw-r--r--extensions/browser/api/web_request/web_request_event_router_delegate.cc8
-rw-r--r--extensions/browser/api/web_request/web_request_event_router_delegate.h4
-rw-r--r--extensions/browser/extension_network_delegate.cc132
-rw-r--r--extensions/browser/extension_network_delegate.h60
-rw-r--r--extensions/browser/extension_url_request_context_getter.cc250
-rw-r--r--extensions/browser/extension_url_request_context_getter.h72
-rw-r--r--extensions/common/switches.cc3
-rw-r--r--extensions/common/switches.h1
-rw-r--r--extensions/extensions.gyp4
-rw-r--r--extensions/shell/browser/shell_browser_context.cc52
-rw-r--r--extensions/shell/browser/shell_browser_context.h17
-rw-r--r--extensions/shell/browser/shell_browser_main_parts.cc3
-rw-r--r--extensions/shell/browser/shell_content_browser_client.cc3
15 files changed, 608 insertions, 8 deletions
diff --git a/extensions/browser/BUILD.gn b/extensions/browser/BUILD.gn
index 87d0fc9..4249704 100644
--- a/extensions/browser/BUILD.gn
+++ b/extensions/browser/BUILD.gn
@@ -304,6 +304,8 @@ source_set("browser") {
"extension_icon_image.h",
"extension_message_filter.cc",
"extension_message_filter.h",
+ "extension_network_delegate.cc",
+ "extension_network_delegate.h",
"extension_pref_store.cc",
"extension_pref_store.h",
"extension_pref_value_map.cc",
@@ -328,6 +330,8 @@ source_set("browser") {
"extension_system.h",
"extension_system_provider.cc",
"extension_system_provider.h",
+ "extension_url_request_context_getter.cc",
+ "extension_url_request_context_getter.h",
"extension_util.cc",
"extension_util.h",
"extension_web_contents_observer.cc",
diff --git a/extensions/browser/api/extensions_api_client.cc b/extensions/browser/api/extensions_api_client.cc
index 09faa2d..711f6c1 100644
--- a/extensions/browser/api/extensions_api_client.cc
+++ b/extensions/browser/api/extensions_api_client.cc
@@ -5,6 +5,7 @@
#include "extensions/browser/api/extensions_api_client.h"
#include "base/logging.h"
+#include "extensions/browser/api/web_request/web_request_event_router_delegate.h"
#include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest_delegate.h"
#include "extensions/browser/guest_view/web_view/web_view_permission_helper_delegate.h"
@@ -57,7 +58,7 @@ WebViewPermissionHelperDelegate* ExtensionsAPIClient::
WebRequestEventRouterDelegate*
ExtensionsAPIClient::CreateWebRequestEventRouterDelegate() const {
- return NULL;
+ return new WebRequestEventRouterDelegate();
}
scoped_refptr<ContentRulesRegistry>
diff --git a/extensions/browser/api/web_request/web_request_event_router_delegate.cc b/extensions/browser/api/web_request/web_request_event_router_delegate.cc
index d649c00..54ff080 100644
--- a/extensions/browser/api/web_request/web_request_event_router_delegate.cc
+++ b/extensions/browser/api/web_request/web_request_event_router_delegate.cc
@@ -4,6 +4,10 @@
#include "extensions/browser/api/web_request/web_request_event_router_delegate.h"
+#include "extensions/browser/api/web_request/web_request_api_constants.h"
+
+namespace keys = extension_web_request_api_constants;
+
namespace extensions {
WebRequestEventRouterDelegate::WebRequestEventRouterDelegate() {
@@ -11,6 +15,10 @@ WebRequestEventRouterDelegate::WebRequestEventRouterDelegate() {
WebRequestEventRouterDelegate::~WebRequestEventRouterDelegate() {
}
+void WebRequestEventRouterDelegate::ExtractExtraRequestDetails(
+ net::URLRequest* request, base::DictionaryValue* out){
+ out->SetInteger(keys::kTabIdKey, -1);
+}
bool WebRequestEventRouterDelegate::OnGetMatchingListenersImplCheck(
int tab_id, int window_id, net::URLRequest* request) {
diff --git a/extensions/browser/api/web_request/web_request_event_router_delegate.h b/extensions/browser/api/web_request/web_request_event_router_delegate.h
index 8bd33f1..7ed2614 100644
--- a/extensions/browser/api/web_request/web_request_event_router_delegate.h
+++ b/extensions/browser/api/web_request/web_request_event_router_delegate.h
@@ -34,7 +34,7 @@ class WebRequestEventRouterDelegate {
// Looks up the tab and window ID for a given request.
// Called on the IO thread.
virtual void ExtractExtraRequestDetails(
- net::URLRequest* request, base::DictionaryValue* out) = 0;
+ net::URLRequest* request, base::DictionaryValue* out);
// Called to check extra parameters (e.g., tab_id, windown_id) when filtering
// event listeners.
@@ -48,7 +48,7 @@ class WebRequestEventRouterDelegate {
const std::string& extension_id,
const GURL& url,
const std::string& api_call,
- scoped_ptr<base::DictionaryValue> details) = 0;
+ scoped_ptr<base::DictionaryValue> details) {};
DISALLOW_COPY_AND_ASSIGN(WebRequestEventRouterDelegate);
};
diff --git a/extensions/browser/extension_network_delegate.cc b/extensions/browser/extension_network_delegate.cc
new file mode 100644
index 0000000..50516df
--- /dev/null
+++ b/extensions/browser/extension_network_delegate.cc
@@ -0,0 +1,132 @@
+// Copyright 2014 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 "extensions/browser/extension_network_delegate.h"
+
+#include "content/public/browser/render_frame_host.h"
+#include "content/public/browser/resource_request_info.h"
+#include "extensions/browser/api/web_request/web_request_api.h"
+#include "extensions/browser/extension_system.h"
+#include "extensions/browser/extensions_browser_client.h"
+#include "extensions/browser/process_manager.h"
+#include "net/url_request/url_request.h"
+
+namespace extensions {
+
+namespace {
+bool g_accept_all_cookies = true;
+}
+
+ExtensionNetworkDelegate::ExtensionNetworkDelegate(
+ void* browser_context, InfoMap* extension_info_map) {
+ browser_context_ = browser_context;
+ extension_info_map_ = extension_info_map;
+}
+
+ExtensionNetworkDelegate::~ExtensionNetworkDelegate() {}
+
+void ExtensionNetworkDelegate::SetAcceptAllCookies(bool accept) {
+ g_accept_all_cookies = accept;
+}
+
+int ExtensionNetworkDelegate::OnBeforeURLRequest(
+ net::URLRequest* request,
+ const net::CompletionCallback& callback,
+ GURL* new_url) {
+ return ExtensionWebRequestEventRouter::GetInstance()->OnBeforeRequest(
+ browser_context_, extension_info_map_.get(), request, callback, new_url);
+}
+
+int ExtensionNetworkDelegate::OnBeforeSendHeaders(
+ net::URLRequest* request,
+ const net::CompletionCallback& callback,
+ net::HttpRequestHeaders* headers) {
+ return ExtensionWebRequestEventRouter::GetInstance()->OnBeforeSendHeaders(
+ browser_context_, extension_info_map_.get(), request, callback, headers);
+}
+
+void ExtensionNetworkDelegate::OnSendHeaders(
+ net::URLRequest* request,
+ const net::HttpRequestHeaders& headers) {
+ ExtensionWebRequestEventRouter::GetInstance()->OnSendHeaders(
+ browser_context_, extension_info_map_.get(), request, headers);
+}
+
+int ExtensionNetworkDelegate::OnHeadersReceived(
+ net::URLRequest* request,
+ const net::CompletionCallback& callback,
+ const net::HttpResponseHeaders* original_response_headers,
+ scoped_refptr<net::HttpResponseHeaders>* override_response_headers,
+ GURL* allowed_unsafe_redirect_url) {
+ return ExtensionWebRequestEventRouter::GetInstance()->OnHeadersReceived(
+ browser_context_,
+ extension_info_map_.get(),
+ request,
+ callback,
+ original_response_headers,
+ override_response_headers,
+ allowed_unsafe_redirect_url);
+}
+
+void ExtensionNetworkDelegate::OnBeforeRedirect(
+ net::URLRequest* request,
+ const GURL& new_location) {
+ ExtensionWebRequestEventRouter::GetInstance()->OnBeforeRedirect(
+ browser_context_, extension_info_map_.get(), request, new_location);
+}
+
+
+void ExtensionNetworkDelegate::OnResponseStarted(
+ net::URLRequest* request) {
+ ExtensionWebRequestEventRouter::GetInstance()->OnResponseStarted(
+ browser_context_, extension_info_map_.get(), request);
+}
+
+void ExtensionNetworkDelegate::OnCompleted(
+ net::URLRequest* request,
+ bool started) {
+ if (request->status().status() == net::URLRequestStatus::SUCCESS) {
+ bool is_redirect = request->response_headers() &&
+ net::HttpResponseHeaders::IsRedirectResponseCode(
+ request->response_headers()->response_code());
+ if (!is_redirect) {
+ ExtensionWebRequestEventRouter::GetInstance()->OnCompleted(
+ browser_context_, extension_info_map_.get(), request);
+ }
+ return;
+ }
+
+ if (request->status().status() == net::URLRequestStatus::FAILED ||
+ request->status().status() == net::URLRequestStatus::CANCELED) {
+ ExtensionWebRequestEventRouter::GetInstance()->OnErrorOccurred(
+ browser_context_, extension_info_map_.get(), request, started);
+ return;
+ }
+
+ NOTREACHED();
+}
+
+void ExtensionNetworkDelegate::OnURLRequestDestroyed(
+ net::URLRequest* request) {
+ ExtensionWebRequestEventRouter::GetInstance()->OnURLRequestDestroyed(
+ browser_context_, request);
+}
+
+void ExtensionNetworkDelegate::OnPACScriptError(
+ int line_number,
+ const base::string16& error) {
+}
+
+net::NetworkDelegate::AuthRequiredResponse
+ExtensionNetworkDelegate::OnAuthRequired(
+ net::URLRequest* request,
+ const net::AuthChallengeInfo& auth_info,
+ const AuthCallback& callback,
+ net::AuthCredentials* credentials) {
+ return ExtensionWebRequestEventRouter::GetInstance()->OnAuthRequired(
+ browser_context_, extension_info_map_.get(), request, auth_info, callback,
+ credentials);
+}
+
+} // namespace extensions
diff --git a/extensions/browser/extension_network_delegate.h b/extensions/browser/extension_network_delegate.h
new file mode 100644
index 0000000..e27707b
--- /dev/null
+++ b/extensions/browser/extension_network_delegate.h
@@ -0,0 +1,60 @@
+// Copyright 2014 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.
+
+#ifndef EXTENSIONS_BROWSER_EXTENSION_NETNETWORK_DELEGATE_H_
+#define EXTENSIONS_BROWSER_EXTENSION_NETNETWORK_DELEGATE_H_
+
+#include "extensions/browser/info_map.h"
+#include "net/base/network_delegate.h"
+
+namespace extensions {
+
+class InfoMap;
+
+class ExtensionNetworkDelegate : public net::NetworkDelegate {
+ public:
+ explicit ExtensionNetworkDelegate(
+ void* browser_context, InfoMap* extension_info_map);
+ virtual ~ExtensionNetworkDelegate();
+
+ static void SetAcceptAllCookies(bool accept);
+
+ private:
+ // NetworkDelegate implementation.
+ virtual int OnBeforeURLRequest(net::URLRequest* request,
+ const net::CompletionCallback& callback,
+ GURL* new_url) OVERRIDE;
+ virtual int OnBeforeSendHeaders(net::URLRequest* request,
+ const net::CompletionCallback& callback,
+ net::HttpRequestHeaders* headers) OVERRIDE;
+ virtual void OnSendHeaders(net::URLRequest* request,
+ const net::HttpRequestHeaders& headers) OVERRIDE;
+ virtual int OnHeadersReceived(
+ net::URLRequest* request,
+ const net::CompletionCallback& callback,
+ const net::HttpResponseHeaders* original_response_headers,
+ scoped_refptr<net::HttpResponseHeaders>* override_response_headers,
+ GURL* allowed_unsafe_redirect_url) OVERRIDE;
+ virtual void OnBeforeRedirect(net::URLRequest* request,
+ const GURL& new_location) OVERRIDE;
+ virtual void OnResponseStarted(net::URLRequest* request) OVERRIDE;
+ virtual void OnCompleted(net::URLRequest* request, bool started) OVERRIDE;
+ virtual void OnURLRequestDestroyed(net::URLRequest* request) OVERRIDE;
+ virtual void OnPACScriptError(int line_number,
+ const base::string16& error) OVERRIDE;
+ virtual net::NetworkDelegate::AuthRequiredResponse OnAuthRequired(
+ net::URLRequest* request,
+ const net::AuthChallengeInfo& auth_info,
+ const AuthCallback& callback,
+ net::AuthCredentials* credentials) OVERRIDE;
+
+ void* browser_context_;
+ scoped_refptr<extensions::InfoMap> extension_info_map_;
+
+ DISALLOW_COPY_AND_ASSIGN(ExtensionNetworkDelegate);
+};
+
+} // namespace extensions
+
+#endif // EXTENSIONS_BROWSER_EXTENSION_NETNETWORK_DELEGATE_H_
diff --git a/extensions/browser/extension_url_request_context_getter.cc b/extensions/browser/extension_url_request_context_getter.cc
new file mode 100644
index 0000000..78826d1
--- /dev/null
+++ b/extensions/browser/extension_url_request_context_getter.cc
@@ -0,0 +1,250 @@
+// Copyright 2014 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 "extensions/browser/extension_url_request_context_getter.h"
+
+#include "base/command_line.h"
+#include "base/logging.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/string_split.h"
+#include "base/strings/string_util.h"
+#include "base/threading/sequenced_worker_pool.h"
+#include "base/threading/worker_pool.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/cookie_store_factory.h"
+#include "content/public/browser/resource_request_info.h"
+#include "content/public/common/content_switches.h"
+#include "extensions/browser/extension_network_delegate.h"
+#include "extensions/browser/info_map.h"
+#include "extensions/common/constants.h"
+#include "extensions/common/switches.h"
+#include "net/base/cache_type.h"
+#include "net/cert/cert_verifier.h"
+#include "net/cookies/cookie_monster.h"
+#include "net/dns/host_resolver.h"
+#include "net/dns/mapped_host_resolver.h"
+#include "net/http/http_auth_handler_factory.h"
+#include "net/http/http_cache.h"
+#include "net/http/http_network_session.h"
+#include "net/http/http_server_properties_impl.h"
+#include "net/http/transport_security_state.h"
+#include "net/proxy/proxy_service.h"
+#include "net/ssl/channel_id_service.h"
+#include "net/ssl/default_channel_id_store.h"
+#include "net/ssl/ssl_config_service_defaults.h"
+#include "net/url_request/data_protocol_handler.h"
+#include "net/url_request/file_protocol_handler.h"
+#include "net/url_request/static_http_user_agent_settings.h"
+#include "net/url_request/url_request_context.h"
+#include "net/url_request/url_request_context_storage.h"
+#include "net/url_request/url_request_intercepting_job_factory.h"
+#include "net/url_request/url_request_job_factory_impl.h"
+#include "url/url_constants.h"
+
+namespace extensions {
+
+namespace {
+void InstallProtocolHandlers(net::URLRequestJobFactoryImpl* job_factory,
+ content::ProtocolHandlerMap* protocol_handlers) {
+ for (content::ProtocolHandlerMap::iterator it =
+ protocol_handlers->begin();
+ it != protocol_handlers->end();
+ ++it) {
+ bool set_protocol = job_factory->SetProtocolHandler(
+ it->first, it->second.release());
+ DCHECK(set_protocol);
+ }
+ protocol_handlers->clear();
+}
+
+} // namespace
+
+ExtensionURLRequestContextGetter::ExtensionURLRequestContextGetter(
+ void* browser_context,
+ bool ignore_certificate_errors,
+ const base::FilePath& base_path,
+ base::MessageLoop* io_loop,
+ base::MessageLoop* file_loop,
+ content::ProtocolHandlerMap* protocol_handlers,
+ content::URLRequestInterceptorScopedVector request_interceptors,
+ net::NetLog* net_log,
+ InfoMap* extension_info_map)
+ : browser_context_(browser_context),
+ ignore_certificate_errors_(ignore_certificate_errors),
+ base_path_(base_path),
+ io_loop_(io_loop),
+ file_loop_(file_loop),
+ net_log_(net_log),
+ extension_info_map_(extension_info_map),
+ request_interceptors_(request_interceptors.Pass()) {
+ // Must first be created on the UI thread.
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
+ std::swap(protocol_handlers_, *protocol_handlers);
+
+ // We must create the proxy config service on the UI loop on Linux because it
+ // must synchronously run on the glib message loop. This will be passed to
+ // the URLRequestContextStorage on the IO thread in GetURLRequestContext().
+ if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) {
+ proxy_config_service_.reset(
+ net::ProxyService::CreateSystemProxyConfigService(
+ io_loop_->message_loop_proxy(), file_loop_->message_loop_proxy()));
+ }
+}
+
+ExtensionURLRequestContextGetter::~ExtensionURLRequestContextGetter() {
+}
+
+net::URLRequestContext*
+ExtensionURLRequestContextGetter::GetURLRequestContext() {
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
+
+ if (!url_request_context_) {
+ const CommandLine& command_line = *CommandLine::ForCurrentProcess();
+
+ url_request_context_.reset(new net::URLRequestContext());
+ url_request_context_->set_net_log(net_log_);
+ network_delegate_.reset(
+ new ExtensionNetworkDelegate(browser_context_, extension_info_map_));
+ if (command_line.HasSwitch(switches::kDumpRenderTree))
+ ExtensionNetworkDelegate::SetAcceptAllCookies(false);
+ url_request_context_->set_network_delegate(network_delegate_.get());
+ storage_.reset(
+ new net::URLRequestContextStorage(url_request_context_.get()));
+ storage_->set_cookie_store(CreateCookieStore(content::CookieStoreConfig()));
+ storage_->set_channel_id_service(new net::ChannelIDService(
+ new net::DefaultChannelIDStore(NULL),
+ base::WorkerPool::GetTaskRunner(true)));
+
+ scoped_ptr<net::HostResolver> host_resolver(
+ net::HostResolver::CreateDefaultResolver(
+ url_request_context_->net_log()));
+
+ storage_->set_cert_verifier(net::CertVerifier::CreateDefault());
+ storage_->set_transport_security_state(new net::TransportSecurityState);
+ if (command_line.HasSwitch(switches::kDumpRenderTree)) {
+ storage_->set_proxy_service(net::ProxyService::CreateDirect());
+ } else {
+ // TODO(jam): use v8 if possible, look at chrome code.
+ storage_->set_proxy_service(
+ net::ProxyService::CreateUsingSystemProxyResolver(
+ proxy_config_service_.release(),
+ 0,
+ url_request_context_->net_log()));
+ }
+ storage_->set_ssl_config_service(new net::SSLConfigServiceDefaults);
+ storage_->set_http_auth_handler_factory(
+ net::HttpAuthHandlerFactory::CreateDefault(host_resolver.get()));
+ storage_->set_http_server_properties(
+ scoped_ptr<net::HttpServerProperties>(
+ new net::HttpServerPropertiesImpl()));
+
+ base::FilePath cache_path = base_path_.Append(FILE_PATH_LITERAL("Cache"));
+ net::HttpCache::DefaultBackend* main_backend =
+ new net::HttpCache::DefaultBackend(
+ net::DISK_CACHE,
+#if defined(OS_ANDROID)
+ // TODO(rdsmith): Remove when default backend for Android is
+ // changed to simple cache.
+ net::CACHE_BACKEND_SIMPLE,
+#else
+ net::CACHE_BACKEND_DEFAULT,
+#endif
+ cache_path,
+ 0,
+ content::BrowserThread::GetMessageLoopProxyForThread(
+ content::BrowserThread::CACHE));
+
+ net::HttpNetworkSession::Params network_session_params;
+ network_session_params.cert_verifier =
+ url_request_context_->cert_verifier();
+ network_session_params.transport_security_state =
+ url_request_context_->transport_security_state();
+ network_session_params.channel_id_service =
+ url_request_context_->channel_id_service();
+ network_session_params.proxy_service =
+ url_request_context_->proxy_service();
+ network_session_params.ssl_config_service =
+ url_request_context_->ssl_config_service();
+ network_session_params.http_auth_handler_factory =
+ url_request_context_->http_auth_handler_factory();
+ network_session_params.network_delegate =
+ network_delegate_.get();
+ network_session_params.http_server_properties =
+ url_request_context_->http_server_properties();
+ network_session_params.net_log =
+ url_request_context_->net_log();
+ network_session_params.ignore_certificate_errors =
+ ignore_certificate_errors_;
+ if (command_line.HasSwitch(::switches::kTestingFixedHttpPort)) {
+ int value;
+ base::StringToInt(command_line.GetSwitchValueASCII(
+ ::switches::kTestingFixedHttpPort), &value);
+ network_session_params.testing_fixed_http_port = value;
+ }
+ if (command_line.HasSwitch(::switches::kTestingFixedHttpsPort)) {
+ int value;
+ base::StringToInt(command_line.GetSwitchValueASCII(
+ ::switches::kTestingFixedHttpsPort), &value);
+ network_session_params.testing_fixed_https_port = value;
+ }
+ if (command_line.HasSwitch(::switches::kHostResolverRules)) {
+ scoped_ptr<net::MappedHostResolver> mapped_host_resolver(
+ new net::MappedHostResolver(host_resolver.Pass()));
+ mapped_host_resolver->SetRulesFromString(
+ command_line.GetSwitchValueASCII(::switches::kHostResolverRules));
+ host_resolver = mapped_host_resolver.Pass();
+ }
+
+ // Give |storage_| ownership at the end in case it's |mapped_host_resolver|.
+ storage_->set_host_resolver(host_resolver.Pass());
+ network_session_params.host_resolver =
+ url_request_context_->host_resolver();
+
+ net::HttpCache* main_cache = new net::HttpCache(
+ network_session_params, main_backend);
+ storage_->set_http_transaction_factory(main_cache);
+
+ scoped_ptr<net::URLRequestJobFactoryImpl> job_factory(
+ new net::URLRequestJobFactoryImpl());
+ // Keep ProtocolHandlers added in sync with
+ // ShellContentBrowserClient::IsHandledURL().
+ InstallProtocolHandlers(job_factory.get(), &protocol_handlers_);
+ bool set_protocol = job_factory->SetProtocolHandler(
+ url::kDataScheme, new net::DataProtocolHandler);
+ DCHECK(set_protocol);
+#if !defined(DISABLE_FILE_SUPPORT)
+ set_protocol = job_factory->SetProtocolHandler(
+ url::kFileScheme,
+ new net::FileProtocolHandler(
+ content::BrowserThread::GetBlockingPool()->
+ GetTaskRunnerWithShutdownBehavior(
+ base::SequencedWorkerPool::SKIP_ON_SHUTDOWN)));
+ DCHECK(set_protocol);
+#endif
+
+ // Set up interceptors in the reverse order.
+ scoped_ptr<net::URLRequestJobFactory> top_job_factory =
+ job_factory.PassAs<net::URLRequestJobFactory>();
+ for (content::URLRequestInterceptorScopedVector::reverse_iterator i =
+ request_interceptors_.rbegin();
+ i != request_interceptors_.rend();
+ ++i) {
+ top_job_factory.reset(new net::URLRequestInterceptingJobFactory(
+ top_job_factory.Pass(), make_scoped_ptr(*i)));
+ }
+ request_interceptors_.weak_clear();
+
+ storage_->set_job_factory(top_job_factory.release());
+ }
+
+ return url_request_context_.get();
+}
+
+scoped_refptr<base::SingleThreadTaskRunner>
+ ExtensionURLRequestContextGetter::GetNetworkTaskRunner() const {
+ return content::BrowserThread::GetMessageLoopProxyForThread(
+ content::BrowserThread::IO);
+}
+
+} // namespace extensions
diff --git a/extensions/browser/extension_url_request_context_getter.h b/extensions/browser/extension_url_request_context_getter.h
new file mode 100644
index 0000000..b0cc68f7a
--- /dev/null
+++ b/extensions/browser/extension_url_request_context_getter.h
@@ -0,0 +1,72 @@
+// Copyright 2013 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.
+
+#ifndef EXTENSIONS_BROWSER_EXTENSION_URL_REQUEST_CONTEXT_GETTER_H_
+#define EXTENSIONS_BROWSER_EXTENSION_URL_REQUEST_CONTEXT_GETTER_H_
+
+#include "base/files/file_path.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_ptr.h"
+#include "content/public/browser/content_browser_client.h"
+#include "net/url_request/url_request_context_getter.h"
+#include "net/url_request/url_request_job_factory.h"
+
+namespace base {
+class MessageLoop;
+}
+
+namespace net {
+class NetworkDelegate;
+class NetLog;
+class ProxyConfigService;
+class URLRequestContextStorage;
+}
+
+namespace extensions {
+
+class InfoMap;
+
+class ExtensionURLRequestContextGetter : public net::URLRequestContextGetter {
+ public:
+ explicit ExtensionURLRequestContextGetter(
+ void* browser_context,
+ bool ignore_certificate_errors,
+ const base::FilePath& base_path,
+ base::MessageLoop* io_loop,
+ base::MessageLoop* file_loop,
+ content::ProtocolHandlerMap* protocol_handlers,
+ content::URLRequestInterceptorScopedVector request_interceptors,
+ net::NetLog* net_log,
+ InfoMap* extension_info_map);
+
+ // net::URLRequestContextGetter implementation.
+ virtual net::URLRequestContext* GetURLRequestContext() OVERRIDE;
+ virtual scoped_refptr<base::SingleThreadTaskRunner>
+ GetNetworkTaskRunner() const OVERRIDE;
+
+protected:
+ virtual ~ExtensionURLRequestContextGetter();
+private:
+ void* browser_context_;
+ bool ignore_certificate_errors_;
+ base::FilePath base_path_;
+ base::MessageLoop* io_loop_;
+ base::MessageLoop* file_loop_;
+ net::NetLog* net_log_;
+ InfoMap* extension_info_map_;
+
+ scoped_ptr<net::ProxyConfigService> proxy_config_service_;
+ scoped_ptr<net::NetworkDelegate> network_delegate_;
+ scoped_ptr<net::URLRequestContextStorage> storage_;
+ scoped_ptr<net::URLRequestContext> url_request_context_;
+ content::ProtocolHandlerMap protocol_handlers_;
+ content::URLRequestInterceptorScopedVector request_interceptors_;
+
+private:
+ DISALLOW_COPY_AND_ASSIGN(ExtensionURLRequestContextGetter);
+};
+
+} // namespace extensions
+
+#endif // EXTENSIONS_BROWSER_EXTENSION_URL_REQUEST_CONTEXT_GETTER_H_
diff --git a/extensions/common/switches.cc b/extensions/common/switches.cc
index 362630b..2477d53 100644
--- a/extensions/common/switches.cc
+++ b/extensions/common/switches.cc
@@ -19,6 +19,9 @@ const char kAllowLegacyExtensionManifests[] =
// Enables the <appview> tag in platform apps.
const char kAppView[] = "app-view";
+// Request pages to be dumped as text once they finished loading.
+const char kDumpRenderTree[] = "dump-render-tree";
+
// Enables extension options to be embedded in chrome://extensions rather than
// a new tab.
const char kEmbeddedExtensionOptions[] = "embedded-extension-options";
diff --git a/extensions/common/switches.h b/extensions/common/switches.h
index 1a110f2..81d17c2 100644
--- a/extensions/common/switches.h
+++ b/extensions/common/switches.h
@@ -14,6 +14,7 @@ namespace switches {
extern const char kAllowHTTPBackgroundPage[];
extern const char kAllowLegacyExtensionManifests[];
extern const char kAppView[];
+extern const char kDumpRenderTree[];
extern const char kEmbeddedExtensionOptions[];
extern const char kEnableAppsShowOnFirstPaint[];
extern const char kEnableAppView[];
diff --git a/extensions/extensions.gyp b/extensions/extensions.gyp
index 40279ba..92a3d30 100644
--- a/extensions/extensions.gyp
+++ b/extensions/extensions.gyp
@@ -572,6 +572,8 @@
'browser/extension_icon_image.h',
'browser/extension_message_filter.cc',
'browser/extension_message_filter.h',
+ 'browser/extension_network_delegate.cc',
+ 'browser/extension_network_delegate.h',
'browser/extension_pref_store.cc',
'browser/extension_pref_store.h',
'browser/extension_pref_value_map.cc',
@@ -596,6 +598,8 @@
'browser/extension_system.h',
'browser/extension_system_provider.cc',
'browser/extension_system_provider.h',
+ 'browser/extension_url_request_context_getter.cc',
+ 'browser/extension_url_request_context_getter.h',
'browser/extension_util.cc',
'browser/extension_util.h',
'browser/extension_web_contents_observer.cc',
diff --git a/extensions/shell/browser/shell_browser_context.cc b/extensions/shell/browser/shell_browser_context.cc
index 33a08e3..8659de1 100644
--- a/extensions/shell/browser/shell_browser_context.cc
+++ b/extensions/shell/browser/shell_browser_context.cc
@@ -4,16 +4,29 @@
#include "extensions/shell/browser/shell_browser_context.h"
+#include "base/command_line.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/common/content_switches.h"
+#include "extensions/browser/extension_network_delegate.h"
+#include "extensions/browser/extension_url_request_context_getter.h"
#include "extensions/browser/guest_view/guest_view_manager.h"
+#include "extensions/common/switches.h"
#include "extensions/shell/browser/shell_special_storage_policy.h"
namespace extensions {
// Create a normal recording browser context. If we used an incognito context
// then app_shell would also have to create a normal context and manage both.
-ShellBrowserContext::ShellBrowserContext()
+ShellBrowserContext::ShellBrowserContext(net::NetLog* net_log)
: content::ShellBrowserContext(false, NULL),
+ net_log_(net_log),
+ ignore_certificate_errors_(false),
storage_policy_(new ShellSpecialStoragePolicy) {
+ base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess();
+ if (cmd_line->HasSwitch(::switches::kIgnoreCertificateErrors) ||
+ cmd_line->HasSwitch(switches::kDumpRenderTree)) {
+ ignore_certificate_errors_ = true;
+ }
}
ShellBrowserContext::~ShellBrowserContext() {
@@ -27,6 +40,43 @@ storage::SpecialStoragePolicy* ShellBrowserContext::GetSpecialStoragePolicy() {
return storage_policy_.get();
}
+net::URLRequestContextGetter* ShellBrowserContext::CreateRequestContext(
+ content::ProtocolHandlerMap* protocol_handlers,
+ content::URLRequestInterceptorScopedVector request_interceptors,
+ InfoMap* extension_info_map) {
+ DCHECK(!url_request_context_getter_.get());
+ url_request_context_getter_ =
+ new extensions::ExtensionURLRequestContextGetter(
+ this,
+ ignore_certificate_errors_,
+ GetPath(),
+ content::BrowserThread::UnsafeGetMessageLoopForThread(
+ content::BrowserThread::IO),
+ content::BrowserThread::UnsafeGetMessageLoopForThread(
+ content::BrowserThread::FILE),
+ protocol_handlers,
+ request_interceptors.Pass(),
+ net_log_,
+ extension_info_map);
+ Init();
+ return url_request_context_getter_.get();
+}
+
+void ShellBrowserContext::Init(){
+ content:: BrowserThread:: PostTask(
+ content::BrowserThread::IO,
+ FROM_HERE,
+ base::Bind(
+ &ShellBrowserContext::InitializationOnIOThread,
+ base::Unretained(this)));
+}
+
+void ShellBrowserContext::InitializationOnIOThread() {
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
+
+ url_request_context_getter_->GetURLRequestContext();
+}
+
void ShellBrowserContext::ProfileFunctionCallOnNonProfileBrowserContext1() {
NOTREACHED();
}
diff --git a/extensions/shell/browser/shell_browser_context.h b/extensions/shell/browser/shell_browser_context.h
index 305ab2b7..4ec9078 100644
--- a/extensions/shell/browser/shell_browser_context.h
+++ b/extensions/shell/browser/shell_browser_context.h
@@ -10,21 +10,31 @@
#include "content/shell/browser/shell_browser_context.h"
#include "storage/browser/quota/special_storage_policy.h"
+namespace net {
+class NetLog;
+}
+
namespace extensions {
+class InfoMap;
class ShellSpecialStoragePolicy;
// The BrowserContext used by the content, apps and extensions systems in
// app_shell.
class ShellBrowserContext : public content::ShellBrowserContext {
public:
- ShellBrowserContext();
+ explicit ShellBrowserContext(net::NetLog* net_log);
virtual ~ShellBrowserContext();
// content::BrowserContext implementation.
virtual content::BrowserPluginGuestManager* GetGuestManager() OVERRIDE;
virtual storage::SpecialStoragePolicy* GetSpecialStoragePolicy() OVERRIDE;
+ net::URLRequestContextGetter* CreateRequestContext(
+ content::ProtocolHandlerMap* protocol_handlers,
+ content::URLRequestInterceptorScopedVector request_interceptors,
+ InfoMap* extension_info_map);
+
// HACK: Pad the virtual function table so we trip an assertion if someone
// tries to use |this| as a Profile.
virtual void ProfileFunctionCallOnNonProfileBrowserContext1();
@@ -44,7 +54,12 @@ class ShellBrowserContext : public content::ShellBrowserContext {
virtual void ProfileFunctionCallOnNonProfileBrowserContext15();
private:
+ void Init();
+ void InitializationOnIOThread();
+ net::NetLog* net_log_;
+ bool ignore_certificate_errors_;
scoped_refptr<storage::SpecialStoragePolicy> storage_policy_;
+ scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_;
DISALLOW_COPY_AND_ASSIGN(ShellBrowserContext);
};
diff --git a/extensions/shell/browser/shell_browser_main_parts.cc b/extensions/shell/browser/shell_browser_main_parts.cc
index 78feacd..717305b 100644
--- a/extensions/shell/browser/shell_browser_main_parts.cc
+++ b/extensions/shell/browser/shell_browser_main_parts.cc
@@ -17,6 +17,7 @@
#include "extensions/browser/browser_context_keyed_service_factories.h"
#include "extensions/browser/extension_system.h"
#include "extensions/common/constants.cc"
+#include "extensions/common/switches.h"
#include "extensions/shell/browser/shell_browser_context.h"
#include "extensions/shell/browser/shell_browser_main_delegate.h"
#include "extensions/shell/browser/shell_desktop_controller.h"
@@ -109,7 +110,7 @@ int ShellBrowserMainParts::PreCreateThreads() {
void ShellBrowserMainParts::PreMainMessageLoopRun() {
// Initialize our "profile" equivalent.
- browser_context_.reset(new ShellBrowserContext);
+ browser_context_.reset(new ShellBrowserContext(net_log_.get()));
aura::Env::GetInstance()->set_context_factory(content::GetContextFactory());
diff --git a/extensions/shell/browser/shell_content_browser_client.cc b/extensions/shell/browser/shell_content_browser_client.cc
index e4df6fb..e5da54b 100644
--- a/extensions/shell/browser/shell_content_browser_client.cc
+++ b/extensions/shell/browser/shell_content_browser_client.cc
@@ -113,9 +113,8 @@ net::URLRequestContextGetter* ShellContentBrowserClient::CreateRequestContext(
linked_ptr<net::URLRequestJobFactory::ProtocolHandler>(
CreateExtensionProtocolHandler(false /* is_incognito */,
extension_info_map));
- // Let content::ShellBrowserContext handle the rest of the setup.
return browser_main_parts_->browser_context()->CreateRequestContext(
- protocol_handlers, request_interceptors.Pass());
+ protocol_handlers, request_interceptors.Pass(), extension_info_map);
}
bool ShellContentBrowserClient::IsHandledURL(const GURL& url) {