Index: chrome/browser/download/download_shelf_context_menu.cc |
diff --git a/chrome/browser/download/download_shelf_context_menu.cc b/chrome/browser/download/download_shelf_context_menu.cc |
index 3e13650a0082a45a96ec1f1d6439a3b37ea51444..0e70100524a593c6b1b253206ff1c754ce2d5ba2 100644 |
--- a/chrome/browser/download/download_shelf_context_menu.cc |
+++ b/chrome/browser/download/download_shelf_context_menu.cc |
@@ -21,23 +21,31 @@ |
using content::DownloadItem; |
using extensions::Extension; |
-DownloadShelfContextMenu::~DownloadShelfContextMenu() {} |
+DownloadShelfContextMenu::~DownloadShelfContextMenu() { |
+ DetachFromDownloadItem(); |
+} |
DownloadShelfContextMenu::DownloadShelfContextMenu( |
- DownloadItemModel* download_model, |
+ DownloadItem* download_item, |
content::PageNavigator* navigator) |
- : download_model_(download_model), |
- download_item_(download_model->download()), |
+ : download_item_(download_item), |
navigator_(navigator) { |
+ DCHECK(download_item_); |
+ download_item_->AddObserver(this); |
} |
ui::SimpleMenuModel* DownloadShelfContextMenu::GetMenuModel() { |
ui::SimpleMenuModel* model = NULL; |
+ |
+ if (!download_item_) |
+ return NULL; |
+ |
+ DownloadItemModel download_model(download_item_); |
// We shouldn't be opening a context menu for a dangerous download, unless it |
// is a malicious download. |
- DCHECK(!download_model_->IsDangerous() || download_model_->IsMalicious()); |
+ DCHECK(!download_model.IsDangerous() || download_model.IsMalicious()); |
- if (download_model_->IsMalicious()) |
+ if (download_model.IsMalicious()) |
model = GetMaliciousMenuModel(); |
else if (download_item_->IsComplete()) |
model = GetFinishedMenuModel(); |
@@ -49,6 +57,9 @@ ui::SimpleMenuModel* DownloadShelfContextMenu::GetMenuModel() { |
} |
bool DownloadShelfContextMenu::IsCommandIdEnabled(int command_id) const { |
+ if (!download_item_) |
+ return false; |
+ |
switch (static_cast<ContextMenuCommands>(command_id)) { |
case SHOW_IN_FOLDER: |
return download_item_->CanShowInFolder() && |
@@ -79,6 +90,9 @@ bool DownloadShelfContextMenu::IsCommandIdEnabled(int command_id) const { |
} |
bool DownloadShelfContextMenu::IsCommandIdChecked(int command_id) const { |
+ if (!download_item_) |
+ return false; |
+ |
switch (command_id) { |
case OPEN_WHEN_COMPLETE: |
return download_item_->GetOpenWhenComplete() || |
@@ -92,6 +106,9 @@ bool DownloadShelfContextMenu::IsCommandIdChecked(int command_id) const { |
} |
void DownloadShelfContextMenu::ExecuteCommand(int command_id) { |
+ if (!download_item_) |
+ return; |
+ |
switch (static_cast<ContextMenuCommands>(command_id)) { |
case SHOW_IN_FOLDER: |
download_item_->ShowDownloadInShell(); |
@@ -110,7 +127,7 @@ void DownloadShelfContextMenu::ExecuteCommand(int command_id) { |
break; |
} |
case CANCEL: |
- download_model_->CancelTask(); |
+ download_item_->Cancel(true /* Cancelled by user */); |
break; |
case TOGGLE_PAUSE: |
// It is possible for the download to complete before the user clicks the |
@@ -169,18 +186,17 @@ string16 DownloadShelfContextMenu::GetLabelForCommandId(int command_id) const { |
case SHOW_IN_FOLDER: |
return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_SHOW); |
case OPEN_WHEN_COMPLETE: |
- if (download_item_->IsInProgress()) |
+ if (download_item_ && download_item_->IsInProgress()) |
return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_OPEN_WHEN_COMPLETE); |
return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_OPEN); |
case ALWAYS_OPEN_TYPE: |
return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_ALWAYS_OPEN_TYPE); |
case CANCEL: |
return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_CANCEL); |
- case TOGGLE_PAUSE: { |
- if (download_item_->IsPaused()) |
+ case TOGGLE_PAUSE: |
+ if (download_item_ && download_item_->IsPaused()) |
return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_RESUME_ITEM); |
return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_PAUSE_ITEM); |
- } |
case DISCARD: |
return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_DISCARD); |
case KEEP: |
@@ -195,6 +211,19 @@ string16 DownloadShelfContextMenu::GetLabelForCommandId(int command_id) const { |
return string16(); |
} |
+void DownloadShelfContextMenu::DetachFromDownloadItem() { |
+ if (!download_item_) |
+ return; |
+ |
+ download_item_->RemoveObserver(this); |
+ download_item_ = NULL; |
+} |
+ |
+void DownloadShelfContextMenu::OnDownloadDestroyed(DownloadItem* download) { |
+ DCHECK(download_item_ == download); |
+ DetachFromDownloadItem(); |
+} |
+ |
ui::SimpleMenuModel* DownloadShelfContextMenu::GetInProgressMenuModel() { |
if (in_progress_download_menu_model_.get()) |
return in_progress_download_menu_model_.get(); |