Chromium Code Reviews| Index: content/browser/loader/resource_dispatcher_host_impl.cc |
| diff --git a/content/browser/loader/resource_dispatcher_host_impl.cc b/content/browser/loader/resource_dispatcher_host_impl.cc |
| index d69582ea2c130b7c7a3e3e89a5825c7db205de6a..cf5113bd73a128ccdcbca9405dd13b70cf311dca 100644 |
| --- a/content/browser/loader/resource_dispatcher_host_impl.cc |
| +++ b/content/browser/loader/resource_dispatcher_host_impl.cc |
| @@ -231,8 +231,10 @@ net::Error CallbackAndReturn( |
| return net_error; |
| } |
| -int BuildLoadFlagsForRequest(const ResourceHostMsg_Request& request_data, |
| - int child_id, bool is_sync_load) { |
| +int BuildLoadFlagsForRequest( |
| + const ResourceHostMsg_Request& request_data, |
| + int child_id, |
| + bool is_sync_load) { |
| int load_flags = request_data.load_flags; |
| // Although EV status is irrelevant to sub-frames and sub-resources, we have |
| @@ -702,6 +704,12 @@ void ResourceDispatcherHostImpl::DidReceiveRedirect(ResourceLoader* loader, |
| void ResourceDispatcherHostImpl::DidReceiveResponse(ResourceLoader* loader) { |
| ResourceRequestInfoImpl* info = loader->GetRequestInfo(); |
| + // There should be an entry in the map created when we dispatched the |
| + // request. |
| + GlobalRoutingID routing_id(info->GetGlobalRoutingID()); |
| + DCHECK(offline_policy_map_.end() != offline_policy_map_.find(routing_id)); |
| + offline_policy_map_[routing_id]-> |
| + UpdateStateForCompletedRequest(loader->request()->response_info()); |
| int render_process_id, render_view_id; |
| if (!info->GetAssociatedRenderView(&render_process_id, &render_view_id)) |
| @@ -789,17 +797,17 @@ void ResourceDispatcherHostImpl::OnShutdown() { |
| // Note that we have to do this in 2 passes as we cannot call |
| // CancelBlockedRequestsForRoute while iterating over |
| // blocked_loaders_map_, as it modifies it. |
| - std::set<ProcessRouteIDs> ids; |
| + std::set<GlobalRoutingID> ids; |
| for (BlockedLoadersMap::const_iterator iter = blocked_loaders_map_.begin(); |
| iter != blocked_loaders_map_.end(); ++iter) { |
| - std::pair<std::set<ProcessRouteIDs>::iterator, bool> result = |
| + std::pair<std::set<GlobalRoutingID>::iterator, bool> result = |
| ids.insert(iter->first); |
| // We should not have duplicates. |
| DCHECK(result.second); |
| } |
| - for (std::set<ProcessRouteIDs>::const_iterator iter = ids.begin(); |
| + for (std::set<GlobalRoutingID>::const_iterator iter = ids.begin(); |
| iter != ids.end(); ++iter) { |
| - CancelBlockedRequestsForRoute(iter->first, iter->second); |
| + CancelBlockedRequestsForRoute(iter->child_id, iter->route_id); |
| } |
| scheduler_.reset(); |
| @@ -936,6 +944,12 @@ void ResourceDispatcherHostImpl::BeginRequest( |
| int load_flags = |
| BuildLoadFlagsForRequest(request_data, child_id, is_sync_load); |
| + GlobalRoutingID id(child_id, route_id); |
| + if (!offline_policy_map_[id]) |
| + offline_policy_map_[id] = new OfflinePolicy(); |
| + load_flags |= offline_policy_map_[id]->GetAdditionalLoadFlags( |
| + load_flags, request_data.resource_type == ResourceType::MAIN_FRAME); |
| + |
| // Construct the request. |
| scoped_ptr<net::URLRequest> new_request; |
| net::URLRequest* request; |
| @@ -1351,7 +1365,7 @@ void ResourceDispatcherHostImpl::CancelRequestsForRoute(int child_id, |
| // Now deal with blocked requests if any. |
| if (route_id != -1) { |
| - if (blocked_loaders_map_.find(ProcessRouteIDs(child_id, route_id)) != |
| + if (blocked_loaders_map_.find(GlobalRoutingID(child_id, route_id)) != |
| blocked_loaders_map_.end()) { |
| CancelBlockedRequestsForRoute(child_id, route_id); |
| } |
| @@ -1363,14 +1377,18 @@ void ResourceDispatcherHostImpl::CancelRequestsForRoute(int child_id, |
| std::set<int> route_ids; |
| for (BlockedLoadersMap::const_iterator iter = blocked_loaders_map_.begin(); |
| iter != blocked_loaders_map_.end(); ++iter) { |
| - if (iter->first.first == child_id) |
| - route_ids.insert(iter->first.second); |
| + if (iter->first.child_id == child_id) |
| + route_ids.insert(iter->first.route_id); |
| } |
| for (std::set<int>::const_iterator iter = route_ids.begin(); |
| iter != route_ids.end(); ++iter) { |
| CancelBlockedRequestsForRoute(child_id, *iter); |
| } |
| } |
| + |
| + // Cleanup the offline state for the route. |
| + delete offline_policy_map_[GlobalRoutingID(child_id, route_id)]; |
|
darin (slow to review)
2013/04/18 05:03:02
nit: consider doing this with an iterator so you o
Randy Smith (Not in Mondays)
2013/04/18 20:04:57
Done.
|
| + offline_policy_map_.erase(GlobalRoutingID(child_id, route_id)); |
| } |
| // Cancels the request and removes it from the list. |
| @@ -1502,8 +1520,8 @@ void ResourceDispatcherHostImpl::BeginRequestInternal( |
| linked_ptr<ResourceLoader> loader( |
| new ResourceLoader(request.Pass(), handler.Pass(), this)); |
| - ProcessRouteIDs pair_id(info->GetChildID(), info->GetRouteID()); |
| - BlockedLoadersMap::const_iterator iter = blocked_loaders_map_.find(pair_id); |
| + GlobalRoutingID id(info->GetGlobalRoutingID()); |
| + BlockedLoadersMap::const_iterator iter = blocked_loaders_map_.find(id); |
| if (iter != blocked_loaders_map_.end()) { |
| // The request should be blocked. |
| iter->second->push_back(loader); |
| @@ -1565,8 +1583,8 @@ struct LoadInfo { |
| uint64 upload_size; |
| }; |
| -// Map from ProcessID+ViewID pair to LoadState |
| -typedef std::map<std::pair<int, int>, LoadInfo> LoadInfoMap; |
| +// Map from ProcessID+RouteID pair to LoadState |
| +typedef std::map<GlobalRoutingID, LoadInfo> LoadInfoMap; |
| // Used to marshal calls to LoadStateChanged from the IO to UI threads. We do |
| // them all as a single callback to avoid spamming the UI thread. |
| @@ -1574,7 +1592,7 @@ void LoadInfoUpdateCallback(const LoadInfoMap& info_map) { |
| LoadInfoMap::const_iterator i; |
| for (i = info_map.begin(); i != info_map.end(); ++i) { |
| RenderViewHostImpl* view = |
| - RenderViewHostImpl::FromID(i->first.first, i->first.second); |
| + RenderViewHostImpl::FromID(i->first.child_id, i->first.route_id); |
| if (view) // The view could be gone at this point. |
| view->LoadStateChanged(i->second.url, i->second.load_state, |
| i->second.upload_position, |
| @@ -1593,16 +1611,16 @@ void ResourceDispatcherHostImpl::UpdateLoadStates() { |
| // Determine the largest upload size of all requests |
| // in each View (good chance it's zero). |
| - std::map<std::pair<int, int>, uint64> largest_upload_size; |
| + std::map<GlobalRoutingID, uint64> largest_upload_size; |
| for (i = pending_loaders_.begin(); i != pending_loaders_.end(); ++i) { |
| net::URLRequest* request = i->second->request(); |
| ResourceRequestInfoImpl* info = i->second->GetRequestInfo(); |
| uint64 upload_size = request->GetUploadProgress().size(); |
| if (request->GetLoadState().state != net::LOAD_STATE_SENDING_REQUEST) |
| upload_size = 0; |
| - std::pair<int, int> key(info->GetChildID(), info->GetRouteID()); |
| - if (upload_size && largest_upload_size[key] < upload_size) |
| - largest_upload_size[key] = upload_size; |
| + GlobalRoutingID id(info->GetGlobalRoutingID()); |
| + if (upload_size && largest_upload_size[id] < upload_size) |
| + largest_upload_size[id] = upload_size; |
| } |
| for (i = pending_loaders_.begin(); i != pending_loaders_.end(); ++i) { |
| @@ -1615,23 +1633,23 @@ void ResourceDispatcherHostImpl::UpdateLoadStates() { |
| // progress ipc messages to the plugin process. |
| i->second->ReportUploadProgress(); |
| - std::pair<int, int> key(info->GetChildID(), info->GetRouteID()); |
| + GlobalRoutingID id(info->GetGlobalRoutingID()); |
| // If a request is uploading data, ignore all other requests so that the |
| // upload progress takes priority for being shown in the status bar. |
| - if (largest_upload_size.find(key) != largest_upload_size.end() && |
| - progress.size() < largest_upload_size[key]) |
| + if (largest_upload_size.find(id) != largest_upload_size.end() && |
| + progress.size() < largest_upload_size[id]) |
| continue; |
| net::LoadStateWithParam to_insert = load_state; |
| - LoadInfoMap::iterator existing = info_map.find(key); |
| + LoadInfoMap::iterator existing = info_map.find(id); |
| if (existing != info_map.end()) { |
| to_insert = |
| MoreInterestingLoadState(existing->second.load_state, load_state); |
| if (to_insert.state == existing->second.load_state.state) |
| continue; |
| } |
| - LoadInfo& load_info = info_map[key]; |
| + LoadInfo& load_info = info_map[id]; |
| load_info.url = request->url(); |
| load_info.load_state = to_insert; |
| load_info.upload_size = progress.size(); |
| @@ -1649,7 +1667,7 @@ void ResourceDispatcherHostImpl::UpdateLoadStates() { |
| void ResourceDispatcherHostImpl::BlockRequestsForRoute(int child_id, |
| int route_id) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| - ProcessRouteIDs key(child_id, route_id); |
| + GlobalRoutingID key(child_id, route_id); |
| DCHECK(blocked_loaders_map_.find(key) == blocked_loaders_map_.end()) << |
| "BlockRequestsForRoute called multiple time for the same RVH"; |
| blocked_loaders_map_[key] = new BlockedLoadersList(); |
| @@ -1670,7 +1688,7 @@ void ResourceDispatcherHostImpl::ProcessBlockedRequestsForRoute( |
| int route_id, |
| bool cancel_requests) { |
| BlockedLoadersMap::iterator iter = blocked_loaders_map_.find( |
| - std::pair<int, int>(child_id, route_id)); |
| + GlobalRoutingID(child_id, route_id)); |
| if (iter == blocked_loaders_map_.end()) { |
| // It's possible to reach here if the renderer crashed while an interstitial |
| // page was showing. |