metrics_log.cc revision 513209b27ff55e2841eac0e4120199c23acce758
1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/metrics/metrics_log.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string> 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector> 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_util.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/perftimer.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/scoped_ptr.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/sys_info.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/third_party/nspr/prtime.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/time.h" 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h" 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autocomplete/autocomplete.h" 20513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/autocomplete/autocomplete_match.h" 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browser_process.h" 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/gpu_process_host.h" 233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/prefs/pref_service.h" 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_version_info.h" 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/logging_chrome.h" 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/pref_names.h" 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h" 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define OPEN_ELEMENT_FOR_SCOPE(name) ScopedElement scoped_element(this, name) 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// http://blogs.msdn.com/oldnewthing/archive/2004/10/25/247180.aspx 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN) 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochextern "C" IMAGE_DOS_HEADER __ImageBase; 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochMetricsLog::MetricsLog(const std::string& client_id, int session_id) 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : MetricsLogBase(client_id, session_id, MetricsLog::GetVersionString()) {} 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochMetricsLog::~MetricsLog() {} 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid MetricsLog::RegisterPrefs(PrefService* local_state) { 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch local_state->RegisterListPref(prefs::kStabilityPluginStats); 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint64 MetricsLog::GetIncrementalUptime(PrefService* pref) { 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::TimeTicks now = base::TimeTicks::Now(); 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static base::TimeTicks last_updated_time(now); 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 incremental_time = (now - last_updated_time).InSeconds(); 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch last_updated_time = now; 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (incremental_time > 0) { 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 metrics_uptime = pref->GetInt64(prefs::kUninstallMetricsUptimeSec); 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch metrics_uptime += incremental_time; 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pref->SetInt64(prefs::kUninstallMetricsUptimeSec, metrics_uptime); 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return incremental_time; 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::string MetricsLog::GetInstallDate() const { 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PrefService* pref = g_browser_process->local_state(); 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (pref) { 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return pref->GetString(prefs::kMetricsClientIDTimestamp); 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return "0"; 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::string MetricsLog::GetVersionString() { 733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick chrome::VersionInfo version_info; 743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!version_info.is_valid()) { 753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NOTREACHED() << "Unable to retrieve version info."; 763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return std::string(); 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string version = version_info.Version(); 803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!version_extension_.empty()) 813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick version += version_extension_; 823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!version_info.IsOfficialBuild()) 833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick version.append("-devel"); 843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return version; 853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 873345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickMetricsLog* MetricsLog::AsMetricsLog() { 883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return this; 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid MetricsLog::RecordIncrementalStabilityElements() { 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!locked_); 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PrefService* pref = g_browser_process->local_state(); 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(pref); 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OPEN_ELEMENT_FOR_SCOPE("profile"); 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteCommonEventAttributes(); 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteInstallElement(); // Supply appversion. 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OPEN_ELEMENT_FOR_SCOPE("stability"); // Minimal set of stability elements. 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteRequiredStabilityAttributes(pref); 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteRealtimeStabilityAttributes(pref); 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WritePluginStabilityElements(pref); 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid MetricsLog::WriteStabilityElement() { 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!locked_); 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PrefService* pref = g_browser_process->local_state(); 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(pref); 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Get stability attributes out of Local State, zeroing out stored values. 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // NOTE: This could lead to some data loss if this report isn't successfully 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // sent, but that's true for all the metrics. 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OPEN_ELEMENT_FOR_SCOPE("stability"); 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteRequiredStabilityAttributes(pref); 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteRealtimeStabilityAttributes(pref); 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(jar): The following are all optional, so we *could* optimize them for 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // values of zero (and not include them). 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("incompleteshutdowncount", 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pref->GetInteger( 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch prefs::kStabilityIncompleteSessionEndCount)); 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pref->SetInteger(prefs::kStabilityIncompleteSessionEndCount, 0); 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("breakpadregistrationok", 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pref->GetInteger(prefs::kStabilityBreakpadRegistrationSuccess)); 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pref->SetInteger(prefs::kStabilityBreakpadRegistrationSuccess, 0); 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("breakpadregistrationfail", 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pref->GetInteger(prefs::kStabilityBreakpadRegistrationFail)); 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pref->SetInteger(prefs::kStabilityBreakpadRegistrationFail, 0); 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("debuggerpresent", 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pref->GetInteger(prefs::kStabilityDebuggerPresent)); 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pref->SetInteger(prefs::kStabilityDebuggerPresent, 0); 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("debuggernotpresent", 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pref->GetInteger(prefs::kStabilityDebuggerNotPresent)); 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pref->SetInteger(prefs::kStabilityDebuggerNotPresent, 0); 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WritePluginStabilityElements(pref); 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid MetricsLog::WritePluginStabilityElements(PrefService* pref) { 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now log plugin stability info. 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const ListValue* plugin_stats_list = pref->GetList( 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch prefs::kStabilityPluginStats); 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (plugin_stats_list) { 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OPEN_ELEMENT_FOR_SCOPE("plugins"); 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (ListValue::const_iterator iter = plugin_stats_list->begin(); 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch iter != plugin_stats_list->end(); ++iter) { 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!(*iter)->IsType(Value::TYPE_DICTIONARY)) { 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch continue; 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DictionaryValue* plugin_dict = static_cast<DictionaryValue*>(*iter); 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string plugin_name; 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch plugin_dict->GetString(prefs::kStabilityPluginName, &plugin_name); 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OPEN_ELEMENT_FOR_SCOPE("pluginstability"); 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Use "filename" instead of "name", otherwise we need to update the 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // UMA servers. 1693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick WriteAttribute("filename", CreateBase64Hash(plugin_name)); 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int launches = 0; 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch plugin_dict->GetInteger(prefs::kStabilityPluginLaunches, &launches); 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("launchcount", launches); 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int instances = 0; 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch plugin_dict->GetInteger(prefs::kStabilityPluginInstances, &instances); 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("instancecount", instances); 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int crashes = 0; 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch plugin_dict->GetInteger(prefs::kStabilityPluginCrashes, &crashes); 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("crashcount", crashes); 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pref->ClearPref(prefs::kStabilityPluginStats); 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid MetricsLog::WriteRequiredStabilityAttributes(PrefService* pref) { 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The server refuses data that doesn't have certain values. crashcount and 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // launchcount are currently "required" in the "stability" group. 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("launchcount", 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pref->GetInteger(prefs::kStabilityLaunchCount)); 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pref->SetInteger(prefs::kStabilityLaunchCount, 0); 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("crashcount", 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pref->GetInteger(prefs::kStabilityCrashCount)); 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pref->SetInteger(prefs::kStabilityCrashCount, 0); 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid MetricsLog::WriteRealtimeStabilityAttributes(PrefService* pref) { 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Update the stats which are critical for real-time stability monitoring. 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Since these are "optional," only list ones that are non-zero, as the counts 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // are aggergated (summed) server side. 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int count = pref->GetInteger(prefs::kStabilityPageLoadCount); 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (count) { 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("pageloadcount", count); 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pref->SetInteger(prefs::kStabilityPageLoadCount, 0); 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch count = pref->GetInteger(prefs::kStabilityRendererCrashCount); 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (count) { 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("renderercrashcount", count); 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pref->SetInteger(prefs::kStabilityRendererCrashCount, 0); 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch count = pref->GetInteger(prefs::kStabilityExtensionRendererCrashCount); 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (count) { 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("extensionrenderercrashcount", count); 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pref->SetInteger(prefs::kStabilityExtensionRendererCrashCount, 0); 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch count = pref->GetInteger(prefs::kStabilityRendererHangCount); 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (count) { 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("rendererhangcount", count); 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pref->SetInteger(prefs::kStabilityRendererHangCount, 0); 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch count = pref->GetInteger(prefs::kStabilityChildProcessCrashCount); 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (count) { 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("childprocesscrashcount", count); 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pref->SetInteger(prefs::kStabilityChildProcessCrashCount, 0); 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 recent_duration = GetIncrementalUptime(pref); 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (recent_duration) 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteInt64Attribute("uptimesec", recent_duration); 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid MetricsLog::WritePluginList( 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::vector<WebPluginInfo>& plugin_list) { 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!locked_); 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OPEN_ELEMENT_FOR_SCOPE("plugins"); 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (std::vector<WebPluginInfo>::const_iterator iter = plugin_list.begin(); 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch iter != plugin_list.end(); ++iter) { 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OPEN_ELEMENT_FOR_SCOPE("plugin"); 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Plugin name and filename are hashed for the privacy of those 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // testing unreleased new extensions. 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteAttribute("name", CreateBase64Hash(UTF16ToUTF8(iter->name))); 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteAttribute("filename", 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CreateBase64Hash(WideToUTF8(iter->path.BaseName().ToWStringHack()))); 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteAttribute("version", UTF16ToUTF8(iter->version)); 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid MetricsLog::WriteInstallElement() { 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OPEN_ELEMENT_FOR_SCOPE("install"); 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteAttribute("installdate", GetInstallDate()); 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("buildid", 0); // We're using appversion instead. 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid MetricsLog::RecordEnvironment( 265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::vector<WebPluginInfo>& plugin_list, 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const DictionaryValue* profile_metrics) { 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!locked_); 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PrefService* pref = g_browser_process->local_state(); 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OPEN_ELEMENT_FOR_SCOPE("profile"); 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteCommonEventAttributes(); 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteInstallElement(); 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WritePluginList(plugin_list); 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteStabilityElement(); 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OPEN_ELEMENT_FOR_SCOPE("cpu"); 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteAttribute("arch", base::SysInfo::CPUArchitecture()); 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OPEN_ELEMENT_FOR_SCOPE("memory"); 287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("mb", base::SysInfo::AmountOfPhysicalMemoryMB()); 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN) 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("dllbase", reinterpret_cast<int>(&__ImageBase)); 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OPEN_ELEMENT_FOR_SCOPE("os"); 295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteAttribute("name", 296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::SysInfo::OperatingSystemName()); 297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteAttribute("version", 298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::SysInfo::OperatingSystemVersion()); 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OPEN_ELEMENT_FOR_SCOPE("gpu"); 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("vendorid", 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GpuProcessHost::Get()->gpu_info().vendor_id()); 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("deviceid", 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GpuProcessHost::Get()->gpu_info().device_id()); 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OPEN_ELEMENT_FOR_SCOPE("display"); 311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int width = 0; 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int height = 0; 313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::SysInfo::GetPrimaryDisplayDimensions(&width, &height); 314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("xsize", width); 315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("ysize", height); 316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("screens", base::SysInfo::DisplayCount()); 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OPEN_ELEMENT_FOR_SCOPE("bookmarks"); 321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int num_bookmarks_on_bookmark_bar = 322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pref->GetInteger(prefs::kNumBookmarksOnBookmarkBar); 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int num_folders_on_bookmark_bar = 324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pref->GetInteger(prefs::kNumFoldersOnBookmarkBar); 325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int num_bookmarks_in_other_bookmarks_folder = 326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pref->GetInteger(prefs::kNumBookmarksInOtherBookmarkFolder); 327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int num_folders_in_other_bookmarks_folder = 328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pref->GetInteger(prefs::kNumFoldersInOtherBookmarkFolder); 329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OPEN_ELEMENT_FOR_SCOPE("bookmarklocation"); 331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteAttribute("name", "full-tree"); 332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("foldercount", 333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch num_folders_on_bookmark_bar + num_folders_in_other_bookmarks_folder); 334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("itemcount", 335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch num_bookmarks_on_bookmark_bar + 336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch num_bookmarks_in_other_bookmarks_folder); 337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OPEN_ELEMENT_FOR_SCOPE("bookmarklocation"); 340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteAttribute("name", "toolbar"); 341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("foldercount", num_folders_on_bookmark_bar); 342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("itemcount", num_bookmarks_on_bookmark_bar); 343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OPEN_ELEMENT_FOR_SCOPE("keywords"); 348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("count", pref->GetInteger(prefs::kNumKeywords)); 349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (profile_metrics) 352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteAllProfilesMetrics(*profile_metrics); 353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid MetricsLog::WriteAllProfilesMetrics( 356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const DictionaryValue& all_profiles_metrics) { 3573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const std::string profile_prefix(prefs::kProfilePrefix); 358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (DictionaryValue::key_iterator i = all_profiles_metrics.begin_keys(); 359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch i != all_profiles_metrics.end_keys(); ++i) { 3603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const std::string& key_name = *i; 361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (key_name.compare(0, profile_prefix.size(), profile_prefix) == 0) { 362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DictionaryValue* profile; 363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (all_profiles_metrics.GetDictionaryWithoutPathExpansion(key_name, 364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &profile)) 365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteProfileMetrics(key_name.substr(profile_prefix.size()), *profile); 366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid MetricsLog::WriteProfileMetrics(const std::string& profileidhash, 371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const DictionaryValue& profile_metrics) { 372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OPEN_ELEMENT_FOR_SCOPE("userprofile"); 3733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick WriteAttribute("profileidhash", profileidhash); 374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (DictionaryValue::key_iterator i = profile_metrics.begin_keys(); 375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch i != profile_metrics.end_keys(); ++i) { 376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Value* value; 377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (profile_metrics.GetWithoutPathExpansion(*i, &value)) { 3783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(*i != "id"); 379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch switch (value->GetType()) { 380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case Value::TYPE_STRING: { 381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string string_value; 382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (value->GetAsString(&string_value)) { 383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OPEN_ELEMENT_FOR_SCOPE("profileparam"); 3843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick WriteAttribute("name", *i); 385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteAttribute("value", string_value); 386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case Value::TYPE_BOOLEAN: { 391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool bool_value; 392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (value->GetAsBoolean(&bool_value)) { 393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OPEN_ELEMENT_FOR_SCOPE("profileparam"); 3943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick WriteAttribute("name", *i); 395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("value", bool_value ? 1 : 0); 396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case Value::TYPE_INTEGER: { 401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int int_value; 402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (value->GetAsInteger(&int_value)) { 403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OPEN_ELEMENT_FOR_SCOPE("profileparam"); 4043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick WriteAttribute("name", *i); 405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("value", int_value); 406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch default: 411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid MetricsLog::RecordOmniboxOpenedURL(const AutocompleteLog& log) { 419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!locked_); 420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OPEN_ELEMENT_FOR_SCOPE("uielement"); 422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteAttribute("action", "autocomplete"); 423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteAttribute("targetidhash", ""); 424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(kochi): Properly track windows. 425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("window", 0); 426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteCommonEventAttributes(); 427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OPEN_ELEMENT_FOR_SCOPE("autocomplete"); 430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("typedlength", static_cast<int>(log.text.length())); 432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("selectedindex", static_cast<int>(log.selected_index)); 433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("completedlength", 434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static_cast<int>(log.inline_autocompleted_length)); 435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string input_type( 436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutocompleteInput::TypeToString(log.input_type)); 437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!input_type.empty()) 438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteAttribute("inputtype", input_type); 439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (AutocompleteResult::const_iterator i(log.result.begin()); 441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch i != log.result.end(); ++i) { 442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OPEN_ELEMENT_FOR_SCOPE("autocompleteitem"); 443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (i->provider) 444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteAttribute("provider", i->provider->name()); 445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string result_type(AutocompleteMatch::TypeToString(i->type)); 446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!result_type.empty()) 447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteAttribute("resulttype", result_type); 448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("relevance", i->relevance); 449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteIntAttribute("isstarred", i->starred ? 1 : 0); 450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ++num_events_; 454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 455