diff options
-rw-r--r-- | extensions/browser/BUILD.gn | 4 | ||||
-rw-r--r-- | extensions/browser/api/extensions_api_client.cc | 3 | ||||
-rw-r--r-- | extensions/browser/api/web_request/web_request_event_router_delegate.cc | 8 | ||||
-rw-r--r-- | extensions/browser/api/web_request/web_request_event_router_delegate.h | 4 | ||||
-rw-r--r-- | extensions/browser/extension_network_delegate.cc | 132 | ||||
-rw-r--r-- | extensions/browser/extension_network_delegate.h | 60 | ||||
-rw-r--r-- | extensions/browser/extension_url_request_context_getter.cc | 250 | ||||
-rw-r--r-- | extensions/browser/extension_url_request_context_getter.h | 72 | ||||
-rw-r--r-- | extensions/common/switches.cc | 3 | ||||
-rw-r--r-- | extensions/common/switches.h | 1 | ||||
-rw-r--r-- | extensions/extensions.gyp | 4 | ||||
-rw-r--r-- | extensions/shell/browser/shell_browser_context.cc | 52 | ||||
-rw-r--r-- | extensions/shell/browser/shell_browser_context.h | 17 | ||||
-rw-r--r-- | extensions/shell/browser/shell_browser_main_parts.cc | 3 | ||||
-rw-r--r-- | extensions/shell/browser/shell_content_browser_client.cc | 3 |
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) { |