#include "components/user_education/webui/help_bubble_handler.h"
#include <memory>
#include <string>
#include <string_view>
#include "base/callback_list.h"
#include "base/check.h"
#include "base/containers/contains.h"
#include "base/functional/callback.h"
#include "base/functional/callback_forward.h"
#include "base/memory/ptr_util.h"
#include "base/memory/raw_ptr.h"
#include "base/notreached.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "components/user_education/common/help_bubble.h"
#include "components/user_education/common/help_bubble_params.h"
#include "components/user_education/webui/help_bubble_webui.h"
#include "components/user_education/webui/tracked_element_webui.h"
#include "content/public/browser/render_widget_host_view.h"
#include "content/public/browser/visibility.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_observer.h"
#include "content/public/browser/web_ui.h"
#include "content/public/browser/web_ui_controller.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "third_party/abseil-cpp/absl/strings/ascii.h"
#include "ui/base/interaction/element_identifier.h"
#include "ui/base/interaction/element_tracker.h"
#include "ui/webui/resources/cr_components/help_bubble/help_bubble.mojom-shared.h"
#include "ui/webui/resources/cr_components/help_bubble/help_bubble.mojom.h"
namespace user_education {
namespace {
help_bubble::mojom::HelpBubbleArrowPosition HelpBubbleArrowToPosition(
HelpBubbleArrow arrow) { … }
std::string SnakeCaseFromCamelCase(std::string input) { … }
std::string GetFileNameFromIcon(const gfx::VectorIcon* icon) { … }
}
struct HelpBubbleHandlerBase::ElementData { … };
void HelpBubbleHandlerBase::VisibilityProvider::SetLastKnownVisibility(
std::optional<bool> visible) { … }
HelpBubbleHandlerBase::HelpBubbleHandlerBase(
std::unique_ptr<ClientProvider> client_provider,
std::unique_ptr<VisibilityProvider> visibility_provider,
const std::vector<ui::ElementIdentifier>& identifiers,
ui::ElementContext context)
: … { … }
HelpBubbleHandlerBase::~HelpBubbleHandlerBase() { … }
content::WebContents* HelpBubbleHandlerBase::GetWebContents() { … }
bool HelpBubbleHandlerBase::IsHelpBubbleShowingForTesting(
ui::ElementIdentifier id) const { … }
help_bubble::mojom::HelpBubbleClient* HelpBubbleHandlerBase::GetClient() { … }
void HelpBubbleHandlerBase::ReportBadMessage(std::string_view error) { … }
std::unique_ptr<HelpBubbleWebUI> HelpBubbleHandlerBase::CreateHelpBubble(
ui::ElementIdentifier identifier,
HelpBubbleParams params) { … }
void HelpBubbleHandlerBase::OnHelpBubbleClosing(
ui::ElementIdentifier anchor_id) { … }
void HelpBubbleHandlerBase::OnWebContentsVisibilityChanged(
std::optional<bool> visibility) { … }
void HelpBubbleHandlerBase::HelpBubbleAnchorVisibilityChanged(
const std::string& identifier_name,
bool visible,
const gfx::RectF& rect) { … }
void HelpBubbleHandlerBase::HelpBubbleAnchorActivated(
const std::string& identifier_name) { … }
void HelpBubbleHandlerBase::HelpBubbleAnchorCustomEvent(
const std::string& identifier_name,
const std::string& event_name) { … }
void HelpBubbleHandlerBase::HelpBubbleButtonPressed(
const std::string& identifier_name,
uint8_t button_index) { … }
void HelpBubbleHandlerBase::HelpBubbleClosed(
const std::string& identifier_name,
help_bubble::mojom::HelpBubbleClosedReason reason) { … }
bool HelpBubbleHandlerBase::ToggleHelpBubbleFocusForAccessibility(
ui::ElementIdentifier anchor_id) { … }
gfx::Rect HelpBubbleHandlerBase::GetHelpBubbleBoundsInScreen(
ui::ElementIdentifier anchor_id) const { … }
void HelpBubbleHandlerBase::OnFloatingHelpBubbleCreated(
ui::ElementIdentifier anchor_id,
HelpBubble* help_bubble) { … }
void HelpBubbleHandlerBase::OnFloatingHelpBubbleClosed(
ui::ElementIdentifier anchor_id,
HelpBubble* help_bubble,
HelpBubble::CloseReason) { … }
HelpBubbleHandlerBase::ElementData* HelpBubbleHandlerBase::GetDataByName(
const std::string& identifier_name,
ui::ElementIdentifier* found_identifier) { … }
class HelpBubbleHandler::ClientProvider
: public HelpBubbleHandlerBase::ClientProvider { … };
class HelpBubbleHandler::VisibilityProvider
: public HelpBubbleHandlerBase::VisibilityProvider,
public content::WebContentsObserver { … };
HelpBubbleHandler::HelpBubbleHandler(
mojo::PendingReceiver<help_bubble::mojom::HelpBubbleHandler>
pending_handler,
mojo::PendingRemote<help_bubble::mojom::HelpBubbleClient> pending_client,
content::WebUIController* controller,
const std::vector<ui::ElementIdentifier>& identifiers)
: … { … }
HelpBubbleHandler::~HelpBubbleHandler() = default;
content::WebUIController* HelpBubbleHandler::GetController() { … }
void HelpBubbleHandler::ReportBadMessage(std::string_view error) { … }
}