diff options
author | sadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-01-06 17:50:24 +0000 |
---|---|---|
committer | sadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-01-06 17:50:24 +0000 |
commit | 501ada71daf5babbb39cd3cd2307ee58a1d3a958 (patch) | |
tree | 9dd3f2941180504e1c0f0da8e4f813fbcc4fdd32 | |
parent | a05228166dd45d9d0583871f13147de0d7be5303 (diff) | |
download | chromium_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.cc | 41 | ||||
-rw-r--r-- | ui/events/event_targeter.cc | 8 |
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); } |