diff options
author | gunsch <gunsch@chromium.org> | 2015-04-21 12:12:02 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-04-21 19:12:13 +0000 |
commit | 3e32f30e87ac59351c01af0ec7d1e972298d3b29 (patch) | |
tree | 77a16447be2b59b239817db101eed9cdaed07181 /chromecast | |
parent | 02ab1e3b2b9e29efa0e8ceab37e5262fda51ef37 (diff) | |
download | chromium_src-3e32f30e87ac59351c01af0ec7d1e972298d3b29.zip chromium_src-3e32f30e87ac59351c01af0ec7d1e972298d3b29.tar.gz chromium_src-3e32f30e87ac59351c01af0ec7d1e972298d3b29.tar.bz2 |
Chromecast startup race: don't add filter before HostResolver exists.
HostResolver is on the I/O thread, which doesn't always have a chance
to run before filters are added. Get HostResolver from the I/O thread.
R=lcwu@chromium.org,byungchul@chromium.org
BUG=None, but the internal builders are failing
Review URL: https://codereview.chromium.org/1081673004
Cr-Commit-Position: refs/heads/master@{#326092}
Diffstat (limited to 'chromecast')
-rw-r--r-- | chromecast/browser/cast_content_browser_client.cc | 30 | ||||
-rw-r--r-- | chromecast/browser/cast_content_browser_client.h | 7 |
2 files changed, 33 insertions, 4 deletions
diff --git a/chromecast/browser/cast_content_browser_client.cc b/chromecast/browser/cast_content_browser_client.cc index 3234a59..beae0d3 100644 --- a/chromecast/browser/cast_content_browser_client.cc +++ b/chromecast/browser/cast_content_browser_client.cc @@ -40,6 +40,7 @@ #include "content/public/common/web_preferences.h" #include "gin/v8_initializer.h" #include "net/ssl/ssl_cert_request_info.h" +#include "net/url_request/url_request_context_getter.h" #include "ui/gl/gl_switches.h" #if defined(OS_ANDROID) @@ -74,22 +75,43 @@ content::BrowserMainParts* CastContentBrowserClient::CreateBrowserMainParts( void CastContentBrowserClient::RenderProcessWillLaunch( content::RenderProcessHost* host) { - scoped_refptr<content::BrowserMessageFilter> network_hints_message_filter( - new network_hints::NetworkHintsMessageFilter( - url_request_context_factory_->host_resolver())); - host->AddFilter(network_hints_message_filter.get()); #if !defined(OS_ANDROID) scoped_refptr<media::CmaMessageFilterHost> cma_message_filter( new media::CmaMessageFilterHost(host->GetID())); host->AddFilter(cma_message_filter.get()); #endif // !defined(OS_ANDROID) + // Forcibly trigger I/O-thread URLRequestContext initialization before + // getting HostResolver. + content::BrowserThread::PostTaskAndReplyWithResult( + content::BrowserThread::IO, FROM_HERE, + base::Bind(&net::URLRequestContextGetter::GetURLRequestContext, + base::Unretained( + url_request_context_factory_->GetSystemGetter())), + base::Bind(&CastContentBrowserClient::AddNetworkHintsMessageFilter, + base::Unretained(this), host->GetID())); + auto extra_filters = PlatformGetBrowserMessageFilters(); for (auto const& filter : extra_filters) { host->AddFilter(filter.get()); } } +void CastContentBrowserClient::AddNetworkHintsMessageFilter( + int render_process_id, net::URLRequestContext* context) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + + content::RenderProcessHost* host = + content::RenderProcessHost::FromID(render_process_id); + if (!host) + return; + + scoped_refptr<content::BrowserMessageFilter> network_hints_message_filter( + new network_hints::NetworkHintsMessageFilter( + url_request_context_factory_->host_resolver())); + host->AddFilter(network_hints_message_filter.get()); +} + net::URLRequestContextGetter* CastContentBrowserClient::CreateRequestContext( content::BrowserContext* browser_context, content::ProtocolHandlerMap* protocol_handlers, diff --git a/chromecast/browser/cast_content_browser_client.h b/chromecast/browser/cast_content_browser_client.h index c35bc2e..193a090 100644 --- a/chromecast/browser/cast_content_browser_client.h +++ b/chromecast/browser/cast_content_browser_client.h @@ -19,6 +19,10 @@ namespace content { class BrowserMessageFilter; } +namespace net { +class HostResolver; +} + namespace chromecast { namespace shell { @@ -99,6 +103,9 @@ class CastContentBrowserClient: public content::ContentBrowserClient { #endif // defined(OS_ANDROID) && defined(VIDEO_HOLE) private: + void AddNetworkHintsMessageFilter(int render_process_id, + net::URLRequestContext* context); + net::X509Certificate* SelectClientCertificateOnIOThread( GURL requesting_url, int render_process_id); |