Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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/chrome_cleaner_fetcher_win .h" | 5 #include "chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_fetcher_win .h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/bind_helpers.h" | 11 #include "base/bind_helpers.h" |
| 12 #include "base/files/file_path.h" | 12 #include "base/files/file_path.h" |
| 13 #include "base/files/file_util.h" | 13 #include "base/files/file_util.h" |
| 14 #include "base/files/scoped_temp_dir.h" | 14 #include "base/files/scoped_temp_dir.h" |
| 15 #include "base/guid.h" | 15 #include "base/guid.h" |
| 16 #include "base/location.h" | 16 #include "base/location.h" |
| 17 #include "base/logging.h" | 17 #include "base/logging.h" |
| 18 #include "base/macros.h" | 18 #include "base/macros.h" |
| 19 #include "base/memory/ptr_util.h" | 19 #include "base/memory/ptr_util.h" |
| 20 #include "base/memory/ref_counted.h" | 20 #include "base/memory/ref_counted.h" |
| 21 #include "base/metrics/histogram_macros.h" | |
| 21 #include "base/sequenced_task_runner.h" | 22 #include "base/sequenced_task_runner.h" |
| 22 #include "base/strings/stringprintf.h" | 23 #include "base/strings/stringprintf.h" |
| 23 #include "base/strings/utf_string_conversions.h" | 24 #include "base/strings/utf_string_conversions.h" |
| 24 #include "base/task_runner_util.h" | 25 #include "base/task_runner_util.h" |
| 25 #include "base/task_scheduler/post_task.h" | 26 #include "base/task_scheduler/post_task.h" |
| 26 #include "chrome/browser/browser_process.h" | 27 #include "chrome/browser/browser_process.h" |
| 27 #include "chrome/browser/safe_browsing/chrome_cleaner/srt_field_trial_win.h" | 28 #include "chrome/browser/safe_browsing/chrome_cleaner/srt_field_trial_win.h" |
| 28 #include "chrome/install_static/install_details.h" | 29 #include "chrome/install_static/install_details.h" |
| 29 #include "chrome/install_static/install_modes.h" | 30 #include "chrome/install_static/install_modes.h" |
| 30 #include "components/data_use_measurement/core/data_use_user_data.h" | 31 #include "components/data_use_measurement/core/data_use_user_data.h" |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 45 // Create a temporary directory name prefix like "ChromeCleaner_4_", where | 46 // Create a temporary directory name prefix like "ChromeCleaner_4_", where |
| 46 // "Chrome" is the product name and the 4 refers to the install mode of the | 47 // "Chrome" is the product name and the 4 refers to the install mode of the |
| 47 // browser. | 48 // browser. |
| 48 int install_mode = install_static::InstallDetails::Get().install_mode_index(); | 49 int install_mode = install_static::InstallDetails::Get().install_mode_index(); |
| 49 return base::StringPrintf( | 50 return base::StringPrintf( |
| 50 FILE_PATH_LITERAL("%" PRFilePath "%" PRFilePath "_%d_"), | 51 FILE_PATH_LITERAL("%" PRFilePath "%" PRFilePath "_%d_"), |
| 51 install_static::kProductPathName, FILE_PATH_LITERAL("Cleaner"), | 52 install_static::kProductPathName, FILE_PATH_LITERAL("Cleaner"), |
| 52 install_mode); | 53 install_mode); |
| 53 } | 54 } |
| 54 | 55 |
| 56 enum CleanerDownloadStatusHistogramValue { | |
|
csharp
2017/07/07 17:32:51
Please add a comment saying this must say in sync
ftirelo
2017/07/07 20:27:53
Done.
| |
| 57 CLEANER_DOWNLOAD_STATUS_SUCCEEDED = 0, | |
| 58 CLEANER_DOWNLOAD_STATUS_OTHER_FAILURE = 1, | |
| 59 CLEANER_DOWNLOAD_STATUS_NOT_FOUND_ON_SERVER = 2, | |
| 60 CLEANER_DOWNLOAD_STATUS_FAILED_TO_CREATE_TEMP_DIR = 3, | |
| 61 | |
| 62 CLEANER_DOWNLOAD_STATUS_MAX, | |
| 63 }; | |
| 64 | |
| 65 void RecordCleanerDownloadStatusHistogram( | |
| 66 CleanerDownloadStatusHistogramValue value) { | |
| 67 UMA_HISTOGRAM_ENUMERATION("SoftwareReporter.CleanerDownloadStatus", value, | |
| 68 CLEANER_DOWNLOAD_STATUS_MAX); | |
| 69 } | |
| 70 | |
| 55 // Class that will attempt to download the Chrome Cleaner executable and call a | 71 // Class that will attempt to download the Chrome Cleaner executable and call a |
| 56 // given callback when done. Instances of ChromeCleanerFetcher own themselves | 72 // given callback when done. Instances of ChromeCleanerFetcher own themselves |
| 57 // and will self-delete if they encounter an error or when the network request | 73 // and will self-delete if they encounter an error or when the network request |
| 58 // has completed. | 74 // has completed. |
| 59 class ChromeCleanerFetcher : public net::URLFetcherDelegate { | 75 class ChromeCleanerFetcher : public net::URLFetcherDelegate { |
| 60 public: | 76 public: |
| 61 explicit ChromeCleanerFetcher(ChromeCleanerFetchedCallback fetched_callback); | 77 explicit ChromeCleanerFetcher(ChromeCleanerFetchedCallback fetched_callback); |
| 62 | 78 |
| 63 protected: | 79 protected: |
| 64 ~ChromeCleanerFetcher() override; | 80 ~ChromeCleanerFetcher() override; |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 119 return base::CreateNewTempDirectory(CleanerTempDirectoryPrefix(), | 135 return base::CreateNewTempDirectory(CleanerTempDirectoryPrefix(), |
| 120 &temp_dir) && | 136 &temp_dir) && |
| 121 scoped_temp_dir_->Set(temp_dir); | 137 scoped_temp_dir_->Set(temp_dir); |
| 122 } | 138 } |
| 123 | 139 |
| 124 void ChromeCleanerFetcher::OnTemporaryDirectoryCreated(bool success) { | 140 void ChromeCleanerFetcher::OnTemporaryDirectoryCreated(bool success) { |
| 125 if (!success) { | 141 if (!success) { |
| 126 PostCallbackAndDeleteSelf( | 142 PostCallbackAndDeleteSelf( |
| 127 base::FilePath(), | 143 base::FilePath(), |
| 128 ChromeCleanerFetchStatus::kFailedToCreateTemporaryDirectory); | 144 ChromeCleanerFetchStatus::kFailedToCreateTemporaryDirectory); |
| 145 RecordCleanerDownloadStatusHistogram( | |
|
csharp
2017/07/07 17:32:51
This should probably be move up a line so it is do
ftirelo
2017/07/07 20:27:53
Done. Also did for the other calls.
| |
| 146 CLEANER_DOWNLOAD_STATUS_FAILED_TO_CREATE_TEMP_DIR); | |
| 129 return; | 147 return; |
| 130 } | 148 } |
| 131 | 149 |
| 132 DCHECK(!scoped_temp_dir_->GetPath().empty()); | 150 DCHECK(!scoped_temp_dir_->GetPath().empty()); |
| 133 | 151 |
| 134 temp_file_ = scoped_temp_dir_->GetPath().Append( | 152 temp_file_ = scoped_temp_dir_->GetPath().Append( |
| 135 base::ASCIIToUTF16(base::GenerateGUID()) + L".tmp"); | 153 base::ASCIIToUTF16(base::GenerateGUID()) + L".tmp"); |
| 136 | 154 |
| 137 data_use_measurement::DataUseUserData::AttachToFetcher( | 155 data_use_measurement::DataUseUserData::AttachToFetcher( |
| 138 url_fetcher_.get(), data_use_measurement::DataUseUserData::SAFE_BROWSING); | 156 url_fetcher_.get(), data_use_measurement::DataUseUserData::SAFE_BROWSING); |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 161 | 179 |
| 162 void ChromeCleanerFetcher::OnURLFetchComplete(const net::URLFetcher* source) { | 180 void ChromeCleanerFetcher::OnURLFetchComplete(const net::URLFetcher* source) { |
| 163 // Take ownership of the fetcher in this scope (source == url_fetcher_). | 181 // Take ownership of the fetcher in this scope (source == url_fetcher_). |
| 164 DCHECK_EQ(url_fetcher_.get(), source); | 182 DCHECK_EQ(url_fetcher_.get(), source); |
| 165 DCHECK(!source->GetStatus().is_io_pending()); | 183 DCHECK(!source->GetStatus().is_io_pending()); |
| 166 DCHECK(fetched_callback_); | 184 DCHECK(fetched_callback_); |
| 167 | 185 |
| 168 if (source->GetResponseCode() == net::HTTP_NOT_FOUND) { | 186 if (source->GetResponseCode() == net::HTTP_NOT_FOUND) { |
| 169 PostCallbackAndDeleteSelf(base::FilePath(), | 187 PostCallbackAndDeleteSelf(base::FilePath(), |
| 170 ChromeCleanerFetchStatus::kNotFoundOnServer); | 188 ChromeCleanerFetchStatus::kNotFoundOnServer); |
| 189 RecordCleanerDownloadStatusHistogram( | |
| 190 CLEANER_DOWNLOAD_STATUS_NOT_FOUND_ON_SERVER); | |
| 171 return; | 191 return; |
| 172 } | 192 } |
| 173 | 193 |
| 174 base::FilePath download_path; | 194 base::FilePath download_path; |
| 175 if (!source->GetStatus().is_success() || | 195 if (!source->GetStatus().is_success() || |
| 176 source->GetResponseCode() != net::HTTP_OK || | 196 source->GetResponseCode() != net::HTTP_OK || |
| 177 !source->GetResponseAsFilePath(/*take_ownership=*/true, &download_path)) { | 197 !source->GetResponseAsFilePath(/*take_ownership=*/true, &download_path)) { |
| 178 PostCallbackAndDeleteSelf(base::FilePath(), | 198 PostCallbackAndDeleteSelf(base::FilePath(), |
| 179 ChromeCleanerFetchStatus::kOtherFailure); | 199 ChromeCleanerFetchStatus::kOtherFailure); |
| 200 RecordCleanerDownloadStatusHistogram(CLEANER_DOWNLOAD_STATUS_OTHER_FAILURE); | |
| 180 return; | 201 return; |
| 181 } | 202 } |
| 182 | 203 |
| 183 DCHECK(!download_path.empty()); | 204 DCHECK(!download_path.empty()); |
| 184 DCHECK_EQ(temp_file_.value(), download_path.value()); | 205 DCHECK_EQ(temp_file_.value(), download_path.value()); |
| 185 | 206 |
| 186 // Take ownership of the scoped temp directory so it is not deleted. | 207 // Take ownership of the scoped temp directory so it is not deleted. |
| 187 scoped_temp_dir_->Take(); | 208 scoped_temp_dir_->Take(); |
| 188 | 209 |
| 189 PostCallbackAndDeleteSelf(std::move(download_path), | 210 PostCallbackAndDeleteSelf(std::move(download_path), |
| 190 ChromeCleanerFetchStatus::kSuccess); | 211 ChromeCleanerFetchStatus::kSuccess); |
| 212 RecordCleanerDownloadStatusHistogram(CLEANER_DOWNLOAD_STATUS_SUCCEEDED); | |
| 191 } | 213 } |
| 192 | 214 |
| 193 } // namespace | 215 } // namespace |
| 194 | 216 |
| 195 void FetchChromeCleaner(ChromeCleanerFetchedCallback fetched_callback) { | 217 void FetchChromeCleaner(ChromeCleanerFetchedCallback fetched_callback) { |
| 196 new ChromeCleanerFetcher(std::move(fetched_callback)); | 218 new ChromeCleanerFetcher(std::move(fetched_callback)); |
| 197 } | 219 } |
| 198 | 220 |
| 199 } // namespace safe_browsing | 221 } // namespace safe_browsing |
| OLD | NEW |