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(&params);
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(&params);
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