dom_agent_mac.mm 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. // Copyright 2019 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/dom_agent_mac.h"
  5. #import <AppKit/AppKit.h>
  6. #include "components/ui_devtools/views/widget_element.h"
  7. #include "ui/views/widget/native_widget_mac.h"
  8. namespace ui_devtools {
  9. DOMAgentMac::DOMAgentMac() {}
  10. DOMAgentMac::~DOMAgentMac() {
  11. CHECK(!IsInObserverList());
  12. }
  13. protocol::Response DOMAgentMac::enable() {
  14. views::NativeWidgetMac::SetInitNativeWidgetCallback(base::BindRepeating(
  15. &DOMAgentMac::OnNativeWidgetAdded, base::Unretained(this)));
  16. return DOMAgent::enable();
  17. }
  18. protocol::Response DOMAgentMac::disable() {
  19. views::NativeWidgetMac::SetInitNativeWidgetCallback(
  20. base::RepeatingCallback<void(views::NativeWidgetMac*)>());
  21. for (views::Widget* widget : roots_)
  22. widget->RemoveObserver(this);
  23. roots_.clear();
  24. return DOMAgent::disable();
  25. }
  26. std::vector<UIElement*> DOMAgentMac::CreateChildrenForRoot() {
  27. if (roots_.size() == 0)
  28. InitializeRootsFromOpenWindows();
  29. std::vector<UIElement*> children;
  30. for (views::Widget* widget : roots_) {
  31. UIElement* widget_element = new WidgetElement(widget, this, element_root());
  32. children.push_back(widget_element);
  33. }
  34. return children;
  35. }
  36. void DOMAgentMac::OnWidgetDestroying(views::Widget* widget) {
  37. widget->RemoveObserver(this);
  38. roots_.erase(std::find(roots_.begin(), roots_.end(), widget), roots_.end());
  39. }
  40. void DOMAgentMac::OnNativeWidgetAdded(views::NativeWidgetMac* native_widget) {
  41. views::Widget* widget = native_widget->GetWidget();
  42. DCHECK(widget);
  43. roots_.push_back(widget);
  44. UIElement* widget_element = new WidgetElement(widget, this, element_root());
  45. element_root()->AddChild(widget_element);
  46. widget->AddObserver(this);
  47. }
  48. std::unique_ptr<protocol::DOM::Node> DOMAgentMac::BuildTreeForWindow(
  49. UIElement* window_element_root) {
  50. // Window elements aren't supported on Mac.
  51. NOTREACHED();
  52. return nullptr;
  53. }
  54. void DOMAgentMac::InitializeRootsFromOpenWindows() {
  55. for (NSWindow* window : [NSApp windows]) {
  56. if (views::Widget* widget =
  57. views::Widget::GetWidgetForNativeWindow(window)) {
  58. widget->AddObserver(this);
  59. roots_.push_back(widget);
  60. }
  61. }
  62. }
  63. // static
  64. std::unique_ptr<DOMAgentViews> DOMAgentViews::Create() {
  65. return std::make_unique<DOMAgentMac>();
  66. }
  67. } // namespace ui_devtools