1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/safe_browsing/srt_global_error_win.h"
6
7#include "base/callback.h"
8#include "base/metrics/histogram.h"
9#include "chrome/app/chrome_command_ids.h"
10#include "chrome/browser/ui/browser.h"
11#include "chrome/browser/ui/global_error/global_error_service.h"
12#include "grit/chromium_strings.h"
13#include "grit/generated_resources.h"
14#include "grit/google_chrome_strings.h"
15#include "ui/base/l10n/l10n_util.h"
16
17namespace {
18// The download link of the Software Removal Tool.
19// TODO(mad): Should we only have the bubble show up on official Chrome build?
20const char kSRTDownloadURL[] = "https://www.google.com/chrome/srt/";
21
22// Enum values for the SRTPrompt histogram. Don't change order, always add
23// to the end, before SRT_PROMPT_MAX, of course.
24enum SRTPromptHistogramValue {
25  SRT_PROMPT_SHOWN = 0,
26  SRT_PROMPT_ACCEPTED = 1,
27  SRT_PROMPT_DENIED = 2,
28
29  SRT_PROMPT_MAX,
30};
31
32void RecordSRTPromptHistogram(SRTPromptHistogramValue value) {
33  UMA_HISTOGRAM_ENUMERATION(
34      "SoftwareReporter.PromptUsage", value, SRT_PROMPT_MAX);
35}
36
37}  // namespace
38
39// SRTGlobalError ------------------------------------------------------------
40
41SRTGlobalError::SRTGlobalError(GlobalErrorService* global_error_service)
42    : global_error_service_(global_error_service) {
43  DCHECK(global_error_service_);
44}
45
46SRTGlobalError::~SRTGlobalError() {
47}
48
49bool SRTGlobalError::HasMenuItem() {
50  return true;
51}
52
53int SRTGlobalError::MenuItemCommandID() {
54  return IDC_SHOW_SRT_BUBBLE;
55}
56
57base::string16 SRTGlobalError::MenuItemLabel() {
58  return l10n_util::GetStringUTF16(IDS_SRT_MENU_ITEM);
59}
60
61void SRTGlobalError::ExecuteMenuItem(Browser* browser) {
62  // The menu item should never get executed while the bubble is shown, unless
63  // we eventually change it to NOT close on deactivate.
64  DCHECK(ShouldCloseOnDeactivate());
65  DCHECK(GetBubbleView() == NULL);
66  ShowBubbleView(browser);
67}
68
69void SRTGlobalError::ShowBubbleView(Browser* browser) {
70  RecordSRTPromptHistogram(SRT_PROMPT_SHOWN);
71  GlobalErrorWithStandardBubble::ShowBubbleView(browser);
72}
73
74base::string16 SRTGlobalError::GetBubbleViewTitle() {
75  return l10n_util::GetStringUTF16(IDS_SRT_BUBBLE_TITLE);
76}
77
78std::vector<base::string16> SRTGlobalError::GetBubbleViewMessages() {
79  std::vector<base::string16> messages;
80  messages.push_back(l10n_util::GetStringUTF16(IDS_SRT_BUBBLE_TEXT));
81  return messages;
82}
83
84base::string16 SRTGlobalError::GetBubbleViewAcceptButtonLabel() {
85  return l10n_util::GetStringUTF16(IDS_SRT_BUBBLE_DOWNLOAD_BUTTON_TEXT);
86}
87
88base::string16 SRTGlobalError::GetBubbleViewCancelButtonLabel() {
89  return l10n_util::GetStringUTF16(IDS_NO_THANKS);
90}
91
92void SRTGlobalError::OnBubbleViewDidClose(Browser* browser) {
93}
94
95void SRTGlobalError::BubbleViewAcceptButtonPressed(Browser* browser) {
96  RecordSRTPromptHistogram(SRT_PROMPT_ACCEPTED);
97  browser->OpenURL(content::OpenURLParams(GURL(kSRTDownloadURL),
98                                          content::Referrer(),
99                                          NEW_FOREGROUND_TAB,
100                                          ui::PAGE_TRANSITION_LINK,
101                                          false));
102  DismissGlobalError();
103}
104
105void SRTGlobalError::BubbleViewCancelButtonPressed(Browser* browser) {
106  RecordSRTPromptHistogram(SRT_PROMPT_DENIED);
107  DismissGlobalError();
108}
109
110bool SRTGlobalError::ShouldCloseOnDeactivate() const {
111  return false;
112}
113
114void SRTGlobalError::DismissGlobalError() {
115  global_error_service_->RemoveGlobalError(this);
116  delete this;
117}
118