| Index: chrome/browser/ui/webui/downloads_dom_handler.cc
|
| diff --git a/chrome/browser/ui/webui/downloads_dom_handler.cc b/chrome/browser/ui/webui/downloads_dom_handler.cc
|
| index f347ba33b455b8cfb0f31555b804c19ea5752ca5..f5638e880ac7c9377a068e46d8c5e68c100b1fa4 100644
|
| --- a/chrome/browser/ui/webui/downloads_dom_handler.cc
|
| +++ b/chrome/browser/ui/webui/downloads_dom_handler.cc
|
| @@ -16,6 +16,7 @@
|
| #include "base/metrics/field_trial.h"
|
| #include "base/metrics/histogram.h"
|
| #include "base/prefs/pref_service.h"
|
| +#include "base/strings/string_number_conversions.h"
|
| #include "base/strings/string_piece.h"
|
| #include "base/strings/utf_string_conversions.h"
|
| #include "base/threading/thread.h"
|
| @@ -131,7 +132,7 @@ base::DictionaryValue* CreateDownloadItemValue(
|
| download_item->GetStartTime(), NULL));
|
| file_value->SetString(
|
| "date_string", base::TimeFormatShortDate(download_item->GetStartTime()));
|
| - file_value->SetInteger("id", download_item->GetId());
|
| + file_value->SetString("id", base::Uint64ToString(download_item->GetId()));
|
|
|
| base::FilePath download_path(download_item->GetTargetFilePath());
|
| file_value->Set("file_path", base::CreateFilePathValue(download_path));
|
| @@ -156,7 +157,7 @@ base::DictionaryValue* CreateDownloadItemValue(
|
|
|
| // Keep file names as LTR.
|
| base::string16 file_name =
|
| - download_item->GetFileNameToReportUser().LossyDisplayName();
|
| + download_item->GetFileNameToReportUser().LossyDisplayName();
|
| file_name = base::i18n::GetDisplayStringInLTRDirectionality(file_name);
|
| file_value->SetString("file_name", file_name);
|
| file_value->SetString("url", download_item->GetURL().spec());
|
| @@ -230,7 +231,7 @@ base::DictionaryValue* CreateDownloadItemValue(
|
| break;
|
|
|
| case content::DownloadItem::MAX_DOWNLOAD_STATE:
|
| - NOTREACHED() << "state undefined";
|
| + NOTREACHED();
|
| }
|
|
|
| return file_value;
|
| @@ -249,6 +250,7 @@ bool IsDownloadDisplayable(const content::DownloadItem& item) {
|
| DownloadsDOMHandler::DownloadsDOMHandler(content::DownloadManager* dlm)
|
| : main_notifier_(dlm, this),
|
| update_scheduled_(false),
|
| + last_removed_id_(content::DownloadItem::kInvalidId),
|
| weak_ptr_factory_(this) {
|
| // Create our fileicon data source.
|
| Profile* profile = Profile::FromBrowserContext(dlm->GetBrowserContext());
|
| @@ -262,6 +264,7 @@ DownloadsDOMHandler::DownloadsDOMHandler(content::DownloadManager* dlm)
|
| }
|
|
|
| DownloadsDOMHandler::~DownloadsDOMHandler() {
|
| + FinalizeRemoval();
|
| }
|
|
|
| // DownloadsDOMHandler, public: -----------------------------------------------
|
| @@ -310,6 +313,9 @@ void DownloadsDOMHandler::RegisterMessages() {
|
| web_ui()->RegisterMessageCallback("openDownloadsFolder",
|
| base::Bind(&DownloadsDOMHandler::HandleOpenDownloadsFolder,
|
| weak_ptr_factory_.GetWeakPtr()));
|
| + web_ui()->RegisterMessageCallback("undoRemove",
|
| + base::Bind(&DownloadsDOMHandler::HandleUndoRemove,
|
| + weak_ptr_factory_.GetWeakPtr()));
|
| }
|
|
|
| void DownloadsDOMHandler::OnDownloadCreated(
|
| @@ -438,8 +444,11 @@ void DownloadsDOMHandler::HandleRemove(const base::ListValue* args) {
|
|
|
| CountDownloadsDOMEvents(DOWNLOADS_DOM_EVENT_REMOVE);
|
| content::DownloadItem* file = GetDownloadByValue(args);
|
| - if (file)
|
| + if (file) {
|
| + FinalizeRemoval();
|
| + last_removed_id_ = file->GetId();
|
| file->Remove();
|
| + }
|
| }
|
|
|
| void DownloadsDOMHandler::HandleCancel(const base::ListValue* args) {
|
| @@ -480,6 +489,18 @@ void DownloadsDOMHandler::HandleOpenDownloadsFolder(
|
| }
|
| }
|
|
|
| +void DownloadsDOMHandler::HandleUndoRemove(const base::ListValue* args) {
|
| + if (last_removed_id_ == content::DownloadItem::kInvalidId)
|
| + return;
|
| +
|
| + if (main_notifier_.GetManager())
|
| + main_notifier_.GetManager()->ReviveDownload(last_removed_id_);
|
| + if (original_notifier_ && original_notifier_->GetManager())
|
| + original_notifier_->GetManager()->ReviveDownload(last_removed_id_);
|
| +
|
| + last_removed_id_ = content::DownloadItem::kInvalidId;
|
| +}
|
| +
|
| // DownloadsDOMHandler, private: ----------------------------------------------
|
|
|
| void DownloadsDOMHandler::ScheduleSendCurrentDownloads() {
|
| @@ -561,16 +582,37 @@ bool DownloadsDOMHandler::IsDeletingHistoryAllowed() {
|
| GetPrefs()->GetBoolean(prefs::kAllowDeletingBrowserHistory));
|
| }
|
|
|
| +void DownloadsDOMHandler::FinalizeRemoval() {
|
| + if (last_removed_id_ == content::DownloadItem::kInvalidId)
|
| + return;
|
| +
|
| + if (main_notifier_.GetManager())
|
| + main_notifier_.GetManager()->FinalizeRemoval(last_removed_id_);
|
| + if (original_notifier_ && original_notifier_->GetManager())
|
| + original_notifier_->GetManager()->FinalizeRemoval(last_removed_id_);
|
| +
|
| + last_removed_id_ = content::DownloadItem::kInvalidId;
|
| +}
|
| +
|
| content::DownloadItem* DownloadsDOMHandler::GetDownloadByValue(
|
| const base::ListValue* args) {
|
| - int download_id = -1;
|
| - if (!ExtractIntegerValue(args, &download_id))
|
| + std::string download_id;
|
| + if (!args->GetString(0, &download_id)) {
|
| + NOTREACHED();
|
| return NULL;
|
| + }
|
| +
|
| + uint64 id;
|
| + if (!base::StringToUint64(download_id, &id)) {
|
| + NOTREACHED();
|
| + return NULL;
|
| + }
|
| +
|
| content::DownloadItem* item = NULL;
|
| if (main_notifier_.GetManager())
|
| - item = main_notifier_.GetManager()->GetDownload(download_id);
|
| + item = main_notifier_.GetManager()->GetDownload(id);
|
| if (!item && original_notifier_.get() && original_notifier_->GetManager())
|
| - item = original_notifier_->GetManager()->GetDownload(download_id);
|
| + item = original_notifier_->GetManager()->GetDownload(id);
|
| return item;
|
| }
|
|
|
|
|