1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// found in the LICENSE file. 4a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/auto_reset.h" 6a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/command_line.h" 7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/run_loop.h" 8a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "content/browser/gpu/compositor_util.h" 9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_impl.h" 10a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/web_contents/web_contents_impl.h" 11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/common/input/synthetic_web_input_event_builders.h" 12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/common/input_messages.h" 13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/browser/browser_message_filter.h" 14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/browser/render_widget_host_view.h" 16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/common/content_switches.h" 17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/public/test/content_browser_test.h" 18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/public/test/content_browser_test_utils.h" 19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/shell/browser/shell.h" 20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h" 21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/events/event_switches.h" 22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/events/latency_info.h" 23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)using blink::WebInputEvent; 25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace { 27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void GiveItSomeTime() { 29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::RunLoop run_loop; 30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::MessageLoop::current()->PostDelayedTask( 31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FROM_HERE, 32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) run_loop.QuitClosure(), 33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::TimeDelta::FromMilliseconds(10)); 34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) run_loop.Run(); 35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const char kTouchEventDataURL[] = 38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "data:text/html;charset=utf-8," 39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "<body onload='setup();'>" 40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "<div id='first'></div><div id='second'></div><div id='third'></div>" 41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "<style>" 42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " #first {" 43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " position: absolute;" 44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " width: 100px;" 45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " height: 100px;" 46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " top: 0px;" 47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " left: 0px;" 48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " background-color: green;" 49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " -webkit-transform: translate3d(0, 0, 0);" 50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " }" 51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " #second {" 52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " position: absolute;" 53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " width: 100px;" 54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " height: 100px;" 55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " top: 0px;" 56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " left: 110px;" 57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " background-color: blue;" 58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " -webkit-transform: translate3d(0, 0, 0);" 59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " }" 60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " #third {" 61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " position: absolute;" 62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " width: 100px;" 63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " height: 100px;" 64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " top: 110px;" 65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " left: 0px;" 66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " background-color: yellow;" 67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " -webkit-transform: translate3d(0, 0, 0);" 68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " }" 69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "</style>" 70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "<script>" 71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " function setup() {" 72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " second.ontouchstart = function() {};" 73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " third.ontouchstart = function(e) {" 74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " e.preventDefault();" 75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " };" 76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " }" 77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "</script>"; 78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} // namespace 80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace content { 82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class InputEventMessageFilter : public BrowserMessageFilter { 84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public: 85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) InputEventMessageFilter() 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : BrowserMessageFilter(InputMsgStart), 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) type_(WebInputEvent::Undefined), 88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) state_(INPUT_EVENT_ACK_STATE_UNKNOWN) {} 89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void WaitForAck(WebInputEvent::Type type) { 91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::RunLoop run_loop; 92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::AutoReset<base::Closure> reset_quit(&quit_, run_loop.QuitClosure()); 93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::AutoReset<WebInputEvent::Type> reset_type(&type_, type); 94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) run_loop.Run(); 95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) InputEventAckState last_ack_state() const { return state_; } 98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) protected: 100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual ~InputEventMessageFilter() {} 101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private: 103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void ReceivedEventAck(WebInputEvent::Type type, InputEventAckState state) { 104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (type_ == type) { 105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) state_ = state; 106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) quit_.Run(); 107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // BrowserMessageFilter: 111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE { 112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (message.type() == InputHostMsg_HandleInputEvent_ACK::ID) { 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InputHostMsg_HandleInputEvent_ACK::Param params; 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InputHostMsg_HandleInputEvent_ACK::Read(&message, ¶ms); 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) WebInputEvent::Type type = params.a.type; 116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InputEventAckState ack = params.a.state; 117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Bind(&InputEventMessageFilter::ReceivedEventAck, 119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) this, type, ack)); 120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Closure quit_; 125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) WebInputEvent::Type type_; 126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) InputEventAckState state_; 127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(InputEventMessageFilter); 129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 131a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass TouchInputBrowserTest : public ContentBrowserTest { 132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public: 133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TouchInputBrowserTest() {} 134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual ~TouchInputBrowserTest() {} 135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderWidgetHostImpl* GetWidgetHost() { 137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return RenderWidgetHostImpl::From(shell()->web_contents()-> 138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetRenderViewHost()); 139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) InputEventMessageFilter* filter() { return filter_.get(); } 142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) protected: 144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void LoadURLAndAddFilter() { 145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const GURL data_url(kTouchEventDataURL); 146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NavigateToURL(shell(), data_url); 147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) WebContentsImpl* web_contents = 149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static_cast<WebContentsImpl*>(shell()->web_contents()); 150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderWidgetHostImpl* host = 151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderWidgetHostImpl::From(web_contents->GetRenderViewHost()); 152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) host->GetView()->SetSize(gfx::Size(400, 400)); 153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // The page is loaded in the renderer, wait for a new frame to arrive. 155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) while (!host->ScheduleComposite()) 156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GiveItSomeTime(); 157a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 158a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) filter_ = new InputEventMessageFilter(); 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci host->GetProcess()->AddFilter(filter_.get()); 160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void SetUpCommandLine(CommandLine* cmd) OVERRIDE { 163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cmd->AppendSwitchASCII(switches::kTouchEvents, 164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) switches::kTouchEventsEnabled); 165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_refptr<InputEventMessageFilter> filter_; 168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_MACOSX) 171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// TODO(ccameron): Failing on mac: crbug.com/346363 172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define MAYBE_TouchNoHandler DISABLED_TouchNoHandler 173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#else 174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define MAYBE_TouchNoHandler TouchNoHandler 175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif 176a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochIN_PROC_BROWSER_TEST_F(TouchInputBrowserTest, MAYBE_TouchNoHandler) { 177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LoadURLAndAddFilter(); 178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SyntheticWebTouchEvent touch; 179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // A press on |first| should be acked with NO_CONSUMER_EXISTS since there is 181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // no touch-handler on it. 182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) touch.PressPoint(25, 25); 183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetWidgetHost()->ForwardTouchEventWithLatencyInfo(touch, ui::LatencyInfo()); 184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) filter()->WaitForAck(WebInputEvent::TouchStart); 185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, 187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch filter()->last_ack_state()); 188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // If a touch-press is acked with NO_CONSUMER_EXISTS, then subsequent 190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // touch-points don't need to be dispatched until the touch point is released. 191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) touch.ReleasePoint(0); 192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetWidgetHost()->ForwardTouchEventWithLatencyInfo(touch, ui::LatencyInfo()); 193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) touch.ResetPoints(); 194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 196a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochIN_PROC_BROWSER_TEST_F(TouchInputBrowserTest, TouchHandlerNoConsume) { 197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LoadURLAndAddFilter(); 198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SyntheticWebTouchEvent touch; 199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Press on |second| should be acked with NOT_CONSUMED since there is a 201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // touch-handler on |second|, but it doesn't consume the event. 202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) touch.PressPoint(125, 25); 203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetWidgetHost()->ForwardTouchEventWithLatencyInfo(touch, ui::LatencyInfo()); 204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) filter()->WaitForAck(WebInputEvent::TouchStart); 205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, filter()->last_ack_state()); 206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) touch.ReleasePoint(0); 208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetWidgetHost()->ForwardTouchEventWithLatencyInfo(touch, ui::LatencyInfo()); 209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) filter()->WaitForAck(WebInputEvent::TouchEnd); 210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) touch.ResetPoints(); 211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 212a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 213a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochIN_PROC_BROWSER_TEST_F(TouchInputBrowserTest, TouchHandlerConsume) { 214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LoadURLAndAddFilter(); 215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SyntheticWebTouchEvent touch; 216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 217a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Press on |third| should be acked with CONSUMED since the touch-handler on 218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // |third| consimes the event. 219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) touch.PressPoint(25, 125); 220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetWidgetHost()->ForwardTouchEventWithLatencyInfo(touch, ui::LatencyInfo()); 221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) filter()->WaitForAck(WebInputEvent::TouchStart); 222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(INPUT_EVENT_ACK_STATE_CONSUMED, filter()->last_ack_state()); 223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) touch.ReleasePoint(0); 225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetWidgetHost()->ForwardTouchEventWithLatencyInfo(touch, ui::LatencyInfo()); 226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) filter()->WaitForAck(WebInputEvent::TouchEnd); 227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_MACOSX) 230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// TODO(ccameron): Failing on mac: crbug.com/346363 231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define MAYBE_MultiPointTouchPress DISABLED_MultiPointTouchPress 232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#else 233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define MAYBE_MultiPointTouchPress MultiPointTouchPress 234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif 235a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochIN_PROC_BROWSER_TEST_F(TouchInputBrowserTest, MAYBE_MultiPointTouchPress) { 236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LoadURLAndAddFilter(); 237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SyntheticWebTouchEvent touch; 238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Press on |first|, which sould be acked with NO_CONSUMER_EXISTS. Then press 240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // on |third|. That point should be acked with CONSUMED. 241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) touch.PressPoint(25, 25); 242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetWidgetHost()->ForwardTouchEventWithLatencyInfo(touch, ui::LatencyInfo()); 243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) filter()->WaitForAck(WebInputEvent::TouchStart); 244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, 245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch filter()->last_ack_state()); 246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) touch.PressPoint(25, 125); 248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetWidgetHost()->ForwardTouchEventWithLatencyInfo(touch, ui::LatencyInfo()); 249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) filter()->WaitForAck(WebInputEvent::TouchStart); 250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(INPUT_EVENT_ACK_STATE_CONSUMED, filter()->last_ack_state()); 251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 252a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 253a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} // namespace content 254