Index: chrome/browser/download/download_target_determiner.cc |
diff --git a/chrome/browser/download/download_target_determiner.cc b/chrome/browser/download/download_target_determiner.cc |
index 99bcd7f1e855e09c96b958c6277aeda025c8f3dd..4a68db7c05345846add4d3f6f0eeea77f83aeaba 100644 |
--- a/chrome/browser/download/download_target_determiner.cc |
+++ b/chrome/browser/download/download_target_determiner.cc |
@@ -39,6 +39,10 @@ |
#include "content/public/common/webplugininfo.h" |
#endif |
+#if defined(OS_ANDROID) |
+#include "content/public/browser/android/download_controller_android.h" |
+#endif |
+ |
#if defined(OS_WIN) |
#include "chrome/browser/ui/pdf/adobe_reader_info_win.h" |
#endif |
@@ -86,7 +90,7 @@ DownloadTargetDeterminer::DownloadTargetDeterminer( |
DownloadPrefs* download_prefs, |
DownloadTargetDeterminerDelegate* delegate, |
const CompletionCallback& callback) |
- : next_state_(STATE_GENERATE_TARGET_PATH), |
+ : next_state_(STATE_PROMPT_USER_FOR_PERMISSION), |
should_prompt_(false), |
should_notify_extensions_(false), |
create_target_directory_(false), |
@@ -102,6 +106,9 @@ DownloadTargetDeterminer::DownloadTargetDeterminer( |
download_prefs_(download_prefs), |
delegate_(delegate), |
completion_callback_(callback), |
+#if defined(OS_ANDROID) |
+ download_controller_(content::DownloadControllerAndroid::Get()), |
asanka
2015/07/07 05:03:33
A member variable is unnecessary for this.
qinmin
2015/07/07 06:14:05
Done.
|
+#endif |
weak_ptr_factory_(this) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
DCHECK(download_); |
@@ -125,6 +132,9 @@ void DownloadTargetDeterminer::DoLoop() { |
next_state_ = STATE_NONE; |
switch (current_state) { |
+ case STATE_PROMPT_USER_FOR_PERMISSION: |
+ result = DoPromptUserForPermission(); |
+ break; |
case STATE_GENERATE_TARGET_PATH: |
result = DoGenerateTargetPath(); |
break; |
@@ -172,6 +182,32 @@ void DownloadTargetDeterminer::DoLoop() { |
} |
DownloadTargetDeterminer::Result |
+ DownloadTargetDeterminer::DoPromptUserForPermission() { |
+ DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ next_state_ = STATE_GENERATE_TARGET_PATH; |
+#if defined(OS_ANDROID) |
+ content::WebContents* web_contents = download_->GetWebContents(); |
+ download_controller_->AcquireFileAccessPermission( |
+ web_contents, |
+ base::Bind(&DownloadTargetDeterminer::PromptUserForPermissionDone, |
+ weak_ptr_factory_.GetWeakPtr())); |
+ return QUIT_DOLOOP; |
+#endif |
asanka
2015/07/07 05:03:33
#else
return CONTINUE;
#endif
qinmin
2015/07/07 06:14:05
Done.
|
+ return CONTINUE; |
+} |
+ |
+void DownloadTargetDeterminer::PromptUserForPermissionDone(bool granted) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ DCHECK_EQ(STATE_GENERATE_TARGET_PATH, next_state_); |
+ if (!granted) { |
+ CancelOnFailureAndDeleteSelf(); |
+ return; |
+ } |
+ |
+ DoLoop(); |
+} |
+ |
+DownloadTargetDeterminer::Result |
DownloadTargetDeterminer::DoGenerateTargetPath() { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
DCHECK(local_path_.empty()); |