Implement session.setOpenDownloadDialog() API.

This commit is contained in:
Haojian Wu 2015-09-20 18:45:34 +08:00
parent e30dd943db
commit 87b9b0bc31
4 changed files with 31 additions and 9 deletions

View file

@ -9,6 +9,7 @@
#include "atom/browser/api/atom_api_cookies.h" #include "atom/browser/api/atom_api_cookies.h"
#include "atom/browser/atom_browser_context.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/browser/api/atom_api_web_contents.h"
#include "atom/common/native_mate_converters/callback.h" #include "atom/common/native_mate_converters/callback.h"
#include "atom/common/native_mate_converters/gurl_converter.h" #include "atom/common/native_mate_converters/gurl_converter.h"
@ -245,7 +246,7 @@ Session::~Session() {
} }
void Session::OnDownloadCreated(content::DownloadManager* manager, void Session::OnDownloadCreated(content::DownloadManager* manager,
content::DownloadItem* item) { content::DownloadItem* item) {
auto web_contents = item->GetWebContents(); auto web_contents = item->GetWebContents();
bool prevent_default = Emit("will-download", item, bool prevent_default = Emit("will-download", item,
api::WebContents::CreateFrom(isolate(), api::WebContents::CreateFrom(isolate(),
@ -305,6 +306,13 @@ void Session::SetDownloadPath(const base::FilePath& path) {
prefs::kDownloadDefaultDirectory, path); prefs::kDownloadDefaultDirectory, path);
} }
void Session::SetOpenDownloadDialog(bool open_download_dialog) {
AtomDownloadManagerDelegate* delegate =
static_cast<AtomDownloadManagerDelegate*>(
browser_context()->GetDownloadManagerDelegate());
delegate->SetOpenDownloadDialog(open_download_dialog);
}
v8::Local<v8::Value> Session::Cookies(v8::Isolate* isolate) { v8::Local<v8::Value> Session::Cookies(v8::Isolate* isolate) {
if (cookies_.IsEmpty()) { if (cookies_.IsEmpty()) {
auto handle = atom::api::Cookies::Create(isolate, browser_context()); auto handle = atom::api::Cookies::Create(isolate, browser_context());
@ -321,6 +329,7 @@ mate::ObjectTemplateBuilder Session::GetObjectTemplateBuilder(
.SetMethod("clearStorageData", &Session::ClearStorageData) .SetMethod("clearStorageData", &Session::ClearStorageData)
.SetMethod("setProxy", &Session::SetProxy) .SetMethod("setProxy", &Session::SetProxy)
.SetMethod("setDownloadPath", &Session::SetDownloadPath) .SetMethod("setDownloadPath", &Session::SetDownloadPath)
.SetMethod("setOpenDownloadDialog", &Session::SetOpenDownloadDialog)
.SetProperty("cookies", &Session::Cookies); .SetProperty("cookies", &Session::Cookies);
} }

View file

@ -43,6 +43,8 @@ class Session: public mate::TrackableObject<Session>,
AtomBrowserContext* browser_context() const { return browser_context_.get(); } AtomBrowserContext* browser_context() const { return browser_context_.get(); }
void SetOpenDownloadDialog(bool open_download_dialog);
protected: protected:
explicit Session(AtomBrowserContext* browser_context); explicit Session(AtomBrowserContext* browser_context);
~Session(); ~Session();

View file

@ -23,7 +23,8 @@ namespace atom {
AtomDownloadManagerDelegate::AtomDownloadManagerDelegate( AtomDownloadManagerDelegate::AtomDownloadManagerDelegate(
content::DownloadManager* manager) content::DownloadManager* manager)
: download_manager_(manager), : download_manager_(manager),
weak_ptr_factory_(this) {} weak_ptr_factory_(this),
open_download_dialog_(true) {}
AtomDownloadManagerDelegate::~AtomDownloadManagerDelegate() { AtomDownloadManagerDelegate::~AtomDownloadManagerDelegate() {
if (download_manager_) { if (download_manager_) {
@ -74,22 +75,30 @@ void AtomDownloadManagerDelegate::OnDownloadPathGenerated(
window = relay->window.get(); window = relay->window.get();
file_dialog::Filters filters; file_dialog::Filters filters;
base::FilePath path; base::FilePath path = default_path;
if (!file_dialog::ShowSaveDialog(window, item->GetURL().spec(), default_path, if (open_download_dialog_ &&
!file_dialog::ShowSaveDialog(window, item->GetURL().spec(), default_path,
filters, &path)) { filters, &path)) {
return; return;
} }
// Remeber the last selected download directory. if (open_download_dialog_) {
AtomBrowserContext* browser_context = static_cast<AtomBrowserContext*>( // Remeber the last selected download directory.
download_manager_->GetBrowserContext()); AtomBrowserContext* browser_context = static_cast<AtomBrowserContext*>(
browser_context->prefs()->SetFilePath(prefs::kDownloadDefaultDirectory, download_manager_->GetBrowserContext());
path.DirName()); browser_context->prefs()->SetFilePath(prefs::kDownloadDefaultDirectory,
path.DirName());
}
callback.Run(path, callback.Run(path,
content::DownloadItem::TARGET_DISPOSITION_PROMPT, content::DownloadItem::TARGET_DISPOSITION_PROMPT,
content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, path); content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, path);
} }
void AtomDownloadManagerDelegate::SetOpenDownloadDialog(
bool open_download_dialog) {
open_download_dialog_ = open_download_dialog;
}
void AtomDownloadManagerDelegate::Shutdown() { void AtomDownloadManagerDelegate::Shutdown() {
weak_ptr_factory_.InvalidateWeakPtrs(); weak_ptr_factory_.InvalidateWeakPtrs();
download_manager_ = nullptr; download_manager_ = nullptr;

View file

@ -34,6 +34,7 @@ class AtomDownloadManagerDelegate : public content::DownloadManagerDelegate {
void OnDownloadPathGenerated(uint32 download_id, void OnDownloadPathGenerated(uint32 download_id,
const content::DownloadTargetCallback& callback, const content::DownloadTargetCallback& callback,
const base::FilePath& default_path); const base::FilePath& default_path);
void SetOpenDownloadDialog(bool open_download_dialog);
// content::DownloadManagerDelegate: // content::DownloadManagerDelegate:
void Shutdown() override; void Shutdown() override;
@ -48,6 +49,7 @@ class AtomDownloadManagerDelegate : public content::DownloadManagerDelegate {
private: private:
content::DownloadManager* download_manager_; content::DownloadManager* download_manager_;
base::WeakPtrFactory<AtomDownloadManagerDelegate> weak_ptr_factory_; base::WeakPtrFactory<AtomDownloadManagerDelegate> weak_ptr_factory_;
bool open_download_dialog_;
DISALLOW_COPY_AND_ASSIGN(AtomDownloadManagerDelegate); DISALLOW_COPY_AND_ASSIGN(AtomDownloadManagerDelegate);
}; };