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)18OverlayAgentAura::OverlayAgentAura(DOMAgent* dom_agent) 19 : OverlayAgentViews(dom_agent) { 20 DCHECK(!overlay_agent_aura_); 21 overlay_agent_aura_ = this; 22 } 23 ~OverlayAgentAura()24OverlayAgentAura::~OverlayAgentAura() { 25 overlay_agent_aura_ = nullptr; 26 } 27 InstallPreTargetHandler()28void OverlayAgentAura::InstallPreTargetHandler() { 29 aura::Env::GetInstance()->AddPreTargetHandler( 30 this, ui::EventTarget::Priority::kSystem); 31 } 32 RemovePreTargetHandler()33void OverlayAgentAura::RemovePreTargetHandler() { 34 aura::Env::GetInstance()->RemovePreTargetHandler(this); 35 } 36 FindElementIdTargetedByPoint(ui::LocatedEvent * event) const37int 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)69std::unique_ptr<OverlayAgentViews> OverlayAgentViews::Create( 70 DOMAgent* dom_agent) { 71 return std::make_unique<OverlayAgentAura>(dom_agent); 72 } 73 74 } // namespace ui_devtools 75