1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// found in the LICENSE file. 4ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/webui/active_downloads_ui.h" 6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <algorithm> 8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <string> 9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <vector> 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/callback.h" 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/command_line.h" 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/file_util.h" 14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/logging.h" 15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/singleton.h" 16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/message_loop.h" 17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/path_service.h" 18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/string_piece.h" 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/string_util.h" 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/threading/thread.h" 21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/time.h" 22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/utf_string_conversions.h" 23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/values.h" 24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/cros/cros_library.h" 25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/login/user_manager.h" 26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/download/download_item.h" 27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/download/download_manager.h" 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/download/download_util.h" 29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/profiles/profile.h" 30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/tabs/tab_strip_model.h" 31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser.h" 32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser_list.h" 33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser_window.h" 34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/webui/favicon_source.h" 35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/webui/mediaplayer_ui.h" 36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/chrome_paths.h" 37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/chrome_switches.h" 38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/jstemplate_builder.h" 39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/net/url_fetcher.h" 40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/url_constants.h" 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/browser/browser_thread.h" 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/browser/tab_contents/tab_contents.h" 43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "grit/browser_resources.h" 44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "grit/chromium_strings.h" 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "grit/generated_resources.h" 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "grit/locale_settings.h" 47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "net/base/escape.h" 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "net/url_request/url_request_file_job.h" 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "ui/base/l10n/l10n_util.h" 50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "ui/base/resource/resource_bundle.h" 51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace { 53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstatic const int kPopupLeft = 0; 55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstatic const int kPopupTop = 0; 56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstatic const int kPopupWidth = 250; 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Minimum height of window must be 100, so kPopupHeight has space for 58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// 2 download rows of 36 px and 'Show All Downloads' which is 29px. 59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstatic const int kPopupHeight = 36 * 2 + 29; 60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstatic const char kPropertyPath[] = "path"; 62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstatic const char kPropertyTitle[] = "title"; 63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstatic const char kPropertyDirectory[] = "isDirectory"; 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass ActiveDownloadsUIHTMLSource : public ChromeURLDataManager::DataSource { 66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public: 67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ActiveDownloadsUIHTMLSource(); 68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Called when the network layer has requested a resource underneath 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // the path we registered. 71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void StartDataRequest(const std::string& path, 72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool is_incognito, 73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int request_id); 74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual std::string GetMimeType(const std::string&) const { 75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return "text/html"; 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private: 79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ~ActiveDownloadsUIHTMLSource() {} 80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DISALLOW_COPY_AND_ASSIGN(ActiveDownloadsUIHTMLSource); 82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}; 83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// The handler for Javascript messages related to the "active_downloads" view. 85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass ActiveDownloadsHandler 86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen : public WebUIMessageHandler, 87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public DownloadManager::Observer, 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public DownloadItem::Observer { 89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public: 90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ActiveDownloadsHandler(); 91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual ~ActiveDownloadsHandler(); 92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Initialization after Attach. 94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void Init(); 95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // WebUIMessageHandler implementation. 97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual WebUIMessageHandler* Attach(WebUI* web_ui); 98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void RegisterMessages(); 99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // DownloadItem::Observer interface. 101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void OnDownloadUpdated(DownloadItem* item); 102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void OnDownloadOpened(DownloadItem* item) { } 103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // DownloadManager::Observer interface. 105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void ModelChanged(); 106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // WebUI Callbacks. 108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void HandleGetDownloads(const ListValue* args); 109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void HandlePauseToggleDownload(const ListValue* args); 110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void HandleCancelDownload(const ListValue* args); 111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void HandleAllowDownload(const ListValue* args); 112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void OpenNewPopupWindow(const ListValue* args); 113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void OpenNewFullWindow(const ListValue* args); 114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void PlayMediaFile(const ListValue* args); 115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private: 117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Downloads helpers. 118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DownloadItem* GetDownloadById(const ListValue* args); 119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void UpdateDownloadList(); 120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void SendDownloads(); 121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void AddDownload(DownloadItem* item); 122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void OpenNewWindow(const ListValue* args, bool popup); 124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Profile* profile_; 126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen TabContents* tab_contents_; 127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DownloadManager* download_manager_; 128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen typedef std::vector<DownloadItem*> DownloadList; 130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DownloadList active_downloads_; 131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DownloadList downloads_; 132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DISALLOW_COPY_AND_ASSIGN(ActiveDownloadsHandler); 134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}; 135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// 138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// ActiveDownloadsUIHTMLSource 139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// 140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenActiveDownloadsUIHTMLSource::ActiveDownloadsUIHTMLSource() 143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen : DataSource(chrome::kChromeUIActiveDownloadsHost, MessageLoop::current()) { 144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ActiveDownloadsUIHTMLSource::StartDataRequest(const std::string& path, 147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool is_incognito, 148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int request_id) { 149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DictionaryValue localized_strings; 150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen localized_strings.SetString("allowdownload", 151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen l10n_util::GetStringUTF16(IDS_FILEBROWSER_CONFIRM_DOWNLOAD)); 152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen localized_strings.SetString("cancel", 153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen l10n_util::GetStringUTF16(IDS_DOWNLOAD_LINK_CANCEL)); 154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen localized_strings.SetString("confirmcancel", 155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen l10n_util::GetStringUTF16(IDS_FILEBROWSER_CONFIRM_CANCEL)); 156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen localized_strings.SetString("confirmyes", 157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen l10n_util::GetStringUTF16(IDS_FILEBROWSER_CONFIRM_YES)); 158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen localized_strings.SetString("open", 159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen l10n_util::GetStringUTF16(IDS_FILEBROWSER_OPEN)); 160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen localized_strings.SetString("pause", 161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen l10n_util::GetStringUTF16(IDS_DOWNLOAD_LINK_PAUSE)); 162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen localized_strings.SetString("resume", 163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen l10n_util::GetStringUTF16(IDS_DOWNLOAD_LINK_RESUME)); 164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen localized_strings.SetString("showalldownloads", 165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen l10n_util::GetStringUTF16(IDS_FILEBROWSER_SHOW_ALL_DOWNLOADS)); 166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FilePath default_download_path; 167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!PathService::Get(chrome::DIR_DEFAULT_DOWNLOADS, 168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen &default_download_path)) { 169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(viettrungluu): this is wrong -- FilePath's need not be Unicode. 172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen localized_strings.SetString("downloadpath", default_download_path.value()); 173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen localized_strings.SetString("error_unknown_file_type", 174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen l10n_util::GetStringUTF16(IDS_FILEBROWSER_ERROR_UNKNOWN_FILE_TYPE)); 175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SetFontAndTextDirection(&localized_strings); 176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static const base::StringPiece active_downloads_html( 178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ResourceBundle::GetSharedInstance().GetRawDataResource( 179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IDR_ACTIVE_DOWNLOADS_HTML)); 180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string full_html = jstemplate_builder::GetI18nTemplateHtml( 181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen active_downloads_html, &localized_strings); 182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_refptr<RefCountedBytes> html_bytes(new RefCountedBytes); 184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen html_bytes->data.resize(full_html.size()); 185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::copy(full_html.begin(), full_html.end(), html_bytes->data.begin()); 186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SendResponse(request_id, html_bytes); 188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// 192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// ActiveDownloadsHandler 193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// 194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 195ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenActiveDownloadsHandler::ActiveDownloadsHandler() 197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen : profile_(NULL), 198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen tab_contents_(NULL), 199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen download_manager_(NULL) { 200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenActiveDownloadsHandler::~ActiveDownloadsHandler() { 203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (size_t i = 0; i < downloads_.size(); ++i) { 204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen downloads_[i]->RemoveObserver(this); 205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen download_manager_->RemoveObserver(this); 207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenWebUIMessageHandler* ActiveDownloadsHandler::Attach(WebUI* web_ui) { 210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Create our favicon data source. 211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile_ = web_ui->GetProfile(); 212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile_->GetChromeURLDataManager()->AddDataSource( 213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen new FaviconSource(profile_)); 214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen tab_contents_ = web_ui->tab_contents(); 215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return WebUIMessageHandler::Attach(web_ui); 216ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ActiveDownloadsHandler::Init() { 219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen download_manager_ = profile_->GetDownloadManager(); 220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen download_manager_->AddObserver(this); 221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ActiveDownloadsHandler::RegisterMessages() { 224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->RegisterMessageCallback("getDownloads", 225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NewCallback(this, &ActiveDownloadsHandler::HandleGetDownloads)); 226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->RegisterMessageCallback("pauseToggleDownload", 227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NewCallback(this, &ActiveDownloadsHandler::HandlePauseToggleDownload)); 228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->RegisterMessageCallback("cancelDownload", 229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NewCallback(this, &ActiveDownloadsHandler::HandleCancelDownload)); 230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->RegisterMessageCallback("allowDownload", 231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NewCallback(this, &ActiveDownloadsHandler::HandleAllowDownload)); 232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->RegisterMessageCallback("openNewPopupWindow", 233ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NewCallback(this, &ActiveDownloadsHandler::OpenNewPopupWindow)); 234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->RegisterMessageCallback("openNewFullWindow", 235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NewCallback(this, &ActiveDownloadsHandler::OpenNewFullWindow)); 236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->RegisterMessageCallback("playMediaFile", 237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NewCallback(this, &ActiveDownloadsHandler::PlayMediaFile)); 238ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 239ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 240ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ActiveDownloadsHandler::PlayMediaFile(const ListValue* args) { 241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FilePath file_path(UTF16ToUTF8(ExtractStringValue(args))); 242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Browser* browser = Browser::GetBrowserForController( 244ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen &tab_contents_->controller(), NULL); 245ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MediaPlayer* mediaplayer = MediaPlayer::GetInstance(); 246ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mediaplayer->ForcePlayMediaFile(profile_, file_path, browser); 247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 248ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 249ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenDownloadItem* ActiveDownloadsHandler::GetDownloadById( 250ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const ListValue* args) { 251ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int i; 252ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!ExtractIntegerValue(args, &i)) 253ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return NULL; 254ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen size_t id(i); 255ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return id < downloads_.size() ? downloads_[id] : NULL; 256ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 257ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ActiveDownloadsHandler::HandlePauseToggleDownload(const ListValue* args) { 259ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DownloadItem* item = GetDownloadById(args); 260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (item && item->IsPartialDownload()) 261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen item->TogglePause(); 262ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ActiveDownloadsHandler::HandleAllowDownload(const ListValue* args) { 265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DownloadItem* item = GetDownloadById(args); 266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (item) 267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen item->DangerousDownloadValidated(); 268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ActiveDownloadsHandler::HandleCancelDownload(const ListValue* args) { 271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DownloadItem* item = GetDownloadById(args); 272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (item) { 273ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (item->IsPartialDownload()) 274ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen item->Cancel(true); 275ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen item->Delete(DownloadItem::DELETE_DUE_TO_USER_DISCARD); 276ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 277ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 278ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 279ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ActiveDownloadsHandler::OpenNewFullWindow(const ListValue* args) { 280ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen OpenNewWindow(args, false); 281ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 282ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 283ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ActiveDownloadsHandler::OpenNewPopupWindow(const ListValue* args) { 284ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen OpenNewWindow(args, true); 285ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 286ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 287ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ActiveDownloadsHandler::OpenNewWindow(const ListValue* args, bool popup) { 288ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string url = UTF16ToUTF8(ExtractStringValue(args)); 289ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Browser* browser = popup ? 290ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Browser::CreateForType(Browser::TYPE_APP_PANEL, profile_) : 291ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen BrowserList::GetLastActive(); 292ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen browser::NavigateParams params(browser, GURL(url), PageTransition::LINK); 293ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen params.disposition = NEW_FOREGROUND_TAB; 294ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen browser::Navigate(¶ms); 295ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(beng): The following two calls should be automatic by Navigate(). 296ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (popup) 297ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen params.browser->window()->SetBounds(gfx::Rect(0, 0, 400, 300)); 298ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen params.browser->window()->Show(); 299ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 300ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 301ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ActiveDownloadsHandler::ModelChanged() { 302ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen UpdateDownloadList(); 303ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 304ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 305ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ActiveDownloadsHandler::HandleGetDownloads(const ListValue* args) { 306ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen UpdateDownloadList(); 307ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 308ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 309ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ActiveDownloadsHandler::UpdateDownloadList() { 310ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DownloadList downloads; 311ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen download_manager_->GetAllDownloads(FilePath(), &downloads); 312ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen active_downloads_.clear(); 313ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (size_t i = 0; i < downloads.size(); ++i) { 314ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AddDownload(downloads[i]); 315ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 316ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SendDownloads(); 317ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 318ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 319ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ActiveDownloadsHandler::AddDownload(DownloadItem* item) { 320ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Observe in progress and dangerous downloads. 321ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (item->state() == DownloadItem::IN_PROGRESS || 322ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen item->safety_state() == DownloadItem::DANGEROUS) { 323ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen active_downloads_.push_back(item); 324ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 325ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DownloadList::const_iterator it = 326ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::find(downloads_.begin(), downloads_.end(), item); 327ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (it == downloads_.end()) { 328ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen downloads_.push_back(item); 329ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen item->AddObserver(this); 330ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 331ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 332ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 333ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 334ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ActiveDownloadsHandler::SendDownloads() { 335ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ListValue results; 336ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (size_t i = 0; i < downloads_.size(); ++i) { 337ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen results.Append(download_util::CreateDownloadItemValue(downloads_[i], i)); 338ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 339ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 340ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->CallJavascriptFunction("downloadsList", results); 341ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 342ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 343ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ActiveDownloadsHandler::OnDownloadUpdated(DownloadItem* item) { 344ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DownloadList::iterator it = 345ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen find(downloads_.begin(), downloads_.end(), item); 346ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 347ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (it == downloads_.end()) { 348ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Updated item " << item->full_path().value() 349ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen << " not found"; 350ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 351ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 352ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (item->state() == DownloadItem::REMOVING) { 353ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen item->RemoveObserver(this); 354ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen downloads_.erase(it); 355ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DownloadList::iterator ita = 356ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen find(active_downloads_.begin(), active_downloads_.end(), item); 357ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (ita != active_downloads_.end()) 358ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen active_downloads_.erase(ita); 359ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SendDownloads(); 360ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } else { 361ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const size_t id = it - downloads_.begin(); 362ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<DictionaryValue> result( 363ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen download_util::CreateDownloadItemValue(item, id)); 364ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->CallJavascriptFunction("downloadUpdated", *result); 365ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 366ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 367ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 368ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} // namespace 369ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 370ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 371ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// 372ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// ActiveDownloadsUI 373ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// 374ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 375ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 376ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 377ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenActiveDownloadsUI::ActiveDownloadsUI(TabContents* contents) 378ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen : HtmlDialogUI(contents) { 379ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ActiveDownloadsHandler* handler = new ActiveDownloadsHandler(); 380ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AddMessageHandler(handler->Attach(this)); 381ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen handler->Init(); 382ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ActiveDownloadsUIHTMLSource* html_source = new ActiveDownloadsUIHTMLSource(); 383ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 384ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Set up the chrome://active-downloads/ source. 385ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen contents->profile()->GetChromeURLDataManager()->AddDataSource(html_source); 386ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 387ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 388ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// static 389ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenBrowser* ActiveDownloadsUI::OpenPopup(Profile* profile) { 390ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Browser* browser = GetPopup(profile); 391ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 392ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Create new browser if no matching pop up is found. 393ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (browser == NULL) { 394ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen browser = Browser::CreateForType(Browser::TYPE_APP_PANEL, profile); 395ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 396ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen browser::NavigateParams params( 397ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen browser, 398ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GURL(chrome::kChromeUIActiveDownloadsURL), 399ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PageTransition::LINK); 400ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen params.disposition = NEW_FOREGROUND_TAB; 401ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen browser::Navigate(¶ms); 402ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 403ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(beng): The following two calls should be automatic by Navigate(). 404ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen params.browser->window()->SetBounds(gfx::Rect(kPopupLeft, 405ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen kPopupTop, 406ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen kPopupWidth, 407ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen kPopupHeight)); 408ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen params.browser->window()->Show(); 409ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } else { 410ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen browser->window()->Show(); 411ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 412ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 413ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return browser; 414ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 415ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 416ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenBrowser* ActiveDownloadsUI::GetPopup(Profile* profile) { 417ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (BrowserList::const_iterator it = BrowserList::begin(); 418ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen it != BrowserList::end(); 419ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ++it) { 420ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (((*it)->type() == Browser::TYPE_APP_PANEL)) { 421ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen TabContents* tab_contents = (*it)->GetSelectedTabContents(); 422ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(tab_contents); 423ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!tab_contents) 424ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen continue; 425ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const GURL& url = tab_contents->GetURL(); 426ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 427ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (url.SchemeIs(chrome::kChromeUIScheme) && 428ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen url.host() == chrome::kChromeUIActiveDownloadsHost && 429ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen (*it)->profile() == profile) { 430ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return (*it); 431ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 432ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 433ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 434ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return NULL; 435ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 436ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 437