From 87b9b0bc31a8b7aa1b69cfbb185188a78c8b67f9 Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Sun, 20 Sep 2015 18:45:34 +0800 Subject: [PATCH] Implement session.setOpenDownloadDialog() API. --- atom/browser/api/atom_api_session.cc | 11 +++++++- atom/browser/api/atom_api_session.h | 2 ++ .../browser/atom_download_manager_delegate.cc | 25 +++++++++++++------ atom/browser/atom_download_manager_delegate.h | 2 ++ 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/atom/browser/api/atom_api_session.cc b/atom/browser/api/atom_api_session.cc index f07ab8b78045..062c7500ef04 100644 --- a/atom/browser/api/atom_api_session.cc +++ b/atom/browser/api/atom_api_session.cc @@ -9,6 +9,7 @@ #include "atom/browser/api/atom_api_cookies.h" #include "atom/browser/atom_browser_context.h" +#include "atom/browser/atom_download_manager_delegate.h" #include "atom/browser/api/atom_api_web_contents.h" #include "atom/common/native_mate_converters/callback.h" #include "atom/common/native_mate_converters/gurl_converter.h" @@ -245,7 +246,7 @@ Session::~Session() { } void Session::OnDownloadCreated(content::DownloadManager* manager, - content::DownloadItem* item) { + content::DownloadItem* item) { auto web_contents = item->GetWebContents(); bool prevent_default = Emit("will-download", item, api::WebContents::CreateFrom(isolate(), @@ -305,6 +306,13 @@ void Session::SetDownloadPath(const base::FilePath& path) { prefs::kDownloadDefaultDirectory, path); } +void Session::SetOpenDownloadDialog(bool open_download_dialog) { + AtomDownloadManagerDelegate* delegate = + static_cast( + browser_context()->GetDownloadManagerDelegate()); + delegate->SetOpenDownloadDialog(open_download_dialog); +} + v8::Local Session::Cookies(v8::Isolate* isolate) { if (cookies_.IsEmpty()) { auto handle = atom::api::Cookies::Create(isolate, browser_context()); @@ -321,6 +329,7 @@ mate::ObjectTemplateBuilder Session::GetObjectTemplateBuilder( .SetMethod("clearStorageData", &Session::ClearStorageData) .SetMethod("setProxy", &Session::SetProxy) .SetMethod("setDownloadPath", &Session::SetDownloadPath) + .SetMethod("setOpenDownloadDialog", &Session::SetOpenDownloadDialog) .SetProperty("cookies", &Session::Cookies); } diff --git a/atom/browser/api/atom_api_session.h b/atom/browser/api/atom_api_session.h index 14406e57af5b..2c53cfdac5af 100644 --- a/atom/browser/api/atom_api_session.h +++ b/atom/browser/api/atom_api_session.h @@ -43,6 +43,8 @@ class Session: public mate::TrackableObject, AtomBrowserContext* browser_context() const { return browser_context_.get(); } + void SetOpenDownloadDialog(bool open_download_dialog); + protected: explicit Session(AtomBrowserContext* browser_context); ~Session(); diff --git a/atom/browser/atom_download_manager_delegate.cc b/atom/browser/atom_download_manager_delegate.cc index b573a396332f..7cc2c1714596 100644 --- a/atom/browser/atom_download_manager_delegate.cc +++ b/atom/browser/atom_download_manager_delegate.cc @@ -23,7 +23,8 @@ namespace atom { AtomDownloadManagerDelegate::AtomDownloadManagerDelegate( content::DownloadManager* manager) : download_manager_(manager), - weak_ptr_factory_(this) {} + weak_ptr_factory_(this), + open_download_dialog_(true) {} AtomDownloadManagerDelegate::~AtomDownloadManagerDelegate() { if (download_manager_) { @@ -74,22 +75,30 @@ void AtomDownloadManagerDelegate::OnDownloadPathGenerated( window = relay->window.get(); file_dialog::Filters filters; - base::FilePath path; - if (!file_dialog::ShowSaveDialog(window, item->GetURL().spec(), default_path, + base::FilePath path = default_path; + if (open_download_dialog_ && + !file_dialog::ShowSaveDialog(window, item->GetURL().spec(), default_path, filters, &path)) { return; } - // Remeber the last selected download directory. - AtomBrowserContext* browser_context = static_cast( - download_manager_->GetBrowserContext()); - browser_context->prefs()->SetFilePath(prefs::kDownloadDefaultDirectory, - path.DirName()); + if (open_download_dialog_) { + // Remeber the last selected download directory. + AtomBrowserContext* browser_context = static_cast( + download_manager_->GetBrowserContext()); + browser_context->prefs()->SetFilePath(prefs::kDownloadDefaultDirectory, + path.DirName()); + } callback.Run(path, content::DownloadItem::TARGET_DISPOSITION_PROMPT, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, path); } +void AtomDownloadManagerDelegate::SetOpenDownloadDialog( + bool open_download_dialog) { + open_download_dialog_ = open_download_dialog; +} + void AtomDownloadManagerDelegate::Shutdown() { weak_ptr_factory_.InvalidateWeakPtrs(); download_manager_ = nullptr; diff --git a/atom/browser/atom_download_manager_delegate.h b/atom/browser/atom_download_manager_delegate.h index 2df3a7d45a6b..d518e16bcbda 100644 --- a/atom/browser/atom_download_manager_delegate.h +++ b/atom/browser/atom_download_manager_delegate.h @@ -34,6 +34,7 @@ class AtomDownloadManagerDelegate : public content::DownloadManagerDelegate { void OnDownloadPathGenerated(uint32 download_id, const content::DownloadTargetCallback& callback, const base::FilePath& default_path); + void SetOpenDownloadDialog(bool open_download_dialog); // content::DownloadManagerDelegate: void Shutdown() override; @@ -48,6 +49,7 @@ class AtomDownloadManagerDelegate : public content::DownloadManagerDelegate { private: content::DownloadManager* download_manager_; base::WeakPtrFactory weak_ptr_factory_; + bool open_download_dialog_; DISALLOW_COPY_AND_ASSIGN(AtomDownloadManagerDelegate); };