| 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 7eee77be2ee8e88ce52716df20725c3eb12f974c..f3a441b8a5a2a0e7d28e2d62382feb5762d39621 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
|
| @@ -480,6 +482,13 @@ net::Error ResourceDispatcherHostImpl::BeginDownload(
|
| extra_load_flags |= net::LOAD_DISABLE_CACHE;
|
| }
|
| request->set_load_flags(request->load_flags() | extra_load_flags);
|
| +
|
| + // No need to get offline load flags for downloads, but make sure
|
| + // we have an OfflinePolicy to receive request completions.
|
| + GlobalRoutingID id(child_id, route_id);
|
| + if (!offline_policy_map_[id])
|
| + offline_policy_map_[id] = new OfflinePolicy();
|
| +
|
| // Check if the renderer is permitted to request the requested URL.
|
| if (!ChildProcessSecurityPolicyImpl::GetInstance()->
|
| CanRequestURL(child_id, url)) {
|
| @@ -702,6 +711,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 +804,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 +951,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;
|
| @@ -1276,6 +1297,12 @@ void ResourceDispatcherHostImpl::BeginSaveFile(
|
| // future, maybe we can use a configuration to configure this behavior.
|
| request->set_load_flags(net::LOAD_PREFERRING_CACHE);
|
|
|
| + // No need to get offline load flags for save files, but make sure
|
| + // we have an OfflinePolicy to receive request completions.
|
| + GlobalRoutingID id(child_id, route_id);
|
| + if (!offline_policy_map_[id])
|
| + offline_policy_map_[id] = new OfflinePolicy();
|
| +
|
| // Since we're just saving some resources we need, disallow downloading.
|
| ResourceRequestInfoImpl* extra_info =
|
| CreateRequestInfo(child_id, route_id, false, context);
|
| @@ -1351,7 +1378,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 +1390,22 @@ 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.
|
| + OfflineMap::iterator it = offline_policy_map_.find(
|
| + GlobalRoutingID(child_id, route_id));
|
| + if (offline_policy_map_.end() != it) {
|
| + delete it->second;
|
| + offline_policy_map_.erase(it);
|
| + }
|
| }
|
|
|
| // Cancels the request and removes it from the list.
|
| @@ -1502,8 +1537,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 +1600,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 +1609,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 +1628,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 +1650,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 +1684,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 +1705,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.
|
|
|