overlay_agent_aura.cc 2.3 KB

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