Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/metrics/chrome_metrics_service_client.h" | 5 #include "chrome/browser/metrics/chrome_metrics_service_client.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 29 #include "chrome/browser/metrics/chrome_stability_metrics_provider.h" | 29 #include "chrome/browser/metrics/chrome_stability_metrics_provider.h" |
| 30 #include "chrome/browser/metrics/https_engagement_metrics_provider.h" | 30 #include "chrome/browser/metrics/https_engagement_metrics_provider.h" |
| 31 #include "chrome/browser/metrics/metrics_reporting_state.h" | 31 #include "chrome/browser/metrics/metrics_reporting_state.h" |
| 32 #include "chrome/browser/metrics/sampling_metrics_provider.h" | 32 #include "chrome/browser/metrics/sampling_metrics_provider.h" |
| 33 #include "chrome/browser/metrics/subprocess_metrics_provider.h" | 33 #include "chrome/browser/metrics/subprocess_metrics_provider.h" |
| 34 #include "chrome/browser/metrics/time_ticks_experiment_win.h" | 34 #include "chrome/browser/metrics/time_ticks_experiment_win.h" |
| 35 #include "chrome/browser/sync/chrome_sync_client.h" | 35 #include "chrome/browser/sync/chrome_sync_client.h" |
| 36 #include "chrome/browser/ui/browser_otr_state.h" | 36 #include "chrome/browser/ui/browser_otr_state.h" |
| 37 #include "chrome/common/channel_info.h" | 37 #include "chrome/common/channel_info.h" |
| 38 #include "chrome/common/chrome_paths.h" | 38 #include "chrome/common/chrome_paths.h" |
| 39 #include "chrome/common/chrome_paths_internal.h" | |
| 39 #include "chrome/common/chrome_switches.h" | 40 #include "chrome/common/chrome_switches.h" |
| 40 #include "chrome/common/crash_keys.h" | 41 #include "chrome/common/crash_keys.h" |
| 41 #include "chrome/common/features.h" | 42 #include "chrome/common/features.h" |
| 42 #include "chrome/installer/util/util_constants.h" | 43 #include "chrome/installer/util/util_constants.h" |
| 43 #include "components/metrics/call_stack_profile_metrics_provider.h" | 44 #include "components/metrics/call_stack_profile_metrics_provider.h" |
| 44 #include "components/metrics/drive_metrics_provider.h" | 45 #include "components/metrics/drive_metrics_provider.h" |
| 45 #include "components/metrics/file_metrics_provider.h" | 46 #include "components/metrics/file_metrics_provider.h" |
| 46 #include "components/metrics/gpu/gpu_metrics_provider.h" | 47 #include "components/metrics/gpu/gpu_metrics_provider.h" |
| 47 #include "components/metrics/metrics_pref_names.h" | 48 #include "components/metrics/metrics_pref_names.h" |
| 48 #include "components/metrics/metrics_reporting_default_state.h" | 49 #include "components/metrics/metrics_reporting_default_state.h" |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 103 #include "chrome/browser/signin/chrome_signin_status_metrics_provider_delegate.h " | 104 #include "chrome/browser/signin/chrome_signin_status_metrics_provider_delegate.h " |
| 104 #include "components/signin/core/browser/signin_status_metrics_provider.h" | 105 #include "components/signin/core/browser/signin_status_metrics_provider.h" |
| 105 #endif // !defined(OS_CHROMEOS) | 106 #endif // !defined(OS_CHROMEOS) |
| 106 | 107 |
| 107 namespace { | 108 namespace { |
| 108 | 109 |
| 109 // This specifies the amount of time to wait for all renderers to send their | 110 // This specifies the amount of time to wait for all renderers to send their |
| 110 // data. | 111 // data. |
| 111 const int kMaxHistogramGatheringWaitDuration = 60000; // 60 seconds. | 112 const int kMaxHistogramGatheringWaitDuration = 60000; // 60 seconds. |
| 112 | 113 |
| 114 // Needs to be kept in sync with the writer in | |
| 115 // third_party/crashpad/crashpad/handler/handler_main.cc. | |
| 116 const char kCrashpadHistogramAllocatorName[] = "CrashpadMetrics"; | |
| 117 | |
| 113 // Checks whether it is the first time that cellular uploads logic should be | 118 // Checks whether it is the first time that cellular uploads logic should be |
| 114 // enabled based on whether the the preference for that logic is initialized. | 119 // enabled based on whether the the preference for that logic is initialized. |
| 115 // This should happen only once as the used preference will be initialized | 120 // This should happen only once as the used preference will be initialized |
| 116 // afterwards in |UmaSessionStats.java|. | 121 // afterwards in |UmaSessionStats.java|. |
| 117 bool ShouldClearSavedMetrics() { | 122 bool ShouldClearSavedMetrics() { |
| 118 #if BUILDFLAG(ANDROID_JAVA_UI) | 123 #if BUILDFLAG(ANDROID_JAVA_UI) |
| 119 PrefService* local_state = g_browser_process->local_state(); | 124 PrefService* local_state = g_browser_process->local_state(); |
| 120 return !local_state->HasPrefPath(metrics::prefs::kMetricsReportingEnabled) && | 125 return !local_state->HasPrefPath(metrics::prefs::kMetricsReportingEnabled) && |
| 121 metrics::IsCellularLogicEnabled(); | 126 metrics::IsCellularLogicEnabled(); |
| 122 #else | 127 #else |
| 123 return false; | 128 return false; |
| 124 #endif | 129 #endif |
| 125 } | 130 } |
| 126 | 131 |
| 127 void RegisterInstallerFileMetricsPreferences(PrefRegistrySimple* registry) { | 132 void RegisterFileMetricsPreferences(PrefRegistrySimple* registry) { |
| 128 metrics::FileMetricsProvider::RegisterPrefs( | 133 metrics::FileMetricsProvider::RegisterPrefs( |
| 129 registry, ChromeMetricsServiceClient::kBrowserMetricsName); | 134 registry, ChromeMetricsServiceClient::kBrowserMetricsName); |
| 130 | 135 |
| 136 metrics::FileMetricsProvider::RegisterPrefs(registry, | |
| 137 kCrashpadHistogramAllocatorName); | |
| 138 | |
| 131 #if defined(OS_WIN) | 139 #if defined(OS_WIN) |
| 132 metrics::FileMetricsProvider::RegisterPrefs( | 140 metrics::FileMetricsProvider::RegisterPrefs( |
| 133 registry, installer::kSetupHistogramAllocatorName); | 141 registry, installer::kSetupHistogramAllocatorName); |
| 134 #endif | 142 #endif |
| 135 } | 143 } |
| 136 | 144 |
| 137 std::unique_ptr<metrics::FileMetricsProvider> | 145 std::unique_ptr<metrics::FileMetricsProvider> CreateFileMetricsProvider( |
| 138 CreateInstallerFileMetricsProvider(bool metrics_reporting_enabled) { | 146 bool metrics_reporting_enabled) { |
| 139 // Fetch a worker-pool for performing I/O tasks that are not allowed on | 147 // Fetch a worker-pool for performing I/O tasks that are not allowed on |
| 140 // the main UI thread. | 148 // the main UI thread. |
| 141 scoped_refptr<base::TaskRunner> task_runner = | 149 scoped_refptr<base::TaskRunner> task_runner = |
| 142 content::BrowserThread::GetBlockingPool() | 150 content::BrowserThread::GetBlockingPool() |
| 143 ->GetTaskRunnerWithShutdownBehavior( | 151 ->GetTaskRunnerWithShutdownBehavior( |
| 144 base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN); | 152 base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN); |
| 145 | 153 |
| 146 // Create an object to monitor files of metrics and include them in reports. | 154 // Create an object to monitor files of metrics and include them in reports. |
| 147 std::unique_ptr<metrics::FileMetricsProvider> file_metrics_provider( | 155 std::unique_ptr<metrics::FileMetricsProvider> file_metrics_provider( |
| 148 new metrics::FileMetricsProvider(task_runner, | 156 new metrics::FileMetricsProvider(task_runner, |
| 149 g_browser_process->local_state())); | 157 g_browser_process->local_state())); |
| 150 | 158 |
| 151 // Create the full pathname of the file holding browser metrics. | 159 // Create the full pathname of the file holding browser metrics. |
| 152 base::FilePath metrics_file; | 160 base::FilePath user_data_dir; |
| 153 if (base::PathService::Get(chrome::DIR_USER_DATA, &metrics_file)) { | 161 if (base::PathService::Get(chrome::DIR_USER_DATA, &user_data_dir)) { |
| 154 metrics_file = | 162 base::FilePath browser_metrics_file; |
| 155 metrics_file | 163 base::GlobalHistogramAllocator::ConstructFilePaths( |
| 156 .AppendASCII(ChromeMetricsServiceClient::kBrowserMetricsName) | 164 browser_metrics_file, ChromeMetricsServiceClient::kBrowserMetricsName, |
| 157 .AddExtension(base::PersistentMemoryAllocator::kFileExtension); | 165 &browser_metrics_file, nullptr); |
| 158 | 166 |
| 159 if (metrics_reporting_enabled) { | 167 if (metrics_reporting_enabled) { |
| 160 // Enable reading any existing saved metrics. | 168 // Enable reading any existing saved metrics. |
| 161 file_metrics_provider->RegisterSource( | 169 file_metrics_provider->RegisterSource( |
| 162 metrics_file, | 170 browser_metrics_file, |
| 163 metrics::FileMetricsProvider::SOURCE_HISTOGRAMS_ATOMIC_FILE, | 171 metrics::FileMetricsProvider::SOURCE_HISTOGRAMS_ATOMIC_FILE, |
| 164 metrics::FileMetricsProvider::ASSOCIATE_PREVIOUS_RUN, | 172 metrics::FileMetricsProvider::ASSOCIATE_PREVIOUS_RUN, |
| 165 ChromeMetricsServiceClient::kBrowserMetricsName); | 173 ChromeMetricsServiceClient::kBrowserMetricsName); |
| 166 } else { | 174 } else { |
| 167 // When metrics reporting is not enabled, any existing file should be | 175 // When metrics reporting is not enabled, any existing file should be |
| 168 // deleted in order to preserve user privacy. | 176 // deleted in order to preserve user privacy. |
| 169 task_runner->PostTask(FROM_HERE, | 177 task_runner->PostTask( |
| 170 base::Bind(base::IgnoreResult(&base::DeleteFile), | 178 FROM_HERE, base::Bind(base::IgnoreResult(&base::DeleteFile), |
| 171 metrics_file, /*recursive=*/false)); | 179 browser_metrics_file, /*recursive=*/false)); |
| 172 } | 180 } |
| 173 } | 181 } |
| 174 | 182 |
| 183 // Read the Crashpad metrics files. | |
| 184 base::FilePath default_user_data_dir; | |
| 185 if (chrome::GetDefaultUserDataDirectory(&default_user_data_dir)) { | |
| 186 base::FilePath base_path, active_path; | |
| 187 base::GlobalHistogramAllocator::ConstructFilePaths( | |
| 188 default_user_data_dir, kCrashpadHistogramAllocatorName, &base_path, | |
| 189 &active_path); | |
| 190 if (metrics_reporting_enabled) { | |
| 191 // Register the data from the previous run if crashpad_handler didn't exit | |
| 192 // cleanly. | |
| 193 file_metrics_provider->RegisterSource( | |
| 194 base_path, | |
| 195 metrics::FileMetricsProvider::SOURCE_HISTOGRAMS_ATOMIC_FILE, | |
| 196 metrics::FileMetricsProvider::ASSOCIATE_PREVIOUS_RUN, | |
| 197 kCrashpadHistogramAllocatorName); | |
| 198 | |
| 199 // Register data that will be populated for the current run. | |
| 200 file_metrics_provider->RegisterSource( | |
| 201 active_path, | |
| 202 metrics::FileMetricsProvider::SOURCE_HISTOGRAMS_ATOMIC_FILE, | |
| 203 metrics::FileMetricsProvider::ASSOCIATE_CURRENT_RUN, | |
| 204 kCrashpadHistogramAllocatorName); | |
| 205 } else { | |
| 206 // This file must be deleted here so that it's not mistaken for data from | |
| 207 // a previous run if metrics reporting is toggled. | |
| 208 task_runner->PostTask(FROM_HERE, | |
| 209 base::Bind(base::IgnoreResult(&base::DeleteFile), | |
| 210 base_path, /*recursive=*/false)); | |
| 211 } | |
| 212 } | |
|
Alexei Svitkine (slow)
2016/09/15 16:49:44
This block seems very similar to the one above - c
scottmg
2016/09/15 17:41:13
Done.
| |
| 213 | |
| 175 #if defined(OS_WIN) | 214 #if defined(OS_WIN) |
| 176 // Read metrics file from setup.exe. | 215 // Read metrics file from setup.exe. |
| 177 base::FilePath program_dir; | 216 base::FilePath program_dir; |
| 178 base::PathService::Get(base::DIR_EXE, &program_dir); | 217 base::PathService::Get(base::DIR_EXE, &program_dir); |
| 179 file_metrics_provider->RegisterSource( | 218 file_metrics_provider->RegisterSource( |
| 180 program_dir.AppendASCII(installer::kSetupHistogramAllocatorName), | 219 program_dir.AppendASCII(installer::kSetupHistogramAllocatorName), |
| 181 metrics::FileMetricsProvider::SOURCE_HISTOGRAMS_ATOMIC_DIR, | 220 metrics::FileMetricsProvider::SOURCE_HISTOGRAMS_ATOMIC_DIR, |
| 182 metrics::FileMetricsProvider::ASSOCIATE_CURRENT_RUN, | 221 metrics::FileMetricsProvider::ASSOCIATE_CURRENT_RUN, |
| 183 installer::kSetupHistogramAllocatorName); | 222 installer::kSetupHistogramAllocatorName); |
| 184 #endif | 223 #endif |
| 185 | 224 |
| 186 return file_metrics_provider; | 225 return file_metrics_provider; |
| 187 } | 226 } |
| 188 | 227 |
| 189 // If there is a global metrics file being updated on disk, mark it to be | |
| 190 // deleted when the process exits. A normal shutdown is almost complete | |
| 191 // so there is no benefit in keeping a file with no new data to be processed | |
| 192 // during the next startup sequence. Deleting the file during shutdown adds | |
| 193 // an extra disk-access or two to shutdown but eliminates the unnecessary | |
| 194 // processing of the contents during startup only to find nothing. | |
| 195 void CleanUpGlobalPersistentHistogramStorage() { | |
| 196 base::GlobalHistogramAllocator* allocator = | |
| 197 base::GlobalHistogramAllocator::Get(); | |
| 198 if (!allocator) | |
| 199 return; | |
| 200 | |
| 201 const base::FilePath& path = allocator->GetPersistentLocation(); | |
| 202 if (path.empty()) | |
| 203 return; | |
| 204 | |
| 205 // Open (with delete) and then immediately close the file by going out of | |
| 206 // scope. This is the only cross-platform safe way to delete a file that may | |
| 207 // be open elsewhere. Open handles will continue to operate normally but | |
| 208 // new opens will not be possible. | |
| 209 base::File file(path, base::File::FLAG_OPEN | base::File::FLAG_READ | | |
| 210 base::File::FLAG_DELETE_ON_CLOSE); | |
| 211 } | |
| 212 | |
| 213 } // namespace | 228 } // namespace |
| 214 | 229 |
| 215 | 230 |
| 216 const char ChromeMetricsServiceClient::kBrowserMetricsName[] = "BrowserMetrics"; | 231 const char ChromeMetricsServiceClient::kBrowserMetricsName[] = "BrowserMetrics"; |
| 217 | 232 |
| 218 ChromeMetricsServiceClient::ChromeMetricsServiceClient( | 233 ChromeMetricsServiceClient::ChromeMetricsServiceClient( |
| 219 metrics::MetricsStateManager* state_manager) | 234 metrics::MetricsStateManager* state_manager) |
| 220 : metrics_state_manager_(state_manager), | 235 : metrics_state_manager_(state_manager), |
| 221 #if defined(OS_CHROMEOS) | 236 #if defined(OS_CHROMEOS) |
| 222 chromeos_metrics_provider_(nullptr), | 237 chromeos_metrics_provider_(nullptr), |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 234 start_time_(base::TimeTicks::Now()), | 249 start_time_(base::TimeTicks::Now()), |
| 235 has_uploaded_profiler_data_(false), | 250 has_uploaded_profiler_data_(false), |
| 236 weak_ptr_factory_(this) { | 251 weak_ptr_factory_(this) { |
| 237 DCHECK(thread_checker_.CalledOnValidThread()); | 252 DCHECK(thread_checker_.CalledOnValidThread()); |
| 238 RecordCommandLineMetrics(); | 253 RecordCommandLineMetrics(); |
| 239 RegisterForNotifications(); | 254 RegisterForNotifications(); |
| 240 } | 255 } |
| 241 | 256 |
| 242 ChromeMetricsServiceClient::~ChromeMetricsServiceClient() { | 257 ChromeMetricsServiceClient::~ChromeMetricsServiceClient() { |
| 243 DCHECK(thread_checker_.CalledOnValidThread()); | 258 DCHECK(thread_checker_.CalledOnValidThread()); |
| 244 CleanUpGlobalPersistentHistogramStorage(); | 259 base::GlobalHistogramAllocator* allocator = |
| 260 base::GlobalHistogramAllocator::Get(); | |
| 261 if (allocator) { | |
| 262 // A normal shutdown is almost complete so there is no benefit in keeping a | |
| 263 // file with no new data to be processed during the next startup sequence. | |
| 264 // Deleting the file during shutdown adds an extra disk-access or two to | |
| 265 // shutdown but eliminates the unnecessary processing of the contents during | |
| 266 // startup only to find nothing. | |
| 267 allocator->DeletePersistentLocation(); | |
| 268 } | |
| 245 } | 269 } |
| 246 | 270 |
| 247 // static | 271 // static |
| 248 std::unique_ptr<ChromeMetricsServiceClient> ChromeMetricsServiceClient::Create( | 272 std::unique_ptr<ChromeMetricsServiceClient> ChromeMetricsServiceClient::Create( |
| 249 metrics::MetricsStateManager* state_manager) { | 273 metrics::MetricsStateManager* state_manager) { |
| 250 // Perform two-phase initialization so that |client->metrics_service_| only | 274 // Perform two-phase initialization so that |client->metrics_service_| only |
| 251 // receives pointers to fully constructed objects. | 275 // receives pointers to fully constructed objects. |
| 252 std::unique_ptr<ChromeMetricsServiceClient> client( | 276 std::unique_ptr<ChromeMetricsServiceClient> client( |
| 253 new ChromeMetricsServiceClient(state_manager)); | 277 new ChromeMetricsServiceClient(state_manager)); |
| 254 client->Initialize(); | 278 client->Initialize(); |
| 255 | 279 |
| 256 return client; | 280 return client; |
| 257 } | 281 } |
| 258 | 282 |
| 259 // static | 283 // static |
| 260 void ChromeMetricsServiceClient::RegisterPrefs(PrefRegistrySimple* registry) { | 284 void ChromeMetricsServiceClient::RegisterPrefs(PrefRegistrySimple* registry) { |
| 261 metrics::MetricsService::RegisterPrefs(registry); | 285 metrics::MetricsService::RegisterPrefs(registry); |
| 262 metrics::StabilityMetricsHelper::RegisterPrefs(registry); | 286 metrics::StabilityMetricsHelper::RegisterPrefs(registry); |
| 263 | 287 |
| 264 RegisterInstallerFileMetricsPreferences(registry); | 288 RegisterFileMetricsPreferences(registry); |
| 265 | 289 |
| 266 metrics::RegisterMetricsReportingStatePrefs(registry); | 290 metrics::RegisterMetricsReportingStatePrefs(registry); |
| 267 | 291 |
| 268 #if BUILDFLAG(ANDROID_JAVA_UI) | 292 #if BUILDFLAG(ANDROID_JAVA_UI) |
| 269 AndroidMetricsProvider::RegisterPrefs(registry); | 293 AndroidMetricsProvider::RegisterPrefs(registry); |
| 270 #endif // BUILDFLAG(ANDROID_JAVA_UI) | 294 #endif // BUILDFLAG(ANDROID_JAVA_UI) |
| 271 | 295 |
| 272 #if defined(ENABLE_PLUGINS) | 296 #if defined(ENABLE_PLUGINS) |
| 273 PluginMetricsProvider::RegisterPrefs(registry); | 297 PluginMetricsProvider::RegisterPrefs(registry); |
| 274 #endif // defined(ENABLE_PLUGINS) | 298 #endif // defined(ENABLE_PLUGINS) |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 425 std::unique_ptr<metrics::MetricsProvider>( | 449 std::unique_ptr<metrics::MetricsProvider>( |
| 426 new ChromeStabilityMetricsProvider( | 450 new ChromeStabilityMetricsProvider( |
| 427 g_browser_process->local_state()))); | 451 g_browser_process->local_state()))); |
| 428 metrics_service_->RegisterMetricsProvider( | 452 metrics_service_->RegisterMetricsProvider( |
| 429 std::unique_ptr<metrics::MetricsProvider>( | 453 std::unique_ptr<metrics::MetricsProvider>( |
| 430 new metrics::GPUMetricsProvider)); | 454 new metrics::GPUMetricsProvider)); |
| 431 metrics_service_->RegisterMetricsProvider( | 455 metrics_service_->RegisterMetricsProvider( |
| 432 std::unique_ptr<metrics::MetricsProvider>( | 456 std::unique_ptr<metrics::MetricsProvider>( |
| 433 new metrics::ScreenInfoMetricsProvider)); | 457 new metrics::ScreenInfoMetricsProvider)); |
| 434 | 458 |
| 435 metrics_service_->RegisterMetricsProvider(CreateInstallerFileMetricsProvider( | 459 metrics_service_->RegisterMetricsProvider(CreateFileMetricsProvider( |
| 436 ChromeMetricsServiceAccessor::IsMetricsAndCrashReportingEnabled())); | 460 ChromeMetricsServiceAccessor::IsMetricsAndCrashReportingEnabled())); |
| 437 | 461 |
| 438 drive_metrics_provider_ = new metrics::DriveMetricsProvider( | 462 drive_metrics_provider_ = new metrics::DriveMetricsProvider( |
| 439 content::BrowserThread::GetTaskRunnerForThread( | 463 content::BrowserThread::GetTaskRunnerForThread( |
| 440 content::BrowserThread::FILE), | 464 content::BrowserThread::FILE), |
| 441 chrome::FILE_LOCAL_STATE); | 465 chrome::FILE_LOCAL_STATE); |
| 442 metrics_service_->RegisterMetricsProvider( | 466 metrics_service_->RegisterMetricsProvider( |
| 443 std::unique_ptr<metrics::MetricsProvider>(drive_metrics_provider_)); | 467 std::unique_ptr<metrics::MetricsProvider>(drive_metrics_provider_)); |
| 444 | 468 |
| 445 profiler_metrics_provider_ = new metrics::ProfilerMetricsProvider( | 469 profiler_metrics_provider_ = new metrics::ProfilerMetricsProvider( |
| (...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 785 } | 809 } |
| 786 } | 810 } |
| 787 | 811 |
| 788 void ChromeMetricsServiceClient::OnURLOpenedFromOmnibox(OmniboxLog* log) { | 812 void ChromeMetricsServiceClient::OnURLOpenedFromOmnibox(OmniboxLog* log) { |
| 789 metrics_service_->OnApplicationNotIdle(); | 813 metrics_service_->OnApplicationNotIdle(); |
| 790 } | 814 } |
| 791 | 815 |
| 792 bool ChromeMetricsServiceClient::IsUMACellularUploadLogicEnabled() { | 816 bool ChromeMetricsServiceClient::IsUMACellularUploadLogicEnabled() { |
| 793 return metrics::IsCellularLogicEnabled(); | 817 return metrics::IsCellularLogicEnabled(); |
| 794 } | 818 } |
| OLD | NEW |