Commit 3d5e4220 authored by Milica Selakovic's avatar Milica Selakovic Committed by Commit Bot

[Autofill assistant] Fix failure with GeneratePasswordAction

Component manager driver was invalid at password generation. This CL
fixes the issue by passing web_contents_ to |WebsiteLoginFetcher|
instead of thedriver. Driver is later fetched just before password
generation.

Bug: 1131519
Change-Id: Ic903dfc33fd867efc185260817364fecc5d6ec8b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2426427Reviewed-by: default avatarMaxim Kolosovskiy  <kolos@chromium.org>
Reviewed-by: default avatarClemens Arbesser <arbesser@google.com>
Commit-Queue: Milica Selakovic <selakovic@google.com>
Cr-Commit-Position: refs/heads/master@{#810269}
parent a19ac935
...@@ -31,8 +31,6 @@ ...@@ -31,8 +31,6 @@
#include "components/autofill_assistant/browser/features.h" #include "components/autofill_assistant/browser/features.h"
#include "components/autofill_assistant/browser/switches.h" #include "components/autofill_assistant/browser/switches.h"
#include "components/autofill_assistant/browser/website_login_manager_impl.h" #include "components/autofill_assistant/browser/website_login_manager_impl.h"
#include "components/password_manager/content/browser/content_password_manager_driver.h"
#include "components/password_manager/content/browser/content_password_manager_driver_factory.h"
#include "components/password_manager/core/browser/password_manager_client.h" #include "components/password_manager/core/browser/password_manager_client.h"
#include "components/signin/public/identity_manager/account_info.h" #include "components/signin/public/identity_manager/account_info.h"
#include "components/signin/public/identity_manager/identity_manager.h" #include "components/signin/public/identity_manager/identity_manager.h"
...@@ -485,15 +483,8 @@ ClientAndroid::GetPasswordManagerClient() const { ...@@ -485,15 +483,8 @@ ClientAndroid::GetPasswordManagerClient() const {
WebsiteLoginManager* ClientAndroid::GetWebsiteLoginManager() const { WebsiteLoginManager* ClientAndroid::GetWebsiteLoginManager() const {
if (!website_login_manager_) { if (!website_login_manager_) {
auto* client = GetPasswordManagerClient(); auto* client = GetPasswordManagerClient();
auto* factory =
password_manager::ContentPasswordManagerDriverFactory::FromWebContents(
web_contents_);
// TODO(crbug.com/1043132): Add support for non-main frames. If another
// frame has a different origin than the main frame, passwords-related
// features may not work.
auto* driver = factory->GetDriverForFrame(web_contents_->GetMainFrame());
website_login_manager_ = website_login_manager_ =
std::make_unique<WebsiteLoginManagerImpl>(client, driver); std::make_unique<WebsiteLoginManagerImpl>(client, web_contents_);
} }
return website_login_manager_.get(); return website_login_manager_.get();
} }
......
...@@ -206,6 +206,7 @@ static_library("browser") { ...@@ -206,6 +206,7 @@ static_library("browser") {
"//components/autofill/core/common", "//components/autofill/core/common",
"//components/autofill_assistant/browser/devtools", "//components/autofill_assistant/browser/devtools",
"//components/google/core/common:common", "//components/google/core/common:common",
"//components/password_manager/content/browser:browser",
"//components/password_manager/core/browser:browser", "//components/password_manager/core/browser:browser",
"//components/password_manager/core/browser/form_parsing:form_parsing", "//components/password_manager/core/browser/form_parsing:form_parsing",
"//components/signin/public/identity_manager", "//components/signin/public/identity_manager",
......
...@@ -2,6 +2,7 @@ include_rules = [ ...@@ -2,6 +2,7 @@ include_rules = [
"+chrome/android/features/autofill_assistant/test_support_jni_headers", "+chrome/android/features/autofill_assistant/test_support_jni_headers",
"+components/autofill", "+components/autofill",
"+components/google/core/common", "+components/google/core/common",
"+components/password_manager/content/browser",
"+components/password_manager/core/browser", "+components/password_manager/core/browser",
"+components/password_manager/core/common", "+components/password_manager/core/common",
"+components/version_info", "+components/version_info",
......
...@@ -6,12 +6,13 @@ ...@@ -6,12 +6,13 @@
#include "base/stl_util.h" #include "base/stl_util.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "components/password_manager/content/browser/content_password_manager_driver.h"
#include "components/password_manager/content/browser/content_password_manager_driver_factory.h"
#include "components/password_manager/core/browser/form_fetcher_impl.h" #include "components/password_manager/core/browser/form_fetcher_impl.h"
#include "components/password_manager/core/browser/form_parsing/form_parser.h" #include "components/password_manager/core/browser/form_parsing/form_parser.h"
#include "components/password_manager/core/browser/password_form_metrics_recorder.h" #include "components/password_manager/core/browser/password_form_metrics_recorder.h"
#include "components/password_manager/core/browser/password_generation_frame_helper.h" #include "components/password_manager/core/browser/password_generation_frame_helper.h"
#include "components/password_manager/core/browser/password_manager_client.h" #include "components/password_manager/core/browser/password_manager_client.h"
#include "components/password_manager/core/browser/password_manager_driver.h"
#include "components/password_manager/core/browser/password_save_manager_impl.h" #include "components/password_manager/core/browser/password_save_manager_impl.h"
#include "components/password_manager/core/browser/votes_uploader.h" #include "components/password_manager/core/browser/votes_uploader.h"
#include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_task_traits.h"
...@@ -231,8 +232,8 @@ class WebsiteLoginManagerImpl::UpdatePasswordRequest ...@@ -231,8 +232,8 @@ class WebsiteLoginManagerImpl::UpdatePasswordRequest
WebsiteLoginManagerImpl::WebsiteLoginManagerImpl( WebsiteLoginManagerImpl::WebsiteLoginManagerImpl(
password_manager::PasswordManagerClient* client, password_manager::PasswordManagerClient* client,
password_manager::PasswordManagerDriver* driver) content::WebContents* web_contents)
: client_(client), driver_(driver), weak_ptr_factory_(this) {} : client_(client), web_contents_(web_contents), weak_ptr_factory_(this) {}
WebsiteLoginManagerImpl::~WebsiteLoginManagerImpl() = default; WebsiteLoginManagerImpl::~WebsiteLoginManagerImpl() = default;
...@@ -266,9 +267,19 @@ std::string WebsiteLoginManagerImpl::GeneratePassword( ...@@ -266,9 +267,19 @@ std::string WebsiteLoginManagerImpl::GeneratePassword(
autofill::FormSignature form_signature, autofill::FormSignature form_signature,
autofill::FieldSignature field_signature, autofill::FieldSignature field_signature,
uint64_t max_length) { uint64_t max_length) {
auto* factory =
password_manager::ContentPasswordManagerDriverFactory::FromWebContents(
web_contents_);
DCHECK(factory);
// TODO(crbug.com/1043132): Add support for non-main frames. If another
// frame has a different origin than the main frame, passwords-related
// features may not work.
auto* driver = factory->GetDriverForFrame(web_contents_->GetMainFrame());
DCHECK(driver);
return base::UTF16ToUTF8( return base::UTF16ToUTF8(
driver_->GetPasswordGenerationHelper()->GeneratePassword( driver->GetPasswordGenerationHelper()->GeneratePassword(
driver_->GetLastCommittedURL(), form_signature, field_signature, driver->GetLastCommittedURL(), form_signature, field_signature,
max_length)); max_length));
} }
......
...@@ -9,10 +9,10 @@ ...@@ -9,10 +9,10 @@
#include "base/memory/weak_ptr.h" #include "base/memory/weak_ptr.h"
#include "components/autofill/core/common/password_form.h" #include "components/autofill/core/common/password_form.h"
#include "components/autofill_assistant/browser/website_login_manager.h" #include "components/autofill_assistant/browser/website_login_manager.h"
#include "content/public/browser/web_contents.h"
namespace password_manager { namespace password_manager {
class PasswordManagerClient; class PasswordManagerClient;
class PasswordManagerDriver;
} // namespace password_manager } // namespace password_manager
namespace autofill_assistant { namespace autofill_assistant {
...@@ -22,7 +22,7 @@ namespace autofill_assistant { ...@@ -22,7 +22,7 @@ namespace autofill_assistant {
class WebsiteLoginManagerImpl : public WebsiteLoginManager { class WebsiteLoginManagerImpl : public WebsiteLoginManager {
public: public:
WebsiteLoginManagerImpl(password_manager::PasswordManagerClient* client, WebsiteLoginManagerImpl(password_manager::PasswordManagerClient* client,
password_manager::PasswordManagerDriver* driver); content::WebContents* web_contents);
~WebsiteLoginManagerImpl() override; ~WebsiteLoginManagerImpl() override;
// From WebsiteLoginManager: // From WebsiteLoginManager:
...@@ -55,7 +55,7 @@ class WebsiteLoginManagerImpl : public WebsiteLoginManager { ...@@ -55,7 +55,7 @@ class WebsiteLoginManagerImpl : public WebsiteLoginManager {
password_manager::PasswordManagerClient* const client_; password_manager::PasswordManagerClient* const client_;
password_manager::PasswordManagerDriver* const driver_; content::WebContents* const web_contents_;
// Update password request will be created in PresaveGeneratedPassword and // Update password request will be created in PresaveGeneratedPassword and
// released in CommitGeneratedPassword after committing presaved password to // released in CommitGeneratedPassword after committing presaved password to
...@@ -74,4 +74,4 @@ class WebsiteLoginManagerImpl : public WebsiteLoginManager { ...@@ -74,4 +74,4 @@ class WebsiteLoginManagerImpl : public WebsiteLoginManager {
} // namespace autofill_assistant } // namespace autofill_assistant
#endif // COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_website_login_manager_IMPL_H_ #endif // COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_WEBSITE_LOGIN_MANAGER_IMPL_H_
...@@ -11,9 +11,10 @@ ...@@ -11,9 +11,10 @@
#include "components/password_manager/core/browser/mock_password_store.h" #include "components/password_manager/core/browser/mock_password_store.h"
#include "components/password_manager/core/browser/password_store_consumer.h" #include "components/password_manager/core/browser/password_store_consumer.h"
#include "components/password_manager/core/browser/stub_password_manager_client.h" #include "components/password_manager/core/browser/stub_password_manager_client.h"
#include "components/password_manager/core/browser/stub_password_manager_driver.h"
#include "components/password_manager/core/common/password_manager_features.h" #include "components/password_manager/core/common/password_manager_features.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/browser_task_environment.h" #include "content/public/test/browser_task_environment.h"
#include "content/public/test/test_renderer_host.h"
#include "testing/gmock/include/gmock/gmock.h" #include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
...@@ -50,15 +51,6 @@ class MockPasswordManagerClient ...@@ -50,15 +51,6 @@ class MockPasswordManagerClient
password_manager::PasswordStore*()); password_manager::PasswordStore*());
}; };
class MockPasswordManagerDriver
: public password_manager::StubPasswordManagerDriver {
public:
MockPasswordManagerDriver() = default;
MOCK_CONST_METHOD0(GetId, int());
MOCK_CONST_METHOD0(IsMainFrame, bool());
};
FormData MakeFormDataWithPasswordField() { FormData MakeFormDataWithPasswordField() {
FormData form_data; FormData form_data;
form_data.url = GURL(kFakeUrl); form_data.url = GURL(kFakeUrl);
...@@ -101,9 +93,12 @@ PasswordForm MakeSimplePasswordFormWithoutUsername() { ...@@ -101,9 +93,12 @@ PasswordForm MakeSimplePasswordFormWithoutUsername() {
} // namespace } // namespace
class WebsiteLoginManagerImplTest : public testing::Test { class WebsiteLoginManagerImplTest : public content::RenderViewHostTestHarness {
public: public:
WebsiteLoginManagerImplTest() = default; WebsiteLoginManagerImplTest()
: RenderViewHostTestHarness(
base::test::TaskEnvironment::MainThreadType::UI,
base::test::TaskEnvironment::TimeSource::MOCK_TIME) {}
~WebsiteLoginManagerImplTest() override = default; ~WebsiteLoginManagerImplTest() override = default;
protected: protected:
...@@ -125,10 +120,8 @@ class WebsiteLoginManagerImplTest : public testing::Test { ...@@ -125,10 +120,8 @@ class WebsiteLoginManagerImplTest : public testing::Test {
.WillByDefault(Return(account_store_.get())); .WillByDefault(Return(account_store_.get()));
} }
ON_CALL(driver_, GetId()).WillByDefault(Return(0)); manager_ =
ON_CALL(driver_, IsMainFrame()).WillByDefault(Return(true)); std::make_unique<WebsiteLoginManagerImpl>(&client_, web_contents());
manager_ = std::make_unique<WebsiteLoginManagerImpl>(&client_, &driver_);
} }
void TearDown() override { void TearDown() override {
...@@ -141,17 +134,13 @@ class WebsiteLoginManagerImplTest : public testing::Test { ...@@ -141,17 +134,13 @@ class WebsiteLoginManagerImplTest : public testing::Test {
WebsiteLoginManagerImpl* manager() { return manager_.get(); } WebsiteLoginManagerImpl* manager() { return manager_.get(); }
password_manager::MockPasswordStore* store() { return profile_store_.get(); } password_manager::MockPasswordStore* store() { return profile_store_.get(); }
void WaitForPasswordStore() { task_environment_.RunUntilIdle(); } void WaitForPasswordStore() { task_environment()->RunUntilIdle(); }
private: private:
testing::NiceMock<MockPasswordManagerClient> client_; testing::NiceMock<MockPasswordManagerClient> client_;
MockPasswordManagerDriver driver_;
std::unique_ptr<WebsiteLoginManagerImpl> manager_; std::unique_ptr<WebsiteLoginManagerImpl> manager_;
scoped_refptr<password_manager::MockPasswordStore> profile_store_; scoped_refptr<password_manager::MockPasswordStore> profile_store_;
scoped_refptr<password_manager::MockPasswordStore> account_store_; scoped_refptr<password_manager::MockPasswordStore> account_store_;
content::BrowserTaskEnvironment task_environment_{
base::test::TaskEnvironment::TimeSource::MOCK_TIME,
content::BrowserTaskEnvironment::IO_MAINLOOP};
}; };
// Checks if PasswordForm matches other PasswordForm. // Checks if PasswordForm matches other PasswordForm.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment