download_shelf_context_menu.cc revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_shelf_context_menu.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_crx_util.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_item_model.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_prefs.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/download_protection_service.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/safe_browsing_service.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/url_constants.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_item.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/page_navigator.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DownloadItem;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DownloadShelfContextMenu::~DownloadShelfContextMenu() {
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DetachFromDownloadItem();
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DownloadShelfContextMenu::DownloadShelfContextMenu(
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadItem* download_item,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::PageNavigator* navigator)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : download_item_(download_item),
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      navigator_(navigator) {
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(download_item_);
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  download_item_->AddObserver(this);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::SimpleMenuModel* DownloadShelfContextMenu::GetMenuModel() {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::SimpleMenuModel* model = NULL;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!download_item_)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadItemModel download_model(download_item_);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We shouldn't be opening a context menu for a dangerous download, unless it
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is a malicious download.
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!download_model.IsDangerous() || download_model.IsMalicious());
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (download_model.IsMalicious())
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model = GetMaliciousMenuModel();
5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  else if (download_item_->GetState() == DownloadItem::COMPLETE)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model = GetFinishedMenuModel();
5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  else if (download_item_->GetState() == DownloadItem::INTERRUPTED)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    model = GetInterruptedMenuModel();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model = GetInProgressMenuModel();
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return model;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DownloadShelfContextMenu::IsCommandIdEnabled(int command_id) const {
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!download_item_)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (static_cast<ContextMenuCommands>(command_id)) {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SHOW_IN_FOLDER:
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return download_item_->CanShowInFolder();
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case OPEN_WHEN_COMPLETE:
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return download_item_->CanOpenDownload() &&
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          !download_crx_util::IsExtensionDownload(*download_item_);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ALWAYS_OPEN_TYPE:
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // For temporary downloads, the target filename might be a temporary
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // filename. Don't base an "Always open" decision based on it. Also
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // exclude extensions.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return download_item_->CanOpenDownload() &&
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          !download_crx_util::IsExtensionDownload(*download_item_);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CANCEL:
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return download_item_->IsPartialDownload();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TOGGLE_PAUSE:
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return download_item_->GetState() == DownloadItem::IN_PROGRESS;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case DISCARD:
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case KEEP:
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case LEARN_MORE_SCANNING:
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case LEARN_MORE_INTERRUPTED:
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DownloadShelfContextMenu::IsCommandIdChecked(int command_id) const {
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!download_item_)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (command_id) {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case OPEN_WHEN_COMPLETE:
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return download_item_->GetOpenWhenComplete() ||
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          download_crx_util::IsExtensionDownload(*download_item_);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ALWAYS_OPEN_TYPE:
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return download_item_->ShouldOpenFileBasedOnExtension();
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TOGGLE_PAUSE:
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return download_item_->IsPaused();
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DownloadShelfContextMenu::ExecuteCommand(int command_id, int event_flags) {
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!download_item_)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (static_cast<ContextMenuCommands>(command_id)) {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SHOW_IN_FOLDER:
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_item_->ShowDownloadInShell();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case OPEN_WHEN_COMPLETE:
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_item_->OpenDownload();
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ALWAYS_OPEN_TYPE: {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadPrefs* prefs = DownloadPrefs::FromBrowserContext(
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          download_item_->GetBrowserContext());
11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::FilePath path = download_item_->GetTargetFilePath();
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!IsCommandIdChecked(ALWAYS_OPEN_TYPE))
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prefs->EnableAutoOpenBasedOnExtension(path);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prefs->DisableAutoOpenBasedOnExtension(path);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CANCEL:
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      download_item_->Cancel(true /* Cancelled by user */);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TOGGLE_PAUSE:
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // It is possible for the download to complete before the user clicks the
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // menu item, recheck if the download is in progress state before toggling
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // pause.
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (download_item_->IsPartialDownload()) {
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (download_item_->IsPaused())
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          download_item_->Resume();
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        else
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          download_item_->Pause();
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DISCARD:
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_item_->Delete(DownloadItem::DELETE_DUE_TO_USER_DISCARD);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case KEEP:
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_item_->DangerousDownloadValidated();
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case LEARN_MORE_SCANNING: {
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      using safe_browsing::DownloadProtectionService;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SafeBrowsingService* sb_service =
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          g_browser_process->safe_browsing_service();
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadProtectionService* protection_service =
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (sb_service ? sb_service->download_protection_service() : NULL);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (protection_service) {
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protection_service->ShowDetailsForDownload(*download_item_, navigator_);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Should only be getting invoked if we are using safe browsing.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case LEARN_MORE_INTERRUPTED:
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      navigator_->OpenURL(
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          content::OpenURLParams(GURL(chrome::kDownloadInterruptedLearnMoreURL),
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 content::Referrer(),
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 NEW_FOREGROUND_TAB,
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 content::PAGE_TRANSITION_LINK,
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 false));
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DownloadShelfContextMenu::GetAcceleratorForCommandId(
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int command_id, ui::Accelerator* accelerator) {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DownloadShelfContextMenu::IsItemForCommandIdDynamic(int command_id) const {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return command_id == TOGGLE_PAUSE;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 DownloadShelfContextMenu::GetLabelForCommandId(int command_id) const {
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (static_cast<ContextMenuCommands>(command_id)) {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SHOW_IN_FOLDER:
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_SHOW);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case OPEN_WHEN_COMPLETE:
18690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (download_item_ &&
18790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          download_item_->GetState() == DownloadItem::IN_PROGRESS)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_OPEN_WHEN_COMPLETE);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_OPEN);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ALWAYS_OPEN_TYPE:
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_ALWAYS_OPEN_TYPE);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CANCEL:
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_CANCEL);
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case TOGGLE_PAUSE:
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (download_item_ && download_item_->IsPaused())
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_RESUME_ITEM);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_PAUSE_ITEM);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DISCARD:
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_DISCARD);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case KEEP:
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_KEEP);
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case LEARN_MORE_SCANNING:
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_LEARN_MORE_SCANNING);
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case LEARN_MORE_INTERRUPTED:
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return l10n_util::GetStringUTF16(
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          IDS_DOWNLOAD_MENU_LEARN_MORE_INTERRUPTED);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NOTREACHED();
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return string16();
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DownloadShelfContextMenu::DetachFromDownloadItem() {
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!download_item_)
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  download_item_->RemoveObserver(this);
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  download_item_ = NULL;
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DownloadShelfContextMenu::OnDownloadDestroyed(DownloadItem* download) {
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(download_item_ == download);
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DetachFromDownloadItem();
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::SimpleMenuModel* DownloadShelfContextMenu::GetInProgressMenuModel() {
226b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (in_progress_download_menu_model_)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return in_progress_download_menu_model_.get();
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  in_progress_download_menu_model_.reset(new ui::SimpleMenuModel(this));
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  in_progress_download_menu_model_->AddCheckItemWithStringId(
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OPEN_WHEN_COMPLETE, IDS_DOWNLOAD_MENU_OPEN_WHEN_COMPLETE);
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  in_progress_download_menu_model_->AddCheckItemWithStringId(
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ALWAYS_OPEN_TYPE, IDS_DOWNLOAD_MENU_ALWAYS_OPEN_TYPE);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  in_progress_download_menu_model_->AddSeparator(ui::NORMAL_SEPARATOR);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  in_progress_download_menu_model_->AddItemWithStringId(
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TOGGLE_PAUSE, IDS_DOWNLOAD_MENU_PAUSE_ITEM);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  in_progress_download_menu_model_->AddItemWithStringId(
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SHOW_IN_FOLDER, IDS_DOWNLOAD_MENU_SHOW);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  in_progress_download_menu_model_->AddSeparator(ui::NORMAL_SEPARATOR);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  in_progress_download_menu_model_->AddItemWithStringId(
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CANCEL, IDS_DOWNLOAD_MENU_CANCEL);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return in_progress_download_menu_model_.get();
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::SimpleMenuModel* DownloadShelfContextMenu::GetFinishedMenuModel() {
248b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (finished_download_menu_model_)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return finished_download_menu_model_.get();
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  finished_download_menu_model_.reset(new ui::SimpleMenuModel(this));
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  finished_download_menu_model_->AddItemWithStringId(
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OPEN_WHEN_COMPLETE, IDS_DOWNLOAD_MENU_OPEN);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  finished_download_menu_model_->AddCheckItemWithStringId(
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ALWAYS_OPEN_TYPE, IDS_DOWNLOAD_MENU_ALWAYS_OPEN_TYPE);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  finished_download_menu_model_->AddSeparator(ui::NORMAL_SEPARATOR);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  finished_download_menu_model_->AddItemWithStringId(
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SHOW_IN_FOLDER, IDS_DOWNLOAD_MENU_SHOW);
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  finished_download_menu_model_->AddSeparator(ui::NORMAL_SEPARATOR);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  finished_download_menu_model_->AddItemWithStringId(
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CANCEL, IDS_DOWNLOAD_MENU_CANCEL);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return finished_download_menu_model_.get();
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::SimpleMenuModel* DownloadShelfContextMenu::GetInterruptedMenuModel() {
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The Help Center article is currently Windows specific.
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(asanka): Enable this for other platforms when the article is expanded
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // for other platforms.
272b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (interrupted_download_menu_model_)
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return interrupted_download_menu_model_.get();
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interrupted_download_menu_model_.reset(new ui::SimpleMenuModel(this));
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interrupted_download_menu_model_->AddItemWithStringId(
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LEARN_MORE_INTERRUPTED, IDS_DOWNLOAD_MENU_LEARN_MORE_INTERRUPTED);
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return interrupted_download_menu_model_.get();
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return GetInProgressMenuModel();
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::SimpleMenuModel* DownloadShelfContextMenu::GetMaliciousMenuModel() {
287b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (malicious_download_menu_model_)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return malicious_download_menu_model_.get();
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  malicious_download_menu_model_.reset(new ui::SimpleMenuModel(this));
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  malicious_download_menu_model_->AddItemWithStringId(
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DISCARD, IDS_DOWNLOAD_MENU_DISCARD);
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  malicious_download_menu_model_->AddItemWithStringId(
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      KEEP, IDS_DOWNLOAD_MENU_KEEP);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  malicious_download_menu_model_->AddSeparator(ui::NORMAL_SEPARATOR);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  malicious_download_menu_model_->AddItemWithStringId(
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LEARN_MORE_SCANNING, IDS_DOWNLOAD_MENU_LEARN_MORE_SCANNING);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return malicious_download_menu_model_.get();
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
302