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