summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-01-06 17:50:24 +0000
committersadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-01-06 17:50:24 +0000
commit501ada71daf5babbb39cd3cd2307ee58a1d3a958 (patch)
tree9dd3f2941180504e1c0f0da8e4f813fbcc4fdd32
parenta05228166dd45d9d0583871f13147de0d7be5303 (diff)
downloadchromium_src-501ada71daf5babbb39cd3cd2307ee58a1d3a958.zip
chromium_src-501ada71daf5babbb39cd3cd2307ee58a1d3a958.tar.gz
chromium_src-501ada71daf5babbb39cd3cd2307ee58a1d3a958.tar.bz2
events: Update EventTargeter to operate on the EventTarget that owns the targeter.
BUG=318879 R=ben@chromium.org Review URL: https://codereview.chromium.org/98353008 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@243118 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--ui/events/event_processor_unittest.cc41
-rw-r--r--ui/events/event_targeter.cc8
2 files changed, 45 insertions, 4 deletions
diff --git a/ui/events/event_processor_unittest.cc b/ui/events/event_processor_unittest.cc
index 6d8edf5a..1511819 100644
--- a/ui/events/event_processor_unittest.cc
+++ b/ui/events/event_processor_unittest.cc
@@ -142,9 +142,11 @@ TEST_F(EventProcessorTest, Bounds) {
// Now install a targeter on the parent that looks at the bounds and makes
// sure the event reaches the target only if the location of the event within
// the bounds of the target.
+ MouseEvent mouse2(ET_MOUSE_MOVED, gfx::Point(1, 1), gfx::Point(1, 1), EF_NONE,
+ EF_NONE);
parent_r->SetEventTargeter(scoped_ptr<EventTargeter>(
new BoundsEventTargeter<BoundsTestTarget>()));
- DispatchEvent(&mouse);
+ DispatchEvent(&mouse2);
EXPECT_FALSE(root()->DidReceiveEvent(ET_MOUSE_MOVED));
EXPECT_TRUE(parent_r->DidReceiveEvent(ET_MOUSE_MOVED));
EXPECT_FALSE(child_r->DidReceiveEvent(ET_MOUSE_MOVED));
@@ -160,5 +162,42 @@ TEST_F(EventProcessorTest, Bounds) {
EXPECT_TRUE(grandchild_r->DidReceiveEvent(ET_MOUSE_MOVED));
}
+class IgnoreEventTargeter : public EventTargeter {
+ public:
+ IgnoreEventTargeter() {}
+ virtual ~IgnoreEventTargeter() {}
+
+ private:
+ // EventTargeter:
+ virtual bool SubtreeShouldBeExploredForEvent(
+ EventTarget* target, const LocatedEvent& event) OVERRIDE {
+ return false;
+ }
+};
+
+// Verifies that the EventTargeter installed on an EventTarget can dictate
+// whether the target itself can process an event.
+TEST_F(EventProcessorTest, TargeterChecksOwningEventTarget) {
+ scoped_ptr<TestEventTarget> child(new TestEventTarget());
+ root()->AddChild(child.Pass());
+
+ MouseEvent mouse(ET_MOUSE_MOVED, gfx::Point(10, 10), gfx::Point(10, 10),
+ EF_NONE, EF_NONE);
+ DispatchEvent(&mouse);
+ EXPECT_TRUE(root()->child_at(0)->DidReceiveEvent(ET_MOUSE_MOVED));
+ EXPECT_FALSE(root()->DidReceiveEvent(ET_MOUSE_MOVED));
+ root()->child_at(0)->ResetReceivedEvents();
+
+ // Install an even handler on |child| which always prevents the target from
+ // receiving event.
+ root()->child_at(0)->SetEventTargeter(
+ scoped_ptr<EventTargeter>(new IgnoreEventTargeter()));
+ MouseEvent mouse2(ET_MOUSE_MOVED, gfx::Point(10, 10), gfx::Point(10, 10),
+ EF_NONE, EF_NONE);
+ DispatchEvent(&mouse2);
+ EXPECT_FALSE(root()->child_at(0)->DidReceiveEvent(ET_MOUSE_MOVED));
+ EXPECT_TRUE(root()->DidReceiveEvent(ET_MOUSE_MOVED));
+}
+
} // namespace test
} // namespace ui
diff --git a/ui/events/event_targeter.cc b/ui/events/event_targeter.cc
index 41d4442..50fe7e9 100644
--- a/ui/events/event_targeter.cc
+++ b/ui/events/event_targeter.cc
@@ -32,16 +32,18 @@ EventTarget* EventTargeter::FindTargetForLocatedEvent(EventTarget* root,
EventTarget* target = root;
EventTarget* child = NULL;
while ((child = iter->GetNextTarget())) {
- if (!SubtreeShouldBeExploredForEvent(child, *event))
+ EventTargeter* targeter = child->GetEventTargeter();
+ if (!targeter)
+ targeter = this;
+ if (!targeter->SubtreeShouldBeExploredForEvent(child, *event))
continue;
target->ConvertEventToTarget(child, event);
- EventTargeter* targeter = child->GetEventTargeter();
+ target = child;
EventTarget* child_target = targeter ?
targeter->FindTargetForLocatedEvent(child, event) :
FindTargetForLocatedEvent(child, event);
if (child_target)
return child_target;
- target = child;
}
target->ConvertEventToTarget(root, event);
}