1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file. 4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/common/input/gesture_event_stream_validator.h" 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/logging.h" 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h" 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using blink::WebInputEvent; 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace content { 1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)GestureEventStreamValidator::GestureEventStreamValidator() 1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) : scrolling_(false), pinching_(false), waiting_for_tap_end_(false) { 1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)GestureEventStreamValidator::~GestureEventStreamValidator() { 1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool GestureEventStreamValidator::Validate(const blink::WebGestureEvent& event, 2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string* error_msg) { 2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(error_msg); 2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) error_msg->clear(); 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) switch (event.type) { 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case WebInputEvent::GestureScrollBegin: 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (scrolling_) 2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) error_msg->append("Scroll begin during scroll\n"); 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (pinching_) 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci error_msg->append("Scroll begin during pinch\n"); 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scrolling_ = true; 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case WebInputEvent::GestureScrollUpdate: 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case WebInputEvent::GestureScrollUpdateWithoutPropagation: 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!scrolling_) 3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) error_msg->append("Scroll update outside of scroll\n"); 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case WebInputEvent::GestureScrollEnd: 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case WebInputEvent::GestureFlingStart: 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!scrolling_) 4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) error_msg->append("Scroll end outside of scroll\n"); 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (pinching_) 4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) error_msg->append("Ending scroll while pinching\n"); 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scrolling_ = false; 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case WebInputEvent::GesturePinchBegin: 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (pinching_) 4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) error_msg->append("Pinch begin during pinch\n"); 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) pinching_ = true; 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case WebInputEvent::GesturePinchUpdate: 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!pinching_) 5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) error_msg->append("Pinch update outside of pinch\n"); 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case WebInputEvent::GesturePinchEnd: 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!pinching_) 5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) error_msg->append("Pinch end outside of pinch\n"); 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) pinching_ = false; 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case WebInputEvent::GestureTapDown: 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (waiting_for_tap_end_) 6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) error_msg->append("Missing tap end event\n"); 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) waiting_for_tap_end_ = true; 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case WebInputEvent::GestureTapUnconfirmed: 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!waiting_for_tap_end_) 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci error_msg->append("Missing TapDown event before TapUnconfirmed\n"); 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case WebInputEvent::GestureTapCancel: 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!waiting_for_tap_end_) 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci error_msg->append("Missing TapDown event before TapCancel\n"); 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci waiting_for_tap_end_ = false; 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case WebInputEvent::GestureTap: 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case WebInputEvent::GestureDoubleTap: 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Both Tap and DoubleTap gestures may be synthetically inserted, and do 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // not require a preceding TapDown. 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) waiting_for_tap_end_ = false; 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) default: 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return error_msg->empty(); 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace content 87