| Index: chrome/browser/download/save_package.cc
|
| ===================================================================
|
| --- chrome/browser/download/save_package.cc (revision 92431)
|
| +++ chrome/browser/download/save_package.cc (working copy)
|
| @@ -173,6 +173,7 @@
|
| wait_state_(INITIALIZE),
|
| tab_id_(tab_contents()->GetRenderProcessHost()->id()),
|
| unique_id_(g_save_package_id++),
|
| + download_manager_(NULL),
|
| ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) {
|
| DCHECK(page_url_.is_valid());
|
| DCHECK(save_type_ == SAVE_AS_ONLY_HTML ||
|
| @@ -199,6 +200,7 @@
|
| wait_state_(INITIALIZE),
|
| tab_id_(tab_contents()->GetRenderProcessHost()->id()),
|
| unique_id_(g_save_package_id++),
|
| + download_manager_(NULL),
|
| ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) {
|
| DCHECK(page_url_.is_valid());
|
| InternalInit();
|
| @@ -224,6 +226,7 @@
|
| wait_state_(INITIALIZE),
|
| tab_id_(0),
|
| unique_id_(g_save_package_id++),
|
| + download_manager_(NULL),
|
| ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) {
|
| }
|
|
|
| @@ -234,6 +237,9 @@
|
| Cancel(true);
|
| }
|
|
|
| + // We should no longer be observing the DownloadManager.
|
| + CHECK(!download_manager_);
|
| +
|
| DCHECK(all_save_items_count_ == (waiting_item_queue_.size() +
|
| completed_count() +
|
| in_process_count()));
|
| @@ -314,20 +320,23 @@
|
| return false;
|
| }
|
|
|
| - // Create the fake DownloadItem and display the view.
|
| - DownloadManager* download_manager =
|
| - tab_contents()->profile()->GetDownloadManager();
|
| - download_ = new DownloadItem(download_manager,
|
| + // Get the download manager and add ourselves as an observer.
|
| + download_manager_ = tab_contents()->profile()->GetDownloadManager();
|
| + if (!download_manager_) {
|
| + NOTREACHED();
|
| + return false;
|
| + }
|
| + download_manager_->AddObserver(this);
|
| +
|
| + // Create the download item.
|
| + download_ = new DownloadItem(download_manager_,
|
| saved_main_file_path_,
|
| page_url_,
|
| profile->IsOffTheRecord());
|
|
|
| - // Transfer the ownership to the download manager. We need the DownloadItem
|
| - // to be alive as long as the Profile is alive.
|
| - download_manager->SavePageAsDownloadStarted(download_);
|
| + // Transfer ownership of download item to DownloadManager.
|
| + download_manager_->SavePageDownloadStarted(download_);
|
|
|
| - wrapper_->download_tab_helper()->OnStartDownload(download_);
|
| -
|
| // Check save type and process the save page job.
|
| if (save_type_ == SAVE_AS_COMPLETE_HTML) {
|
| // Get directory
|
| @@ -691,6 +700,7 @@
|
|
|
| // Inform the DownloadItem we have canceled whole save page job.
|
| download_->Cancel(false);
|
| + FinalizeDownloadEntry();
|
| }
|
|
|
| void SavePackage::CheckFinish() {
|
| @@ -745,6 +755,7 @@
|
|
|
| download_->OnAllDataSaved(all_save_items_count_);
|
| download_->MarkAsComplete();
|
| + FinalizeDownloadEntry();
|
|
|
| NotificationService::current()->Notify(
|
| chrome::NOTIFICATION_SAVE_PACKAGE_SUCCESSFULLY_FINISHED,
|
| @@ -1474,3 +1485,18 @@
|
|
|
| void SavePackage::FileSelectionCanceled(void* params) {
|
| }
|
| +
|
| +void SavePackage::ManagerGoingDown() {
|
| + download_ = NULL;
|
| + download_manager_ = NULL;
|
| +}
|
| +
|
| +void SavePackage::FinalizeDownloadEntry() {
|
| + DCHECK(download_manager_);
|
| + if (download_manager_) {
|
| + download_manager_->SavePageDownloadFinished(download_);
|
| + download_manager_->RemoveObserver(this);
|
| + download_manager_ = NULL;
|
| + }
|
| +}
|
| +
|
|
|