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

Unified Diff: content/renderer/input/main_thread_event_queue.h

Issue 2162143002: Don't use PostTask queueing between compositor and main thread. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Don't ack mouse move right away send them unthrottled Created 4 years, 5 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 side-by-side diff with in-line comments
Download patch
Index: content/renderer/input/main_thread_event_queue.h
diff --git a/content/renderer/input/main_thread_event_queue.h b/content/renderer/input/main_thread_event_queue.h
index fe58023f5777bb8923b5138e8354f21a29ba6b8d..344677fa47caaf9211f8e2e39a5d6be1917f490c 100644
--- a/content/renderer/input/main_thread_event_queue.h
+++ b/content/renderer/input/main_thread_event_queue.h
@@ -6,6 +6,7 @@
#define CONTENT_RENDERER_INPUT_MAIN_THREAD_EVENT_QUEUE_H_
#include <deque>
+#include "base/memory/ref_counted.h"
#include "content/common/content_export.h"
#include "content/common/input/event_with_latency_info.h"
#include "content/common/input/input_event_ack_state.h"
@@ -17,51 +18,34 @@
namespace content {
-template <typename BaseClass, typename BaseType>
-class EventWithDispatchType : public BaseClass {
+class EventWithDispatchType : public ScopedWebInputEventWithLatencyInfo {
public:
- EventWithDispatchType(const BaseType& e,
- const ui::LatencyInfo& l,
- InputEventDispatchType t)
- : BaseClass(e, l), type(t) {}
-
- InputEventDispatchType type;
- std::deque<uint32_t> eventsToAck;
-
+ EventWithDispatchType(const blink::WebInputEvent& event,
+ const ui::LatencyInfo& latency,
+ InputEventDispatchType dispatch_type);
+ ~EventWithDispatchType();
bool CanCoalesceWith(const EventWithDispatchType& other) const
- WARN_UNUSED_RESULT {
- return other.type == type && BaseClass::CanCoalesceWith(other);
- }
-
- void CoalesceWith(const EventWithDispatchType& other) {
- // If we are blocking and are coalescing touch, make sure to keep
- // the touch ids that need to be acked.
- if (type == DISPATCH_TYPE_BLOCKING_NOTIFY_MAIN) {
- // We should only have blocking touch events that need coalescing.
- DCHECK(blink::WebInputEvent::isTouchEventType(other.event.type));
- eventsToAck.push_back(
- WebInputEventTraits::GetUniqueTouchEventId(other.event));
- }
- BaseClass::CoalesceWith(other);
- }
-};
+ WARN_UNUSED_RESULT;
+ void CoalesceWith(const EventWithDispatchType& other);
-using PendingMouseWheelEvent =
- EventWithDispatchType<MouseWheelEventWithLatencyInfo,
- blink::WebMouseWheelEvent>;
+ const std::deque<uint32_t>& eventsToAck() const { return eventsToAck_; }
+ InputEventDispatchType dispatchType() const { return dispatch_type_; }
-using PendingTouchEvent =
- EventWithDispatchType<TouchEventWithLatencyInfo, blink::WebTouchEvent>;
+ private:
+ InputEventDispatchType dispatch_type_;
+ std::deque<uint32_t> eventsToAck_;
tdresser 2016/07/20 20:52:27 Make it clear this is touch only.
dtapuska 2016/07/27 05:29:00 Acknowledged.
+};
class CONTENT_EXPORT MainThreadEventQueueClient {
public:
- // Send an |event| that was previously queued (possibly
+ // Handle an |event| that was previously queued (possibly
// coalesced with another event) to the |routing_id|'s
// channel. Implementors must implement this callback.
- virtual void SendEventToMainThread(int routing_id,
- const blink::WebInputEvent* event,
- const ui::LatencyInfo& latency,
- InputEventDispatchType dispatch_type) = 0;
+ virtual void HandleEventOnMainThread(
+ int routing_id,
+ const blink::WebInputEvent* event,
+ const ui::LatencyInfo& latency,
+ InputEventDispatchType dispatch_type) = 0;
virtual void SendInputEventAck(int routing_id,
blink::WebInputEvent::Type type,
@@ -105,10 +89,13 @@ class CONTENT_EXPORT MainThreadEventQueueClient {
// <--(PT)--- // Notify from BL event.
// <-------(ACK)------
//
-class CONTENT_EXPORT MainThreadEventQueue {
+class CONTENT_EXPORT MainThreadEventQueue
+ : public base::RefCountedThreadSafe<MainThreadEventQueue> {
public:
- MainThreadEventQueue(int routing_id, MainThreadEventQueueClient* client);
- ~MainThreadEventQueue();
+ MainThreadEventQueue(
+ int routing_id,
+ MainThreadEventQueueClient* client,
+ const scoped_refptr<base::SingleThreadTaskRunner>& main_task_runner);
// Called once the compositor has handled |event| and indicated that it is
// a non-blocking event to be queued to the main thread.
@@ -125,17 +112,23 @@ class CONTENT_EXPORT MainThreadEventQueue {
void set_is_flinging(bool is_flinging) { is_flinging_ = is_flinging; }
private:
+ friend class base::RefCountedThreadSafe<MainThreadEventQueue>;
+ ~MainThreadEventQueue();
+ void QueueEvent(std::unique_ptr<EventWithDispatchType>&& event);
+ void SendEventNotificationToMainThread();
+ void PopEventOnMainThread();
+ void SendEventToMainThread(const blink::WebInputEvent* event,
+ const ui::LatencyInfo& latency,
+ InputEventDispatchType original_dispatch_type);
+
friend class MainThreadEventQueueTest;
int routing_id_;
MainThreadEventQueueClient* client_;
- WebInputEventQueue<PendingMouseWheelEvent> wheel_events_;
- WebInputEventQueue<PendingTouchEvent> touch_events_;
+ WebInputEventQueue<EventWithDispatchType> events_;
+ std::unique_ptr<EventWithDispatchType> in_flight_event_;
bool is_flinging_;
tdresser 2016/07/20 20:52:27 Do we still need is_flinging?
dtapuska 2016/07/27 05:29:00 yes sorry that was missing code.
-
- // TODO(dtapuska): These can be removed when the queues are dequeued
- // on the main thread. See crbug.com/624021
- std::unique_ptr<PendingMouseWheelEvent> in_flight_wheel_event_;
- std::unique_ptr<PendingTouchEvent> in_flight_touch_event_;
+ base::Lock event_queue_mutex_;
+ scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
DISALLOW_COPY_AND_ASSIGN(MainThreadEventQueue);
};

Powered by Google App Engine
This is Rietveld 408576698