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

Side by Side Diff: content/renderer/input/input_event_filter.h

Issue 2166703003: Implement Main Thread RAF Aligned Input (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master_main_thread_queue
Patch Set: Fix build Created 4 years, 3 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 #ifndef CONTENT_RENDERER_INPUT_INPUT_EVENT_FILTER_H_ 5 #ifndef CONTENT_RENDERER_INPUT_INPUT_EVENT_FILTER_H_
6 #define CONTENT_RENDERER_INPUT_INPUT_EVENT_FILTER_H_ 6 #define CONTENT_RENDERER_INPUT_INPUT_EVENT_FILTER_H_
7 7
8 #include <queue> 8 #include <queue>
9 #include <set> 9 #include <set>
10 #include <unordered_map> 10 #include <unordered_map>
(...skipping 18 matching lines...) Expand all
29 29
30 namespace IPC { 30 namespace IPC {
31 class Listener; 31 class Listener;
32 class Sender; 32 class Sender;
33 } 33 }
34 34
35 // This class can be used to intercept InputMsg_HandleInputEvent messages 35 // This class can be used to intercept InputMsg_HandleInputEvent messages
36 // and have them be delivered to a target thread. Input events are filtered 36 // and have them be delivered to a target thread. Input events are filtered
37 // based on routing_id (see AddRoute and RemoveRoute). 37 // based on routing_id (see AddRoute and RemoveRoute).
38 // 38 //
39 // The user of this class provides an instance of InputEventFilter::Handler, 39 // The user of this class provides an instance of InputHandlerManager via
40 // which will be passed WebInputEvents on the target thread. 40 // |SetInputHandlerManager| which will be called back when processing
41 // WebInputEvents on the target thread.
41 // 42 //
42 43
43 namespace content { 44 namespace content {
44 45
45 class CONTENT_EXPORT InputEventFilter : public InputHandlerManagerClient, 46 class CONTENT_EXPORT InputEventFilter : public InputHandlerManagerClient,
46 public IPC::MessageFilter, 47 public IPC::MessageFilter,
47 public MainThreadEventQueueClient { 48 public MainThreadEventQueueClient {
48 public: 49 public:
49 InputEventFilter( 50 InputEventFilter(
50 const base::Callback<void(const IPC::Message&)>& main_listener, 51 const base::Callback<void(const IPC::Message&)>& main_listener,
51 const scoped_refptr<base::SingleThreadTaskRunner>& main_task_runner, 52 const scoped_refptr<base::SingleThreadTaskRunner>& main_task_runner,
52 const scoped_refptr<base::SingleThreadTaskRunner>& target_task_runner); 53 const scoped_refptr<base::SingleThreadTaskRunner>& target_task_runner);
53 54
54 // The |handler| is invoked on the thread associated with |target_loop| to 55 // The |handler| is invoked on the thread associated with |target_loop| to
55 // handle input events matching the filtered routes. 56 // handle input events matching the filtered routes.
56 // 57 //
57 // If INPUT_EVENT_ACK_STATE_NOT_CONSUMED is returned by the handler, 58 // If INPUT_EVENT_ACK_STATE_NOT_CONSUMED is returned by the handler,
58 // the original InputMsg_HandleInputEvent message will be delivered to 59 // the original InputMsg_HandleInputEvent message will be delivered to
59 // |main_listener| on the main thread. (The "main thread" in this context is 60 // |main_listener| on the main thread. (The "main thread" in this context is
60 // the thread where the InputEventFilter was constructed.) The responsibility 61 // the thread where the InputEventFilter was constructed.) The responsibility
61 // is left to the eventual handler to deliver the corresponding 62 // is left to the eventual handler to deliver the corresponding
62 // InputHostMsg_HandleInputEvent_ACK. 63 // InputHostMsg_HandleInputEvent_ACK.
63 // 64 //
64 void SetBoundHandler(const Handler& handler) override; 65 void SetInputHandlerManager(InputHandlerManager*) override;
65 void RegisterRoutingID(int routing_id) override; 66 void RegisterRoutingID(int routing_id) override;
66 void UnregisterRoutingID(int routing_id) override; 67 void UnregisterRoutingID(int routing_id) override;
67 void DidOverscroll(int routing_id, 68 void DidOverscroll(int routing_id,
68 const ui::DidOverscrollParams& params) override; 69 const ui::DidOverscrollParams& params) override;
69 void DidStartFlinging(int routing_id) override; 70 void DidStartFlinging(int routing_id) override;
70 void DidStopFlinging(int routing_id) override; 71 void DidStopFlinging(int routing_id) override;
71 void NotifyInputEventHandled(int routing_id, 72 void NotifyInputEventHandled(int routing_id,
72 blink::WebInputEvent::Type type, 73 blink::WebInputEvent::Type type,
73 InputEventAckState ack_result) override; 74 InputEventAckState ack_result) override;
75 void ProcessRafAlignedInput(int routing_id) override;
74 76
75 // IPC::MessageFilter methods: 77 // IPC::MessageFilter methods:
76 void OnFilterAdded(IPC::Sender* sender) override; 78 void OnFilterAdded(IPC::Sender* sender) override;
77 void OnFilterRemoved() override; 79 void OnFilterRemoved() override;
78 void OnChannelClosing() override; 80 void OnChannelClosing() override;
79 bool OnMessageReceived(const IPC::Message& message) override; 81 bool OnMessageReceived(const IPC::Message& message) override;
80 82
81 // MainThreadEventQueueClient methods: 83 // MainThreadEventQueueClient methods:
82 void HandleEventOnMainThread(int routing_id, 84 void HandleEventOnMainThread(int routing_id,
83 const blink::WebInputEvent* event, 85 const blink::WebInputEvent* event,
84 const ui::LatencyInfo& latency, 86 const ui::LatencyInfo& latency,
85 InputEventDispatchType dispatch_type) override; 87 InputEventDispatchType dispatch_type) override;
86 // Send an InputEventAck IPC message. |touch_event_id| represents 88 // Send an InputEventAck IPC message. |touch_event_id| represents
87 // the unique event id for the original WebTouchEvent and should 89 // the unique event id for the original WebTouchEvent and should
88 // be 0 if otherwise. See WebInputEventTraits::GetUniqueTouchEventId. 90 // be 0 if otherwise. See WebInputEventTraits::GetUniqueTouchEventId.
89 void SendInputEventAck(int routing_id, 91 void SendInputEventAck(int routing_id,
90 blink::WebInputEvent::Type type, 92 blink::WebInputEvent::Type type,
91 InputEventAckState ack_result, 93 InputEventAckState ack_result,
92 uint32_t touch_event_id) override; 94 uint32_t touch_event_id) override;
93 95
96 void NeedsMainFrame(int routing_id) override;
97
94 private: 98 private:
95 ~InputEventFilter() override; 99 ~InputEventFilter() override;
96 100
97 void ForwardToHandler(const IPC::Message& message); 101 void ForwardToHandler(const IPC::Message& message);
98 void SendMessage(std::unique_ptr<IPC::Message> message); 102 void SendMessage(std::unique_ptr<IPC::Message> message);
99 void SendMessageOnIOThread(std::unique_ptr<IPC::Message> message); 103 void SendMessageOnIOThread(std::unique_ptr<IPC::Message> message);
100 void SetIsFlingingInMainThreadEventQueue(int routing_id, bool is_flinging); 104 void SetIsFlingingInMainThreadEventQueue(int routing_id, bool is_flinging);
101 105
102 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_; 106 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
103 base::Callback<void(const IPC::Message&)> main_listener_; 107 base::Callback<void(const IPC::Message&)> main_listener_;
104 108
105 // The sender_ only gets invoked on the thread corresponding to io_loop_. 109 // The sender_ only gets invoked on the thread corresponding to io_loop_.
106 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; 110 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
107 IPC::Sender* sender_; 111 IPC::Sender* sender_;
108 112
109 // The handler_ only gets Run on the thread corresponding to target_loop_. 113 // The |input_handler_manager_| should outlive the life of this class and
tdresser 2016/08/25 14:38:41 "outlive the life of" -> outlive
dtapuska 2016/08/25 15:01:35 Done.
114 // should only be called back on the |target_task_runner_|.
110 scoped_refptr<base::SingleThreadTaskRunner> target_task_runner_; 115 scoped_refptr<base::SingleThreadTaskRunner> target_task_runner_;
111 Handler handler_; 116 InputHandlerManager* input_handler_manager_;
112 117
113 // Protects access to routes_. 118 // Protects access to routes_.
114 base::Lock routes_lock_; 119 base::Lock routes_lock_;
115 120
116 // Indicates the routing_ids for which input events should be filtered. 121 // Indicates the routing_ids for which input events should be filtered.
117 std::set<int> routes_; 122 std::set<int> routes_;
118 123
119 using RouteQueueMap = 124 using RouteQueueMap =
120 std::unordered_map<int, scoped_refptr<MainThreadEventQueue>>; 125 std::unordered_map<int, scoped_refptr<MainThreadEventQueue>>;
121 RouteQueueMap route_queues_; 126 RouteQueueMap route_queues_;
122 127
123 // Used to intercept overscroll notifications while an event is being 128 // Used to intercept overscroll notifications while an event is being
124 // dispatched. If the event causes overscroll, the overscroll metadata can be 129 // dispatched. If the event causes overscroll, the overscroll metadata can be
125 // bundled in the event ack, saving an IPC. Note that we must continue 130 // bundled in the event ack, saving an IPC. Note that we must continue
126 // supporting overscroll IPC notifications due to fling animation updates. 131 // supporting overscroll IPC notifications due to fling animation updates.
127 std::unique_ptr<ui::DidOverscrollParams>* current_overscroll_params_; 132 std::unique_ptr<ui::DidOverscrollParams>* current_overscroll_params_;
128 blink::scheduler::RendererScheduler* renderer_scheduler_; 133 blink::scheduler::RendererScheduler* renderer_scheduler_;
129 }; 134 };
130 135
131 } // namespace content 136 } // namespace content
132 137
133 #endif // CONTENT_RENDERER_INPUT_INPUT_EVENT_FILTER_H_ 138 #endif // CONTENT_RENDERER_INPUT_INPUT_EVENT_FILTER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698