OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/download/download_item_impl.h" | 5 #include "content/browser/download/download_item_impl.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
11 #include "base/file_util.h" | 11 #include "base/file_util.h" |
12 #include "base/format_macros.h" | 12 #include "base/format_macros.h" |
13 #include "base/i18n/case_conversion.h" | 13 #include "base/i18n/case_conversion.h" |
14 #include "base/i18n/string_search.h" | 14 #include "base/i18n/string_search.h" |
15 #include "base/logging.h" | 15 #include "base/logging.h" |
16 #include "base/metrics/histogram.h" | 16 #include "base/metrics/histogram.h" |
17 #include "base/stringprintf.h" | 17 #include "base/stringprintf.h" |
18 #include "base/utf_string_conversions.h" | 18 #include "base/utf_string_conversions.h" |
19 #include "content/browser/download/download_create_info.h" | 19 #include "content/browser/download/download_create_info.h" |
20 #include "content/browser/download/download_file.h" | 20 #include "content/browser/download/download_file.h" |
21 #include "content/browser/download/download_file_manager.h" | 21 #include "content/browser/download/download_file_manager.h" |
22 #include "content/browser/download/download_id.h" | 22 #include "content/browser/download/download_id.h" |
23 #include "content/browser/download/download_manager.h" | |
24 #include "content/browser/download/download_persistent_store_info.h" | 23 #include "content/browser/download/download_persistent_store_info.h" |
25 #include "content/browser/download/download_request_handle.h" | 24 #include "content/browser/download/download_request_handle.h" |
26 #include "content/browser/download/download_stats.h" | 25 #include "content/browser/download/download_stats.h" |
27 #include "content/browser/download/interrupt_reasons.h" | 26 #include "content/browser/download/interrupt_reasons.h" |
28 #include "content/browser/tab_contents/tab_contents.h" | 27 #include "content/browser/tab_contents/tab_contents.h" |
29 #include "content/public/browser/browser_thread.h" | 28 #include "content/public/browser/browser_thread.h" |
30 #include "content/public/browser/content_browser_client.h" | 29 #include "content/public/browser/content_browser_client.h" |
31 #include "content/public/browser/download_manager_delegate.h" | |
32 #include "net/base/net_util.h" | 30 #include "net/base/net_util.h" |
33 | 31 |
34 using content::BrowserThread; | 32 using content::BrowserThread; |
35 | 33 |
36 // A DownloadItem normally goes through the following states: | 34 // A DownloadItem normally goes through the following states: |
37 // * Created (when download starts) | 35 // * Created (when download starts) |
38 // * Made visible to consumers (e.g. Javascript) after the | 36 // * Made visible to consumers (e.g. Javascript) after the |
39 // destination file has been determined. | 37 // destination file has been determined. |
40 // * Entered into the history database. | 38 // * Entered into the history database. |
41 // * Made visible in the download shelf. | 39 // * Made visible in the download shelf. |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
111 virtual void PauseRequest() const OVERRIDE {} | 109 virtual void PauseRequest() const OVERRIDE {} |
112 virtual void ResumeRequest() const OVERRIDE {} | 110 virtual void ResumeRequest() const OVERRIDE {} |
113 virtual void CancelRequest() const OVERRIDE {} | 111 virtual void CancelRequest() const OVERRIDE {} |
114 virtual std::string DebugString() const OVERRIDE { | 112 virtual std::string DebugString() const OVERRIDE { |
115 return "Null DownloadRequestHandle"; | 113 return "Null DownloadRequestHandle"; |
116 } | 114 } |
117 }; | 115 }; |
118 | 116 |
119 } // namespace | 117 } // namespace |
120 | 118 |
| 119 // Infrastructure in DownloadItemImpl::Delegate to assert invariant that |
| 120 // delegate always outlives all attached DownloadItemImpls. |
| 121 DownloadItemImpl::Delegate::Delegate() |
| 122 : count_(0) {} |
| 123 |
| 124 DownloadItemImpl::Delegate::~Delegate() { |
| 125 DCHECK_EQ(0, count_); |
| 126 } |
| 127 |
| 128 void DownloadItemImpl::Delegate::Attach() { |
| 129 ++count_; |
| 130 } |
| 131 |
| 132 void DownloadItemImpl::Delegate::Detach() { |
| 133 DCHECK_LT(0, count_); |
| 134 --count_; |
| 135 } |
| 136 |
121 // Our download table ID starts at 1, so we use 0 to represent a download that | 137 // Our download table ID starts at 1, so we use 0 to represent a download that |
122 // has started, but has not yet had its data persisted in the table. We use fake | 138 // has started, but has not yet had its data persisted in the table. We use fake |
123 // database handles in incognito mode starting at -1 and progressively getting | 139 // database handles in incognito mode starting at -1 and progressively getting |
124 // more negative. | 140 // more negative. |
125 | 141 |
126 // Constructor for reading from the history service. | 142 // Constructor for reading from the history service. |
127 DownloadItemImpl::DownloadItemImpl(DownloadManager* download_manager, | 143 DownloadItemImpl::DownloadItemImpl(Delegate* delegate, |
| 144 DownloadId download_id, |
128 const DownloadPersistentStoreInfo& info) | 145 const DownloadPersistentStoreInfo& info) |
129 : download_id_(download_manager->GetNextId()), | 146 : download_id_(download_id), |
130 full_path_(info.path), | 147 full_path_(info.path), |
131 url_chain_(1, info.url), | 148 url_chain_(1, info.url), |
132 referrer_url_(info.referrer_url), | 149 referrer_url_(info.referrer_url), |
133 total_bytes_(info.total_bytes), | 150 total_bytes_(info.total_bytes), |
134 received_bytes_(info.received_bytes), | 151 received_bytes_(info.received_bytes), |
135 bytes_per_sec_(0), | 152 bytes_per_sec_(0), |
136 start_tick_(base::TimeTicks()), | 153 start_tick_(base::TimeTicks()), |
137 state_(static_cast<DownloadState>(info.state)), | 154 state_(static_cast<DownloadState>(info.state)), |
138 start_time_(info.start_time), | 155 start_time_(info.start_time), |
139 end_time_(info.end_time), | 156 end_time_(info.end_time), |
140 db_handle_(info.db_handle), | 157 db_handle_(info.db_handle), |
141 download_manager_(download_manager), | 158 delegate_(delegate), |
142 is_paused_(false), | 159 is_paused_(false), |
143 open_when_complete_(false), | 160 open_when_complete_(false), |
144 file_externally_removed_(false), | 161 file_externally_removed_(false), |
145 safety_state_(SAFE), | 162 safety_state_(SAFE), |
146 auto_opened_(false), | 163 auto_opened_(false), |
147 is_otr_(false), | 164 is_otr_(false), |
148 is_temporary_(false), | 165 is_temporary_(false), |
149 all_data_saved_(false), | 166 all_data_saved_(false), |
150 opened_(info.opened), | 167 opened_(info.opened), |
151 open_enabled_(true), | 168 open_enabled_(true), |
152 delegate_delayed_complete_(false) { | 169 delegate_delayed_complete_(false) { |
| 170 delegate_->Attach(); |
153 if (IsInProgress()) | 171 if (IsInProgress()) |
154 state_ = CANCELLED; | 172 state_ = CANCELLED; |
155 if (IsComplete()) | 173 if (IsComplete()) |
156 all_data_saved_ = true; | 174 all_data_saved_ = true; |
157 Init(false /* not actively downloading */); | 175 Init(false /* not actively downloading */); |
158 } | 176 } |
159 | 177 |
160 // Constructing for a regular download: | 178 // Constructing for a regular download: |
161 DownloadItemImpl::DownloadItemImpl( | 179 DownloadItemImpl::DownloadItemImpl( |
162 DownloadManager* download_manager, | 180 Delegate* delegate, |
163 const DownloadCreateInfo& info, | 181 const DownloadCreateInfo& info, |
164 DownloadRequestHandleInterface* request_handle, | 182 DownloadRequestHandleInterface* request_handle, |
165 bool is_otr) | 183 bool is_otr) |
166 : state_info_(info.original_name, info.save_info.file_path, | 184 : state_info_(info.original_name, info.save_info.file_path, |
167 info.has_user_gesture, info.transition_type, | 185 info.has_user_gesture, info.transition_type, |
168 info.prompt_user_for_save_location, info.path_uniquifier, | 186 info.prompt_user_for_save_location, info.path_uniquifier, |
169 DownloadStateInfo::NOT_DANGEROUS), | 187 DownloadStateInfo::NOT_DANGEROUS), |
170 request_handle_(request_handle), | 188 request_handle_(request_handle), |
171 download_id_(info.download_id), | 189 download_id_(info.download_id), |
172 full_path_(info.path), | 190 full_path_(info.path), |
173 url_chain_(info.url_chain), | 191 url_chain_(info.url_chain), |
174 referrer_url_(info.referrer_url), | 192 referrer_url_(info.referrer_url), |
175 suggested_filename_(UTF16ToUTF8(info.save_info.suggested_name)), | 193 suggested_filename_(UTF16ToUTF8(info.save_info.suggested_name)), |
176 content_disposition_(info.content_disposition), | 194 content_disposition_(info.content_disposition), |
177 mime_type_(info.mime_type), | 195 mime_type_(info.mime_type), |
178 original_mime_type_(info.original_mime_type), | 196 original_mime_type_(info.original_mime_type), |
179 referrer_charset_(info.referrer_charset), | 197 referrer_charset_(info.referrer_charset), |
180 remote_address_(info.remote_address), | 198 remote_address_(info.remote_address), |
181 total_bytes_(info.total_bytes), | 199 total_bytes_(info.total_bytes), |
182 received_bytes_(0), | 200 received_bytes_(0), |
183 bytes_per_sec_(0), | 201 bytes_per_sec_(0), |
184 last_reason_(DOWNLOAD_INTERRUPT_REASON_NONE), | 202 last_reason_(DOWNLOAD_INTERRUPT_REASON_NONE), |
185 start_tick_(base::TimeTicks::Now()), | 203 start_tick_(base::TimeTicks::Now()), |
186 state_(IN_PROGRESS), | 204 state_(IN_PROGRESS), |
187 start_time_(info.start_time), | 205 start_time_(info.start_time), |
188 db_handle_(DownloadItem::kUninitializedHandle), | 206 db_handle_(DownloadItem::kUninitializedHandle), |
189 download_manager_(download_manager), | 207 delegate_(delegate), |
190 is_paused_(false), | 208 is_paused_(false), |
191 open_when_complete_(false), | 209 open_when_complete_(false), |
192 file_externally_removed_(false), | 210 file_externally_removed_(false), |
193 safety_state_(SAFE), | 211 safety_state_(SAFE), |
194 auto_opened_(false), | 212 auto_opened_(false), |
195 is_otr_(is_otr), | 213 is_otr_(is_otr), |
196 is_temporary_(!info.save_info.file_path.empty()), | 214 is_temporary_(!info.save_info.file_path.empty()), |
197 all_data_saved_(false), | 215 all_data_saved_(false), |
198 opened_(false), | 216 opened_(false), |
199 open_enabled_(true), | 217 open_enabled_(true), |
200 delegate_delayed_complete_(false) { | 218 delegate_delayed_complete_(false) { |
| 219 delegate_->Attach(); |
201 Init(true /* actively downloading */); | 220 Init(true /* actively downloading */); |
202 } | 221 } |
203 | 222 |
204 // Constructing for the "Save Page As..." feature: | 223 // Constructing for the "Save Page As..." feature: |
205 DownloadItemImpl::DownloadItemImpl(DownloadManager* download_manager, | 224 DownloadItemImpl::DownloadItemImpl(Delegate* delegate, |
206 const FilePath& path, | 225 const FilePath& path, |
207 const GURL& url, | 226 const GURL& url, |
208 bool is_otr, | 227 bool is_otr, |
209 DownloadId download_id) | 228 DownloadId download_id) |
210 : request_handle_(new NullDownloadRequestHandle()), | 229 : request_handle_(new NullDownloadRequestHandle()), |
211 download_id_(download_id), | 230 download_id_(download_id), |
212 full_path_(path), | 231 full_path_(path), |
213 url_chain_(1, url), | 232 url_chain_(1, url), |
214 referrer_url_(GURL()), | 233 referrer_url_(GURL()), |
215 total_bytes_(0), | 234 total_bytes_(0), |
216 received_bytes_(0), | 235 received_bytes_(0), |
217 bytes_per_sec_(0), | 236 bytes_per_sec_(0), |
218 last_reason_(DOWNLOAD_INTERRUPT_REASON_NONE), | 237 last_reason_(DOWNLOAD_INTERRUPT_REASON_NONE), |
219 start_tick_(base::TimeTicks::Now()), | 238 start_tick_(base::TimeTicks::Now()), |
220 state_(IN_PROGRESS), | 239 state_(IN_PROGRESS), |
221 start_time_(base::Time::Now()), | 240 start_time_(base::Time::Now()), |
222 db_handle_(DownloadItem::kUninitializedHandle), | 241 db_handle_(DownloadItem::kUninitializedHandle), |
223 download_manager_(download_manager), | 242 delegate_(delegate), |
224 is_paused_(false), | 243 is_paused_(false), |
225 open_when_complete_(false), | 244 open_when_complete_(false), |
226 file_externally_removed_(false), | 245 file_externally_removed_(false), |
227 safety_state_(SAFE), | 246 safety_state_(SAFE), |
228 auto_opened_(false), | 247 auto_opened_(false), |
229 is_otr_(is_otr), | 248 is_otr_(is_otr), |
230 is_temporary_(false), | 249 is_temporary_(false), |
231 all_data_saved_(false), | 250 all_data_saved_(false), |
232 opened_(false), | 251 opened_(false), |
233 open_enabled_(true), | 252 open_enabled_(true), |
234 delegate_delayed_complete_(false) { | 253 delegate_delayed_complete_(false) { |
| 254 delegate_->Attach(); |
235 Init(true /* actively downloading */); | 255 Init(true /* actively downloading */); |
236 } | 256 } |
237 | 257 |
238 DownloadItemImpl::~DownloadItemImpl() { | 258 DownloadItemImpl::~DownloadItemImpl() { |
239 // TODO(rdsmith): Change to DCHECK after http://crbug.com/85408 resolved. | 259 // TODO(rdsmith): Change to DCHECK after http://crbug.com/85408 resolved. |
240 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 260 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
241 | 261 |
242 TransitionTo(REMOVING); | 262 TransitionTo(REMOVING); |
243 download_manager_->AssertQueueStateConsistent(this); | 263 delegate_->AssertStateConsistent(this); |
| 264 delegate_->Detach(); |
244 } | 265 } |
245 | 266 |
246 void DownloadItemImpl::AddObserver(Observer* observer) { | 267 void DownloadItemImpl::AddObserver(Observer* observer) { |
247 // TODO(rdsmith): Change to DCHECK after http://crbug.com/85408 resolved. | 268 // TODO(rdsmith): Change to DCHECK after http://crbug.com/85408 resolved. |
248 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 269 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
249 | 270 |
250 observers_.AddObserver(observer); | 271 observers_.AddObserver(observer); |
251 } | 272 } |
252 | 273 |
253 void DownloadItemImpl::RemoveObserver(Observer* observer) { | 274 void DownloadItemImpl::RemoveObserver(Observer* observer) { |
(...skipping 12 matching lines...) Expand all Loading... |
266 | 287 |
267 bool DownloadItemImpl::CanShowInFolder() { | 288 bool DownloadItemImpl::CanShowInFolder() { |
268 return !IsCancelled() && !file_externally_removed_; | 289 return !IsCancelled() && !file_externally_removed_; |
269 } | 290 } |
270 | 291 |
271 bool DownloadItemImpl::CanOpenDownload() { | 292 bool DownloadItemImpl::CanOpenDownload() { |
272 return !file_externally_removed_; | 293 return !file_externally_removed_; |
273 } | 294 } |
274 | 295 |
275 bool DownloadItemImpl::ShouldOpenFileBasedOnExtension() { | 296 bool DownloadItemImpl::ShouldOpenFileBasedOnExtension() { |
276 return download_manager_->delegate()->ShouldOpenFileBasedOnExtension( | 297 return delegate_->ShouldOpenFileBasedOnExtension(GetUserVerifiedFilePath()); |
277 GetUserVerifiedFilePath()); | |
278 } | 298 } |
279 | 299 |
280 void DownloadItemImpl::OpenDownload() { | 300 void DownloadItemImpl::OpenDownload() { |
281 // TODO(rdsmith): Change to DCHECK after http://crbug.com/85408 resolved. | 301 // TODO(rdsmith): Change to DCHECK after http://crbug.com/85408 resolved. |
282 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 302 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
283 | 303 |
284 if (IsPartialDownload()) { | 304 if (IsPartialDownload()) { |
285 open_when_complete_ = !open_when_complete_; | 305 open_when_complete_ = !open_when_complete_; |
286 return; | 306 return; |
287 } | 307 } |
288 | 308 |
289 if (!IsComplete() || file_externally_removed_) | 309 if (!IsComplete() || file_externally_removed_) |
290 return; | 310 return; |
291 | 311 |
292 // Ideally, we want to detect errors in opening and report them, but we | 312 // Ideally, we want to detect errors in opening and report them, but we |
293 // don't generally have the proper interface for that to the external | 313 // don't generally have the proper interface for that to the external |
294 // program that opens the file. So instead we spawn a check to update | 314 // program that opens the file. So instead we spawn a check to update |
295 // the UI if the file has been deleted in parallel with the open. | 315 // the UI if the file has been deleted in parallel with the open. |
296 download_manager_->CheckForFileRemoval(this); | 316 delegate_->CheckForFileRemoval(this); |
297 download_stats::RecordOpen(GetEndTime(), !GetOpened()); | 317 download_stats::RecordOpen(GetEndTime(), !GetOpened()); |
298 opened_ = true; | 318 opened_ = true; |
299 FOR_EACH_OBSERVER(Observer, observers_, OnDownloadOpened(this)); | 319 FOR_EACH_OBSERVER(Observer, observers_, OnDownloadOpened(this)); |
300 download_manager_->MarkDownloadOpened(this); | 320 delegate_->DownloadOpened(this); |
301 | 321 |
302 // For testing: If download opening is disabled on this item, | 322 // For testing: If download opening is disabled on this item, |
303 // make the rest of the routine a no-op. | 323 // make the rest of the routine a no-op. |
304 if (!open_enabled_) | 324 if (!open_enabled_) |
305 return; | 325 return; |
306 | 326 |
307 content::GetContentClient()->browser()->OpenItem(GetFullPath()); | 327 content::GetContentClient()->browser()->OpenItem(GetFullPath()); |
308 } | 328 } |
309 | 329 |
310 void DownloadItemImpl::ShowDownloadInShell() { | 330 void DownloadItemImpl::ShowDownloadInShell() { |
311 // TODO(rdsmith): Change to DCHECK after http://crbug.com/85408 resolved. | 331 // TODO(rdsmith): Change to DCHECK after http://crbug.com/85408 resolved. |
312 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 332 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
313 | 333 |
314 content::GetContentClient()->browser()->ShowItemInFolder(GetFullPath()); | 334 content::GetContentClient()->browser()->ShowItemInFolder(GetFullPath()); |
315 } | 335 } |
316 | 336 |
317 void DownloadItemImpl::DangerousDownloadValidated() { | 337 void DownloadItemImpl::DangerousDownloadValidated() { |
318 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 338 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
319 DCHECK_EQ(DANGEROUS, GetSafetyState()); | 339 DCHECK_EQ(DANGEROUS, GetSafetyState()); |
320 | 340 |
321 UMA_HISTOGRAM_ENUMERATION("Download.DangerousDownloadValidated", | 341 UMA_HISTOGRAM_ENUMERATION("Download.DangerousDownloadValidated", |
322 GetDangerType(), | 342 GetDangerType(), |
323 DownloadStateInfo::DANGEROUS_TYPE_MAX); | 343 DownloadStateInfo::DANGEROUS_TYPE_MAX); |
324 | 344 |
325 safety_state_ = DANGEROUS_BUT_VALIDATED; | 345 safety_state_ = DANGEROUS_BUT_VALIDATED; |
326 UpdateObservers(); | 346 UpdateObservers(); |
327 | 347 |
328 download_manager_->MaybeCompleteDownload(this); | 348 delegate_->MaybeCompleteDownload(this); |
329 } | 349 } |
330 | 350 |
331 void DownloadItemImpl::UpdateSize(int64 bytes_so_far) { | 351 void DownloadItemImpl::UpdateSize(int64 bytes_so_far) { |
332 // TODO(rdsmith): Change to DCHECK after http://crbug.com/85408 resolved. | 352 // TODO(rdsmith): Change to DCHECK after http://crbug.com/85408 resolved. |
333 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 353 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
334 | 354 |
335 received_bytes_ = bytes_so_far; | 355 received_bytes_ = bytes_so_far; |
336 | 356 |
337 // If we've received more data than we were expecting (bad server info?), | 357 // If we've received more data than we were expecting (bad server info?), |
338 // revert to 'unknown size mode'. | 358 // revert to 'unknown size mode'. |
(...skipping 30 matching lines...) Expand all Loading... |
369 if (!IsPartialDownload()) { | 389 if (!IsPartialDownload()) { |
370 // Small downloads might be complete before this method has | 390 // Small downloads might be complete before this method has |
371 // a chance to run. | 391 // a chance to run. |
372 return; | 392 return; |
373 } | 393 } |
374 | 394 |
375 download_stats::RecordDownloadCount(download_stats::CANCELLED_COUNT); | 395 download_stats::RecordDownloadCount(download_stats::CANCELLED_COUNT); |
376 | 396 |
377 TransitionTo(CANCELLED); | 397 TransitionTo(CANCELLED); |
378 if (user_cancel) | 398 if (user_cancel) |
379 download_manager_->DownloadCancelledInternal(this); | 399 delegate_->DownloadCancelled(this); |
380 } | 400 } |
381 | 401 |
382 void DownloadItemImpl::MarkAsComplete() { | 402 void DownloadItemImpl::MarkAsComplete() { |
383 // TODO(rdsmith): Change to DCHECK after http://crbug.com/85408 resolved. | 403 // TODO(rdsmith): Change to DCHECK after http://crbug.com/85408 resolved. |
384 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 404 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
385 | 405 |
386 DCHECK(all_data_saved_); | 406 DCHECK(all_data_saved_); |
387 end_time_ = base::Time::Now(); | 407 end_time_ = base::Time::Now(); |
388 TransitionTo(COMPLETE); | 408 TransitionTo(COMPLETE); |
389 } | 409 } |
(...skipping 12 matching lines...) Expand all Loading... |
402 all_data_saved_ = true; | 422 all_data_saved_ = true; |
403 UpdateSize(size); | 423 UpdateSize(size); |
404 hash_ = final_hash; | 424 hash_ = final_hash; |
405 } | 425 } |
406 | 426 |
407 void DownloadItemImpl::OnDownloadedFileRemoved() { | 427 void DownloadItemImpl::OnDownloadedFileRemoved() { |
408 file_externally_removed_ = true; | 428 file_externally_removed_ = true; |
409 UpdateObservers(); | 429 UpdateObservers(); |
410 } | 430 } |
411 | 431 |
| 432 void DownloadItemImpl::MaybeCompleteDownload() { |
| 433 // TODO(rdsmith): Move logic for this function here. |
| 434 delegate_->MaybeCompleteDownload(this); |
| 435 } |
| 436 |
412 void DownloadItemImpl::Completed() { | 437 void DownloadItemImpl::Completed() { |
413 // TODO(rdsmith): Change to DCHECK after http://crbug.com/85408 resolved. | 438 // TODO(rdsmith): Change to DCHECK after http://crbug.com/85408 resolved. |
414 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 439 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
415 | 440 |
416 VLOG(20) << __FUNCTION__ << "() " << DebugString(false); | 441 VLOG(20) << __FUNCTION__ << "() " << DebugString(false); |
417 | 442 |
418 DCHECK(all_data_saved_); | 443 DCHECK(all_data_saved_); |
419 end_time_ = base::Time::Now(); | 444 end_time_ = base::Time::Now(); |
420 TransitionTo(COMPLETE); | 445 TransitionTo(COMPLETE); |
421 download_manager_->DownloadCompleted(GetId()); | 446 delegate_->DownloadCompleted(this); |
422 download_stats::RecordDownloadCompleted(start_tick_, received_bytes_); | 447 download_stats::RecordDownloadCompleted(start_tick_, received_bytes_); |
423 | 448 |
424 if (auto_opened_) { | 449 if (auto_opened_) { |
425 // If it was already handled by the delegate, do nothing. | 450 // If it was already handled by the delegate, do nothing. |
426 } else if (GetOpenWhenComplete() || | 451 } else if (GetOpenWhenComplete() || |
427 ShouldOpenFileBasedOnExtension() || | 452 ShouldOpenFileBasedOnExtension() || |
428 IsTemporary()) { | 453 IsTemporary()) { |
429 // If the download is temporary, like in drag-and-drop, do not open it but | 454 // If the download is temporary, like in drag-and-drop, do not open it but |
430 // we still need to set it auto-opened so that it can be removed from the | 455 // we still need to set it auto-opened so that it can be removed from the |
431 // download shelf. | 456 // download shelf. |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
497 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, | 522 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, |
498 base::Bind(&DeleteDownloadedFile, full_path_)); | 523 base::Bind(&DeleteDownloadedFile, full_path_)); |
499 Remove(); | 524 Remove(); |
500 // We have now been deleted. | 525 // We have now been deleted. |
501 } | 526 } |
502 | 527 |
503 void DownloadItemImpl::Remove() { | 528 void DownloadItemImpl::Remove() { |
504 // TODO(rdsmith): Change to DCHECK after http://crbug.com/85408 resolved. | 529 // TODO(rdsmith): Change to DCHECK after http://crbug.com/85408 resolved. |
505 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 530 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
506 | 531 |
507 download_manager_->AssertQueueStateConsistent(this); | 532 delegate_->AssertStateConsistent(this); |
508 Cancel(true); | 533 Cancel(true); |
509 download_manager_->AssertQueueStateConsistent(this); | 534 delegate_->AssertStateConsistent(this); |
510 | 535 |
511 TransitionTo(REMOVING); | 536 TransitionTo(REMOVING); |
512 download_manager_->RemoveDownload(db_handle_); | 537 delegate_->DownloadRemoved(this); |
513 // We have now been deleted. | 538 // We have now been deleted. |
514 } | 539 } |
515 | 540 |
516 bool DownloadItemImpl::TimeRemaining(base::TimeDelta* remaining) const { | 541 bool DownloadItemImpl::TimeRemaining(base::TimeDelta* remaining) const { |
517 if (total_bytes_ <= 0) | 542 if (total_bytes_ <= 0) |
518 return false; // We never received the content_length for this download. | 543 return false; // We never received the content_length for this download. |
519 | 544 |
520 int64 speed = CurrentSpeed(); | 545 int64 speed = CurrentSpeed(); |
521 if (speed == 0) | 546 if (speed == 0) |
522 return false; | 547 return false; |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
576 | 601 |
577 VLOG(20) << __FUNCTION__ << "()" | 602 VLOG(20) << __FUNCTION__ << "()" |
578 << " needs rename = " << NeedsRename() | 603 << " needs rename = " << NeedsRename() |
579 << " " << DebugString(true); | 604 << " " << DebugString(true); |
580 DCHECK_NE(DANGEROUS, GetSafetyState()); | 605 DCHECK_NE(DANGEROUS, GetSafetyState()); |
581 DCHECK(file_manager); | 606 DCHECK(file_manager); |
582 | 607 |
583 if (NeedsRename()) { | 608 if (NeedsRename()) { |
584 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, | 609 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, |
585 base::Bind(&DownloadFileManager::RenameCompletingDownloadFile, | 610 base::Bind(&DownloadFileManager::RenameCompletingDownloadFile, |
586 file_manager, GetGlobalId(), | 611 file_manager, download_id_, |
587 GetTargetFilePath(), GetSafetyState() == SAFE)); | 612 GetTargetFilePath(), GetSafetyState() == SAFE)); |
588 return; | 613 return; |
589 } | 614 } |
590 | 615 |
591 Completed(); | 616 Completed(); |
592 | 617 |
593 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, | 618 BrowserThread::PostTask( |
594 base::Bind(&DownloadFileManager::CompleteDownload, | 619 BrowserThread::FILE, FROM_HERE, |
595 file_manager, GetGlobalId())); | 620 base::Bind(&DownloadFileManager::CompleteDownload, |
| 621 file_manager, download_id_)); |
596 } | 622 } |
597 | 623 |
598 void DownloadItemImpl::OnDownloadRenamedToFinalName(const FilePath& full_path) { | 624 void DownloadItemImpl::OnDownloadRenamedToFinalName(const FilePath& full_path) { |
599 // TODO(rdsmith): Change to DCHECK after http://crbug.com/85408 resolved. | 625 // TODO(rdsmith): Change to DCHECK after http://crbug.com/85408 resolved. |
600 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 626 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
601 | 627 |
602 VLOG(20) << __FUNCTION__ << "()" | 628 VLOG(20) << __FUNCTION__ << "()" |
603 << " full_path = \"" << full_path.value() << "\"" | 629 << " full_path = \"" << full_path.value() << "\"" |
604 << " needed rename = " << NeedsRename() | 630 << " needed rename = " << NeedsRename() |
605 << " " << DebugString(false); | 631 << " " << DebugString(false); |
606 DCHECK(NeedsRename()); | 632 DCHECK(NeedsRename()); |
607 | 633 |
608 Rename(full_path); | 634 Rename(full_path); |
609 | 635 |
610 if (download_manager_->delegate()->ShouldOpenDownload(this)) { | 636 if (delegate_->ShouldOpenDownload(this)) { |
611 Completed(); | 637 Completed(); |
612 } else { | 638 } else { |
613 delegate_delayed_complete_ = true; | 639 delegate_delayed_complete_ = true; |
614 } | 640 } |
615 } | 641 } |
616 | 642 |
617 bool DownloadItemImpl::MatchesQuery(const string16& query) const { | 643 bool DownloadItemImpl::MatchesQuery(const string16& query) const { |
618 if (query.empty()) | 644 if (query.empty()) |
619 return true; | 645 return true; |
620 | 646 |
621 DCHECK_EQ(query, base::i18n::ToLower(query)); | 647 DCHECK_EQ(query, base::i18n::ToLower(query)); |
622 | 648 |
623 string16 url_raw(UTF8ToUTF16(GetURL().spec())); | 649 string16 url_raw(UTF8ToUTF16(GetURL().spec())); |
624 if (base::i18n::StringSearchIgnoringCaseAndAccents(query, url_raw)) | 650 if (base::i18n::StringSearchIgnoringCaseAndAccents(query, url_raw)) |
625 return true; | 651 return true; |
626 | 652 |
627 // TODO(phajdan.jr): write a test case for the following code. | 653 // TODO(phajdan.jr): write a test case for the following code. |
628 // A good test case would be: | 654 // A good test case would be: |
629 // "/\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xbd\xa0\xe5\xa5\xbd", | 655 // "/\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xbd\xa0\xe5\xa5\xbd", |
630 // L"/\x4f60\x597d\x4f60\x597d", | 656 // L"/\x4f60\x597d\x4f60\x597d", |
631 // "/%E4%BD%A0%E5%A5%BD%E4%BD%A0%E5%A5%BD" | 657 // "/%E4%BD%A0%E5%A5%BD%E4%BD%A0%E5%A5%BD" |
632 std::string languages; | 658 std::string languages; |
633 TabContents* tab = GetTabContents(); | 659 languages = content::GetContentClient()->browser()->GetAcceptLangs( |
634 if (tab) { | 660 BrowserContext()); |
635 languages = content::GetContentClient()->browser()->GetAcceptLangs( | |
636 tab->browser_context()); | |
637 } | |
638 string16 url_formatted(net::FormatUrl(GetURL(), languages)); | 661 string16 url_formatted(net::FormatUrl(GetURL(), languages)); |
639 if (base::i18n::StringSearchIgnoringCaseAndAccents(query, url_formatted)) | 662 if (base::i18n::StringSearchIgnoringCaseAndAccents(query, url_formatted)) |
640 return true; | 663 return true; |
641 | 664 |
642 string16 path(GetFullPath().LossyDisplayName()); | 665 string16 path(GetFullPath().LossyDisplayName()); |
643 return base::i18n::StringSearchIgnoringCaseAndAccents(query, path); | 666 return base::i18n::StringSearchIgnoringCaseAndAccents(query, path); |
644 } | 667 } |
645 | 668 |
646 void DownloadItemImpl::SetFileCheckResults(const DownloadStateInfo& state) { | 669 void DownloadItemImpl::SetFileCheckResults(const DownloadStateInfo& state) { |
647 // TODO(rdsmith): Change to DCHECK after http://crbug.com/85408 resolved. | 670 // TODO(rdsmith): Change to DCHECK after http://crbug.com/85408 resolved. |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
699 TabContents* DownloadItemImpl::GetTabContents() const { | 722 TabContents* DownloadItemImpl::GetTabContents() const { |
700 // TODO(rdsmith): Remove null check after removing GetTabContents() from | 723 // TODO(rdsmith): Remove null check after removing GetTabContents() from |
701 // paths that might be used by DownloadItems created from history import. | 724 // paths that might be used by DownloadItems created from history import. |
702 // Currently such items have null request_handle_s, where other items | 725 // Currently such items have null request_handle_s, where other items |
703 // (regular and SavePackage downloads) have actual objects off the pointer. | 726 // (regular and SavePackage downloads) have actual objects off the pointer. |
704 if (request_handle_.get()) | 727 if (request_handle_.get()) |
705 return request_handle_->GetTabContents(); | 728 return request_handle_->GetTabContents(); |
706 return NULL; | 729 return NULL; |
707 } | 730 } |
708 | 731 |
| 732 content::BrowserContext* DownloadItemImpl::BrowserContext() const { |
| 733 return delegate_->BrowserContext(); |
| 734 } |
| 735 |
709 FilePath DownloadItemImpl::GetTargetFilePath() const { | 736 FilePath DownloadItemImpl::GetTargetFilePath() const { |
710 return full_path_.DirName().Append(state_info_.target_name); | 737 return full_path_.DirName().Append(state_info_.target_name); |
711 } | 738 } |
712 | 739 |
713 FilePath DownloadItemImpl::GetFileNameToReportUser() const { | 740 FilePath DownloadItemImpl::GetFileNameToReportUser() const { |
714 if (state_info_.path_uniquifier > 0) { | 741 if (state_info_.path_uniquifier > 0) { |
715 FilePath name(state_info_.target_name); | 742 FilePath name(state_info_.target_name); |
716 DownloadFile::AppendNumberToPath(&name, state_info_.path_uniquifier); | 743 DownloadFile::AppendNumberToPath(&name, state_info_.path_uniquifier); |
717 return name; | 744 return name; |
718 } | 745 } |
719 return state_info_.target_name; | 746 return state_info_.target_name; |
720 } | 747 } |
721 | 748 |
722 FilePath DownloadItemImpl::GetUserVerifiedFilePath() const { | 749 FilePath DownloadItemImpl::GetUserVerifiedFilePath() const { |
723 return (safety_state_ == DownloadItem::SAFE) ? | 750 return (safety_state_ == DownloadItem::SAFE) ? |
724 GetTargetFilePath() : full_path_; | 751 GetTargetFilePath() : full_path_; |
725 } | 752 } |
726 | 753 |
727 void DownloadItemImpl::OffThreadCancel(DownloadFileManager* file_manager) { | 754 void DownloadItemImpl::OffThreadCancel(DownloadFileManager* file_manager) { |
728 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 755 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
729 request_handle_->CancelRequest(); | 756 request_handle_->CancelRequest(); |
730 | 757 |
731 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, | 758 BrowserThread::PostTask( |
732 base::Bind(&DownloadFileManager::CancelDownload, | 759 BrowserThread::FILE, FROM_HERE, |
733 file_manager, GetGlobalId())); | 760 base::Bind(&DownloadFileManager::CancelDownload, |
| 761 file_manager, download_id_)); |
734 } | 762 } |
735 | 763 |
736 void DownloadItemImpl::Init(bool active) { | 764 void DownloadItemImpl::Init(bool active) { |
737 // TODO(rdsmith): Change to DCHECK after http://crbug.com/85408 resolved. | 765 // TODO(rdsmith): Change to DCHECK after http://crbug.com/85408 resolved. |
738 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 766 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
739 | 767 |
740 UpdateTarget(); | 768 UpdateTarget(); |
741 if (active) { | 769 if (active) { |
742 download_stats::RecordDownloadCount(download_stats::START_COUNT); | 770 download_stats::RecordDownloadCount(download_stats::START_COUNT); |
743 } | 771 } |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
858 total_bytes_ = total_bytes; | 886 total_bytes_ = total_bytes; |
859 } | 887 } |
860 const std::string& DownloadItemImpl::GetHash() const { return hash_; } | 888 const std::string& DownloadItemImpl::GetHash() const { return hash_; } |
861 int64 DownloadItemImpl::GetReceivedBytes() const { return received_bytes_; } | 889 int64 DownloadItemImpl::GetReceivedBytes() const { return received_bytes_; } |
862 int32 DownloadItemImpl::GetId() const { return download_id_.local(); } | 890 int32 DownloadItemImpl::GetId() const { return download_id_.local(); } |
863 DownloadId DownloadItemImpl::GetGlobalId() const { return download_id_; } | 891 DownloadId DownloadItemImpl::GetGlobalId() const { return download_id_; } |
864 base::Time DownloadItemImpl::GetStartTime() const { return start_time_; } | 892 base::Time DownloadItemImpl::GetStartTime() const { return start_time_; } |
865 base::Time DownloadItemImpl::GetEndTime() const { return end_time_; } | 893 base::Time DownloadItemImpl::GetEndTime() const { return end_time_; } |
866 void DownloadItemImpl::SetDbHandle(int64 handle) { db_handle_ = handle; } | 894 void DownloadItemImpl::SetDbHandle(int64 handle) { db_handle_ = handle; } |
867 int64 DownloadItemImpl::GetDbHandle() const { return db_handle_; } | 895 int64 DownloadItemImpl::GetDbHandle() const { return db_handle_; } |
868 DownloadManager* DownloadItemImpl::GetDownloadManager() { | |
869 return download_manager_; | |
870 } | |
871 bool DownloadItemImpl::IsPaused() const { return is_paused_; } | 896 bool DownloadItemImpl::IsPaused() const { return is_paused_; } |
872 bool DownloadItemImpl::GetOpenWhenComplete() const { | 897 bool DownloadItemImpl::GetOpenWhenComplete() const { |
873 return open_when_complete_; | 898 return open_when_complete_; |
874 } | 899 } |
875 void DownloadItemImpl::SetOpenWhenComplete(bool open) { | 900 void DownloadItemImpl::SetOpenWhenComplete(bool open) { |
876 open_when_complete_ = open; | 901 open_when_complete_ = open; |
877 } | 902 } |
878 bool DownloadItemImpl::GetFileExternallyRemoved() const { | 903 bool DownloadItemImpl::GetFileExternallyRemoved() const { |
879 return file_externally_removed_; | 904 return file_externally_removed_; |
880 } | 905 } |
(...skipping 15 matching lines...) Expand all Loading... |
896 void DownloadItemImpl::SetOpened(bool opened) { opened_ = opened; } | 921 void DownloadItemImpl::SetOpened(bool opened) { opened_ = opened; } |
897 bool DownloadItemImpl::GetOpened() const { return opened_; } | 922 bool DownloadItemImpl::GetOpened() const { return opened_; } |
898 InterruptReason DownloadItemImpl::GetLastReason() const { | 923 InterruptReason DownloadItemImpl::GetLastReason() const { |
899 return last_reason_; | 924 return last_reason_; |
900 } | 925 } |
901 DownloadStateInfo DownloadItemImpl::GetStateInfo() const { return state_info_; } | 926 DownloadStateInfo DownloadItemImpl::GetStateInfo() const { return state_info_; } |
902 bool DownloadItemImpl::NeedsRename() const { | 927 bool DownloadItemImpl::NeedsRename() const { |
903 return state_info_.target_name != full_path_.BaseName(); | 928 return state_info_.target_name != full_path_.BaseName(); |
904 } | 929 } |
905 void DownloadItemImpl::MockDownloadOpenForTesting() { open_enabled_ = false; } | 930 void DownloadItemImpl::MockDownloadOpenForTesting() { open_enabled_ = false; } |
OLD | NEW |