Chromium Code Reviews| 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 be92a11a353bae762cca5328e4300147b70a4951..f1ecd110aa35e536e988e6ed027402fbe655566e 100644 |
| --- a/chrome/browser/ui/webui/downloads_dom_handler.cc |
| +++ b/chrome/browser/ui/webui/downloads_dom_handler.cc |
| @@ -25,6 +25,7 @@ |
| #include "chrome/browser/download/download_history.h" |
| #include "chrome/browser/download/download_item_model.h" |
| #include "chrome/browser/download/download_prefs.h" |
| +#include "chrome/browser/download/download_query.h" |
| #include "chrome/browser/download/download_service.h" |
| #include "chrome/browser/download/download_service_factory.h" |
| #include "chrome/browser/download/download_util.h" |
| @@ -61,17 +62,6 @@ namespace { |
| // stuff the downloads down the pipe slowly. |
| static const size_t kMaxDownloads = 150; |
| -// Sorts DownloadItems into descending order by their start time. |
| -class DownloadItemSorter : public std::binary_function<content::DownloadItem*, |
| - content::DownloadItem*, |
| - bool> { |
| - public: |
| - bool operator()(const content::DownloadItem* lhs, |
| - const content::DownloadItem* rhs) { |
| - return lhs->GetStartTime() > rhs->GetStartTime(); |
| - } |
| -}; |
| - |
| enum DownloadsDOMEvent { |
| DOWNLOADS_DOM_EVENT_GET_DOWNLOADS = 0, |
| DOWNLOADS_DOM_EVENT_OPEN_FILE = 1, |
| @@ -245,7 +235,7 @@ DownloadsDOMHandler::DownloadsDOMHandler(content::DownloadManager* dlm) |
| // Observe all the DownloadItems. |
| content::DownloadManager::DownloadVector downloads; |
| - SearchDownloads(&downloads); |
| + GetAllDownloads(&downloads); |
| for (content::DownloadManager::DownloadVector::const_iterator |
| iter = downloads.begin(); |
| iter != downloads.end(); ++iter) { |
| @@ -327,6 +317,20 @@ void DownloadsDOMHandler::OnDownloadCreated( |
| void DownloadsDOMHandler::OnDownloadUpdated( |
| content::DownloadItem* download_item) { |
| if (IsDownloadDisplayable(*download_item)) { |
| + if (!search_text_.empty()) { |
| + // Don't CallDownloadUpdated() if download_item doesn't match |
| + // search_text_. TODO(benjhayden): Consider splitting MatchesQuery() out |
|
James Hawkins
2012/09/13 16:08:29
nit: Put the TODO on its own line.
benjhayden
2012/09/13 16:24:22
Done.
|
| + // into a util function. |
| + content::DownloadManager::DownloadVector all_items, filtered_items; |
| + all_items.push_back(download_item); |
| + DownloadQuery query; |
| + scoped_ptr<base::Value> query_text(base::Value::CreateStringValue( |
| + search_text_)); |
| + query.AddFilter(DownloadQuery::FILTER_QUERY, *query_text.get()); |
| + query.Search(all_items.begin(), all_items.end(), &filtered_items); |
| + if (filtered_items.empty()) |
| + return; |
| + } |
| base::ListValue results_value; |
| results_value.Append(CreateDownloadItemValue(download_item, IsItemIncognito( |
| download_item->GetId(), |
| @@ -415,10 +419,8 @@ void DownloadsDOMHandler::HandlePause(const base::ListValue* args) { |
| void DownloadsDOMHandler::HandleRemove(const base::ListValue* args) { |
| CountDownloadsDOMEvents(DOWNLOADS_DOM_EVENT_REMOVE); |
| content::DownloadItem* file = GetDownloadByValue(args); |
| - if (file) { |
| - DCHECK(file->IsPersisted()); |
| + if (file) |
| file->Remove(); |
| - } |
| } |
| void DownloadsDOMHandler::HandleCancel(const base::ListValue* args) { |
| @@ -462,29 +464,33 @@ void DownloadsDOMHandler::ScheduleSendCurrentDownloads() { |
| void DownloadsDOMHandler::SendCurrentDownloads() { |
| update_scheduled_ = false; |
| - content::DownloadManager::DownloadVector downloads; |
| - SearchDownloads(&downloads); |
| - sort(downloads.begin(), downloads.end(), DownloadItemSorter()); |
| + content::DownloadManager::DownloadVector all_items, filtered_items; |
| + GetAllDownloads(&all_items); |
| + DownloadQuery query; |
| + if (!search_text_.empty()) { |
| + scoped_ptr<base::Value> query_text(base::Value::CreateStringValue( |
| + search_text_)); |
| + query.AddFilter(DownloadQuery::FILTER_QUERY, *query_text.get()); |
| + } |
| + query.AddFilter(base::Bind(&IsDownloadDisplayable)); |
| + query.AddSorter(DownloadQuery::SORT_START_TIME, DownloadQuery::DESCENDING); |
| + query.Limit(kMaxDownloads); |
| + query.Search(all_items.begin(), all_items.end(), &filtered_items); |
| base::ListValue results_value; |
| for (content::DownloadManager::DownloadVector::const_iterator |
| - iter = downloads.begin(); |
| - iter != downloads.end(); ++iter) { |
| - if (IsDownloadDisplayable(**iter)) |
| - results_value.Append(CreateDownloadItemValue(*iter, IsItemIncognito( |
| - (*iter)->GetId(), download_manager_, |
| - original_profile_download_manager_))); |
| - if (results_value.GetSize() == kMaxDownloads) |
| - break; |
| + iter = filtered_items.begin(); iter != filtered_items.end(); ++iter) { |
| + results_value.Append(CreateDownloadItemValue(*iter, IsItemIncognito( |
| + (*iter)->GetId(), download_manager_, |
| + original_profile_download_manager_))); |
| } |
| CallDownloadsList(results_value); |
| } |
| -void DownloadsDOMHandler::SearchDownloads( |
| +void DownloadsDOMHandler::GetAllDownloads( |
| content::DownloadManager::DownloadVector* downloads) { |
| - download_manager_->SearchDownloads(search_text_, downloads); |
| + download_manager_->GetAllDownloads(downloads); |
| if (original_profile_download_manager_) |
| - original_profile_download_manager_->SearchDownloads( |
| - search_text_, downloads); |
| + original_profile_download_manager_->GetAllDownloads(downloads); |
| } |
| void DownloadsDOMHandler::ShowDangerPrompt( |