blob: bf30369a08813f8f059bd210be45651fddf5ac2f [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_WEBUI_DOWNLOADS_DOM_HANDLER_H_
#define CHROME_BROWSER_UI_WEBUI_DOWNLOADS_DOM_HANDLER_H_
#include <set>
#include <vector>
#include "base/compiler_specific.h"
#include "base/memory/weak_ptr.h"
#include "chrome/browser/download/all_download_item_notifier.h"
#include "chrome/browser/download/download_danger_prompt.h"
#include "content/public/browser/download_item.h"
#include "content/public/browser/download_manager.h"
#include "content/public/browser/web_ui_message_handler.h"
namespace base {
class ListValue;
}
namespace content {
class WebContents;
}
// The handler for Javascript messages related to the "downloads" view,
// also observes changes to the download manager.
class DownloadsDOMHandler : public content::WebUIMessageHandler,
public AllDownloadItemNotifier::Observer {
public:
explicit DownloadsDOMHandler(content::DownloadManager* download_manager);
~DownloadsDOMHandler() override;
void Init();
// WebUIMessageHandler implementation.
void RegisterMessages() override;
// AllDownloadItemNotifier::Observer interface
void OnDownloadCreated(content::DownloadManager* manager,
content::DownloadItem* download_item) override;
void OnDownloadUpdated(content::DownloadManager* manager,
content::DownloadItem* download_item) override;
void OnDownloadRemoved(content::DownloadManager* manager,
content::DownloadItem* download_item) override;
// Callback for the "getDownloads" message.
void HandleGetDownloads(const base::ListValue* args);
// Callback for the "openFile" message - opens the file in the shell.
void HandleOpenFile(const base::ListValue* args);
// Callback for the "drag" message - initiates a file object drag.
void HandleDrag(const base::ListValue* args);
// Callback for the "saveDangerous" message - specifies that the user
// wishes to save a dangerous file.
void HandleSaveDangerous(const base::ListValue* args);
// Callback for the "discardDangerous" message - specifies that the user
// wishes to discard (remove) a dangerous file.
void HandleDiscardDangerous(const base::ListValue* args);
// Callback for the "show" message - shows the file in explorer.
void HandleShow(const base::ListValue* args);
// Callback for the "pause" message - pauses the file download.
void HandlePause(const base::ListValue* args);
// Callback for the "resume" message - resumes the file download.
void HandleResume(const base::ListValue* args);
// Callback for the "remove" message - removes the file download from shelf
// and list.
void HandleRemove(const base::ListValue* args);
// Callback for the "undo" message. Currently only undoes removals.
void HandleUndo(const base::ListValue* args);
// Callback for the "cancel" message - cancels the download.
void HandleCancel(const base::ListValue* args);
// Callback for the "clearAll" message - clears all the downloads.
void HandleClearAll(const base::ListValue* args);
// Callback for the "openDownloadsFolder" message - opens the downloads
// folder.
void HandleOpenDownloadsFolder(const base::ListValue* args);
protected:
// These methods are for mocking so that most of this class does not actually
// depend on WebUI. The other methods that depend on WebUI are
// RegisterMessages() and HandleDrag().
virtual content::WebContents* GetWebUIWebContents();
virtual void CallUpdateAll(const base::ListValue& list);
virtual void CallUpdateItem(const base::DictionaryValue& item);
// Schedules a call to SendCurrentDownloads() in the next message loop
// iteration. Protected rather than private for use in tests.
void ScheduleSendCurrentDownloads();
// Actually remove downloads with an ID in |removals_|. This cannot be undone.
void FinalizeRemovals();
private:
// Shorthand for |observing_items_|, which tracks all items that this is
// observing so that RemoveObserver will be called for all of them.
typedef std::set<content::DownloadItem*> DownloadSet;
// Convenience method to call |main_notifier_->GetManager()| while
// null-checking |main_notifier_|.
content::DownloadManager* GetMainNotifierManager() const;
// Convenience method to call |original_notifier_->GetManager()| while
// null-checking |original_notifier_|.
content::DownloadManager* GetOriginalNotifierManager() const;
// Sends the current list of downloads to the page.
void SendCurrentDownloads();
// Displays a native prompt asking the user for confirmation after accepting
// the dangerous download specified by |dangerous|. The function returns
// immediately, and will invoke DangerPromptAccepted() asynchronously if the
// user accepts the dangerous download. The native prompt will observe
// |dangerous| until either the dialog is dismissed or |dangerous| is no
// longer an in-progress dangerous download.
void ShowDangerPrompt(content::DownloadItem* dangerous);
// Conveys danger acceptance from the DownloadDangerPrompt to the
// DownloadItem.
void DangerPromptDone(int download_id, DownloadDangerPrompt::Action action);
// Returns true if the records of any downloaded items are allowed (and able)
// to be deleted.
bool IsDeletingHistoryAllowed();
// Returns the download that is referred to in a given value.
content::DownloadItem* GetDownloadByValue(const base::ListValue* args);
// Returns the download with |id| or NULL if it doesn't exist.
content::DownloadItem* GetDownloadById(uint32 id);
// Remove all downloads in |to_remove| with the ability to undo removal later.
void RemoveDownloads(const std::vector<content::DownloadItem*>& to_remove);
// Weak reference to the DownloadManager this class was constructed with. You
// should probably be using use Get{Main,Original}NotifierManager() instead.
content::DownloadManager* download_manager_;
// Current search terms.
scoped_ptr<base::ListValue> search_terms_;
// Notifies OnDownload*() and provides safe access to the DownloadManager.
scoped_ptr<AllDownloadItemNotifier> main_notifier_;
// If |main_notifier_| observes an incognito profile, then this observes the
// DownloadManager for the original profile; otherwise, this is NULL.
scoped_ptr<AllDownloadItemNotifier> original_notifier_;
// IDs of downloads to remove when this handler gets deleted.
std::vector<std::set<uint32>> removals_;
// Whether a call to SendCurrentDownloads() is currently scheduled.
bool update_scheduled_;
// IDs of new downloads that the page doesn't know about yet.
std::set<uint32> new_downloads_;
base::WeakPtrFactory<DownloadsDOMHandler> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(DownloadsDOMHandler);
};
#endif // CHROME_BROWSER_UI_WEBUI_DOWNLOADS_DOM_HANDLER_H_