| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/metrics_log.h" | 5 #include "chrome/browser/metrics/metrics_log.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 #include "base/strings/string_number_conversions.h" | 21 #include "base/strings/string_number_conversions.h" |
| 22 #include "base/strings/string_util.h" | 22 #include "base/strings/string_util.h" |
| 23 #include "base/strings/utf_string_conversions.h" | 23 #include "base/strings/utf_string_conversions.h" |
| 24 #include "base/sys_info.h" | 24 #include "base/sys_info.h" |
| 25 #include "base/third_party/nspr/prtime.h" | 25 #include "base/third_party/nspr/prtime.h" |
| 26 #include "base/time/time.h" | 26 #include "base/time/time.h" |
| 27 #include "base/tracked_objects.h" | 27 #include "base/tracked_objects.h" |
| 28 #include "chrome/browser/browser_process.h" | 28 #include "chrome/browser/browser_process.h" |
| 29 #include "chrome/browser/google/google_util.h" | 29 #include "chrome/browser/google/google_util.h" |
| 30 #include "chrome/browser/metrics/extension_metrics.h" | 30 #include "chrome/browser/metrics/extension_metrics.h" |
| 31 #include "chrome/browser/plugins/plugin_prefs.h" | |
| 32 #include "chrome/browser/profiles/profile_manager.h" | |
| 33 #include "chrome/common/chrome_version_info.h" | 31 #include "chrome/common/chrome_version_info.h" |
| 34 #include "chrome/common/pref_names.h" | 32 #include "chrome/common/pref_names.h" |
| 35 #include "components/metrics/metrics_provider.h" | 33 #include "components/metrics/metrics_provider.h" |
| 36 #include "components/metrics/proto/profiler_event.pb.h" | 34 #include "components/metrics/proto/profiler_event.pb.h" |
| 37 #include "components/metrics/proto/system_profile.pb.h" | 35 #include "components/metrics/proto/system_profile.pb.h" |
| 38 #include "components/nacl/common/nacl_process_type.h" | 36 #include "components/nacl/common/nacl_process_type.h" |
| 39 #include "components/variations/active_field_trials.h" | 37 #include "components/variations/active_field_trials.h" |
| 40 #include "content/public/browser/gpu_data_manager.h" | 38 #include "content/public/browser/gpu_data_manager.h" |
| 41 #include "content/public/common/content_client.h" | 39 #include "content/public/common/content_client.h" |
| 42 #include "content/public/common/webplugininfo.h" | |
| 43 #include "gpu/config/gpu_info.h" | 40 #include "gpu/config/gpu_info.h" |
| 44 #include "ui/gfx/screen.h" | 41 #include "ui/gfx/screen.h" |
| 45 #include "url/gurl.h" | 42 #include "url/gurl.h" |
| 46 | 43 |
| 47 #if defined(OS_ANDROID) | 44 #if defined(OS_ANDROID) |
| 48 #include "base/android/build_info.h" | 45 #include "base/android/build_info.h" |
| 49 #endif | 46 #endif |
| 50 | 47 |
| 51 #if defined(OS_WIN) | 48 #if defined(OS_WIN) |
| 52 #include "base/win/metro.h" | 49 #include "base/win/metro.h" |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 130 return SystemProfileProto::CHANNEL_UNKNOWN; | 127 return SystemProfileProto::CHANNEL_UNKNOWN; |
| 131 } | 128 } |
| 132 } | 129 } |
| 133 | 130 |
| 134 // Computes a SHA-1 hash of |data| and returns it as a hex string. | 131 // Computes a SHA-1 hash of |data| and returns it as a hex string. |
| 135 std::string ComputeSHA1(const std::string& data) { | 132 std::string ComputeSHA1(const std::string& data) { |
| 136 const std::string sha1 = base::SHA1HashString(data); | 133 const std::string sha1 = base::SHA1HashString(data); |
| 137 return base::HexEncode(sha1.data(), sha1.size()); | 134 return base::HexEncode(sha1.data(), sha1.size()); |
| 138 } | 135 } |
| 139 | 136 |
| 140 #if defined(ENABLE_PLUGINS) | |
| 141 // Returns the plugin preferences corresponding for this user, if available. | |
| 142 // If multiple user profiles are loaded, returns the preferences corresponding | |
| 143 // to an arbitrary one of the profiles. | |
| 144 PluginPrefs* GetPluginPrefs() { | |
| 145 ProfileManager* profile_manager = g_browser_process->profile_manager(); | |
| 146 | |
| 147 if (!profile_manager) { | |
| 148 // The profile manager can be NULL when testing. | |
| 149 return NULL; | |
| 150 } | |
| 151 | |
| 152 std::vector<Profile*> profiles = profile_manager->GetLoadedProfiles(); | |
| 153 if (profiles.empty()) | |
| 154 return NULL; | |
| 155 | |
| 156 return PluginPrefs::GetForProfile(profiles.front()).get(); | |
| 157 } | |
| 158 | |
| 159 // Fills |plugin| with the info contained in |plugin_info| and |plugin_prefs|. | |
| 160 void SetPluginInfo(const content::WebPluginInfo& plugin_info, | |
| 161 const PluginPrefs* plugin_prefs, | |
| 162 SystemProfileProto::Plugin* plugin) { | |
| 163 plugin->set_name(base::UTF16ToUTF8(plugin_info.name)); | |
| 164 plugin->set_filename(plugin_info.path.BaseName().AsUTF8Unsafe()); | |
| 165 plugin->set_version(base::UTF16ToUTF8(plugin_info.version)); | |
| 166 plugin->set_is_pepper(plugin_info.is_pepper_plugin()); | |
| 167 if (plugin_prefs) | |
| 168 plugin->set_is_disabled(!plugin_prefs->IsPluginEnabled(plugin_info)); | |
| 169 } | |
| 170 #endif // defined(ENABLE_PLUGINS) | |
| 171 | |
| 172 void WriteFieldTrials(const std::vector<ActiveGroupId>& field_trial_ids, | 137 void WriteFieldTrials(const std::vector<ActiveGroupId>& field_trial_ids, |
| 173 SystemProfileProto* system_profile) { | 138 SystemProfileProto* system_profile) { |
| 174 for (std::vector<ActiveGroupId>::const_iterator it = | 139 for (std::vector<ActiveGroupId>::const_iterator it = |
| 175 field_trial_ids.begin(); it != field_trial_ids.end(); ++it) { | 140 field_trial_ids.begin(); it != field_trial_ids.end(); ++it) { |
| 176 SystemProfileProto::FieldTrial* field_trial = | 141 SystemProfileProto::FieldTrial* field_trial = |
| 177 system_profile->add_field_trial(); | 142 system_profile->add_field_trial(); |
| 178 field_trial->set_name_id(it->name); | 143 field_trial->set_name_id(it->name); |
| 179 field_trial->set_group_id(it->group); | 144 field_trial->set_group_id(it->group); |
| 180 } | 145 } |
| 181 } | 146 } |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 295 AsProtobufChannel(chrome::VersionInfo::GetChannel())); | 260 AsProtobufChannel(chrome::VersionInfo::GetChannel())); |
| 296 | 261 |
| 297 #if defined(OS_CHROMEOS) | 262 #if defined(OS_CHROMEOS) |
| 298 metrics_log_chromeos_.reset(new MetricsLogChromeOS(uma_proto())); | 263 metrics_log_chromeos_.reset(new MetricsLogChromeOS(uma_proto())); |
| 299 #endif // OS_CHROMEOS | 264 #endif // OS_CHROMEOS |
| 300 } | 265 } |
| 301 | 266 |
| 302 MetricsLog::~MetricsLog() {} | 267 MetricsLog::~MetricsLog() {} |
| 303 | 268 |
| 304 // static | 269 // static |
| 305 void MetricsLog::RegisterPrefs(PrefRegistrySimple* registry) { | |
| 306 registry->RegisterListPref(prefs::kStabilityPluginStats); | |
| 307 } | |
| 308 | |
| 309 // static | |
| 310 std::string MetricsLog::GetVersionString() { | 270 std::string MetricsLog::GetVersionString() { |
| 311 chrome::VersionInfo version_info; | 271 chrome::VersionInfo version_info; |
| 312 if (!version_info.is_valid()) { | 272 if (!version_info.is_valid()) { |
| 313 NOTREACHED() << "Unable to retrieve version info."; | 273 NOTREACHED() << "Unable to retrieve version info."; |
| 314 return std::string(); | 274 return std::string(); |
| 315 } | 275 } |
| 316 | 276 |
| 317 std::string version = version_info.Version(); | 277 std::string version = version_info.Version(); |
| 318 if (!version_extension().empty()) | 278 if (!version_extension().empty()) |
| 319 version += version_extension(); | 279 version += version_extension(); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 341 DCHECK(!HasStabilityMetrics()); | 301 DCHECK(!HasStabilityMetrics()); |
| 342 | 302 |
| 343 PrefService* pref = GetPrefService(); | 303 PrefService* pref = GetPrefService(); |
| 344 DCHECK(pref); | 304 DCHECK(pref); |
| 345 | 305 |
| 346 // Get stability attributes out of Local State, zeroing out stored values. | 306 // Get stability attributes out of Local State, zeroing out stored values. |
| 347 // NOTE: This could lead to some data loss if this report isn't successfully | 307 // NOTE: This could lead to some data loss if this report isn't successfully |
| 348 // sent, but that's true for all the metrics. | 308 // sent, but that's true for all the metrics. |
| 349 | 309 |
| 350 WriteRequiredStabilityAttributes(pref); | 310 WriteRequiredStabilityAttributes(pref); |
| 351 WritePluginStabilityElements(pref); | |
| 352 | 311 |
| 353 // Record recent delta for critical stability metrics. We can't wait for a | 312 // Record recent delta for critical stability metrics. We can't wait for a |
| 354 // restart to gather these, as that delay biases our observation away from | 313 // restart to gather these, as that delay biases our observation away from |
| 355 // users that run happily for a looooong time. We send increments with each | 314 // users that run happily for a looooong time. We send increments with each |
| 356 // uma log upload, just as we send histogram data. | 315 // uma log upload, just as we send histogram data. |
| 357 WriteRealtimeStabilityAttributes(pref, incremental_uptime, uptime); | 316 WriteRealtimeStabilityAttributes(pref, incremental_uptime, uptime); |
| 358 | 317 |
| 359 SystemProfileProto::Stability* stability = | 318 SystemProfileProto* system_profile = uma_proto()->mutable_system_profile(); |
| 360 uma_proto()->mutable_system_profile()->mutable_stability(); | |
| 361 for (size_t i = 0; i < metrics_providers.size(); ++i) | 319 for (size_t i = 0; i < metrics_providers.size(); ++i) |
| 362 metrics_providers[i]->ProvideStabilityMetrics(stability); | 320 metrics_providers[i]->ProvideStabilityMetrics(system_profile); |
| 363 | 321 |
| 364 // Omit some stats unless this is the initial stability log. | 322 // Omit some stats unless this is the initial stability log. |
| 365 if (log_type() != INITIAL_STABILITY_LOG) | 323 if (log_type() != INITIAL_STABILITY_LOG) |
| 366 return; | 324 return; |
| 367 | 325 |
| 368 int incomplete_shutdown_count = | 326 int incomplete_shutdown_count = |
| 369 pref->GetInteger(prefs::kStabilityIncompleteSessionEndCount); | 327 pref->GetInteger(prefs::kStabilityIncompleteSessionEndCount); |
| 370 pref->SetInteger(prefs::kStabilityIncompleteSessionEndCount, 0); | 328 pref->SetInteger(prefs::kStabilityIncompleteSessionEndCount, 0); |
| 371 int breakpad_registration_success_count = | 329 int breakpad_registration_success_count = |
| 372 pref->GetInteger(prefs::kStabilityBreakpadRegistrationSuccess); | 330 pref->GetInteger(prefs::kStabilityBreakpadRegistrationSuccess); |
| 373 pref->SetInteger(prefs::kStabilityBreakpadRegistrationSuccess, 0); | 331 pref->SetInteger(prefs::kStabilityBreakpadRegistrationSuccess, 0); |
| 374 int breakpad_registration_failure_count = | 332 int breakpad_registration_failure_count = |
| 375 pref->GetInteger(prefs::kStabilityBreakpadRegistrationFail); | 333 pref->GetInteger(prefs::kStabilityBreakpadRegistrationFail); |
| 376 pref->SetInteger(prefs::kStabilityBreakpadRegistrationFail, 0); | 334 pref->SetInteger(prefs::kStabilityBreakpadRegistrationFail, 0); |
| 377 int debugger_present_count = | 335 int debugger_present_count = |
| 378 pref->GetInteger(prefs::kStabilityDebuggerPresent); | 336 pref->GetInteger(prefs::kStabilityDebuggerPresent); |
| 379 pref->SetInteger(prefs::kStabilityDebuggerPresent, 0); | 337 pref->SetInteger(prefs::kStabilityDebuggerPresent, 0); |
| 380 int debugger_not_present_count = | 338 int debugger_not_present_count = |
| 381 pref->GetInteger(prefs::kStabilityDebuggerNotPresent); | 339 pref->GetInteger(prefs::kStabilityDebuggerNotPresent); |
| 382 pref->SetInteger(prefs::kStabilityDebuggerNotPresent, 0); | 340 pref->SetInteger(prefs::kStabilityDebuggerNotPresent, 0); |
| 383 | 341 |
| 384 // TODO(jar): The following are all optional, so we *could* optimize them for | 342 // TODO(jar): The following are all optional, so we *could* optimize them for |
| 385 // values of zero (and not include them). | 343 // values of zero (and not include them). |
| 344 SystemProfileProto::Stability* stability = |
| 345 system_profile->mutable_stability(); |
| 386 stability->set_incomplete_shutdown_count(incomplete_shutdown_count); | 346 stability->set_incomplete_shutdown_count(incomplete_shutdown_count); |
| 387 stability->set_breakpad_registration_success_count( | 347 stability->set_breakpad_registration_success_count( |
| 388 breakpad_registration_success_count); | 348 breakpad_registration_success_count); |
| 389 stability->set_breakpad_registration_failure_count( | 349 stability->set_breakpad_registration_failure_count( |
| 390 breakpad_registration_failure_count); | 350 breakpad_registration_failure_count); |
| 391 stability->set_debugger_present_count(debugger_present_count); | 351 stability->set_debugger_present_count(debugger_present_count); |
| 392 stability->set_debugger_not_present_count(debugger_not_present_count); | 352 stability->set_debugger_not_present_count(debugger_not_present_count); |
| 393 } | 353 } |
| 394 | 354 |
| 395 void MetricsLog::RecordGeneralMetrics( | 355 void MetricsLog::RecordGeneralMetrics( |
| (...skipping 26 matching lines...) Expand all Loading... |
| 422 } | 382 } |
| 423 | 383 |
| 424 bool MetricsLog::HasEnvironment() const { | 384 bool MetricsLog::HasEnvironment() const { |
| 425 return uma_proto()->system_profile().has_uma_enabled_date(); | 385 return uma_proto()->system_profile().has_uma_enabled_date(); |
| 426 } | 386 } |
| 427 | 387 |
| 428 bool MetricsLog::HasStabilityMetrics() const { | 388 bool MetricsLog::HasStabilityMetrics() const { |
| 429 return uma_proto()->system_profile().stability().has_launch_count(); | 389 return uma_proto()->system_profile().stability().has_launch_count(); |
| 430 } | 390 } |
| 431 | 391 |
| 432 void MetricsLog::WritePluginStabilityElements(PrefService* pref) { | |
| 433 // Now log plugin stability info. | |
| 434 const base::ListValue* plugin_stats_list = pref->GetList( | |
| 435 prefs::kStabilityPluginStats); | |
| 436 if (!plugin_stats_list) | |
| 437 return; | |
| 438 | |
| 439 #if defined(ENABLE_PLUGINS) | |
| 440 SystemProfileProto::Stability* stability = | |
| 441 uma_proto()->mutable_system_profile()->mutable_stability(); | |
| 442 for (base::ListValue::const_iterator iter = plugin_stats_list->begin(); | |
| 443 iter != plugin_stats_list->end(); ++iter) { | |
| 444 if (!(*iter)->IsType(base::Value::TYPE_DICTIONARY)) { | |
| 445 NOTREACHED(); | |
| 446 continue; | |
| 447 } | |
| 448 base::DictionaryValue* plugin_dict = | |
| 449 static_cast<base::DictionaryValue*>(*iter); | |
| 450 | |
| 451 // Note that this search is potentially a quadratic operation, but given the | |
| 452 // low number of plugins installed on a "reasonable" setup, this should be | |
| 453 // fine. | |
| 454 // TODO(isherman): Verify that this does not show up as a hotspot in | |
| 455 // profiler runs. | |
| 456 const SystemProfileProto::Plugin* system_profile_plugin = NULL; | |
| 457 std::string plugin_name; | |
| 458 plugin_dict->GetString(prefs::kStabilityPluginName, &plugin_name); | |
| 459 const SystemProfileProto& system_profile = uma_proto()->system_profile(); | |
| 460 for (int i = 0; i < system_profile.plugin_size(); ++i) { | |
| 461 if (system_profile.plugin(i).name() == plugin_name) { | |
| 462 system_profile_plugin = &system_profile.plugin(i); | |
| 463 break; | |
| 464 } | |
| 465 } | |
| 466 | |
| 467 if (!system_profile_plugin) { | |
| 468 NOTREACHED(); | |
| 469 continue; | |
| 470 } | |
| 471 | |
| 472 SystemProfileProto::Stability::PluginStability* plugin_stability = | |
| 473 stability->add_plugin_stability(); | |
| 474 *plugin_stability->mutable_plugin() = *system_profile_plugin; | |
| 475 | |
| 476 int launches = 0; | |
| 477 plugin_dict->GetInteger(prefs::kStabilityPluginLaunches, &launches); | |
| 478 if (launches > 0) | |
| 479 plugin_stability->set_launch_count(launches); | |
| 480 | |
| 481 int instances = 0; | |
| 482 plugin_dict->GetInteger(prefs::kStabilityPluginInstances, &instances); | |
| 483 if (instances > 0) | |
| 484 plugin_stability->set_instance_count(instances); | |
| 485 | |
| 486 int crashes = 0; | |
| 487 plugin_dict->GetInteger(prefs::kStabilityPluginCrashes, &crashes); | |
| 488 if (crashes > 0) | |
| 489 plugin_stability->set_crash_count(crashes); | |
| 490 | |
| 491 int loading_errors = 0; | |
| 492 plugin_dict->GetInteger(prefs::kStabilityPluginLoadingErrors, | |
| 493 &loading_errors); | |
| 494 if (loading_errors > 0) | |
| 495 plugin_stability->set_loading_error_count(loading_errors); | |
| 496 } | |
| 497 #endif // defined(ENABLE_PLUGINS) | |
| 498 | |
| 499 pref->ClearPref(prefs::kStabilityPluginStats); | |
| 500 } | |
| 501 | |
| 502 // The server refuses data that doesn't have certain values. crashcount and | 392 // The server refuses data that doesn't have certain values. crashcount and |
| 503 // launchcount are currently "required" in the "stability" group. | 393 // launchcount are currently "required" in the "stability" group. |
| 504 // TODO(isherman): Stop writing these attributes specially once the migration to | 394 // TODO(isherman): Stop writing these attributes specially once the migration to |
| 505 // protobufs is complete. | 395 // protobufs is complete. |
| 506 void MetricsLog::WriteRequiredStabilityAttributes(PrefService* pref) { | 396 void MetricsLog::WriteRequiredStabilityAttributes(PrefService* pref) { |
| 507 int launch_count = pref->GetInteger(prefs::kStabilityLaunchCount); | 397 int launch_count = pref->GetInteger(prefs::kStabilityLaunchCount); |
| 508 pref->SetInteger(prefs::kStabilityLaunchCount, 0); | 398 pref->SetInteger(prefs::kStabilityLaunchCount, 0); |
| 509 int crash_count = pref->GetInteger(prefs::kStabilityCrashCount); | 399 int crash_count = pref->GetInteger(prefs::kStabilityCrashCount); |
| 510 pref->SetInteger(prefs::kStabilityCrashCount, 0); | 400 pref->SetInteger(prefs::kStabilityCrashCount, 0); |
| 511 | 401 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 560 #endif // OS_CHROMEOS | 450 #endif // OS_CHROMEOS |
| 561 | 451 |
| 562 const uint64 incremental_uptime_sec = incremental_uptime.InSeconds(); | 452 const uint64 incremental_uptime_sec = incremental_uptime.InSeconds(); |
| 563 if (incremental_uptime_sec) | 453 if (incremental_uptime_sec) |
| 564 stability->set_incremental_uptime_sec(incremental_uptime_sec); | 454 stability->set_incremental_uptime_sec(incremental_uptime_sec); |
| 565 const uint64 uptime_sec = uptime.InSeconds(); | 455 const uint64 uptime_sec = uptime.InSeconds(); |
| 566 if (uptime_sec) | 456 if (uptime_sec) |
| 567 stability->set_uptime_sec(uptime_sec); | 457 stability->set_uptime_sec(uptime_sec); |
| 568 } | 458 } |
| 569 | 459 |
| 570 void MetricsLog::WritePluginList( | |
| 571 const std::vector<content::WebPluginInfo>& plugin_list) { | |
| 572 DCHECK(!locked()); | |
| 573 | |
| 574 #if defined(ENABLE_PLUGINS) | |
| 575 PluginPrefs* plugin_prefs = GetPluginPrefs(); | |
| 576 SystemProfileProto* system_profile = uma_proto()->mutable_system_profile(); | |
| 577 for (std::vector<content::WebPluginInfo>::const_iterator iter = | |
| 578 plugin_list.begin(); | |
| 579 iter != plugin_list.end(); ++iter) { | |
| 580 SystemProfileProto::Plugin* plugin = system_profile->add_plugin(); | |
| 581 SetPluginInfo(*iter, plugin_prefs, plugin); | |
| 582 } | |
| 583 #endif // defined(ENABLE_PLUGINS) | |
| 584 } | |
| 585 | |
| 586 void MetricsLog::RecordEnvironment( | 460 void MetricsLog::RecordEnvironment( |
| 587 const std::vector<metrics::MetricsProvider*>& metrics_providers, | 461 const std::vector<metrics::MetricsProvider*>& metrics_providers, |
| 588 const std::vector<content::WebPluginInfo>& plugin_list, | |
| 589 const std::vector<variations::ActiveGroupId>& synthetic_trials) { | 462 const std::vector<variations::ActiveGroupId>& synthetic_trials) { |
| 590 DCHECK(!HasEnvironment()); | 463 DCHECK(!HasEnvironment()); |
| 591 | 464 |
| 592 SystemProfileProto* system_profile = uma_proto()->mutable_system_profile(); | 465 SystemProfileProto* system_profile = uma_proto()->mutable_system_profile(); |
| 593 | 466 |
| 594 std::string brand_code; | 467 std::string brand_code; |
| 595 if (google_util::GetBrand(&brand_code)) | 468 if (google_util::GetBrand(&brand_code)) |
| 596 system_profile->set_brand_code(brand_code); | 469 system_profile->set_brand_code(brand_code); |
| 597 | 470 |
| 598 int enabled_date; | 471 int enabled_date; |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 669 const gfx::Size display_size = GetScreenSize(); | 542 const gfx::Size display_size = GetScreenSize(); |
| 670 hardware->set_primary_screen_width(display_size.width()); | 543 hardware->set_primary_screen_width(display_size.width()); |
| 671 hardware->set_primary_screen_height(display_size.height()); | 544 hardware->set_primary_screen_height(display_size.height()); |
| 672 hardware->set_primary_screen_scale_factor(GetScreenDeviceScaleFactor()); | 545 hardware->set_primary_screen_scale_factor(GetScreenDeviceScaleFactor()); |
| 673 hardware->set_screen_count(GetScreenCount()); | 546 hardware->set_screen_count(GetScreenCount()); |
| 674 | 547 |
| 675 #if defined(OS_WIN) | 548 #if defined(OS_WIN) |
| 676 WriteScreenDPIInformationProto(hardware); | 549 WriteScreenDPIInformationProto(hardware); |
| 677 #endif | 550 #endif |
| 678 | 551 |
| 679 WritePluginList(plugin_list); | |
| 680 extension_metrics_.WriteExtensionList(uma_proto()->mutable_system_profile()); | 552 extension_metrics_.WriteExtensionList(uma_proto()->mutable_system_profile()); |
| 681 | 553 |
| 682 std::vector<ActiveGroupId> field_trial_ids; | 554 std::vector<ActiveGroupId> field_trial_ids; |
| 683 GetFieldTrialIds(&field_trial_ids); | 555 GetFieldTrialIds(&field_trial_ids); |
| 684 WriteFieldTrials(field_trial_ids, system_profile); | 556 WriteFieldTrials(field_trial_ids, system_profile); |
| 685 WriteFieldTrials(synthetic_trials, system_profile); | 557 WriteFieldTrials(synthetic_trials, system_profile); |
| 686 | 558 |
| 687 #if defined(OS_CHROMEOS) | 559 #if defined(OS_CHROMEOS) |
| 688 metrics_log_chromeos_->LogChromeOSMetrics(); | 560 metrics_log_chromeos_->LogChromeOSMetrics(); |
| 689 #endif // OS_CHROMEOS | 561 #endif // OS_CHROMEOS |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 739 profile = uma_proto()->add_profiler_event(); | 611 profile = uma_proto()->add_profiler_event(); |
| 740 profile->set_profile_type(ProfilerEventProto::STARTUP_PROFILE); | 612 profile->set_profile_type(ProfilerEventProto::STARTUP_PROFILE); |
| 741 profile->set_time_source(ProfilerEventProto::WALL_CLOCK_TIME); | 613 profile->set_time_source(ProfilerEventProto::WALL_CLOCK_TIME); |
| 742 } else { | 614 } else { |
| 743 // For the remaining calls, re-use the existing field. | 615 // For the remaining calls, re-use the existing field. |
| 744 profile = uma_proto()->mutable_profiler_event(0); | 616 profile = uma_proto()->mutable_profiler_event(0); |
| 745 } | 617 } |
| 746 | 618 |
| 747 WriteProfilerData(process_data, process_type, profile); | 619 WriteProfilerData(process_data, process_type, profile); |
| 748 } | 620 } |
| OLD | NEW |