Chromium Code Reviews| Index: chrome/browser/profile_resetter/automatic_profile_resetter.cc |
| diff --git a/chrome/browser/profile_resetter/automatic_profile_resetter.cc b/chrome/browser/profile_resetter/automatic_profile_resetter.cc |
| index d5dcf39e41ca468078e2badd8aa4a6c806277971..370a72aa5f66a51966d3f8af2d7034c0c86ca6be 100644 |
| --- a/chrome/browser/profile_resetter/automatic_profile_resetter.cc |
| +++ b/chrome/browser/profile_resetter/automatic_profile_resetter.cc |
| @@ -107,18 +107,6 @@ COMPILE_ASSERT( |
| arraysize(kCombinedStatusMaskKeys) == kCombinedStatusMaskNumberOfBits, |
| combined_status_mask_bits_mismatch); |
| -// Enumeration of the possible outcomes of showing the profile reset prompt. |
| -enum PromptResult { |
| - // Prompt was not shown because only a dry-run was performed. |
| - PROMPT_NOT_SHOWN, |
| - PROMPT_ACTION_RESET, |
| - PROMPT_ACTION_NO_RESET, |
| - PROMPT_DISMISSED, |
| - // Prompt was still shown (not dismissed by the user) when Chrome was closed. |
| - PROMPT_IGNORED, |
| - PROMPT_RESULT_MAX |
| -}; |
| - |
| // Returns whether or not a dry-run shall be performed. |
| bool ShouldPerformDryRun() { |
| return StartsWithASCII( |
| @@ -191,6 +179,7 @@ AutomaticProfileResetter::AutomaticProfileResetter(Profile* profile) |
| state_(STATE_UNINITIALIZED), |
| enumeration_of_loaded_modules_ready_(false), |
| template_url_service_ready_(false), |
| + has_shown_bubble_(false), |
| memento_in_prefs_(profile_), |
| memento_in_local_state_(profile_), |
| memento_in_file_(profile_), |
| @@ -229,8 +218,7 @@ void AutomaticProfileResetter::Initialize() { |
| IDR_AUTOMATIC_PROFILE_RESET_HASH_SEED_DRY).as_string(); |
| } |
| - delegate_.reset(new AutomaticProfileResetterDelegateImpl( |
| - TemplateURLServiceFactory::GetForProfile(profile_))); |
| + delegate_.reset(new AutomaticProfileResetterDelegateImpl(profile_)); |
| task_runner_for_waiting_ = |
| content::BrowserThread::GetMessageLoopProxyForThread( |
| content::BrowserThread::UI); |
| @@ -258,6 +246,65 @@ void AutomaticProfileResetter::Activate() { |
| } |
| } |
| +void AutomaticProfileResetter::TriggerProfileReset(bool send_feedback) { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| + DCHECK(state_ == STATE_AWAITING_USER_CHOICE || state_ == STATE_DONE); |
| + |
| + if (state_ == STATE_AWAITING_USER_CHOICE) { |
| + state_ = STATE_PERFORMING_RESET; |
| + delegate_->TriggerProfileSettingsReset( |
| + send_feedback, |
| + base::Bind(&AutomaticProfileResetter::OnProfileSettingsResetCompleted, |
| + weak_ptr_factory_.GetWeakPtr())); |
| + } |
| +} |
| + |
| +void AutomaticProfileResetter::SkipProfileReset() { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| + DCHECK(state_ == STATE_AWAITING_USER_CHOICE || state_ == STATE_DONE); |
| + |
| + if (state_ == STATE_AWAITING_USER_CHOICE) { |
| + delegate_->DismissPrompt(); |
| + FinishResetPromptFlow(PROMPT_ACTION_NO_RESET); |
| + } |
| +} |
| + |
| +bool AutomaticProfileResetter::IsResetPromptActive() const { |
| + return state_ == STATE_AWAITING_USER_CHOICE; |
| +} |
| + |
| +void AutomaticProfileResetter::NotifyDidShowResetBubble() { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| + DCHECK(state_ == STATE_AWAITING_USER_CHOICE || state_ == STATE_DONE); |
| + |
| + if (state_ == STATE_AWAITING_USER_CHOICE) { |
|
Dan Beam
2013/11/07 00:01:18
nit: no curlies here or on L288-230
engedy
2013/11/08 02:56:40
Ahh, done.
|
| + has_shown_bubble_ = true; |
| + } |
| +} |
| + |
| +void AutomaticProfileResetter::NotifyDidOpenWebUIResetDialog() { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| + |
| + if (state_ == STATE_AWAITING_USER_CHOICE) { |
| + delegate_->DismissPrompt(); |
| + } |
| +} |
| + |
| +void AutomaticProfileResetter::NotifyDidCloseWebUIResetDialog( |
| + bool performed_reset) { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| + |
| + if (state_ == STATE_AWAITING_USER_CHOICE) { |
| + FinishResetPromptFlow(has_shown_bubble_ ? |
| + (performed_reset ? |
| + PROMPT_FOLLOWED_BY_WEBUI_RESET : |
| + PROMPT_FOLLOWED_BY_WEBUI_NO_RESET) : |
| + (performed_reset ? |
| + PROMPT_SUPPRESSED_BUT_HAD_WEBUI_RESET : |
| + PROMPT_SUPPRESSED_BUT_HAD_WEBUI_NO_RESET)); |
| + } |
| +} |
| + |
| void AutomaticProfileResetter::SetProgramForTesting( |
| const std::string& program) { |
| program_ = program; |
| @@ -323,7 +370,7 @@ void AutomaticProfileResetter::BeginEvaluationFlow() { |
| DCHECK_EQ(state_, STATE_READY); |
| DCHECK(!program_.empty()); |
| - state_ = STATE_WORKING; |
| + state_ = STATE_EVALUATING_CONDITIONS; |
| memento_in_file_.ReadValue( |
| base::Bind(&AutomaticProfileResetter::ContinueWithEvaluationFlow, |
| weak_ptr_factory_.GetWeakPtr())); |
| @@ -382,7 +429,7 @@ scoped_ptr<base::DictionaryValue> |
| void AutomaticProfileResetter::ContinueWithEvaluationFlow( |
| const std::string& memento_value_in_file) { |
| DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| - DCHECK_EQ(state_, STATE_WORKING); |
| + DCHECK_EQ(state_, STATE_EVALUATING_CONDITIONS); |
| PrefService* prefs = profile_->GetPrefs(); |
| DCHECK(prefs); |
| @@ -443,44 +490,85 @@ scoped_ptr<AutomaticProfileResetter::EvaluationResults> |
| return results.Pass(); |
| } |
| +void AutomaticProfileResetter::ReportStatistics(uint32 satisfied_criteria_mask, |
| + uint32 combined_status_mask) { |
| + UMA_HISTOGRAM_ENUMERATION("AutomaticProfileReset.SatisfiedCriteriaMask", |
| + satisfied_criteria_mask, |
| + kSatisfiedCriteriaMaskMaximumValue); |
| + UMA_HISTOGRAM_ENUMERATION("AutomaticProfileReset.CombinedStatusMask", |
| + combined_status_mask, |
| + kCombinedStatusMaskMaximumValue); |
| +} |
| + |
| void AutomaticProfileResetter::FinishEvaluationFlow( |
| scoped_ptr<EvaluationResults> results) { |
| DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| - DCHECK_EQ(state_, STATE_WORKING); |
| + DCHECK_EQ(state_, STATE_EVALUATING_CONDITIONS); |
| - ReportStatistics(results->satisfied_criteria_mask, |
| - results->combined_status_mask); |
| + evaluation_results_ = results.Pass(); |
| - if (results->satisfied_criteria_mask != 0 && !results->had_prompted_already) { |
| - memento_in_prefs_.StoreValue(results->memento_value_in_prefs); |
| - memento_in_local_state_.StoreValue(results->memento_value_in_local_state); |
| - memento_in_file_.StoreValue(results->memento_value_in_file); |
| + ReportStatistics(evaluation_results_->satisfied_criteria_mask, |
| + evaluation_results_->combined_status_mask); |
| - if (ShouldPerformLiveRun()) { |
| - delegate_->ShowPrompt(); |
| - } else { |
| - UMA_HISTOGRAM_ENUMERATION("AutomaticProfileReset.PromptResult", |
| - PROMPT_NOT_SHOWN, |
| - PROMPT_RESULT_MAX); |
| - } |
| + if (evaluation_results_->satisfied_criteria_mask != 0 && |
| + !evaluation_results_->had_prompted_already) { |
| + BeginResetPromptFlow(); |
| + } else { |
| + state_ = STATE_DONE; |
| } |
| +} |
| - state_ = STATE_DONE; |
| +void AutomaticProfileResetter::BeginResetPromptFlow() { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| + DCHECK_EQ(state_, STATE_EVALUATING_CONDITIONS); |
| + |
| + state_ = STATE_AWAITING_USER_CHOICE; |
| + |
| + if (ShouldPerformLiveRun()) { |
| + delegate_->ShowPrompt(); |
| + // Start fetching brandcode config in the background speculatively. |
| + delegate_->FetchBrandcodedDefaultSettingsIfNeeded(); |
| + } else { |
| + FinishResetPromptFlow(PROMPT_NOT_SHOWN); |
| + } |
| } |
| -void AutomaticProfileResetter::ReportStatistics(uint32 satisfied_criteria_mask, |
| - uint32 combined_status_mask) { |
| - UMA_HISTOGRAM_ENUMERATION("AutomaticProfileReset.SatisfiedCriteriaMask", |
| - satisfied_criteria_mask, |
| - kSatisfiedCriteriaMaskMaximumValue); |
| - UMA_HISTOGRAM_ENUMERATION("AutomaticProfileReset.CombinedStatusMask", |
| - combined_status_mask, |
| - kCombinedStatusMaskMaximumValue); |
| +void AutomaticProfileResetter::OnProfileSettingsResetCompleted() { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| + DCHECK_EQ(state_, STATE_PERFORMING_RESET); |
| + |
| + delegate_->DismissPrompt(); |
| + FinishResetPromptFlow(PROMPT_ACTION_RESET); |
| +} |
| + |
| +void AutomaticProfileResetter::ReportPromptResult(PromptResult result) { |
| + UMA_HISTOGRAM_ENUMERATION( |
| + "AutomaticProfileReset.PromptResult", result, PROMPT_RESULT_MAX); |
| +} |
| + |
| +void AutomaticProfileResetter::FinishResetPromptFlow(PromptResult result) { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| + DCHECK(state_ == STATE_PERFORMING_RESET || |
| + state_ == STATE_AWAITING_USER_CHOICE); |
| + |
| + memento_in_prefs_.StoreValue(evaluation_results_->memento_value_in_prefs); |
| + memento_in_local_state_.StoreValue( |
| + evaluation_results_->memento_value_in_local_state); |
| + memento_in_file_.StoreValue(evaluation_results_->memento_value_in_file); |
| + |
| + ReportPromptResult(result); |
| + |
| + state_ = STATE_DONE; |
| } |
| void AutomaticProfileResetter::Shutdown() { |
| DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| + // Conclude the flow in case the bubble was shown, so as to prevent showing |
| + // the prompt on next start-up. |
| + if (state_ == STATE_AWAITING_USER_CHOICE && has_shown_bubble_) |
| + FinishResetPromptFlow(PROMPT_IGNORED); |
| + |
| state_ = STATE_DISABLED; |
| delegate_.reset(); |
| weak_ptr_factory_.InvalidateWeakPtrs(); |