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