Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(227)

Side by Side Diff: chrome/browser/download/download_history.cc

Issue 722953002: downloads: add the ability to undo download removal. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: dcheck Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 // DownloadHistory manages persisting DownloadItems to the history service by 5 // DownloadHistory manages persisting DownloadItems to the history service by
6 // observing a single DownloadManager and all its DownloadItems using an 6 // observing a single DownloadManager and all its DownloadItems using an
7 // AllDownloadItemNotifier. 7 // AllDownloadItemNotifier.
8 // 8 //
9 // DownloadHistory decides whether and when to add items to, remove items from, 9 // DownloadHistory decides whether and when to add items to, remove items from,
10 // and update items in the database. DownloadHistory uses DownloadHistoryData to 10 // and update items in the database. DownloadHistory uses DownloadHistoryData to
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 } 64 }
65 65
66 static const DownloadHistoryData* Get(const content::DownloadItem* item) { 66 static const DownloadHistoryData* Get(const content::DownloadItem* item) {
67 const base::SupportsUserData::Data* data = item->GetUserData(kKey); 67 const base::SupportsUserData::Data* data = item->GetUserData(kKey);
68 return (data == NULL) ? NULL 68 return (data == NULL) ? NULL
69 : static_cast<const DownloadHistoryData*>(data); 69 : static_cast<const DownloadHistoryData*>(data);
70 } 70 }
71 71
72 explicit DownloadHistoryData(content::DownloadItem* item) 72 explicit DownloadHistoryData(content::DownloadItem* item)
73 : state_(NOT_PERSISTED), 73 : state_(NOT_PERSISTED),
74 was_restored_from_history_(false) { 74 was_restored_from_history_(false),
75 was_revived_(false) {
75 item->SetUserData(kKey, this); 76 item->SetUserData(kKey, this);
76 } 77 }
77 78
78 ~DownloadHistoryData() override {} 79 ~DownloadHistoryData() override {}
79 80
80 PersistenceState state() const { return state_; } 81 PersistenceState state() const { return state_; }
81 void SetState(PersistenceState s) { state_ = s; } 82 void SetState(PersistenceState s) { state_ = s; }
82 83
83 bool was_restored_from_history() const { return was_restored_from_history_; } 84 bool was_restored_from_history() const { return was_restored_from_history_; }
84 void set_was_restored_from_history(bool value) { 85 void set_was_restored_from_history(bool value) {
85 was_restored_from_history_ = value; 86 was_restored_from_history_ = value;
86 } 87 }
87 88
89 bool was_revived() const { return was_revived_; }
90 void set_was_revived(bool revived) { was_revived_ = revived; }
91
88 // This allows DownloadHistory::OnDownloadUpdated() to see what changed in a 92 // This allows DownloadHistory::OnDownloadUpdated() to see what changed in a
89 // DownloadItem if anything, in order to prevent writing to the database 93 // DownloadItem if anything, in order to prevent writing to the database
90 // unnecessarily. It is nullified when the item is no longer in progress in 94 // unnecessarily. It is nullified when the item is no longer in progress in
91 // order to save memory. 95 // order to save memory.
92 history::DownloadRow* info() { return info_.get(); } 96 history::DownloadRow* info() { return info_.get(); }
93 void set_info(const history::DownloadRow& i) { 97 void set_info(const history::DownloadRow& i) {
94 info_.reset(new history::DownloadRow(i)); 98 info_.reset(new history::DownloadRow(i));
95 } 99 }
96 void clear_info() { 100 void clear_info() {
97 info_.reset(); 101 info_.reset();
98 } 102 }
99 103
100 private: 104 private:
101 static const char kKey[]; 105 static const char kKey[];
102 106
103 PersistenceState state_; 107 PersistenceState state_;
104 scoped_ptr<history::DownloadRow> info_; 108 scoped_ptr<history::DownloadRow> info_;
105 bool was_restored_from_history_; 109 bool was_restored_from_history_;
110 bool was_revived_;
106 111
107 DISALLOW_COPY_AND_ASSIGN(DownloadHistoryData); 112 DISALLOW_COPY_AND_ASSIGN(DownloadHistoryData);
108 }; 113 };
109 114
110 const char DownloadHistoryData::kKey[] = 115 const char DownloadHistoryData::kKey[] =
111 "DownloadItem DownloadHistoryData"; 116 "DownloadItem DownloadHistoryData";
112 117
113 history::DownloadRow GetDownloadRow( 118 history::DownloadRow GetDownloadRow(
114 content::DownloadItem* item) { 119 content::DownloadItem* item) {
115 std::string by_ext_id, by_ext_name; 120 std::string by_ext_id, by_ext_name;
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 // observer that can also see data->state(), which is the only thing that 370 // observer that can also see data->state(), which is the only thing that
366 // ItemAdded() changed. 371 // ItemAdded() changed.
367 OnDownloadUpdated(notifier_.GetManager(), item); 372 OnDownloadUpdated(notifier_.GetManager(), item);
368 } 373 }
369 374
370 void DownloadHistory::OnDownloadCreated( 375 void DownloadHistory::OnDownloadCreated(
371 content::DownloadManager* manager, content::DownloadItem* item) { 376 content::DownloadManager* manager, content::DownloadItem* item) {
372 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 377 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
373 378
374 // All downloads should pass through OnDownloadCreated exactly once. 379 // All downloads should pass through OnDownloadCreated exactly once.
375 CHECK(!DownloadHistoryData::Get(item)); 380 DownloadHistoryData* data = DownloadHistoryData::Get(item);
376 DownloadHistoryData* data = new DownloadHistoryData(item); 381 CHECK(!data || data->was_revived());
382
383 if (!data)
384 data = new DownloadHistoryData(item);
385
377 if (item->GetId() == loading_id_) { 386 if (item->GetId() == loading_id_) {
378 data->SetState(DownloadHistoryData::PERSISTED); 387 data->SetState(DownloadHistoryData::PERSISTED);
379 data->set_was_restored_from_history(true); 388 data->set_was_restored_from_history(true);
380 loading_id_ = content::DownloadItem::kInvalidId; 389 loading_id_ = content::DownloadItem::kInvalidId;
381 } 390 }
382 if (item->GetState() == content::DownloadItem::IN_PROGRESS) { 391 if (item->GetState() == content::DownloadItem::IN_PROGRESS) {
383 data->set_info(GetDownloadRow(item)); 392 data->set_info(GetDownloadRow(item));
384 } 393 }
385 MaybeAddToHistory(item); 394 MaybeAddToHistory(item);
386 } 395 }
387 396
397 void DownloadHistory::OnDownloadRevived(
398 content::DownloadManager* manager, content::DownloadItem* item) {
399 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
400
401 DownloadHistoryData* data = DownloadHistoryData::Get(item);
402 if (data)
403 data->set_was_revived(true);
404 }
405
388 void DownloadHistory::OnDownloadUpdated( 406 void DownloadHistory::OnDownloadUpdated(
389 content::DownloadManager* manager, content::DownloadItem* item) { 407 content::DownloadManager* manager, content::DownloadItem* item) {
390 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 408 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
391 409
392 DownloadHistoryData* data = DownloadHistoryData::Get(item); 410 DownloadHistoryData* data = DownloadHistoryData::Get(item);
393 if (data->state() == DownloadHistoryData::NOT_PERSISTED) { 411 if (data->state() == DownloadHistoryData::NOT_PERSISTED) {
394 MaybeAddToHistory(item); 412 MaybeAddToHistory(item);
395 return; 413 return;
396 } 414 }
397 if (item->IsTemporary()) { 415 if (item->IsTemporary()) {
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
455 removing_ids_.insert(download_id); 473 removing_ids_.insert(download_id);
456 } 474 }
457 475
458 void DownloadHistory::RemoveDownloadsBatch() { 476 void DownloadHistory::RemoveDownloadsBatch() {
459 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 477 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
460 IdSet remove_ids; 478 IdSet remove_ids;
461 removing_ids_.swap(remove_ids); 479 removing_ids_.swap(remove_ids);
462 history_->RemoveDownloads(remove_ids); 480 history_->RemoveDownloads(remove_ids);
463 FOR_EACH_OBSERVER(Observer, observers_, OnDownloadsRemoved(remove_ids)); 481 FOR_EACH_OBSERVER(Observer, observers_, OnDownloadsRemoved(remove_ids));
464 } 482 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698