| 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 fb715035a17c9f43c5d80683af1fc2aa4e4b3021..44d1afd8d32b884e078a61140f43e49201ae0673 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,
|
| @@ -291,6 +281,20 @@ void DownloadsDOMHandler::OnDownloadUpdated(
|
| content::DownloadManager* manager,
|
| 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 to a 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,
|
| @@ -379,10 +383,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) {
|
| @@ -429,35 +431,34 @@ 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;
|
| + if (main_notifier_.GetManager())
|
| + main_notifier_.GetManager()->GetAllDownloads(&all_items);
|
| + if (original_notifier_.get() && original_notifier_->GetManager())
|
| + original_notifier_->GetManager()->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,
|
| - (original_notifier_.get() &&
|
| - main_notifier_.GetManager() &&
|
| - (main_notifier_.GetManager()->GetDownload((*iter)->GetId()) ==
|
| - *iter))));
|
| - }
|
| - if (results_value.GetSize() == kMaxDownloads)
|
| - break;
|
| + iter = filtered_items.begin(); iter != filtered_items.end(); ++iter) {
|
| + results_value.Append(CreateDownloadItemValue(
|
| + *iter,
|
| + (original_notifier_.get() &&
|
| + main_notifier_.GetManager() &&
|
| + (main_notifier_.GetManager()->GetDownload((*iter)->GetId()) ==
|
| + *iter))));
|
| }
|
| CallDownloadsList(results_value);
|
| }
|
|
|
| -void DownloadsDOMHandler::SearchDownloads(
|
| - content::DownloadManager::DownloadVector* downloads) {
|
| - if (main_notifier_.GetManager())
|
| - main_notifier_.GetManager()->SearchDownloads(search_text_, downloads);
|
| - if (original_notifier_.get() && original_notifier_->GetManager())
|
| - original_notifier_->GetManager()->SearchDownloads(search_text_, downloads);
|
| -}
|
| -
|
| void DownloadsDOMHandler::ShowDangerPrompt(
|
| content::DownloadItem* dangerous_item) {
|
| DownloadDangerPrompt* danger_prompt = DownloadDangerPrompt::Create(
|
|
|