| Index: content/renderer/input/main_thread_event_queue.cc
|
| diff --git a/content/renderer/input/main_thread_event_queue.cc b/content/renderer/input/main_thread_event_queue.cc
|
| index a9875e9b803898053c93819fc1cae9451c0001c4..f0ef0d3e774e29a536d9f46c8e6a355b1f42dec0 100644
|
| --- a/content/renderer/input/main_thread_event_queue.cc
|
| +++ b/content/renderer/input/main_thread_event_queue.cc
|
| @@ -9,6 +9,7 @@
|
| #include "base/strings/string_number_conversions.h"
|
| #include "content/common/input/event_with_latency_info.h"
|
| #include "content/common/input_messages.h"
|
| +#include "content/renderer/render_widget.h"
|
|
|
| namespace content {
|
|
|
| @@ -30,21 +31,19 @@ class QueuedClosure : public MainThreadEventQueueTask {
|
|
|
| bool IsWebInputEvent() const override { return false; }
|
|
|
| - void Dispatch(int routing_id, MainThreadEventQueueClient*) override {
|
| - closure_.Run();
|
| - }
|
| -
|
| - void EventHandled(int routing_id,
|
| - blink::scheduler::RendererScheduler* renderer_scheduler,
|
| - MainThreadEventQueueClient* client,
|
| - blink::WebInputEvent::Type type,
|
| - blink::WebInputEventResult result,
|
| - InputEventAckState ack_result) override {}
|
| + void Dispatch(MainThreadEventQueue*) override { closure_.Run(); }
|
|
|
| private:
|
| base::Closure closure_;
|
| };
|
|
|
| +// Time interval at which touchmove events during scroll will be skipped
|
| +// during rAF signal.
|
| +const base::TimeDelta kAsyncTouchMoveInterval =
|
| + base::TimeDelta::FromMilliseconds(200);
|
| +
|
| +} // namespace
|
| +
|
| class QueuedWebInputEvent : public ScopedWebInputEventWithLatencyInfo,
|
| public MainThreadEventQueueTask {
|
| public:
|
| @@ -99,7 +98,7 @@ class QueuedWebInputEvent : public ScopedWebInputEventWithLatencyInfo,
|
|
|
| bool IsWebInputEvent() const override { return true; }
|
|
|
| - void Dispatch(int routing_id, MainThreadEventQueueClient* client) override {
|
| + void Dispatch(MainThreadEventQueue* queue) override {
|
| // Report the coalesced count only for continuous events; otherwise
|
| // the zero value would be dominated by non-continuous events.
|
| base::TimeTicks now = base::TimeTicks::Now();
|
| @@ -121,35 +120,10 @@ class QueuedWebInputEvent : public ScopedWebInputEventWithLatencyInfo,
|
| (now - creationTimestamp()).InMicroseconds(), 1, kTenSeconds, 50);
|
| }
|
|
|
| - InputEventDispatchType dispatch_type = dispatchType();
|
| - if (!blockingCoalescedEventIds().empty()) {
|
| - switch (dispatch_type) {
|
| - case DISPATCH_TYPE_BLOCKING:
|
| - dispatch_type = DISPATCH_TYPE_BLOCKING_NOTIFY_MAIN;
|
| - break;
|
| - case DISPATCH_TYPE_NON_BLOCKING:
|
| - dispatch_type = DISPATCH_TYPE_NON_BLOCKING_NOTIFY_MAIN;
|
| - break;
|
| - default:
|
| - NOTREACHED();
|
| - }
|
| - }
|
| - client->HandleEventOnMainThread(routing_id, &coalesced_event(),
|
| - latencyInfo(), dispatch_type);
|
| - }
|
| -
|
| - void EventHandled(int routing_id,
|
| - blink::scheduler::RendererScheduler* renderer_scheduler,
|
| - MainThreadEventQueueClient* client,
|
| - blink::WebInputEvent::Type type,
|
| - blink::WebInputEventResult result,
|
| - InputEventAckState ack_result) override {
|
| - for (const auto id : blockingCoalescedEventIds()) {
|
| - client->SendInputEventAck(routing_id, type, ack_result, id);
|
| - if (renderer_scheduler) {
|
| - renderer_scheduler->DidHandleInputEventOnMainThread(event(), result);
|
| - }
|
| - }
|
| + InputEventAckState ack_result = queue->HandleEventOnMainThread(
|
| + coalesced_event(), latencyInfo(), dispatchType());
|
| + for (const auto id : blockingCoalescedEventIds())
|
| + queue->SendInputEventAck(event(), ack_result, id);
|
| }
|
|
|
| bool originallyCancelable() const { return originally_cancelable_; }
|
| @@ -220,37 +194,16 @@ class QueuedWebInputEvent : public ScopedWebInputEventWithLatencyInfo,
|
| bool originally_cancelable_;
|
| };
|
|
|
| -// Time interval at which touchmove events will be skipped during rAF signal.
|
| -const base::TimeDelta kAsyncTouchMoveInterval =
|
| - base::TimeDelta::FromMilliseconds(200);
|
| -
|
| -bool IsAsyncTouchMove(
|
| - const std::unique_ptr<MainThreadEventQueueTask>& queued_item) {
|
| - if (!queued_item->IsWebInputEvent())
|
| - return false;
|
| - const QueuedWebInputEvent* event =
|
| - static_cast<const QueuedWebInputEvent*>(queued_item.get());
|
| - if (event->event().GetType() != blink::WebInputEvent::kTouchMove)
|
| - return false;
|
| - const blink::WebTouchEvent& touch_event =
|
| - static_cast<const blink::WebTouchEvent&>(event->event());
|
| - return touch_event.moved_beyond_slop_region && !event->originallyCancelable();
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| MainThreadEventQueue::SharedState::SharedState()
|
| : sent_main_frame_request_(false), sent_post_task_(false) {}
|
|
|
| MainThreadEventQueue::SharedState::~SharedState() {}
|
|
|
| MainThreadEventQueue::MainThreadEventQueue(
|
| - int routing_id,
|
| MainThreadEventQueueClient* client,
|
| const scoped_refptr<base::SingleThreadTaskRunner>& main_task_runner,
|
| blink::scheduler::RendererScheduler* renderer_scheduler)
|
| - : routing_id_(routing_id),
|
| - client_(client),
|
| + : client_(client),
|
| last_touch_start_forced_nonblocking_due_to_fling_(false),
|
| enable_fling_passive_listener_flag_(base::FeatureList::IsEnabled(
|
| features::kPassiveEventListenersDueToFling)),
|
| @@ -391,7 +344,7 @@ void MainThreadEventQueue::QueueClosure(const base::Closure& closure) {
|
|
|
| void MainThreadEventQueue::DispatchInFlightEvent() {
|
| if (in_flight_event_) {
|
| - in_flight_event_->Dispatch(routing_id_, client_);
|
| + in_flight_event_->Dispatch(this);
|
| in_flight_event_.reset();
|
| }
|
| }
|
| @@ -410,7 +363,7 @@ void MainThreadEventQueue::PossiblyScheduleMainFrame() {
|
| }
|
| }
|
| if (needs_main_frame)
|
| - client_->NeedsMainFrame(routing_id_);
|
| + SetNeedsMainFrame();
|
| }
|
|
|
| void MainThreadEventQueue::DispatchEvents() {
|
| @@ -444,13 +397,17 @@ void MainThreadEventQueue::DispatchEvents() {
|
| PossiblyScheduleMainFrame();
|
| }
|
|
|
| -void MainThreadEventQueue::EventHandled(blink::WebInputEvent::Type type,
|
| - blink::WebInputEventResult result,
|
| - InputEventAckState ack_result) {
|
| - if (in_flight_event_) {
|
| - in_flight_event_->EventHandled(routing_id_, renderer_scheduler_, client_,
|
| - type, result, ack_result);
|
| - }
|
| +static bool IsAsyncTouchMove(
|
| + const std::unique_ptr<MainThreadEventQueueTask>& queued_item) {
|
| + if (!queued_item->IsWebInputEvent())
|
| + return false;
|
| + const QueuedWebInputEvent* event =
|
| + static_cast<const QueuedWebInputEvent*>(queued_item.get());
|
| + if (event->event().GetType() != blink::WebInputEvent::kTouchMove)
|
| + return false;
|
| + const blink::WebTouchEvent& touch_event =
|
| + static_cast<const blink::WebTouchEvent&>(event->event());
|
| + return touch_event.moved_beyond_slop_region && !event->originallyCancelable();
|
| }
|
|
|
| void MainThreadEventQueue::DispatchRafAlignedInput(base::TimeTicks frame_time) {
|
| @@ -526,7 +483,7 @@ void MainThreadEventQueue::QueueEvent(
|
| if (needs_post_task)
|
| PostTaskToMainThread();
|
| if (needs_main_frame)
|
| - client_->NeedsMainFrame(routing_id_);
|
| + SetNeedsMainFrame();
|
| }
|
|
|
| bool MainThreadEventQueue::IsRafAlignedInputDisabled() const {
|
| @@ -550,4 +507,44 @@ bool MainThreadEventQueue::IsRafAlignedEvent(
|
| }
|
| }
|
|
|
| +InputEventAckState MainThreadEventQueue::HandleEventOnMainThread(
|
| + const blink::WebCoalescedInputEvent& event,
|
| + const ui::LatencyInfo& latency,
|
| + InputEventDispatchType dispatch_type) {
|
| + if (client_)
|
| + return client_->HandleInputEvent(event, latency, dispatch_type);
|
| + return INPUT_EVENT_ACK_STATE_NOT_CONSUMED;
|
| +}
|
| +
|
| +void MainThreadEventQueue::SendInputEventAck(const blink::WebInputEvent& event,
|
| + InputEventAckState ack_result,
|
| + uint32_t touch_event_id) {
|
| + DCHECK(main_task_runner_->BelongsToCurrentThread());
|
| + if (!client_)
|
| + return;
|
| + client_->SendInputEventAck(event.GetType(), ack_result, touch_event_id);
|
| + if (renderer_scheduler_) {
|
| + renderer_scheduler_->DidHandleInputEventOnMainThread(
|
| + event, ack_result == INPUT_EVENT_ACK_STATE_CONSUMED
|
| + ? blink::WebInputEventResult::kHandledApplication
|
| + : blink::WebInputEventResult::kNotHandled);
|
| + }
|
| +}
|
| +
|
| +void MainThreadEventQueue::SetNeedsMainFrame() {
|
| + if (main_task_runner_->BelongsToCurrentThread()) {
|
| + if (client_)
|
| + client_->SetNeedsMainFrame();
|
| + return;
|
| + }
|
| +
|
| + main_task_runner_->PostTask(
|
| + FROM_HERE, base::Bind(&MainThreadEventQueue::SetNeedsMainFrame, this));
|
| +}
|
| +
|
| +void MainThreadEventQueue::ClearClient() {
|
| + DCHECK(main_task_runner_->BelongsToCurrentThread());
|
| + client_ = nullptr;
|
| +}
|
| +
|
| } // namespace content
|
|
|