14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file. 44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/keyboard_uma_event_filter.h" 64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/metrics/histogram.h" 84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/events/event.h" 94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace { 114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// This threshold is used to drop keystrokes that are more than some time apart. 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// These keystrokes are dropped to avoid recording outliers, as well as pauses 144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// between actual segments of typing. 154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const int kKeystrokeThresholdInSeconds = 5; 164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace ash { 204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace internal { 214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)KeyboardUMAEventFilter::KeyboardUMAEventFilter() {} 234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)KeyboardUMAEventFilter::~KeyboardUMAEventFilter() {} 254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void KeyboardUMAEventFilter::OnKeyEvent(ui::KeyEvent* event) { 274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // This is a rough approximation, so assume that each key release is the 284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // result of a typed key. 294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (event->type() != ui::ET_KEY_RELEASED) 304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Reset the timer on non-character keystrokes. 334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!isprint(event->GetCharacter())) { 344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) last_keystroke_time_ = base::TimeDelta(); 354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (last_keystroke_time_.ToInternalValue() == 0) { 394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) last_keystroke_time_ = event->time_stamp(); 404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::TimeDelta delta = event->time_stamp() - last_keystroke_time_; 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (delta < base::TimeDelta::FromSeconds(kKeystrokeThresholdInSeconds)) 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UMA_HISTOGRAM_TIMES("Keyboard.KeystrokeDeltas", delta); 464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) last_keystroke_time_ = event->time_stamp(); 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // namespace internal 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // namespace ash 52