| // Copyright 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef COMPONENTS_ANDROID_AUTOFILL_ANDROID_AUTOFILL_PROVIDER_ANDROID_H_ |
| #define COMPONENTS_ANDROID_AUTOFILL_ANDROID_AUTOFILL_PROVIDER_ANDROID_H_ |
| |
| #include "base/android/jni_weak_ref.h" |
| #include "base/memory/weak_ptr.h" |
| #include "components/android_autofill/browser/autofill_provider.h" |
| #include "components/autofill/core/common/unique_ids.h" |
| |
| namespace content { |
| class WebContents; |
| } |
| |
| namespace autofill { |
| |
| class FormDataAndroid; |
| |
| // Android implementation of AutofillProvider, it has one instance per |
| // WebContents, this class is native peer of AutofillProvider.java. |
| // This class is always instantialized by AutofillProvider Java object. |
| class AutofillProviderAndroid : public AutofillProvider { |
| public: |
| static AutofillProviderAndroid* Create( |
| JNIEnv* env, |
| const base::android::JavaRef<jobject>& jcaller, |
| content::WebContents* web_contents); |
| |
| static AutofillProviderAndroid* FromWebContents( |
| content::WebContents* web_contents); |
| |
| ~AutofillProviderAndroid() override; |
| |
| // Attach this detached object to |jcaller|. |
| void AttachToJavaAutofillProvider( |
| JNIEnv* env, |
| const base::android::JavaRef<jobject>& jcaller); |
| |
| // Invoked when the WebContents that associates with Java AutofillProvider |
| // is changed or Java AutofillProvider is destroyed, it indicates this |
| // AutofillProviderAndroid object shall not talk to its Java peer anymore. |
| void DetachFromJavaAutofillProvider(JNIEnv* env); |
| |
| // AutofillProvider: |
| void OnQueryFormFieldAutofill( |
| AndroidAutofillManager* manager, |
| int32_t id, |
| const FormData& form, |
| const FormFieldData& field, |
| const gfx::RectF& bounding_box, |
| bool /*unused_autoselect_first_suggestion*/) override; |
| void OnTextFieldDidChange(AndroidAutofillManager* manager, |
| const FormData& form, |
| const FormFieldData& field, |
| const gfx::RectF& bounding_box, |
| const base::TimeTicks timestamp) override; |
| void OnTextFieldDidScroll(AndroidAutofillManager* manager, |
| const FormData& form, |
| const FormFieldData& field, |
| const gfx::RectF& bounding_box) override; |
| void OnSelectControlDidChange(AndroidAutofillManager* manager, |
| const FormData& form, |
| const FormFieldData& field, |
| const gfx::RectF& bounding_box) override; |
| void OnFormSubmitted(AndroidAutofillManager* manager, |
| const FormData& form, |
| bool known_success, |
| mojom::SubmissionSource source) override; |
| void OnFocusNoLongerOnForm(AndroidAutofillManager* manager, |
| bool had_interacted_form) override; |
| void OnFocusOnFormField(AndroidAutofillManager* manager, |
| const FormData& form, |
| const FormFieldData& field, |
| const gfx::RectF& bounding_box) override; |
| void OnDidFillAutofillFormData(AndroidAutofillManager* manager, |
| const FormData& form, |
| base::TimeTicks timestamp) override; |
| void OnFormsSeen(AndroidAutofillManager* manager, |
| const std::vector<FormData>& forms) override; |
| void OnHidePopup(AndroidAutofillManager* manager) override; |
| void OnServerPredictionsAvailable(AndroidAutofillManager* manager) override; |
| void OnServerQueryRequestError(AndroidAutofillManager* manager, |
| FormSignature form_signature) override; |
| |
| void Reset(AndroidAutofillManager* manager) override; |
| |
| // Methods called by Java. |
| void OnAutofillAvailable(JNIEnv* env, jobject jcaller, jobject form_data); |
| void OnAcceptDataListSuggestion(JNIEnv* env, jobject jcaller, jstring value); |
| |
| void SetAnchorViewRect(JNIEnv* env, |
| jobject jcaller, |
| jobject anchor_view, |
| jfloat x, |
| jfloat y, |
| jfloat width, |
| jfloat height); |
| |
| private: |
| AutofillProviderAndroid(JNIEnv* env, |
| const base::android::JavaRef<jobject>& jcaller, |
| content::WebContents* web_contents); |
| |
| void FireSuccessfulSubmission(mojom::SubmissionSource source); |
| void OnFocusChanged(bool focus_on_form, |
| size_t index, |
| const gfx::RectF& bounding_box); |
| void FireFormFieldDidChanged(AndroidAutofillManager* manager, |
| const FormData& form, |
| const FormFieldData& field, |
| const gfx::RectF& bounding_box); |
| |
| bool IsCurrentlyLinkedManager(AndroidAutofillManager* manager); |
| |
| bool IsCurrentlyLinkedForm(const FormData& form); |
| |
| gfx::RectF ToClientAreaBound(const gfx::RectF& bounding_box); |
| |
| // Starts a new session, but only if |form| or |manager| doesn't match the |
| // current session. |
| void MaybeStartNewSession(AndroidAutofillManager* manager, |
| const FormData& form, |
| const FormFieldData& field, |
| const gfx::RectF& bounding_box); |
| |
| void Reset(); |
| |
| int32_t id_; |
| std::unique_ptr<FormDataAndroid> form_; |
| FieldGlobalId field_id_; |
| base::WeakPtr<AndroidAutofillManager> manager_; |
| JavaObjectWeakGlobalRef java_ref_; |
| bool check_submission_; |
| // Valid only if check_submission_ is true. |
| mojom::SubmissionSource pending_submission_source_; |
| |
| DISALLOW_COPY_AND_ASSIGN(AutofillProviderAndroid); |
| }; |
| } // namespace autofill |
| |
| #endif // COMPONENTS_ANDROID_AUTOFILL_ANDROID_AUTOFILL_PROVIDER_ANDROID_H_ |