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( |