| // Copyright 2018 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/autofill/autofill_popup_controller_impl_mac.h" |
| |
| #import <utility> |
| |
| #import "chrome/browser/ui/autofill/popup_controller_common.h" |
| #import "chrome/browser/ui/cocoa/touchbar/web_textfield_touch_bar_controller.h" |
| #include "components/autofill/core/browser/filling_product.h" |
| #include "components/autofill/core/browser/ui/autofill_popup_delegate.h" |
| #include "components/autofill/core/browser/ui/popup_item_ids.h" |
| |
| using base::WeakPtr; |
| |
| namespace autofill { |
| |
| // static |
| WeakPtr<AutofillSuggestionController> AutofillSuggestionController::GetOrCreate( |
| WeakPtr<AutofillSuggestionController> previous, |
| WeakPtr<AutofillPopupDelegate> delegate, |
| content::WebContents* web_contents, |
| PopupControllerCommon controller_common, |
| int32_t form_control_ax_id) { |
| if (AutofillPopupControllerImpl* previous_impl = |
| static_cast<AutofillPopupControllerImpl*>(previous.get()); |
| previous_impl && previous_impl->delegate_.get() == delegate.get() && |
| previous_impl->container_view() == controller_common.container_view) { |
| previous_impl->controller_common_ = std::move(controller_common); |
| previous_impl->form_control_ax_id_ = form_control_ax_id; |
| previous_impl->ClearState(); |
| return previous_impl->GetWeakPtr(); |
| } |
| |
| if (previous.get()) |
| previous->Hide(PopupHidingReason::kViewDestroyed); |
| |
| auto* controller = new AutofillPopupControllerImplMac( |
| delegate, web_contents, std::move(controller_common), form_control_ax_id); |
| return controller->GetWeakPtr(); |
| } |
| |
| AutofillPopupControllerImplMac::AutofillPopupControllerImplMac( |
| base::WeakPtr<AutofillPopupDelegate> delegate, |
| content::WebContents* web_contents, |
| PopupControllerCommon controller_common, |
| int32_t form_control_ax_id) |
| : AutofillPopupControllerImpl(delegate, |
| web_contents, |
| std::move(controller_common), |
| form_control_ax_id, |
| std::nullopt), |
| touch_bar_controller_(nil), |
| is_credit_card_popup_(delegate->GetMainFillingProduct() == |
| FillingProduct::kCreditCard) {} |
| |
| AutofillPopupControllerImplMac::~AutofillPopupControllerImplMac() = default; |
| |
| void AutofillPopupControllerImplMac::Show( |
| std::vector<autofill::Suggestion> suggestions, |
| AutofillSuggestionTriggerSource trigger_source, |
| AutoselectFirstSuggestion autoselect_first_suggestion) { |
| if (!suggestions.empty() && is_credit_card_popup_) { |
| touch_bar_controller_ = [WebTextfieldTouchBarController |
| controllerForWindow:[container_view().GetNativeNSView() window]]; |
| [touch_bar_controller_ showCreditCardAutofillWithController:this]; |
| } |
| |
| AutofillPopupControllerImpl::Show(std::move(suggestions), trigger_source, |
| autoselect_first_suggestion); |
| // No code below this line! |
| // |Show| may hide the popup and destroy |this|, so |Show| should be the last |
| // line. |
| } |
| |
| void AutofillPopupControllerImplMac::UpdateDataListValues( |
| base::span<const SelectOption> options) { |
| if (touch_bar_controller_) |
| [touch_bar_controller_ invalidateTouchBar]; |
| |
| AutofillPopupControllerImpl::UpdateDataListValues(options); |
| // No code below this line! |
| // |UpdateDataListValues| may hide the popup and destroy |this|, so |
| // |UpdateDataListValues| should be the last line. |
| } |
| |
| void AutofillPopupControllerImplMac::HideViewAndDie() { |
| if (touch_bar_controller_) { |
| [touch_bar_controller_ hideCreditCardAutofillTouchBar]; |
| touch_bar_controller_ = nil; |
| } |
| |
| AutofillPopupControllerImpl::HideViewAndDie(); |
| // No code below this line! |
| // |HideViewAndDie()| destroys |this|, so it should be the last line. |
| } |
| |
| } // namespace autofill |