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 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
|
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_ANDROID_AUTOFILL_BROWSER_ANDROID_AUTOFILL_CLIENT_H_
#define COMPONENTS_ANDROID_AUTOFILL_BROWSER_ANDROID_AUTOFILL_CLIENT_H_
#include <memory>
#include <string>
#include <vector>
#include "base/android/jni_weak_ref.h"
#include "base/compiler_specific.h"
#include "base/dcheck_is_on.h"
#include "base/functional/callback_forward.h"
#include "base/memory/raw_ptr.h"
#include "components/autofill/content/browser/content_autofill_client.h"
#include "components/autofill/content/browser/content_autofill_driver.h"
#include "components/autofill/core/browser/autofill_trigger_source.h"
#include "components/autofill/core/browser/crowdsourcing/votes_uploader.h"
#include "components/autofill/core/browser/data_manager/valuables/valuables_data_manager.h"
#include "components/autofill/core/browser/metrics/form_interactions_ukm_logger.h"
#include "components/autofill/core/browser/payments/legal_message_line.h"
#include "components/credential_management/content_credential_manager.h"
#include "content/public/browser/web_contents_user_data.h"
#include "ui/android/view_android.h"
namespace autofill {
class AutocompleteHistoryManager;
class AutofillSuggestionDelegate;
class PersonalDataManager;
class StrikeDatabase;
enum class SuggestionType;
} // namespace autofill
namespace content {
class WebContents;
}
namespace syncer {
class SyncService;
}
class PersonalDataManager;
class PrefService;
namespace android_autofill {
// One Android implementation of the AutofillClient. If used, the Android
// Autofill framework is responsible for autofill and password management.
//
// This client is
// a) always used on WebView, and
// b) used on Clank if users switch to a 3P provider and thus disable the
// built-in `BrowserAutofillManager`.
//
// By using this client, the embedder responds to requests from the Android
// Autofill API asking for a "virtual view structure". This class defers to
// parsing logic in renderer and components/autofill to identify forms. The
// forms are translated into that virtual view structure by the Java-side of
// this component (see AndroidAutofillClient.java using AutofillProvider.java).
// Any higher layer only needs to forward the API requests to this client. The
// same applies to filling: the data filling happens in renderer code and only
// requires the embedder to forward the data to be filled.
// The UI (except for datalist dropdowns) are handled entirely by the Platform.
// Neither WebView nor Chrome can control whether e.g. a dropdown or
// keyboard-inlined suggestion are served to the user.
//
// It is created by either AwContents or ChromeAutofillClient and owned by the
// WebContents that it is attached to.
//
// BEWARE OF SUBCLASSING in tests: virtual function calls during construction
// may lead to very surprising behavior. The class is not `final` because one
// test derives from it. Member functions should be final unless they need to be
// mocked or overridden in subclasses and you have verified that they are not
// called, directly or indirectly, from the constructor.
class AndroidAutofillClient : public autofill::ContentAutofillClient {
public:
static void CreateForWebContents(content::WebContents* contents);
AndroidAutofillClient(const AndroidAutofillClient&) = delete;
AndroidAutofillClient& operator=(const AndroidAutofillClient&) = delete;
~AndroidAutofillClient() override;
// AutofillClient:
base::WeakPtr<AutofillClient> GetWeakPtr() final;
const std::string& GetAppLocale() const final;
bool IsOffTheRecord() const final;
scoped_refptr<network::SharedURLLoaderFactory> GetURLLoaderFactory() final;
autofill::AutofillCrowdsourcingManager& GetCrowdsourcingManager() final;
autofill::VotesUploader& GetVotesUploader() override;
autofill::PersonalDataManager& GetPersonalDataManager() final;
autofill::ValuablesDataManager* GetValuablesDataManager() override;
autofill::EntityDataManager* GetEntityDataManager() override;
autofill::SingleFieldFillRouter& GetSingleFieldFillRouter() final;
autofill::AutocompleteHistoryManager* GetAutocompleteHistoryManager() final;
PrefService* GetPrefs() final;
const PrefService* GetPrefs() const final;
syncer::SyncService* GetSyncService() final;
signin::IdentityManager* GetIdentityManager() final;
const signin::IdentityManager* GetIdentityManager() const final;
autofill::FormDataImporter* GetFormDataImporter() final;
autofill::StrikeDatabase* GetStrikeDatabase() final;
ukm::UkmRecorder* GetUkmRecorder() final;
autofill::AddressNormalizer* GetAddressNormalizer() final;
const GURL& GetLastCommittedPrimaryMainFrameURL() const final;
url::Origin GetLastCommittedPrimaryMainFrameOrigin() const final;
security_state::SecurityLevel GetSecurityLevelForUmaHistograms() final;
const translate::LanguageState* GetLanguageState() final;
translate::TranslateDriver* GetTranslateDriver() final;
void ShowAutofillSettings(autofill::SuggestionType suggestion_type) final;
void ConfirmSaveAddressProfile(
const autofill::AutofillProfile& profile,
const autofill::AutofillProfile* original_profile,
bool is_migration_to_account,
AddressProfileSavePromptCallback callback) final;
SuggestionUiSessionId ShowAutofillSuggestions(
const autofill::AutofillClient::PopupOpenArgs& open_args,
base::WeakPtr<autofill::AutofillSuggestionDelegate> delegate) final;
void UpdateAutofillDataListValues(
base::span<const autofill::SelectOption> datalist) final;
void HideAutofillSuggestions(autofill::SuggestionHidingReason reason) final;
bool IsAutofillEnabled() const final;
bool IsAutofillProfileEnabled() const final;
bool IsAutofillPaymentMethodsEnabled() const final;
bool IsAutocompleteEnabled() const final;
bool IsPasswordManagerEnabled() const final;
void DidFillForm(autofill::AutofillTriggerSource trigger_source,
bool is_refill) final;
bool IsContextSecure() const final;
autofill::FormInteractionsFlowId GetCurrentFormInteractionsFlowId() final;
autofill::autofill_metrics::FormInteractionsUkmLogger&
GetFormInteractionsUkmLogger() final;
// ContentAutofillClient:
std::unique_ptr<autofill::AutofillManager> CreateManager(
base::PassKey<autofill::ContentAutofillDriver> pass_key,
autofill::ContentAutofillDriver& driver) final;
credential_management::ContentCredentialManager* GetContentCredentialManager()
override;
protected:
// Protected for testing.
explicit AndroidAutofillClient(content::WebContents* web_contents);
private:
friend class content::WebContentsUserData<AndroidAutofillClient>;
content::WebContents& GetWebContents() const;
JavaObjectWeakGlobalRef java_ref_;
std::unique_ptr<autofill::AutofillCrowdsourcingManager>
crowdsourcing_manager_;
autofill::VotesUploader votes_uploader_{this};
autofill::autofill_metrics::FormInteractionsUkmLogger
form_interactions_ukm_logger_{this};
// Content credential manager to handle navigator.credentials calls.
credential_management::ContentCredentialManager content_credential_manager_;
base::WeakPtrFactory<AndroidAutofillClient> weak_ptr_factory_{this};
};
} // namespace android_autofill
#endif // COMPONENTS_ANDROID_AUTOFILL_BROWSER_ANDROID_AUTOFILL_CLIENT_H_
|