Index: content/browser/renderer_host/resource_dispatcher_host_impl.cc |
=================================================================== |
--- content/browser/renderer_host/resource_dispatcher_host_impl.cc (revision 136397) |
+++ content/browser/renderer_host/resource_dispatcher_host_impl.cc (working copy) |
@@ -1234,6 +1234,11 @@ |
StartRequest(i->second); |
} |
+void ResourceDispatcherHostImpl::ResumeDeferredRequest(int child_id, |
+ int request_id) { |
+ PauseRequest(child_id, request_id, false); |
+} |
+ |
bool ResourceDispatcherHostImpl::WillSendData(int child_id, |
int request_id) { |
PendingRequestList::iterator i = pending_requests_.find( |
@@ -1258,38 +1263,6 @@ |
return true; |
} |
-void ResourceDispatcherHostImpl::PauseRequest(int child_id, |
- int request_id, |
- bool pause) { |
- GlobalRequestID global_id(child_id, request_id); |
- PendingRequestList::iterator i = pending_requests_.find(global_id); |
- if (i == pending_requests_.end()) { |
- DVLOG(1) << "Pausing a request that wasn't found"; |
- return; |
- } |
- |
- ResourceRequestInfoImpl* info = |
- ResourceRequestInfoImpl::ForRequest(i->second); |
- int pause_count = info->pause_count() + (pause ? 1 : -1); |
- if (pause_count < 0) { |
- NOTREACHED(); // Unbalanced call to pause. |
- return; |
- } |
- info->set_pause_count(pause_count); |
- |
- VLOG(1) << "To pause (" << pause << "): " << i->second->url().spec(); |
- |
- // If we're resuming, kick the request to start reading again. Run the read |
- // asynchronously to avoid recursion problems. |
- if (info->pause_count() == 0) { |
- MessageLoop::current()->PostTask(FROM_HERE, |
- base::Bind( |
- &ResourceDispatcherHostImpl::ResumeRequest, |
- weak_factory_.GetWeakPtr(), |
- global_id)); |
- } |
-} |
- |
int ResourceDispatcherHostImpl::GetOutstandingRequestsMemoryCost( |
int child_id) const { |
OutstandingRequestsMemoryCostMap::const_iterator entry = |
@@ -1597,8 +1570,17 @@ |
NotifyResponseStarted(request, info->GetChildID()); |
info->set_called_on_response_started(true); |
- return info->resource_handler()->OnResponseStarted(info->GetRequestID(), |
- response.get()); |
+ |
+ bool defer = false; |
+ if (!info->resource_handler()->OnResponseStarted(info->GetRequestID(), |
+ response.get(), |
+ &defer)) |
+ return false; |
+ |
+ if (defer) |
+ PauseRequest(info->GetChildID(), info->GetRequestID(), true); |
+ |
+ return true; |
} |
void ResourceDispatcherHostImpl::CancelRequest(int child_id, |
@@ -1786,6 +1768,38 @@ |
return info->is_paused(); |
} |
+void ResourceDispatcherHostImpl::PauseRequest(int child_id, |
+ int request_id, |
+ bool pause) { |
+ GlobalRequestID global_id(child_id, request_id); |
+ PendingRequestList::iterator i = pending_requests_.find(global_id); |
+ if (i == pending_requests_.end()) { |
+ DVLOG(1) << "Pausing a request that wasn't found"; |
+ return; |
+ } |
+ |
+ ResourceRequestInfoImpl* info = |
+ ResourceRequestInfoImpl::ForRequest(i->second); |
+ int pause_count = info->pause_count() + (pause ? 1 : -1); |
+ if (pause_count < 0) { |
+ NOTREACHED(); // Unbalanced call to pause. |
+ return; |
+ } |
+ info->set_pause_count(pause_count); |
+ |
+ VLOG(1) << "To pause (" << pause << "): " << i->second->url().spec(); |
+ |
+ // If we're resuming, kick the request to start reading again. Run the read |
+ // asynchronously to avoid recursion problems. |
+ if (info->pause_count() == 0) { |
+ MessageLoop::current()->PostTask(FROM_HERE, |
+ base::Bind( |
+ &ResourceDispatcherHostImpl::ResumeRequest, |
+ weak_factory_.GetWeakPtr(), |
+ global_id)); |
+ } |
+} |
+ |
void ResourceDispatcherHostImpl::ResumeRequest( |
const GlobalRequestID& request_id) { |
PendingRequestList::iterator i = pending_requests_.find(request_id); |
@@ -1927,12 +1941,17 @@ |
} |
ResourceRequestInfoImpl* info = ResourceRequestInfoImpl::ForRequest(request); |
+ |
+ bool defer = false; |
if (!info->resource_handler()->OnReadCompleted(info->GetRequestID(), |
- bytes_read)) { |
+ bytes_read, &defer)) { |
CancelRequestInternal(request, false); |
return false; |
} |
+ if (defer) |
+ PauseRequest(info->GetChildID(), info->GetRequestID(), true); |
+ |
return *bytes_read != 0; |
} |