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
|
// Copyright 2021 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/user_education/common/help_bubble/help_bubble_factory_registry.h"
#include <memory>
#include "base/callback_list.h"
#include "base/functional/bind.h"
#include "base/no_destructor.h"
#include "components/user_education/common/help_bubble/help_bubble.h"
#include "components/user_education/common/help_bubble/help_bubble_factory.h"
#include "components/user_education/common/help_bubble/help_bubble_params.h"
#include "ui/base/interaction/element_identifier.h"
#include "ui/base/interaction/element_tracker.h"
namespace user_education {
HelpBubbleFactoryRegistry::HelpBubbleFactoryRegistry() = default;
HelpBubbleFactoryRegistry::~HelpBubbleFactoryRegistry() {
for (auto& pr : help_bubbles_) {
// Unsubscribe from the bubble before trying to close it so we don't try to
// modify the map while we're iterating it.
pr.second = base::CallbackListSubscription();
pr.first->Close();
}
}
std::unique_ptr<HelpBubble> HelpBubbleFactoryRegistry::CreateHelpBubble(
ui::TrackedElement* element,
HelpBubbleParams params) {
CHECK(element);
for (auto& bubble_factory : factories_) {
if (bubble_factory.CanBuildBubbleForTrackedElement(element)) {
auto result = bubble_factory.CreateBubble(element, std::move(params));
if (result) {
AddHelpBubble(result.get());
}
return result;
}
}
return nullptr;
}
void HelpBubbleFactoryRegistry::NotifyAnchorBoundsChanged(
ui::ElementContext context) {
for (const auto& pr : help_bubbles_) {
if (pr.first->GetContext() == context) {
pr.first->OnAnchorBoundsChanged();
}
}
}
bool HelpBubbleFactoryRegistry::ToggleFocusForAccessibility(
ui::ElementContext context) {
for (const auto& pr : help_bubbles_) {
if (pr.first->GetContext() == context &&
pr.first->ToggleFocusForAccessibility()) {
return true;
}
}
return false;
}
HelpBubble* HelpBubbleFactoryRegistry::GetHelpBubble(
ui::ElementContext context) {
for (const auto& pr : help_bubbles_) {
if (pr.first->GetContext() == context) {
return pr.first;
}
}
return nullptr;
}
void HelpBubbleFactoryRegistry::AddHelpBubble(HelpBubble* help_bubble) {
CHECK(help_bubble);
CHECK(help_bubble->is_open());
help_bubbles_.emplace(help_bubble,
help_bubble->AddOnCloseCallback(base::BindOnce(
&HelpBubbleFactoryRegistry::OnHelpBubbleClosed,
base::Unretained(this))));
}
void HelpBubbleFactoryRegistry::OnHelpBubbleClosed(HelpBubble* bubble,
HelpBubble::CloseReason) {
const auto result = help_bubbles_.erase(bubble);
DCHECK(result);
}
} // namespace user_education
|