| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/safe_browsing/chrome_cleaner/reporter_runner_win.h" | 5 #include "chrome/browser/safe_browsing/chrome_cleaner/reporter_runner_win.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <memory> | 10 #include <memory> |
| (...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 489 ChromeCleanerFetchStatus fetch_status) { | 489 ChromeCleanerFetchStatus fetch_status) { |
| 490 // As long as the fetch didn't fail due to HTTP_NOT_FOUND, show a prompt | 490 // As long as the fetch didn't fail due to HTTP_NOT_FOUND, show a prompt |
| 491 // (either offering the tool directly or pointing to the download page). | 491 // (either offering the tool directly or pointing to the download page). |
| 492 // If the fetch failed to find the file, don't prompt the user since the | 492 // If the fetch failed to find the file, don't prompt the user since the |
| 493 // tool is not currently available. | 493 // tool is not currently available. |
| 494 // TODO(csharp): In the event the browser is closed before the prompt | 494 // TODO(csharp): In the event the browser is closed before the prompt |
| 495 // displays, we will wait until the next scanner run to | 495 // displays, we will wait until the next scanner run to |
| 496 // re-display it. Improve this. http://crbug.com/460295 | 496 // re-display it. Improve this. http://crbug.com/460295 |
| 497 if (fetch_status == ChromeCleanerFetchStatus::kNotFoundOnServer) { | 497 if (fetch_status == ChromeCleanerFetchStatus::kNotFoundOnServer) { |
| 498 RecordSRTPromptHistogram(SRT_PROMPT_DOWNLOAD_UNAVAILABLE); | 498 RecordSRTPromptHistogram(SRT_PROMPT_DOWNLOAD_UNAVAILABLE); |
| 499 RecordPromptNotShownWithReasonHistogram( |
| 500 NO_PROMPT_REASON_CLEANER_DOWNLOAD_FAILED); |
| 499 return; | 501 return; |
| 500 } | 502 } |
| 501 | 503 |
| 502 // Find the last active browser, which may be NULL, in which case we won't | 504 // Find the last active browser, which may be NULL, in which case we won't |
| 503 // show the prompt this time and will wait until the next run of the | 505 // show the prompt this time and will wait until the next run of the |
| 504 // reporter. We can't use other ways of finding a browser because we don't | 506 // reporter. We can't use other ways of finding a browser because we don't |
| 505 // have a profile. | 507 // have a profile. |
| 506 Browser* browser = chrome::FindLastActive(); | 508 Browser* browser = chrome::FindLastActive(); |
| 507 if (!browser) | 509 if (!browser) { |
| 510 RecordPromptNotShownWithReasonHistogram( |
| 511 NO_PROMPT_REASON_BROWSER_NOT_AVAILABLE); |
| 508 return; | 512 return; |
| 513 } |
| 509 | 514 |
| 510 Profile* profile = browser->profile(); | 515 Profile* profile = browser->profile(); |
| 511 DCHECK(profile); | 516 DCHECK(profile); |
| 512 | 517 |
| 513 // Make sure we have a tabbed browser since we need to anchor the bubble to | 518 // Make sure we have a tabbed browser since we need to anchor the bubble to |
| 514 // the toolbar's wrench menu. Create one if none exist already. | 519 // the toolbar's wrench menu. Create one if none exist already. |
| 515 if (browser->type() != Browser::TYPE_TABBED) { | 520 if (browser->type() != Browser::TYPE_TABBED) { |
| 516 browser = chrome::FindTabbedBrowser(profile, false); | 521 browser = chrome::FindTabbedBrowser(profile, false); |
| 517 if (!browser) | 522 if (!browser) |
| 518 browser = new Browser(Browser::CreateParams(profile, false)); | 523 browser = new Browser(Browser::CreateParams(profile, false)); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 581 | 586 |
| 582 void ScanAndPrompt(const SwReporterInvocation& reporter_invocation) { | 587 void ScanAndPrompt(const SwReporterInvocation& reporter_invocation) { |
| 583 if (g_testing_delegate_) { | 588 if (g_testing_delegate_) { |
| 584 g_testing_delegate_->TriggerPrompt(); | 589 g_testing_delegate_->TriggerPrompt(); |
| 585 return; | 590 return; |
| 586 } | 591 } |
| 587 | 592 |
| 588 ChromeCleanerController* cleaner_controller = | 593 ChromeCleanerController* cleaner_controller = |
| 589 ChromeCleanerController::GetInstance(); | 594 ChromeCleanerController::GetInstance(); |
| 590 | 595 |
| 591 if (cleaner_controller->state() != ChromeCleanerController::State::kIdle) | 596 if (cleaner_controller->state() != ChromeCleanerController::State::kIdle) { |
| 597 RecordPromptNotShownWithReasonHistogram(NO_PROMPT_REASON_NOT_ON_IDLE_STATE); |
| 592 return; | 598 return; |
| 599 } |
| 593 | 600 |
| 594 cleaner_controller->Scan(reporter_invocation); | 601 cleaner_controller->Scan(reporter_invocation); |
| 595 DCHECK_EQ(ChromeCleanerController::State::kScanning, | 602 DCHECK_EQ(ChromeCleanerController::State::kScanning, |
| 596 cleaner_controller->state()); | 603 cleaner_controller->state()); |
| 597 | 604 |
| 598 // The dialog controller manages its own lifetime. If the controller enters | 605 // The dialog controller manages its own lifetime. If the controller enters |
| 599 // the kInfected state, the dialog controller will show the chrome cleaner | 606 // the kInfected state, the dialog controller will show the chrome cleaner |
| 600 // dialog to the user. | 607 // dialog to the user. |
| 601 new ChromeCleanerDialogControllerImpl(cleaner_controller); | 608 new ChromeCleanerDialogControllerImpl(cleaner_controller); |
| 602 } | 609 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 617 // Don't show the prompt again if it's been shown before for this profile | 624 // Don't show the prompt again if it's been shown before for this profile |
| 618 // and for the current variations seed, unless there's a pending prompt to | 625 // and for the current variations seed, unless there's a pending prompt to |
| 619 // show in the Chrome menu. | 626 // show in the Chrome menu. |
| 620 std::string incoming_seed = GetIncomingSRTSeed(); | 627 std::string incoming_seed = GetIncomingSRTSeed(); |
| 621 std::string old_seed = prefs->GetString(prefs::kSwReporterPromptSeed); | 628 std::string old_seed = prefs->GetString(prefs::kSwReporterPromptSeed); |
| 622 PrefService* local_state = g_browser_process->local_state(); | 629 PrefService* local_state = g_browser_process->local_state(); |
| 623 bool pending_prompt = | 630 bool pending_prompt = |
| 624 local_state && local_state->GetBoolean(prefs::kSwReporterPendingPrompt); | 631 local_state && local_state->GetBoolean(prefs::kSwReporterPendingPrompt); |
| 625 if (!incoming_seed.empty() && incoming_seed == old_seed && !pending_prompt) { | 632 if (!incoming_seed.empty() && incoming_seed == old_seed && !pending_prompt) { |
| 626 RecordReporterStepHistogram(SW_REPORTER_ALREADY_PROMPTED); | 633 RecordReporterStepHistogram(SW_REPORTER_ALREADY_PROMPTED); |
| 634 RecordPromptNotShownWithReasonHistogram(NO_PROMPT_REASON_ALREADY_PROMPTED); |
| 627 return; | 635 return; |
| 628 } | 636 } |
| 629 | 637 |
| 630 if (!incoming_seed.empty() && incoming_seed != old_seed) { | 638 if (!incoming_seed.empty() && incoming_seed != old_seed) { |
| 631 prefs->SetString(prefs::kSwReporterPromptSeed, incoming_seed); | 639 prefs->SetString(prefs::kSwReporterPromptSeed, incoming_seed); |
| 632 // Forget about pending prompts if prompt seed has changed. | 640 // Forget about pending prompts if prompt seed has changed. |
| 633 if (local_state) | 641 if (local_state) |
| 634 local_state->SetBoolean(prefs::kSwReporterPendingPrompt, false); | 642 local_state->SetBoolean(prefs::kSwReporterPendingPrompt, false); |
| 635 } | 643 } |
| 636 prefs->SetString(prefs::kSwReporterPromptVersion, | 644 prefs->SetString(prefs::kSwReporterPromptVersion, |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 764 now.ToInternalValue()); | 772 now.ToInternalValue()); |
| 765 } | 773 } |
| 766 uma.ReportRuntime(reporter_running_time); | 774 uma.ReportRuntime(reporter_running_time); |
| 767 uma.ReportScanTimes(); | 775 uma.ReportScanTimes(); |
| 768 uma.ReportMemoryUsage(); | 776 uma.ReportMemoryUsage(); |
| 769 if (finished_invocation.logs_upload_enabled) | 777 if (finished_invocation.logs_upload_enabled) |
| 770 uma.RecordLogsUploadResult(); | 778 uma.RecordLogsUploadResult(); |
| 771 | 779 |
| 772 if (!finished_invocation.BehaviourIsSupported( | 780 if (!finished_invocation.BehaviourIsSupported( |
| 773 SwReporterInvocation::BEHAVIOUR_TRIGGER_PROMPT)) { | 781 SwReporterInvocation::BEHAVIOUR_TRIGGER_PROMPT)) { |
| 782 RecordPromptNotShownWithReasonHistogram( |
| 783 NO_PROMPT_REASON_BEHAVIOUR_NOT_SUPPORTED); |
| 774 return; | 784 return; |
| 775 } | 785 } |
| 776 | 786 |
| 777 if (!base::FeatureList::IsEnabled(kInBrowserCleanerUIFeature) && | 787 if (!base::FeatureList::IsEnabled(kInBrowserCleanerUIFeature) && |
| 778 !IsInSRTPromptFieldTrialGroups()) { | 788 !IsInSRTPromptFieldTrialGroups()) { |
| 779 // Knowing about disabled field trial is more important than reporter not | 789 // Knowing about disabled field trial is more important than reporter not |
| 780 // finding anything to remove, so check this case first. | 790 // finding anything to remove, so check this case first. |
| 781 RecordReporterStepHistogram(SW_REPORTER_NO_PROMPT_FIELD_TRIAL); | 791 RecordReporterStepHistogram(SW_REPORTER_NO_PROMPT_FIELD_TRIAL); |
| 792 RecordPromptNotShownWithReasonHistogram( |
| 793 NO_PROMPT_REASON_FEATURE_NOT_ENABLED); |
| 782 return; | 794 return; |
| 783 } | 795 } |
| 784 | 796 |
| 785 if (exit_code != chrome_cleaner::kSwReporterPostRebootCleanupNeeded && | 797 if (exit_code != chrome_cleaner::kSwReporterPostRebootCleanupNeeded && |
| 786 exit_code != chrome_cleaner::kSwReporterCleanupNeeded) { | 798 exit_code != chrome_cleaner::kSwReporterCleanupNeeded) { |
| 787 RecordReporterStepHistogram(SW_REPORTER_NO_PROMPT_NEEDED); | 799 RecordReporterStepHistogram(SW_REPORTER_NO_PROMPT_NEEDED); |
| 800 RecordPromptNotShownWithReasonHistogram(NO_PROMPT_REASON_NOTHING_FOUND); |
| 788 return; | 801 return; |
| 789 } | 802 } |
| 790 | 803 |
| 791 // The kInBrowserCleanerUI feature takes precedence over the | 804 // The kInBrowserCleanerUI feature takes precedence over the |
| 792 // SRTPromptFieldTrial. If it is enabled, no attempt will be made to show | 805 // SRTPromptFieldTrial. If it is enabled, no attempt will be made to show |
| 793 // the old SRT prompt. | 806 // the old SRT prompt. |
| 794 if (base::FeatureList::IsEnabled(kInBrowserCleanerUIFeature)) { | 807 if (base::FeatureList::IsEnabled(kInBrowserCleanerUIFeature)) { |
| 795 ScanAndPrompt(finished_invocation); | 808 ScanAndPrompt(finished_invocation); |
| 796 return; | 809 return; |
| 797 } | 810 } |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1021 return srt_cleaner_key.Open(HKEY_CURRENT_USER, cleaner_key_path.c_str(), | 1034 return srt_cleaner_key.Open(HKEY_CURRENT_USER, cleaner_key_path.c_str(), |
| 1022 KEY_QUERY_VALUE) == ERROR_SUCCESS && | 1035 KEY_QUERY_VALUE) == ERROR_SUCCESS && |
| 1023 srt_cleaner_key.GetValueCount() > 0; | 1036 srt_cleaner_key.GetValueCount() > 0; |
| 1024 } | 1037 } |
| 1025 | 1038 |
| 1026 void SetSwReporterTestingDelegate(SwReporterTestingDelegate* delegate) { | 1039 void SetSwReporterTestingDelegate(SwReporterTestingDelegate* delegate) { |
| 1027 g_testing_delegate_ = delegate; | 1040 g_testing_delegate_ = delegate; |
| 1028 } | 1041 } |
| 1029 | 1042 |
| 1030 } // namespace safe_browsing | 1043 } // namespace safe_browsing |
| OLD | NEW |