Add `session.setDownloadPath` API.
authorHaojian Wu <hokein.wu@gmail.com>
Sun, 26 Jul 2015 08:30:02 +0000 (16:30 +0800)
committerHaojian Wu <hokein.wu@gmail.com>
Sun, 26 Jul 2015 08:51:27 +0000 (16:51 +0800)
atom/browser/api/atom_api_session.cc
atom/browser/api/atom_api_session.h
atom/browser/atom_browser_context.cc
atom/browser/atom_download_manager_delegate.cc
chromium_src/chrome/common/pref_names.cc
chromium_src/chrome/common/pref_names.h

index 483b730..c864598 100644 (file)
 #include "atom/browser/api/atom_api_cookies.h"
 #include "atom/browser/atom_browser_context.h"
 #include "atom/common/native_mate_converters/gurl_converter.h"
-#include "base/thread_task_runner_handle.h"
+#include "base/files/file_path.h"
+#include "base/prefs/pref_service.h"
 #include "base/strings/string_util.h"
+#include "base/thread_task_runner_handle.h"
+#include "chrome/common/pref_names.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/storage_partition.h"
 #include "native_mate/callback.h"
@@ -251,6 +254,11 @@ void Session::SetProxy(const std::string& proxy,
       base::Bind(&SetProxyInIO, base::Unretained(getter), proxy, callback));
 }
 
+void Session::SetDownloadPath(const std::string& path) {
+  browser_context_->prefs()->SetFilePath(prefs::kDownloadDefaultDirectory,
+                                         base::FilePath(path));
+}
+
 v8::Local<v8::Value> Session::Cookies(v8::Isolate* isolate) {
   if (cookies_.IsEmpty()) {
     auto handle = atom::api::Cookies::Create(isolate, browser_context_);
@@ -266,6 +274,7 @@ mate::ObjectTemplateBuilder Session::GetObjectTemplateBuilder(
       .SetMethod("clearCache", &Session::ClearCache)
       .SetMethod("clearStorageData", &Session::ClearStorageData)
       .SetMethod("setProxy", &Session::SetProxy)
+      .SetMethod("setDownloadPath", &Session::SetDownloadPath)
       .SetProperty("cookies", &Session::Cookies);
 }
 
index 3963ed2..a8c0e24 100644 (file)
@@ -46,6 +46,7 @@ class Session: public mate::TrackableObject<Session> {
   void ClearCache(const net::CompletionCallback& callback);
   void ClearStorageData(mate::Arguments* args);
   void SetProxy(const std::string& proxy, const base::Closure& callback);
+  void SetDownloadPath(const std::string& path);
   v8::Local<v8::Value> Cookies(v8::Isolate* isolate);
 
   v8::Global<v8::Value> cookies_;
index 65307d0..f04fbca 100644 (file)
@@ -152,6 +152,8 @@ content::BrowserPluginGuestManager* AtomBrowserContext::GetGuestManager() {
 void AtomBrowserContext::RegisterPrefs(PrefRegistrySimple* pref_registry) {
   pref_registry->RegisterFilePathPref(prefs::kSelectFileLastDirectory,
                                       base::FilePath());
+  pref_registry->RegisterFilePathPref(prefs::kDownloadDefaultDirectory,
+                                      base::FilePath());
 }
 
 }  // namespace atom
index 46c4af2..7e393f7 100644 (file)
@@ -6,10 +6,13 @@
 
 #include <string>
 
+#include "atom/browser/atom_browser_context.h"
 #include "atom/browser/native_window.h"
 #include "atom/browser/ui/file_dialog.h"
 #include "base/bind.h"
 #include "base/files/file_util.h"
+#include "base/prefs/pref_service.h"
+#include "chrome/common/pref_names.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/download_manager.h"
@@ -77,6 +80,11 @@ void AtomDownloadManagerDelegate::OnDownloadPathGenerated(
     return;
   }
 
+  // Remeber the last selected download directory.
+  AtomBrowserContext* browser_context = static_cast<AtomBrowserContext*>(
+      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);
@@ -92,6 +100,11 @@ bool AtomDownloadManagerDelegate::DetermineDownloadTarget(
     const content::DownloadTargetCallback& callback) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
+  AtomBrowserContext* browser_context = static_cast<AtomBrowserContext*>(
+      download_manager_->GetBrowserContext());
+  default_download_path_ = browser_context->prefs()->GetFilePath(
+      prefs::kDownloadDefaultDirectory);
+  // If users didn't set download path, use 'Downloads' directory by default.
   if (default_download_path_.empty()) {
     auto path = download_manager_->GetBrowserContext()->GetPath();
     default_download_path_ = path.Append(FILE_PATH_LITERAL("Downloads"));
index 3871fde..3e3a73b 100644 (file)
@@ -7,5 +7,6 @@
 namespace prefs {
 
 const char kSelectFileLastDirectory[] = "selectfile.last_directory";
+const char kDownloadDefaultDirectory[] = "download.default_directory";
 
 }  // namespace prefs
index 78bd2a0..542a2d2 100644 (file)
@@ -7,5 +7,6 @@
 namespace prefs {
 
 extern const char kSelectFileLastDirectory[];
+extern const char kDownloadDefaultDirectory[];
 
 }  // namespace prefs