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 #include "content/browser/renderer_host/resource_loader.h" | 5 #include "content/browser/renderer_host/resource_loader.h" |
6 | 6 |
7 #include "base/message_loop.h" | 7 #include "base/message_loop.h" |
8 #include "base/time.h" | 8 #include "base/time.h" |
9 #include "content/browser/child_process_security_policy_impl.h" | 9 #include "content/browser/child_process_security_policy_impl.h" |
10 #include "content/browser/renderer_host/doomed_resource_handler.h" | 10 #include "content/browser/renderer_host/doomed_resource_handler.h" |
11 #include "content/browser/renderer_host/resource_loader_delegate.h" | 11 #include "content/browser/renderer_host/resource_loader_delegate.h" |
12 #include "content/browser/renderer_host/resource_request_info_impl.h" | 12 #include "content/browser/renderer_host/resource_request_info_impl.h" |
13 #include "content/browser/ssl/ssl_client_auth_handler.h" | 13 #include "content/browser/ssl/ssl_client_auth_handler.h" |
14 #include "content/browser/ssl/ssl_manager.h" | 14 #include "content/browser/ssl/ssl_manager.h" |
15 #include "content/common/ssl_status_serialization.h" | 15 #include "content/common/ssl_status_serialization.h" |
16 #include "content/public/browser/cert_store.h" | 16 #include "content/public/browser/cert_store.h" |
17 #include "content/public/browser/resource_dispatcher_host_login_delegate.h" | 17 #include "content/public/browser/resource_dispatcher_host_login_delegate.h" |
18 #include "content/public/common/resource_response.h" | 18 #include "content/public/common/resource_response.h" |
19 #include "net/base/load_flags.h" | 19 #include "net/base/load_flags.h" |
| 20 #include "net/base/upload_data_stream.h" |
20 #include "net/http/http_response_headers.h" | 21 #include "net/http/http_response_headers.h" |
21 #include "webkit/appcache/appcache_interceptor.h" | 22 #include "webkit/appcache/appcache_interceptor.h" |
22 | 23 |
23 using base::TimeDelta; | 24 using base::TimeDelta; |
24 using base::TimeTicks; | 25 using base::TimeTicks; |
25 | 26 |
26 namespace content { | 27 namespace content { |
27 namespace { | 28 namespace { |
28 | 29 |
29 void PopulateResourceResponse(net::URLRequest* request, | 30 void PopulateResourceResponse(net::URLRequest* request, |
(...skipping 20 matching lines...) Expand all Loading... |
50 | 51 |
51 } // namespace | 52 } // namespace |
52 | 53 |
53 ResourceLoader::ResourceLoader(scoped_ptr<net::URLRequest> request, | 54 ResourceLoader::ResourceLoader(scoped_ptr<net::URLRequest> request, |
54 scoped_ptr<ResourceHandler> handler, | 55 scoped_ptr<ResourceHandler> handler, |
55 ResourceLoaderDelegate* delegate) | 56 ResourceLoaderDelegate* delegate) |
56 : deferred_stage_(DEFERRED_NONE), | 57 : deferred_stage_(DEFERRED_NONE), |
57 request_(request.Pass()), | 58 request_(request.Pass()), |
58 handler_(handler.Pass()), | 59 handler_(handler.Pass()), |
59 delegate_(delegate), | 60 delegate_(delegate), |
| 61 upload_size_(0), |
60 last_upload_position_(0), | 62 last_upload_position_(0), |
61 waiting_for_upload_progress_ack_(false), | 63 waiting_for_upload_progress_ack_(false), |
62 is_transferring_(false), | 64 is_transferring_(false), |
63 weak_ptr_factory_(this) { | 65 weak_ptr_factory_(this) { |
64 request_->set_delegate(this); | 66 request_->set_delegate(this); |
65 handler_->SetController(this); | 67 handler_->SetController(this); |
66 } | 68 } |
67 | 69 |
68 ResourceLoader::~ResourceLoader() { | 70 ResourceLoader::~ResourceLoader() { |
69 if (login_delegate_) | 71 if (login_delegate_) |
(...skipping 30 matching lines...) Expand all Loading... |
100 void ResourceLoader::CancelRequest(bool from_renderer) { | 102 void ResourceLoader::CancelRequest(bool from_renderer) { |
101 CancelRequestInternal(net::ERR_ABORTED, from_renderer); | 103 CancelRequestInternal(net::ERR_ABORTED, from_renderer); |
102 } | 104 } |
103 | 105 |
104 void ResourceLoader::ReportUploadProgress() { | 106 void ResourceLoader::ReportUploadProgress() { |
105 ResourceRequestInfoImpl* info = GetRequestInfo(); | 107 ResourceRequestInfoImpl* info = GetRequestInfo(); |
106 | 108 |
107 if (waiting_for_upload_progress_ack_) | 109 if (waiting_for_upload_progress_ack_) |
108 return; // Send one progress event at a time. | 110 return; // Send one progress event at a time. |
109 | 111 |
110 uint64 size = info->GetUploadSize(); | 112 if (!upload_size_) |
111 if (!size) | |
112 return; // Nothing to upload. | 113 return; // Nothing to upload. |
113 | 114 |
114 uint64 position = request_->GetUploadProgress(); | 115 uint64 position = request_->GetUploadProgress(); |
115 if (position == last_upload_position_) | 116 if (position == last_upload_position_) |
116 return; // No progress made since last time. | 117 return; // No progress made since last time. |
117 | 118 |
118 const uint64 kHalfPercentIncrements = 200; | 119 const uint64 kHalfPercentIncrements = 200; |
119 const TimeDelta kOneSecond = TimeDelta::FromMilliseconds(1000); | 120 const TimeDelta kOneSecond = TimeDelta::FromMilliseconds(1000); |
120 | 121 |
121 uint64 amt_since_last = position - last_upload_position_; | 122 uint64 amt_since_last = position - last_upload_position_; |
122 TimeDelta time_since_last = TimeTicks::Now() - last_upload_ticks_; | 123 TimeDelta time_since_last = TimeTicks::Now() - last_upload_ticks_; |
123 | 124 |
124 bool is_finished = (size == position); | 125 bool is_finished = (upload_size_ == position); |
125 bool enough_new_progress = (amt_since_last > (size / kHalfPercentIncrements)); | 126 bool enough_new_progress = |
| 127 (amt_since_last > (upload_size_ / kHalfPercentIncrements)); |
126 bool too_much_time_passed = time_since_last > kOneSecond; | 128 bool too_much_time_passed = time_since_last > kOneSecond; |
127 | 129 |
128 if (is_finished || enough_new_progress || too_much_time_passed) { | 130 if (is_finished || enough_new_progress || too_much_time_passed) { |
129 if (request_->load_flags() & net::LOAD_ENABLE_UPLOAD_PROGRESS) { | 131 if (request_->load_flags() & net::LOAD_ENABLE_UPLOAD_PROGRESS) { |
130 handler_->OnUploadProgress(info->GetRequestID(), position, size); | 132 handler_->OnUploadProgress(info->GetRequestID(), position, upload_size_); |
131 waiting_for_upload_progress_ack_ = true; | 133 waiting_for_upload_progress_ack_ = true; |
132 } | 134 } |
133 last_upload_ticks_ = TimeTicks::Now(); | 135 last_upload_ticks_ = TimeTicks::Now(); |
134 last_upload_position_ = position; | 136 last_upload_position_ = position; |
135 } | 137 } |
136 } | 138 } |
137 | 139 |
138 void ResourceLoader::MarkAsTransferring() { | 140 void ResourceLoader::MarkAsTransferring() { |
139 is_transferring_ = true; | 141 is_transferring_ = true; |
140 | 142 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
172 } | 174 } |
173 | 175 |
174 void ResourceLoader::ClearSSLClientAuthHandler() { | 176 void ResourceLoader::ClearSSLClientAuthHandler() { |
175 ssl_client_auth_handler_ = NULL; | 177 ssl_client_auth_handler_ = NULL; |
176 } | 178 } |
177 | 179 |
178 void ResourceLoader::OnUploadProgressACK() { | 180 void ResourceLoader::OnUploadProgressACK() { |
179 waiting_for_upload_progress_ack_ = false; | 181 waiting_for_upload_progress_ack_ = false; |
180 } | 182 } |
181 | 183 |
| 184 void ResourceLoader::OnRequestBodyInitialized(net::URLRequest* request, |
| 185 uint64 size) { |
| 186 upload_size_ = size; |
| 187 } |
| 188 |
182 void ResourceLoader::OnReceivedRedirect(net::URLRequest* unused, | 189 void ResourceLoader::OnReceivedRedirect(net::URLRequest* unused, |
183 const GURL& new_url, | 190 const GURL& new_url, |
184 bool* defer) { | 191 bool* defer) { |
185 DCHECK_EQ(request_.get(), unused); | 192 DCHECK_EQ(request_.get(), unused); |
186 | 193 |
187 VLOG(1) << "OnReceivedRedirect: " << request_->url().spec(); | 194 VLOG(1) << "OnReceivedRedirect: " << request_->url().spec(); |
188 DCHECK(request_->status().is_success()); | 195 DCHECK(request_->status().is_success()); |
189 | 196 |
190 ResourceRequestInfoImpl* info = GetRequestInfo(); | 197 ResourceRequestInfoImpl* info = GetRequestInfo(); |
191 | 198 |
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
562 // we resume. | 569 // we resume. |
563 deferred_stage_ = DEFERRED_FINISH; | 570 deferred_stage_ = DEFERRED_FINISH; |
564 } | 571 } |
565 } | 572 } |
566 | 573 |
567 void ResourceLoader::CallDidFinishLoading() { | 574 void ResourceLoader::CallDidFinishLoading() { |
568 delegate_->DidFinishLoading(this); | 575 delegate_->DidFinishLoading(this); |
569 } | 576 } |
570 | 577 |
571 } // namespace content | 578 } // namespace content |
OLD | NEW |