| Index: chrome/browser/renderer_host/resource_dispatcher_host.cc
|
| ===================================================================
|
| --- chrome/browser/renderer_host/resource_dispatcher_host.cc (revision 7403)
|
| +++ chrome/browser/renderer_host/resource_dispatcher_host.cc (working copy)
|
| @@ -136,6 +136,23 @@
|
| ResourceDispatcherHost::~ResourceDispatcherHost() {
|
| AsyncResourceHandler::GlobalCleanup();
|
| STLDeleteValues(&pending_requests_);
|
| +
|
| + // Clear blocked requests if any left.
|
| + // Note that we have to do this in 2 passes as we cannot call
|
| + // CancelBlockedRequestsForRenderView while iterating over
|
| + // blocked_requests_map_, as it modifies it.
|
| + std::set<ProcessRendererIDs> ids;
|
| + for (BlockedRequestMap::const_iterator iter = blocked_requests_map_.begin();
|
| + iter != blocked_requests_map_.end(); ++iter) {
|
| + std::pair<std::set<ProcessRendererIDs>::iterator, bool> result =
|
| + ids.insert(iter->first);
|
| + // We should not have duplicates.
|
| + DCHECK(result.second);
|
| + }
|
| + for (std::set<ProcessRendererIDs>::const_iterator iter = ids.begin();
|
| + iter != ids.end(); ++iter) {
|
| + CancelBlockedRequestsForRenderView(iter->first, iter->second);
|
| + }
|
| }
|
|
|
| void ResourceDispatcherHost::Initialize() {
|
| @@ -611,6 +628,31 @@
|
| if (iter != pending_requests_.end())
|
| RemovePendingRequest(iter);
|
| }
|
| +
|
| + // Now deal with blocked requests if any.
|
| + if (render_view_id != -1) {
|
| + if (blocked_requests_map_.find(std::pair<int, int>(render_process_host_id,
|
| + render_view_id)) !=
|
| + blocked_requests_map_.end()) {
|
| + CancelBlockedRequestsForRenderView(render_process_host_id,
|
| + render_view_id);
|
| + }
|
| + } else {
|
| + // We have to do all render views for the process |render_process_host_id|.
|
| + // Note that we have to do this in 2 passes as we cannot call
|
| + // CancelBlockedRequestsForRenderView while iterating over
|
| + // blocked_requests_map_, as it modifies it.
|
| + std::set<int> render_view_ids;
|
| + for (BlockedRequestMap::const_iterator iter = blocked_requests_map_.begin();
|
| + iter != blocked_requests_map_.end(); ++iter) {
|
| + if (iter->first.first == render_process_host_id)
|
| + render_view_ids.insert(iter->first.second);
|
| + }
|
| + for (std::set<int>::const_iterator iter = render_view_ids.begin();
|
| + iter != render_view_ids.end(); ++iter) {
|
| + CancelBlockedRequestsForRenderView(render_process_host_id, *iter);
|
| + }
|
| + }
|
| }
|
|
|
| // Cancels the request and removes it from the list.
|
| @@ -779,6 +821,16 @@
|
| void ResourceDispatcherHost::BeginRequestInternal(URLRequest* request,
|
| bool mixed_content) {
|
| ExtraRequestInfo* info = ExtraInfoForRequest(request);
|
| +
|
| + std::pair<int, int> pair_id(info->render_process_host_id,
|
| + info->render_view_id);
|
| + BlockedRequestMap::const_iterator iter = blocked_requests_map_.find(pair_id);
|
| + if (iter != blocked_requests_map_.end()) {
|
| + // The request should be blocked.
|
| + iter->second->push_back(BlockedRequest(request, mixed_content));
|
| + return;
|
| + }
|
| +
|
| GlobalRequestID global_id(info->render_process_host_id, info->request_id);
|
| pending_requests_[global_id] = request;
|
| if (mixed_content) {
|
| @@ -1215,3 +1267,54 @@
|
| info->last_upload_position = position;
|
| }
|
| }
|
| +
|
| +void ResourceDispatcherHost::BlockRequestsForRenderView(
|
| + int render_process_host_id,
|
| + int render_view_id) {
|
| + std::pair<int, int> key(render_process_host_id, render_view_id);
|
| + DCHECK(blocked_requests_map_.find(key) == blocked_requests_map_.end()) <<
|
| + "BlockRequestsForRenderView called multiple time for the same RVH";
|
| + blocked_requests_map_[key] = new BlockedRequestsList();
|
| +}
|
| +
|
| +void ResourceDispatcherHost::ResumeBlockedRequestsForRenderView(
|
| + int render_process_host_id,
|
| + int render_view_id) {
|
| + ProcessBlockedRequestsForRenderView(render_process_host_id,
|
| + render_view_id, false);
|
| +}
|
| +
|
| +void ResourceDispatcherHost::CancelBlockedRequestsForRenderView(
|
| + int render_process_host_id,
|
| + int render_view_id) {
|
| + ProcessBlockedRequestsForRenderView(render_process_host_id,
|
| + render_view_id, true);
|
| +}
|
| +
|
| +void ResourceDispatcherHost::ProcessBlockedRequestsForRenderView(
|
| + int render_process_host_id,
|
| + int render_view_id,
|
| + bool cancel_requests) {
|
| + BlockedRequestMap::iterator iter =
|
| + blocked_requests_map_.find(std::pair<int, int>(render_process_host_id,
|
| + render_view_id));
|
| + if (iter == blocked_requests_map_.end()) {
|
| + NOTREACHED();
|
| + return;
|
| + }
|
| +
|
| + BlockedRequestsList* requests = iter->second;
|
| +
|
| + // Removing the vector from the map unblocks any subsequent requests.
|
| + blocked_requests_map_.erase(iter);
|
| +
|
| + for (BlockedRequestsList::iterator req_iter = requests->begin();
|
| + req_iter != requests->end(); ++req_iter) {
|
| + if (cancel_requests)
|
| + delete req_iter->url_request;
|
| + else
|
| + BeginRequestInternal(req_iter->url_request, req_iter->mixed_content);
|
| + }
|
| +
|
| + delete requests;
|
| +}
|
|
|