| // Copyright 2015 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 "third_party/blink/renderer/core/events/pointer_event_factory.h" |
| |
| #include <gtest/gtest.h> |
| |
| #include <climits> |
| |
| #include "base/time/time.h" |
| #include "third_party/blink/public/platform/web_pointer_properties.h" |
| #include "third_party/blink/renderer/core/frame/local_frame_view.h" |
| #include "third_party/blink/renderer/core/page/page.h" |
| |
| namespace blink { |
| |
| namespace { |
| |
| const char* PointerTypeNameForWebPointPointerType( |
| WebPointerProperties::PointerType type) { |
| switch (type) { |
| case WebPointerProperties::PointerType::kUnknown: |
| return ""; |
| case WebPointerProperties::PointerType::kTouch: |
| return "touch"; |
| case WebPointerProperties::PointerType::kPen: |
| case WebPointerProperties::PointerType::kEraser: |
| return "pen"; |
| case WebPointerProperties::PointerType::kMouse: |
| return "mouse"; |
| default: |
| NOTREACHED(); |
| return ""; |
| } |
| } |
| } |
| |
| class PointerEventFactoryTest : public testing::Test { |
| protected: |
| void SetUp() override; |
| PointerEvent* CreateAndCheckPointerCancel(WebPointerProperties::PointerType, |
| int raw_id, |
| int unique_id, |
| bool is_primary); |
| PointerEvent* CreateAndCheckWebPointerEvent( |
| WebPointerProperties::PointerType pointer_type, |
| int raw_id, |
| int unique_id, |
| bool is_primary, |
| bool hovering, |
| WebInputEvent::Modifiers modifiers = WebInputEvent::kNoModifiers, |
| WebInputEvent::Type type = WebInputEvent::kPointerDown, |
| WebPointerProperties::Button button = |
| WebPointerProperties::Button::kNoButton, |
| wtf_size_t coalesced_event_count = 0, |
| wtf_size_t predicted_event_count = 0) { |
| WebPointerEvent web_pointer_event; |
| web_pointer_event.pointer_type = pointer_type; |
| web_pointer_event.id = raw_id; |
| web_pointer_event.SetType(type); |
| web_pointer_event.SetTimeStamp(WebInputEvent::GetStaticTimeStampForTests()); |
| web_pointer_event.SetModifiers(modifiers); |
| web_pointer_event.force = 1.0; |
| web_pointer_event.hovering = hovering; |
| web_pointer_event.button = button; |
| Vector<WebPointerEvent> coalesced_events; |
| for (wtf_size_t i = 0; i < coalesced_event_count; i++) { |
| coalesced_events.push_back(web_pointer_event); |
| } |
| Vector<WebPointerEvent> predicted_events; |
| for (wtf_size_t i = 0; i < predicted_event_count; i++) { |
| predicted_events.push_back(web_pointer_event); |
| } |
| PointerEvent* pointer_event = pointer_event_factory_.Create( |
| web_pointer_event, coalesced_events, predicted_events, nullptr); |
| EXPECT_EQ(unique_id, pointer_event->pointerId()); |
| EXPECT_EQ(is_primary, pointer_event->isPrimary()); |
| EXPECT_EQ(WebInputEvent::GetStaticTimeStampForTests(), |
| pointer_event->PlatformTimeStamp()); |
| const char* expected_pointer_type = |
| PointerTypeNameForWebPointPointerType(pointer_type); |
| EXPECT_EQ(expected_pointer_type, pointer_event->pointerType()); |
| if (type == WebInputEvent::kPointerMove) { |
| EXPECT_EQ(coalesced_event_count, |
| pointer_event->getCoalescedEvents().size()); |
| EXPECT_EQ(predicted_event_count, |
| pointer_event->getPredictedEvents().size()); |
| for (wtf_size_t i = 0; i < coalesced_event_count; i++) { |
| EXPECT_EQ(unique_id, |
| pointer_event->getCoalescedEvents()[i]->pointerId()); |
| EXPECT_EQ(is_primary, |
| pointer_event->getCoalescedEvents()[i]->isPrimary()); |
| EXPECT_EQ(expected_pointer_type, pointer_event->pointerType()); |
| EXPECT_EQ(WebInputEvent::GetStaticTimeStampForTests(), |
| pointer_event->PlatformTimeStamp()); |
| } |
| for (wtf_size_t i = 0; i < predicted_event_count; i++) { |
| EXPECT_EQ(unique_id, |
| pointer_event->getPredictedEvents()[i]->pointerId()); |
| EXPECT_EQ(is_primary, |
| pointer_event->getPredictedEvents()[i]->isPrimary()); |
| EXPECT_EQ(expected_pointer_type, pointer_event->pointerType()); |
| EXPECT_EQ(WebInputEvent::GetStaticTimeStampForTests(), |
| pointer_event->PlatformTimeStamp()); |
| } |
| } else { |
| EXPECT_EQ(0u, pointer_event->getCoalescedEvents().size()); |
| EXPECT_EQ(0u, pointer_event->getPredictedEvents().size()); |
| } |
| return pointer_event; |
| } |
| void CreateAndCheckPointerTransitionEvent(PointerEvent*, const AtomicString&); |
| void CheckNonHoveringPointers(const std::set<int>& expected); |
| |
| PointerEventFactory pointer_event_factory_; |
| int expected_mouse_id_; |
| int mapped_id_start_; |
| |
| }; |
| |
| void PointerEventFactoryTest::SetUp() { |
| expected_mouse_id_ = 1; |
| mapped_id_start_ = 2; |
| } |
| |
| PointerEvent* PointerEventFactoryTest::CreateAndCheckPointerCancel( |
| WebPointerProperties::PointerType pointer_type, |
| int raw_id, |
| int unique_id, |
| bool is_primary) { |
| PointerEvent* pointer_event = pointer_event_factory_.CreatePointerCancelEvent( |
| unique_id, WebInputEvent::GetStaticTimeStampForTests()); |
| EXPECT_EQ("pointercancel", pointer_event->type()); |
| EXPECT_EQ(unique_id, pointer_event->pointerId()); |
| EXPECT_EQ(is_primary, pointer_event->isPrimary()); |
| EXPECT_EQ(PointerTypeNameForWebPointPointerType(pointer_type), |
| pointer_event->pointerType()); |
| EXPECT_EQ(WebInputEvent::GetStaticTimeStampForTests(), |
| pointer_event->PlatformTimeStamp()); |
| |
| return pointer_event; |
| } |
| |
| void PointerEventFactoryTest::CreateAndCheckPointerTransitionEvent( |
| PointerEvent* pointer_event, |
| const AtomicString& type) { |
| PointerEvent* clone_pointer_event = |
| pointer_event_factory_.CreatePointerBoundaryEvent(pointer_event, type, |
| nullptr); |
| EXPECT_EQ(clone_pointer_event->pointerType(), pointer_event->pointerType()); |
| EXPECT_EQ(clone_pointer_event->pointerId(), pointer_event->pointerId()); |
| EXPECT_EQ(clone_pointer_event->isPrimary(), pointer_event->isPrimary()); |
| EXPECT_EQ(clone_pointer_event->type(), type); |
| } |
| |
| void PointerEventFactoryTest::CheckNonHoveringPointers( |
| const std::set<int>& expected_pointers) { |
| Vector<int> pointers = |
| pointer_event_factory_.GetPointerIdsOfNonHoveringPointers(); |
| EXPECT_EQ(pointers.size(), expected_pointers.size()); |
| for (int p : pointers) { |
| EXPECT_TRUE(expected_pointers.find(p) != expected_pointers.end()); |
| } |
| } |
| |
| TEST_F(PointerEventFactoryTest, MousePointer) { |
| EXPECT_TRUE(pointer_event_factory_.IsActive(expected_mouse_id_)); |
| EXPECT_FALSE(pointer_event_factory_.IsActiveButtonsState(expected_mouse_id_)); |
| |
| PointerEvent* pointer_event1 = CreateAndCheckWebPointerEvent( |
| WebPointerProperties::PointerType::kMouse, 0, expected_mouse_id_, |
| true /* isprimary */, true /* hovering */); |
| PointerEvent* pointer_event2 = CreateAndCheckWebPointerEvent( |
| WebPointerProperties::PointerType::kMouse, 0, expected_mouse_id_, |
| true /* isprimary */, true /* hovering */, |
| WebInputEvent::kLeftButtonDown); |
| |
| CreateAndCheckPointerTransitionEvent(pointer_event1, |
| event_type_names::kPointerout); |
| |
| EXPECT_TRUE(pointer_event_factory_.IsActive(expected_mouse_id_)); |
| EXPECT_TRUE(pointer_event_factory_.IsActiveButtonsState(expected_mouse_id_)); |
| |
| pointer_event_factory_.Remove(pointer_event1->pointerId()); |
| |
| EXPECT_TRUE(pointer_event_factory_.IsActive(expected_mouse_id_)); |
| EXPECT_TRUE(pointer_event_factory_.IsActiveButtonsState(expected_mouse_id_)); |
| |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kMouse, 0, |
| expected_mouse_id_, true /* isprimary */, |
| true /* hovering */); |
| |
| EXPECT_TRUE(pointer_event_factory_.IsActive(expected_mouse_id_)); |
| EXPECT_FALSE(pointer_event_factory_.IsActiveButtonsState(expected_mouse_id_)); |
| |
| pointer_event_factory_.Remove(pointer_event1->pointerId()); |
| pointer_event_factory_.Remove(pointer_event2->pointerId()); |
| |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kMouse, 1, |
| expected_mouse_id_, true /* isprimary */, |
| true /* hovering */); |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kMouse, 20, |
| expected_mouse_id_, true /* isprimary */, |
| true /* hovering */); |
| |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kMouse, 0, |
| expected_mouse_id_, true /* isprimary */, |
| true /* hovering */, |
| WebInputEvent::kLeftButtonDown); |
| |
| EXPECT_TRUE(pointer_event_factory_.IsActive(expected_mouse_id_)); |
| EXPECT_TRUE(pointer_event_factory_.IsActiveButtonsState(expected_mouse_id_)); |
| |
| CreateAndCheckPointerCancel(WebPointerProperties::PointerType::kMouse, 0, |
| expected_mouse_id_, true); |
| |
| EXPECT_TRUE(pointer_event_factory_.IsActive(expected_mouse_id_)); |
| EXPECT_FALSE(pointer_event_factory_.IsActiveButtonsState(expected_mouse_id_)); |
| } |
| |
| TEST_F(PointerEventFactoryTest, TouchPointerPrimaryRemovedWhileAnotherIsThere) { |
| PointerEvent* pointer_event1 = CreateAndCheckWebPointerEvent( |
| WebPointerProperties::PointerType::kTouch, 0, mapped_id_start_, |
| true /* isprimary */, false /* hovering */); |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kTouch, 1, |
| mapped_id_start_ + 1, false /* isprimary */, |
| false /* hovering */); |
| |
| pointer_event_factory_.Remove(pointer_event1->pointerId()); |
| |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kTouch, 2, |
| mapped_id_start_ + 2, false /* isprimary */, |
| false /* hovering */); |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kTouch, 1, |
| mapped_id_start_ + 1, false /* isprimary */, |
| false /* hovering */); |
| } |
| |
| TEST_F(PointerEventFactoryTest, TouchPointerReleasedAndPressedAgain) { |
| EXPECT_FALSE(pointer_event_factory_.IsActive(mapped_id_start_)); |
| EXPECT_FALSE(pointer_event_factory_.IsActive(mapped_id_start_ + 1)); |
| EXPECT_FALSE(pointer_event_factory_.IsActiveButtonsState(mapped_id_start_)); |
| EXPECT_FALSE( |
| pointer_event_factory_.IsActiveButtonsState(mapped_id_start_ + 1)); |
| |
| PointerEvent* pointer_event1 = CreateAndCheckWebPointerEvent( |
| WebPointerProperties::PointerType::kTouch, 0, mapped_id_start_, |
| true /* isprimary */, false /* hovering */); |
| PointerEvent* pointer_event2 = CreateAndCheckWebPointerEvent( |
| WebPointerProperties::PointerType::kTouch, 1, mapped_id_start_ + 1, |
| false /* isprimary */, false /* hovering */); |
| |
| CreateAndCheckPointerTransitionEvent(pointer_event1, |
| event_type_names::kPointerleave); |
| CreateAndCheckPointerTransitionEvent(pointer_event2, |
| event_type_names::kPointerenter); |
| |
| EXPECT_TRUE(pointer_event_factory_.IsActive(mapped_id_start_)); |
| EXPECT_TRUE(pointer_event_factory_.IsActive(mapped_id_start_ + 1)); |
| EXPECT_TRUE(pointer_event_factory_.IsActiveButtonsState(mapped_id_start_)); |
| EXPECT_TRUE( |
| pointer_event_factory_.IsActiveButtonsState(mapped_id_start_ + 1)); |
| |
| pointer_event_factory_.Remove(pointer_event1->pointerId()); |
| pointer_event_factory_.Remove(pointer_event2->pointerId()); |
| |
| EXPECT_FALSE(pointer_event_factory_.IsActive(mapped_id_start_)); |
| EXPECT_FALSE(pointer_event_factory_.IsActive(mapped_id_start_ + 1)); |
| EXPECT_FALSE(pointer_event_factory_.IsActiveButtonsState(mapped_id_start_)); |
| EXPECT_FALSE( |
| pointer_event_factory_.IsActiveButtonsState(mapped_id_start_ + 1)); |
| |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kTouch, 1, |
| mapped_id_start_ + 2, true /* isprimary */, |
| false /* hovering */); |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kTouch, 0, |
| mapped_id_start_ + 3, false /* isprimary */, |
| false /* hovering */); |
| |
| pointer_event_factory_.Clear(); |
| |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kTouch, 10, |
| mapped_id_start_, true /* isprimary */, |
| false /* hovering */); |
| } |
| |
| TEST_F(PointerEventFactoryTest, TouchAndDrag) { |
| EXPECT_FALSE(pointer_event_factory_.IsActive(mapped_id_start_)); |
| EXPECT_FALSE(pointer_event_factory_.IsActiveButtonsState(mapped_id_start_)); |
| |
| PointerEvent* pointer_event1 = CreateAndCheckWebPointerEvent( |
| WebPointerProperties::PointerType::kTouch, 0, mapped_id_start_, |
| true /* isprimary */, false /* hovering */); |
| PointerEvent* pointer_event2 = CreateAndCheckWebPointerEvent( |
| WebPointerProperties::PointerType::kTouch, 0, mapped_id_start_, |
| true /* isprimary */, false /* hovering */); |
| |
| EXPECT_TRUE(pointer_event_factory_.IsActive(mapped_id_start_)); |
| EXPECT_TRUE(pointer_event_factory_.IsActiveButtonsState(mapped_id_start_)); |
| |
| CreateAndCheckWebPointerEvent( |
| WebPointerProperties::PointerType::kTouch, 0, mapped_id_start_, |
| true /* isprimary */, false /* hovering */, WebInputEvent::kNoModifiers, |
| WebInputEvent::kPointerUp); |
| |
| EXPECT_TRUE(pointer_event_factory_.IsActive(mapped_id_start_)); |
| EXPECT_FALSE(pointer_event_factory_.IsActiveButtonsState(mapped_id_start_)); |
| |
| pointer_event_factory_.Remove(pointer_event1->pointerId()); |
| pointer_event_factory_.Remove(pointer_event2->pointerId()); |
| |
| EXPECT_FALSE(pointer_event_factory_.IsActive(mapped_id_start_)); |
| EXPECT_FALSE(pointer_event_factory_.IsActiveButtonsState(mapped_id_start_)); |
| |
| EXPECT_FALSE(pointer_event_factory_.IsActive(mapped_id_start_ + 1)); |
| EXPECT_FALSE( |
| pointer_event_factory_.IsActiveButtonsState(mapped_id_start_ + 1)); |
| |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kTouch, 0, |
| mapped_id_start_ + 1, true /* isprimary */, |
| false /* hovering */); |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kTouch, 0, |
| mapped_id_start_ + 1, true /* isprimary */, |
| false /* hovering */); |
| |
| // Remove an obsolete (i.e. already removed) pointer event which should have |
| // no effect. |
| pointer_event_factory_.Remove(pointer_event1->pointerId()); |
| |
| EXPECT_TRUE(pointer_event_factory_.IsActive(mapped_id_start_ + 1)); |
| EXPECT_TRUE( |
| pointer_event_factory_.IsActiveButtonsState(mapped_id_start_ + 1)); |
| |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kTouch, 0, |
| mapped_id_start_ + 1, true /* isprimary */, |
| false /* hovering */); |
| CreateAndCheckPointerCancel(WebPointerProperties::PointerType::kTouch, 0, |
| mapped_id_start_ + 1, true); |
| |
| EXPECT_TRUE(pointer_event_factory_.IsActive(mapped_id_start_ + 1)); |
| EXPECT_FALSE( |
| pointer_event_factory_.IsActiveButtonsState(mapped_id_start_ + 1)); |
| |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kTouch, 0, |
| mapped_id_start_ + 1, true /* isprimary */, |
| false /* hovering */); |
| |
| EXPECT_TRUE(pointer_event_factory_.IsActive(mapped_id_start_ + 1)); |
| EXPECT_TRUE( |
| pointer_event_factory_.IsActiveButtonsState(mapped_id_start_ + 1)); |
| } |
| |
| TEST_F(PointerEventFactoryTest, MouseAndTouchAndPen) { |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kMouse, 0, |
| expected_mouse_id_, true /* isprimary */, |
| true /* hovering */); |
| PointerEvent* pointer_event1 = CreateAndCheckWebPointerEvent( |
| WebPointerProperties::PointerType::kTouch, 0, mapped_id_start_, |
| true /* isprimary */, false /* hovering */); |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kPen, 0, |
| mapped_id_start_ + 1, true /* isprimary */, |
| false /* hovering */); |
| |
| PointerEvent* pointer_event2 = CreateAndCheckWebPointerEvent( |
| WebPointerProperties::PointerType::kTouch, 1, mapped_id_start_ + 2, |
| false /* isprimary */, false /* hovering */); |
| PointerEvent* pointer_event3 = CreateAndCheckWebPointerEvent( |
| WebPointerProperties::PointerType::kTouch, 2, mapped_id_start_ + 3, |
| false /* isprimary */, false /* hovering */); |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kPen, 0, |
| mapped_id_start_ + 1, true /* isprimary */, |
| false /* hovering */); |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kPen, 47213, |
| mapped_id_start_ + 4, false /* isprimary */, |
| false /* hovering */); |
| |
| pointer_event_factory_.Remove(pointer_event1->pointerId()); |
| pointer_event_factory_.Remove(pointer_event2->pointerId()); |
| pointer_event_factory_.Remove(pointer_event3->pointerId()); |
| |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kTouch, 100, |
| mapped_id_start_ + 5, true /* isprimary */, |
| false /* hovering */); |
| |
| pointer_event_factory_.Clear(); |
| |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kMouse, 0, |
| expected_mouse_id_, true /* isprimary */, |
| true /* hovering */); |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kTouch, 0, |
| mapped_id_start_, true /* isprimary */, |
| false /* hovering */); |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kPen, 0, |
| mapped_id_start_ + 1, true /* isprimary */, |
| false /* hovering */); |
| } |
| |
| TEST_F(PointerEventFactoryTest, NonHoveringPointers) { |
| CheckNonHoveringPointers({}); |
| |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kMouse, 0, |
| expected_mouse_id_, true /* isprimary */, |
| true /* hovering */); |
| PointerEvent* pointer_event1 = CreateAndCheckWebPointerEvent( |
| WebPointerProperties::PointerType::kPen, 0, mapped_id_start_, |
| true /* isprimary */, true /* hovering */); |
| CheckNonHoveringPointers({}); |
| |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kPen, 0, |
| mapped_id_start_, true /* isprimary */, |
| false /* hovering */); |
| CheckNonHoveringPointers({mapped_id_start_}); |
| |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kTouch, 0, |
| mapped_id_start_ + 1, true /* isprimary */, |
| false /* hovering */); |
| CheckNonHoveringPointers({mapped_id_start_, mapped_id_start_ + 1}); |
| |
| pointer_event_factory_.Remove(pointer_event1->pointerId()); |
| CheckNonHoveringPointers({mapped_id_start_ + 1}); |
| |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kTouch, 1, |
| mapped_id_start_ + 2, false /* isprimary */, |
| false /* hovering */); |
| |
| CheckNonHoveringPointers({mapped_id_start_ + 1, mapped_id_start_ + 2}); |
| |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kTouch, 1, |
| mapped_id_start_ + 2, false /* isprimary */, |
| true /* hovering */); |
| |
| CheckNonHoveringPointers({mapped_id_start_ + 1}); |
| |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kPen, 0, |
| mapped_id_start_ + 3, true /* isprimary */, |
| false /* hovering */); |
| |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kPen, 1, |
| mapped_id_start_ + 4, false /* isprimary */, |
| false /* hovering */); |
| |
| CheckNonHoveringPointers( |
| {mapped_id_start_ + 1, mapped_id_start_ + 3, mapped_id_start_ + 4}); |
| |
| pointer_event_factory_.Clear(); |
| CheckNonHoveringPointers({}); |
| } |
| |
| TEST_F(PointerEventFactoryTest, PenAsTouchAndMouseEvent) { |
| PointerEvent* pointer_event1 = CreateAndCheckWebPointerEvent( |
| WebPointerProperties::PointerType::kPen, 0, mapped_id_start_, |
| true /* isprimary */, true /* hovering */); |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kPen, 1, |
| mapped_id_start_ + 1, false /* isprimary */, |
| true /* hovering */); |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kPen, 2, |
| mapped_id_start_ + 2, false /* isprimary */, |
| true /* hovering */); |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kPen, 0, |
| mapped_id_start_, true /* isprimary */, |
| true /* hovering */); |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kPen, 1, |
| mapped_id_start_ + 1, false /* isprimary */, |
| true /* hovering */); |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kPen, 0, |
| mapped_id_start_, true /* isprimary */, |
| false /* hovering */); |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kPen, 1, |
| mapped_id_start_ + 1, false /* isprimary */, |
| false /* hovering */); |
| |
| pointer_event_factory_.Remove(pointer_event1->pointerId()); |
| |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kPen, 0, |
| mapped_id_start_ + 3, false /* isprimary */, |
| false /* hovering */); |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kPen, 0, |
| mapped_id_start_ + 3, false /* isprimary */, |
| true /* hovering */); |
| CreateAndCheckPointerCancel(WebPointerProperties::PointerType::kPen, 0, |
| mapped_id_start_ + 3, false); |
| |
| pointer_event_factory_.Clear(); |
| |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kPen, 1, |
| mapped_id_start_, true /* isprimary */, |
| false /* hovering */); |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kPen, 0, |
| mapped_id_start_ + 1, false /* isprimary */, |
| false /* hovering */); |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kPen, 1, |
| mapped_id_start_, true /* isprimary */, |
| true /* hovering */); |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kPen, 0, |
| mapped_id_start_ + 1, false /* isprimary */, |
| true /* hovering */); |
| CreateAndCheckPointerCancel(WebPointerProperties::PointerType::kPen, 1, |
| mapped_id_start_, true); |
| CreateAndCheckPointerCancel(WebPointerProperties::PointerType::kPen, 0, |
| mapped_id_start_ + 1, false); |
| } |
| |
| TEST_F(PointerEventFactoryTest, OutOfRange) { |
| PointerEvent* pointer_event1 = CreateAndCheckWebPointerEvent( |
| WebPointerProperties::PointerType::kUnknown, 0, mapped_id_start_, |
| true /* isprimary */, true /* hovering */); |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kUnknown, 1, |
| mapped_id_start_ + 1, false /* isprimary */, |
| true /* hovering */); |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kUnknown, 2, |
| mapped_id_start_ + 2, false /* isprimary */, |
| true /* hovering */); |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kUnknown, 0, |
| mapped_id_start_, true /* isprimary */, |
| false /* hovering */); |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kUnknown, 3, |
| mapped_id_start_ + 3, false /* isprimary */, |
| false /* hovering */); |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kUnknown, 2, |
| mapped_id_start_ + 2, false /* isprimary */, |
| true /* hovering */); |
| CreateAndCheckPointerCancel(WebPointerProperties::PointerType::kUnknown, 3, |
| mapped_id_start_ + 3, false); |
| |
| pointer_event_factory_.Remove(pointer_event1->pointerId()); |
| |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kUnknown, 0, |
| mapped_id_start_ + 4, false /* isprimary */, |
| false /* hovering */); |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kUnknown, |
| INT_MAX, mapped_id_start_ + 5, |
| false /* isprimary */, false /* hovering */); |
| |
| pointer_event_factory_.Clear(); |
| |
| for (int i = 0; i < 100; ++i) { |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kTouch, i, |
| mapped_id_start_ + i, i == 0 /* isprimary */, |
| true /* hovering */); |
| } |
| |
| for (int i = 0; i < 100; ++i) { |
| CreateAndCheckWebPointerEvent(WebPointerProperties::PointerType::kMouse, i, |
| expected_mouse_id_, true /* isprimary */, |
| false /* hovering */); |
| } |
| CreateAndCheckPointerCancel(WebPointerProperties::PointerType::kMouse, 0, |
| expected_mouse_id_, true); |
| } |
| |
| TEST_F(PointerEventFactoryTest, CoalescedEvents) { |
| CreateAndCheckWebPointerEvent( |
| WebPointerProperties::PointerType::kMouse, 0, expected_mouse_id_, |
| true /* isprimary */, true /* hovering */, WebInputEvent::kNoModifiers, |
| WebInputEvent::kPointerMove, WebPointerProperties::Button::kNoButton, 4); |
| CreateAndCheckWebPointerEvent( |
| WebPointerProperties::PointerType::kTouch, 0, mapped_id_start_, |
| true /* isprimary */, false /* hovering */, WebInputEvent::kNoModifiers, |
| WebInputEvent::kPointerMove, WebPointerProperties::Button::kNoButton, 3); |
| } |
| |
| TEST_F(PointerEventFactoryTest, PredictedEvents) { |
| CreateAndCheckWebPointerEvent( |
| WebPointerProperties::PointerType::kMouse, 0, expected_mouse_id_, |
| true /* isprimary */, true /* hovering */, WebInputEvent::kNoModifiers, |
| WebInputEvent::kPointerMove, WebPointerProperties::Button::kNoButton, |
| 0 /* coalesced_count */, 4 /* predicted_count */); |
| CreateAndCheckWebPointerEvent( |
| WebPointerProperties::PointerType::kTouch, 0, mapped_id_start_, |
| true /* isprimary */, false /* hovering */, WebInputEvent::kNoModifiers, |
| WebInputEvent::kPointerMove, WebPointerProperties::Button::kNoButton, |
| 0 /* coalesced_count */, 3 /* predicted_count */); |
| |
| // Check predicted_event_count when type != kPointerMove |
| CreateAndCheckWebPointerEvent( |
| WebPointerProperties::PointerType::kMouse, 0, expected_mouse_id_, |
| true /* isprimary */, true /* hovering */, WebInputEvent::kNoModifiers, |
| WebInputEvent::kPointerDown, WebPointerProperties::Button::kNoButton, |
| 0 /* coalesced_count */, 4 /* predicted_count */); |
| CreateAndCheckWebPointerEvent( |
| WebPointerProperties::PointerType::kTouch, 0, mapped_id_start_, |
| true /* isprimary */, false /* hovering */, WebInputEvent::kNoModifiers, |
| WebInputEvent::kPointerUp, WebPointerProperties::Button::kNoButton, |
| 0 /* coalesced_count */, 3 /* predicted_count */); |
| } |
| |
| TEST_F(PointerEventFactoryTest, PenEraserButton) { |
| // Send the pointerdown event when pressing the eraser button on the tablet. |
| PointerEvent* first_pointerdown_event = CreateAndCheckWebPointerEvent( |
| WebPointerProperties::PointerType::kEraser, 0, mapped_id_start_, |
| true /* isprimary */, false /* hovering */, |
| WebInputEvent::kLeftButtonDown, WebInputEvent::kPointerDown, |
| WebPointerProperties::Button::kLeft); |
| EXPECT_EQ(event_type_names::kPointerdown, first_pointerdown_event->type()); |
| |
| // Send the pointermove event when pressing any other button while the eraser |
| // button is still pressed on the tablet. |
| WebInputEvent::Modifiers modifiers = static_cast<WebInputEvent::Modifiers>( |
| WebInputEvent::kLeftButtonDown | WebInputEvent::kRightButtonDown); |
| PointerEvent* second_pointerdown_event = CreateAndCheckWebPointerEvent( |
| WebPointerProperties::PointerType::kEraser, 1, mapped_id_start_ + 1, |
| false /* isprimary */, false /* hovering */, modifiers, |
| WebInputEvent::kPointerDown, WebPointerProperties::Button::kRight); |
| EXPECT_EQ(event_type_names::kPointermove, second_pointerdown_event->type()); |
| |
| // Send the pointermove event when releasing any other button while the |
| // eraser button is still pressed on the tablet. |
| PointerEvent* first_pointerup_event = CreateAndCheckWebPointerEvent( |
| WebPointerProperties::PointerType::kEraser, 1, mapped_id_start_ + 1, |
| false /* isprimary */, true /* hovering */, |
| WebInputEvent::kLeftButtonDown, WebInputEvent::kPointerUp, |
| WebPointerProperties::Button::kRight); |
| EXPECT_EQ(event_type_names::kPointermove, first_pointerup_event->type()); |
| |
| // Send the pointerup event when releasing the eraser button from the tablet. |
| PointerEvent* last_pointerup_event = CreateAndCheckWebPointerEvent( |
| WebPointerProperties::PointerType::kEraser, 0, mapped_id_start_, |
| true /* isprimary */, true /* hovering */, WebInputEvent::kNoModifiers, |
| WebInputEvent::kPointerUp, WebPointerProperties::Button::kLeft); |
| EXPECT_EQ(event_type_names::kPointerup, last_pointerup_event->type()); |
| } |
| |
| } // namespace blink |