blob: d9d362079f79ec4cbbfde882a872dde3b3a0c3d1 [file] [log] [blame]
// 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 "chrome/browser/ui/cocoa/touchbar/web_textfield_touch_bar_controller.h"
#include "components/autofill/core/browser/ui/autofill_popup_delegate.h"
#include "components/autofill/core/browser/ui/popup_item_ids.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
using base::WeakPtr;
namespace autofill {
// static
WeakPtr<AutofillPopupControllerImpl> AutofillPopupControllerImpl::GetOrCreate(
WeakPtr<AutofillPopupControllerImpl> previous,
WeakPtr<AutofillPopupDelegate> delegate,
content::WebContents* web_contents,
gfx::NativeView container_view,
const gfx::RectF& element_bounds,
base::i18n::TextDirection text_direction) {
if (previous.get() && previous->delegate_.get() == delegate.get() &&
previous->container_view() == container_view) {
previous->SetElementBounds(element_bounds);
previous->ClearState();
return previous;
}
if (previous.get())
previous->Hide(PopupHidingReason::kViewDestroyed);
AutofillPopupControllerImpl* controller = new AutofillPopupControllerImplMac(
delegate, web_contents, container_view, element_bounds, text_direction);
return controller->GetWeakPtr();
}
AutofillPopupControllerImplMac::AutofillPopupControllerImplMac(
base::WeakPtr<AutofillPopupDelegate> delegate,
content::WebContents* web_contents,
gfx::NativeView container_view,
const gfx::RectF& element_bounds,
base::i18n::TextDirection text_direction)
: AutofillPopupControllerImpl(delegate,
web_contents,
container_view,
element_bounds,
text_direction,
base::DoNothing()),
touch_bar_controller_(nil),
is_credit_card_popup_(delegate->GetPopupType() ==
PopupType::kCreditCards) {}
AutofillPopupControllerImplMac::~AutofillPopupControllerImplMac() = default;
void AutofillPopupControllerImplMac::Show(
std::vector<autofill::Suggestion> suggestions,
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),
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(
const std::vector<std::u16string>& values,
const std::vector<std::u16string>& labels) {
if (touch_bar_controller_)
[touch_bar_controller_ invalidateTouchBar];
AutofillPopupControllerImpl::UpdateDataListValues(values, labels);
// 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