#include "ui/views/input_event_activation_protector.h"
#include "base/command_line.h"
#include "ui/events/event.h"
#include "ui/views/metrics.h"
#include "ui/views/views_switches.h"
namespace views {
InputEventActivationProtector::InputEventActivationProtector() {
WindowsStationarityMonitor::GetInstance()->AddObserver(this);
}
InputEventActivationProtector::~InputEventActivationProtector() {
WindowsStationarityMonitor::GetInstance()->RemoveObserver(this);
}
void InputEventActivationProtector::VisibilityChanged(bool is_visible) {
if (is_visible) {
view_protected_time_stamp_ = base::TimeTicks::Now();
}
}
void InputEventActivationProtector::MaybeUpdateViewProtectedTimeStamp(
bool force) {
if (!force && view_protected_time_stamp_ == base::TimeTicks()) {
return;
}
view_protected_time_stamp_ = base::TimeTicks::Now();
}
bool InputEventActivationProtector::IsPossiblyUnintendedInteraction(
const ui::Event& event,
bool allow_key_events) {
if (base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kDisableInputEventActivationProtectionForTesting))
[[unlikely]] {
return false;
}
if (view_protected_time_stamp_ == base::TimeTicks()) {
return false;
}
if (event.IsKeyEvent() && event.AsKeyEvent()->is_repeat()) {
return true;
}
if (!event.IsMouseEvent() && !event.IsTouchEvent() &&
!event.IsGestureEvent()) {
if (allow_key_events || !event.IsKeyEvent()) {
return false;
}
}
const base::TimeDelta kShortInterval = GetDoubleClickInterval();
const bool short_event_after_last_event =
event.time_stamp() < last_event_timestamp_ + kShortInterval;
last_event_timestamp_ = event.time_stamp();
if (short_event_after_last_event) {
repeated_event_count_++;
return true;
}
repeated_event_count_ = 0;
return event.time_stamp() < view_protected_time_stamp_ + kShortInterval;
}
void InputEventActivationProtector::OnWindowStationaryStateChanged() {
MaybeUpdateViewProtectedTimeStamp();
}
void InputEventActivationProtector::ResetForTesting() {
view_protected_time_stamp_ = base::TimeTicks();
last_event_timestamp_ = base::TimeTicks();
repeated_event_count_ = 0;
}
}