| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
| From: fgei <fgei@gmail.com> |
| Date: Tue, 21 Feb 2023 01:48:15 +0000 |
| Subject: [PATCH] Support for both browser and android autofill functionality |
| |
| --- |
| .../browser/android_autofill_manager.cc | 15 ++++++ |
| .../browser/android_autofill_manager.h | 15 ++++++ |
| .../browser/content_autofill_driver.cc | 52 +++++++++++++++++++ |
| .../content/browser/content_autofill_driver.h | 8 +++ |
| .../autofill/core/browser/autofill_driver.h | 6 +++ |
| 5 files changed, 96 insertions(+) |
| |
| diff --git a/components/android_autofill/browser/android_autofill_manager.cc b/components/android_autofill/browser/android_autofill_manager.cc |
| index ed7f0f073b734..df84f20ca4ffa 100644 |
| --- a/components/android_autofill/browser/android_autofill_manager.cc |
| +++ b/components/android_autofill/browser/android_autofill_manager.cc |
| @@ -14,6 +14,7 @@ |
| #include "components/android_autofill/browser/autofill_provider.h" |
| #include "components/android_autofill/browser/form_event_logger_weblayer_android.h" |
| #include "components/autofill/content/browser/content_autofill_driver.h" |
| +#include "components/autofill/core/browser/browser_autofill_manager.h" |
| #include "components/autofill/core/common/mojom/autofill_types.mojom-shared.h" |
| #include "content/public/browser/render_frame_host.h" |
| #include "content/public/browser/web_contents.h" |
| @@ -32,6 +33,20 @@ void AndroidDriverInitHook(AutofillClient* client, |
| driver->GetAutofillAgent()->SetQueryPasswordSuggestion(true); |
| } |
| |
| +void AndroidAndBrowserDriverInitHook( |
| + AutofillClient* client, |
| + const std::string& app_locale, |
| + ContentAutofillDriver* driver) { |
| + driver->set_autofill_manager(std::make_unique<BrowserAutofillManager>( |
| + driver, client, app_locale)); |
| + driver->set_secondary_autofill_manager(base::WrapUnique( |
| + new AndroidAutofillManager(driver, client))); |
| + driver->GetAutofillAgent()->SetUserGestureRequired(false); |
| + driver->GetAutofillAgent()->SetSecureContextRequired(true); |
| + driver->GetAutofillAgent()->SetFocusRequiresScroll(false); |
| + driver->GetAutofillAgent()->SetQueryPasswordSuggestion(true); |
| +} |
| + |
| AndroidAutofillManager::AndroidAutofillManager(AutofillDriver* driver, |
| AutofillClient* client) |
| : AutofillManager(driver, client) { |
| diff --git a/components/android_autofill/browser/android_autofill_manager.h b/components/android_autofill/browser/android_autofill_manager.h |
| index 3fd9a9c2cd46e..e610c101c52e0 100644 |
| --- a/components/android_autofill/browser/android_autofill_manager.h |
| +++ b/components/android_autofill/browser/android_autofill_manager.h |
| @@ -21,6 +21,16 @@ class AutofillProvider; |
| class ContentAutofillDriver; |
| class FormEventLoggerWeblayerAndroid; |
| |
| +// Creates an AndroidAutofillManager and attaches it to the `driver`. |
| +// |
| +// This hook is to be passed to CreateForWebContentsAndDelegate(). |
| +// It is the glue between ContentAutofillDriver[Factory] and |
| +// AndroidAutofillManager, BrowserAutofillManager. |
| +void AndroidAndBrowserDriverInitHook( |
| + AutofillClient* client, |
| + const std::string& app_locale, |
| + ContentAutofillDriver* driver); |
| + |
| // Creates an AndroidAutofillManager and attaches it to the `driver`. |
| // |
| // This hook is to be passed to CreateForWebContentsAndDelegate(). |
| @@ -96,6 +106,11 @@ class AndroidAutofillManager : public AutofillManager, |
| const url::Origin& triggered_origin); |
| |
| protected: |
| + friend void AndroidAndBrowserDriverInitHook( |
| + AutofillClient* client, |
| + const std::string& app_locale, |
| + ContentAutofillDriver* driver); |
| + |
| friend void AndroidDriverInitHook(AutofillClient* client, |
| ContentAutofillDriver* driver); |
| |
| diff --git a/components/autofill/content/browser/content_autofill_driver.cc b/components/autofill/content/browser/content_autofill_driver.cc |
| index 83625554d4fd7..b66f3f3cb1f7f 100644 |
| --- a/components/autofill/content/browser/content_autofill_driver.cc |
| +++ b/components/autofill/content/browser/content_autofill_driver.cc |
| @@ -145,6 +145,18 @@ AutofillManager& ContentAutofillDriver::GetAutofillManager() { |
| return *autofill_manager_; |
| } |
| |
| +AutofillManager& ContentAutofillDriver::GetSecondaryAutofillManager() { |
| + return *secondary_autofill_manager_; |
| +} |
| + |
| +bool ContentAutofillDriver::HasSecondaryAutofillManager() { |
| + if (secondary_autofill_manager_) { |
| + return true; |
| + } |
| + |
| + return false; |
| +} |
| + |
| absl::optional<LocalFrameToken> ContentAutofillDriver::Resolve( |
| FrameToken query) { |
| if (absl::holds_alternative<LocalFrameToken>(query)) { |
| @@ -412,6 +424,10 @@ void ContentAutofillDriver::FormsSeen( |
| const std::vector<FormGlobalId>& removed_forms) { |
| target->GetAutofillManager().OnFormsSeen( |
| WithNewVersion(updated_forms), removed_forms); |
| + if (target->HasSecondaryAutofillManager()) { |
| + target->GetSecondaryAutofillManager().OnFormsSeen( |
| + WithNewVersion(updated_forms), removed_forms); |
| + } |
| }); |
| } |
| |
| @@ -439,6 +455,10 @@ void ContentAutofillDriver::FormSubmitted( |
| } |
| target->GetAutofillManager().OnFormSubmitted( |
| WithNewVersion(form), known_success, submission_source); |
| + if (target->HasSecondaryAutofillManager()) { |
| + target->GetSecondaryAutofillManager().OnFormSubmitted( |
| + WithNewVersion(form), known_success, submission_source); |
| + } |
| }); |
| } |
| |
| @@ -460,6 +480,10 @@ void ContentAutofillDriver::TextFieldDidChange(const FormData& raw_form, |
| base::TimeTicks timestamp) { |
| target->GetAutofillManager().OnTextFieldDidChange( |
| WithNewVersion(form), field, bounding_box, timestamp); |
| + if (target->HasSecondaryAutofillManager()) { |
| + target->GetSecondaryAutofillManager().OnTextFieldDidChange( |
| + WithNewVersion(form), field, bounding_box, timestamp); |
| + } |
| }); |
| } |
| |
| @@ -479,6 +503,10 @@ void ContentAutofillDriver::TextFieldDidScroll(const FormData& raw_form, |
| const FormFieldData& field, const gfx::RectF& bounding_box) { |
| target->GetAutofillManager().OnTextFieldDidScroll(WithNewVersion(form), |
| field, bounding_box); |
| + if (target->HasSecondaryAutofillManager()) { |
| + target->GetSecondaryAutofillManager().OnTextFieldDidScroll(WithNewVersion(form), |
| + field, bounding_box); |
| + } |
| }); |
| } |
| |
| @@ -499,6 +527,10 @@ void ContentAutofillDriver::SelectControlDidChange( |
| const FormFieldData& field, const gfx::RectF& bounding_box) { |
| target->GetAutofillManager().OnSelectControlDidChange( |
| WithNewVersion(form), field, bounding_box); |
| + if (target->HasSecondaryAutofillManager()) { |
| + target->GetSecondaryAutofillManager().OnSelectControlDidChange( |
| + WithNewVersion(form), field, bounding_box); |
| + } |
| }); |
| } |
| |
| @@ -521,6 +553,10 @@ void ContentAutofillDriver::AskForValuesToFill( |
| AutofillSuggestionTriggerSource trigger_source) { |
| target->GetAutofillManager().OnAskForValuesToFill( |
| WithNewVersion(form), field, bounding_box, trigger_source); |
| + if (target->HasSecondaryAutofillManager()) { |
| + target->GetSecondaryAutofillManager().OnAskForValuesToFill( |
| + WithNewVersion(form), field, bounding_box, trigger_source); |
| + } |
| }); |
| } |
| |
| @@ -532,6 +568,9 @@ void ContentAutofillDriver::HidePopup() { |
| DCHECK(!target->IsPrerendering()) |
| << "We should never affect UI while prerendering"; |
| target->GetAutofillManager().OnHidePopup(); |
| + if (target->HasSecondaryAutofillManager()) { |
| + target->GetSecondaryAutofillManager().OnHidePopup(); |
| + } |
| }); |
| } |
| |
| @@ -543,6 +582,9 @@ void ContentAutofillDriver::FocusNoLongerOnForm(bool had_interacted_form) { |
| this, had_interacted_form, |
| [](autofill::AutofillDriver* target, bool had_interacted_form) { |
| target->GetAutofillManager().OnFocusNoLongerOnForm(had_interacted_form); |
| + if (target->HasSecondaryAutofillManager()) { |
| + target->GetSecondaryAutofillManager().OnFocusNoLongerOnForm(had_interacted_form); |
| + } |
| }); |
| } |
| |
| @@ -565,6 +607,9 @@ void ContentAutofillDriver::FocusOnFormField(const FormData& raw_form, |
| }, |
| [](autofill::AutofillDriver* target) { |
| target->GetAutofillManager().OnFocusNoLongerOnForm(true); |
| + if (target->HasSecondaryAutofillManager()) { |
| + target->GetSecondaryAutofillManager().OnFocusNoLongerOnForm(true); |
| + } |
| }); |
| } |
| |
| @@ -579,6 +624,10 @@ void ContentAutofillDriver::DidFillAutofillFormData(const FormData& raw_form, |
| base::TimeTicks timestamp) { |
| target->GetAutofillManager().OnDidFillAutofillFormData( |
| WithNewVersion(form), timestamp); |
| + if (target->HasSecondaryAutofillManager()) { |
| + target->GetSecondaryAutofillManager().OnDidFillAutofillFormData( |
| + WithNewVersion(form), timestamp); |
| + } |
| }); |
| } |
| |
| @@ -643,6 +692,9 @@ void ContentAutofillDriver::Reset() { |
| owner_->router().UnregisterDriver(this, |
| /*driver_is_dying=*/false); |
| autofill_manager_->Reset(); |
| + if (secondary_autofill_manager_) { |
| + secondary_autofill_manager_->Reset(); |
| + } |
| } |
| |
| const mojo::AssociatedRemote<mojom::AutofillAgent>& |
| diff --git a/components/autofill/content/browser/content_autofill_driver.h b/components/autofill/content/browser/content_autofill_driver.h |
| index 39c13f8e77500..ac7d4dba61a09 100644 |
| --- a/components/autofill/content/browser/content_autofill_driver.h |
| +++ b/components/autofill/content/browser/content_autofill_driver.h |
| @@ -131,6 +131,10 @@ class ContentAutofillDriver : public AutofillDriver, |
| autofill_manager_ = std::move(autofill_manager); |
| } |
| |
| + void set_secondary_autofill_manager(std::unique_ptr<AutofillManager> secondary_autofill_manager) { |
| + secondary_autofill_manager_ = std::move(secondary_autofill_manager); |
| + } |
| + |
| content::RenderFrameHost* render_frame_host() { return &*render_frame_host_; } |
| const content::RenderFrameHost* render_frame_host() const { |
| return &*render_frame_host_; |
| @@ -159,6 +163,8 @@ class ContentAutofillDriver : public AutofillDriver, |
| absl::optional<LocalFrameToken> Resolve(FrameToken query) override; |
| ContentAutofillDriver* GetParent() override; |
| AutofillManager& GetAutofillManager() override; |
| + AutofillManager& GetSecondaryAutofillManager() override; |
| + bool HasSecondaryAutofillManager() override; |
| bool IsInActiveFrame() const override; |
| bool IsInAnyMainFrame() const override; |
| bool IsPrerendering() const override; |
| @@ -319,6 +325,8 @@ class ContentAutofillDriver : public AutofillDriver, |
| |
| std::unique_ptr<AutofillManager> autofill_manager_ = nullptr; |
| |
| + std::unique_ptr<AutofillManager> secondary_autofill_manager_ = nullptr; |
| + |
| mojo::AssociatedReceiver<mojom::AutofillDriver> receiver_{this}; |
| |
| mojo::AssociatedRemote<mojom::AutofillAgent> autofill_agent_; |
| diff --git a/components/autofill/core/browser/autofill_driver.h b/components/autofill/core/browser/autofill_driver.h |
| index 9426b8cd4106f..d80e4a55b022a 100644 |
| --- a/components/autofill/core/browser/autofill_driver.h |
| +++ b/components/autofill/core/browser/autofill_driver.h |
| @@ -69,6 +69,12 @@ class AutofillDriver { |
| // Returns the AutofillManager owned by the AutofillDriver. |
| virtual AutofillManager& GetAutofillManager() = 0; |
| |
| + // Returns the secondary AutofillManager owned by the AutofillDriver. |
| + virtual AutofillManager& GetSecondaryAutofillManager() = 0; |
| + |
| + // Returns if there is a secondary AutofillManager owned by the AutofillDriver. |
| + virtual bool HasSecondaryAutofillManager() = 0; |
| + |
| // Returns whether the AutofillDriver instance is associated with an active |
| // frame in the MPArch sense. |
| virtual bool IsInActiveFrame() const = 0; |