| // Copyright 2014 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 "services/window_manager/view_targeter.h" | 
 |  | 
 | #include "services/window_manager/capture_controller.h" | 
 | #include "services/window_manager/focus_controller.h" | 
 | #include "services/window_manager/view_target.h" | 
 |  | 
 | namespace window_manager { | 
 |  | 
 | ViewTargeter::ViewTargeter() {} | 
 |  | 
 | ViewTargeter::~ViewTargeter() {} | 
 |  | 
 | ui::EventTarget* ViewTargeter::FindTargetForEvent(ui::EventTarget* root, | 
 |                                                   ui::Event* event) { | 
 |   ViewTarget* view = static_cast<ViewTarget*>(root); | 
 |   ViewTarget* target = | 
 |       event->IsKeyEvent() | 
 |           ? FindTargetForKeyEvent(view, *static_cast<ui::KeyEvent*>(event)) | 
 |           : static_cast<ViewTarget*>( | 
 |                 EventTargeter::FindTargetForEvent(root, event)); | 
 |  | 
 |   // TODO(erg): The aura version of this method does a lot of work to handle | 
 |   // dispatching to a target that isn't a child of |view|. For now, punt on | 
 |   // this. | 
 |   DCHECK_EQ(view->GetRoot(), target->GetRoot()); | 
 |  | 
 |   return target; | 
 | } | 
 |  | 
 | ui::EventTarget* ViewTargeter::FindTargetForLocatedEvent( | 
 |     ui::EventTarget* root, | 
 |     ui::LocatedEvent* event) { | 
 |   ViewTarget* view = static_cast<ViewTarget*>(root); | 
 |   if (!view->HasParent()) { | 
 |     ViewTarget* target = FindTargetInRootView(view, *event); | 
 |     if (target) { | 
 |       view->ConvertEventToTarget(target, event); | 
 |       return target; | 
 |     } | 
 |   } | 
 |   if (view->view()->shared_properties().count("event-root")) | 
 |     return view; | 
 |   return EventTargeter::FindTargetForLocatedEvent(view, event); | 
 | } | 
 |  | 
 | bool ViewTargeter::SubtreeCanAcceptEvent(ui::EventTarget* target, | 
 |                                          const ui::LocatedEvent& event) const { | 
 |   ViewTarget* view = static_cast<ViewTarget*>(target); | 
 |  | 
 |   if (!view->IsVisible()) | 
 |     return false; | 
 |  | 
 |   // TODO(erg): We may need to keep track of the parent on ViewTarget, because | 
 |   // we have a check here about | 
 |   // WindowDelegate::ShouldDescendIntoChildForEventHandling(). | 
 |  | 
 |   return true; | 
 | } | 
 |  | 
 | bool ViewTargeter::EventLocationInsideBounds( | 
 |     ui::EventTarget* target, | 
 |     const ui::LocatedEvent& event) const { | 
 |   ViewTarget* view = static_cast<ViewTarget*>(target); | 
 |   gfx::Point point = event.location(); | 
 |   const ViewTarget* parent = view->GetParent(); | 
 |   if (parent) | 
 |     ViewTarget::ConvertPointToTarget(parent, view, &point); | 
 |   return gfx::Rect(view->GetBounds().size()).Contains(point); | 
 | } | 
 |  | 
 | ViewTarget* ViewTargeter::FindTargetForKeyEvent(ViewTarget* view_target, | 
 |                                                 const ui::KeyEvent& key) { | 
 |   FocusController* focus_controller = GetFocusController(view_target->view()); | 
 |   if (focus_controller) { | 
 |     mojo::View* focused_view = focus_controller->GetFocusedView(); | 
 |     if (focused_view) | 
 |       return ViewTarget::TargetFromView(focused_view); | 
 |   } | 
 |   return view_target; | 
 | } | 
 |  | 
 | ViewTarget* ViewTargeter::FindTargetInRootView(ViewTarget* root_view, | 
 |                                                const ui::LocatedEvent& event) { | 
 |   // TODO(erg): This here is important because it resolves | 
 |   // mouse_pressed_handler() in the aura version. This is what makes sure | 
 |   // that a view gets both the mouse down and up. | 
 |  | 
 |   CaptureController* capture_controller = | 
 |       GetCaptureController(root_view->view()); | 
 |   if (capture_controller) { | 
 |     mojo::View* capture_view = capture_controller->GetCapture(); | 
 |     if (capture_view) | 
 |       return ViewTarget::TargetFromView(capture_view); | 
 |   } | 
 |  | 
 |   // TODO(erg): There's a whole bunch of junk about handling touch events | 
 |   // here. Handle later. | 
 |  | 
 |   return nullptr; | 
 | } | 
 |  | 
 | }  // namespace window_manager |