| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/download_shelf_context_menu.h" | 5 #include "chrome/browser/download/download_shelf_context_menu.h" |
| 6 | 6 |
| 7 #include "chrome/browser/browser_process.h" | 7 #include "chrome/browser/browser_process.h" |
| 8 #include "chrome/browser/download/download_crx_util.h" | 8 #include "chrome/browser/download/download_crx_util.h" |
| 9 #include "chrome/browser/download/download_item_model.h" | 9 #include "chrome/browser/download/download_item_model.h" |
| 10 #include "chrome/browser/download/download_prefs.h" | 10 #include "chrome/browser/download/download_prefs.h" |
| 11 #include "chrome/browser/safe_browsing/download_protection_service.h" | 11 #include "chrome/browser/safe_browsing/download_protection_service.h" |
| 12 #include "chrome/browser/safe_browsing/safe_browsing_service.h" | 12 #include "chrome/browser/safe_browsing/safe_browsing_service.h" |
| 13 #include "chrome/common/extensions/extension.h" | 13 #include "chrome/common/extensions/extension.h" |
| 14 #include "chrome/common/url_constants.h" | 14 #include "chrome/common/url_constants.h" |
| 15 #include "content/public/browser/download_item.h" | 15 #include "content/public/browser/download_item.h" |
| 16 #include "content/public/browser/download_manager.h" | 16 #include "content/public/browser/download_manager.h" |
| 17 #include "content/public/browser/page_navigator.h" | 17 #include "content/public/browser/page_navigator.h" |
| 18 #include "grit/generated_resources.h" | 18 #include "grit/generated_resources.h" |
| 19 #include "ui/base/l10n/l10n_util.h" | 19 #include "ui/base/l10n/l10n_util.h" |
| 20 | 20 |
| 21 using content::DownloadItem; | 21 using content::DownloadItem; |
| 22 using extensions::Extension; | 22 using extensions::Extension; |
| 23 | 23 |
| 24 DownloadShelfContextMenu::~DownloadShelfContextMenu() {} | 24 DownloadShelfContextMenu::~DownloadShelfContextMenu() { |
| 25 DetachFromDownloadItem(); |
| 26 } |
| 25 | 27 |
| 26 DownloadShelfContextMenu::DownloadShelfContextMenu( | 28 DownloadShelfContextMenu::DownloadShelfContextMenu( |
| 27 DownloadItemModel* download_model, | 29 DownloadItem* download_item, |
| 28 content::PageNavigator* navigator) | 30 content::PageNavigator* navigator) |
| 29 : download_model_(download_model), | 31 : download_item_(download_item), |
| 30 download_item_(download_model->download()), | |
| 31 navigator_(navigator) { | 32 navigator_(navigator) { |
| 33 DCHECK(download_item_); |
| 34 download_item_->AddObserver(this); |
| 32 } | 35 } |
| 33 | 36 |
| 34 ui::SimpleMenuModel* DownloadShelfContextMenu::GetMenuModel() { | 37 ui::SimpleMenuModel* DownloadShelfContextMenu::GetMenuModel() { |
| 35 ui::SimpleMenuModel* model = NULL; | 38 ui::SimpleMenuModel* model = NULL; |
| 39 |
| 40 if (!download_item_) |
| 41 return NULL; |
| 42 |
| 43 DownloadItemModel download_model(download_item_); |
| 36 // We shouldn't be opening a context menu for a dangerous download, unless it | 44 // We shouldn't be opening a context menu for a dangerous download, unless it |
| 37 // is a malicious download. | 45 // is a malicious download. |
| 38 DCHECK(!download_model_->IsDangerous() || download_model_->IsMalicious()); | 46 DCHECK(!download_model.IsDangerous() || download_model.IsMalicious()); |
| 39 | 47 |
| 40 if (download_model_->IsMalicious()) | 48 if (download_model.IsMalicious()) |
| 41 model = GetMaliciousMenuModel(); | 49 model = GetMaliciousMenuModel(); |
| 42 else if (download_item_->IsComplete()) | 50 else if (download_item_->IsComplete()) |
| 43 model = GetFinishedMenuModel(); | 51 model = GetFinishedMenuModel(); |
| 44 else if (download_item_->IsInterrupted()) | 52 else if (download_item_->IsInterrupted()) |
| 45 model = GetInterruptedMenuModel(); | 53 model = GetInterruptedMenuModel(); |
| 46 else | 54 else |
| 47 model = GetInProgressMenuModel(); | 55 model = GetInProgressMenuModel(); |
| 48 return model; | 56 return model; |
| 49 } | 57 } |
| 50 | 58 |
| 51 bool DownloadShelfContextMenu::IsCommandIdEnabled(int command_id) const { | 59 bool DownloadShelfContextMenu::IsCommandIdEnabled(int command_id) const { |
| 60 if (!download_item_) |
| 61 return false; |
| 62 |
| 52 switch (static_cast<ContextMenuCommands>(command_id)) { | 63 switch (static_cast<ContextMenuCommands>(command_id)) { |
| 53 case SHOW_IN_FOLDER: | 64 case SHOW_IN_FOLDER: |
| 54 return download_item_->CanShowInFolder() && | 65 return download_item_->CanShowInFolder() && |
| 55 !download_item_->IsTemporary(); | 66 !download_item_->IsTemporary(); |
| 56 case OPEN_WHEN_COMPLETE: | 67 case OPEN_WHEN_COMPLETE: |
| 57 return download_item_->CanShowInFolder() && | 68 return download_item_->CanShowInFolder() && |
| 58 !download_item_->IsTemporary() && | 69 !download_item_->IsTemporary() && |
| 59 (!download_crx_util::IsExtensionDownload(*download_item_) || | 70 (!download_crx_util::IsExtensionDownload(*download_item_) || |
| 60 download_item_->IsComplete()); | 71 download_item_->IsComplete()); |
| 61 case ALWAYS_OPEN_TYPE: | 72 case ALWAYS_OPEN_TYPE: |
| (...skipping 10 matching lines...) Expand all Loading... |
| 72 case DISCARD: | 83 case DISCARD: |
| 73 case KEEP: | 84 case KEEP: |
| 74 case LEARN_MORE_SCANNING: | 85 case LEARN_MORE_SCANNING: |
| 75 case LEARN_MORE_INTERRUPTED: | 86 case LEARN_MORE_INTERRUPTED: |
| 76 return true; | 87 return true; |
| 77 } | 88 } |
| 78 return false; | 89 return false; |
| 79 } | 90 } |
| 80 | 91 |
| 81 bool DownloadShelfContextMenu::IsCommandIdChecked(int command_id) const { | 92 bool DownloadShelfContextMenu::IsCommandIdChecked(int command_id) const { |
| 93 if (!download_item_) |
| 94 return false; |
| 95 |
| 82 switch (command_id) { | 96 switch (command_id) { |
| 83 case OPEN_WHEN_COMPLETE: | 97 case OPEN_WHEN_COMPLETE: |
| 84 return download_item_->GetOpenWhenComplete() || | 98 return download_item_->GetOpenWhenComplete() || |
| 85 download_crx_util::IsExtensionDownload(*download_item_); | 99 download_crx_util::IsExtensionDownload(*download_item_); |
| 86 case ALWAYS_OPEN_TYPE: | 100 case ALWAYS_OPEN_TYPE: |
| 87 return download_item_->ShouldOpenFileBasedOnExtension(); | 101 return download_item_->ShouldOpenFileBasedOnExtension(); |
| 88 case TOGGLE_PAUSE: | 102 case TOGGLE_PAUSE: |
| 89 return download_item_->IsPaused(); | 103 return download_item_->IsPaused(); |
| 90 } | 104 } |
| 91 return false; | 105 return false; |
| 92 } | 106 } |
| 93 | 107 |
| 94 void DownloadShelfContextMenu::ExecuteCommand(int command_id) { | 108 void DownloadShelfContextMenu::ExecuteCommand(int command_id) { |
| 109 if (!download_item_) |
| 110 return; |
| 111 |
| 95 switch (static_cast<ContextMenuCommands>(command_id)) { | 112 switch (static_cast<ContextMenuCommands>(command_id)) { |
| 96 case SHOW_IN_FOLDER: | 113 case SHOW_IN_FOLDER: |
| 97 download_item_->ShowDownloadInShell(); | 114 download_item_->ShowDownloadInShell(); |
| 98 break; | 115 break; |
| 99 case OPEN_WHEN_COMPLETE: | 116 case OPEN_WHEN_COMPLETE: |
| 100 download_item_->OpenDownload(); | 117 download_item_->OpenDownload(); |
| 101 break; | 118 break; |
| 102 case ALWAYS_OPEN_TYPE: { | 119 case ALWAYS_OPEN_TYPE: { |
| 103 DownloadPrefs* prefs = DownloadPrefs::FromBrowserContext( | 120 DownloadPrefs* prefs = DownloadPrefs::FromBrowserContext( |
| 104 download_item_->GetBrowserContext()); | 121 download_item_->GetBrowserContext()); |
| 105 FilePath path = download_item_->GetUserVerifiedFilePath(); | 122 FilePath path = download_item_->GetUserVerifiedFilePath(); |
| 106 if (!IsCommandIdChecked(ALWAYS_OPEN_TYPE)) | 123 if (!IsCommandIdChecked(ALWAYS_OPEN_TYPE)) |
| 107 prefs->EnableAutoOpenBasedOnExtension(path); | 124 prefs->EnableAutoOpenBasedOnExtension(path); |
| 108 else | 125 else |
| 109 prefs->DisableAutoOpenBasedOnExtension(path); | 126 prefs->DisableAutoOpenBasedOnExtension(path); |
| 110 break; | 127 break; |
| 111 } | 128 } |
| 112 case CANCEL: | 129 case CANCEL: |
| 113 download_model_->CancelTask(); | 130 download_item_->Cancel(true /* Cancelled by user */); |
| 114 break; | 131 break; |
| 115 case TOGGLE_PAUSE: | 132 case TOGGLE_PAUSE: |
| 116 // It is possible for the download to complete before the user clicks the | 133 // It is possible for the download to complete before the user clicks the |
| 117 // menu item, recheck if the download is in progress state before toggling | 134 // menu item, recheck if the download is in progress state before toggling |
| 118 // pause. | 135 // pause. |
| 119 if (download_item_->IsPartialDownload()) | 136 if (download_item_->IsPartialDownload()) |
| 120 download_item_->TogglePause(); | 137 download_item_->TogglePause(); |
| 121 break; | 138 break; |
| 122 case DISCARD: | 139 case DISCARD: |
| 123 download_item_->Delete(DownloadItem::DELETE_DUE_TO_USER_DISCARD); | 140 download_item_->Delete(DownloadItem::DELETE_DUE_TO_USER_DISCARD); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 162 | 179 |
| 163 bool DownloadShelfContextMenu::IsItemForCommandIdDynamic(int command_id) const { | 180 bool DownloadShelfContextMenu::IsItemForCommandIdDynamic(int command_id) const { |
| 164 return command_id == TOGGLE_PAUSE; | 181 return command_id == TOGGLE_PAUSE; |
| 165 } | 182 } |
| 166 | 183 |
| 167 string16 DownloadShelfContextMenu::GetLabelForCommandId(int command_id) const { | 184 string16 DownloadShelfContextMenu::GetLabelForCommandId(int command_id) const { |
| 168 switch (static_cast<ContextMenuCommands>(command_id)) { | 185 switch (static_cast<ContextMenuCommands>(command_id)) { |
| 169 case SHOW_IN_FOLDER: | 186 case SHOW_IN_FOLDER: |
| 170 return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_SHOW); | 187 return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_SHOW); |
| 171 case OPEN_WHEN_COMPLETE: | 188 case OPEN_WHEN_COMPLETE: |
| 172 if (download_item_->IsInProgress()) | 189 if (download_item_ && download_item_->IsInProgress()) |
| 173 return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_OPEN_WHEN_COMPLETE); | 190 return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_OPEN_WHEN_COMPLETE); |
| 174 return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_OPEN); | 191 return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_OPEN); |
| 175 case ALWAYS_OPEN_TYPE: | 192 case ALWAYS_OPEN_TYPE: |
| 176 return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_ALWAYS_OPEN_TYPE); | 193 return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_ALWAYS_OPEN_TYPE); |
| 177 case CANCEL: | 194 case CANCEL: |
| 178 return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_CANCEL); | 195 return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_CANCEL); |
| 179 case TOGGLE_PAUSE: { | 196 case TOGGLE_PAUSE: |
| 180 if (download_item_->IsPaused()) | 197 if (download_item_ && download_item_->IsPaused()) |
| 181 return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_RESUME_ITEM); | 198 return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_RESUME_ITEM); |
| 182 return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_PAUSE_ITEM); | 199 return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_PAUSE_ITEM); |
| 183 } | |
| 184 case DISCARD: | 200 case DISCARD: |
| 185 return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_DISCARD); | 201 return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_DISCARD); |
| 186 case KEEP: | 202 case KEEP: |
| 187 return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_KEEP); | 203 return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_KEEP); |
| 188 case LEARN_MORE_SCANNING: | 204 case LEARN_MORE_SCANNING: |
| 189 return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_LEARN_MORE_SCANNING); | 205 return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_LEARN_MORE_SCANNING); |
| 190 case LEARN_MORE_INTERRUPTED: | 206 case LEARN_MORE_INTERRUPTED: |
| 191 return l10n_util::GetStringUTF16( | 207 return l10n_util::GetStringUTF16( |
| 192 IDS_DOWNLOAD_MENU_LEARN_MORE_INTERRUPTED); | 208 IDS_DOWNLOAD_MENU_LEARN_MORE_INTERRUPTED); |
| 193 } | 209 } |
| 194 NOTREACHED(); | 210 NOTREACHED(); |
| 195 return string16(); | 211 return string16(); |
| 196 } | 212 } |
| 197 | 213 |
| 214 void DownloadShelfContextMenu::DetachFromDownloadItem() { |
| 215 if (!download_item_) |
| 216 return; |
| 217 |
| 218 download_item_->RemoveObserver(this); |
| 219 download_item_ = NULL; |
| 220 } |
| 221 |
| 222 void DownloadShelfContextMenu::OnDownloadDestroyed(DownloadItem* download) { |
| 223 DCHECK(download_item_ == download); |
| 224 DetachFromDownloadItem(); |
| 225 } |
| 226 |
| 198 ui::SimpleMenuModel* DownloadShelfContextMenu::GetInProgressMenuModel() { | 227 ui::SimpleMenuModel* DownloadShelfContextMenu::GetInProgressMenuModel() { |
| 199 if (in_progress_download_menu_model_.get()) | 228 if (in_progress_download_menu_model_.get()) |
| 200 return in_progress_download_menu_model_.get(); | 229 return in_progress_download_menu_model_.get(); |
| 201 | 230 |
| 202 in_progress_download_menu_model_.reset(new ui::SimpleMenuModel(this)); | 231 in_progress_download_menu_model_.reset(new ui::SimpleMenuModel(this)); |
| 203 | 232 |
| 204 in_progress_download_menu_model_->AddCheckItemWithStringId( | 233 in_progress_download_menu_model_->AddCheckItemWithStringId( |
| 205 OPEN_WHEN_COMPLETE, IDS_DOWNLOAD_MENU_OPEN_WHEN_COMPLETE); | 234 OPEN_WHEN_COMPLETE, IDS_DOWNLOAD_MENU_OPEN_WHEN_COMPLETE); |
| 206 in_progress_download_menu_model_->AddCheckItemWithStringId( | 235 in_progress_download_menu_model_->AddCheckItemWithStringId( |
| 207 ALWAYS_OPEN_TYPE, IDS_DOWNLOAD_MENU_ALWAYS_OPEN_TYPE); | 236 ALWAYS_OPEN_TYPE, IDS_DOWNLOAD_MENU_ALWAYS_OPEN_TYPE); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 265 malicious_download_menu_model_->AddItemWithStringId( | 294 malicious_download_menu_model_->AddItemWithStringId( |
| 266 DISCARD, IDS_DOWNLOAD_MENU_DISCARD); | 295 DISCARD, IDS_DOWNLOAD_MENU_DISCARD); |
| 267 malicious_download_menu_model_->AddItemWithStringId( | 296 malicious_download_menu_model_->AddItemWithStringId( |
| 268 KEEP, IDS_DOWNLOAD_MENU_KEEP); | 297 KEEP, IDS_DOWNLOAD_MENU_KEEP); |
| 269 malicious_download_menu_model_->AddSeparator(ui::NORMAL_SEPARATOR); | 298 malicious_download_menu_model_->AddSeparator(ui::NORMAL_SEPARATOR); |
| 270 malicious_download_menu_model_->AddItemWithStringId( | 299 malicious_download_menu_model_->AddItemWithStringId( |
| 271 LEARN_MORE_SCANNING, IDS_DOWNLOAD_MENU_LEARN_MORE_SCANNING); | 300 LEARN_MORE_SCANNING, IDS_DOWNLOAD_MENU_LEARN_MORE_SCANNING); |
| 272 | 301 |
| 273 return malicious_download_menu_model_.get(); | 302 return malicious_download_menu_model_.get(); |
| 274 } | 303 } |
| OLD | NEW |