summaryrefslogtreecommitdiffstats
path: root/chrome/browser/download/save_package.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/download/save_package.cc')
-rw-r--r--chrome/browser/download/save_package.cc44
1 files changed, 30 insertions, 14 deletions
diff --git a/chrome/browser/download/save_package.cc b/chrome/browser/download/save_package.cc
index 2fd35ee..33c8bfb 100644
--- a/chrome/browser/download/save_package.cc
+++ b/chrome/browser/download/save_package.cc
@@ -144,6 +144,7 @@ SavePackage::SavePackage(TabContents* web_content,
saved_main_file_path_.value().length() <= kMaxFilePathLength);
DCHECK(!saved_main_directory_path_.empty() &&
saved_main_directory_path_.value().length() < kMaxFilePathLength);
+ InternalInit();
}
SavePackage::SavePackage(TabContents* tab_contents)
@@ -160,10 +161,12 @@ SavePackage::SavePackage(TabContents* tab_contents)
const GURL& current_page_url = tab_contents_->GetURL();
DCHECK(current_page_url.is_valid());
page_url_ = current_page_url;
+ InternalInit();
}
// This is for testing use. Set |finished_| as true because we don't want
// method Cancel to be be called in destructor in test mode.
+// We also don't call InternalInit().
SavePackage::SavePackage(const FilePath& file_full_path,
const FilePath& directory_full_path)
: file_manager_(NULL),
@@ -233,6 +236,22 @@ void SavePackage::Cancel(bool user_action) {
}
}
+// Init() can be called directly, or indirectly via GetSaveInfo(). In both
+// cases, we need file_manager_ to be initialized, so we do this first.
+void SavePackage::InternalInit() {
+ ResourceDispatcherHost* rdh = g_browser_process->resource_dispatcher_host();
+ if (!rdh) {
+ NOTREACHED();
+ return;
+ }
+
+ file_manager_ = rdh->save_file_manager();
+ if (!file_manager_) {
+ NOTREACHED();
+ return;
+ }
+}
+
// Initialize the SavePackage.
bool SavePackage::Init() {
// Set proper running state.
@@ -250,18 +269,6 @@ bool SavePackage::Init() {
request_context_ = profile->GetRequestContext();
- ResourceDispatcherHost* rdh = g_browser_process->resource_dispatcher_host();
- if (!rdh) {
- NOTREACHED();
- return false;
- }
-
- file_manager_ = rdh->save_file_manager();
- if (!file_manager_) {
- NOTREACHED();
- return false;
- }
-
// Create the fake DownloadItem and display the view.
download_ = new DownloadItem(1, saved_main_file_path_, 0, page_url_, GURL(),
"", FilePath(), Time::Now(), 0, -1, -1, false, false);
@@ -1046,6 +1053,17 @@ FilePath SavePackage::GetSaveDirPreference(PrefService* prefs) {
}
void SavePackage::GetSaveInfo() {
+ FilePath save_dir =
+ GetSaveDirPreference(tab_contents_->profile()->GetPrefs());
+ file_manager_->file_loop()->PostTask(FROM_HERE,
+ NewRunnableMethod(file_manager_,
+ &SaveFileManager::CreateDownloadDirectory,
+ save_dir,
+ this));
+ // CreateDownloadDirectory() calls ContinueGetSaveInfo() below.
+}
+
+void SavePackage::ContinueGetSaveInfo(FilePath save_dir) {
// Use "Web Page, Complete" option as default choice of saving page.
int file_type_index = 2;
SelectFileDialog::FileTypeInfo file_type_info;
@@ -1059,8 +1077,6 @@ void SavePackage::GetSaveInfo() {
FilePath title =
FilePath::FromWStringHack(UTF16ToWideHack(tab_contents_->GetTitle()));
- FilePath save_dir =
- GetSaveDirPreference(tab_contents_->profile()->GetPrefs());
FilePath suggested_path =
save_dir.Append(GetSuggestedNameForSaveAs(title, can_save_as_complete));