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