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
|
// 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/autofill_help_bubble_factory.h"
#include "chrome/browser/ui/views/autofill/popup/popup_base_view.h"
#include "chrome/browser/ui/views/frame/browser_view.h"
#include "chrome/browser/ui/views/user_education/browser_help_bubble_event_relay.h"
#include "components/user_education/views/help_bubble_view.h"
#include "ui/base/interaction/framework_specific_implementation.h"
#include "ui/views/interaction/element_tracker_views.h"
#include "ui/views/view_utils.h"
#include "ui/views/widget/widget_delegate.h"
DEFINE_FRAMEWORK_SPECIFIC_METADATA(AutofillHelpBubbleFactory)
namespace {
// Returns the browser widget if `el` is an autofill popup, null otherwise.
views::Widget* GetBrowserWidgetFrom(const ui::TrackedElement* el) {
if (auto* view_el = el->AsA<views::TrackedElementViews>()) {
auto* const view = view_el->view();
if (!view->GetWidget() || !view->GetWidget()->widget_delegate()) {
return nullptr;
}
if (auto* contents =
view->GetWidget()->widget_delegate()->GetContentsView()) {
if (auto* popup = views::AsViewClass<autofill::PopupBaseView>(contents)) {
if (auto* browser =
BrowserView::GetBrowserViewForBrowser(popup->GetBrowser())) {
return browser->GetWidget();
}
}
}
}
return nullptr;
}
} // namespace
AutofillHelpBubbleFactory::AutofillHelpBubbleFactory(
const user_education::HelpBubbleDelegate* delegate)
: HelpBubbleFactoryViews(delegate) {}
AutofillHelpBubbleFactory::~AutofillHelpBubbleFactory() = default;
bool AutofillHelpBubbleFactory::CanBuildBubbleForTrackedElement(
const ui::TrackedElement* element) const {
return GetBrowserWidgetFrom(element) != nullptr;
}
std::unique_ptr<user_education::HelpBubble>
AutofillHelpBubbleFactory::CreateBubble(
ui::TrackedElement* element,
user_education::HelpBubbleParams params) {
user_education::internal::HelpBubbleAnchorParams anchor;
anchor.view = element->AsA<views::TrackedElementViews>()->view();
return CreateBubbleImpl(
element, anchor, std::move(params),
CreateWindowHelpBubbleEventRelay(GetBrowserWidgetFrom(element)));
}
|