Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(134)

Side by Side Diff: chrome/browser/profile_resetter/automatic_profile_resetter.cc

Issue 62193002: Integrate UI and reset logic into AutomaticProfileResetter. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix Win compile error introduce by rebase. Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/profile_resetter/automatic_profile_resetter.h" 5 #include "chrome/browser/profile_resetter/automatic_profile_resetter.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/ref_counted.h" 10 #include "base/memory/ref_counted.h"
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 const uint32 kCombinedStatusMaskMaximumValue = 84 const uint32 kCombinedStatusMaskMaximumValue =
85 (1u << kCombinedStatusMaskNumberOfBits); 85 (1u << kCombinedStatusMaskNumberOfBits);
86 86
87 COMPILE_ASSERT( 87 COMPILE_ASSERT(
88 arraysize(kSatisfiedCriteriaMaskKeys) == kSatisfiedCriteriaMaskNumberOfBits, 88 arraysize(kSatisfiedCriteriaMaskKeys) == kSatisfiedCriteriaMaskNumberOfBits,
89 satisfied_criteria_mask_bits_mismatch); 89 satisfied_criteria_mask_bits_mismatch);
90 COMPILE_ASSERT( 90 COMPILE_ASSERT(
91 arraysize(kCombinedStatusMaskKeys) == kCombinedStatusMaskNumberOfBits, 91 arraysize(kCombinedStatusMaskKeys) == kCombinedStatusMaskNumberOfBits,
92 combined_status_mask_bits_mismatch); 92 combined_status_mask_bits_mismatch);
93 93
94 // Enumeration of the possible outcomes of showing the profile reset prompt.
95 enum PromptResult {
96 // Prompt was not shown because only a dry-run was performed.
97 PROMPT_NOT_SHOWN,
98 PROMPT_ACTION_RESET,
99 PROMPT_ACTION_NO_RESET,
100 PROMPT_DISMISSED,
101 // Prompt was still shown (not dismissed by the user) when Chrome was closed.
102 PROMPT_IGNORED,
103 PROMPT_RESULT_MAX
104 };
105
106 // Returns whether or not a dry-run shall be performed. 94 // Returns whether or not a dry-run shall be performed.
107 bool ShouldPerformDryRun() { 95 bool ShouldPerformDryRun() {
108 return StartsWithASCII( 96 return StartsWithASCII(
109 base::FieldTrialList::FindFullName(kAutomaticProfileResetStudyName), 97 base::FieldTrialList::FindFullName(kAutomaticProfileResetStudyName),
110 kAutomaticProfileResetStudyDryRunGroupName, true); 98 kAutomaticProfileResetStudyDryRunGroupName, true);
111 } 99 }
112 100
113 // Returns whether or not a live-run shall be performed. 101 // Returns whether or not a live-run shall be performed.
114 bool ShouldPerformLiveRun() { 102 bool ShouldPerformLiveRun() {
115 return StartsWithASCII( 103 return StartsWithASCII(
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
385 }; 373 };
386 374
387 375
388 // AutomaticProfileResetter -------------------------------------------------- 376 // AutomaticProfileResetter --------------------------------------------------
389 377
390 AutomaticProfileResetter::AutomaticProfileResetter(Profile* profile) 378 AutomaticProfileResetter::AutomaticProfileResetter(Profile* profile)
391 : profile_(profile), 379 : profile_(profile),
392 state_(STATE_UNINITIALIZED), 380 state_(STATE_UNINITIALIZED),
393 enumeration_of_loaded_modules_ready_(false), 381 enumeration_of_loaded_modules_ready_(false),
394 template_url_service_ready_(false), 382 template_url_service_ready_(false),
383 has_already_dismissed_prompt_(false),
395 weak_ptr_factory_(this) { 384 weak_ptr_factory_(this) {
396 DCHECK(profile_); 385 DCHECK(profile_);
397 } 386 }
398 387
399 AutomaticProfileResetter::~AutomaticProfileResetter() {} 388 AutomaticProfileResetter::~AutomaticProfileResetter() {}
400 389
401 void AutomaticProfileResetter::Initialize() { 390 void AutomaticProfileResetter::Initialize() {
402 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 391 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
403 DCHECK_EQ(state_, STATE_UNINITIALIZED); 392 DCHECK_EQ(state_, STATE_UNINITIALIZED);
404 393
(...skipping 11 matching lines...) Expand all
416 IDR_AUTOMATIC_PROFILE_RESET_HASH_SEED).as_string(); 405 IDR_AUTOMATIC_PROFILE_RESET_HASH_SEED).as_string();
417 } else { // ShouldPerformDryRun() 406 } else { // ShouldPerformDryRun()
418 program_ = resources.GetRawDataResource( 407 program_ = resources.GetRawDataResource(
419 IDR_AUTOMATIC_PROFILE_RESET_RULES_DRY).as_string(); 408 IDR_AUTOMATIC_PROFILE_RESET_RULES_DRY).as_string();
420 hash_seed_ = resources.GetRawDataResource( 409 hash_seed_ = resources.GetRawDataResource(
421 IDR_AUTOMATIC_PROFILE_RESET_HASH_SEED_DRY).as_string(); 410 IDR_AUTOMATIC_PROFILE_RESET_HASH_SEED_DRY).as_string();
422 } 411 }
423 } 412 }
424 413
425 delegate_.reset(new AutomaticProfileResetterDelegateImpl( 414 delegate_.reset(new AutomaticProfileResetterDelegateImpl(
426 TemplateURLServiceFactory::GetForProfile(profile_))); 415 profile_, ProfileResetter::ALL));
427 task_runner_for_waiting_ = 416 task_runner_for_waiting_ =
428 content::BrowserThread::GetMessageLoopProxyForThread( 417 content::BrowserThread::GetMessageLoopProxyForThread(
429 content::BrowserThread::UI); 418 content::BrowserThread::UI);
430 419
431 state_ = STATE_INITIALIZED; 420 state_ = STATE_INITIALIZED;
432 } 421 }
433 422
434 void AutomaticProfileResetter::Activate() { 423 void AutomaticProfileResetter::Activate() {
435 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 424 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
436 DCHECK(state_ == STATE_INITIALIZED || state_ == STATE_DISABLED); 425 DCHECK(state_ == STATE_INITIALIZED || state_ == STATE_DISABLED);
437 426
438 if (state_ == STATE_INITIALIZED) { 427 if (state_ == STATE_INITIALIZED) {
439 if (!program_.empty()) { 428 if (!program_.empty()) {
440 // Some steps in the flow (e.g. loaded modules, file-based memento) are 429 // Some steps in the flow (e.g. loaded modules, file-based memento) are
441 // IO-intensive, so defer execution until some time later. 430 // IO-intensive, so defer execution until some time later.
442 task_runner_for_waiting_->PostDelayedTask( 431 task_runner_for_waiting_->PostDelayedTask(
443 FROM_HERE, 432 FROM_HERE,
444 base::Bind(&AutomaticProfileResetter::PrepareEvaluationFlow, 433 base::Bind(&AutomaticProfileResetter::PrepareEvaluationFlow,
445 weak_ptr_factory_.GetWeakPtr()), 434 weak_ptr_factory_.GetWeakPtr()),
446 base::TimeDelta::FromSeconds(kEvaluationFlowDelayInSeconds)); 435 base::TimeDelta::FromSeconds(kEvaluationFlowDelayInSeconds));
447 } else { 436 } else {
448 // Terminate early if there is no program included (nor set by tests). 437 // Terminate early if there is no program included (nor set by tests).
449 state_ = STATE_DISABLED; 438 state_ = STATE_DISABLED;
450 } 439 }
451 } 440 }
452 } 441 }
453 442
443 void AutomaticProfileResetter::TriggerProfileReset(bool send_feedback) {
444 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
445 DCHECK_EQ(state_, STATE_HAS_SHOWN_BUBBLE);
446
447 state_ = STATE_PERFORMING_RESET;
448
449 ReportPromptResult(PROMPT_ACTION_RESET);
450 delegate_->TriggerProfileSettingsReset(
451 send_feedback,
452 base::Bind(&AutomaticProfileResetter::OnProfileSettingsResetCompleted,
453 weak_ptr_factory_.GetWeakPtr()));
454 }
455
456 void AutomaticProfileResetter::SkipProfileReset() {
457 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
458 DCHECK_EQ(state_, STATE_HAS_SHOWN_BUBBLE);
459
460 ReportPromptResult(PROMPT_ACTION_NO_RESET);
461 delegate_->DismissPrompt();
462 FinishResetPromptFlow();
463 }
464
465 bool AutomaticProfileResetter::IsResetPromptFlowActive() const {
466 return state_ == STATE_HAS_TRIGGERED_PROMPT ||
467 state_ == STATE_HAS_SHOWN_BUBBLE;
468 }
469
470 void AutomaticProfileResetter::NotifyDidShowResetBubble() {
471 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
472 DCHECK_EQ(state_, STATE_HAS_TRIGGERED_PROMPT);
473
474 state_ = STATE_HAS_SHOWN_BUBBLE;
475
476 PersistMementos();
477 ReportPromptResult(PROMPT_SHOWN_BUBBLE);
478 }
479
480 void AutomaticProfileResetter::NotifyDidOpenWebUIResetDialog() {
481 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
482
483 // This notification is invoked unconditionally by the WebUI, only care about
484 // it when the prompt flow is currently active (and not yet resetting).
485 if (state_ == STATE_HAS_TRIGGERED_PROMPT ||
486 state_ == STATE_HAS_SHOWN_BUBBLE) {
487 has_already_dismissed_prompt_ = true;
488 delegate_->DismissPrompt();
489 }
490 }
491
492 void AutomaticProfileResetter::NotifyDidCloseWebUIResetDialog(
493 bool performed_reset) {
494 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
495
496 // This notification is invoked unconditionally by the WebUI, only care about
497 // it when the prompt flow is currently active (and not yet resetting).
498 if (state_ == STATE_HAS_TRIGGERED_PROMPT ||
499 state_ == STATE_HAS_SHOWN_BUBBLE) {
500 if (!has_already_dismissed_prompt_)
501 delegate_->DismissPrompt();
502 if (state_ == STATE_HAS_TRIGGERED_PROMPT) {
503 PersistMementos();
504 ReportPromptResult(performed_reset ?
505 PROMPT_NOT_SHOWN_BUBBLE_BUT_HAD_WEBUI_RESET :
506 PROMPT_NOT_SHOWN_BUBBLE_BUT_HAD_WEBUI_NO_RESET);
507 } else { // if (state_ == STATE_HAS_SHOWN_PROMPT)
508 ReportPromptResult(performed_reset ?
509 PROMPT_FOLLOWED_BY_WEBUI_RESET :
510 PROMPT_FOLLOWED_BY_WEBUI_NO_RESET);
511 }
512 FinishResetPromptFlow();
513 }
514 }
515
454 void AutomaticProfileResetter::SetProgramForTesting( 516 void AutomaticProfileResetter::SetProgramForTesting(
455 const std::string& program) { 517 const std::string& program) {
456 program_ = program; 518 program_ = program;
457 } 519 }
458 520
459 void AutomaticProfileResetter::SetHashSeedForTesting( 521 void AutomaticProfileResetter::SetHashSeedForTesting(
460 const std::string& hash_key) { 522 const std::string& hash_key) {
461 hash_seed_ = hash_key; 523 hash_seed_ = hash_key;
462 } 524 }
463 525
464 void AutomaticProfileResetter::SetDelegateForTesting( 526 void AutomaticProfileResetter::SetDelegateForTesting(
465 scoped_ptr<AutomaticProfileResetterDelegate> delegate) { 527 scoped_ptr<AutomaticProfileResetterDelegate> delegate) {
466 delegate_ = delegate.Pass(); 528 delegate_ = delegate.Pass();
467 } 529 }
468 530
469 void AutomaticProfileResetter::SetTaskRunnerForWaitingForTesting( 531 void AutomaticProfileResetter::SetTaskRunnerForWaitingForTesting(
470 const scoped_refptr<base::TaskRunner>& task_runner) { 532 const scoped_refptr<base::TaskRunner>& task_runner) {
471 task_runner_for_waiting_ = task_runner; 533 task_runner_for_waiting_ = task_runner;
472 } 534 }
473 535
536 void AutomaticProfileResetter::Shutdown() {
537 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
538
539 // We better not do anything substantial at this point. The metrics service
540 // has already been shut down; and local state has already been commited to
541 // file (in the regular fashion) for the last time.
542
543 state_ = STATE_DISABLED;
544
545 weak_ptr_factory_.InvalidateWeakPtrs();
546 delegate_.reset();
547 }
548
474 void AutomaticProfileResetter::PrepareEvaluationFlow() { 549 void AutomaticProfileResetter::PrepareEvaluationFlow() {
475 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 550 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
476 DCHECK_EQ(state_, STATE_INITIALIZED); 551 DCHECK_EQ(state_, STATE_INITIALIZED);
477 552
478 state_ = STATE_WAITING_ON_DEPENDENCIES; 553 state_ = STATE_WAITING_ON_DEPENDENCIES;
479 554
480 delegate_->RequestCallbackWhenTemplateURLServiceIsLoaded( 555 delegate_->RequestCallbackWhenTemplateURLServiceIsLoaded(
481 base::Bind(&AutomaticProfileResetter::OnTemplateURLServiceIsLoaded, 556 base::Bind(&AutomaticProfileResetter::OnTemplateURLServiceIsLoaded,
482 weak_ptr_factory_.GetWeakPtr())); 557 weak_ptr_factory_.GetWeakPtr()));
483 delegate_->RequestCallbackWhenLoadedModulesAreEnumerated( 558 delegate_->RequestCallbackWhenLoadedModulesAreEnumerated(
(...skipping 26 matching lines...) Expand all
510 weak_ptr_factory_.GetWeakPtr())); 585 weak_ptr_factory_.GetWeakPtr()));
511 } 586 }
512 } 587 }
513 588
514 void AutomaticProfileResetter::BeginEvaluationFlow() { 589 void AutomaticProfileResetter::BeginEvaluationFlow() {
515 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 590 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
516 DCHECK_EQ(state_, STATE_READY); 591 DCHECK_EQ(state_, STATE_READY);
517 DCHECK(!program_.empty()); 592 DCHECK(!program_.empty());
518 DCHECK(!input_builder_); 593 DCHECK(!input_builder_);
519 594
520 state_ = STATE_WORKING; 595 state_ = STATE_EVALUATING_CONDITIONS;
521 596
522 input_builder_.reset(new InputBuilder(profile_, delegate_.get())); 597 input_builder_.reset(new InputBuilder(profile_, delegate_.get()));
523 input_builder_->BuildEvaluatorProgramInput( 598 input_builder_->BuildEvaluatorProgramInput(
524 base::Bind(&AutomaticProfileResetter::ContinueWithEvaluationFlow, 599 base::Bind(&AutomaticProfileResetter::ContinueWithEvaluationFlow,
525 weak_ptr_factory_.GetWeakPtr())); 600 weak_ptr_factory_.GetWeakPtr()));
526 } 601 }
527 602
528 void AutomaticProfileResetter::ContinueWithEvaluationFlow( 603 void AutomaticProfileResetter::ContinueWithEvaluationFlow(
529 scoped_ptr<base::DictionaryValue> program_input) { 604 scoped_ptr<base::DictionaryValue> program_input) {
530 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 605 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
531 DCHECK_EQ(state_, STATE_WORKING); 606 DCHECK_EQ(state_, STATE_EVALUATING_CONDITIONS);
532 607
533 input_builder_.reset(); 608 input_builder_.reset();
534 609
535 base::SequencedWorkerPool* blocking_pool = 610 base::SequencedWorkerPool* blocking_pool =
536 content::BrowserThread::GetBlockingPool(); 611 content::BrowserThread::GetBlockingPool();
537 scoped_refptr<base::TaskRunner> task_runner = 612 scoped_refptr<base::TaskRunner> task_runner =
538 blocking_pool->GetTaskRunnerWithShutdownBehavior( 613 blocking_pool->GetTaskRunnerWithShutdownBehavior(
539 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN); 614 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN);
540 615
541 base::PostTaskAndReplyWithResult( 616 base::PostTaskAndReplyWithResult(
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
579 } 654 }
580 for (size_t i = 0; i < arraysize(kSatisfiedCriteriaMaskKeys); ++i) { 655 for (size_t i = 0; i < arraysize(kSatisfiedCriteriaMaskKeys); ++i) {
581 bool flag = false; 656 bool flag = false;
582 if (interpreter.GetOutputBoolean(kSatisfiedCriteriaMaskKeys[i], &flag) && 657 if (interpreter.GetOutputBoolean(kSatisfiedCriteriaMaskKeys[i], &flag) &&
583 flag) 658 flag)
584 results->satisfied_criteria_mask |= (1 << i); 659 results->satisfied_criteria_mask |= (1 << i);
585 } 660 }
586 return results.Pass(); 661 return results.Pass();
587 } 662 }
588 663
589 void AutomaticProfileResetter::FinishEvaluationFlow(
590 scoped_ptr<EvaluationResults> results) {
591 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
592 DCHECK_EQ(state_, STATE_WORKING);
593
594 ReportStatistics(results->satisfied_criteria_mask,
595 results->combined_status_mask);
596
597 if (results->satisfied_criteria_mask != 0 && !results->had_prompted_already) {
598 PreferenceHostedPromptMemento memento_in_prefs(profile_);
599 LocalStateHostedPromptMemento memento_in_local_state(profile_);
600 FileHostedPromptMemento memento_in_file(profile_);
601
602 memento_in_prefs.StoreValue(results->memento_value_in_prefs);
603 memento_in_local_state.StoreValue(results->memento_value_in_local_state);
604 memento_in_file.StoreValue(results->memento_value_in_file);
605
606 if (ShouldPerformLiveRun()) {
607 delegate_->ShowPrompt();
608 } else {
609 UMA_HISTOGRAM_ENUMERATION("AutomaticProfileReset.PromptResult",
610 PROMPT_NOT_SHOWN,
611 PROMPT_RESULT_MAX);
612 }
613 }
614
615 state_ = STATE_DONE;
616 }
617
618 void AutomaticProfileResetter::ReportStatistics(uint32 satisfied_criteria_mask, 664 void AutomaticProfileResetter::ReportStatistics(uint32 satisfied_criteria_mask,
619 uint32 combined_status_mask) { 665 uint32 combined_status_mask) {
620 UMA_HISTOGRAM_ENUMERATION("AutomaticProfileReset.SatisfiedCriteriaMask", 666 UMA_HISTOGRAM_ENUMERATION("AutomaticProfileReset.SatisfiedCriteriaMask",
621 satisfied_criteria_mask, 667 satisfied_criteria_mask,
622 kSatisfiedCriteriaMaskMaximumValue); 668 kSatisfiedCriteriaMaskMaximumValue);
623 UMA_HISTOGRAM_ENUMERATION("AutomaticProfileReset.CombinedStatusMask", 669 UMA_HISTOGRAM_ENUMERATION("AutomaticProfileReset.CombinedStatusMask",
624 combined_status_mask, 670 combined_status_mask,
625 kCombinedStatusMaskMaximumValue); 671 kCombinedStatusMaskMaximumValue);
626 } 672 }
627 673
628 void AutomaticProfileResetter::Shutdown() { 674 void AutomaticProfileResetter::FinishEvaluationFlow(
675 scoped_ptr<EvaluationResults> results) {
629 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 676 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
677 DCHECK_EQ(state_, STATE_EVALUATING_CONDITIONS);
630 678
631 state_ = STATE_DISABLED; 679 ReportStatistics(results->satisfied_criteria_mask,
632 delegate_.reset(); 680 results->combined_status_mask);
633 weak_ptr_factory_.InvalidateWeakPtrs(); 681
682 if (results->satisfied_criteria_mask != 0 && !results->had_prompted_already) {
683 evaluation_results_ = results.Pass();
684 BeginResetPromptFlow();
685 } else {
686 state_ = STATE_DONE;
687 }
634 } 688 }
689
690 void AutomaticProfileResetter::BeginResetPromptFlow() {
691 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
692 DCHECK_EQ(state_, STATE_EVALUATING_CONDITIONS);
693
694 state_ = STATE_HAS_TRIGGERED_PROMPT;
695
696 if (ShouldPerformLiveRun() && delegate_->TriggerPrompt()) {
697 // Start fetching the brandcoded default settings speculatively in the
698 // background, so as to reduce waiting time if the user chooses to go
699 // through with the reset.
700 delegate_->FetchBrandcodedDefaultSettingsIfNeeded();
701 } else {
702 PersistMementos();
703 ReportPromptResult(PROMPT_NOT_TRIGGERED);
704 FinishResetPromptFlow();
705 }
706 }
707
708 void AutomaticProfileResetter::OnProfileSettingsResetCompleted() {
709 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
710 DCHECK_EQ(state_, STATE_PERFORMING_RESET);
711
712 delegate_->DismissPrompt();
713 FinishResetPromptFlow();
714 }
715
716 void AutomaticProfileResetter::ReportPromptResult(PromptResult result) {
717 UMA_HISTOGRAM_ENUMERATION(
718 "AutomaticProfileReset.PromptResult", result, PROMPT_RESULT_MAX);
719 }
720
721 void AutomaticProfileResetter::PersistMementos() {
722 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
723 DCHECK(state_ == STATE_HAS_TRIGGERED_PROMPT ||
724 state_ == STATE_HAS_SHOWN_BUBBLE);
725 DCHECK(evaluation_results_);
726
727 PreferenceHostedPromptMemento memento_in_prefs(profile_);
728 LocalStateHostedPromptMemento memento_in_local_state(profile_);
729 FileHostedPromptMemento memento_in_file(profile_);
730
731 memento_in_prefs.StoreValue(evaluation_results_->memento_value_in_prefs);
732 memento_in_local_state.StoreValue(
733 evaluation_results_->memento_value_in_local_state);
734 memento_in_file.StoreValue(evaluation_results_->memento_value_in_file);
735
736 evaluation_results_.reset();
737 }
738
739 void AutomaticProfileResetter::FinishResetPromptFlow() {
740 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
741 DCHECK(state_ == STATE_HAS_TRIGGERED_PROMPT ||
742 state_ == STATE_HAS_SHOWN_BUBBLE ||
743 state_ == STATE_PERFORMING_RESET);
744 DCHECK(!evaluation_results_);
745
746 state_ = STATE_DONE;
747 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698