Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(79)

Side by Side Diff: content/renderer/gpu/input_handler_manager.cc

Issue 15920002: Fix WebView compositor input handling (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Avoid DCHECKs when retrieving process ID Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/gpu/input_handler_manager.h" 5 #include "content/renderer/gpu/input_handler_manager.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/debug/trace_event.h" 8 #include "base/debug/trace_event.h"
9 #include "cc/input/input_handler.h" 9 #include "cc/input/input_handler.h"
10 #include "content/renderer/gpu/input_event_filter.h" 10 #include "content/renderer/gpu/input_event_filter.h"
11 #include "content/renderer/gpu/input_handler_manager_client.h"
11 #include "content/renderer/gpu/input_handler_wrapper.h" 12 #include "content/renderer/gpu/input_handler_wrapper.h"
12 #include "third_party/WebKit/Source/WebKit/chromium/public/WebActiveWheelFlingPa rameters.h"
13 13
14 using WebKit::WebInputEvent; 14 using WebKit::WebInputEvent;
15 15
16 namespace content { 16 namespace content {
17 17
18 namespace { 18 namespace {
19 19
20 InputEventAckState InputEventDispositionToAck( 20 InputEventAckState InputEventDispositionToAck(
21 InputHandlerProxy::EventDisposition disposition) { 21 InputHandlerProxy::EventDisposition disposition) {
22 switch (disposition) { 22 switch (disposition) {
23 case InputHandlerProxy::DID_HANDLE: 23 case InputHandlerProxy::DID_HANDLE:
24 return INPUT_EVENT_ACK_STATE_CONSUMED; 24 return INPUT_EVENT_ACK_STATE_CONSUMED;
25 case InputHandlerProxy::DID_NOT_HANDLE: 25 case InputHandlerProxy::DID_NOT_HANDLE:
26 return INPUT_EVENT_ACK_STATE_NOT_CONSUMED; 26 return INPUT_EVENT_ACK_STATE_NOT_CONSUMED;
27 case InputHandlerProxy::DROP_EVENT: 27 case InputHandlerProxy::DROP_EVENT:
28 return INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS; 28 return INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS;
29 } 29 }
30 NOTREACHED(); 30 NOTREACHED();
31 return INPUT_EVENT_ACK_STATE_UNKNOWN; 31 return INPUT_EVENT_ACK_STATE_UNKNOWN;
32 } 32 }
33 33
34 } // namespace 34 } // namespace
35 35
36 InputHandlerManager::InputHandlerManager( 36 InputHandlerManager::InputHandlerManager(
37 IPC::Listener* main_listener, 37 const scoped_refptr<base::MessageLoopProxy>& message_loop_proxy,
38 const scoped_refptr<base::MessageLoopProxy>& message_loop_proxy) 38 InputHandlerManagerClient* client)
39 : message_loop_proxy_(message_loop_proxy) { 39 : message_loop_proxy_(message_loop_proxy),
40 filter_ = 40 client_(client) {
41 new InputEventFilter(main_listener, 41 DCHECK(client_);
42 message_loop_proxy, 42 client_->SetBoundHandler(base::Bind(&InputHandlerManager::HandleInputEvent,
43 base::Bind(&InputHandlerManager::HandleInputEvent,
44 base::Unretained(this))); 43 base::Unretained(this)));
45 } 44 }
46 45
47 InputHandlerManager::~InputHandlerManager() { 46 InputHandlerManager::~InputHandlerManager() {
48 } 47 client_->SetBoundHandler(InputHandlerManagerClient::Handler());
49
50 IPC::ChannelProxy::MessageFilter*
51 InputHandlerManager::GetMessageFilter() const {
52 return filter_.get();
53 } 48 }
54 49
55 void InputHandlerManager::AddInputHandler( 50 void InputHandlerManager::AddInputHandler(
56 int routing_id, 51 int routing_id,
57 const base::WeakPtr<cc::InputHandler>& input_handler, 52 const base::WeakPtr<cc::InputHandler>& input_handler,
58 const base::WeakPtr<RenderViewImpl>& render_view_impl) { 53 const base::WeakPtr<RenderViewImpl>& render_view_impl) {
59 DCHECK(!message_loop_proxy_->BelongsToCurrentThread()); 54 if (message_loop_proxy_->BelongsToCurrentThread()) {
60 55 AddInputHandlerOnCompositorThread(routing_id,
61 message_loop_proxy_->PostTask( 56 base::MessageLoopProxy::current(),
62 FROM_HERE, 57 input_handler,
63 base::Bind(&InputHandlerManager::AddInputHandlerOnCompositorThread, 58 render_view_impl);
64 base::Unretained(this), 59 } else {
65 routing_id, 60 message_loop_proxy_->PostTask(
66 base::MessageLoopProxy::current(), 61 FROM_HERE,
67 input_handler, 62 base::Bind(&InputHandlerManager::AddInputHandlerOnCompositorThread,
68 render_view_impl)); 63 base::Unretained(this),
64 routing_id,
65 base::MessageLoopProxy::current(),
66 input_handler,
67 render_view_impl));
68 }
69 } 69 }
70 70
71 void InputHandlerManager::AddInputHandlerOnCompositorThread( 71 void InputHandlerManager::AddInputHandlerOnCompositorThread(
72 int routing_id, 72 int routing_id,
73 const scoped_refptr<base::MessageLoopProxy>& main_loop, 73 const scoped_refptr<base::MessageLoopProxy>& main_loop,
74 const base::WeakPtr<cc::InputHandler>& input_handler, 74 const base::WeakPtr<cc::InputHandler>& input_handler,
75 const base::WeakPtr<RenderViewImpl>& render_view_impl) { 75 const base::WeakPtr<RenderViewImpl>& render_view_impl) {
76 DCHECK(message_loop_proxy_->BelongsToCurrentThread()); 76 DCHECK(message_loop_proxy_->BelongsToCurrentThread());
77 77
78 // The handler could be gone by this point if the compositor has shut down. 78 // The handler could be gone by this point if the compositor has shut down.
79 if (!input_handler.get()) 79 if (!input_handler)
80 return; 80 return;
81 81
82 // The same handler may be registered for a route multiple times. 82 // The same handler may be registered for a route multiple times.
83 if (input_handlers_.count(routing_id) != 0) 83 if (input_handlers_.count(routing_id) != 0)
84 return; 84 return;
85 85
86 TRACE_EVENT0("InputHandlerManager::AddInputHandler", "AddingRoute"); 86 TRACE_EVENT0("InputHandlerManager::AddInputHandler", "AddingRoute");
87 filter_->AddRoute(routing_id); 87 client_->DidAddInputHandler(routing_id);
88 input_handlers_[routing_id] = 88 input_handlers_[routing_id] =
89 make_scoped_refptr(new InputHandlerWrapper(this, 89 make_scoped_refptr(new InputHandlerWrapper(this,
90 routing_id, main_loop, input_handler, render_view_impl)); 90 routing_id, main_loop, input_handler, render_view_impl));
91 } 91 }
92 92
93 void InputHandlerManager::RemoveInputHandler(int routing_id) { 93 void InputHandlerManager::RemoveInputHandler(int routing_id) {
94 DCHECK(message_loop_proxy_->BelongsToCurrentThread()); 94 DCHECK(message_loop_proxy_->BelongsToCurrentThread());
95 95
96 TRACE_EVENT0("InputHandlerManager::RemoveInputHandler", "RemovingRoute"); 96 TRACE_EVENT0("InputHandlerManager::RemoveInputHandler", "RemovingRoute");
97 97
98 filter_->RemoveRoute(routing_id); 98 client_->DidRemoveInputHandler(routing_id);
99 input_handlers_.erase(routing_id); 99 input_handlers_.erase(routing_id);
100 } 100 }
101 101
102 InputEventAckState InputHandlerManager::HandleInputEvent( 102 InputEventAckState InputHandlerManager::HandleInputEvent(
103 int routing_id, 103 int routing_id,
104 const WebInputEvent* input_event) { 104 const WebInputEvent* input_event) {
105 DCHECK(message_loop_proxy_->BelongsToCurrentThread()); 105 DCHECK(message_loop_proxy_->BelongsToCurrentThread());
106 106
107 InputHandlerMap::iterator it = input_handlers_.find(routing_id); 107 InputHandlerMap::iterator it = input_handlers_.find(routing_id);
108 if (it == input_handlers_.end()) { 108 if (it == input_handlers_.end()) {
109 TRACE_EVENT0("InputHandlerManager::HandleInputEvent", 109 TRACE_EVENT0("InputHandlerManager::HandleInputEvent",
110 "NoInputHandlerFound"); 110 "NoInputHandlerFound");
111 // Oops, we no longer have an interested input handler.. 111 // Oops, we no longer have an interested input handler..
112 return INPUT_EVENT_ACK_STATE_NOT_CONSUMED; 112 return INPUT_EVENT_ACK_STATE_NOT_CONSUMED;
113 } 113 }
114 114
115 return InputEventDispositionToAck( 115 return InputEventDispositionToAck(
116 it->second->input_handler_proxy()->HandleInputEvent(*input_event)); 116 it->second->input_handler_proxy()->HandleInputEvent(*input_event));
117 } 117 }
118 118
119 } // namespace content 119 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/gpu/input_handler_manager.h ('k') | content/renderer/gpu/input_handler_manager_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698