OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.h" | 5 #include "chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 21 matching lines...) Expand all Loading... |
32 | 32 |
33 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) | 33 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) |
34 #include <gnu/libc-version.h> | 34 #include <gnu/libc-version.h> |
35 | 35 |
36 #include "base/version.h" | 36 #include "base/version.h" |
37 #if defined(USE_X11) | 37 #if defined(USE_X11) |
38 #include "ui/base/x/x11_util.h" | 38 #include "ui/base/x/x11_util.h" |
39 #endif | 39 #endif |
40 #endif // defined(OS_LINUX) && !defined(OS_CHROMEOS) | 40 #endif // defined(OS_LINUX) && !defined(OS_CHROMEOS) |
41 | 41 |
| 42 #if defined(USE_OZONE) || defined(USE_X11) |
| 43 #include "ui/events/devices/device_data_manager.h" |
| 44 #include "ui/events/devices/input_device_event_observer.h" |
| 45 #endif // defined(USE_OZONE) || defined(USE_X11) |
| 46 |
42 #if defined(OS_WIN) | 47 #if defined(OS_WIN) |
43 #include "chrome/installer/util/google_update_settings.h" | 48 #include "chrome/installer/util/google_update_settings.h" |
44 #endif // defined(OS_WIN) | 49 #endif // defined(OS_WIN) |
45 | 50 |
46 namespace { | 51 namespace { |
47 | 52 |
48 enum UMALinuxGlibcVersion { | 53 enum UMALinuxGlibcVersion { |
49 UMA_LINUX_GLIBC_NOT_PARSEABLE, | 54 UMA_LINUX_GLIBC_NOT_PARSEABLE, |
50 UMA_LINUX_GLIBC_UNKNOWN, | 55 UMA_LINUX_GLIBC_UNKNOWN, |
51 UMA_LINUX_GLIBC_2_11, | 56 UMA_LINUX_GLIBC_2_11, |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
234 state = UMA_TOUCH_EVENTS_DISABLED; | 239 state = UMA_TOUCH_EVENTS_DISABLED; |
235 } else { | 240 } else { |
236 NOTREACHED(); | 241 NOTREACHED(); |
237 return; | 242 return; |
238 } | 243 } |
239 | 244 |
240 UMA_HISTOGRAM_ENUMERATION("Touchscreen.TouchEventsEnabled", state, | 245 UMA_HISTOGRAM_ENUMERATION("Touchscreen.TouchEventsEnabled", state, |
241 UMA_TOUCH_EVENTS_STATE_COUNT); | 246 UMA_TOUCH_EVENTS_STATE_COUNT); |
242 } | 247 } |
243 | 248 |
| 249 #if defined(USE_OZONE) || defined(USE_X11) |
| 250 |
| 251 // Asynchronously records the touch event state when the ui::DeviceDataManager |
| 252 // completes a device scan. |
| 253 class AsynchronousTouchEventStateRecorder |
| 254 : public ui::InputDeviceEventObserver { |
| 255 public: |
| 256 AsynchronousTouchEventStateRecorder(); |
| 257 ~AsynchronousTouchEventStateRecorder() override; |
| 258 |
| 259 // ui::InputDeviceEventObserver overrides. |
| 260 void OnDeviceListsComplete() override; |
| 261 |
| 262 private: |
| 263 DISALLOW_COPY_AND_ASSIGN(AsynchronousTouchEventStateRecorder); |
| 264 }; |
| 265 |
| 266 AsynchronousTouchEventStateRecorder::AsynchronousTouchEventStateRecorder() { |
| 267 ui::DeviceDataManager::GetInstance()->AddObserver(this); |
| 268 } |
| 269 |
| 270 AsynchronousTouchEventStateRecorder::~AsynchronousTouchEventStateRecorder() { |
| 271 ui::DeviceDataManager::GetInstance()->RemoveObserver(this); |
| 272 } |
| 273 |
| 274 void AsynchronousTouchEventStateRecorder::OnDeviceListsComplete() { |
| 275 ui::DeviceDataManager::GetInstance()->RemoveObserver(this); |
| 276 RecordTouchEventState(); |
| 277 } |
| 278 |
| 279 #endif // defined(USE_OZONE) || defined(USE_X11) |
| 280 |
244 } // namespace | 281 } // namespace |
245 | 282 |
246 ChromeBrowserMainExtraPartsMetrics::ChromeBrowserMainExtraPartsMetrics() | 283 ChromeBrowserMainExtraPartsMetrics::ChromeBrowserMainExtraPartsMetrics() |
247 : display_count_(0), is_screen_observer_(false) { | 284 : display_count_(0), is_screen_observer_(false) { |
248 } | 285 } |
249 | 286 |
250 ChromeBrowserMainExtraPartsMetrics::~ChromeBrowserMainExtraPartsMetrics() { | 287 ChromeBrowserMainExtraPartsMetrics::~ChromeBrowserMainExtraPartsMetrics() { |
251 if (is_screen_observer_) | 288 if (is_screen_observer_) |
252 gfx::Screen::GetNativeScreen()->RemoveObserver(this); | 289 gfx::Screen::GetNativeScreen()->RemoveObserver(this); |
253 } | 290 } |
254 | 291 |
255 void ChromeBrowserMainExtraPartsMetrics::PreProfileInit() { | 292 void ChromeBrowserMainExtraPartsMetrics::PreProfileInit() { |
256 RecordMicroArchitectureStats(); | 293 RecordMicroArchitectureStats(); |
257 } | 294 } |
258 | 295 |
259 void ChromeBrowserMainExtraPartsMetrics::PreBrowserStart() { | 296 void ChromeBrowserMainExtraPartsMetrics::PreBrowserStart() { |
260 about_flags::PrefServiceFlagsStorage flags_storage_( | 297 about_flags::PrefServiceFlagsStorage flags_storage_( |
261 g_browser_process->local_state()); | 298 g_browser_process->local_state()); |
262 about_flags::RecordUMAStatistics(&flags_storage_); | 299 about_flags::RecordUMAStatistics(&flags_storage_); |
263 } | 300 } |
264 | 301 |
265 void ChromeBrowserMainExtraPartsMetrics::PostBrowserStart() { | 302 void ChromeBrowserMainExtraPartsMetrics::PostBrowserStart() { |
266 RecordLinuxGlibcVersion(); | 303 RecordLinuxGlibcVersion(); |
267 #if defined(USE_X11) && !defined(OS_CHROMEOS) | 304 #if defined(USE_X11) && !defined(OS_CHROMEOS) |
268 UMA_HISTOGRAM_ENUMERATION("Linux.WindowManager", | 305 UMA_HISTOGRAM_ENUMERATION("Linux.WindowManager", |
269 GetLinuxWindowManager(), | 306 GetLinuxWindowManager(), |
270 UMA_LINUX_WINDOW_MANAGER_COUNT); | 307 UMA_LINUX_WINDOW_MANAGER_COUNT); |
271 #endif | 308 #endif |
| 309 |
| 310 #if defined(USE_OZONE) || defined(USE_X11) |
| 311 // The touch event state for X11 and Ozone based event sub-systems are based |
| 312 // on device scans that happen asynchronously. So we may need to attach an |
| 313 // observer to wait until these scans complete. |
| 314 if (ui::DeviceDataManager::GetInstance()->device_lists_complete()) { |
| 315 RecordTouchEventState(); |
| 316 } else { |
| 317 input_device_event_observer_.reset( |
| 318 new AsynchronousTouchEventStateRecorder()); |
| 319 } |
| 320 #else |
272 RecordTouchEventState(); | 321 RecordTouchEventState(); |
| 322 #endif // defined(USE_OZONE) || defined(USE_X11) |
273 | 323 |
274 #if defined(OS_MACOSX) && !defined(OS_IOS) | 324 #if defined(OS_MACOSX) && !defined(OS_IOS) |
275 RecordMacMetrics(); | 325 RecordMacMetrics(); |
276 #endif // defined(OS_MACOSX) && !defined(OS_IOS) | 326 #endif // defined(OS_MACOSX) && !defined(OS_IOS) |
277 | 327 |
278 const int kStartupMetricsGatheringDelaySeconds = 45; | 328 const int kStartupMetricsGatheringDelaySeconds = 45; |
279 content::BrowserThread::GetBlockingPool()->PostDelayedTask( | 329 content::BrowserThread::GetBlockingPool()->PostDelayedTask( |
280 FROM_HERE, | 330 FROM_HERE, |
281 base::Bind(&RecordStartupMetricsOnBlockingPool), | 331 base::Bind(&RecordStartupMetricsOnBlockingPool), |
282 base::TimeDelta::FromSeconds(kStartupMetricsGatheringDelaySeconds)); | 332 base::TimeDelta::FromSeconds(kStartupMetricsGatheringDelaySeconds)); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
319 } | 369 } |
320 } | 370 } |
321 | 371 |
322 namespace chrome { | 372 namespace chrome { |
323 | 373 |
324 void AddMetricsExtraParts(ChromeBrowserMainParts* main_parts) { | 374 void AddMetricsExtraParts(ChromeBrowserMainParts* main_parts) { |
325 main_parts->AddParts(new ChromeBrowserMainExtraPartsMetrics()); | 375 main_parts->AddParts(new ChromeBrowserMainExtraPartsMetrics()); |
326 } | 376 } |
327 | 377 |
328 } // namespace chrome | 378 } // namespace chrome |
OLD | NEW |