DownloadsSearchFunction implements chrome.experimental.downloads.search() using DownloadQuery.

BUG=12133


Review URL: http://codereview.chromium.org/8917019

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@119085 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/content/browser/download/download_manager_impl.cc b/content/browser/download/download_manager_impl.cc
index d391e56..cc8d55c8 100644
--- a/content/browser/download/download_manager_impl.cc
+++ b/content/browser/download/download_manager_impl.cc
@@ -32,6 +32,7 @@
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/content_browser_client.h"
 #include "content/public/browser/download_manager_delegate.h"
+#include "content/public/browser/download_query.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/browser/notification_types.h"
 #include "content/public/browser/render_process_host.h"
@@ -84,6 +85,30 @@
       *context);
 }
 
+class MapValueIteratorAdapter {
+ public:
+  explicit MapValueIteratorAdapter(
+      base::hash_map<int64, DownloadItem*>::const_iterator iter)
+    : iter_(iter) {
+  }
+  ~MapValueIteratorAdapter() {}
+
+  DownloadItem* operator*() { return iter_->second; }
+
+  MapValueIteratorAdapter& operator++() {
+    ++iter_;
+    return *this;
+  }
+
+  bool operator!=(const MapValueIteratorAdapter& that) const {
+    return iter_ != that.iter_;
+  }
+
+ private:
+  base::hash_map<int64, DownloadItem*>::const_iterator iter_;
+  // Allow copy and assign.
+};
+
 }  // namespace
 
 namespace content {
@@ -229,6 +254,12 @@
   }
 }
 
+void DownloadManagerImpl::SearchByQuery(const content::DownloadQuery& query,
+                                        DownloadVector* results) {
+  query.Search(MapValueIteratorAdapter(history_downloads_.begin()),
+               MapValueIteratorAdapter(history_downloads_.end()), results);
+}
+
 void DownloadManagerImpl::SearchDownloads(const string16& query,
                                           DownloadVector* result) {
   string16 query_lower(base::i18n::ToLower(query));