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