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
|
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/views/user_education/browser_help_bubble_event_relay.h"
#include "ui/gfx/native_widget_types.h"
#if USE_AURA
#include "ui/aura/window.h"
#endif
WindowHelpBubbleEventRelay::WindowHelpBubbleEventRelay(
views::Widget* source_widget)
: source_widget_(source_widget) {
widget_observation_.Observe(source_widget_);
}
WindowHelpBubbleEventRelay::~WindowHelpBubbleEventRelay() {
CHECK(!source_widget_) << "Should have been released in derived class.";
}
bool WindowHelpBubbleEventRelay::ShouldHelpBubbleProcessEvents() const {
return false;
}
bool WindowHelpBubbleEventRelay::ShouldUnHoverOnMouseExit() const {
return true;
}
void WindowHelpBubbleEventRelay::Release() {
if (source_widget_) {
widget_observation_.Reset();
source_widget_ = nullptr;
}
}
void WindowHelpBubbleEventRelay::OnWidgetDestroying(views::Widget* widget) {
CHECK_EQ(source_widget_.get(), widget);
Release();
}
std::unique_ptr<WindowHelpBubbleEventRelay> CreateWindowHelpBubbleEventRelay(
views::Widget* source_widget) {
#if USE_AURA
return std::make_unique<WindowHelpBubbleEventRelayAura>(source_widget);
#elif BUILDFLAG(IS_MAC)
return std::make_unique<WindowHelpBubbleEventRelayMac>(source_widget);
#else
NOTREACHED();
#endif
}
#if USE_AURA
WindowHelpBubbleEventRelayAura::WindowHelpBubbleEventRelayAura(
views::Widget* source_widget)
: WindowHelpBubbleEventRelay(source_widget) {
WindowHelpBubbleEventRelay::source_widget()
->GetNativeWindow()
->AddPreTargetHandler(this);
}
WindowHelpBubbleEventRelayAura::~WindowHelpBubbleEventRelayAura() {
Release();
}
void WindowHelpBubbleEventRelayAura::OnEvent(ui::Event* event) {
if (event->IsLocatedEvent()) {
auto* const located = event->AsLocatedEvent();
// When dealing with events sent directly to an aura::Window, the root
// location is not yet computed.
const gfx::Point screen_coords =
located->target()->GetScreenLocation(*located);
if (HelpBubbleEventRelay::OnEvent(*located, screen_coords)) {
event->SetHandled();
}
}
}
void WindowHelpBubbleEventRelayAura::Release() {
if (source_widget()) {
source_widget()->GetNativeWindow()->RemovePreTargetHandler(this);
}
WindowHelpBubbleEventRelay::Release();
}
#endif // USE_AURA
|