summaryrefslogtreecommitdiffstats
path: root/src/core/autofill_client_qt.cpp
blob: 7908b516c06d82f974e8f3248dbf6b38858f8815 (plain)
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// Copyright (C) 2022 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only

#include "autofill_client_qt.h"

#include "autofill_popup_controller.h"
#include "autofill_popup_controller_p.h"
#include "render_widget_host_view_qt.h"
#include "type_conversion.h"
#include "web_contents_adapter_client.h"
#include "web_contents_view_qt.h"

#include "base/task/thread_pool.h"
#include "base/threading/thread_task_runner_handle.h"
#include "chrome/browser/profiles/profile.h"
#include "components/autofill/core/common/autofill_prefs.h"
#include "content/browser/web_contents/web_contents_impl.h"

namespace QtWebEngineCore {

AutofillClientQt::AutofillClientQt(content::WebContents *webContents)
    : content::WebContentsObserver(webContents)
    , m_popupController(new AutofillPopupController(new AutofillPopupControllerPrivate))
{
}

AutofillClientQt::~AutofillClientQt() { }

autofill::PersonalDataManager *AutofillClientQt::GetPersonalDataManager()
{
    return nullptr;
}

autofill::AutocompleteHistoryManager *AutofillClientQt::GetAutocompleteHistoryManager()
{
    return nullptr;
}

PrefService *AutofillClientQt::GetPrefs()
{
    return const_cast<PrefService *>(base::as_const(*this).GetPrefs());
}

const PrefService *AutofillClientQt::GetPrefs() const
{
    Profile *profile = Profile::FromBrowserContext(web_contents()->GetBrowserContext());
    return profile->GetPrefs();
}

void AutofillClientQt::ShowAutofillPopup(const autofill::AutofillClient::PopupOpenArgs &open_args,
                                         base::WeakPtr<autofill::AutofillPopupDelegate> delegate)
{
    // Specific popups (personal, address, credit card, password) are not supported.
    DCHECK(open_args.popup_type == autofill::PopupType::kUnspecified);

    m_popupController->d->delegate = delegate;
    m_popupController->d->suggestions = open_args.suggestions;
    m_popupController->updateModel();

    adapterClient()->showAutofillPopup(m_popupController.data(),
                                       QRect(toQt(gfx::ToEnclosingRect(open_args.element_bounds))),
                                       open_args.autoselect_first_suggestion.value());
}

void AutofillClientQt::UpdateAutofillPopupDataListValues(const std::vector<std::u16string> &values,
                                                         const std::vector<std::u16string> &labels)
{
    Q_UNUSED(labels);

    if (values.empty())
        HideAutofillPopup(autofill::PopupHidingReason::kNoSuggestions);
}

void AutofillClientQt::PinPopupView()
{
    // Called by password_manager component only.
    NOTIMPLEMENTED();
}

autofill::AutofillClient::PopupOpenArgs AutofillClientQt::GetReopenPopupArgs() const
{
    // Called by password_manager component only.
    NOTIMPLEMENTED();
    return autofill::AutofillClient::PopupOpenArgs();
}

base::span<const autofill::Suggestion> AutofillClientQt::GetPopupSuggestions() const
{
    // Called by password_manager component only.
    NOTIMPLEMENTED();
    return base::span<const autofill::Suggestion>();
}

void AutofillClientQt::UpdatePopup(const std::vector<autofill::Suggestion> &, autofill::PopupType)
{
    // Called by password_manager component only.
    NOTIMPLEMENTED();
}

void AutofillClientQt::HideAutofillPopup(autofill::PopupHidingReason)
{
    adapterClient()->hideAutofillPopup();
}

bool AutofillClientQt::IsAutocompleteEnabled()
{
    return autofill::prefs::IsAutocompleteEnabled(GetPrefs());
}

void AutofillClientQt::PropagateAutofillPredictions(content::RenderFrameHost *,
                                                    const std::vector<autofill::FormStructure *> &)
{
    // For testing purposes only.
    NOTIMPLEMENTED();
}

WebContentsAdapterClient *AutofillClientQt::adapterClient()
{
    return WebContentsViewQt::from(
                   static_cast<content::WebContentsImpl *>(web_contents())->GetView())
            ->client();
}

WEB_CONTENTS_USER_DATA_KEY_IMPL(AutofillClientQt);

} // namespace QtWebEngineCore