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

Side by Side Diff: chrome/browser/download/save_package.cc

Issue 7277073: Support for adding save page download items into downloads history. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 5 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/download/save_package.h" 5 #include "chrome/browser/download/save_package.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/file_path.h" 9 #include "base/file_path.h"
10 #include "base/file_util.h" 10 #include "base/file_util.h"
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 saved_main_directory_path_(directory_full_path), 166 saved_main_directory_path_(directory_full_path),
167 title_(tab_contents()->GetTitle()), 167 title_(tab_contents()->GetTitle()),
168 finished_(false), 168 finished_(false),
169 user_canceled_(false), 169 user_canceled_(false),
170 disk_error_occurred_(false), 170 disk_error_occurred_(false),
171 save_type_(save_type), 171 save_type_(save_type),
172 all_save_items_count_(0), 172 all_save_items_count_(0),
173 wait_state_(INITIALIZE), 173 wait_state_(INITIALIZE),
174 tab_id_(tab_contents()->GetRenderProcessHost()->id()), 174 tab_id_(tab_contents()->GetRenderProcessHost()->id()),
175 unique_id_(g_save_package_id++), 175 unique_id_(g_save_package_id++),
176 download_manager_(NULL),
176 ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) { 177 ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) {
177 DCHECK(page_url_.is_valid()); 178 DCHECK(page_url_.is_valid());
178 DCHECK(save_type_ == SAVE_AS_ONLY_HTML || 179 DCHECK(save_type_ == SAVE_AS_ONLY_HTML ||
179 save_type_ == SAVE_AS_COMPLETE_HTML); 180 save_type_ == SAVE_AS_COMPLETE_HTML);
180 DCHECK(!saved_main_file_path_.empty() && 181 DCHECK(!saved_main_file_path_.empty() &&
181 saved_main_file_path_.value().length() <= kMaxFilePathLength); 182 saved_main_file_path_.value().length() <= kMaxFilePathLength);
182 DCHECK(!saved_main_directory_path_.empty() && 183 DCHECK(!saved_main_directory_path_.empty() &&
183 saved_main_directory_path_.value().length() < kMaxFilePathLength); 184 saved_main_directory_path_.value().length() < kMaxFilePathLength);
184 InternalInit(); 185 InternalInit();
185 } 186 }
186 187
187 SavePackage::SavePackage(TabContentsWrapper* wrapper) 188 SavePackage::SavePackage(TabContentsWrapper* wrapper)
188 : TabContentsObserver(wrapper->tab_contents()), 189 : TabContentsObserver(wrapper->tab_contents()),
189 wrapper_(wrapper), 190 wrapper_(wrapper),
190 file_manager_(NULL), 191 file_manager_(NULL),
191 download_(NULL), 192 download_(NULL),
192 page_url_(GetUrlToBeSaved()), 193 page_url_(GetUrlToBeSaved()),
193 title_(tab_contents()->GetTitle()), 194 title_(tab_contents()->GetTitle()),
194 finished_(false), 195 finished_(false),
195 user_canceled_(false), 196 user_canceled_(false),
196 disk_error_occurred_(false), 197 disk_error_occurred_(false),
197 save_type_(SAVE_TYPE_UNKNOWN), 198 save_type_(SAVE_TYPE_UNKNOWN),
198 all_save_items_count_(0), 199 all_save_items_count_(0),
199 wait_state_(INITIALIZE), 200 wait_state_(INITIALIZE),
200 tab_id_(tab_contents()->GetRenderProcessHost()->id()), 201 tab_id_(tab_contents()->GetRenderProcessHost()->id()),
201 unique_id_(g_save_package_id++), 202 unique_id_(g_save_package_id++),
203 download_manager_(NULL),
202 ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) { 204 ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) {
203 DCHECK(page_url_.is_valid()); 205 DCHECK(page_url_.is_valid());
204 InternalInit(); 206 InternalInit();
205 } 207 }
206 208
207 // This is for testing use. Set |finished_| as true because we don't want 209 // This is for testing use. Set |finished_| as true because we don't want
208 // method Cancel to be be called in destructor in test mode. 210 // method Cancel to be be called in destructor in test mode.
209 // We also don't call InternalInit(). 211 // We also don't call InternalInit().
210 SavePackage::SavePackage(TabContentsWrapper* wrapper, 212 SavePackage::SavePackage(TabContentsWrapper* wrapper,
211 const FilePath& file_full_path, 213 const FilePath& file_full_path,
212 const FilePath& directory_full_path) 214 const FilePath& directory_full_path)
213 : TabContentsObserver(wrapper->tab_contents()), 215 : TabContentsObserver(wrapper->tab_contents()),
214 wrapper_(wrapper), 216 wrapper_(wrapper),
215 file_manager_(NULL), 217 file_manager_(NULL),
216 download_(NULL), 218 download_(NULL),
217 saved_main_file_path_(file_full_path), 219 saved_main_file_path_(file_full_path),
218 saved_main_directory_path_(directory_full_path), 220 saved_main_directory_path_(directory_full_path),
219 finished_(true), 221 finished_(true),
220 user_canceled_(false), 222 user_canceled_(false),
221 disk_error_occurred_(false), 223 disk_error_occurred_(false),
222 save_type_(SAVE_TYPE_UNKNOWN), 224 save_type_(SAVE_TYPE_UNKNOWN),
223 all_save_items_count_(0), 225 all_save_items_count_(0),
224 wait_state_(INITIALIZE), 226 wait_state_(INITIALIZE),
225 tab_id_(0), 227 tab_id_(0),
226 unique_id_(g_save_package_id++), 228 unique_id_(g_save_package_id++),
229 download_manager_(NULL),
227 ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) { 230 ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) {
228 } 231 }
229 232
230 SavePackage::~SavePackage() { 233 SavePackage::~SavePackage() {
231 // Stop receiving saving job's updates 234 // Stop receiving saving job's updates
232 if (!finished_ && !canceled()) { 235 if (!finished_ && !canceled()) {
233 // Unexpected quit. 236 // Unexpected quit.
234 Cancel(true); 237 Cancel(true);
235 } 238 }
236 239
240 // We should no longer be observing the DownloadManager.
241 CHECK(!download_manager_);
242
237 DCHECK(all_save_items_count_ == (waiting_item_queue_.size() + 243 DCHECK(all_save_items_count_ == (waiting_item_queue_.size() +
238 completed_count() + 244 completed_count() +
239 in_process_count())); 245 in_process_count()));
240 // Free all SaveItems. 246 // Free all SaveItems.
241 while (!waiting_item_queue_.empty()) { 247 while (!waiting_item_queue_.empty()) {
242 // We still have some items which are waiting for start to save. 248 // We still have some items which are waiting for start to save.
243 SaveItem* save_item = waiting_item_queue_.front(); 249 SaveItem* save_item = waiting_item_queue_.front();
244 waiting_item_queue_.pop(); 250 waiting_item_queue_.pop();
245 delete save_item; 251 delete save_item;
246 } 252 }
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
307 313
308 wait_state_ = START_PROCESS; 314 wait_state_ = START_PROCESS;
309 315
310 // Initialize the request context and resource dispatcher. 316 // Initialize the request context and resource dispatcher.
311 Profile* profile = tab_contents()->profile(); 317 Profile* profile = tab_contents()->profile();
312 if (!profile) { 318 if (!profile) {
313 NOTREACHED(); 319 NOTREACHED();
314 return false; 320 return false;
315 } 321 }
316 322
317 // Create the fake DownloadItem and display the view. 323 // Get the download manager and add ourselves as an observer.
318 DownloadManager* download_manager = 324 download_manager_ = tab_contents()->profile()->GetDownloadManager();
319 tab_contents()->profile()->GetDownloadManager(); 325 if (!download_manager_) {
320 download_ = new DownloadItem(download_manager, 326 NOTREACHED();
327 return false;
328 }
329 download_manager_->AddObserver(this);
330
331 // Create the download item.
332 download_ = new DownloadItem(download_manager_,
321 saved_main_file_path_, 333 saved_main_file_path_,
322 page_url_, 334 page_url_,
323 profile->IsOffTheRecord()); 335 profile->IsOffTheRecord());
324 336
325 // Transfer the ownership to the download manager. We need the DownloadItem 337 // Transfer ownership of download item to DownloadManager.
326 // to be alive as long as the Profile is alive. 338 download_manager_->SavePageDownloadStarted(download_);
327 download_manager->SavePageAsDownloadStarted(download_);
328
329 wrapper_->download_tab_helper()->OnStartDownload(download_);
330 339
331 // Check save type and process the save page job. 340 // Check save type and process the save page job.
332 if (save_type_ == SAVE_AS_COMPLETE_HTML) { 341 if (save_type_ == SAVE_AS_COMPLETE_HTML) {
333 // Get directory 342 // Get directory
334 DCHECK(!saved_main_directory_path_.empty()); 343 DCHECK(!saved_main_directory_path_.empty());
335 GetAllSavableResourceLinksForCurrentPage(); 344 GetAllSavableResourceLinksForCurrentPage();
336 } else { 345 } else {
337 wait_state_ = NET_FILES; 346 wait_state_ = NET_FILES;
338 SaveFileCreateInfo::SaveFileSource save_source = page_url_.SchemeIsFile() ? 347 SaveFileCreateInfo::SaveFileSource save_source = page_url_.SchemeIsFile() ?
339 SaveFileCreateInfo::SAVE_FILE_FROM_FILE : 348 SaveFileCreateInfo::SAVE_FILE_FROM_FILE :
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after
684 BrowserThread::FILE, FROM_HERE, 693 BrowserThread::FILE, FROM_HERE,
685 NewRunnableMethod(file_manager_, 694 NewRunnableMethod(file_manager_,
686 &SaveFileManager::RemoveSavedFileFromFileMap, 695 &SaveFileManager::RemoveSavedFileFromFileMap,
687 save_ids)); 696 save_ids));
688 697
689 finished_ = true; 698 finished_ = true;
690 wait_state_ = FAILED; 699 wait_state_ = FAILED;
691 700
692 // Inform the DownloadItem we have canceled whole save page job. 701 // Inform the DownloadItem we have canceled whole save page job.
693 download_->Cancel(false); 702 download_->Cancel(false);
703 FinalizeDownloadEntry();
694 } 704 }
695 705
696 void SavePackage::CheckFinish() { 706 void SavePackage::CheckFinish() {
697 if (in_process_count() || finished_) 707 if (in_process_count() || finished_)
698 return; 708 return;
699 709
700 FilePath dir = (save_type_ == SAVE_AS_COMPLETE_HTML && 710 FilePath dir = (save_type_ == SAVE_AS_COMPLETE_HTML &&
701 saved_success_items_.size() > 1) ? 711 saved_success_items_.size() > 1) ?
702 saved_main_directory_path_ : FilePath(); 712 saved_main_directory_path_ : FilePath();
703 713
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
738 save_ids.push_back(it->second->save_id()); 748 save_ids.push_back(it->second->save_id());
739 749
740 BrowserThread::PostTask( 750 BrowserThread::PostTask(
741 BrowserThread::FILE, FROM_HERE, 751 BrowserThread::FILE, FROM_HERE,
742 NewRunnableMethod(file_manager_, 752 NewRunnableMethod(file_manager_,
743 &SaveFileManager::RemoveSavedFileFromFileMap, 753 &SaveFileManager::RemoveSavedFileFromFileMap,
744 save_ids)); 754 save_ids));
745 755
746 download_->OnAllDataSaved(all_save_items_count_); 756 download_->OnAllDataSaved(all_save_items_count_);
747 download_->MarkAsComplete(); 757 download_->MarkAsComplete();
758 FinalizeDownloadEntry();
748 759
749 NotificationService::current()->Notify( 760 NotificationService::current()->Notify(
750 chrome::NOTIFICATION_SAVE_PACKAGE_SUCCESSFULLY_FINISHED, 761 chrome::NOTIFICATION_SAVE_PACKAGE_SUCCESSFULLY_FINISHED,
751 Source<SavePackage>(this), 762 Source<SavePackage>(this),
752 Details<GURL>(&page_url_)); 763 Details<GURL>(&page_url_));
753 } 764 }
754 765
755 // Called for updating end state. 766 // Called for updating end state.
756 void SavePackage::SaveFinished(int32 save_id, int64 size, bool is_success) { 767 void SavePackage::SaveFinished(int32 save_id, int64 size, bool is_success) {
757 // Because we might have canceled this saving job before, 768 // Because we might have canceled this saving job before,
(...skipping 709 matching lines...) Expand 10 before | Expand all | Expand 10 after
1467 } 1478 }
1468 1479
1469 // SelectFileDialog::Listener interface. 1480 // SelectFileDialog::Listener interface.
1470 void SavePackage::FileSelected(const FilePath& path, 1481 void SavePackage::FileSelected(const FilePath& path,
1471 int index, void* params) { 1482 int index, void* params) {
1472 ContinueSave(path, index); 1483 ContinueSave(path, index);
1473 } 1484 }
1474 1485
1475 void SavePackage::FileSelectionCanceled(void* params) { 1486 void SavePackage::FileSelectionCanceled(void* params) {
1476 } 1487 }
1488
1489 void SavePackage::ManagerGoingDown() {
1490 download_ = NULL;
1491 download_manager_ = NULL;
1492 }
1493
1494 void SavePackage::FinalizeDownloadEntry() {
1495 DCHECK(download_manager_);
1496 if (download_manager_) {
1497 download_manager_->SavePageDownloadFinished(download_);
1498 download_manager_->RemoveObserver(this);
1499 download_manager_ = NULL;
1500 }
1501 }
1502
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698