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