summaryrefslogtreecommitdiffstats
path: root/ui/events/scoped_target_handler_unittest.cc
diff options
context:
space:
mode:
authorvarkha <varkha@chromium.org>2015-12-02 19:06:17 -0800
committerCommit bot <commit-bot@chromium.org>2015-12-03 03:07:09 +0000
commit3589654bc176bb4a5dfc48d59041c09adf7112f9 (patch)
treebe26b2d0426411a9eb40be183ad15f6c73542267 /ui/events/scoped_target_handler_unittest.cc
parent9945a7390fca9a23c5ce365c5e4f39c2bf908cd6 (diff)
downloadchromium_src-3589654bc176bb4a5dfc48d59041c09adf7112f9.zip
chromium_src-3589654bc176bb4a5dfc48d59041c09adf7112f9.tar.gz
chromium_src-3589654bc176bb4a5dfc48d59041c09adf7112f9.tar.bz2
Removes unnecessary code path in ScopedTargetHandler
With the separation of EventHandler and EventTarget (CL in https://codereview.chromium.org/1484513002/) the code path that explicitly invokes View::OnEvent is no longer needed. OnXxxxEvent overrides are also unnecessary. This CL will need to be rebased to https://codereview.chromium.org/1482293004/ and then it will be possible to move ScopedTargetHandler to ui/events/. BUG=537202 Review URL: https://codereview.chromium.org/1483283002 Cr-Commit-Position: refs/heads/master@{#362880}
Diffstat (limited to 'ui/events/scoped_target_handler_unittest.cc')
-rw-r--r--ui/events/scoped_target_handler_unittest.cc206
1 files changed, 206 insertions, 0 deletions
diff --git a/ui/events/scoped_target_handler_unittest.cc b/ui/events/scoped_target_handler_unittest.cc
new file mode 100644
index 0000000..b8c8d78
--- /dev/null
+++ b/ui/events/scoped_target_handler_unittest.cc
@@ -0,0 +1,206 @@
+// 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 "ui/events/scoped_target_handler.h"
+
+#include "base/memory/scoped_ptr.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/events/event_handler.h"
+#include "ui/events/event_target.h"
+#include "ui/events/event_target_iterator.h"
+#include "ui/events/event_utils.h"
+
+namespace ui {
+
+namespace {
+
+class TestEventTargetIterator : public EventTargetIterator {
+ public:
+ TestEventTargetIterator() {}
+
+ // EventTargetIterator:
+ EventTarget* GetNextTarget() override { return nullptr; }
+
+private:
+ DISALLOW_COPY_AND_ASSIGN(TestEventTargetIterator);
+};
+
+// An EventTarget that holds ownership of its target and delegate EventHandlers.
+class TestEventTarget : public EventTarget {
+ public:
+ TestEventTarget() {}
+ ~TestEventTarget() override {}
+
+ void SetHandler(scoped_ptr<EventHandler> target_handler,
+ scoped_ptr<EventHandler> delegate) {
+ target_handler_ = target_handler.Pass();
+ delegate_ = delegate.Pass();
+ }
+
+ // EventTarget:
+ void DispatchEvent(Event* event) { target_handler()->OnEvent(event); }
+ bool CanAcceptEvent(const Event& event) override { return true; }
+ EventTarget* GetParentTarget() override { return nullptr; }
+ scoped_ptr<EventTargetIterator> GetChildIterator() const override {
+ return make_scoped_ptr(new TestEventTargetIterator);
+ }
+ EventTargeter* GetEventTargeter() override { return nullptr; }
+
+ private:
+ scoped_ptr<EventHandler> target_handler_;
+ scoped_ptr<EventHandler> delegate_;
+
+ DISALLOW_COPY_AND_ASSIGN(TestEventTarget);
+};
+
+// An EventHandler that sets itself as a target handler for an EventTarget and
+// can recursively dispatch an Event.
+class NestedEventHandler : public EventHandler {
+ public:
+ NestedEventHandler(TestEventTarget* target, int nesting)
+ : target_(target), nesting_(nesting) {
+ original_handler_ = target_->SetTargetHandler(this);
+ }
+ ~NestedEventHandler() override {
+ EventHandler* handler = target_->SetTargetHandler(original_handler_);
+ DCHECK_EQ(this, handler);
+ }
+
+ protected:
+ void OnEvent(Event* event) override {
+ if (--nesting_ == 0)
+ return;
+ target_->DispatchEvent(event);
+ }
+
+ private:
+ TestEventTarget* target_;
+ int nesting_;
+ EventHandler* original_handler_;
+
+ DISALLOW_COPY_AND_ASSIGN(NestedEventHandler);
+};
+
+// An EventHandler that sets itself as a target handler for an EventTarget and
+// destroys that EventTarget when handling an Event, possibly after recursively
+// handling the Event.
+class TargetDestroyingEventHandler : public EventHandler {
+ public:
+ TargetDestroyingEventHandler(TestEventTarget* target, int nesting)
+ : target_(target), nesting_(nesting) {
+ original_handler_ = target_->SetTargetHandler(this);
+ }
+ ~TargetDestroyingEventHandler() override {
+ EventHandler* handler = target_->SetTargetHandler(original_handler_);
+ DCHECK_EQ(this, handler);
+ }
+
+ protected:
+ void OnEvent(Event* event) override {
+ if (--nesting_ == 0) {
+ delete target_;
+ return;
+ }
+ target_->DispatchEvent(event);
+ }
+
+ private:
+ TestEventTarget* target_;
+ int nesting_;
+ EventHandler* original_handler_;
+
+ DISALLOW_COPY_AND_ASSIGN(TargetDestroyingEventHandler);
+};
+
+// An EventHandler that can be set to receive events in addition to the target
+// handler and counts the Events that it receives.
+class EventCountingEventHandler : public EventHandler {
+ public:
+ EventCountingEventHandler(EventTarget* target, int* count)
+ : scoped_target_handler_(new ScopedTargetHandler(target, this)),
+ count_(count) {}
+ ~EventCountingEventHandler() override {}
+
+ protected:
+ void OnEvent(Event* event) override { (*count_)++; }
+
+ private:
+ scoped_ptr<ScopedTargetHandler> scoped_target_handler_;
+ int* count_;
+
+ DISALLOW_COPY_AND_ASSIGN(EventCountingEventHandler);
+};
+
+} // namespace
+
+// Tests that a ScopedTargetHandler invokes both the target and a delegate.
+TEST(ScopedTargetHandlerTest, HandlerInvoked) {
+ int count = 0;
+ TestEventTarget* target = new TestEventTarget;
+ scoped_ptr<NestedEventHandler> target_handler(
+ new NestedEventHandler(target, 1));
+ scoped_ptr<EventCountingEventHandler> delegate(
+ new EventCountingEventHandler(target, &count));
+ target->SetHandler(target_handler.Pass(), delegate.Pass());
+ MouseEvent event(ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
+ EventTimeForNow(), EF_LEFT_MOUSE_BUTTON,
+ EF_LEFT_MOUSE_BUTTON);
+ target->DispatchEvent(&event);
+ EXPECT_EQ(1, count);
+ delete target;
+}
+
+// Tests that a ScopedTargetHandler invokes both the target and a delegate when
+// an Event is dispatched recursively such as with synthetic events.
+TEST(ScopedTargetHandlerTest, HandlerInvokedNested) {
+ int count = 0;
+ TestEventTarget* target = new TestEventTarget;
+ scoped_ptr<NestedEventHandler> target_handler(
+ new NestedEventHandler(target, 2));
+ scoped_ptr<EventCountingEventHandler> delegate(
+ new EventCountingEventHandler(target, &count));
+ target->SetHandler(target_handler.Pass(), delegate.Pass());
+ MouseEvent event(ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
+ EventTimeForNow(), EF_LEFT_MOUSE_BUTTON,
+ EF_LEFT_MOUSE_BUTTON);
+ target->DispatchEvent(&event);
+ EXPECT_EQ(2, count);
+ delete target;
+}
+
+// Tests that a it is safe to delete a ScopedTargetHandler while handling an
+// event.
+TEST(ScopedTargetHandlerTest, SafeToDestroy) {
+ int count = 0;
+ TestEventTarget* target = new TestEventTarget;
+ scoped_ptr<TargetDestroyingEventHandler> target_handler(
+ new TargetDestroyingEventHandler(target, 1));
+ scoped_ptr<EventCountingEventHandler> delegate(
+ new EventCountingEventHandler(target, &count));
+ target->SetHandler(target_handler.Pass(), delegate.Pass());
+ MouseEvent event(ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
+ EventTimeForNow(), EF_LEFT_MOUSE_BUTTON,
+ EF_LEFT_MOUSE_BUTTON);
+ target->DispatchEvent(&event);
+ EXPECT_EQ(0, count);
+}
+
+// Tests that a it is safe to delete a ScopedTargetHandler while handling an
+// event recursively.
+TEST(ScopedTargetHandlerTest, SafeToDestroyNested) {
+ int count = 0;
+ TestEventTarget* target = new TestEventTarget;
+ scoped_ptr<TargetDestroyingEventHandler> target_handler(
+ new TargetDestroyingEventHandler(target, 2));
+ scoped_ptr<EventCountingEventHandler> delegate(
+ new EventCountingEventHandler(target, &count));
+ target->SetHandler(target_handler.Pass(), delegate.Pass());
+ MouseEvent event(ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
+ EventTimeForNow(), EF_LEFT_MOUSE_BUTTON,
+ EF_LEFT_MOUSE_BUTTON);
+ target->DispatchEvent(&event);
+ EXPECT_EQ(0, count);
+}
+
+} // namespace ui