Commit 6f92ed83 authored by Frank Liberato's avatar Frank Liberato Committed by Commit Bot

Revert "[iOS][MF] Secure filling"

This reverts commit 555dcba9.

Reason for revert: probably the cause of compile failures (e.g. https://ci.chromium.org/p/chromium/builders/luci.chromium.ci/ios-uirefresh-simulator/3246 )

Original change's description:
> [iOS][MF] Secure filling
> 
> Observe the last focused field to validate it is secure before filling a password
> 
> Bug: 878388
> Cq-Include-Trybots: luci.chromium.try:ios-simulator-cronet;luci.chromium.try:ios-simulator-full-configs
> Change-Id: Ide4407ea51b315c68c50fa010f256cde93f5eb26
> Reviewed-on: https://chromium-review.googlesource.com/1221217
> Commit-Queue: Javier Ernesto Flores Robles <javierrobles@chromium.org>
> Reviewed-by: Moe Ahmadi <mahmadi@chromium.org>
> Reviewed-by: Gauthier Ambard <gambard@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#593194}

TBR=mahmadi@chromium.org,gambard@chromium.org,javierrobles@chromium.org

Change-Id: Ie272d2622baeda172a802feaf552b1771e436bc5
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: 878388
Cq-Include-Trybots: luci.chromium.try:ios-simulator-cronet;luci.chromium.try:ios-simulator-full-configs
Reviewed-on: https://chromium-review.googlesource.com/1238822Reviewed-by: default avatarFrank Liberato <liberato@chromium.org>
Commit-Queue: Frank Liberato <liberato@chromium.org>
Cr-Commit-Position: refs/heads/master@{#593212}
parent 701e5734
...@@ -9,7 +9,6 @@ ...@@ -9,7 +9,6 @@
#import "ios/chrome/browser/autofill/form_input_accessory_view_controller.h" #import "ios/chrome/browser/autofill/form_input_accessory_view_controller.h"
#import "ios/chrome/browser/ui/autofill/form_input_accessory_mediator.h" #import "ios/chrome/browser/ui/autofill/form_input_accessory_mediator.h"
#import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_accessory_view_controller.h" #import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_accessory_view_controller.h"
#import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_injection_handler.h"
#import "ios/chrome/browser/ui/autofill/manual_fill/password_coordinator.h" #import "ios/chrome/browser/ui/autofill/manual_fill/password_coordinator.h"
#if !defined(__has_feature) || !__has_feature(objc_arc) #if !defined(__has_feature) || !__has_feature(objc_arc)
...@@ -31,11 +30,6 @@ ...@@ -31,11 +30,6 @@
@property(nonatomic, strong) @property(nonatomic, strong)
ManualFillAccessoryViewController* manualFillAccessoryViewController; ManualFillAccessoryViewController* manualFillAccessoryViewController;
// The object in charge of interacting with the web view. Used to fill the data
// in the forms.
@property(nonatomic, strong)
ManualFillInjectionHandler* manualFillInjectionHandler;
// The WebStateList for this instance. Used to instantiate the child // The WebStateList for this instance. Used to instantiate the child
// coordinators lazily. // coordinators lazily.
@property(nonatomic, assign) WebStateList* webStateList; @property(nonatomic, assign) WebStateList* webStateList;
...@@ -50,7 +44,6 @@ ...@@ -50,7 +44,6 @@
@synthesize manualFillAccessoryViewController = @synthesize manualFillAccessoryViewController =
_manualFillAccessoryViewController; _manualFillAccessoryViewController;
@synthesize webStateList = _webStateList; @synthesize webStateList = _webStateList;
@synthesize manualFillInjectionHandler = _manualFillInjectionHandler;
- (instancetype)initWithBaseViewController:(UIViewController*)viewController - (instancetype)initWithBaseViewController:(UIViewController*)viewController
browserState: browserState:
...@@ -63,9 +56,6 @@ ...@@ -63,9 +56,6 @@
if (self) { if (self) {
_webStateList = webStateList; _webStateList = webStateList;
_manualFillInjectionHandler =
[[ManualFillInjectionHandler alloc] initWithWebStateList:webStateList];
_formInputAccessoryViewController = _formInputAccessoryViewController =
[[FormInputAccessoryViewController alloc] init]; [[FormInputAccessoryViewController alloc] init];
...@@ -101,8 +91,7 @@ ...@@ -101,8 +91,7 @@
[[ManualFillPasswordCoordinator alloc] [[ManualFillPasswordCoordinator alloc]
initWithBaseViewController:self.baseViewController initWithBaseViewController:self.baseViewController
browserState:self.browserState browserState:self.browserState
webStateList:self.webStateList webStateList:self.webStateList];
injectionHandler:self.manualFillInjectionHandler];
[self.formInputAccessoryViewController [self.formInputAccessoryViewController
presentView:passwordCoordinator.viewController.view]; presentView:passwordCoordinator.viewController.view];
[self.childCoordinators addObject:passwordCoordinator]; [self.childCoordinators addObject:passwordCoordinator];
......
...@@ -8,8 +8,6 @@ source_set("manual_fill") { ...@@ -8,8 +8,6 @@ source_set("manual_fill") {
sources = [ sources = [
"credential_password_form.h", "credential_password_form.h",
"credential_password_form.mm", "credential_password_form.mm",
"form_observer_helper.h",
"form_observer_helper.mm",
"manual_fill_injection_handler.h", "manual_fill_injection_handler.h",
"manual_fill_injection_handler.mm", "manual_fill_injection_handler.mm",
"password_coordinator.h", "password_coordinator.h",
...@@ -21,7 +19,6 @@ source_set("manual_fill") { ...@@ -21,7 +19,6 @@ source_set("manual_fill") {
"//base", "//base",
"//components/autofill/core/common", "//components/autofill/core/common",
"//components/autofill/ios/browser", "//components/autofill/ios/browser",
"//components/autofill/ios/form_util",
"//components/keyed_service/core:core", "//components/keyed_service/core:core",
"//components/password_manager/core/browser", "//components/password_manager/core/browser",
"//ios/chrome/app/strings:ios_strings_grit", "//ios/chrome/app/strings:ios_strings_grit",
...@@ -86,20 +83,13 @@ source_set("unit_tests") { ...@@ -86,20 +83,13 @@ source_set("unit_tests") {
sources = [ sources = [
"credential_password_form_unittest.mm", "credential_password_form_unittest.mm",
"credential_unittest.mm", "credential_unittest.mm",
"form_observer_helper_unittest.mm",
] ]
deps = [ deps = [
":manual_fill", ":manual_fill",
":manual_fill_ui", ":manual_fill_ui",
"//base:base", "//base:base",
"//components/autofill/core/common:common", "//components/autofill/core/common:common",
"//components/autofill/ios/form_util:form_util",
"//components/autofill/ios/form_util:test_support",
"//ios/chrome/browser/web_state_list:test_support",
"//ios/chrome/browser/web_state_list:web_state_list",
"//ios/web/public/test/fakes:fakes",
"//testing/gtest:gtest", "//testing/gtest:gtest",
"//third_party/ocmock:ocmock",
"//url:url", "//url:url",
] ]
} }
// Copyright 2018 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 IOS_CHROME_BROWSER_UI_AUTOFILL_MANUAL_FILL_FORM_OBSERVER_HELPER_H_
#define IOS_CHROME_BROWSER_UI_AUTOFILL_MANUAL_FILL_FORM_OBSERVER_HELPER_H_
#import <Foundation/Foundation.h>
@protocol FormActivityObserver;
class WebStateList;
// Convenience object to observe updates in forms. It abstracts all the logic
// to observe a web state list and its web states.
@interface FormObserverHelper : NSObject
// The delegate interested in the form activity.
@property(nonatomic, weak) id<FormActivityObserver> delegate;
// Returns a fresh object observing the active web state for the passed list.
- (instancetype)initWithWebStateList:(WebStateList*)webStateList;
// Not available. Use |initWithWebStateList:|.
- (instancetype)init NS_UNAVAILABLE;
@end
#endif // IOS_CHROME_BROWSER_UI_AUTOFILL_MANUAL_FILL_FORM_OBSERVER_HELPER_H_
// Copyright 2018 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.
#import "ios/chrome/browser/ui/autofill/manual_fill/form_observer_helper.h"
#import "components/autofill/ios/form_util/form_activity_observer_bridge.h"
#import "ios/chrome/browser/web_state_list/web_state_list.h"
#import "ios/chrome/browser/web_state_list/web_state_list_observer_bridge.h"
#include "ios/web/public/web_state/web_state.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
@interface FormObserverHelper ()<FormActivityObserver, WebStateListObserving>
// The WebStateList this instance is observing in order to update the
// active WebState.
@property(nonatomic, assign) WebStateList* webStateList;
// The WebState this instance is observing. Can be nullptr.
@property(nonatomic, assign) web::WebState* webState;
@end
@implementation FormObserverHelper {
// Bridge to observe the web state list from Objective-C.
std::unique_ptr<WebStateListObserverBridge> _webStateListObserver;
// Bridge to observe form activity in |_webState|.
std::unique_ptr<autofill::FormActivityObserverBridge>
_formActivityObserverBridge;
}
@synthesize delegate = _delegate;
- (instancetype)initWithWebStateList:(WebStateList*)webStateList {
DCHECK(webStateList);
self = [super init];
if (self) {
_webStateList = webStateList;
_webStateListObserver = std::make_unique<WebStateListObserverBridge>(self);
_webStateList->AddObserver(_webStateListObserver.get());
web::WebState* webState = webStateList->GetActiveWebState();
if (webState) {
_webState = webState;
_formActivityObserverBridge =
std::make_unique<autofill::FormActivityObserverBridge>(_webState,
self);
}
}
return self;
}
- (void)dealloc {
if (_webState) {
_formActivityObserverBridge.reset();
_webState = nullptr;
}
if (_webStateList) {
_webStateList->RemoveObserver(_webStateListObserver.get());
_webStateListObserver.reset();
_webStateList = nullptr;
}
_formActivityObserverBridge.reset();
}
#pragma mark - FormActivityObserver
- (void)webState:(web::WebState*)webState
didRegisterFormActivity:(const autofill::FormActivityParams&)params
inFrame:(web::WebFrame*)frame {
if ([self.delegate respondsToSelector:@selector
(webState:didRegisterFormActivity:inFrame:)]) {
[self.delegate webState:webState
didRegisterFormActivity:params
inFrame:frame];
}
}
- (void)webState:(web::WebState*)webState
didSubmitDocumentWithFormNamed:(const std::string&)formName
hasUserGesture:(BOOL)hasUserGesture
formInMainFrame:(BOOL)formInMainFrame
inFrame:(web::WebFrame*)frame {
if ([self.delegate respondsToSelector:@selector
(webState:didSubmitDocumentWithFormNamed:hasUserGesture
:formInMainFrame:inFrame:)]) {
[self.delegate webState:webState
didSubmitDocumentWithFormNamed:formName
hasUserGesture:hasUserGesture
formInMainFrame:formInMainFrame
inFrame:frame];
}
}
#pragma mark - CRWWebStateListObserver
- (void)webStateList:(WebStateList*)webStateList
didChangeActiveWebState:(web::WebState*)newWebState
oldWebState:(web::WebState*)oldWebState
atIndex:(int)atIndex
reason:(int)reason {
self.webState = newWebState;
}
#pragma mark - Setters
// Sets the new web state and detaches from the previous web state.
- (void)setWebState:(web::WebState*)webState {
if (_webState) {
_formActivityObserverBridge.reset();
}
_webState = webState;
if (_webState) {
_formActivityObserverBridge =
std::make_unique<autofill::FormActivityObserverBridge>(_webState, self);
}
}
@end
// Copyright 2018 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.
#import "ios/chrome/browser/ui/autofill/manual_fill/form_observer_helper.h"
#import "components/autofill/ios/form_util/form_activity_observer_bridge.h"
#include "components/autofill/ios/form_util/form_activity_params.h"
#include "components/autofill/ios/form_util/test_form_activity_tab_helper.h"
#import "ios/chrome/browser/web_state_list/fake_web_state_list_delegate.h"
#import "ios/chrome/browser/web_state_list/web_state_list.h"
#import "ios/chrome/browser/web_state_list/web_state_opener.h"
#import "ios/web/public/test/fakes/test_web_state.h"
#include "testing/platform_test.h"
#import "third_party/ocmock/OCMock/OCMock.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
class ManualFillFormObserverHelperiOSTest : public PlatformTest {
public:
ManualFillFormObserverHelperiOSTest()
: web_state_list_(&web_state_list_delegate_) {}
~ManualFillFormObserverHelperiOSTest() override {}
void SetUp() override {
PlatformTest::SetUp();
_helper =
[[FormObserverHelper alloc] initWithWebStateList:&web_state_list_];
_mockDelegate = OCMProtocolMock(@protocol(FormActivityObserver));
_helper.delegate = _mockDelegate;
}
void TearDown() override {
_helper = nil;
_mockDelegate = nil;
PlatformTest::TearDown();
}
protected:
FakeWebStateListDelegate web_state_list_delegate_;
WebStateList web_state_list_;
FormObserverHelper* _helper;
OCMockObject<FormActivityObserver>* _mockDelegate;
std::unique_ptr<web::TestWebState> CreateWebState(const char* url) {
auto test_web_state = std::make_unique<web::TestWebState>();
test_web_state->SetCurrentURL(GURL(url));
return test_web_state;
}
void AppendNewWebState(const char* url) {
AppendNewWebState(url, WebStateOpener());
}
void AppendNewWebState(const char* url, WebStateOpener opener) {
web_state_list_.InsertWebState(WebStateList::kInvalidIndex,
CreateWebState(url),
WebStateList::INSERT_NO_FLAGS, opener);
}
private:
DISALLOW_COPY_AND_ASSIGN(ManualFillFormObserverHelperiOSTest);
};
// Tests that an observer is correctly created and set up.
TEST_F(ManualFillFormObserverHelperiOSTest, Creation) {}
// Test that the observer delegates one active web state callbacks.
TEST_F(ManualFillFormObserverHelperiOSTest, ObservesWebState) {
AppendNewWebState("https://example.com");
web_state_list_.ActivateWebStateAt(0);
autofill::FormActivityParams params;
params.form_name = "form";
params.field_name = "field";
params.field_identifier = "field_id";
params.field_type = "text";
params.type = "blur";
params.value = "value";
params.input_missing = false;
OCMExpect([_mockDelegate
webState:static_cast<web::WebState*>([OCMArg anyPointer])
didRegisterFormActivity:params
inFrame:static_cast<web::WebFrame*>(
[OCMArg anyPointer])]);
autofill::TestFormActivityTabHelper test_form_activity_tab_helper(
web_state_list_.GetActiveWebState());
test_form_activity_tab_helper.FormActivityRegistered(nullptr, params);
@try {
[_mockDelegate verify];
} @catch (NSException* exception) {
ADD_FAILURE();
}
}
// Test that the observer delegates the callbacks with multiple active web
// state.
TEST_F(ManualFillFormObserverHelperiOSTest, ObservesMultipleWebStates) {
AppendNewWebState("https://example.com");
AppendNewWebState("https://chrome.com");
autofill::TestFormActivityTabHelper test_form_activity_tab_helper0(
web_state_list_.GetWebStateAt(0));
autofill::TestFormActivityTabHelper test_form_activity_tab_helper1(
web_state_list_.GetWebStateAt(1));
web_state_list_.ActivateWebStateAt(0);
autofill::FormActivityParams params;
params.form_name = "form";
params.field_name = "field";
params.field_identifier = "field_id";
params.field_type = "text";
params.type = "focus";
params.value = "value";
params.input_missing = false;
@try {
OCMExpect([_mockDelegate
webState:static_cast<web::WebState*>([OCMArg anyPointer])
didRegisterFormActivity:params
inFrame:static_cast<web::WebFrame*>(
[OCMArg anyPointer])]);
test_form_activity_tab_helper0.FormActivityRegistered(nullptr, params);
[_mockDelegate verify];
web_state_list_.ActivateWebStateAt(1);
OCMExpect([_mockDelegate
webState:static_cast<web::WebState*>([OCMArg anyPointer])
didRegisterFormActivity:params
inFrame:static_cast<web::WebFrame*>(
[OCMArg anyPointer])]);
test_form_activity_tab_helper1.FormActivityRegistered(nullptr, params);
[_mockDelegate verify];
web_state_list_.ActivateWebStateAt(0);
OCMExpect([_mockDelegate
webState:static_cast<web::WebState*>([OCMArg anyPointer])
didRegisterFormActivity:params
inFrame:static_cast<web::WebFrame*>(
[OCMArg anyPointer])]);
test_form_activity_tab_helper0.FormActivityRegistered(nullptr, params);
[_mockDelegate verify];
} @catch (NSException* exception) {
ADD_FAILURE();
}
}
...@@ -6,75 +6,47 @@ ...@@ -6,75 +6,47 @@
#include "base/mac/foundation_util.h" #include "base/mac/foundation_util.h"
#import "components/autofill/ios/browser/js_suggestion_manager.h" #import "components/autofill/ios/browser/js_suggestion_manager.h"
#import "components/autofill/ios/form_util/form_activity_observer_bridge.h"
#include "components/autofill/ios/form_util/form_activity_params.h"
#import "ios/chrome/browser/autofill/form_input_accessory_view_handler.h" #import "ios/chrome/browser/autofill/form_input_accessory_view_handler.h"
#import "ios/chrome/browser/ui/autofill/manual_fill/form_observer_helper.h"
#import "ios/chrome/browser/web_state_list/web_state_list.h" #import "ios/chrome/browser/web_state_list/web_state_list.h"
#import "ios/web/public/web_state/js/crw_js_injection_receiver.h" #import "ios/web/public/web_state/js/crw_js_injection_receiver.h"
#include "ios/web/public/web_state/web_state.h" #include "ios/web/public/web_state/web_state.h"
#include "url/gurl.h"
#if !defined(__has_feature) || !__has_feature(objc_arc) #if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support." #error "This file requires ARC support."
#endif #endif
@interface ManualFillInjectionHandler ()<FormActivityObserver> @interface ManualFillInjectionHandler ()
// The object in charge of listening to form events and reporting back. // The WebStateList with the relevant active web state for the injection.
@property(nonatomic, strong) FormObserverHelper* formHelper; @property(nonatomic, assign) WebStateList* webStateList;
// Convenience getter for the current injection reciever. // Convenience getter for the current injection reciever.
@property(nonatomic, readonly) CRWJSInjectionReceiver* injectionReceiver; @property(nonatomic, readonly) CRWJSInjectionReceiver* injectionReceiver;
// Convenience getter for the current suggestion manager. // Convenience getter for the current suggestion manager.
@property(nonatomic, readonly) JsSuggestionManager* suggestionManager; @property(nonatomic, readonly) JsSuggestionManager* suggestionManager;
// The WebStateList with the relevant active web state for the injection.
@property(nonatomic, assign) WebStateList* webStateList;
// YES if the last focused element is secure within its web frame. To be secure
// means it has a password type, the web is https and the URL can trusted.
@property(nonatomic, assign) BOOL lastActiveElementIsSecure;
@end @end
@implementation ManualFillInjectionHandler @implementation ManualFillInjectionHandler
@synthesize formHelper = _formHelper;
@synthesize lastActiveElementIsSecure = _lastActiveElementIsSecure;
@synthesize webStateList = _webStateList; @synthesize webStateList = _webStateList;
- (instancetype)initWithWebStateList:(WebStateList*)webStateList { - (instancetype)initWithWebStateList:(WebStateList*)webStateList {
self = [super init]; self = [super init];
if (self) { if (self) {
_webStateList = webStateList; _webStateList = webStateList;
_formHelper =
[[FormObserverHelper alloc] initWithWebStateList:webStateList];
_formHelper.delegate = self;
} }
return self; return self;
} }
#pragma mark - ManualFillViewDelegate #pragma mark - ManualFillViewDelegate
- (void)userDidPickContent:(NSString*)content isSecure:(BOOL)isSecure { - (void)userDidPickContent:(NSString*)content isSecure:(BOOL)isSecure {
if (isSecure && !self.lastActiveElementIsSecure) { if (isSecure) {
// TODO:(https://crbug.com/878388) implement secure manual fill for
// passwords.
return; return;
} }
[self fillLastSelectedFieldWithString:content]; [self fillLastSelectedFieldWithString:content];
} }
#pragma mark - FormActivityObserver
- (void)webState:(web::WebState*)webState
didRegisterFormActivity:(const autofill::FormActivityParams&)params
inFrame:(web::WebFrame*)frame {
if (params.type != "focus") {
return;
}
web::URLVerificationTrustLevel trustLevel;
const GURL pageURL(webState->GetCurrentURL(&trustLevel));
self.lastActiveElementIsSecure = YES;
if (trustLevel != web::URLVerificationTrustLevel::kAbsolute ||
!pageURL.SchemeIs(url::kHttpsScheme) || !webState->ContentIsHTML() ||
params.field_type != "password") {
self.lastActiveElementIsSecure = NO;
}
}
#pragma mark - Getters #pragma mark - Getters
- (CRWJSInjectionReceiver*)injectionReceiver { - (CRWJSInjectionReceiver*)injectionReceiver {
......
...@@ -7,7 +7,6 @@ ...@@ -7,7 +7,6 @@
#import "ios/chrome/browser/ui/coordinators/chrome_coordinator.h" #import "ios/chrome/browser/ui/coordinators/chrome_coordinator.h"
@class ManualFillInjectionHandler;
class WebStateList; class WebStateList;
// Creates and manages a view controller to present passwords to the user. // Creates and manages a view controller to present passwords to the user.
...@@ -18,13 +17,12 @@ class WebStateList; ...@@ -18,13 +17,12 @@ class WebStateList;
// The view controller of this coordinator. // The view controller of this coordinator.
@property(nonatomic, readonly) UIViewController* viewController; @property(nonatomic, readonly) UIViewController* viewController;
// Creates a coordinator that uses a |viewController|, |browserState|, // Creates a coordinator that uses a |viewController| a |browserState| and
// |webStateList| and an |injectionHandler|. // a |webStateList|.
- (instancetype) - (instancetype)initWithBaseViewController:(UIViewController*)viewController
initWithBaseViewController:(UIViewController*)viewController browserState:
browserState:(ios::ChromeBrowserState*)browserState (ios::ChromeBrowserState*)browserState
webStateList:(WebStateList*)webStateList webStateList:(WebStateList*)webStateList;
injectionHandler:(ManualFillInjectionHandler*)injectionHandler;
// Unavailable, use -initWithBaseViewController:browserState:webStateList:. // Unavailable, use -initWithBaseViewController:browserState:webStateList:.
- (instancetype)initWithBaseViewController:(UIViewController*)viewController - (instancetype)initWithBaseViewController:(UIViewController*)viewController
......
...@@ -39,22 +39,22 @@ ...@@ -39,22 +39,22 @@
@implementation ManualFillPasswordCoordinator @implementation ManualFillPasswordCoordinator
@synthesize allPasswordsViewController = _allPasswordsViewController; @synthesize allPasswordsViewController = _allPasswordsViewController;
@synthesize manualFillInjectionHandler = _manualFillInjectionHandler;
@synthesize passwordMediator = _passwordMediator; @synthesize passwordMediator = _passwordMediator;
@synthesize passwordViewController = _passwordViewController; @synthesize passwordViewController = _passwordViewController;
@synthesize manualFillInjectionHandler = _manualFillInjectionHandler;
- (instancetype) - (instancetype)initWithBaseViewController:(UIViewController*)viewController
initWithBaseViewController:(UIViewController*)viewController browserState:
browserState:(ios::ChromeBrowserState*)browserState (ios::ChromeBrowserState*)browserState
webStateList:(WebStateList*)webStateList webStateList:(WebStateList*)webStateList {
injectionHandler:(ManualFillInjectionHandler*)injectionHandler {
self = [super initWithBaseViewController:viewController self = [super initWithBaseViewController:viewController
browserState:browserState]; browserState:browserState];
if (self) { if (self) {
_passwordViewController = _passwordViewController =
[[PasswordViewController alloc] initWithSearchController:nil]; [[PasswordViewController alloc] initWithSearchController:nil];
_manualFillInjectionHandler = injectionHandler; _manualFillInjectionHandler =
[[ManualFillInjectionHandler alloc] initWithWebStateList:webStateList];
auto passwordStore = IOSChromePasswordStoreFactory::GetForBrowserState( auto passwordStore = IOSChromePasswordStoreFactory::GetForBrowserState(
browserState, ServiceAccessType::EXPLICIT_ACCESS); browserState, ServiceAccessType::EXPLICIT_ACCESS);
......
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