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_danger_prompt.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
81e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
9558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/chrome_download_manager_delegate.h"
110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/download/download_stats.h"
1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/browser/extensions/api/experience_sampling_private/experience_sampling.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tab_modal_confirm_dialog.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tab_modal_confirm_dialog_delegate.h"
1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/chromium_strings.h"
1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/generated_resources.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_danger_type.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_item.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using extensions::ExperienceSamplingEvent;
2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// TODO(wittman): Create a native web contents modal dialog implementation of
261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// this dialog for non-Views platforms, to support bold formatting of the
271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// message lead.
281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Implements DownloadDangerPrompt using a TabModalConfirmDialog.
303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class DownloadDangerPromptImpl : public DownloadDangerPrompt,
313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                 public content::DownloadItem::Observer,
323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                 public TabModalConfirmDialogDelegate {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadDangerPromptImpl(content::DownloadItem* item,
35fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch                           content::WebContents* web_contents,
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           bool show_context,
37558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                           const OnDone& done);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~DownloadDangerPromptImpl();
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // DownloadDangerPrompt:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void InvokeActionForTesting(Action action) OVERRIDE;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // content::DownloadItem::Observer:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDownloadUpdated(content::DownloadItem* download) OVERRIDE;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // TabModalConfirmDialogDelegate:
48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual base::string16 GetTitle() OVERRIDE;
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual base::string16 GetDialogMessage() OVERRIDE;
50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual base::string16 GetAcceptButtonTitle() OVERRIDE;
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual base::string16 GetCancelButtonTitle() OVERRIDE;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnAccepted() OVERRIDE;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnCanceled() OVERRIDE;
54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void OnClosed() OVERRIDE;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  void RunDone(Action action);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::DownloadItem* download_;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool show_context_;
60558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  OnDone done_;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_ptr<ExperienceSamplingEvent> sampling_event_;
6303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DownloadDangerPromptImpl);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DownloadDangerPromptImpl::DownloadDangerPromptImpl(
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::DownloadItem* download,
69fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    content::WebContents* web_contents,
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool show_context,
71558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    const OnDone& done)
72fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    : TabModalConfirmDialogDelegate(web_contents),
73fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      download_(download),
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      show_context_(show_context),
75558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      done_(done) {
76558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  DCHECK(!done_.is_null());
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  download_->AddObserver(this);
780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  RecordOpenedDangerousConfirmDialog(download_->GetDangerType());
7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // ExperienceSampling: A malicious download warning is being shown to the
8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // user, so we start a new SamplingEvent and track it.
8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  sampling_event_.reset(new ExperienceSamplingEvent(
8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      ExperienceSamplingEvent::kDownloadDangerPrompt,
8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      download->GetURL(),
8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      download->GetReferrerUrl(),
8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      download->GetBrowserContext()));
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DownloadDangerPromptImpl::~DownloadDangerPromptImpl() {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |this| might be deleted without invoking any callbacks. E.g. pressing Esc
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // on GTK or if the user navigates away from the page showing the prompt.
92558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  RunDone(DISMISS);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DownloadDangerPromptImpl::InvokeActionForTesting(Action action) {
96558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  switch (action) {
97558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    case ACCEPT: Accept(); break;
98558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    case CANCEL: Cancel(); break;
99558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    case DISMISS:
100558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      RunDone(DISMISS);
101558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      Cancel();
102558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      break;
103558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DownloadDangerPromptImpl::OnDownloadUpdated(
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::DownloadItem* download) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the download is nolonger dangerous (accepted externally) or the download
109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // is in a terminal state, then the download danger prompt is no longer
110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // necessary.
111558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (!download->IsDangerous() || download->IsDone()) {
112558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    RunDone(DISMISS);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Cancel();
114558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 DownloadDangerPromptImpl::GetTitle() {
1188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (show_context_)
1198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return l10n_util::GetStringUTF16(IDS_CONFIRM_KEEP_DANGEROUS_DOWNLOAD_TITLE);
1201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  switch (download_->GetDangerType()) {
1211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL:
1221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT:
1231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case content::DOWNLOAD_DANGER_TYPE_DANGEROUS_HOST:
1241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case content::DOWNLOAD_DANGER_TYPE_POTENTIALLY_UNWANTED: {
1251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      return l10n_util::GetStringUTF16(
1261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          IDS_RESTORE_KEEP_DANGEROUS_DOWNLOAD_TITLE);
1271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    default: {
1291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      return l10n_util::GetStringUTF16(
1301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          IDS_CONFIRM_KEEP_DANGEROUS_DOWNLOAD_TITLE);
1311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
1321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 DownloadDangerPromptImpl::GetDialogMessage() {
1368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (show_context_) {
1378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    switch (download_->GetDangerType()) {
1388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      case content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE: {
1398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        return l10n_util::GetStringFUTF16(
1408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            IDS_PROMPT_DANGEROUS_DOWNLOAD,
1418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            download_->GetFileNameToReportUser().LossyDisplayName());
1428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      }
1438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      case content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL: // Fall through
1448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      case content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT:
1458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      case content::DOWNLOAD_DANGER_TYPE_DANGEROUS_HOST: {
146ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        return l10n_util::GetStringFUTF16(
147ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            IDS_PROMPT_MALICIOUS_DOWNLOAD_CONTENT,
148ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            download_->GetFileNameToReportUser().LossyDisplayName());
149ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      }
1508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      case content::DOWNLOAD_DANGER_TYPE_UNCOMMON_CONTENT: {
1518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        return l10n_util::GetStringFUTF16(
1528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            IDS_PROMPT_UNCOMMON_DOWNLOAD_CONTENT,
1538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            download_->GetFileNameToReportUser().LossyDisplayName());
1548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      }
1558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      case content::DOWNLOAD_DANGER_TYPE_POTENTIALLY_UNWANTED: {
1568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        return l10n_util::GetStringFUTF16(
1571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            IDS_PROMPT_DOWNLOAD_CHANGES_SETTINGS,
1588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            download_->GetFileNameToReportUser().LossyDisplayName());
1598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      }
1608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      case content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS:
1618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      case content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT:
1628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      case content::DOWNLOAD_DANGER_TYPE_USER_VALIDATED:
1638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      case content::DOWNLOAD_DANGER_TYPE_MAX: {
1648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        break;
1658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      }
166ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    }
1678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  } else {
1688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    switch (download_->GetDangerType()) {
1698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      case content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL:
1708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      case content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT:
1718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      case content::DOWNLOAD_DANGER_TYPE_DANGEROUS_HOST: {
1728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        return l10n_util::GetStringUTF16(
1731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            IDS_PROMPT_CONFIRM_KEEP_MALICIOUS_DOWNLOAD_LEAD) +
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            base::ASCIIToUTF16("\n\n") +
1751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            l10n_util::GetStringUTF16(
1761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                IDS_PROMPT_CONFIRM_KEEP_MALICIOUS_DOWNLOAD_BODY);
1778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      }
1788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      default: {
1798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        return l10n_util::GetStringUTF16(
1808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            IDS_PROMPT_CONFIRM_KEEP_DANGEROUS_DOWNLOAD);
1818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      }
182ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    }
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
184a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  NOTREACHED();
185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return base::string16();
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 DownloadDangerPromptImpl::GetAcceptButtonTitle() {
1898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (show_context_)
1908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return l10n_util::GetStringUTF16(IDS_CONFIRM_DOWNLOAD);
1918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  switch (download_->GetDangerType()) {
1928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    case content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL:
1938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    case content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT:
1941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case content::DOWNLOAD_DANGER_TYPE_DANGEROUS_HOST:
1951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case content::DOWNLOAD_DANGER_TYPE_POTENTIALLY_UNWANTED: {
1968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      return l10n_util::GetStringUTF16(IDS_CONFIRM_DOWNLOAD_AGAIN_MALICIOUS);
1978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    }
1988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    default:
1998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      return l10n_util::GetStringUTF16(IDS_CONFIRM_DOWNLOAD_AGAIN);
2008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
2028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 DownloadDangerPromptImpl::GetCancelButtonTitle() {
2048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (show_context_)
2058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return l10n_util::GetStringUTF16(IDS_CANCEL);
2068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  switch (download_->GetDangerType()) {
2078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    case content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL:
2088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    case content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT:
2091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case content::DOWNLOAD_DANGER_TYPE_DANGEROUS_HOST:
2101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case content::DOWNLOAD_DANGER_TYPE_POTENTIALLY_UNWANTED: {
2118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      return l10n_util::GetStringUTF16(IDS_CONFIRM_CANCEL_AGAIN_MALICIOUS);
2128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    }
2138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    default:
2148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      return l10n_util::GetStringUTF16(IDS_CANCEL);
2158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DownloadDangerPromptImpl::OnAccepted() {
21903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // ExperienceSampling: User proceeded through the warning.
22003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  sampling_event_->CreateUserDecisionEvent(ExperienceSamplingEvent::kProceed);
221558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  RunDone(ACCEPT);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DownloadDangerPromptImpl::OnCanceled() {
22503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // ExperienceSampling: User canceled the warning.
22603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  sampling_event_->CreateUserDecisionEvent(ExperienceSamplingEvent::kDeny);
227558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  RunDone(CANCEL);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
230a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void DownloadDangerPromptImpl::OnClosed() {
23103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // ExperienceSampling: User canceled the warning.
23203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  sampling_event_->CreateUserDecisionEvent(ExperienceSamplingEvent::kDeny);
2333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  RunDone(DISMISS);
234a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
235a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
236558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid DownloadDangerPromptImpl::RunDone(Action action) {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invoking the callback can cause the download item state to change or cause
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the constrained window to close, and |callback| refers to a member
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // variable.
240558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  OnDone done = done_;
241558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  done_.Reset();
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (download_ != NULL) {
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    download_->RemoveObserver(this);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    download_ = NULL;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
246558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (!done.is_null())
247558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    done.Run(action);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
252a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if !defined(USE_AURA)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DownloadDangerPrompt* DownloadDangerPrompt::Create(
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::DownloadItem* item,
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::WebContents* web_contents,
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool show_context,
258558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    const OnDone& done) {
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadDangerPromptImpl* prompt = new DownloadDangerPromptImpl(
260fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      item, web_contents, show_context, done);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |prompt| will be deleted when the dialog is done.
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TabModalConfirmDialog::Create(prompt, web_contents);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return prompt;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
266