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)
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/command_line.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_crx_util.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_item_model.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_prefs.h"
120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/safe_browsing/download_feedback_service.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/download_protection_service.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/safe_browsing_service.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/url_constants.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_item.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/page_navigator.h"
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/common/content_switches.h"
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DownloadItem;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace {
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Returns true if downloads resumption is enabled.
30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool IsDownloadResumptionEnabled() {
31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const CommandLine& command_line = *CommandLine::ForCurrentProcess();
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return command_line.HasSwitch(switches::kEnableDownloadResumption);
33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DownloadShelfContextMenu::~DownloadShelfContextMenu() {
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DetachFromDownloadItem();
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DownloadShelfContextMenu::DownloadShelfContextMenu(
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadItem* download_item,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::PageNavigator* navigator)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : download_item_(download_item),
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      navigator_(navigator) {
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(download_item_);
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  download_item_->AddObserver(this);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::SimpleMenuModel* DownloadShelfContextMenu::GetMenuModel() {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::SimpleMenuModel* model = NULL;
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!download_item_)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadItemModel download_model(download_item_);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We shouldn't be opening a context menu for a dangerous download, unless it
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is a malicious download.
598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  DCHECK(!download_model.IsDangerous() || download_model.MightBeMalicious());
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (download_model.IsMalicious())
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model = GetMaliciousMenuModel();
638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  else if (download_model.MightBeMalicious())
648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    model = GetMaybeMaliciousMenuModel();
6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  else if (download_item_->GetState() == DownloadItem::COMPLETE)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model = GetFinishedMenuModel();
6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  else if (download_item_->GetState() == DownloadItem::INTERRUPTED)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    model = GetInterruptedMenuModel();
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model = GetInProgressMenuModel();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return model;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DownloadShelfContextMenu::IsCommandIdEnabled(int command_id) const {
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!download_item_)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (static_cast<ContextMenuCommands>(command_id)) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SHOW_IN_FOLDER:
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return download_item_->CanShowInFolder();
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case OPEN_WHEN_COMPLETE:
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case PLATFORM_OPEN:
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return download_item_->CanOpenDownload() &&
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          !download_crx_util::IsExtensionDownload(*download_item_);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ALWAYS_OPEN_TYPE:
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // For temporary downloads, the target filename might be a temporary
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // filename. Don't base an "Always open" decision based on it. Also
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // exclude extensions.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return download_item_->CanOpenDownload() &&
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          !download_crx_util::IsExtensionDownload(*download_item_);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CANCEL:
92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      return !download_item_->IsDone();
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TOGGLE_PAUSE:
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      return !download_item_->IsDone();
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case DISCARD:
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case KEEP:
970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    case REPORT:
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case LEARN_MORE_SCANNING:
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case LEARN_MORE_INTERRUPTED:
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DownloadShelfContextMenu::IsCommandIdChecked(int command_id) const {
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!download_item_)
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (command_id) {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case OPEN_WHEN_COMPLETE:
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return download_item_->GetOpenWhenComplete() ||
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          download_crx_util::IsExtensionDownload(*download_item_);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ALWAYS_OPEN_TYPE:
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return download_item_->ShouldOpenFileBasedOnExtension();
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TOGGLE_PAUSE:
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return download_item_->IsPaused();
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DownloadShelfContextMenu::ExecuteCommand(int command_id, int event_flags) {
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!download_item_)
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (static_cast<ContextMenuCommands>(command_id)) {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SHOW_IN_FOLDER:
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_item_->ShowDownloadInShell();
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case OPEN_WHEN_COMPLETE:
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_item_->OpenDownload();
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ALWAYS_OPEN_TYPE: {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadPrefs* prefs = DownloadPrefs::FromBrowserContext(
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          download_item_->GetBrowserContext());
13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::FilePath path = download_item_->GetTargetFilePath();
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!IsCommandIdChecked(ALWAYS_OPEN_TYPE))
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prefs->EnableAutoOpenBasedOnExtension(path);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prefs->DisableAutoOpenBasedOnExtension(path);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case PLATFORM_OPEN:
143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      DownloadItemModel(download_item_).OpenUsingPlatformHandler();
144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      break;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CANCEL:
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      download_item_->Cancel(true /* Cancelled by user */);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TOGGLE_PAUSE:
149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      if (download_item_->GetState() == DownloadItem::IN_PROGRESS &&
150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          !download_item_->IsPaused()) {
151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        download_item_->Pause();
152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      } else {
153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        download_item_->Resume();
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DISCARD:
157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      download_item_->Remove();
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case KEEP:
160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      download_item_->ValidateDangerousDownload();
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    case REPORT: {
1630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#if defined(FULL_SAFE_BROWSING)
1640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      using safe_browsing::DownloadProtectionService;
1650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      DownloadItemModel download_model(download_item_);
1660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      if (!download_model.ShouldAllowDownloadFeedback())
1670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        break;
1680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      SafeBrowsingService* sb_service =
1690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          g_browser_process->safe_browsing_service();
1700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      DownloadProtectionService* protection_service =
1710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          (sb_service ? sb_service->download_protection_service() : NULL);
1720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      if (protection_service) {
1730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        protection_service->feedback_service()->BeginFeedbackForDownload(
1740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)            download_item_);
1750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      }
1760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#else
1770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      // Should only be getting invoked if we are using safe browsing.
1780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      NOTREACHED();
1790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#endif
1800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      break;
1810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case LEARN_MORE_SCANNING: {
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      using safe_browsing::DownloadProtectionService;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SafeBrowsingService* sb_service =
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          g_browser_process->safe_browsing_service();
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadProtectionService* protection_service =
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (sb_service ? sb_service->download_protection_service() : NULL);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (protection_service) {
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protection_service->ShowDetailsForDownload(*download_item_, navigator_);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Should only be getting invoked if we are using safe browsing.
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case LEARN_MORE_INTERRUPTED:
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      navigator_->OpenURL(
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          content::OpenURLParams(GURL(chrome::kDownloadInterruptedLearnMoreURL),
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 content::Referrer(),
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 NEW_FOREGROUND_TAB,
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 content::PAGE_TRANSITION_LINK,
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 false));
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DownloadShelfContextMenu::GetAcceleratorForCommandId(
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int command_id, ui::Accelerator* accelerator) {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DownloadShelfContextMenu::IsItemForCommandIdDynamic(int command_id) const {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return command_id == TOGGLE_PAUSE;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 DownloadShelfContextMenu::GetLabelForCommandId(
219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    int command_id) const {
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (static_cast<ContextMenuCommands>(command_id)) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SHOW_IN_FOLDER:
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_SHOW);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case OPEN_WHEN_COMPLETE:
224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      if (download_item_ && !download_item_->IsDone())
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_OPEN_WHEN_COMPLETE);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_OPEN);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ALWAYS_OPEN_TYPE:
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_ALWAYS_OPEN_TYPE);
229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case PLATFORM_OPEN:
230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_PLATFORM_OPEN);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CANCEL:
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_CANCEL);
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case TOGGLE_PAUSE:
234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      if (download_item_ &&
235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          download_item_->GetState() == DownloadItem::IN_PROGRESS &&
236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          !download_item_->IsPaused())
237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_PAUSE_ITEM);
238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_RESUME_ITEM);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DISCARD:
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_DISCARD);
2410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    case REPORT:
2420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_REPORT);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case KEEP:
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_KEEP);
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case LEARN_MORE_SCANNING:
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_LEARN_MORE_SCANNING);
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case LEARN_MORE_INTERRUPTED:
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return l10n_util::GetStringUTF16(
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          IDS_DOWNLOAD_MENU_LEARN_MORE_INTERRUPTED);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NOTREACHED();
252a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return base::string16();
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DownloadShelfContextMenu::DetachFromDownloadItem() {
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!download_item_)
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  download_item_->RemoveObserver(this);
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  download_item_ = NULL;
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DownloadShelfContextMenu::OnDownloadDestroyed(DownloadItem* download) {
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(download_item_ == download);
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DetachFromDownloadItem();
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::SimpleMenuModel* DownloadShelfContextMenu::GetInProgressMenuModel() {
269b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (in_progress_download_menu_model_)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return in_progress_download_menu_model_.get();
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  in_progress_download_menu_model_.reset(new ui::SimpleMenuModel(this));
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  in_progress_download_menu_model_->AddCheckItemWithStringId(
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OPEN_WHEN_COMPLETE, IDS_DOWNLOAD_MENU_OPEN_WHEN_COMPLETE);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  in_progress_download_menu_model_->AddCheckItemWithStringId(
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ALWAYS_OPEN_TYPE, IDS_DOWNLOAD_MENU_ALWAYS_OPEN_TYPE);
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  in_progress_download_menu_model_->AddSeparator(ui::NORMAL_SEPARATOR);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  in_progress_download_menu_model_->AddItemWithStringId(
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TOGGLE_PAUSE, IDS_DOWNLOAD_MENU_PAUSE_ITEM);
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  in_progress_download_menu_model_->AddItemWithStringId(
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SHOW_IN_FOLDER, IDS_DOWNLOAD_MENU_SHOW);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  in_progress_download_menu_model_->AddSeparator(ui::NORMAL_SEPARATOR);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  in_progress_download_menu_model_->AddItemWithStringId(
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CANCEL, IDS_DOWNLOAD_MENU_CANCEL);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return in_progress_download_menu_model_.get();
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::SimpleMenuModel* DownloadShelfContextMenu::GetFinishedMenuModel() {
291b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (finished_download_menu_model_)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return finished_download_menu_model_.get();
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  finished_download_menu_model_.reset(new ui::SimpleMenuModel(this));
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  finished_download_menu_model_->AddItemWithStringId(
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OPEN_WHEN_COMPLETE, IDS_DOWNLOAD_MENU_OPEN);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  finished_download_menu_model_->AddCheckItemWithStringId(
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ALWAYS_OPEN_TYPE, IDS_DOWNLOAD_MENU_ALWAYS_OPEN_TYPE);
300f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (DownloadItemModel(download_item_).ShouldPreferOpeningInBrowser())
301f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    finished_download_menu_model_->AddItemWithStringId(
302f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        PLATFORM_OPEN, IDS_DOWNLOAD_MENU_PLATFORM_OPEN);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  finished_download_menu_model_->AddSeparator(ui::NORMAL_SEPARATOR);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  finished_download_menu_model_->AddItemWithStringId(
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SHOW_IN_FOLDER, IDS_DOWNLOAD_MENU_SHOW);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  finished_download_menu_model_->AddSeparator(ui::NORMAL_SEPARATOR);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  finished_download_menu_model_->AddItemWithStringId(
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CANCEL, IDS_DOWNLOAD_MENU_CANCEL);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return finished_download_menu_model_.get();
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::SimpleMenuModel* DownloadShelfContextMenu::GetInterruptedMenuModel() {
314868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if !defined(OS_WIN)
315868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // If resumption isn't enabled and we aren't on Windows, then none of the
316868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // options here are applicable.
317868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!IsDownloadResumptionEnabled())
318868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return GetInProgressMenuModel();
319868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif
320868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
321b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (interrupted_download_menu_model_)
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return interrupted_download_menu_model_.get();
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interrupted_download_menu_model_.reset(new ui::SimpleMenuModel(this));
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
326868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (IsDownloadResumptionEnabled()) {
327868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    interrupted_download_menu_model_->AddItemWithStringId(
328868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        TOGGLE_PAUSE, IDS_DOWNLOAD_MENU_RESUME_ITEM);
329868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
330868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(OS_WIN)
331868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // The Help Center article is currently Windows specific.
332868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // TODO(asanka): Enable this for other platforms when the article is expanded
333868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // for other platforms.
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interrupted_download_menu_model_->AddItemWithStringId(
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LEARN_MORE_INTERRUPTED, IDS_DOWNLOAD_MENU_LEARN_MORE_INTERRUPTED);
336868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif
337868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (IsDownloadResumptionEnabled()) {
338868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    interrupted_download_menu_model_->AddSeparator(ui::NORMAL_SEPARATOR);
339868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    interrupted_download_menu_model_->AddItemWithStringId(
340868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        CANCEL, IDS_DOWNLOAD_MENU_CANCEL);
341868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return interrupted_download_menu_model_.get();
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)ui::SimpleMenuModel* DownloadShelfContextMenu::GetMaybeMaliciousMenuModel() {
3478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (maybe_malicious_download_menu_model_)
3488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return maybe_malicious_download_menu_model_.get();
3498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  maybe_malicious_download_menu_model_.reset(new ui::SimpleMenuModel(this));
3518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  maybe_malicious_download_menu_model_->AddItemWithStringId(
3538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      DISCARD, IDS_DOWNLOAD_MENU_DISCARD);
3548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  maybe_malicious_download_menu_model_->AddItemWithStringId(
3558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      KEEP, IDS_DOWNLOAD_MENU_KEEP);
3568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  maybe_malicious_download_menu_model_->AddSeparator(ui::NORMAL_SEPARATOR);
3578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  maybe_malicious_download_menu_model_->AddItemWithStringId(
3588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      LEARN_MORE_SCANNING, IDS_DOWNLOAD_MENU_LEARN_MORE_SCANNING);
3598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  return maybe_malicious_download_menu_model_.get();
3608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
3618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)ui::SimpleMenuModel*
3638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)DownloadShelfContextMenu::GetMaliciousMenuModel() {
364b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (malicious_download_menu_model_)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return malicious_download_menu_model_.get();
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  malicious_download_menu_model_.reset(new ui::SimpleMenuModel(this));
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  DownloadItemModel download_model(download_item_);
3708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (download_model.ShouldAllowDownloadFeedback()) {
3710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    malicious_download_menu_model_->AddItemWithStringId(
3720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        REPORT, IDS_DOWNLOAD_MENU_REPORT);
3738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  malicious_download_menu_model_->AddItemWithStringId(
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LEARN_MORE_SCANNING, IDS_DOWNLOAD_MENU_LEARN_MORE_SCANNING);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return malicious_download_menu_model_.get();
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
379