11305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood// Copyright (c) 2011 The Chromium Authors. All rights reserved.
21305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood// Use of this source code is governed by a BSD-style license that can be
31305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood// found in the LICENSE file.
41305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
51305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "chrome/browser/ui/webui/downloads_dom_handler.h"
61305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
71305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <algorithm>
81305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <functional>
91305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
101305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "base/basictypes.h"
111305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "base/callback.h"
121305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "base/memory/singleton.h"
131305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "base/string_piece.h"
141305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "base/threading/thread.h"
151305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "base/utf_string_conversions.h"
161305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "base/values.h"
171305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "chrome/browser/browser_process.h"
181305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "chrome/browser/download/download_history.h"
191305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "chrome/browser/download/download_item.h"
201305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "chrome/browser/download/download_util.h"
211305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "chrome/browser/metrics/user_metrics.h"
221305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "chrome/browser/profiles/profile.h"
231305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "chrome/browser/ui/webui/chrome_url_data_manager.h"
241305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "chrome/browser/ui/webui/fileicon_source.h"
251305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "chrome/common/jstemplate_builder.h"
261305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "chrome/common/url_constants.h"
271305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "content/browser/browser_thread.h"
281305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "content/browser/tab_contents/tab_contents.h"
291305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "grit/generated_resources.h"
301305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "ui/gfx/image.h"
311305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
321305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodnamespace {
331305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
341305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood// Maximum number of downloads to show. TODO(glen): Remove this and instead
351305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood// stuff the downloads down the pipe slowly.
361305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodstatic const int kMaxDownloads = 150;
371305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
381305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood// Sort DownloadItems into descending order by their start time.
391305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodclass DownloadItemSorter : public std::binary_function<DownloadItem*,
401305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood                                                       DownloadItem*,
411305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood                                                       bool> {
421305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood public:
431305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  bool operator()(const DownloadItem* lhs, const DownloadItem* rhs) {
441305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    return lhs->start_time() > rhs->start_time();
451305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  }
461305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood};
471305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
481305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}  // namespace
491305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
501305e95ba6ff9fa202d0818caf10405df4b0f648Mike LockwoodDownloadsDOMHandler::DownloadsDOMHandler(DownloadManager* dlm)
511305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    : search_text_(),
521305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood      download_manager_(dlm),
531305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood      callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
541305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  // Create our fileicon data source.
551305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  dlm->profile()->GetChromeURLDataManager()->AddDataSource(
561305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood      new FileIconSource());
571305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
581305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
591305e95ba6ff9fa202d0818caf10405df4b0f648Mike LockwoodDownloadsDOMHandler::~DownloadsDOMHandler() {
601305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  ClearDownloadItems();
611305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  download_manager_->RemoveObserver(this);
621305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
631305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
641305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood// DownloadsDOMHandler, public: -----------------------------------------------
651305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
661305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid DownloadsDOMHandler::Init() {
671305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  download_manager_->AddObserver(this);
681305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
691305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
701305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid DownloadsDOMHandler::RegisterMessages() {
711305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  web_ui_->RegisterMessageCallback("getDownloads",
721305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood      NewCallback(this, &DownloadsDOMHandler::HandleGetDownloads));
731305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  web_ui_->RegisterMessageCallback("openFile",
741305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood      NewCallback(this, &DownloadsDOMHandler::HandleOpenFile));
751305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
761305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  web_ui_->RegisterMessageCallback("drag",
771305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood      NewCallback(this, &DownloadsDOMHandler::HandleDrag));
781305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
791305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  web_ui_->RegisterMessageCallback("saveDangerous",
801305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood      NewCallback(this, &DownloadsDOMHandler::HandleSaveDangerous));
811305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  web_ui_->RegisterMessageCallback("discardDangerous",
821305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood      NewCallback(this, &DownloadsDOMHandler::HandleDiscardDangerous));
831305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  web_ui_->RegisterMessageCallback("show",
841305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood      NewCallback(this, &DownloadsDOMHandler::HandleShow));
851305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  web_ui_->RegisterMessageCallback("togglepause",
861305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood      NewCallback(this, &DownloadsDOMHandler::HandlePause));
871305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  web_ui_->RegisterMessageCallback("resume",
881305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood      NewCallback(this, &DownloadsDOMHandler::HandlePause));
891305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  web_ui_->RegisterMessageCallback("remove",
901305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood      NewCallback(this, &DownloadsDOMHandler::HandleRemove));
911305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  web_ui_->RegisterMessageCallback("cancel",
921305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood      NewCallback(this, &DownloadsDOMHandler::HandleCancel));
931305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  web_ui_->RegisterMessageCallback("clearAll",
941305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood      NewCallback(this, &DownloadsDOMHandler::HandleClearAll));
951305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
961305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
971305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid DownloadsDOMHandler::OnDownloadUpdated(DownloadItem* download) {
981305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  // Get the id for the download. Our downloads are sorted latest to first,
991305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  // and the id is the index into that list. We should be careful of sync
1001305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  // errors between the UI and the download_items_ list (we may wish to use
1011305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  // something other than 'id').
1021305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  OrderedDownloads::iterator it = find(download_items_.begin(),
1031305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood                                       download_items_.end(),
1041305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood                                       download);
1051305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  if (it == download_items_.end())
1061305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    return;
1071305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  const int id = static_cast<int>(it - download_items_.begin());
1081305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1091305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  ListValue results_value;
1101305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  results_value.Append(download_util::CreateDownloadItemValue(download, id));
1111305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  web_ui_->CallJavascriptFunction("downloadUpdated", results_value);
1121305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
1131305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1141305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood// A download has started or been deleted. Query our DownloadManager for the
1151305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood// current set of downloads.
1161305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid DownloadsDOMHandler::ModelChanged() {
1171305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  ClearDownloadItems();
1181305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  download_manager_->SearchDownloads(WideToUTF16(search_text_),
1191305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood                                     &download_items_);
1201305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  sort(download_items_.begin(), download_items_.end(), DownloadItemSorter());
1211305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1221305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  // Scan for any in progress downloads and add ourself to them as an observer.
1231305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  for (OrderedDownloads::iterator it = download_items_.begin();
1241305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood       it != download_items_.end(); ++it) {
1251305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    if (static_cast<int>(it - download_items_.begin()) > kMaxDownloads)
1261305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood      break;
1271305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1281305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    DownloadItem* download = *it;
1291305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    if (download->IsInProgress()) {
1301305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood      // We want to know what happens as the download progresses.
1311305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood      download->AddObserver(this);
1321305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    } else if (download->safety_state() == DownloadItem::DANGEROUS) {
1331305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood      // We need to be notified when the user validates the dangerous download.
1341305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood      download->AddObserver(this);
1351305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    }
1361305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  }
1371305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1381305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  SendCurrentDownloads();
1391305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
1401305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1411305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid DownloadsDOMHandler::HandleGetDownloads(const ListValue* args) {
1421305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  std::wstring new_search = UTF16ToWideHack(ExtractStringValue(args));
1431305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  if (search_text_.compare(new_search) != 0) {
1441305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    search_text_ = new_search;
1451305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    ModelChanged();
1461305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  } else {
1471305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    SendCurrentDownloads();
1481305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  }
1491305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
1501305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1511305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid DownloadsDOMHandler::HandleOpenFile(const ListValue* args) {
1521305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  DownloadItem* file = GetDownloadByValue(args);
1531305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  if (file)
1541305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    file->OpenDownload();
1551305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
1561305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1571305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid DownloadsDOMHandler::HandleDrag(const ListValue* args) {
1581305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  DownloadItem* file = GetDownloadByValue(args);
1591305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  if (file) {
1601305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    IconManager* im = g_browser_process->icon_manager();
1611305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    gfx::Image* icon = im->LookupIcon(file->GetUserVerifiedFilePath(),
1621305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood                                      IconLoader::NORMAL);
1631305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    gfx::NativeView view = web_ui_->tab_contents()->GetNativeView();
1641305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    download_util::DragDownload(file, icon, view);
1651305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  }
1661305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
1671305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1681305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid DownloadsDOMHandler::HandleSaveDangerous(const ListValue* args) {
1691305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  DownloadItem* file = GetDownloadByValue(args);
1701305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  if (file)
1711305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    download_manager_->DangerousDownloadValidated(file);
1721305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
1731305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1741305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid DownloadsDOMHandler::HandleDiscardDangerous(const ListValue* args) {
1751305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  DownloadItem* file = GetDownloadByValue(args);
1761305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  if (file)
1771305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    file->Delete(DownloadItem::DELETE_DUE_TO_USER_DISCARD);
1781305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
1791305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1801305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid DownloadsDOMHandler::HandleShow(const ListValue* args) {
1811305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  DownloadItem* file = GetDownloadByValue(args);
1821305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  if (file)
1831305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    file->ShowDownloadInShell();
1841305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
1851305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1861305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid DownloadsDOMHandler::HandlePause(const ListValue* args) {
1871305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  DownloadItem* file = GetDownloadByValue(args);
1881305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  if (file)
1891305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    file->TogglePause();
1901305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
1911305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1921305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid DownloadsDOMHandler::HandleRemove(const ListValue* args) {
1931305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  DownloadItem* file = GetDownloadByValue(args);
1941305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  if (file)
1951305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    file->Remove();
1961305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
1971305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1981305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid DownloadsDOMHandler::HandleCancel(const ListValue* args) {
1991305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  DownloadItem* file = GetDownloadByValue(args);
2001305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  if (file)
2011305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    file->Cancel(true);
2021305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
2031305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
2041305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid DownloadsDOMHandler::HandleClearAll(const ListValue* args) {
2051305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  download_manager_->RemoveAllDownloads();
2061305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
2071305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
2081305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood// DownloadsDOMHandler, private: ----------------------------------------------
2091305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
2101305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid DownloadsDOMHandler::SendCurrentDownloads() {
2111305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  ListValue results_value;
2121305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  for (OrderedDownloads::iterator it = download_items_.begin();
2131305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood      it != download_items_.end(); ++it) {
2141305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    int index = static_cast<int>(it - download_items_.begin());
2151305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    if (index > kMaxDownloads)
2161305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood      break;
2171305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    results_value.Append(download_util::CreateDownloadItemValue(*it, index));
2181305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  }
2191305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
2201305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  web_ui_->CallJavascriptFunction("downloadsList", results_value);
2211305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
2221305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
2231305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid DownloadsDOMHandler::ClearDownloadItems() {
2241305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  // Clear out old state and remove self as observer for each download.
2251305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  for (OrderedDownloads::iterator it = download_items_.begin();
2261305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood      it != download_items_.end(); ++it) {
2271305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    (*it)->RemoveObserver(this);
2281305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  }
2291305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  download_items_.clear();
2301305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
2311305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
2321305e95ba6ff9fa202d0818caf10405df4b0f648Mike LockwoodDownloadItem* DownloadsDOMHandler::GetDownloadById(int id) {
2331305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  for (OrderedDownloads::iterator it = download_items_.begin();
2341305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood      it != download_items_.end(); ++it) {
2351305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    if (static_cast<int>(it - download_items_.begin() == id)) {
2361305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood      return (*it);
2371305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    }
2381305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  }
2391305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
2401305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  return NULL;
2411305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
2421305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
2431305e95ba6ff9fa202d0818caf10405df4b0f648Mike LockwoodDownloadItem* DownloadsDOMHandler::GetDownloadByValue(const ListValue* args) {
2441305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  int id;
2451305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  if (ExtractIntegerValue(args, &id)) {
2461305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood    return GetDownloadById(id);
2471305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  }
2481305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood  return NULL;
2491305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
2501305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood