Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / ui / events / event_targeter.cc
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "ui/events/event_targeter.h"
6
7 #include "ui/events/event.h"
8 #include "ui/events/event_target.h"
9 #include "ui/events/event_target_iterator.h"
10
11 namespace ui {
12
13 EventTargeter::~EventTargeter() {
14 }
15
16 EventTarget* EventTargeter::FindTargetForEvent(EventTarget* root,
17                                                Event* event) {
18   if (event->IsMouseEvent() ||
19       event->IsScrollEvent() ||
20       event->IsTouchEvent() ||
21       event->IsGestureEvent()) {
22     return FindTargetForLocatedEvent(root,
23                                      static_cast<LocatedEvent*>(event));
24   }
25   return root;
26 }
27
28 EventTarget* EventTargeter::FindTargetForLocatedEvent(EventTarget* root,
29                                                       LocatedEvent* event) {
30   scoped_ptr<EventTargetIterator> iter = root->GetChildIterator();
31   if (iter) {
32     EventTarget* target = root;
33     for (EventTarget* child = iter->GetNextTarget(); child;
34          child = iter->GetNextTarget()) {
35       EventTargeter* targeter = child->GetEventTargeter();
36       if (!targeter)
37         targeter = this;
38       if (!targeter->SubtreeShouldBeExploredForEvent(child, *event))
39         continue;
40       target->ConvertEventToTarget(child, event);
41       target = child;
42       EventTarget* child_target = targeter ?
43           targeter->FindTargetForLocatedEvent(child, event) :
44           FindTargetForLocatedEvent(child, event);
45       if (child_target)
46         return child_target;
47     }
48     target->ConvertEventToTarget(root, event);
49   }
50   return root->CanAcceptEvent(*event) ? root : NULL;
51 }
52
53 bool EventTargeter::SubtreeShouldBeExploredForEvent(EventTarget* target,
54                                                     const LocatedEvent& event) {
55   return SubtreeCanAcceptEvent(target, event) &&
56          EventLocationInsideBounds(target, event);
57 }
58
59 EventTarget* EventTargeter::FindNextBestTarget(EventTarget* previous_target,
60                                                Event* event) {
61   return NULL;
62 }
63
64 bool EventTargeter::SubtreeCanAcceptEvent(EventTarget* target,
65                                           const LocatedEvent& event) const {
66   return true;
67 }
68
69 bool EventTargeter::EventLocationInsideBounds(EventTarget* target,
70                                               const LocatedEvent& event) const {
71   return true;
72 }
73
74 }  // namespace ui