1// Copyright 2013 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/profile_resetter/profile_reset_global_error.h" 6 7#include "base/metrics/histogram.h" 8#include "chrome/app/chrome_command_ids.h" 9#include "chrome/browser/profile_resetter/automatic_profile_resetter.h" 10#include "chrome/browser/profile_resetter/automatic_profile_resetter_factory.h" 11#include "chrome/browser/profiles/profile.h" 12#include "chrome/browser/ui/browser.h" 13#include "chrome/browser/ui/chrome_pages.h" 14#include "chrome/browser/ui/global_error/global_error_service.h" 15#include "chrome/browser/ui/global_error/global_error_service_factory.h" 16#include "chrome/browser/ui/profile_reset_bubble.h" 17#include "chrome/common/url_constants.h" 18#include "grit/chromium_strings.h" 19#include "grit/generated_resources.h" 20#include "ui/base/l10n/l10n_util.h" 21 22namespace { 23 24base::TimeDelta GetPromptDelayHistogramMaximum() { 25 return base::TimeDelta::FromDays(7); 26} 27 28// Records the delay between when the reset prompt is triggered and when the 29// bubble can actually be shown. 30void RecordPromptDelay(const base::TimeDelta& delay) { 31 UMA_HISTOGRAM_CUSTOM_TIMES( 32 "AutomaticProfileReset.PromptDelay", delay, 33 base::TimeDelta::FromSeconds(1), GetPromptDelayHistogramMaximum(), 50); 34} 35 36} // namespace 37 38 39// ProfileResetGlobalError --------------------------------------------------- 40 41ProfileResetGlobalError::ProfileResetGlobalError(Profile* profile) 42 : profile_(profile), has_shown_bubble_view_(false), bubble_view_(NULL) { 43 AutomaticProfileResetter* automatic_profile_resetter = 44 AutomaticProfileResetterFactory::GetForBrowserContext(profile_); 45 if (automatic_profile_resetter) 46 automatic_profile_resetter_ = automatic_profile_resetter->AsWeakPtr(); 47} 48 49ProfileResetGlobalError::~ProfileResetGlobalError() { 50 if (!has_shown_bubble_view_) 51 RecordPromptDelay(GetPromptDelayHistogramMaximum()); 52} 53 54// static 55bool ProfileResetGlobalError::IsSupportedOnPlatform() { 56 return IsProfileResetBubbleSupported(); 57} 58 59bool ProfileResetGlobalError::HasMenuItem() { return true; } 60 61int ProfileResetGlobalError::MenuItemCommandID() { 62 return IDC_SHOW_SETTINGS_RESET_BUBBLE; 63} 64 65base::string16 ProfileResetGlobalError::MenuItemLabel() { 66 return l10n_util::GetStringFUTF16( 67 IDS_RESET_SETTINGS_MENU_ITEM, 68 l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_NAME)); 69} 70 71void ProfileResetGlobalError::ExecuteMenuItem(Browser* browser) { 72 chrome::ShowSettingsSubPage(browser, chrome::kResetProfileSettingsSubPage); 73} 74 75bool ProfileResetGlobalError::HasBubbleView() { return true; } 76 77bool ProfileResetGlobalError::HasShownBubbleView() { 78 return has_shown_bubble_view_; 79} 80 81void ProfileResetGlobalError::ShowBubbleView(Browser* browser) { 82 if (has_shown_bubble_view_) 83 return; 84 85 has_shown_bubble_view_ = true; 86 bubble_view_ = ShowProfileResetBubble(AsWeakPtr(), browser); 87 88 if (automatic_profile_resetter_) 89 automatic_profile_resetter_->NotifyDidShowResetBubble(); 90 RecordPromptDelay(timer_.Elapsed()); 91} 92 93void ProfileResetGlobalError::OnBubbleViewDidClose() { 94 bubble_view_ = NULL; 95} 96 97void ProfileResetGlobalError::OnBubbleViewResetButtonPressed( 98 bool send_feedback) { 99 if (automatic_profile_resetter_) 100 automatic_profile_resetter_->TriggerProfileReset(send_feedback); 101} 102 103void ProfileResetGlobalError::OnBubbleViewNoThanksButtonPressed() { 104 if (automatic_profile_resetter_) 105 automatic_profile_resetter_->SkipProfileReset(); 106} 107 108GlobalErrorBubbleViewBase* ProfileResetGlobalError::GetBubbleView() { 109 return bubble_view_; 110} 111