1 // Copyright 2017 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 "components/ui_devtools/views/overlay_agent_aura.h"
6 
7 #include "components/ui_devtools/dom_agent.h"
8 #include "components/ui_devtools/views/window_element.h"
9 #include "ui/aura/env.h"
10 #include "ui/views/view.h"
11 #include "ui/views/widget/widget.h"
12 #include "ui/wm/core/window_util.h"
13 
14 namespace ui_devtools {
15 
16 OverlayAgentAura* OverlayAgentAura::overlay_agent_aura_ = nullptr;
17 
OverlayAgentAura(DOMAgent * dom_agent)18 OverlayAgentAura::OverlayAgentAura(DOMAgent* dom_agent)
19     : OverlayAgentViews(dom_agent) {
20   DCHECK(!overlay_agent_aura_);
21   overlay_agent_aura_ = this;
22 }
23 
~OverlayAgentAura()24 OverlayAgentAura::~OverlayAgentAura() {
25   overlay_agent_aura_ = nullptr;
26 }
27 
InstallPreTargetHandler()28 void OverlayAgentAura::InstallPreTargetHandler() {
29   aura::Env::GetInstance()->AddPreTargetHandler(
30       this, ui::EventTarget::Priority::kSystem);
31 }
32 
RemovePreTargetHandler()33 void OverlayAgentAura::RemovePreTargetHandler() {
34   aura::Env::GetInstance()->RemovePreTargetHandler(this);
35 }
36 
FindElementIdTargetedByPoint(ui::LocatedEvent * event) const37 int OverlayAgentAura::FindElementIdTargetedByPoint(
38     ui::LocatedEvent* event) const {
39   gfx::Point p = event->root_location();
40   aura::Window* target = static_cast<aura::Window*>(event->target());
41   gfx::NativeWindow root_window = target->GetRootWindow();
42   gfx::NativeWindow targeted_window = root_window->GetEventHandlerForPoint(p);
43   if (!targeted_window)
44     return 0;
45 
46   views::Widget* targeted_widget =
47       views::Widget::GetWidgetForNativeWindow(targeted_window);
48   if (!targeted_widget) {
49     return dom_agent()
50         ->element_root()
51         ->FindUIElementIdForBackendElement<aura::Window>(targeted_window);
52   }
53 
54   views::View* root_view = targeted_widget->GetRootView();
55   DCHECK(root_view);
56 
57   gfx::Point point_in_targeted_window(p);
58   aura::Window::ConvertPointToTarget(root_window, targeted_window,
59                                      &point_in_targeted_window);
60   views::View* targeted_view =
61       root_view->GetEventHandlerForPoint(point_in_targeted_window);
62   DCHECK(targeted_view);
63   return dom_agent()
64       ->element_root()
65       ->FindUIElementIdForBackendElement<views::View>(targeted_view);
66 }
67 
68 // static
Create(DOMAgent * dom_agent)69 std::unique_ptr<OverlayAgentViews> OverlayAgentViews::Create(
70     DOMAgent* dom_agent) {
71   return std::make_unique<OverlayAgentAura>(dom_agent);
72 }
73 
74 }  // namespace ui_devtools
75