OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // See http://dev.chromium.org/developers/design-documents/multi-process-resourc
e-loading | 5 // See http://dev.chromium.org/developers/design-documents/multi-process-resourc
e-loading |
6 | 6 |
7 #include "content/browser/loader/resource_dispatcher_host_impl.h" | 7 #include "content/browser/loader/resource_dispatcher_host_impl.h" |
8 | 8 |
9 #include <set> | 9 #include <set> |
10 #include <vector> | 10 #include <vector> |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
224 net::Error net_error) { | 224 net::Error net_error) { |
225 if (started_cb.is_null()) | 225 if (started_cb.is_null()) |
226 return net_error; | 226 return net_error; |
227 BrowserThread::PostTask( | 227 BrowserThread::PostTask( |
228 BrowserThread::UI, FROM_HERE, | 228 BrowserThread::UI, FROM_HERE, |
229 base::Bind(started_cb, static_cast<DownloadItem*>(NULL), net_error)); | 229 base::Bind(started_cb, static_cast<DownloadItem*>(NULL), net_error)); |
230 | 230 |
231 return net_error; | 231 return net_error; |
232 } | 232 } |
233 | 233 |
234 int BuildLoadFlagsForRequest(const ResourceHostMsg_Request& request_data, | 234 int BuildLoadFlagsForRequest( |
235 int child_id, bool is_sync_load) { | 235 const ResourceHostMsg_Request& request_data, |
| 236 int child_id, |
| 237 bool is_sync_load) { |
236 int load_flags = request_data.load_flags; | 238 int load_flags = request_data.load_flags; |
237 | 239 |
238 // Although EV status is irrelevant to sub-frames and sub-resources, we have | 240 // Although EV status is irrelevant to sub-frames and sub-resources, we have |
239 // to perform EV certificate verification on all resources because an HTTP | 241 // to perform EV certificate verification on all resources because an HTTP |
240 // keep-alive connection created to load a sub-frame or a sub-resource could | 242 // keep-alive connection created to load a sub-frame or a sub-resource could |
241 // be reused to load a main frame. | 243 // be reused to load a main frame. |
242 load_flags |= net::LOAD_VERIFY_EV_CERT; | 244 load_flags |= net::LOAD_VERIFY_EV_CERT; |
243 if (request_data.resource_type == ResourceType::MAIN_FRAME) { | 245 if (request_data.resource_type == ResourceType::MAIN_FRAME) { |
244 load_flags |= net::LOAD_MAIN_FRAME; | 246 load_flags |= net::LOAD_MAIN_FRAME; |
245 } else if (request_data.resource_type == ResourceType::SUB_FRAME) { | 247 } else if (request_data.resource_type == ResourceType::SUB_FRAME) { |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
473 // re-post. For GETs, try to retrieve data from the cache and skip | 475 // re-post. For GETs, try to retrieve data from the cache and skip |
474 // validating the entry if present. | 476 // validating the entry if present. |
475 if (request->get_upload() != NULL) | 477 if (request->get_upload() != NULL) |
476 extra_load_flags |= net::LOAD_ONLY_FROM_CACHE; | 478 extra_load_flags |= net::LOAD_ONLY_FROM_CACHE; |
477 else | 479 else |
478 extra_load_flags |= net::LOAD_PREFERRING_CACHE; | 480 extra_load_flags |= net::LOAD_PREFERRING_CACHE; |
479 } else { | 481 } else { |
480 extra_load_flags |= net::LOAD_DISABLE_CACHE; | 482 extra_load_flags |= net::LOAD_DISABLE_CACHE; |
481 } | 483 } |
482 request->set_load_flags(request->load_flags() | extra_load_flags); | 484 request->set_load_flags(request->load_flags() | extra_load_flags); |
| 485 |
| 486 // No need to get offline load flags for downloads, but make sure |
| 487 // we have an OfflinePolicy to receive request completions. |
| 488 GlobalRoutingID id(child_id, route_id); |
| 489 if (!offline_policy_map_[id]) |
| 490 offline_policy_map_[id] = new OfflinePolicy(); |
| 491 |
483 // Check if the renderer is permitted to request the requested URL. | 492 // Check if the renderer is permitted to request the requested URL. |
484 if (!ChildProcessSecurityPolicyImpl::GetInstance()-> | 493 if (!ChildProcessSecurityPolicyImpl::GetInstance()-> |
485 CanRequestURL(child_id, url)) { | 494 CanRequestURL(child_id, url)) { |
486 VLOG(1) << "Denied unauthorized download request for " | 495 VLOG(1) << "Denied unauthorized download request for " |
487 << url.possibly_invalid_spec(); | 496 << url.possibly_invalid_spec(); |
488 return CallbackAndReturn(started_callback, net::ERR_ACCESS_DENIED); | 497 return CallbackAndReturn(started_callback, net::ERR_ACCESS_DENIED); |
489 } | 498 } |
490 | 499 |
491 request_id_--; | 500 request_id_--; |
492 | 501 |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
695 BrowserThread::PostTask( | 704 BrowserThread::PostTask( |
696 BrowserThread::UI, FROM_HERE, | 705 BrowserThread::UI, FROM_HERE, |
697 base::Bind( | 706 base::Bind( |
698 &NotifyOnUI<ResourceRedirectDetails>, | 707 &NotifyOnUI<ResourceRedirectDetails>, |
699 static_cast<int>(NOTIFICATION_RESOURCE_RECEIVED_REDIRECT), | 708 static_cast<int>(NOTIFICATION_RESOURCE_RECEIVED_REDIRECT), |
700 render_process_id, render_view_id, base::Passed(&detail))); | 709 render_process_id, render_view_id, base::Passed(&detail))); |
701 } | 710 } |
702 | 711 |
703 void ResourceDispatcherHostImpl::DidReceiveResponse(ResourceLoader* loader) { | 712 void ResourceDispatcherHostImpl::DidReceiveResponse(ResourceLoader* loader) { |
704 ResourceRequestInfoImpl* info = loader->GetRequestInfo(); | 713 ResourceRequestInfoImpl* info = loader->GetRequestInfo(); |
| 714 // There should be an entry in the map created when we dispatched the |
| 715 // request. |
| 716 GlobalRoutingID routing_id(info->GetGlobalRoutingID()); |
| 717 DCHECK(offline_policy_map_.end() != offline_policy_map_.find(routing_id)); |
| 718 offline_policy_map_[routing_id]-> |
| 719 UpdateStateForCompletedRequest(loader->request()->response_info()); |
705 | 720 |
706 int render_process_id, render_view_id; | 721 int render_process_id, render_view_id; |
707 if (!info->GetAssociatedRenderView(&render_process_id, &render_view_id)) | 722 if (!info->GetAssociatedRenderView(&render_process_id, &render_view_id)) |
708 return; | 723 return; |
709 | 724 |
710 // Notify the observers on the UI thread. | 725 // Notify the observers on the UI thread. |
711 scoped_ptr<ResourceRequestDetails> detail(new ResourceRequestDetails( | 726 scoped_ptr<ResourceRequestDetails> detail(new ResourceRequestDetails( |
712 loader->request(), | 727 loader->request(), |
713 GetCertID(loader->request(), info->GetChildID()))); | 728 GetCertID(loader->request(), info->GetChildID()))); |
714 BrowserThread::PostTask( | 729 BrowserThread::PostTask( |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
782 | 797 |
783 // Make sure we shutdown the timer now, otherwise by the time our destructor | 798 // Make sure we shutdown the timer now, otherwise by the time our destructor |
784 // runs if the timer is still running the Task is deleted twice (once by | 799 // runs if the timer is still running the Task is deleted twice (once by |
785 // the MessageLoop and the second time by RepeatingTimer). | 800 // the MessageLoop and the second time by RepeatingTimer). |
786 update_load_states_timer_.reset(); | 801 update_load_states_timer_.reset(); |
787 | 802 |
788 // Clear blocked requests if any left. | 803 // Clear blocked requests if any left. |
789 // Note that we have to do this in 2 passes as we cannot call | 804 // Note that we have to do this in 2 passes as we cannot call |
790 // CancelBlockedRequestsForRoute while iterating over | 805 // CancelBlockedRequestsForRoute while iterating over |
791 // blocked_loaders_map_, as it modifies it. | 806 // blocked_loaders_map_, as it modifies it. |
792 std::set<ProcessRouteIDs> ids; | 807 std::set<GlobalRoutingID> ids; |
793 for (BlockedLoadersMap::const_iterator iter = blocked_loaders_map_.begin(); | 808 for (BlockedLoadersMap::const_iterator iter = blocked_loaders_map_.begin(); |
794 iter != blocked_loaders_map_.end(); ++iter) { | 809 iter != blocked_loaders_map_.end(); ++iter) { |
795 std::pair<std::set<ProcessRouteIDs>::iterator, bool> result = | 810 std::pair<std::set<GlobalRoutingID>::iterator, bool> result = |
796 ids.insert(iter->first); | 811 ids.insert(iter->first); |
797 // We should not have duplicates. | 812 // We should not have duplicates. |
798 DCHECK(result.second); | 813 DCHECK(result.second); |
799 } | 814 } |
800 for (std::set<ProcessRouteIDs>::const_iterator iter = ids.begin(); | 815 for (std::set<GlobalRoutingID>::const_iterator iter = ids.begin(); |
801 iter != ids.end(); ++iter) { | 816 iter != ids.end(); ++iter) { |
802 CancelBlockedRequestsForRoute(iter->first, iter->second); | 817 CancelBlockedRequestsForRoute(iter->child_id, iter->route_id); |
803 } | 818 } |
804 | 819 |
805 scheduler_.reset(); | 820 scheduler_.reset(); |
806 } | 821 } |
807 | 822 |
808 bool ResourceDispatcherHostImpl::OnMessageReceived( | 823 bool ResourceDispatcherHostImpl::OnMessageReceived( |
809 const IPC::Message& message, | 824 const IPC::Message& message, |
810 ResourceMessageFilter* filter, | 825 ResourceMessageFilter* filter, |
811 bool* message_was_ok) { | 826 bool* message_was_ok) { |
812 filter_ = filter; | 827 filter_ = filter; |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
929 resource_context, | 944 resource_context, |
930 referrer)) { | 945 referrer)) { |
931 AbortRequestBeforeItStarts(filter_, sync_result, route_id, request_id); | 946 AbortRequestBeforeItStarts(filter_, sync_result, route_id, request_id); |
932 return; | 947 return; |
933 } | 948 } |
934 | 949 |
935 bool is_sync_load = sync_result != NULL; | 950 bool is_sync_load = sync_result != NULL; |
936 int load_flags = | 951 int load_flags = |
937 BuildLoadFlagsForRequest(request_data, child_id, is_sync_load); | 952 BuildLoadFlagsForRequest(request_data, child_id, is_sync_load); |
938 | 953 |
| 954 GlobalRoutingID id(child_id, route_id); |
| 955 if (!offline_policy_map_[id]) |
| 956 offline_policy_map_[id] = new OfflinePolicy(); |
| 957 load_flags |= offline_policy_map_[id]->GetAdditionalLoadFlags( |
| 958 load_flags, request_data.resource_type == ResourceType::MAIN_FRAME); |
| 959 |
939 // Construct the request. | 960 // Construct the request. |
940 scoped_ptr<net::URLRequest> new_request; | 961 scoped_ptr<net::URLRequest> new_request; |
941 net::URLRequest* request; | 962 net::URLRequest* request; |
942 if (deferred_loader.get()) { | 963 if (deferred_loader.get()) { |
943 request = deferred_loader->request(); | 964 request = deferred_loader->request(); |
944 | 965 |
945 // Give the ResourceLoader (or any of the ResourceHandlers held by it) a | 966 // Give the ResourceLoader (or any of the ResourceHandlers held by it) a |
946 // chance to reset some state before we complete the transfer. | 967 // chance to reset some state before we complete the transfer. |
947 deferred_loader->WillCompleteTransfer(); | 968 deferred_loader->WillCompleteTransfer(); |
948 } else { | 969 } else { |
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1269 scoped_ptr<net::URLRequest> request( | 1290 scoped_ptr<net::URLRequest> request( |
1270 request_context->CreateRequest(url, NULL)); | 1291 request_context->CreateRequest(url, NULL)); |
1271 request->set_method("GET"); | 1292 request->set_method("GET"); |
1272 request->SetReferrer(MaybeStripReferrer(referrer.url).spec()); | 1293 request->SetReferrer(MaybeStripReferrer(referrer.url).spec()); |
1273 webkit_glue::ConfigureURLRequestForReferrerPolicy(request.get(), | 1294 webkit_glue::ConfigureURLRequestForReferrerPolicy(request.get(), |
1274 referrer.policy); | 1295 referrer.policy); |
1275 // So far, for saving page, we need fetch content from cache, in the | 1296 // So far, for saving page, we need fetch content from cache, in the |
1276 // future, maybe we can use a configuration to configure this behavior. | 1297 // future, maybe we can use a configuration to configure this behavior. |
1277 request->set_load_flags(net::LOAD_PREFERRING_CACHE); | 1298 request->set_load_flags(net::LOAD_PREFERRING_CACHE); |
1278 | 1299 |
| 1300 // No need to get offline load flags for save files, but make sure |
| 1301 // we have an OfflinePolicy to receive request completions. |
| 1302 GlobalRoutingID id(child_id, route_id); |
| 1303 if (!offline_policy_map_[id]) |
| 1304 offline_policy_map_[id] = new OfflinePolicy(); |
| 1305 |
1279 // Since we're just saving some resources we need, disallow downloading. | 1306 // Since we're just saving some resources we need, disallow downloading. |
1280 ResourceRequestInfoImpl* extra_info = | 1307 ResourceRequestInfoImpl* extra_info = |
1281 CreateRequestInfo(child_id, route_id, false, context); | 1308 CreateRequestInfo(child_id, route_id, false, context); |
1282 extra_info->AssociateWithRequest(request.get()); // Request takes ownership. | 1309 extra_info->AssociateWithRequest(request.get()); // Request takes ownership. |
1283 | 1310 |
1284 BeginRequestInternal(request.Pass(), handler.Pass()); | 1311 BeginRequestInternal(request.Pass(), handler.Pass()); |
1285 } | 1312 } |
1286 | 1313 |
1287 void ResourceDispatcherHostImpl::MarkAsTransferredNavigation( | 1314 void ResourceDispatcherHostImpl::MarkAsTransferredNavigation( |
1288 const GlobalRequestID& id) { | 1315 const GlobalRequestID& id) { |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1344 // net::URLRequest that needs exclusive access to the same cache entry, and | 1371 // net::URLRequest that needs exclusive access to the same cache entry, and |
1345 // that net::URLRequest may complete and remove itself from | 1372 // that net::URLRequest may complete and remove itself from |
1346 // pending_requests_. So we need to check that iter is not equal to | 1373 // pending_requests_. So we need to check that iter is not equal to |
1347 // pending_requests_.end(). | 1374 // pending_requests_.end(). |
1348 if (iter != pending_loaders_.end()) | 1375 if (iter != pending_loaders_.end()) |
1349 RemovePendingLoader(iter); | 1376 RemovePendingLoader(iter); |
1350 } | 1377 } |
1351 | 1378 |
1352 // Now deal with blocked requests if any. | 1379 // Now deal with blocked requests if any. |
1353 if (route_id != -1) { | 1380 if (route_id != -1) { |
1354 if (blocked_loaders_map_.find(ProcessRouteIDs(child_id, route_id)) != | 1381 if (blocked_loaders_map_.find(GlobalRoutingID(child_id, route_id)) != |
1355 blocked_loaders_map_.end()) { | 1382 blocked_loaders_map_.end()) { |
1356 CancelBlockedRequestsForRoute(child_id, route_id); | 1383 CancelBlockedRequestsForRoute(child_id, route_id); |
1357 } | 1384 } |
1358 } else { | 1385 } else { |
1359 // We have to do all render views for the process |child_id|. | 1386 // We have to do all render views for the process |child_id|. |
1360 // Note that we have to do this in 2 passes as we cannot call | 1387 // Note that we have to do this in 2 passes as we cannot call |
1361 // CancelBlockedRequestsForRoute while iterating over | 1388 // CancelBlockedRequestsForRoute while iterating over |
1362 // blocked_loaders_map_, as it modifies it. | 1389 // blocked_loaders_map_, as it modifies it. |
1363 std::set<int> route_ids; | 1390 std::set<int> route_ids; |
1364 for (BlockedLoadersMap::const_iterator iter = blocked_loaders_map_.begin(); | 1391 for (BlockedLoadersMap::const_iterator iter = blocked_loaders_map_.begin(); |
1365 iter != blocked_loaders_map_.end(); ++iter) { | 1392 iter != blocked_loaders_map_.end(); ++iter) { |
1366 if (iter->first.first == child_id) | 1393 if (iter->first.child_id == child_id) |
1367 route_ids.insert(iter->first.second); | 1394 route_ids.insert(iter->first.route_id); |
1368 } | 1395 } |
1369 for (std::set<int>::const_iterator iter = route_ids.begin(); | 1396 for (std::set<int>::const_iterator iter = route_ids.begin(); |
1370 iter != route_ids.end(); ++iter) { | 1397 iter != route_ids.end(); ++iter) { |
1371 CancelBlockedRequestsForRoute(child_id, *iter); | 1398 CancelBlockedRequestsForRoute(child_id, *iter); |
1372 } | 1399 } |
1373 } | 1400 } |
| 1401 |
| 1402 // Cleanup the offline state for the route. |
| 1403 OfflineMap::iterator it = offline_policy_map_.find( |
| 1404 GlobalRoutingID(child_id, route_id)); |
| 1405 if (offline_policy_map_.end() != it) { |
| 1406 delete it->second; |
| 1407 offline_policy_map_.erase(it); |
| 1408 } |
1374 } | 1409 } |
1375 | 1410 |
1376 // Cancels the request and removes it from the list. | 1411 // Cancels the request and removes it from the list. |
1377 void ResourceDispatcherHostImpl::RemovePendingRequest(int child_id, | 1412 void ResourceDispatcherHostImpl::RemovePendingRequest(int child_id, |
1378 int request_id) { | 1413 int request_id) { |
1379 LoaderMap::iterator i = pending_loaders_.find( | 1414 LoaderMap::iterator i = pending_loaders_.find( |
1380 GlobalRequestID(child_id, request_id)); | 1415 GlobalRequestID(child_id, request_id)); |
1381 if (i == pending_loaders_.end()) { | 1416 if (i == pending_loaders_.end()) { |
1382 NOTREACHED() << "Trying to remove a request that's not here"; | 1417 NOTREACHED() << "Trying to remove a request that's not here"; |
1383 return; | 1418 return; |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1495 info->GetChildID()); | 1530 info->GetChildID()); |
1496 | 1531 |
1497 // A ResourceHandler must not outlive its associated URLRequest. | 1532 // A ResourceHandler must not outlive its associated URLRequest. |
1498 handler.reset(); | 1533 handler.reset(); |
1499 return; | 1534 return; |
1500 } | 1535 } |
1501 | 1536 |
1502 linked_ptr<ResourceLoader> loader( | 1537 linked_ptr<ResourceLoader> loader( |
1503 new ResourceLoader(request.Pass(), handler.Pass(), this)); | 1538 new ResourceLoader(request.Pass(), handler.Pass(), this)); |
1504 | 1539 |
1505 ProcessRouteIDs pair_id(info->GetChildID(), info->GetRouteID()); | 1540 GlobalRoutingID id(info->GetGlobalRoutingID()); |
1506 BlockedLoadersMap::const_iterator iter = blocked_loaders_map_.find(pair_id); | 1541 BlockedLoadersMap::const_iterator iter = blocked_loaders_map_.find(id); |
1507 if (iter != blocked_loaders_map_.end()) { | 1542 if (iter != blocked_loaders_map_.end()) { |
1508 // The request should be blocked. | 1543 // The request should be blocked. |
1509 iter->second->push_back(loader); | 1544 iter->second->push_back(loader); |
1510 return; | 1545 return; |
1511 } | 1546 } |
1512 | 1547 |
1513 StartLoading(info, loader); | 1548 StartLoading(info, loader); |
1514 } | 1549 } |
1515 | 1550 |
1516 void ResourceDispatcherHostImpl::StartLoading( | 1551 void ResourceDispatcherHostImpl::StartLoading( |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1558 } | 1593 } |
1559 | 1594 |
1560 // Carries information about a load state change. | 1595 // Carries information about a load state change. |
1561 struct LoadInfo { | 1596 struct LoadInfo { |
1562 GURL url; | 1597 GURL url; |
1563 net::LoadStateWithParam load_state; | 1598 net::LoadStateWithParam load_state; |
1564 uint64 upload_position; | 1599 uint64 upload_position; |
1565 uint64 upload_size; | 1600 uint64 upload_size; |
1566 }; | 1601 }; |
1567 | 1602 |
1568 // Map from ProcessID+ViewID pair to LoadState | 1603 // Map from ProcessID+RouteID pair to LoadState |
1569 typedef std::map<std::pair<int, int>, LoadInfo> LoadInfoMap; | 1604 typedef std::map<GlobalRoutingID, LoadInfo> LoadInfoMap; |
1570 | 1605 |
1571 // Used to marshal calls to LoadStateChanged from the IO to UI threads. We do | 1606 // Used to marshal calls to LoadStateChanged from the IO to UI threads. We do |
1572 // them all as a single callback to avoid spamming the UI thread. | 1607 // them all as a single callback to avoid spamming the UI thread. |
1573 void LoadInfoUpdateCallback(const LoadInfoMap& info_map) { | 1608 void LoadInfoUpdateCallback(const LoadInfoMap& info_map) { |
1574 LoadInfoMap::const_iterator i; | 1609 LoadInfoMap::const_iterator i; |
1575 for (i = info_map.begin(); i != info_map.end(); ++i) { | 1610 for (i = info_map.begin(); i != info_map.end(); ++i) { |
1576 RenderViewHostImpl* view = | 1611 RenderViewHostImpl* view = |
1577 RenderViewHostImpl::FromID(i->first.first, i->first.second); | 1612 RenderViewHostImpl::FromID(i->first.child_id, i->first.route_id); |
1578 if (view) // The view could be gone at this point. | 1613 if (view) // The view could be gone at this point. |
1579 view->LoadStateChanged(i->second.url, i->second.load_state, | 1614 view->LoadStateChanged(i->second.url, i->second.load_state, |
1580 i->second.upload_position, | 1615 i->second.upload_position, |
1581 i->second.upload_size); | 1616 i->second.upload_size); |
1582 } | 1617 } |
1583 } | 1618 } |
1584 | 1619 |
1585 } // namespace | 1620 } // namespace |
1586 | 1621 |
1587 void ResourceDispatcherHostImpl::UpdateLoadStates() { | 1622 void ResourceDispatcherHostImpl::UpdateLoadStates() { |
1588 // Populate this map with load state changes, and then send them on to the UI | 1623 // Populate this map with load state changes, and then send them on to the UI |
1589 // thread where they can be passed along to the respective RVHs. | 1624 // thread where they can be passed along to the respective RVHs. |
1590 LoadInfoMap info_map; | 1625 LoadInfoMap info_map; |
1591 | 1626 |
1592 LoaderMap::const_iterator i; | 1627 LoaderMap::const_iterator i; |
1593 | 1628 |
1594 // Determine the largest upload size of all requests | 1629 // Determine the largest upload size of all requests |
1595 // in each View (good chance it's zero). | 1630 // in each View (good chance it's zero). |
1596 std::map<std::pair<int, int>, uint64> largest_upload_size; | 1631 std::map<GlobalRoutingID, uint64> largest_upload_size; |
1597 for (i = pending_loaders_.begin(); i != pending_loaders_.end(); ++i) { | 1632 for (i = pending_loaders_.begin(); i != pending_loaders_.end(); ++i) { |
1598 net::URLRequest* request = i->second->request(); | 1633 net::URLRequest* request = i->second->request(); |
1599 ResourceRequestInfoImpl* info = i->second->GetRequestInfo(); | 1634 ResourceRequestInfoImpl* info = i->second->GetRequestInfo(); |
1600 uint64 upload_size = request->GetUploadProgress().size(); | 1635 uint64 upload_size = request->GetUploadProgress().size(); |
1601 if (request->GetLoadState().state != net::LOAD_STATE_SENDING_REQUEST) | 1636 if (request->GetLoadState().state != net::LOAD_STATE_SENDING_REQUEST) |
1602 upload_size = 0; | 1637 upload_size = 0; |
1603 std::pair<int, int> key(info->GetChildID(), info->GetRouteID()); | 1638 GlobalRoutingID id(info->GetGlobalRoutingID()); |
1604 if (upload_size && largest_upload_size[key] < upload_size) | 1639 if (upload_size && largest_upload_size[id] < upload_size) |
1605 largest_upload_size[key] = upload_size; | 1640 largest_upload_size[id] = upload_size; |
1606 } | 1641 } |
1607 | 1642 |
1608 for (i = pending_loaders_.begin(); i != pending_loaders_.end(); ++i) { | 1643 for (i = pending_loaders_.begin(); i != pending_loaders_.end(); ++i) { |
1609 net::URLRequest* request = i->second->request(); | 1644 net::URLRequest* request = i->second->request(); |
1610 ResourceRequestInfoImpl* info = i->second->GetRequestInfo(); | 1645 ResourceRequestInfoImpl* info = i->second->GetRequestInfo(); |
1611 net::LoadStateWithParam load_state = request->GetLoadState(); | 1646 net::LoadStateWithParam load_state = request->GetLoadState(); |
1612 net::UploadProgress progress = request->GetUploadProgress(); | 1647 net::UploadProgress progress = request->GetUploadProgress(); |
1613 | 1648 |
1614 // We also poll for upload progress on this timer and send upload | 1649 // We also poll for upload progress on this timer and send upload |
1615 // progress ipc messages to the plugin process. | 1650 // progress ipc messages to the plugin process. |
1616 i->second->ReportUploadProgress(); | 1651 i->second->ReportUploadProgress(); |
1617 | 1652 |
1618 std::pair<int, int> key(info->GetChildID(), info->GetRouteID()); | 1653 GlobalRoutingID id(info->GetGlobalRoutingID()); |
1619 | 1654 |
1620 // If a request is uploading data, ignore all other requests so that the | 1655 // If a request is uploading data, ignore all other requests so that the |
1621 // upload progress takes priority for being shown in the status bar. | 1656 // upload progress takes priority for being shown in the status bar. |
1622 if (largest_upload_size.find(key) != largest_upload_size.end() && | 1657 if (largest_upload_size.find(id) != largest_upload_size.end() && |
1623 progress.size() < largest_upload_size[key]) | 1658 progress.size() < largest_upload_size[id]) |
1624 continue; | 1659 continue; |
1625 | 1660 |
1626 net::LoadStateWithParam to_insert = load_state; | 1661 net::LoadStateWithParam to_insert = load_state; |
1627 LoadInfoMap::iterator existing = info_map.find(key); | 1662 LoadInfoMap::iterator existing = info_map.find(id); |
1628 if (existing != info_map.end()) { | 1663 if (existing != info_map.end()) { |
1629 to_insert = | 1664 to_insert = |
1630 MoreInterestingLoadState(existing->second.load_state, load_state); | 1665 MoreInterestingLoadState(existing->second.load_state, load_state); |
1631 if (to_insert.state == existing->second.load_state.state) | 1666 if (to_insert.state == existing->second.load_state.state) |
1632 continue; | 1667 continue; |
1633 } | 1668 } |
1634 LoadInfo& load_info = info_map[key]; | 1669 LoadInfo& load_info = info_map[id]; |
1635 load_info.url = request->url(); | 1670 load_info.url = request->url(); |
1636 load_info.load_state = to_insert; | 1671 load_info.load_state = to_insert; |
1637 load_info.upload_size = progress.size(); | 1672 load_info.upload_size = progress.size(); |
1638 load_info.upload_position = progress.position(); | 1673 load_info.upload_position = progress.position(); |
1639 } | 1674 } |
1640 | 1675 |
1641 if (info_map.empty()) | 1676 if (info_map.empty()) |
1642 return; | 1677 return; |
1643 | 1678 |
1644 BrowserThread::PostTask( | 1679 BrowserThread::PostTask( |
1645 BrowserThread::UI, FROM_HERE, | 1680 BrowserThread::UI, FROM_HERE, |
1646 base::Bind(&LoadInfoUpdateCallback, info_map)); | 1681 base::Bind(&LoadInfoUpdateCallback, info_map)); |
1647 } | 1682 } |
1648 | 1683 |
1649 void ResourceDispatcherHostImpl::BlockRequestsForRoute(int child_id, | 1684 void ResourceDispatcherHostImpl::BlockRequestsForRoute(int child_id, |
1650 int route_id) { | 1685 int route_id) { |
1651 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 1686 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
1652 ProcessRouteIDs key(child_id, route_id); | 1687 GlobalRoutingID key(child_id, route_id); |
1653 DCHECK(blocked_loaders_map_.find(key) == blocked_loaders_map_.end()) << | 1688 DCHECK(blocked_loaders_map_.find(key) == blocked_loaders_map_.end()) << |
1654 "BlockRequestsForRoute called multiple time for the same RVH"; | 1689 "BlockRequestsForRoute called multiple time for the same RVH"; |
1655 blocked_loaders_map_[key] = new BlockedLoadersList(); | 1690 blocked_loaders_map_[key] = new BlockedLoadersList(); |
1656 } | 1691 } |
1657 | 1692 |
1658 void ResourceDispatcherHostImpl::ResumeBlockedRequestsForRoute(int child_id, | 1693 void ResourceDispatcherHostImpl::ResumeBlockedRequestsForRoute(int child_id, |
1659 int route_id) { | 1694 int route_id) { |
1660 ProcessBlockedRequestsForRoute(child_id, route_id, false); | 1695 ProcessBlockedRequestsForRoute(child_id, route_id, false); |
1661 } | 1696 } |
1662 | 1697 |
1663 void ResourceDispatcherHostImpl::CancelBlockedRequestsForRoute(int child_id, | 1698 void ResourceDispatcherHostImpl::CancelBlockedRequestsForRoute(int child_id, |
1664 int route_id) { | 1699 int route_id) { |
1665 ProcessBlockedRequestsForRoute(child_id, route_id, true); | 1700 ProcessBlockedRequestsForRoute(child_id, route_id, true); |
1666 } | 1701 } |
1667 | 1702 |
1668 void ResourceDispatcherHostImpl::ProcessBlockedRequestsForRoute( | 1703 void ResourceDispatcherHostImpl::ProcessBlockedRequestsForRoute( |
1669 int child_id, | 1704 int child_id, |
1670 int route_id, | 1705 int route_id, |
1671 bool cancel_requests) { | 1706 bool cancel_requests) { |
1672 BlockedLoadersMap::iterator iter = blocked_loaders_map_.find( | 1707 BlockedLoadersMap::iterator iter = blocked_loaders_map_.find( |
1673 std::pair<int, int>(child_id, route_id)); | 1708 GlobalRoutingID(child_id, route_id)); |
1674 if (iter == blocked_loaders_map_.end()) { | 1709 if (iter == blocked_loaders_map_.end()) { |
1675 // It's possible to reach here if the renderer crashed while an interstitial | 1710 // It's possible to reach here if the renderer crashed while an interstitial |
1676 // page was showing. | 1711 // page was showing. |
1677 return; | 1712 return; |
1678 } | 1713 } |
1679 | 1714 |
1680 BlockedLoadersList* loaders = iter->second; | 1715 BlockedLoadersList* loaders = iter->second; |
1681 | 1716 |
1682 // Removing the vector from the map unblocks any subsequent requests. | 1717 // Removing the vector from the map unblocks any subsequent requests. |
1683 blocked_loaders_map_.erase(iter); | 1718 blocked_loaders_map_.erase(iter); |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1756 DelegateMap::iterator it = delegate_map_.find(id); | 1791 DelegateMap::iterator it = delegate_map_.find(id); |
1757 DCHECK(it->second->HasObserver(delegate)); | 1792 DCHECK(it->second->HasObserver(delegate)); |
1758 it->second->RemoveObserver(delegate); | 1793 it->second->RemoveObserver(delegate); |
1759 if (it->second->size() == 0) { | 1794 if (it->second->size() == 0) { |
1760 delete it->second; | 1795 delete it->second; |
1761 delegate_map_.erase(it); | 1796 delegate_map_.erase(it); |
1762 } | 1797 } |
1763 } | 1798 } |
1764 | 1799 |
1765 } // namespace content | 1800 } // namespace content |
OLD | NEW |