Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(715)

Unified Diff: chrome/browser/download/download_target_determiner.cc

Issue 1217223006: Prompt user for file access permission before download starts (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..fd9b08c398fc12a2ebf3a981dd31e567f06624ef 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
@@ -70,6 +74,10 @@ void VisitCountsToVisitedBefore(
bool g_is_adobe_reader_up_to_date_ = false;
#endif
+#if defined(OS_ANDROID)
+ // Download controller for file access prompt.
Ted C 2015/07/06 20:03:39 these two lines shouldn't be indented.
qinmin 2015/07/06 20:36:02 Done.
+ content::DownloadControllerAndroid* g_download_controller_;
asanka 2015/07/06 21:09:41 I know this'll end up being nullptr, but please in
qinmin 2015/07/07 00:54:22 Done. make this a member variable and initialize i
+#endif
} // namespace
DownloadTargetInfo::DownloadTargetInfo()
@@ -86,7 +94,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),
@@ -107,7 +115,10 @@ DownloadTargetDeterminer::DownloadTargetDeterminer(
DCHECK(download_);
DCHECK(delegate);
download_->AddObserver(this);
-
+#if defined(OS_ANDROID)
+ if (!g_download_controller_)
+ g_download_controller_ = content::DownloadControllerAndroid::Get();
+#endif
DoLoop();
}
@@ -125,6 +136,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,12 +186,45 @@ void DownloadTargetDeterminer::DoLoop() {
}
DownloadTargetDeterminer::Result
+ DownloadTargetDeterminer::DoPromptUserForPermission() {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ DCHECK(local_path_.empty());
asanka 2015/07/06 21:09:41 Why are you checking these (here and below)? In g
qinmin 2015/07/07 00:54:22 Ok, removed. On 2015/07/06 21:09:41, asanka wrote
+ DCHECK(!should_prompt_);
+ DCHECK(!should_notify_extensions_);
+ DCHECK_EQ(DownloadPathReservationTracker::OVERWRITE, conflict_action_);
+ next_state_ = STATE_GENERATE_TARGET_PATH;
+#if defined(OS_ANDROID)
+ content::WebContents* web_contents = download_->GetWebContents();
+ if (g_download_controller_->RequireUserPermissionPrompt(web_contents)) {
+ g_download_controller_->PromptUserForPermission(
+ web_contents,
+ base::Bind(&DownloadTargetDeterminer::PromptUserForPermissionDone,
+ weak_ptr_factory_.GetWeakPtr()));
+ return QUIT_DOLOOP;
+ }
+#endif
+ 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());
DCHECK(!should_prompt_);
DCHECK(!should_notify_extensions_);
DCHECK_EQ(DownloadPathReservationTracker::OVERWRITE, conflict_action_);
+
bool is_forced_path = !download_->GetForcedFilePath().empty();
next_state_ = STATE_NOTIFY_EXTENSIONS;
@@ -902,3 +949,11 @@ bool DownloadTargetDeterminer::IsAdobeReaderUpToDate() {
return g_is_adobe_reader_up_to_date_;
}
#endif
+
+#if defined(OS_ANDROID)
+// static
+void DownloadTargetDeterminer::SetDownloadControllerAndroidForTestings(
asanka 2015/07/06 21:09:41 Rather than setting a global override here just fo
qinmin 2015/07/07 00:54:22 Done. DownloadControllerAndroid::Get() will now re
+ content::DownloadControllerAndroid* download_controller) {
+ g_download_controller_ = download_controller;
+}
+#endif

Powered by Google App Engine
This is Rietveld 408576698