From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: fgei 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( + 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 ContentAutofillDriver::Resolve( FrameToken query) { if (absl::holds_alternative(query)) { @@ -412,6 +424,10 @@ void ContentAutofillDriver::FormsSeen( const std::vector& 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& 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 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 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 autofill_manager_ = nullptr; + std::unique_ptr secondary_autofill_manager_ = nullptr; + mojo::AssociatedReceiver receiver_{this}; mojo::AssociatedRemote 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;