Index: content/browser/renderer_host/buffered_resource_handler.cc |
=================================================================== |
--- content/browser/renderer_host/buffered_resource_handler.cc (revision 136397) |
+++ content/browser/renderer_host/buffered_resource_handler.cc (working copy) |
@@ -72,6 +72,7 @@ |
bytes_read_(0), |
sniff_content_(false), |
wait_for_plugins_(false), |
+ deferred_waiting_for_plugins_(false), |
buffering_(false), |
next_handler_needs_response_started_(false), |
next_handler_needs_will_read_(false), |
@@ -80,10 +81,17 @@ |
bool BufferedResourceHandler::OnResponseStarted( |
int request_id, |
- ResourceResponse* response) { |
+ ResourceResponse* response, |
+ bool* defer) { |
response_ = response; |
+ |
if (!DelayResponse()) |
- return CompleteResponseStarted(request_id); |
+ return CompleteResponseStarted(request_id, defer); |
+ |
+ if (wait_for_plugins_) { |
+ deferred_waiting_for_plugins_ = true; |
+ *defer = true; |
+ } |
return true; |
} |
@@ -107,9 +115,9 @@ |
if (finished_) |
return false; |
- if (!next_handler_->OnWillRead(request_id, buf, buf_size, min_size)) { |
+ if (!next_handler_->OnWillRead(request_id, buf, buf_size, min_size)) |
return false; |
- } |
+ |
read_buffer_ = *buf; |
read_buffer_size_ = *buf_size; |
DCHECK_GE(read_buffer_size_, net::kMaxBytesToSniff * 2); |
@@ -117,35 +125,38 @@ |
return true; |
} |
-bool BufferedResourceHandler::OnReadCompleted(int request_id, int* bytes_read) { |
- ResourceRequestInfoImpl* info = |
- ResourceRequestInfoImpl::ForRequest(request_); |
- |
+bool BufferedResourceHandler::OnReadCompleted(int request_id, int* bytes_read, |
+ bool* defer) { |
if (sniff_content_) { |
- if (KeepBuffering(*bytes_read)) |
+ if (KeepBuffering(*bytes_read)) { |
+ if (wait_for_plugins_) { |
+ deferred_waiting_for_plugins_ = true; |
+ *defer = true; |
+ } |
return true; |
+ } |
*bytes_read = bytes_read_; |
// Done buffering, send the pending ResponseStarted event. |
- if (!CompleteResponseStarted(request_id)) |
+ if (!CompleteResponseStarted(request_id, defer)) |
return false; |
- |
- // The next handler might have paused the request in OnResponseStarted. |
- if (info->pause_count()) |
+ if (*defer) |
return true; |
} else if (wait_for_plugins_) { |
+ deferred_waiting_for_plugins_ = true; |
+ *defer = true; |
return true; |
} |
- if (!ForwardPendingEventsToNextHandler(request_id)) |
+ if (!ForwardPendingEventsToNextHandler(request_id, defer)) |
return false; |
- if (info->pause_count()) |
+ if (*defer) |
return true; |
// Release the reference that we acquired at OnWillRead. |
read_buffer_ = NULL; |
- return next_handler_->OnReadCompleted(request_id, bytes_read); |
+ return next_handler_->OnReadCompleted(request_id, bytes_read, defer); |
} |
BufferedResourceHandler::~BufferedResourceHandler() {} |
@@ -243,7 +254,8 @@ |
return false; |
} |
-bool BufferedResourceHandler::CompleteResponseStarted(int request_id) { |
+bool BufferedResourceHandler::CompleteResponseStarted(int request_id, |
+ bool* defer) { |
ResourceRequestInfoImpl* info = |
ResourceRequestInfoImpl::ForRequest(request_); |
std::string mime_type; |
@@ -272,14 +284,13 @@ |
new X509UserCertResourceHandler(request_, |
info->GetChildID(), |
info->GetRouteID()); |
- if (!UseAlternateResourceHandler(request_id, x509_cert_handler)) |
+ if (!UseAlternateResourceHandler(request_id, x509_cert_handler, defer)) |
return false; |
} |
- |
// Check to see if we should forward the data from this request to the |
// download thread. |
// TODO(paulg): Only download if the context from the renderer allows it. |
- if (info->allow_download() && ShouldDownload(NULL)) { |
+ else if (info->allow_download() && ShouldDownload(NULL)) { |
Randy Smith (Not in Mondays)
2012/05/18 20:17:02
Suggestion (as I can't find any support for my pos
darin (slow to review)
2012/05/18 23:09:05
Yes, that can probably be done.
|
if (response_->headers && // Can be NULL if FTP. |
response_->headers->response_code() / 100 != 2) { |
// The response code indicates that this is an error page, but we don't |
@@ -303,14 +314,14 @@ |
DownloadSaveInfo(), |
DownloadResourceHandler::OnStartedCallback())); |
- if (!UseAlternateResourceHandler(request_id, handler)) |
+ if (!UseAlternateResourceHandler(request_id, handler, defer)) |
return false; |
} |
- if (info->pause_count()) |
+ if (*defer) |
return true; |
- return next_handler_->OnResponseStarted(request_id, response_); |
+ return next_handler_->OnResponseStarted(request_id, response_, defer); |
} |
bool BufferedResourceHandler::ShouldWaitForPlugins() { |
@@ -318,14 +329,11 @@ |
if (!ShouldDownload(&need_plugin_list) || !need_plugin_list) |
return false; |
- // We don't want to keep buffering as our buffer will fill up. |
- ResourceRequestInfoImpl* info = |
- ResourceRequestInfoImpl::ForRequest(request_); |
- host_->PauseRequest(info->GetChildID(), info->GetRequestID(), true); |
- |
// Get the plugins asynchronously. |
PluginServiceImpl::GetInstance()->GetPlugins( |
base::Bind(&BufferedResourceHandler::OnPluginsLoaded, this)); |
+ |
+ // We don't want to keep buffering as our buffer will fill up. |
Randy Smith (Not in Mondays)
2012/05/18 20:17:02
nit, suggestion: This comment feels a little stran
darin (slow to review)
2012/05/18 23:09:05
Agreed.
|
return true; |
} |
@@ -378,11 +386,14 @@ |
bool BufferedResourceHandler::UseAlternateResourceHandler( |
int request_id, |
- ResourceHandler* handler) { |
+ ResourceHandler* handler, |
+ bool* defer) { |
// Inform the original ResourceHandler that this will be handled entirely by |
// the new ResourceHandler. |
// TODO(darin): We should probably check the return values of these. |
- next_handler_->OnResponseStarted(request_id, response_); |
+ bool defer_ignored = false; |
+ next_handler_->OnResponseStarted(request_id, response_, &defer_ignored); |
+ DCHECK(!defer_ignored); |
Randy Smith (Not in Mondays)
2012/05/18 20:17:02
What's the rational for this?
darin (slow to review)
2012/05/18 23:09:05
The old code fails to handle pausing done by the o
Randy Smith (Not in Mondays)
2012/05/19 00:42:14
SG.
|
net::URLRequestStatus status(net::URLRequestStatus::HANDLED_EXTERNALLY, 0); |
next_handler_->OnResponseCompleted(request_id, status, std::string()); |
@@ -400,32 +411,24 @@ |
next_handler_needs_response_started_ = true; |
next_handler_needs_will_read_ = true; |
- return ForwardPendingEventsToNextHandler(request_id); |
+ return ForwardPendingEventsToNextHandler(request_id, defer); |
} |
bool BufferedResourceHandler::ForwardPendingEventsToNextHandler( |
- int request_id) { |
- ResourceRequestInfoImpl* info = |
- ResourceRequestInfoImpl::ForRequest(request_); |
- if (info->pause_count()) |
- return true; |
- |
+ int request_id, |
+ bool* defer) { |
Randy Smith (Not in Mondays)
2012/05/18 20:17:02
nit: Why two lines?
darin (slow to review)
2012/05/18 23:09:05
Looks like the first parameter actually fits on th
|
if (next_handler_needs_response_started_) { |
- if (!next_handler_->OnResponseStarted(request_id, response_)) |
+ if (!next_handler_->OnResponseStarted(request_id, response_, defer)) |
return false; |
- // If the request was paused during OnResponseStarted, we need to avoid |
+ // If the request was deferred during OnResponseStarted, we need to avoid |
// calling OnResponseStarted again. |
next_handler_needs_response_started_ = false; |
- if (info->pause_count()) |
+ if (*defer) |
return true; |
} |
if (next_handler_needs_will_read_) { |
CopyReadBufferToNextHandler(request_id); |
- // If the request was paused during OnWillRead, we need to be sure to try |
- // calling OnWillRead again. |
- if (info->pause_count()) |
- return true; |
next_handler_needs_will_read_ = false; |
} |
return true; |
@@ -445,6 +448,9 @@ |
void BufferedResourceHandler::OnPluginsLoaded( |
const std::vector<webkit::WebPluginInfo>& plugins) { |
+ bool needs_resume = deferred_waiting_for_plugins_; |
+ deferred_waiting_for_plugins_ = false; |
+ |
wait_for_plugins_ = false; |
if (!request_) |
return; |
@@ -454,9 +460,12 @@ |
int child_id = info->GetChildID(); |
int request_id = info->GetRequestID(); |
- host_->PauseRequest(child_id, request_id, false); |
- if (!CompleteResponseStarted(request_id)) |
+ bool defer = false; |
+ if (!CompleteResponseStarted(request_id, &defer)) { |
host_->CancelRequest(child_id, request_id, false); |
+ } else if (!defer && needs_resume) { |
+ host_->ResumeDeferredRequest(child_id, request_id); |
+ } |
} |
} // namespace content |