1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_UI_WEBUI_DOWNLOADS_DOM_HANDLER_H_
6#define CHROME_BROWSER_UI_WEBUI_DOWNLOADS_DOM_HANDLER_H_
7
8#include <set>
9#include <vector>
10
11#include "base/compiler_specific.h"
12#include "base/memory/weak_ptr.h"
13#include "chrome/browser/download/all_download_item_notifier.h"
14#include "chrome/browser/download/download_danger_prompt.h"
15#include "content/public/browser/download_item.h"
16#include "content/public/browser/download_manager.h"
17#include "content/public/browser/web_ui_message_handler.h"
18
19namespace base {
20class ListValue;
21}
22
23namespace content {
24class WebContents;
25}
26
27// The handler for Javascript messages related to the "downloads" view,
28// also observes changes to the download manager.
29class DownloadsDOMHandler : public content::WebUIMessageHandler,
30                            public AllDownloadItemNotifier::Observer {
31 public:
32  explicit DownloadsDOMHandler(content::DownloadManager* dlm);
33  virtual ~DownloadsDOMHandler();
34
35  void Init();
36
37  // WebUIMessageHandler implementation.
38  virtual void RegisterMessages() OVERRIDE;
39
40  // AllDownloadItemNotifier::Observer interface
41  virtual void OnDownloadCreated(
42      content::DownloadManager* manager,
43      content::DownloadItem* download_item) OVERRIDE;
44  virtual void OnDownloadUpdated(
45      content::DownloadManager* manager,
46      content::DownloadItem* download_item) OVERRIDE;
47  virtual void OnDownloadRemoved(
48      content::DownloadManager* manager,
49      content::DownloadItem* download_item) OVERRIDE;
50
51  // Callback for the "onPageLoaded" message.
52  void OnPageLoaded(const base::ListValue* args);
53
54  // Callback for the "getDownloads" message.
55  void HandleGetDownloads(const base::ListValue* args);
56
57  // Callback for the "openFile" message - opens the file in the shell.
58  void HandleOpenFile(const base::ListValue* args);
59
60  // Callback for the "drag" message - initiates a file object drag.
61  void HandleDrag(const base::ListValue* args);
62
63  // Callback for the "saveDangerous" message - specifies that the user
64  // wishes to save a dangerous file.
65  void HandleSaveDangerous(const base::ListValue* args);
66
67  // Callback for the "discardDangerous" message - specifies that the user
68  // wishes to discard (remove) a dangerous file.
69  void HandleDiscardDangerous(const base::ListValue* args);
70
71  // Callback for the "show" message - shows the file in explorer.
72  void HandleShow(const base::ListValue* args);
73
74  // Callback for the "pause" message - pauses the file download.
75  void HandlePause(const base::ListValue* args);
76
77  // Callback for the "resume" message - resumes the file download.
78  void HandleResume(const base::ListValue* args);
79
80  // Callback for the "remove" message - removes the file download from shelf
81  // and list.
82  void HandleRemove(const base::ListValue* args);
83
84  // Callback for the "cancel" message - cancels the download.
85  void HandleCancel(const base::ListValue* args);
86
87  // Callback for the "clearAll" message - clears all the downloads.
88  void HandleClearAll(const base::ListValue* args);
89
90  // Callback for the "openDownloadsFolder" message - opens the downloads
91  // folder.
92  void HandleOpenDownloadsFolder(const base::ListValue* args);
93
94 protected:
95  // These methods are for mocking so that most of this class does not actually
96  // depend on WebUI. The other methods that depend on WebUI are
97  // RegisterMessages() and HandleDrag().
98  virtual content::WebContents* GetWebUIWebContents();
99  virtual void CallDownloadsList(const base::ListValue& downloads);
100  virtual void CallDownloadUpdated(const base::ListValue& download);
101
102  // Schedules a call to SendCurrentDownloads() in the next message loop
103  // iteration. Protected rather than private for use in tests.
104  void ScheduleSendCurrentDownloads();
105
106 private:
107  // Shorthand for |observing_items_|, which tracks all items that this is
108  // observing so that RemoveObserver will be called for all of them.
109  typedef std::set<content::DownloadItem*> DownloadSet;
110
111  // Sends the current list of downloads to the page.
112  void SendCurrentDownloads();
113
114  // Displays a native prompt asking the user for confirmation after accepting
115  // the dangerous download specified by |dangerous|. The function returns
116  // immediately, and will invoke DangerPromptAccepted() asynchronously if the
117  // user accepts the dangerous download. The native prompt will observe
118  // |dangerous| until either the dialog is dismissed or |dangerous| is no
119  // longer an in-progress dangerous download.
120  void ShowDangerPrompt(content::DownloadItem* dangerous);
121
122  // Conveys danger acceptance from the DownloadDangerPrompt to the
123  // DownloadItem.
124  void DangerPromptDone(int download_id, DownloadDangerPrompt::Action action);
125
126  // Returns true if the records of any downloaded items are allowed (and able)
127  // to be deleted.
128  bool IsDeletingHistoryAllowed();
129
130  // Returns the download that is referred to in a given value.
131  content::DownloadItem* GetDownloadByValue(const base::ListValue* args);
132
133  // Current search terms.
134  scoped_ptr<base::ListValue> search_terms_;
135
136  // Notifies OnDownload*() and provides safe access to the DownloadManager.
137  AllDownloadItemNotifier main_notifier_;
138
139  // If |main_notifier_| observes an incognito profile, then this observes the
140  // DownloadManager for the original profile; otherwise, this is NULL.
141  scoped_ptr<AllDownloadItemNotifier> original_notifier_;
142
143  // Whether a call to SendCurrentDownloads() is currently scheduled.
144  bool update_scheduled_;
145
146  base::WeakPtrFactory<DownloadsDOMHandler> weak_ptr_factory_;
147
148  DISALLOW_COPY_AND_ASSIGN(DownloadsDOMHandler);
149};
150
151#endif  // CHROME_BROWSER_UI_WEBUI_DOWNLOADS_DOM_HANDLER_H_
152