| // 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/webauthn/passkey_updated_confirmation_view.h" |
| |
| #include <cstddef> |
| #include <memory> |
| #include <string> |
| #include <utility> |
| |
| #include "base/functional/bind.h" |
| #include "chrome/browser/ui/passwords/passwords_model_delegate.h" |
| #include "chrome/browser/ui/passwords/ui_utils.h" |
| #include "chrome/browser/ui/views/location_bar/location_bar_bubble_delegate_view.h" |
| #include "chrome/browser/ui/views/passwords/password_bubble_view_base.h" |
| #include "chrome/browser/ui/webauthn/passkey_updated_confirmation_controller.h" |
| #include "chrome/grit/generated_resources.h" |
| #include "components/password_manager/core/browser/password_manager_metrics_util.h" |
| #include "ui/base/l10n/l10n_util.h" |
| #include "ui/base/metadata/metadata_impl_macros.h" |
| #include "ui/base/models/image_model.h" |
| #include "ui/base/mojom/dialog_button.mojom.h" |
| #include "ui/color/color_id.h" |
| #include "ui/gfx/range/range.h" |
| #include "ui/gfx/text_constants.h" |
| #include "ui/views/controls/styled_label.h" |
| #include "ui/views/layout/fill_layout.h" |
| #include "ui/views/style/typography.h" |
| #include "ui/views/view.h" |
| |
| PasskeyUpdatedConfirmationView::PasskeyUpdatedConfirmationView( |
| content::WebContents* web_contents, |
| views::BubbleAnchor anchor_view, |
| DisplayReason display_reason, |
| std::string passkey_rp_id) |
| : PasswordBubbleViewBase(web_contents, |
| anchor_view, |
| /*easily_dismissable=*/true), |
| controller_(PasswordsModelDelegateFromWebContents(web_contents), |
| display_reason == AUTOMATIC |
| ? password_manager::metrics_util:: |
| AUTOMATIC_PASSKEY_UPDATED_CONFIRMATION |
| : password_manager::metrics_util:: |
| MANUAL_PASSKEY_UPDATED_CONFIRMATION, |
| std::move(passkey_rp_id)) { |
| SetButtons(static_cast<int>(ui::mojom::DialogButton::kNone)); |
| SetShowIcon(true); |
| SetTitle(controller_.GetTitle()); |
| SetLayoutManager(std::make_unique<views::FillLayout>()); |
| |
| size_t offset; |
| const std::u16string link = |
| l10n_util::GetStringUTF16(IDS_WEBAUTHN_GPM_PASSKEY_UPDATED_LINK); |
| std::u16string text = l10n_util::GetStringFUTF16( |
| IDS_WEBAUTHN_GPM_PASSKEY_UPDATED_LABEL, link, &offset); |
| |
| auto label = std::make_unique<views::StyledLabel>(); |
| label->SetText(text); |
| label->SetTextContext(views::style::CONTEXT_BUBBLE_FOOTER); |
| label->SetDefaultTextStyle(views::style::STYLE_SECONDARY); |
| label->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| label->AddStyleRange( |
| gfx::Range(offset, offset + link.length()), |
| views::StyledLabel::RangeStyleInfo::CreateForLink(base::BindRepeating( |
| &PasskeyUpdatedConfirmationView::OnGooglePasswordManagerLinkClicked, |
| base::Unretained(this)))); |
| AddChildView(std::move(label)); |
| } |
| |
| PasskeyUpdatedConfirmationView::~PasskeyUpdatedConfirmationView() = default; |
| |
| PasskeyUpdatedConfirmationController* |
| PasskeyUpdatedConfirmationView::GetController() { |
| return &controller_; |
| } |
| |
| const PasskeyUpdatedConfirmationController* |
| PasskeyUpdatedConfirmationView::GetController() const { |
| return &controller_; |
| } |
| |
| ui::ImageModel PasskeyUpdatedConfirmationView::GetWindowIcon() { |
| return ui::ImageModel::FromVectorIcon(GooglePasswordManagerVectorIcon(), |
| ui::kColorIcon); |
| } |
| |
| void PasskeyUpdatedConfirmationView::OnGooglePasswordManagerLinkClicked() { |
| controller_.OnGooglePasswordManagerLinkClicked(); |
| CloseBubble(); |
| } |
| |
| BEGIN_METADATA(PasskeyUpdatedConfirmationView) |
| END_METADATA |