OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 // This file defines a service that collects information about the user | |
6 // experience in order to help improve future versions of the app. | |
7 | |
8 #ifndef CHROME_FRAME_METRICS_SERVICE_H_ | |
9 #define CHROME_FRAME_METRICS_SERVICE_H_ | |
10 | |
11 #include <map> | |
12 #include <string> | |
13 | |
14 #include "base/basictypes.h" | |
15 #include "base/lazy_instance.h" | |
16 #include "base/memory/scoped_ptr.h" | |
17 #include "base/metrics/histogram.h" | |
18 #include "base/synchronization/lock.h" | |
19 #include "base/threading/platform_thread.h" | |
20 #include "base/threading/thread_local.h" | |
21 #include "chrome/common/metrics/metrics_service_base.h" | |
22 | |
23 // TODO(ananta) | |
24 // Refactor more common code from chrome/browser/metrics/metrics_service.h into | |
25 // the MetricsServiceBase class. | |
26 class MetricsService : public MetricsServiceBase { | |
27 public: | |
28 static MetricsService* GetInstance(); | |
29 // Start/stop the metrics recording and uploading machine. These should be | |
30 // used on startup and when the user clicks the checkbox in the prefs. | |
31 static void Start(); | |
32 static void Stop(); | |
33 // Set up client ID, session ID, etc. | |
34 void InitializeMetricsState(); | |
35 | |
36 // Retrieves a client ID to use to identify self to metrics server. | |
37 static const std::string& GetClientID(); | |
38 | |
39 private: | |
40 MetricsService(); | |
41 virtual ~MetricsService(); | |
42 // The MetricsService has a lifecycle that is stored as a state. | |
43 // See metrics_service.cc for description of this lifecycle. | |
44 enum State { | |
45 INITIALIZED, // Constructor was called. | |
46 ACTIVE, // Accumalating log data | |
47 STOPPED, // Service has stopped | |
48 }; | |
49 | |
50 // Sets and gets whether metrics recording is active. | |
51 // SetRecording(false) also forces a persistent save of logging state (if | |
52 // anything has been recorded, or transmitted). | |
53 void SetRecording(bool enabled); | |
54 | |
55 // Enable/disable transmission of accumulated logs and crash reports (dumps). | |
56 // Return value "true" indicates setting was definitively set as requested). | |
57 // Return value of "false" indicates that the enable state is effectively | |
58 // stuck in the other logical setting. | |
59 // Google Update maintains the authoritative preference in the registry, so | |
60 // the caller *might* not be able to actually change the setting. | |
61 // It is always possible to set this to at least one value, which matches the | |
62 // current value reported by querying Google Update. | |
63 void SetReporting(bool enabled); | |
64 | |
65 // If in_idle is true, sets idle_since_last_transmission to true. | |
66 // If in_idle is false and idle_since_last_transmission_ is true, sets | |
67 // idle_since_last_transmission to false and starts the timer (provided | |
68 // starting the timer is permitted). | |
69 void HandleIdleSinceLastTransmission(bool in_idle); | |
70 | |
71 // ChromeFrame UMA data is uploaded when this timer proc gets invoked. | |
72 static void CALLBACK TransmissionTimerProc(HWND window, unsigned int message, | |
73 unsigned int event_id, | |
74 unsigned int time); | |
75 | |
76 // Called to start recording user experience metrics. | |
77 // Constructs a new, empty current_log_. | |
78 void StartRecording(); | |
79 | |
80 // Called to stop recording user experience metrics. | |
81 void StopRecording(bool save_log); | |
82 | |
83 // Takes whatever log should be uploaded next (according to the state_) | |
84 // and makes it the pending log. If pending_log_ is not NULL, | |
85 // MakePendingLog does nothing and returns. | |
86 void MakePendingLog(); | |
87 | |
88 // Determines from state_ and permissions set out by the server and by | |
89 // the user whether the pending_log_ should be sent or discarded. Called by | |
90 // TryToStartTransmission. | |
91 bool TransmissionPermitted() const; | |
92 | |
93 bool recording_active() const { | |
94 return recording_active_; | |
95 } | |
96 | |
97 bool reporting_active() const { | |
98 return reporting_active_; | |
99 } | |
100 | |
101 // Upload pending data to the server by converting it to XML and compressing | |
102 // it. Returns true on success. | |
103 bool UploadData(); | |
104 | |
105 // Get the current version of the application as a string. | |
106 static std::string GetVersionString(); | |
107 | |
108 // Indicate whether recording and reporting are currently happening. | |
109 // These should not be set directly, but by calling SetRecording and | |
110 // SetReporting. | |
111 bool recording_active_; | |
112 bool reporting_active_; | |
113 | |
114 // Coincides with the check box in options window that lets the user control | |
115 // whether to upload. | |
116 bool user_permits_upload_; | |
117 | |
118 // The progession of states made by the browser are recorded in the following | |
119 // state. | |
120 State state_; | |
121 | |
122 // The URL for the metrics server. | |
123 std::wstring server_url_; | |
124 | |
125 // The identifier that's sent to the server with the log reports. | |
126 static std::string client_id_; | |
127 | |
128 // A number that identifies the how many times the app has been launched. | |
129 int session_id_; | |
130 | |
131 static base::LazyInstance<base::ThreadLocalPointer<MetricsService> > | |
132 g_metrics_instance_; | |
133 | |
134 base::PlatformThreadId thread_; | |
135 | |
136 // Indicates if this is the first uma upload from this instance. | |
137 bool initial_uma_upload_; | |
138 | |
139 // The transmission timer id returned by SetTimer | |
140 int transmission_timer_id_; | |
141 | |
142 // Used to serialize the Start and Stop operations on the metrics service. | |
143 static base::Lock metrics_service_lock_; | |
144 | |
145 DISALLOW_COPY_AND_ASSIGN(MetricsService); | |
146 }; | |
147 | |
148 #endif // CHROME_FRAME_METRICS_SERVICE_H_ | |
OLD | NEW |