Commit 1ff4d2c8 authored by John Z Wu's avatar John Z Wu Committed by Commit Bot

Refactor password code constructors and initializers

Also updated unit tests.

Bug: 1069338
Change-Id: Ib5117cb42990020d4de14c7388141b26605115f6
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2146140Reviewed-by: default avatarHiroshi Ichikawa <ichikawa@chromium.org>
Commit-Queue: John Wu <jzw@chromium.org>
Cr-Commit-Position: refs/heads/master@{#758728}
parent f623acad
......@@ -19,6 +19,7 @@
#include "components/autofill/ios/form_util/form_activity_params.h"
#import "components/autofill/ios/form_util/form_activity_tab_helper.h"
#import "components/autofill/ios/form_util/test_form_activity_tab_helper.h"
#include "components/password_manager/core/browser/password_manager.h"
#import "ios/web/public/deprecated/crw_test_js_injection_receiver.h"
#include "ios/web/public/js_messaging/web_frames_manager.h"
#import "ios/web/public/test/fakes/fake_web_frame.h"
......@@ -29,6 +30,8 @@
#include "ios/web/public/web_client.h"
#import "ios/web_view/internal/autofill/cwv_autofill_suggestion_internal.h"
#import "ios/web_view/internal/passwords/cwv_password_controller_fake.h"
#import "ios/web_view/internal/passwords/web_view_password_manager_client.h"
#import "ios/web_view/internal/passwords/web_view_password_manager_driver.h"
#include "ios/web_view/internal/web_view_browser_state.h"
#import "ios/web_view/public/cwv_autofill_controller_delegate.h"
#include "ios/web_view/test/test_with_locale_and_resources.h"
......@@ -79,8 +82,21 @@ class CWVAutofillControllerTest : public TestWithLocaleAndResources {
fake_web_frames_manager_ = frames_manager.get();
test_web_state_.SetWebFramesManager(std::move(frames_manager));
password_controller_ =
[[CWVPasswordControllerFake alloc] initWithWebState:&test_web_state_];
// TODO(crbug.com/1070468): Redo CWVPasswordController so it is easier to
// fake in unit tests.
auto passwordManagerClient = std::make_unique<WebViewPasswordManagerClient>(
&test_web_state_, /*sync_service=*/nullptr, browser_state_.GetPrefs(),
/*identity_manager=*/nullptr, /*log_manager=*/nullptr,
/*profile_store=*/nullptr, /*account_store=*/nullptr);
auto passwordManager = std::make_unique<password_manager::PasswordManager>(
passwordManagerClient.get());
auto passwordManagerDriver =
std::make_unique<WebViewPasswordManagerDriver>();
password_controller_ = [[CWVPasswordControllerFake alloc]
initWithWebState:&test_web_state_
passwordManager:std::move(passwordManager)
passwordManagerClient:std::move(passwordManagerClient)
passwordManagerDriver:std::move(passwordManagerDriver)];
autofill_controller_ =
[[CWVAutofillController alloc] initWithWebState:&test_web_state_
......
......@@ -18,6 +18,7 @@
#import "components/autofill/ios/browser/js_autofill_manager.h"
#import "components/autofill/ios/browser/js_suggestion_manager.h"
#include "components/language/ios/browser/ios_language_detection_tab_helper.h"
#include "components/password_manager/core/browser/password_manager.h"
#include "components/url_formatter/elide_url.h"
#include "google_apis/google_api_keys.h"
#import "ios/web/public/deprecated/crw_js_injection_receiver.h"
......@@ -48,6 +49,8 @@
#import "ios/web_view/internal/cwv_web_view_configuration_internal.h"
#import "ios/web_view/internal/language/web_view_url_language_histogram_factory.h"
#import "ios/web_view/internal/passwords/cwv_password_controller.h"
#import "ios/web_view/internal/passwords/web_view_password_manager_client.h"
#import "ios/web_view/internal/passwords/web_view_password_manager_driver.h"
#import "ios/web_view/internal/translate/cwv_translation_controller_internal.h"
#import "ios/web_view/internal/translate/web_view_translate_client.h"
#include "ios/web_view/internal/web_view_browser_state.h"
......@@ -643,8 +646,20 @@ BOOL gChromeLongPressAndForceTouchHandlingEnabled = YES;
[_webState->GetJSInjectionReceiver()
instanceOfClass:[JsSuggestionManager class]]);
[JSSuggestionManager setWebFramesManager:_webState->GetWebFramesManager()];
CWVPasswordController* passwordController =
[[CWVPasswordController alloc] initWithWebState:_webState.get()];
auto passwordManagerClient =
ios_web_view::WebViewPasswordManagerClient::Create(
_webState.get(), _configuration.browserState);
auto passwordManager = std::make_unique<password_manager::PasswordManager>(
passwordManagerClient.get());
auto passwordManagerDriver =
std::make_unique<ios_web_view::WebViewPasswordManagerDriver>();
CWVPasswordController* passwordController = [[CWVPasswordController alloc]
initWithWebState:_webState.get()
passwordManager:std::move(passwordManager)
passwordManagerClient:std::move(passwordManagerClient)
passwordManagerDriver:std::move(passwordManagerDriver)];
return [[CWVAutofillController alloc] initWithWebState:_webState.get()
autofillAgent:autofillAgent
JSAutofillManager:JSAutofillManager
......
......@@ -7,6 +7,8 @@
#import <Foundation/Foundation.h>
#include <memory>
NS_ASSUME_NONNULL_BEGIN
typedef NS_ENUM(NSInteger, CWVPasswordUserDecision);
......@@ -14,9 +16,18 @@ typedef NS_ENUM(NSInteger, CWVPasswordUserDecision);
@class CWVPasswordController;
@class CWVPassword;
namespace ios_web_view {
class WebViewPasswordManagerClient;
class WebViewPasswordManagerDriver;
} // namespace ios_web_view
namespace password_manager {
class PasswordManager;
} // namespace password_manager
namespace web {
class WebState;
}
} // namespace web
// Internal protocol to receive callbacks related to password autofilling.
@protocol CWVPasswordControllerDelegate
......@@ -52,7 +63,15 @@ class WebState;
// Creates a new password controller with the given |webState|.
- (instancetype)initWithWebState:(web::WebState*)webState
NS_DESIGNATED_INITIALIZER;
passwordManager:
(std::unique_ptr<password_manager::PasswordManager>)
passwordManager
passwordManagerClient:
(std::unique_ptr<ios_web_view::WebViewPasswordManagerClient>)
passwordManagerClient
passwordManagerDriver:
(std::unique_ptr<ios_web_view::WebViewPasswordManagerDriver>)
passwordManagerDriver NS_DESIGNATED_INITIALIZER;
- (instancetype)init NS_UNAVAILABLE;
......
......@@ -101,7 +101,16 @@ typedef void (^PasswordSuggestionsAvailableCompletion)(
#pragma mark - Initialization
- (instancetype)initWithWebState:(web::WebState*)webState {
- (instancetype)initWithWebState:(web::WebState*)webState
passwordManager:
(std::unique_ptr<password_manager::PasswordManager>)
passwordManager
passwordManagerClient:
(std::unique_ptr<ios_web_view::WebViewPasswordManagerClient>)
passwordManagerClient
passwordManagerDriver:
(std::unique_ptr<ios_web_view::WebViewPasswordManagerDriver>)
passwordManagerDriver {
self = [super init];
if (self) {
DCHECK(webState);
......@@ -113,12 +122,11 @@ typedef void (^PasswordSuggestionsAvailableCompletion)(
[[PasswordFormHelper alloc] initWithWebState:webState delegate:self];
_suggestionHelper =
[[PasswordSuggestionHelper alloc] initWithDelegate:self];
_passwordManagerClient =
std::make_unique<WebViewPasswordManagerClient>(self);
_passwordManager = std::make_unique<password_manager::PasswordManager>(
_passwordManagerClient.get());
_passwordManagerDriver =
std::make_unique<WebViewPasswordManagerDriver>(self);
_passwordManagerClient = std::move(passwordManagerClient);
_passwordManagerClient->set_delegate(self);
_passwordManager = std::move(passwordManager);
_passwordManagerDriver = std::move(passwordManagerDriver);
_passwordManagerDriver->set_delegate(self);
// TODO(crbug.com/865114): Credential manager related logic
}
......@@ -176,16 +184,6 @@ typedef void (^PasswordSuggestionsAvailableCompletion)(
#pragma mark - CWVPasswordManagerClientDelegate
- (ios_web_view::WebViewBrowserState*)browserState {
return _webState ? ios_web_view::WebViewBrowserState::FromBrowserState(
_webState->GetBrowserState())
: nullptr;
}
- (web::WebState*)webState {
return _webState;
}
- (password_manager::PasswordManager*)passwordManager {
return _passwordManager.get();
}
......
......@@ -5,31 +5,35 @@
#ifndef IOS_WEB_VIEW_INTERNAL_PASSWORDS_WEB_VIEW_PASSWORD_MANAGER_CLIENT_H_
#define IOS_WEB_VIEW_INTERNAL_PASSWORDS_WEB_VIEW_PASSWORD_MANAGER_CLIENT_H_
#import <Foundation/Foundation.h>
#include <memory>
#include "base/macros.h"
#include "components/autofill/core/browser/logging/log_manager.h"
#include "components/password_manager/core/browser/password_feature_manager.h"
#include "components/password_manager/core/browser/password_form_manager_for_ui.h"
#include "components/password_manager/core/browser/password_manager.h"
#import "components/password_manager/core/browser/password_manager_client.h"
#include "components/password_manager/core/browser/password_manager_client_helper.h"
#include "components/password_manager/core/browser/password_manager_driver.h"
#include "components/password_manager/core/browser/password_manager_metrics_recorder.h"
#include "components/password_manager/core/browser/password_store.h"
#include "components/password_manager/core/browser/sync_credentials_filter.h"
#include "components/prefs/pref_member.h"
#include "components/signin/public/identity_manager/identity_manager.h"
#include "components/sync/driver/sync_service.h"
#import "ios/web/public/web_state.h"
#include "ios/web_view/internal/passwords/web_view_password_feature_manager.h"
#include "ios/web_view/internal/web_view_browser_state.h"
#include "url/gurl.h"
namespace ios_web_view {
class WebViewBrowserState;
} // namespace ios_web_view
namespace password_manager {
class PasswordFormManagerForUI;
class PasswordManagerDriver;
} // namespace password_manager
@protocol CWVPasswordManagerClientDelegate <NSObject>
namespace web {
class WebState;
} // namespace web
@property(readonly, nonatomic)
password_manager::PasswordManager* passwordManager;
@protocol CWVPasswordManagerClientDelegate
// Returns the current URL of the main frame.
@property(readonly, nonatomic) const GURL& lastCommittedURL;
// Shows UI to prompt the user to save the password.
- (void)showSavePasswordInfoBar:
......@@ -43,14 +47,6 @@ class WebState;
- (void)showAutosigninNotification:
(std::unique_ptr<autofill::PasswordForm>)formSignedIn;
@property(readonly, nonatomic) ios_web_view::WebViewBrowserState* browserState;
@property(readonly, nonatomic) web::WebState* webState;
@property(readonly, nonatomic)
password_manager::PasswordManager* passwordManager;
@property(readonly, nonatomic) const GURL& lastCommittedURL;
@end
namespace ios_web_view {
......@@ -58,8 +54,19 @@ namespace ios_web_view {
class WebViewPasswordManagerClient
: public password_manager::PasswordManagerClient {
public:
// Convenience factory method for creating a WebViewPasswordManagerClient.
static std::unique_ptr<WebViewPasswordManagerClient> Create(
web::WebState* web_state,
WebViewBrowserState* browser_state);
explicit WebViewPasswordManagerClient(
id<CWVPasswordManagerClientDelegate> delegate);
web::WebState* web_state,
syncer::SyncService* sync_service,
PrefService* pref_service,
signin::IdentityManager* identity_manager,
std::unique_ptr<autofill::LogManager> log_manager,
password_manager::PasswordStore* profile_store,
password_manager::PasswordStore* account_store);
~WebViewPasswordManagerClient() override;
......@@ -117,19 +124,28 @@ class WebViewPasswordManagerClient
bool IsNewTabPage() const override;
password_manager::FieldInfoManager* GetFieldInfoManager() const override;
void set_delegate(id<CWVPasswordManagerClientDelegate> delegate) {
delegate_ = delegate;
}
const syncer::SyncService* GetSyncService();
private:
__weak id<CWVPasswordManagerClientDelegate> delegate_;
web::WebState* web_state_;
syncer::SyncService* sync_service_;
PrefService* pref_service_;
signin::IdentityManager* identity_manager_;
std::unique_ptr<autofill::LogManager> log_manager_;
password_manager::PasswordStore* profile_store_;
password_manager::PasswordStore* account_store_;
WebViewPasswordFeatureManager password_feature_manager_;
const password_manager::SyncCredentialsFilter credentials_filter_;
// The preference associated with
// password_manager::prefs::kCredentialsEnableService.
BooleanPrefMember saving_passwords_enabled_;
const password_manager::SyncCredentialsFilter credentials_filter_;
std::unique_ptr<autofill::LogManager> log_manager_;
// Helper for performing logic that is common between
// ChromePasswordManagerClient and IOSChromePasswordManagerClient.
password_manager::PasswordManagerClientHelper helper_;
......
......@@ -8,26 +8,18 @@
#include <utility>
#include "components/autofill/core/browser/logging/log_manager.h"
#include "components/autofill/core/browser/logging/log_router.h"
#include "components/autofill/core/common/password_form.h"
#include "components/keyed_service/core/service_access_type.h"
#include "components/password_manager/core/browser/password_form_manager_for_ui.h"
#include "components/password_manager/core/browser/password_manager.h"
#include "components/password_manager/core/browser/password_manager_driver.h"
#include "components/password_manager/core/browser/password_manager_util.h"
#include "components/password_manager/core/common/password_manager_pref_names.h"
#include "components/password_manager/ios/credential_manager_util.h"
#import "ios/web/public/web_state.h"
#include "ios/web_view/internal/app/application_context.h"
#import "ios/web_view/internal/passwords/web_view_account_password_store_factory.h"
#import "ios/web_view/internal/passwords/web_view_password_manager_log_router_factory.h"
#include "ios/web_view/internal/passwords/web_view_password_store_factory.h"
#include "ios/web_view/internal/signin/web_view_identity_manager_factory.h"
#import "ios/web_view/internal/sync/web_view_profile_sync_service_factory.h"
#include "ios/web_view/internal/web_view_browser_state.h"
#include "net/cert/cert_status_flags.h"
#include "services/network/public/cpp/shared_url_loader_factory.h"
#include "url/gurl.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
......@@ -38,30 +30,54 @@ using password_manager::PasswordManagerMetricsRecorder;
using password_manager::PasswordStore;
using password_manager::SyncState;
namespace {
namespace ios_web_view {
const syncer::SyncService* GetSyncService(
ios_web_view::WebViewBrowserState* browser_state) {
return ios_web_view::WebViewProfileSyncServiceFactory::GetForBrowserState(
browser_state);
// static
std::unique_ptr<WebViewPasswordManagerClient>
WebViewPasswordManagerClient::Create(web::WebState* web_state,
WebViewBrowserState* browser_state) {
syncer::SyncService* sync_service =
ios_web_view::WebViewProfileSyncServiceFactory::GetForBrowserState(
browser_state);
signin::IdentityManager* identity_manager =
ios_web_view::WebViewIdentityManagerFactory::GetForBrowserState(
browser_state);
autofill::LogRouter* logRouter =
ios_web_view::WebViewPasswordManagerLogRouterFactory::GetForBrowserState(
browser_state);
auto log_manager =
autofill::LogManager::Create(logRouter, base::RepeatingClosure());
scoped_refptr<password_manager::PasswordStore> profile_store =
ios_web_view::WebViewPasswordStoreFactory::GetForBrowserState(
browser_state, ServiceAccessType::EXPLICIT_ACCESS);
scoped_refptr<password_manager::PasswordStore> account_store =
ios_web_view::WebViewAccountPasswordStoreFactory::GetForBrowserState(
browser_state, ServiceAccessType::EXPLICIT_ACCESS);
return std::make_unique<ios_web_view::WebViewPasswordManagerClient>(
web_state, sync_service, browser_state->GetPrefs(), identity_manager,
std::move(log_manager), profile_store.get(), account_store.get());
}
} // namespace
namespace ios_web_view {
WebViewPasswordManagerClient::WebViewPasswordManagerClient(
id<CWVPasswordManagerClientDelegate> delegate)
: delegate_(delegate),
password_feature_manager_(GetPrefs(),
GetSyncService(delegate.browserState)),
web::WebState* web_state,
syncer::SyncService* sync_service,
PrefService* pref_service,
signin::IdentityManager* identity_manager,
std::unique_ptr<autofill::LogManager> log_manager,
PasswordStore* profile_store,
PasswordStore* account_store)
: web_state_(web_state),
sync_service_(sync_service),
pref_service_(pref_service),
identity_manager_(identity_manager),
log_manager_(std::move(log_manager)),
profile_store_(profile_store),
account_store_(account_store),
password_feature_manager_(pref_service, sync_service),
credentials_filter_(
this,
base::BindRepeating(&GetSyncService, delegate_.browserState)),
log_manager_(autofill::LogManager::Create(
ios_web_view::WebViewPasswordManagerLogRouterFactory::
GetForBrowserState(delegate_.browserState),
base::RepeatingClosure())),
base::Bind(&WebViewPasswordManagerClient::GetSyncService,
base::Unretained(this))),
helper_(this) {
saving_passwords_enabled_.Init(
password_manager::prefs::kCredentialsEnableService, GetPrefs());
......@@ -70,9 +86,7 @@ WebViewPasswordManagerClient::WebViewPasswordManagerClient(
WebViewPasswordManagerClient::~WebViewPasswordManagerClient() = default;
SyncState WebViewPasswordManagerClient::GetPasswordSyncState() const {
const syncer::SyncService* sync_service =
GetSyncService(delegate_.browserState);
return password_manager_util::GetPasswordSyncState(sync_service);
return password_manager_util::GetPasswordSyncState(sync_service_);
}
bool WebViewPasswordManagerClient::PromptUserToChooseCredentials(
......@@ -135,7 +149,7 @@ void WebViewPasswordManagerClient::PromptUserToEnableAutosignin() {
}
bool WebViewPasswordManagerClient::IsIncognito() const {
return delegate_.browserState->IsOffTheRecord();
return web_state_->GetBrowserState()->IsOffTheRecord();
}
const password_manager::PasswordManager*
......@@ -149,23 +163,19 @@ WebViewPasswordManagerClient::GetPasswordFeatureManager() const {
}
bool WebViewPasswordManagerClient::IsMainFrameSecure() const {
return password_manager::WebStateContentIsSecureHtml(delegate_.webState);
return password_manager::WebStateContentIsSecureHtml(web_state_);
}
PrefService* WebViewPasswordManagerClient::GetPrefs() const {
return delegate_.browserState->GetPrefs();
return pref_service_;
}
PasswordStore* WebViewPasswordManagerClient::GetProfilePasswordStore() const {
return ios_web_view::WebViewPasswordStoreFactory::GetForBrowserState(
delegate_.browserState, ServiceAccessType::EXPLICIT_ACCESS)
.get();
return profile_store_;
}
PasswordStore* WebViewPasswordManagerClient::GetAccountPasswordStore() const {
return ios_web_view::WebViewAccountPasswordStoreFactory::GetForBrowserState(
delegate_.browserState, ServiceAccessType::EXPLICIT_ACCESS)
.get();
return account_store_;
}
void WebViewPasswordManagerClient::NotifyUserAutoSignin(
......@@ -223,13 +233,12 @@ WebViewPasswordManagerClient::GetMetricsRecorder() {
}
signin::IdentityManager* WebViewPasswordManagerClient::GetIdentityManager() {
return WebViewIdentityManagerFactory::GetForBrowserState(
delegate_.browserState);
return identity_manager_;
}
scoped_refptr<network::SharedURLLoaderFactory>
WebViewPasswordManagerClient::GetURLLoaderFactory() {
return (delegate_.browserState)->GetSharedURLLoaderFactory();
return web_state_->GetBrowserState()->GetSharedURLLoaderFactory();
}
bool WebViewPasswordManagerClient::IsIsolationForPasswordSitesEnabled() const {
......@@ -245,4 +254,8 @@ WebViewPasswordManagerClient::GetFieldInfoManager() const {
return nullptr;
}
const syncer::SyncService* WebViewPasswordManagerClient::GetSyncService() {
return sync_service_;
}
} // namespace ios_web_view
......@@ -6,17 +6,24 @@
#include <memory>
#include "base/memory/scoped_refptr.h"
#include "base/test/scoped_feature_list.h"
#include "components/autofill/core/browser/logging/stub_log_manager.h"
#include "components/autofill/core/common/password_form.h"
#include "components/password_manager/core/browser/mock_password_form_manager_for_ui.h"
#include "components/password_manager/core/browser/password_form_manager_for_ui.h"
#include "components/password_manager/core/browser/password_manager.h"
#include "components/password_manager/core/browser/password_manager_util.h"
#include "components/password_manager/core/browser/test_password_store.h"
#include "components/password_manager/core/common/password_manager_features.h"
#include "components/password_manager/core/common/password_manager_pref_names.h"
#include "components/prefs/pref_registry_simple.h"
#include "components/prefs/testing_pref_service.h"
#include "components/signin/public/identity_manager/account_info.h"
#include "components/sync/driver/test_sync_service.h"
#import "ios/web/public/test/fakes/test_web_state.h"
#include "ios/web/public/test/scoped_testing_web_client.h"
#include "ios/web/public/test/web_task_environment.h"
#include "ios/web/public/web_client.h"
#include "ios/web_view/internal/web_view_browser_state.h"
#include "ios/web_view/test/test_with_locale_and_resources.h"
#include "testing/gtest/include/gtest/gtest.h"
#import "testing/gtest_mac.h"
#include "testing/platform_test.h"
......@@ -26,102 +33,89 @@
#error "This file requires ARC support."
#endif
@interface CWVTestPasswordManagerClientDelegate
: NSObject <CWVPasswordManagerClientDelegate>
@end
@implementation CWVTestPasswordManagerClientDelegate {
GURL _emptyURL;
std::unique_ptr<ios_web_view::WebViewBrowserState> _browserState;
}
- (instancetype)init {
self = [super init];
if (self) {
_browserState = std::make_unique<ios_web_view::WebViewBrowserState>(
/*off_the_record=*/false);
}
return self;
}
- (void)showSavePasswordInfoBar:
(std::unique_ptr<password_manager::PasswordFormManagerForUI>)formToSave {
}
- (void)showUpdatePasswordInfoBar:
(std::unique_ptr<password_manager::PasswordFormManagerForUI>)formToUpdate {
}
- (void)showAutosigninNotification:
(std::unique_ptr<autofill::PasswordForm>)formSignedIn {
}
- (ios_web_view::WebViewBrowserState*)browserState {
return _browserState.get();
}
- (web::WebState*)webState {
return nullptr;
}
- (password_manager::PasswordManager*)passwordManager {
return nullptr;
}
- (const GURL&)lastCommittedURL {
return _emptyURL;
}
@end
namespace ios_web_view {
using testing::_;
using testing::Invoke;
using testing::Return;
class WebViewPasswordManagerClientTest : public TestWithLocaleAndResources {
class WebViewPasswordManagerClientTest : public PlatformTest {
protected:
WebViewPasswordManagerClientTest()
: web_client_(std::make_unique<web::WebClient>()) {}
web::ScopedTestingWebClient web_client_;
web::WebTaskEnvironment task_environment_;
: profile_store_(
base::MakeRefCounted<password_manager::TestPasswordStore>()),
account_store_(
base::MakeRefCounted<password_manager::TestPasswordStore>(
/*is_account_store=*/true)) {
scoped_feature.InitAndEnableFeature(
password_manager::features::kEnablePasswordsAccountStorage);
pref_service_.registry()->RegisterBooleanPref(
password_manager::prefs::kCredentialsEnableService, true);
pref_service_.registry()->RegisterDictionaryPref(
password_manager::prefs::kAccountStoragePerAccountSettings);
password_manager_client_ = std::make_unique<WebViewPasswordManagerClient>(
&web_state_, &sync_service_, &pref_service_,
/*identity_manager=*/nullptr,
std::make_unique<autofill::StubLogManager>(), profile_store_.get(),
account_store_.get());
}
~WebViewPasswordManagerClientTest() override {
profile_store_->ShutdownOnUIThread();
account_store_->ShutdownOnUIThread();
}
base::test::ScopedFeatureList scoped_feature;
web::TestWebState web_state_;
syncer::TestSyncService sync_service_;
TestingPrefServiceSimple pref_service_;
autofill::StubLogManager log_manager_;
scoped_refptr<password_manager::TestPasswordStore> profile_store_;
scoped_refptr<password_manager::TestPasswordStore> account_store_;
std::unique_ptr<WebViewPasswordManagerClient> password_manager_client_;
};
TEST_F(WebViewPasswordManagerClientTest, NoPromptIfBlacklisted) {
CWVTestPasswordManagerClientDelegate* test_delegate =
[[CWVTestPasswordManagerClientDelegate alloc] init];
WebViewPasswordManagerClient client(test_delegate);
auto password_manager_for_ui =
std::make_unique<password_manager::MockPasswordFormManagerForUI>();
EXPECT_CALL(*password_manager_for_ui, IsBlacklisted()).WillOnce(Return(true));
base::test::ScopedFeatureList scoped_feature;
scoped_feature.InitAndEnableFeature(
password_manager::features::kEnablePasswordsAccountStorage);
EXPECT_FALSE(client.PromptUserToSaveOrUpdatePassword(
EXPECT_FALSE(password_manager_client_->PromptUserToSaveOrUpdatePassword(
std::move(password_manager_for_ui), /*update_password=*/false));
}
TEST_F(WebViewPasswordManagerClientTest, NoPromptIfNotOptedInToAccountStorage) {
CWVTestPasswordManagerClientDelegate* test_delegate =
[[CWVTestPasswordManagerClientDelegate alloc] init];
WebViewPasswordManagerClient client(test_delegate);
auto password_manager_for_ui =
std::make_unique<password_manager::MockPasswordFormManagerForUI>();
EXPECT_CALL(*password_manager_for_ui, IsBlacklisted())
.WillOnce(Return(false));
base::test::ScopedFeatureList scoped_feature;
scoped_feature.InitAndDisableFeature(
password_manager::features::kEnablePasswordsAccountStorage);
CoreAccountInfo account_info;
account_info.gaia = "1337";
sync_service_.SetAuthenticatedAccountInfo(account_info);
EXPECT_FALSE(client.PromptUserToSaveOrUpdatePassword(
EXPECT_FALSE(password_manager_client_->PromptUserToSaveOrUpdatePassword(
std::move(password_manager_for_ui), /*update_password=*/false));
}
// TODO(crbug.com/1069338): Write test that verifies it prompts if all
// conditions passes.
TEST_F(WebViewPasswordManagerClientTest, PromptIfAllConditionsPass) {
auto password_manager_for_ui =
std::make_unique<password_manager::MockPasswordFormManagerForUI>();
EXPECT_CALL(*password_manager_for_ui, IsBlacklisted())
.WillOnce(Return(false));
CoreAccountInfo account_info;
account_info.gaia = "1337";
sync_service_.SetAuthenticatedAccountInfo(account_info);
password_manager_util::SetAccountStorageOptIn(&pref_service_, &sync_service_,
/*opt_in=*/true);
EXPECT_TRUE(password_manager_client_->PromptUserToSaveOrUpdatePassword(
std::move(password_manager_for_ui), /*update_password=*/false));
}
} // namespace ios_web_view
......@@ -5,34 +5,30 @@
#ifndef IOS_WEB_VIEW_INTERNAL_PASSWORDS_WEB_VIEW_PASSWORD_MANAGER_DRIVER_H_
#define IOS_WEB_VIEW_INTERNAL_PASSWORDS_WEB_VIEW_PASSWORD_MANAGER_DRIVER_H_
#import <Foundation/Foundation.h>
#include <vector>
#include "base/macros.h"
#include "components/autofill/core/common/password_form_fill_data.h"
#include "components/password_manager/core/browser/password_manager.h"
#include "components/password_manager/core/browser/password_manager_driver.h"
namespace autofill {
struct PasswordFormFillData;
} // namespace autofill
namespace password_manager {
class PasswordAutofillManager;
class PasswordManager;
} // namespace password_manager
// Defines the interface the driver needs to the controller.
@protocol CWVPasswordManagerDriverDelegate
@protocol CWVPasswordManagerDriverDelegate <NSObject>
@property(readonly, nonatomic)
password_manager::PasswordManager* passwordManager;
// Returns the current URL of the main frame.
@property(readonly, nonatomic) const GURL& lastCommittedURL;
- (password_manager::PasswordManager*)passwordManager;
// Finds and fills the password form using the supplied |formData| to
// match the password form and to populate the field values.
- (void)fillPasswordForm:(const autofill::PasswordFormFillData&)formData;
// Informs delegate that there are no saved credentials for the current page.
- (void)informNoSavedCredentials;
@end
namespace ios_web_view {
......@@ -40,8 +36,7 @@ namespace ios_web_view {
class WebViewPasswordManagerDriver
: public password_manager::PasswordManagerDriver {
public:
explicit WebViewPasswordManagerDriver(
id<CWVPasswordManagerDriverDelegate> delegate);
explicit WebViewPasswordManagerDriver();
~WebViewPasswordManagerDriver() override;
// password_manager::PasswordManagerDriver implementation.
......@@ -65,6 +60,10 @@ class WebViewPasswordManagerDriver
bool CanShowAutofillUi() const override;
const GURL& GetLastCommittedURL() const override;
void set_delegate(id<CWVPasswordManagerDriverDelegate> delegate) {
delegate_ = delegate;
}
private:
__weak id<CWVPasswordManagerDriverDelegate> delegate_;
......
......@@ -17,9 +17,8 @@ using password_manager::PasswordAutofillManager;
using password_manager::PasswordManager;
namespace ios_web_view {
WebViewPasswordManagerDriver::WebViewPasswordManagerDriver(
id<CWVPasswordManagerDriverDelegate> delegate)
: delegate_(delegate) {}
WebViewPasswordManagerDriver::WebViewPasswordManagerDriver() {}
WebViewPasswordManagerDriver::~WebViewPasswordManagerDriver() = default;
......@@ -64,7 +63,7 @@ WebViewPasswordManagerDriver::GetPasswordGenerationHelper() {
}
PasswordManager* WebViewPasswordManagerDriver::GetPasswordManager() {
return [delegate_ passwordManager];
return delegate_.passwordManager;
}
PasswordAutofillManager*
......
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