summaryrefslogtreecommitdiffstats
path: root/chromecast
diff options
context:
space:
mode:
authorgunsch <gunsch@chromium.org>2015-04-21 12:12:02 -0700
committerCommit bot <commit-bot@chromium.org>2015-04-21 19:12:13 +0000
commit3e32f30e87ac59351c01af0ec7d1e972298d3b29 (patch)
tree77a16447be2b59b239817db101eed9cdaed07181 /chromecast
parent02ab1e3b2b9e29efa0e8ceab37e5262fda51ef37 (diff)
downloadchromium_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.cc30
-rw-r--r--chromecast/browser/cast_content_browser_client.h7
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);