1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/ui_devtools/views/overlay_agent_mac.h"
#import <Cocoa/Cocoa.h>
#include "components/ui_devtools/views/view_element.h"
#include "components/ui_devtools/views/widget_element.h"
#include "ui/gfx/native_widget_types.h"
namespace ui_devtools {
OverlayAgentMac::OverlayAgentMac(DOMAgent* dom_agent)
: OverlayAgentViews(dom_agent) {}
OverlayAgentMac::~OverlayAgentMac() {
if (is_pretarget_handler_)
RemovePreTargetHandler();
CHECK(!IsInObserverList());
}
void OverlayAgentMac::InstallPreTargetHandler() {
DCHECK(!is_pretarget_handler_);
is_pretarget_handler_ = true;
for (NSWindow* window in [NSApp windows]) {
InstallPreTargetHandlerOnWidget(
views::Widget::GetWidgetForNativeWindow(gfx::NativeWindow(window)));
}
}
void OverlayAgentMac::RemovePreTargetHandler() {
DCHECK(is_pretarget_handler_);
is_pretarget_handler_ = false;
for (NSWindow* window in [NSApp windows]) {
views::Widget* widget =
views::Widget::GetWidgetForNativeWindow(gfx::NativeWindow(window));
RemovePreTargetHandlerOnWidget(widget);
}
}
void OverlayAgentMac::OnElementAdded(UIElement* element) {
if (!is_pretarget_handler_ || element->type() != UIElementType::WIDGET)
return;
views::Widget* widget =
UIElement::GetBackingElement<views::Widget, WidgetElement>(element);
InstallPreTargetHandlerOnWidget(widget);
}
void OverlayAgentMac::OnWidgetDestroying(views::Widget* widget) {
if (!is_pretarget_handler_)
return;
RemovePreTargetHandlerOnWidget(widget);
}
int OverlayAgentMac::FindElementIdTargetedByPoint(
ui::LocatedEvent* event) const {
views::View* target = static_cast<views::View*>(event->target());
gfx::Point p = event->root_location();
views::View* targeted_view = target->GetEventHandlerForPoint(p);
DCHECK(targeted_view);
return dom_agent()
->element_root()
->FindUIElementIdForBackendElement<views::View>(targeted_view);
}
protocol::Response OverlayAgentMac::enable() {
dom_agent()->AddObserver(this);
return OverlayAgentViews::enable();
}
protocol::Response OverlayAgentMac::disable() {
if (is_pretarget_handler_)
RemovePreTargetHandler();
hideHighlight();
dom_agent()->RemoveObserver(this);
return OverlayAgentViews::disable();
}
void OverlayAgentMac::InstallPreTargetHandlerOnWidget(views::Widget* widget) {
if (!widget)
return;
widget->GetRootView()->AddPreTargetHandler(
this, ui::EventTarget::Priority::kSystem);
if (!widget->HasObserver(this)) {
widget->AddObserver(this);
}
}
void OverlayAgentMac::RemovePreTargetHandlerOnWidget(views::Widget* widget) {
if (!widget)
return;
widget->GetRootView()->RemovePreTargetHandler(this);
widget->RemoveObserver(this);
}
// static
std::unique_ptr<OverlayAgentViews> OverlayAgentViews::Create(
DOMAgent* dom_agent) {
return std::make_unique<OverlayAgentMac>(dom_agent);
}
} // namespace ui_devtools
|