| Index: content/browser/renderer_host/input/input_queue_unittest.cc
|
| diff --git a/content/browser/renderer_host/input/input_queue_unittest.cc b/content/browser/renderer_host/input/input_queue_unittest.cc
|
| deleted file mode 100644
|
| index 2d183d96cca615c08cf931143b71a8dca6c6bb0c..0000000000000000000000000000000000000000
|
| --- a/content/browser/renderer_host/input/input_queue_unittest.cc
|
| +++ /dev/null
|
| @@ -1,363 +0,0 @@
|
| -// Copyright 2013 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include <vector>
|
| -
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "content/browser/renderer_host/input/browser_input_event.h"
|
| -#include "content/browser/renderer_host/input/input_queue.h"
|
| -#include "content/browser/renderer_host/input/input_queue_client.h"
|
| -#include "content/common/input/event_packet.h"
|
| -#include "content/common/input/input_event.h"
|
| -#include "content/common/input/ipc_input_event_payload.h"
|
| -#include "content/common/input/web_input_event_payload.h"
|
| -#include "content/common/input_messages.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -#include "ui/events/latency_info.h"
|
| -
|
| -namespace content {
|
| -namespace {
|
| -
|
| -using WebKit::WebGestureEvent;
|
| -using WebKit::WebInputEvent;
|
| -using WebKit::WebKeyboardEvent;
|
| -using WebKit::WebMouseEvent;
|
| -using WebKit::WebMouseWheelEvent;
|
| -using WebKit::WebTouchEvent;
|
| -
|
| -class InputQueueTest : public testing::Test,
|
| - public InputQueueClient,
|
| - public BrowserInputEventClient {
|
| - public:
|
| - InputQueueTest()
|
| - : queue_(new InputQueue(this)),
|
| - routing_id_(0),
|
| - num_flush_completions_(0),
|
| - num_flush_requests_(0),
|
| - num_packet_deliveries_(0),
|
| - next_input_id_(1) {}
|
| -
|
| - // InputQueueClient
|
| - virtual void Deliver(const EventPacket& packet) OVERRIDE {
|
| - EXPECT_LT(0u, packet.size());
|
| - ++num_packet_deliveries_;
|
| - current_packet_id_ = packet.id();
|
| - current_packet_dispositions_.resize(packet.size(), INPUT_EVENT_UNHANDLED);
|
| - }
|
| -
|
| - virtual void DidFinishFlush() OVERRIDE { ++num_flush_completions_; }
|
| - virtual void SetNeedsFlush() OVERRIDE { ++num_flush_requests_; }
|
| -
|
| - // BrowserInputEventClient
|
| - virtual void OnDispatched(const BrowserInputEvent& event,
|
| - InputEventDisposition disposition) OVERRIDE {
|
| - acked_dispositions_.push_back(disposition);
|
| - }
|
| -
|
| - virtual void OnDispatched(
|
| - const BrowserInputEvent& event,
|
| - InputEventDisposition disposition,
|
| - ScopedVector<BrowserInputEvent>* followup) OVERRIDE {
|
| - acked_followup_dispositions_.push_back(disposition);
|
| - if (event_to_inject_)
|
| - followup->push_back(event_to_inject_.release());
|
| - }
|
| -
|
| - int num_flush_requests() const { return num_flush_requests_; }
|
| - int num_flush_completions() const { return num_flush_completions_; }
|
| - int num_packet_deliveries() const { return num_packet_deliveries_; }
|
| -
|
| - protected:
|
| - scoped_ptr<BrowserInputEvent> CreateIPCInputEvent(IPC::Message* message) {
|
| - return BrowserInputEvent::Create(
|
| - NextInputID(),
|
| - IPCInputEventPayload::Create(make_scoped_ptr(message)),
|
| - this);
|
| - }
|
| -
|
| - scoped_ptr<BrowserInputEvent> CreateWebInputEvent(
|
| - WebInputEvent::Type web_type) {
|
| - WebKit::WebMouseEvent mouse;
|
| - WebKit::WebMouseWheelEvent wheel;
|
| - WebKit::WebTouchEvent touch;
|
| - WebKit::WebGestureEvent gesture;
|
| - WebKit::WebKeyboardEvent keyboard;
|
| -
|
| - WebKit::WebInputEvent* web_event = NULL;
|
| - if (WebInputEvent::isMouseEventType(web_type))
|
| - web_event = &mouse;
|
| - else if (WebInputEvent::isKeyboardEventType(web_type))
|
| - web_event = &keyboard;
|
| - else if (WebInputEvent::isTouchEventType(web_type))
|
| - web_event = &touch;
|
| - else if (WebInputEvent::isGestureEventType(web_type))
|
| - web_event = &gesture;
|
| - else
|
| - web_event = &wheel;
|
| - web_event->type = web_type;
|
| -
|
| - return BrowserInputEvent::Create(
|
| - NextInputID(),
|
| - WebInputEventPayload::Create(*web_event, ui::LatencyInfo(), false),
|
| - this);
|
| - }
|
| -
|
| - void QueueEvent(IPC::Message* message) {
|
| - queue_->QueueEvent(CreateIPCInputEvent(message));
|
| - }
|
| -
|
| - void QueueEvent(WebInputEvent::Type web_type) {
|
| - queue_->QueueEvent(CreateWebInputEvent(web_type));
|
| - }
|
| -
|
| - bool Flush(InputEventDisposition disposition) {
|
| - StartFlush();
|
| - return FinishFlush(disposition);
|
| - }
|
| -
|
| - void StartFlush() {
|
| - acked_dispositions_.clear();
|
| - acked_followup_dispositions_.clear();
|
| - current_packet_id_ = 0;
|
| - current_packet_dispositions_.clear();
|
| - queue_->BeginFlush();
|
| - }
|
| -
|
| - bool FinishFlush(InputEventDisposition disposition) {
|
| - if (!current_packet_id_)
|
| - return false;
|
| - current_packet_dispositions_ = InputEventDispositions(
|
| - current_packet_dispositions_.size(), disposition);
|
| - return InputQueue::ACK_OK ==
|
| - queue_->OnEventPacketAck(current_packet_id_,
|
| - current_packet_dispositions_);
|
| - }
|
| -
|
| - int64 NextInputID() { return next_input_id_++; }
|
| -
|
| - scoped_ptr<InputQueue> queue_;
|
| -
|
| - int routing_id_;
|
| - int64 current_packet_id_;
|
| - InputEventDispositions current_packet_dispositions_;
|
| -
|
| - InputEventDispositions acked_dispositions_;
|
| - InputEventDispositions acked_followup_dispositions_;
|
| - scoped_ptr<BrowserInputEvent> event_to_inject_;
|
| -
|
| - int num_flush_completions_;
|
| - int num_flush_requests_;
|
| - int num_packet_deliveries_;
|
| - int next_input_id_;
|
| -};
|
| -
|
| -TEST_F(InputQueueTest, SetNeedsFlushOnQueueEvent) {
|
| - EXPECT_EQ(0, num_flush_requests());
|
| -
|
| - QueueEvent(WebInputEvent::MouseDown);
|
| - EXPECT_EQ(1, num_flush_requests());
|
| -
|
| - // Additional queued events should not trigger additional flush requests.
|
| - QueueEvent(WebInputEvent::MouseUp);
|
| - EXPECT_EQ(1, num_flush_requests());
|
| - QueueEvent(WebInputEvent::TouchStart);
|
| - EXPECT_EQ(1, num_flush_requests());
|
| -}
|
| -
|
| -TEST_F(InputQueueTest, NoSetNeedsFlushOnQueueIfFlushing) {
|
| - QueueEvent(WebInputEvent::GestureScrollBegin);
|
| - EXPECT_EQ(1, num_flush_requests());
|
| -
|
| - StartFlush();
|
| - EXPECT_EQ(1, num_flush_requests());
|
| - EXPECT_EQ(1, num_packet_deliveries());
|
| -
|
| - // Events queued after a flush will not trigger an additional flush request.
|
| - QueueEvent(WebInputEvent::GestureScrollBegin);
|
| - EXPECT_EQ(1, num_flush_requests());
|
| - QueueEvent(WebInputEvent::GestureScrollEnd);
|
| - EXPECT_EQ(1, num_flush_requests());
|
| -}
|
| -
|
| -TEST_F(InputQueueTest, SetNeedsFlushAfterDidFinishFlushIfEventsQueued) {
|
| - QueueEvent(WebInputEvent::GestureScrollBegin);
|
| - EXPECT_EQ(1, num_flush_requests());
|
| -
|
| - StartFlush();
|
| - EXPECT_EQ(1, num_packet_deliveries());
|
| -
|
| - QueueEvent(WebInputEvent::GestureScrollBegin);
|
| - EXPECT_EQ(1, num_flush_requests());
|
| -
|
| - // An additional flush request is sent for the event queued after the flush.
|
| - ASSERT_TRUE(current_packet_id_);
|
| - ASSERT_TRUE(FinishFlush(INPUT_EVENT_IMPL_THREAD_CONSUMED));
|
| - EXPECT_EQ(1, num_flush_completions());
|
| - EXPECT_EQ(2, num_flush_requests());
|
| -}
|
| -
|
| -TEST_F(InputQueueTest, EventPacketSentAfterFlush) {
|
| - EXPECT_EQ(0, num_packet_deliveries());
|
| - QueueEvent(WebInputEvent::GestureScrollBegin);
|
| - EXPECT_EQ(0, num_packet_deliveries());
|
| - StartFlush();
|
| - EXPECT_EQ(1, num_packet_deliveries());
|
| -}
|
| -
|
| -TEST_F(InputQueueTest, AcksHandledInProperOrder) {
|
| - QueueEvent(WebInputEvent::GestureScrollBegin);
|
| - QueueEvent(WebInputEvent::GestureScrollEnd);
|
| - QueueEvent(WebInputEvent::GestureFlingStart);
|
| -
|
| - queue_->BeginFlush();
|
| - ASSERT_EQ(3u, current_packet_dispositions_.size());
|
| - current_packet_dispositions_[0] = INPUT_EVENT_IMPL_THREAD_CONSUMED;
|
| - current_packet_dispositions_[1] = INPUT_EVENT_MAIN_THREAD_CONSUMED;
|
| - current_packet_dispositions_[2] = INPUT_EVENT_MAIN_THREAD_NO_CONSUMER_EXISTS;
|
| - queue_->OnEventPacketAck(current_packet_id_, current_packet_dispositions_);
|
| - EXPECT_EQ(1, num_flush_completions());
|
| -
|
| - ASSERT_EQ(3u, acked_dispositions_.size());
|
| - EXPECT_EQ(acked_dispositions_[0], INPUT_EVENT_IMPL_THREAD_CONSUMED);
|
| - EXPECT_EQ(acked_dispositions_[1], INPUT_EVENT_MAIN_THREAD_CONSUMED);
|
| - EXPECT_EQ(acked_dispositions_[2], INPUT_EVENT_MAIN_THREAD_NO_CONSUMER_EXISTS);
|
| -}
|
| -
|
| -TEST_F(InputQueueTest, FollowupWhenFollowupEventNotConsumed) {
|
| - InputEventDisposition unconsumed_dispositions[] = {
|
| - INPUT_EVENT_IMPL_THREAD_NO_CONSUMER_EXISTS,
|
| - INPUT_EVENT_MAIN_THREAD_NOT_PREVENT_DEFAULTED,
|
| - INPUT_EVENT_MAIN_THREAD_NO_CONSUMER_EXISTS
|
| - };
|
| - for (size_t i = 0; i < arraysize(unconsumed_dispositions); ++i) {
|
| - QueueEvent(WebInputEvent::GestureScrollBegin);
|
| - QueueEvent(WebInputEvent::TouchStart);
|
| - QueueEvent(WebInputEvent::TouchMove);
|
| -
|
| - Flush(unconsumed_dispositions[i]);
|
| - EXPECT_EQ(1u, acked_dispositions_.size()) << i;
|
| - EXPECT_EQ(2u, acked_followup_dispositions_.size()) << i;
|
| - }
|
| -}
|
| -
|
| -TEST_F(InputQueueTest, NoFollowupWhenFollowupEventConsumed) {
|
| - InputEventDisposition consumed_dispositions[] = {
|
| - INPUT_EVENT_IMPL_THREAD_CONSUMED,
|
| - INPUT_EVENT_MAIN_THREAD_PREVENT_DEFAULTED,
|
| - INPUT_EVENT_MAIN_THREAD_CONSUMED
|
| - };
|
| - for (size_t i = 0; i < arraysize(consumed_dispositions); ++i) {
|
| - QueueEvent(WebInputEvent::GestureScrollBegin);
|
| - QueueEvent(WebInputEvent::TouchStart);
|
| - QueueEvent(WebInputEvent::TouchMove);
|
| -
|
| - Flush(consumed_dispositions[i]);
|
| - EXPECT_EQ(3u, acked_dispositions_.size()) << i;
|
| - EXPECT_EQ(0u, acked_followup_dispositions_.size()) << i;
|
| - }
|
| -}
|
| -
|
| -TEST_F(InputQueueTest, FlushOnEmptyQueueIgnored) {
|
| - Flush(INPUT_EVENT_MAIN_THREAD_CONSUMED);
|
| - EXPECT_EQ(0, num_flush_requests());
|
| - EXPECT_EQ(0, num_flush_completions());
|
| -
|
| - QueueEvent(WebInputEvent::GestureScrollBegin);
|
| - Flush(INPUT_EVENT_MAIN_THREAD_CONSUMED);
|
| - EXPECT_EQ(1, num_flush_requests());
|
| - EXPECT_EQ(1, num_flush_completions());
|
| -
|
| - Flush(INPUT_EVENT_MAIN_THREAD_CONSUMED);
|
| - EXPECT_EQ(1, num_flush_requests());
|
| - EXPECT_EQ(1, num_flush_completions());
|
| -}
|
| -
|
| -TEST_F(InputQueueTest, FlushContinuesUntilAllEventsProcessed) {
|
| - QueueEvent(WebInputEvent::GestureScrollBegin);
|
| - QueueEvent(WebInputEvent::GestureScrollEnd);
|
| - QueueEvent(WebInputEvent::GestureFlingStart);
|
| -
|
| - EXPECT_EQ(1, num_flush_requests());
|
| - Flush(INPUT_EVENT_COULD_NOT_DELIVER);
|
| - EXPECT_EQ(0, num_flush_completions());
|
| -
|
| - FinishFlush(INPUT_EVENT_COULD_NOT_DELIVER);
|
| - EXPECT_EQ(0, num_flush_completions());
|
| -
|
| - ASSERT_TRUE(FinishFlush(INPUT_EVENT_MAIN_THREAD_CONSUMED));
|
| - EXPECT_EQ(1, num_flush_completions());
|
| -}
|
| -
|
| -TEST_F(InputQueueTest, InvalidPacketAckIgnored) {
|
| - // Packet never flushed, any ack should be ignored.
|
| - InputQueue::AckResult result =
|
| - queue_->OnEventPacketAck(0, InputEventDispositions());
|
| - EXPECT_EQ(InputQueue::ACK_UNEXPECTED, result);
|
| -
|
| - QueueEvent(WebInputEvent::GestureScrollBegin);
|
| - StartFlush();
|
| - // Tamper with the sent packet by adding an extra event.
|
| - current_packet_dispositions_.push_back(INPUT_EVENT_MAIN_THREAD_CONSUMED);
|
| - bool valid_packet_ack = FinishFlush(INPUT_EVENT_MAIN_THREAD_CONSUMED);
|
| - EXPECT_EQ(0, num_flush_completions());
|
| - EXPECT_FALSE(valid_packet_ack);
|
| -
|
| - // Fix the packet.
|
| - current_packet_dispositions_.pop_back();
|
| - valid_packet_ack = FinishFlush(INPUT_EVENT_MAIN_THREAD_CONSUMED);
|
| - EXPECT_EQ(1, num_flush_completions());
|
| - EXPECT_TRUE(valid_packet_ack);
|
| -
|
| - // Tamper with the packet by changing the id.
|
| - QueueEvent(WebInputEvent::GestureScrollBegin);
|
| - StartFlush();
|
| - int64 packet_ack_id = -1;
|
| - std::swap(current_packet_id_, packet_ack_id);
|
| - valid_packet_ack = FinishFlush(INPUT_EVENT_MAIN_THREAD_CONSUMED);
|
| - EXPECT_EQ(1, num_flush_completions());
|
| - EXPECT_FALSE(valid_packet_ack);
|
| -
|
| - // Fix the packet.
|
| - std::swap(current_packet_id_, packet_ack_id);
|
| - valid_packet_ack = FinishFlush(INPUT_EVENT_MAIN_THREAD_CONSUMED);
|
| - EXPECT_EQ(2, num_flush_completions());
|
| - EXPECT_TRUE(valid_packet_ack);
|
| -}
|
| -
|
| -TEST_F(InputQueueTest, InjectedEventsAckedBeforeDidFinishFlush) {
|
| - QueueEvent(WebInputEvent::GestureScrollBegin);
|
| - QueueEvent(WebInputEvent::TouchMove);
|
| -
|
| - event_to_inject_ = CreateIPCInputEvent(new InputMsg_Copy(routing_id_));
|
| - Flush(INPUT_EVENT_IMPL_THREAD_NO_CONSUMER_EXISTS);
|
| - EXPECT_EQ(0, num_flush_completions());
|
| -
|
| - // The injected event should now be in the event packet.
|
| - EXPECT_EQ(1u, current_packet_dispositions_.size());
|
| - EXPECT_EQ(1u, acked_followup_dispositions_.size());
|
| - ASSERT_TRUE(FinishFlush(INPUT_EVENT_MAIN_THREAD_CONSUMED));
|
| - EXPECT_EQ(1, num_flush_completions());
|
| -
|
| - QueueEvent(WebInputEvent::GestureScrollBegin);
|
| - QueueEvent(WebInputEvent::TouchStart);
|
| - event_to_inject_ = CreateWebInputEvent(WebInputEvent::TouchMove);
|
| - Flush(INPUT_EVENT_MAIN_THREAD_NO_CONSUMER_EXISTS);
|
| - // |event_to_inject_| is now in the event packet.
|
| - EXPECT_EQ(1u, acked_followup_dispositions_.size());
|
| - EXPECT_EQ(1u, current_packet_dispositions_.size());
|
| -
|
| - event_to_inject_ = CreateWebInputEvent(WebInputEvent::TouchMove);
|
| - // the next |event_to_inject_| is now in the event packet.
|
| - ASSERT_TRUE(FinishFlush(INPUT_EVENT_MAIN_THREAD_NO_CONSUMER_EXISTS));
|
| -
|
| - EXPECT_EQ(2u, acked_followup_dispositions_.size());
|
| - EXPECT_EQ(1u, current_packet_dispositions_.size());
|
| - EXPECT_EQ(1, num_flush_completions());
|
| -
|
| - ASSERT_TRUE(FinishFlush(INPUT_EVENT_MAIN_THREAD_CONSUMED));
|
| - EXPECT_EQ(2, num_flush_completions());
|
| -}
|
| -
|
| -} // namespace
|
| -} // namespace content
|
|
|