blob: 6cb748e6f6d13c327f0580641f59721c37a7cfb7 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/download/download_shelf_context_menu.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/download/download_item_model.h"
#include "chrome/browser/download/download_prefs.h"
#include "chrome/browser/safe_browsing/download_protection_service.h"
#include "chrome/browser/safe_browsing/safe_browsing_service.h"
#include "chrome/common/extensions/extension.h"
#include "content/public/browser/download_item.h"
#include "content/public/browser/download_manager.h"
#include "grit/generated_resources.h"
#include "ui/base/l10n/l10n_util.h"
using content::DownloadItem;
DownloadShelfContextMenu::~DownloadShelfContextMenu() {}
DownloadShelfContextMenu::DownloadShelfContextMenu(
BaseDownloadItemModel* download_model)
: download_model_(download_model),
download_item_(download_model->download()) {
}
ui::SimpleMenuModel* DownloadShelfContextMenu::GetMenuModel() {
ui::SimpleMenuModel* model = NULL;
// We shouldn't be opening a context menu for a dangerous download, unless it
// is a malicious download.
DCHECK(!download_model_->IsDangerous() || download_model_->IsMalicious());
if (download_model_->IsMalicious())
model = GetMaliciousMenuModel();
else if (download_item_->IsComplete())
model = GetFinishedMenuModel();
else
model = GetInProgressMenuModel();
return model;
}
bool DownloadShelfContextMenu::IsCommandIdEnabled(int command_id) const {
switch (command_id) {
case SHOW_IN_FOLDER:
case OPEN_WHEN_COMPLETE:
// Don't enable "Open when complete" if the download is no longer
// available or if it is temporary. We explicitly ignore "Open when
// complete" for temporary downloads.
return download_item_->CanShowInFolder() &&
!download_item_->IsTemporary();
case ALWAYS_OPEN_TYPE:
// For temporary downloads, the target filename might be a temporary
// filename. Don't base an "Always open" decision based on it. Also
// exclude extensions.
return download_item_->CanOpenDownload() &&
!Extension::IsExtension(download_item_->GetTargetName()) &&
!download_item_->IsTemporary();
case CANCEL:
return download_item_->IsPartialDownload();
case TOGGLE_PAUSE:
return download_item_->IsInProgress();
default:
return command_id > 0 && command_id < MENU_LAST;
}
}
bool DownloadShelfContextMenu::IsCommandIdChecked(int command_id) const {
switch (command_id) {
case OPEN_WHEN_COMPLETE:
return download_item_->GetOpenWhenComplete();
case ALWAYS_OPEN_TYPE:
return download_item_->ShouldOpenFileBasedOnExtension();
case TOGGLE_PAUSE:
return download_item_->IsPaused();
}
return false;
}
void DownloadShelfContextMenu::ExecuteCommand(int command_id) {
switch (command_id) {
case SHOW_IN_FOLDER:
download_item_->ShowDownloadInShell();
break;
case OPEN_WHEN_COMPLETE:
download_item_->OpenDownload();
break;
case ALWAYS_OPEN_TYPE: {
DownloadPrefs* prefs = DownloadPrefs::FromBrowserContext(
download_item_->GetBrowserContext());
FilePath path = download_item_->GetUserVerifiedFilePath();
if (!IsCommandIdChecked(ALWAYS_OPEN_TYPE))
prefs->EnableAutoOpenBasedOnExtension(path);
else
prefs->DisableAutoOpenBasedOnExtension(path);
break;
}
case CANCEL:
download_model_->CancelTask();
break;
case TOGGLE_PAUSE:
// It is possible for the download to complete before the user clicks the
// menu item, recheck if the download is in progress state before toggling
// pause.
if (download_item_->IsPartialDownload())
download_item_->TogglePause();
break;
case DISCARD:
download_item_->Delete(DownloadItem::DELETE_DUE_TO_USER_DISCARD);
break;
case KEEP:
download_item_->DangerousDownloadValidated();
break;
case LEARN_MORE: {
#if defined(ENABLE_SAFE_BROWSING)
using safe_browsing::DownloadProtectionService;
SafeBrowsingService* sb_service =
g_browser_process->safe_browsing_service();
DownloadProtectionService* protection_service =
(sb_service ? sb_service->download_protection_service() : NULL);
if (protection_service) {
protection_service->ShowDetailsForDownload(
DownloadProtectionService::DownloadInfo::FromDownloadItem(
*download_item_));
}
#else
// Should only be getting invoked if we are using safe browsing.
NOTREACHED();
#endif
break;
}
default:
NOTREACHED();
}
}
bool DownloadShelfContextMenu::GetAcceleratorForCommandId(
int command_id, ui::Accelerator* accelerator) {
return false;
}
bool DownloadShelfContextMenu::IsItemForCommandIdDynamic(int command_id) const {
return command_id == TOGGLE_PAUSE;
}
string16 DownloadShelfContextMenu::GetLabelForCommandId(int command_id) const {
switch (command_id) {
case SHOW_IN_FOLDER:
return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_SHOW);
case OPEN_WHEN_COMPLETE:
if (download_item_->IsInProgress())
return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_OPEN_WHEN_COMPLETE);
return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_OPEN);
case ALWAYS_OPEN_TYPE:
return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_ALWAYS_OPEN_TYPE);
case CANCEL:
return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_CANCEL);
case TOGGLE_PAUSE: {
if (download_item_->IsPaused())
return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_RESUME_ITEM);
return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_PAUSE_ITEM);
}
case DISCARD:
return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_DISCARD);
case KEEP:
return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_KEEP);
case LEARN_MORE:
return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_LEARN_MORE);
default:
NOTREACHED();
break;
}
return string16();
}
ui::SimpleMenuModel* DownloadShelfContextMenu::GetInProgressMenuModel() {
if (in_progress_download_menu_model_.get())
return in_progress_download_menu_model_.get();
in_progress_download_menu_model_.reset(new ui::SimpleMenuModel(this));
in_progress_download_menu_model_->AddCheckItemWithStringId(
OPEN_WHEN_COMPLETE, IDS_DOWNLOAD_MENU_OPEN_WHEN_COMPLETE);
in_progress_download_menu_model_->AddCheckItemWithStringId(
ALWAYS_OPEN_TYPE, IDS_DOWNLOAD_MENU_ALWAYS_OPEN_TYPE);
in_progress_download_menu_model_->AddSeparator();
in_progress_download_menu_model_->AddItemWithStringId(
TOGGLE_PAUSE, IDS_DOWNLOAD_MENU_PAUSE_ITEM);
in_progress_download_menu_model_->AddItemWithStringId(
SHOW_IN_FOLDER, IDS_DOWNLOAD_MENU_SHOW);
in_progress_download_menu_model_->AddSeparator();
in_progress_download_menu_model_->AddItemWithStringId(
CANCEL, IDS_DOWNLOAD_MENU_CANCEL);
return in_progress_download_menu_model_.get();
}
ui::SimpleMenuModel* DownloadShelfContextMenu::GetFinishedMenuModel() {
if (finished_download_menu_model_.get())
return finished_download_menu_model_.get();
finished_download_menu_model_.reset(new ui::SimpleMenuModel(this));
finished_download_menu_model_->AddItemWithStringId(
OPEN_WHEN_COMPLETE, IDS_DOWNLOAD_MENU_OPEN);
finished_download_menu_model_->AddCheckItemWithStringId(
ALWAYS_OPEN_TYPE, IDS_DOWNLOAD_MENU_ALWAYS_OPEN_TYPE);
finished_download_menu_model_->AddSeparator();
finished_download_menu_model_->AddItemWithStringId(
SHOW_IN_FOLDER, IDS_DOWNLOAD_MENU_SHOW);
finished_download_menu_model_->AddSeparator();
finished_download_menu_model_->AddItemWithStringId(
CANCEL, IDS_DOWNLOAD_MENU_CANCEL);
return finished_download_menu_model_.get();
}
ui::SimpleMenuModel* DownloadShelfContextMenu::GetMaliciousMenuModel() {
if (malicious_download_menu_model_.get())
return malicious_download_menu_model_.get();
malicious_download_menu_model_.reset(new ui::SimpleMenuModel(this));
malicious_download_menu_model_->AddItemWithStringId(
DISCARD, IDS_DOWNLOAD_MENU_DISCARD);
malicious_download_menu_model_->AddItemWithStringId(
KEEP, IDS_DOWNLOAD_MENU_KEEP);
malicious_download_menu_model_->AddSeparator();
malicious_download_menu_model_->AddItemWithStringId(
LEARN_MORE, IDS_DOWNLOAD_MENU_LEARN_MORE);
return malicious_download_menu_model_.get();
}