diff options
author | ukai@chromium.org <ukai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-11-12 08:24:29 +0000 |
---|---|---|
committer | ukai@chromium.org <ukai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-11-12 08:24:29 +0000 |
commit | 40bb792afc009fd48bbee505b3a953309666ae08 (patch) | |
tree | b7423d1b40520f6197b1372fd5f739d51d18a3bf /chrome | |
parent | b7266221e8752f241fe78b191eca5a69ddb574e6 (diff) | |
download | chromium_src-40bb792afc009fd48bbee505b3a953309666ae08.zip chromium_src-40bb792afc009fd48bbee505b3a953309666ae08.tar.gz chromium_src-40bb792afc009fd48bbee505b3a953309666ae08.tar.bz2 |
Fix DCHECK in WebSocketExperimentTask.
Don't run experiment task if there are not request context ready yet.
BUG=27491
TEST=none
Review URL: http://codereview.chromium.org/384076
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@31776 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/net/websocket_experiment/websocket_experiment_task.cc | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/chrome/browser/net/websocket_experiment/websocket_experiment_task.cc b/chrome/browser/net/websocket_experiment/websocket_experiment_task.cc index a988008..02942af 100644 --- a/chrome/browser/net/websocket_experiment/websocket_experiment_task.cc +++ b/chrome/browser/net/websocket_experiment/websocket_experiment_task.cc @@ -17,7 +17,11 @@ URLFetcher* WebSocketExperimentTask::Context::CreateURLFetcher( const Config& config, URLFetcher::Delegate* delegate) { URLRequestContextGetter* getter = Profile::GetDefaultRequestContext(); - DCHECK(getter); + // Profile::GetDefaultRequestContext() is initialized lazily, on the UI + // thread. So here, where we access it from the IO thread, if the task runs + // before it has gotten lazily initialized yet. + if (!getter) + return NULL; DLOG(INFO) << "url=" << config.http_url; URLFetcher* fetcher = new URLFetcher(config.http_url, URLFetcher::GET, delegate); @@ -32,7 +36,11 @@ net::WebSocket* WebSocketExperimentTask::Context::CreateWebSocket( const Config& config, net::WebSocketDelegate* delegate) { URLRequestContextGetter* getter = Profile::GetDefaultRequestContext(); - DCHECK(getter); + // Profile::GetDefaultRequestContext() is initialized lazily, on the UI + // thread. So here, where we access it from the IO thread, if the task runs + // before it has gotten lazily initialized yet. + if (!getter) + return NULL; net::WebSocket::Request* request( new net::WebSocket::Request(config.url, config.ws_protocol, @@ -219,10 +227,16 @@ void WebSocketExperimentTask::DoLoop(int result) { } int WebSocketExperimentTask::DoURLFetch() { - next_state_ = STATE_URL_FETCH_COMPLETE; DCHECK(!url_fetcher_.get()); url_fetcher_.reset(context_->CreateURLFetcher(config_, this)); + if (!url_fetcher_.get()) { + // Request context is not ready. + next_state_ = STATE_NONE; + return net::ERR_UNEXPECTED; + } + + next_state_ = STATE_URL_FETCH_COMPLETE; SetTimeout(config_.url_fetch_deadline_ms); DLOG(INFO) << "URLFetch url=" << url_fetcher_->url() << " timeout=" << config_.url_fetch_deadline_ms; @@ -245,8 +259,13 @@ int WebSocketExperimentTask::DoURLFetchComplete(int result) { int WebSocketExperimentTask::DoWebSocketConnect() { DCHECK(!websocket_); - next_state_ = STATE_WEBSOCKET_CONNECT_COMPLETE; websocket_ = context_->CreateWebSocket(config_, this); + if (!websocket_) { + // Request context is not ready. + next_state_ = STATE_NONE; + return net::ERR_UNEXPECTED; + } + next_state_ = STATE_WEBSOCKET_CONNECT_COMPLETE; websocket_connect_start_time_ = base::TimeTicks::Now(); websocket_->Connect(); |