1 // Copyright 2014 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 #include "content/common/input/input_event_stream_validator.h"
6 
7 #include "base/check.h"
8 #include "base/command_line.h"
9 #include "content/public/common/content_switches.h"
10 #include "third_party/blink/public/common/input/web_gesture_event.h"
11 #include "third_party/blink/public/common/input/web_input_event.h"
12 #include "ui/events/blink/web_input_event_traits.h"
13 
14 using blink::WebInputEvent;
15 using blink::WebGestureEvent;
16 using blink::WebTouchEvent;
17 
18 namespace content {
19 
InputEventStreamValidator()20 InputEventStreamValidator::InputEventStreamValidator()
21     : enabled_(base::CommandLine::ForCurrentProcess()->HasSwitch(
22           switches::kValidateInputEventStream)) {
23 }
24 
~InputEventStreamValidator()25 InputEventStreamValidator::~InputEventStreamValidator() {
26 }
27 
Validate(const WebInputEvent & event)28 void InputEventStreamValidator::Validate(const WebInputEvent& event) {
29   if (!enabled_)
30     return;
31 
32   DCHECK(ValidateImpl(event, &error_msg_))
33       << error_msg_
34       << "\nInvalid Event: " << ui::WebInputEventTraits::ToString(event);
35 }
36 
ValidateImpl(const blink::WebInputEvent & event,std::string * error_msg)37 bool InputEventStreamValidator::ValidateImpl(
38     const blink::WebInputEvent& event,
39     std::string* error_msg) {
40   DCHECK(error_msg);
41   if (WebInputEvent::IsGestureEventType(event.GetType())) {
42     const WebGestureEvent& gesture = static_cast<const WebGestureEvent&>(event);
43     // TODO(jdduke): Validate touchpad gesture streams.
44     if (gesture.SourceDevice() == blink::WebGestureDevice::kTouchscreen)
45       return gesture_validator_.Validate(gesture, error_msg);
46   } else if (WebInputEvent::IsTouchEventType(event.GetType())) {
47     const WebTouchEvent& touch = static_cast<const WebTouchEvent&>(event);
48     return touch_validator_.Validate(touch, error_msg);
49   }
50   return true;
51 }
52 
53 }  // namespace content
54