| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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://wiki.corp.google.com/twiki/bin/view/Main/ChromeMultiProcessResourc
eLoading | 5 // See http://wiki.corp.google.com/twiki/bin/view/Main/ChromeMultiProcessResourc
eLoading |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "chrome/browser/resource_dispatcher_host.h" | 9 #include "chrome/browser/resource_dispatcher_host.h" |
| 10 | 10 |
| (...skipping 1711 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1722 extra_info->allow_download = false; | 1722 extra_info->allow_download = false; |
| 1723 extra_info->is_download = false; | 1723 extra_info->is_download = false; |
| 1724 request->set_user_data(extra_info); // Takes pointer ownership. | 1724 request->set_user_data(extra_info); // Takes pointer ownership. |
| 1725 | 1725 |
| 1726 BeginRequestInternal(request, false); | 1726 BeginRequestInternal(request, false); |
| 1727 } | 1727 } |
| 1728 | 1728 |
| 1729 void ResourceDispatcherHost::CancelRequest(int render_process_host_id, | 1729 void ResourceDispatcherHost::CancelRequest(int render_process_host_id, |
| 1730 int request_id, | 1730 int request_id, |
| 1731 bool from_renderer) { | 1731 bool from_renderer) { |
| 1732 CancelRequest(render_process_host_id, request_id, from_renderer, true); |
| 1733 } |
| 1734 |
| 1735 void ResourceDispatcherHost::CancelRequest(int render_process_host_id, |
| 1736 int request_id, |
| 1737 bool from_renderer, |
| 1738 bool allow_delete) { |
| 1732 PendingRequestList::iterator i = pending_requests_.find( | 1739 PendingRequestList::iterator i = pending_requests_.find( |
| 1733 GlobalRequestID(render_process_host_id, request_id)); | 1740 GlobalRequestID(render_process_host_id, request_id)); |
| 1734 if (i == pending_requests_.end()) { | 1741 if (i == pending_requests_.end()) { |
| 1735 // We probably want to remove this warning eventually, but I wanted to be | 1742 // We probably want to remove this warning eventually, but I wanted to be |
| 1736 // able to notice when this happens during initial development since it | 1743 // able to notice when this happens during initial development since it |
| 1737 // should be rare and may indicate a bug. | 1744 // should be rare and may indicate a bug. |
| 1738 DLOG(WARNING) << "Canceling a request that wasn't found"; | 1745 DLOG(WARNING) << "Canceling a request that wasn't found"; |
| 1739 return; | 1746 return; |
| 1740 } | 1747 } |
| 1741 | 1748 |
| 1742 // WebKit will send us a cancel for downloads since it no longer handles them. | 1749 // WebKit will send us a cancel for downloads since it no longer handles them. |
| 1743 // In this case, ignore the cancel since we handle downloads in the browser. | 1750 // In this case, ignore the cancel since we handle downloads in the browser. |
| 1744 ExtraRequestInfo* info = ExtraInfoForRequest(i->second); | 1751 ExtraRequestInfo* info = ExtraInfoForRequest(i->second); |
| 1745 if (!from_renderer || !info->is_download) { | 1752 if (!from_renderer || !info->is_download) { |
| 1746 if (info->login_handler) { | 1753 if (info->login_handler) { |
| 1747 info->login_handler->OnRequestCancelled(); | 1754 info->login_handler->OnRequestCancelled(); |
| 1748 info->login_handler = NULL; | 1755 info->login_handler = NULL; |
| 1749 } | 1756 } |
| 1750 i->second->Cancel(); | 1757 if (!i->second->is_pending() && allow_delete) { |
| 1758 // No io is pending, canceling the request won't notify us of anything, |
| 1759 // so we explicitly remove it. |
| 1760 // TODO: removing the request in this manner means we're not notifying |
| 1761 // anyone. We need make sure the event handlers and others are notified |
| 1762 // so that everything is cleaned up properly. |
| 1763 RemovePendingRequest(info->render_process_host_id, info->request_id); |
| 1764 } else { |
| 1765 i->second->Cancel(); |
| 1766 } |
| 1751 } | 1767 } |
| 1752 | 1768 |
| 1753 // Do not remove from the pending requests, as the request will still | 1769 // Do not remove from the pending requests, as the request will still |
| 1754 // call AllDataReceived, and may even have more data before it does | 1770 // call AllDataReceived, and may even have more data before it does |
| 1755 // that. | 1771 // that. |
| 1756 } | 1772 } |
| 1757 | 1773 |
| 1758 void ResourceDispatcherHost::OnDataReceivedACK(int render_process_host_id, | 1774 void ResourceDispatcherHost::OnDataReceivedACK(int render_process_host_id, |
| 1759 int request_id) { | 1775 int request_id) { |
| 1760 PendingRequestList::iterator i = pending_requests_.find( | 1776 PendingRequestList::iterator i = pending_requests_.find( |
| (...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2227 bool ResourceDispatcherHost::CompleteRead(URLRequest* request, | 2243 bool ResourceDispatcherHost::CompleteRead(URLRequest* request, |
| 2228 int* bytes_read) { | 2244 int* bytes_read) { |
| 2229 if (!request->status().is_success()) { | 2245 if (!request->status().is_success()) { |
| 2230 NOTREACHED(); | 2246 NOTREACHED(); |
| 2231 return false; | 2247 return false; |
| 2232 } | 2248 } |
| 2233 | 2249 |
| 2234 ExtraRequestInfo* info = ExtraInfoForRequest(request); | 2250 ExtraRequestInfo* info = ExtraInfoForRequest(request); |
| 2235 | 2251 |
| 2236 if (!info->event_handler->OnReadCompleted(info->request_id, bytes_read)) { | 2252 if (!info->event_handler->OnReadCompleted(info->request_id, bytes_read)) { |
| 2237 CancelRequest(info->render_process_host_id, info->request_id, false); | 2253 // Pass in false as the last arg to indicate we don't want |request| |
| 2254 // deleted. We do this as callers of us assume |request| is valid after we |
| 2255 // return. |
| 2256 CancelRequest(info->render_process_host_id, info->request_id, false, false); |
| 2238 return false; | 2257 return false; |
| 2239 } | 2258 } |
| 2240 | 2259 |
| 2241 return *bytes_read != 0; | 2260 return *bytes_read != 0; |
| 2242 } | 2261 } |
| 2243 | 2262 |
| 2244 void ResourceDispatcherHost::OnResponseCompleted(URLRequest* request) { | 2263 void ResourceDispatcherHost::OnResponseCompleted(URLRequest* request) { |
| 2245 RESOURCE_LOG("OnResponseCompleted: " << request->url().spec()); | 2264 RESOURCE_LOG("OnResponseCompleted: " << request->url().spec()); |
| 2246 ExtraRequestInfo* info = ExtraInfoForRequest(request); | 2265 ExtraRequestInfo* info = ExtraInfoForRequest(request); |
| 2247 | 2266 |
| (...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2491 bool enough_new_progress = (amt_since_last > (size / kHalfPercentIncrements)); | 2510 bool enough_new_progress = (amt_since_last > (size / kHalfPercentIncrements)); |
| 2492 bool too_much_time_passed = time_since_last > kOneSecond; | 2511 bool too_much_time_passed = time_since_last > kOneSecond; |
| 2493 | 2512 |
| 2494 if (is_finished || enough_new_progress || too_much_time_passed) { | 2513 if (is_finished || enough_new_progress || too_much_time_passed) { |
| 2495 info->event_handler->OnUploadProgress(info->request_id, position, size); | 2514 info->event_handler->OnUploadProgress(info->request_id, position, size); |
| 2496 info->waiting_for_upload_progress_ack = true; | 2515 info->waiting_for_upload_progress_ack = true; |
| 2497 info->last_upload_ticks = TimeTicks::Now(); | 2516 info->last_upload_ticks = TimeTicks::Now(); |
| 2498 info->last_upload_position = position; | 2517 info->last_upload_position = position; |
| 2499 } | 2518 } |
| 2500 } | 2519 } |
| OLD | NEW |