diff options
Diffstat (limited to 'chromium/components/password_manager/ios')
9 files changed, 153 insertions, 163 deletions
diff --git a/chromium/components/password_manager/ios/account_select_fill_data.cc b/chromium/components/password_manager/ios/account_select_fill_data.cc index 5b0ad486c51..158bdd81ca9 100644 --- a/chromium/components/password_manager/ios/account_select_fill_data.cc +++ b/chromium/components/password_manager/ios/account_select_fill_data.cc @@ -33,7 +33,7 @@ void AccountSelectFillData::Add( auto iter_ok = forms_.insert( std::make_pair(form_data.form_renderer_id.value(), FormInfo())); FormInfo& form_info = iter_ok.first->second; - form_info.origin = form_data.origin; + form_info.origin = form_data.url; form_info.form_id = form_data.form_renderer_id; form_info.username_element_id = form_data.username_field.unique_renderer_id; form_info.password_element_id = form_data.password_field.unique_renderer_id; diff --git a/chromium/components/password_manager/ios/account_select_fill_data_unittest.cc b/chromium/components/password_manager/ios/account_select_fill_data_unittest.cc index 1e0018f25fd..92d0c38d8af 100644 --- a/chromium/components/password_manager/ios/account_select_fill_data_unittest.cc +++ b/chromium/components/password_manager/ios/account_select_fill_data_unittest.cc @@ -197,7 +197,7 @@ TEST_F(AccountSelectFillDataTest, GetFillData) { base::ASCIIToUTF16(kUsernames[1])); ASSERT_TRUE(fill_data); - EXPECT_EQ(form_data.origin, fill_data->origin); + EXPECT_EQ(form_data.url, fill_data->origin); EXPECT_EQ(form_data.form_renderer_id.value(), fill_data->form_id.value()); EXPECT_EQ(kUsernameUniqueIDs[form_i], fill_data->username_element_id.value()); diff --git a/chromium/components/password_manager/ios/js_password_manager.h b/chromium/components/password_manager/ios/js_password_manager.h index ebd5a2575d4..834d8e17143 100644 --- a/chromium/components/password_manager/ios/js_password_manager.h +++ b/chromium/components/password_manager/ios/js_password_manager.h @@ -7,7 +7,7 @@ #include "base/ios/block_types.h" #include "components/autofill/core/common/renderer_id.h" -#import "ios/web/public/deprecated/crw_js_injection_receiver.h" +#include "ios/web/public/js_messaging/web_frame.h" namespace autofill { struct PasswordFormFillData; @@ -17,13 +17,12 @@ namespace password_manager { struct FillData; -// Serializes |fillData| into a JSON string that can be used by the JS side -// of PasswordController. -NSString* SerializeFillData(const password_manager::FillData& fillData); +// Serializes |fillData| so it can be used by the JS side of PasswordController. +std::unique_ptr<base::Value> SerializeFillData( + const password_manager::FillData& fillData); -// Serializes |formData| into a JSON string that can be used by the JS side -// of PasswordController. -NSString* SerializePasswordFormFillData( +// Serializes |formData| so it can be used by the JS side of PasswordController. +std::unique_ptr<base::Value> SerializePasswordFormFillData( const autofill::PasswordFormFillData& formData); } // namespace password_manager @@ -42,8 +41,8 @@ NSString* SerializePasswordFormFillData( // For example the JSON string for a form with a single password field is: // [{"action":null,"method":null,"usernameElement":"","usernameValue":""," // passwords":[{"element":"","value":"asd"}]}] -- (void)findPasswordFormsWithCompletionHandler: - (void (^)(NSString*))completionHandler; +- (void)findPasswordFormsInFrame:(web::WebFrame*)frame + completionHandler:(void (^)(NSString*))completionHandler; // Extracts the password form with the given name from a web page. // |completionHandler| is called with the JSON string containing the info about @@ -53,6 +52,7 @@ NSString* SerializePasswordFormFillData( // {"action":null,"method":null,"usernameElement":"","usernameValue":"", // "passwords":[{"element":"","value":"asd"}]} - (void)extractForm:(autofill::FormRendererId)formIdentifier + inFrame:(web::WebFrame*)frame completionHandler:(void (^)(NSString*))completionHandler; // Fills in the password form specified by |JSONString| with the given @@ -61,30 +61,27 @@ NSString* SerializePasswordFormFillData( // |extractSubmittedFormWithCompletionHandler|. Calls |completionHandler| with // YES if the filling of the password was successful, NO otherwise. // |completionHandler| cannot be nil. -- (void)fillPasswordForm:(NSString*)JSONString +- (void)fillPasswordForm:(std::unique_ptr<base::Value>)form + inFrame:(web::WebFrame*)frame withUsername:(NSString*)username password:(NSString*)password - completionHandler:(void (^)(BOOL))completionHandler; + completionHandler:(void (^)(NSString*))completionHandler; // Fills new password field for (optional) |newPasswordIdentifier| and for // (optional) confirm password field |confirmPasswordIdentifier| in the form // identified by |formData|. Invokes |completionHandler| with true if any fields // were filled, false otherwise. - (void)fillPasswordForm:(autofill::FormRendererId)formIdentifier + inFrame:(web::WebFrame*)frame newPasswordIdentifier:(autofill::FieldRendererId)newPasswordIdentifier confirmPasswordIdentifier: (autofill::FieldRendererId)confirmPasswordIdentifier generatedPassword:(NSString*)generatedPassword - completionHandler:(void (^)(BOOL))completionHandler; + completionHandler:(void (^)(NSString*))completionHandler; // Sets up the next available unique ID value in a document. -- (void)setUpForUniqueIDsWithInitialState:(uint32_t)nextAvailableID; - -// Designated initializer. |receiver| should not be nil. -- (instancetype)initWithReceiver:(CRWJSInjectionReceiver*)receiver - NS_DESIGNATED_INITIALIZER; - -- (instancetype)init NS_UNAVAILABLE; +- (void)setUpForUniqueIDsWithInitialState:(uint32_t)nextAvailableID + inFrame:(web::WebFrame*)frame; @end diff --git a/chromium/components/password_manager/ios/js_password_manager.mm b/chromium/components/password_manager/ios/js_password_manager.mm index 7766708a674..91edfacafaa 100644 --- a/chromium/components/password_manager/ios/js_password_manager.mm +++ b/chromium/components/password_manager/ios/js_password_manager.mm @@ -5,8 +5,6 @@ #import "components/password_manager/ios/js_password_manager.h" #include "base/check.h" -#include "base/json/json_writer.h" -#include "base/json/string_escape.h" #include "base/mac/foundation_util.h" #include "base/strings/sys_string_conversions.h" #include "base/values.h" @@ -20,18 +18,20 @@ using autofill::FormRendererId; using autofill::FieldRendererId; +using base::SysNSStringToUTF8; namespace password_manager { -NSString* SerializeFillData(const GURL& origin, - FormRendererId form_renderer_id, - FieldRendererId username_element, - const base::string16& username_value, - FieldRendererId password_element, - const base::string16& password_value) { - base::DictionaryValue rootDict; - rootDict.SetString("origin", origin.spec()); - rootDict.SetInteger("unique_renderer_id", form_renderer_id.value()); +std::unique_ptr<base::Value> SerializeFillData( + const GURL& origin, + FormRendererId form_renderer_id, + FieldRendererId username_element, + const base::string16& username_value, + FieldRendererId password_element, + const base::string16& password_value) { + auto rootDict = std::make_unique<base::DictionaryValue>(); + rootDict->SetString("origin", origin.spec()); + rootDict->SetInteger("unique_renderer_id", form_renderer_id.value()); auto fieldList = std::make_unique<base::ListValue>(); @@ -47,23 +47,22 @@ NSString* SerializeFillData(const GURL& origin, passwordField->SetString("value", password_value); fieldList->Append(std::move(passwordField)); - rootDict.Set("fields", std::move(fieldList)); + rootDict->Set("fields", std::move(fieldList)); - std::string jsonString; - base::JSONWriter::Write(rootDict, &jsonString); - return base::SysUTF8ToNSString(jsonString); + return rootDict; } -NSString* SerializePasswordFormFillData( +std::unique_ptr<base::Value> SerializePasswordFormFillData( const autofill::PasswordFormFillData& formData) { - return SerializeFillData(formData.origin, formData.form_renderer_id, + return SerializeFillData(formData.url, formData.form_renderer_id, formData.username_field.unique_renderer_id, formData.username_field.value, formData.password_field.unique_renderer_id, formData.password_field.value); } -NSString* SerializeFillData(const password_manager::FillData& fillData) { +std::unique_ptr<base::Value> SerializeFillData( + const password_manager::FillData& fillData) { return SerializeFillData( fillData.origin, fillData.form_id, fillData.username_element_id, fillData.username_value, fillData.password_element_id, @@ -72,88 +71,71 @@ NSString* SerializeFillData(const password_manager::FillData& fillData) { } // namespace password_manager -namespace { -// Sanitizes |JSONString| and wraps it in quotes so it can be injected safely in -// JavaScript. -NSString* JSONEscape(NSString* JSONString) { - return base::SysUTF8ToNSString( - base::GetQuotedJSONString(base::SysNSStringToUTF8(JSONString))); -} -} // namespace - -@implementation JsPasswordManager { - // The injection receiver used to evaluate JavaScript. - __weak CRWJSInjectionReceiver* _receiver; -} +@implementation JsPasswordManager -- (instancetype)initWithReceiver:(CRWJSInjectionReceiver*)receiver { - DCHECK(receiver); - self = [super init]; - if (self) { - _receiver = receiver; - } - return self; -} - -- (void)findPasswordFormsWithCompletionHandler: - (void (^)(NSString*))completionHandler { +- (void)findPasswordFormsInFrame:(web::WebFrame*)frame + completionHandler:(void (^)(NSString*))completionHandler { DCHECK(completionHandler); - [_receiver executeJavaScript:@"__gCrWeb.passwords.findPasswordForms()" - completionHandler:^(id result, NSError*) { - completionHandler(base::mac::ObjCCastStrict<NSString>(result)); - }]; + std::vector<base::Value> parameters; + autofill::ExecuteJavaScriptFunction("passwords.findPasswordForms", parameters, + frame, base::BindOnce(completionHandler)); } - (void)extractForm:(FormRendererId)formIdentifier + inFrame:(web::WebFrame*)frame completionHandler:(void (^)(NSString*))completionHandler { DCHECK(completionHandler); - NSString* extra = [NSString - stringWithFormat:@"__gCrWeb.passwords.getPasswordFormDataAsString(%u)", - formIdentifier.value()]; - [_receiver executeJavaScript:extra - completionHandler:^(id result, NSError*) { - completionHandler(base::mac::ObjCCastStrict<NSString>(result)); - }]; + std::vector<base::Value> parameters; + parameters.push_back(base::Value(static_cast<int>(formIdentifier.value()))); + autofill::ExecuteJavaScriptFunction("passwords.getPasswordFormDataAsString", + parameters, frame, + base::BindOnce(completionHandler)); } -- (void)fillPasswordForm:(NSString*)JSONString +// TODO(crbug.com/1075444): Receive strings as std::string as they are being +// converted twice. +- (void)fillPasswordForm:(std::unique_ptr<base::Value>)form + inFrame:(web::WebFrame*)frame withUsername:(NSString*)username password:(NSString*)password - completionHandler:(void (^)(BOOL))completionHandler { + completionHandler:(void (^)(NSString*))completionHandler { DCHECK(completionHandler); - NSString* script = [NSString - stringWithFormat:@"__gCrWeb.passwords.fillPasswordForm(%@, %@, %@)", - JSONString, JSONEscape(username), JSONEscape(password)]; - [_receiver executeJavaScript:script - completionHandler:^(id result, NSError*) { - completionHandler([result isEqual:@YES]); - }]; + std::vector<base::Value> parameters; + parameters.push_back(std::move(*form)); + parameters.push_back(base::Value(SysNSStringToUTF8(username))); + parameters.push_back(base::Value(SysNSStringToUTF8(password))); + autofill::ExecuteJavaScriptFunction("passwords.fillPasswordForm", parameters, + frame, base::BindOnce(completionHandler)); } +// TODO(crbug.com/1075444): Receive strings as std::string as they are being +// converted twice. - (void)fillPasswordForm:(FormRendererId)formIdentifier + inFrame:(web::WebFrame*)frame newPasswordIdentifier:(FieldRendererId)newPasswordIdentifier confirmPasswordIdentifier:(FieldRendererId)confirmPasswordIdentifier generatedPassword:(NSString*)generatedPassword - completionHandler:(void (^)(BOOL))completionHandler { - NSString* script = [NSString - stringWithFormat:@"__gCrWeb.passwords." - @"fillPasswordFormWithGeneratedPassword(%u, %u, %u, %@)", - formIdentifier.value(), newPasswordIdentifier.value(), - confirmPasswordIdentifier.value(), - JSONEscape(generatedPassword)]; - [_receiver executeJavaScript:script - completionHandler:^(id result, NSError*) { - completionHandler([result isEqual:@YES]); - }]; + completionHandler:(void (^)(NSString*))completionHandler { + DCHECK(completionHandler); + std::vector<base::Value> parameters; + parameters.push_back(base::Value(static_cast<int>(formIdentifier.value()))); + parameters.push_back( + base::Value(static_cast<int>(newPasswordIdentifier.value()))); + parameters.push_back( + base::Value(static_cast<int>(confirmPasswordIdentifier.value()))); + parameters.push_back(base::Value(SysNSStringToUTF8(generatedPassword))); + autofill::ExecuteJavaScriptFunction( + "passwords.fillPasswordFormWithGeneratedPassword", parameters, frame, + base::BindOnce(completionHandler)); } -- (void)setUpForUniqueIDsWithInitialState:(uint32_t)nextAvailableID { - NSString* script = [NSString - stringWithFormat:@"__gCrWeb.fill.setUpForUniqueIDs(%d)", nextAvailableID]; - [_receiver executeJavaScript:script - completionHandler:^(id result, NSError*) { - [result isEqual:@YES]; - }]; +- (void)setUpForUniqueIDsWithInitialState:(uint32_t)nextAvailableID + inFrame:(web::WebFrame*)frame { + std::vector<base::Value> parameters; + parameters.push_back(base::Value(static_cast<int>(nextAvailableID))); + autofill::ExecuteJavaScriptFunction("fill.setUpForUniqueIDs", parameters, + frame, + base::OnceCallback<void(NSString*)>()); } @end diff --git a/chromium/components/password_manager/ios/password_form_helper.h b/chromium/components/password_manager/ios/password_form_helper.h index aaab8314a8d..5d5939086ea 100644 --- a/chromium/components/password_manager/ios/password_form_helper.h +++ b/chromium/components/password_manager/ios/password_form_helper.h @@ -99,7 +99,10 @@ class WebState; (void (^)(BOOL found, const autofill::FormData& form))completionHandler; -- (void)setUpForUniqueIDsWithInitialState:(uint32_t)nextAvailableID; +// Sets up the next available numeric value for setting unique renderer ids +// in |frame|. +- (void)setUpForUniqueIDsWithInitialState:(uint32_t)nextAvailableID + inFrame:(web::WebFrame*)frame; // Creates a instance with the given WebState, observer and delegate. - (instancetype)initWithWebState:(web::WebState*)webState diff --git a/chromium/components/password_manager/ios/password_form_helper.mm b/chromium/components/password_manager/ios/password_form_helper.mm index db706546abd..7a30b33d7d8 100644 --- a/chromium/components/password_manager/ios/password_form_helper.mm +++ b/chromium/components/password_manager/ios/password_form_helper.mm @@ -18,6 +18,8 @@ #include "components/password_manager/ios/account_select_fill_data.h" #include "components/password_manager/ios/js_password_manager.h" #import "ios/web/public/js_messaging/web_frame.h" +#import "ios/web/public/js_messaging/web_frame_util.h" +#import "ios/web/public/js_messaging/web_frames_manager.h" #import "ios/web/public/web_state.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -123,8 +125,7 @@ constexpr char kCommandPrefix[] = "passwordForm"; _webState->AddObserver(_webStateObserverBridge.get()); _formActivityObserverBridge = std::make_unique<autofill::FormActivityObserverBridge>(_webState, self); - _jsPasswordManager = [[JsPasswordManager alloc] - initWithReceiver:_webState->GetJSInjectionReceiver()]; + _jsPasswordManager = [[JsPasswordManager alloc] init]; __weak PasswordFormHelper* weakSelf = self; auto callback = base::BindRepeating( @@ -238,7 +239,7 @@ constexpr char kCommandPrefix[] = "passwordForm"; withUsername:(const base::string16&)username password:(const base::string16&)password completionHandler:(nullable void (^)(BOOL))completionHandler { - if (formData.origin.GetOrigin() != self.lastCommittedURL.GetOrigin()) { + if (formData.url.GetOrigin() != self.lastCommittedURL.GetOrigin()) { if (completionHandler) { completionHandler(NO); } @@ -248,11 +249,12 @@ constexpr char kCommandPrefix[] = "passwordForm"; // Send JSON over to the web view. [self.jsPasswordManager fillPasswordForm:SerializePasswordFormFillData(formData) + inFrame:GetMainFrame(_webState) withUsername:base::SysUTF16ToNSString(username) password:base::SysUTF16ToNSString(password) - completionHandler:^(BOOL result) { + completionHandler:^(NSString* result) { if (completionHandler) { - completionHandler(result); + completionHandler([result isEqual:@"true"]); } }]; } @@ -278,23 +280,24 @@ constexpr char kCommandPrefix[] = "passwordForm"; __weak PasswordFormHelper* weakSelf = self; [self.jsPasswordManager - findPasswordFormsWithCompletionHandler:^(NSString* jsonString) { - std::vector<FormData> forms; - [weakSelf getPasswordFormsFromJSON:jsonString - pageURL:pageURL - forms:&forms]; - // Find the maximum extracted value. - uint32_t maxID = 0; - for (const auto& form : forms) { - if (form.unique_renderer_id) - maxID = std::max(maxID, form.unique_renderer_id.value()); - for (const auto& field : form.fields) { - if (field.unique_renderer_id) - maxID = std::max(maxID, field.unique_renderer_id.value()); - } - } - completionHandler(forms, maxID); - }]; + findPasswordFormsInFrame:GetMainFrame(_webState) + completionHandler:^(NSString* jsonString) { + std::vector<FormData> forms; + [weakSelf getPasswordFormsFromJSON:jsonString + pageURL:pageURL + forms:&forms]; + // Find the maximum extracted value. + uint32_t maxID = 0; + for (const auto& form : forms) { + if (form.unique_renderer_id) + maxID = std::max(maxID, form.unique_renderer_id.value()); + for (const auto& field : form.fields) { + if (field.unique_renderer_id) + maxID = std::max(maxID, field.unique_renderer_id.value()); + } + } + completionHandler(forms, maxID); + }]; } - (void)fillPasswordForm:(const autofill::PasswordFormFillData&)formData @@ -320,12 +323,13 @@ constexpr char kCommandPrefix[] = "passwordForm"; completionHandler:(nullable void (^)(BOOL))completionHandler { // Send JSON over to the web view. [self.jsPasswordManager fillPasswordForm:formIdentifier + inFrame:GetMainFrame(_webState) newPasswordIdentifier:newPasswordIdentifier confirmPasswordIdentifier:confirmPasswordIdentifier generatedPassword:generatedPassword - completionHandler:^(BOOL result) { + completionHandler:^(NSString* result) { if (completionHandler) { - completionHandler(result); + completionHandler([result isEqual:@"true"]); } }]; } @@ -335,11 +339,12 @@ constexpr char kCommandPrefix[] = "passwordForm"; (nullable void (^)(BOOL))completionHandler { [self.jsPasswordManager fillPasswordForm:SerializeFillData(fillData) + inFrame:GetMainFrame(_webState) withUsername:base::SysUTF16ToNSString(fillData.username_value) password:base::SysUTF16ToNSString(fillData.password_value) - completionHandler:^(BOOL result) { + completionHandler:^(NSString* result) { if (completionHandler) { - completionHandler(result); + completionHandler([result isEqual:@"true"]); } }]; } @@ -410,11 +415,14 @@ constexpr char kCommandPrefix[] = "passwordForm"; }; [self.jsPasswordManager extractForm:formIdentifier + inFrame:GetMainFrame(_webState) completionHandler:extractFormDataCompletionHandler]; } -- (void)setUpForUniqueIDsWithInitialState:(uint32_t)nextAvailableID { - [self.jsPasswordManager setUpForUniqueIDsWithInitialState:nextAvailableID]; +- (void)setUpForUniqueIDsWithInitialState:(uint32_t)nextAvailableID + inFrame:(web::WebFrame*)frame { + [self.jsPasswordManager setUpForUniqueIDsWithInitialState:nextAvailableID + inFrame:frame]; } @end diff --git a/chromium/components/password_manager/ios/password_form_helper_unittest.mm b/chromium/components/password_manager/ios/password_form_helper_unittest.mm index ccd4d33950f..7051050a218 100644 --- a/chromium/components/password_manager/ios/password_form_helper_unittest.mm +++ b/chromium/components/password_manager/ios/password_form_helper_unittest.mm @@ -51,12 +51,6 @@ using test_helpers::SetFillData; // Mocks JsPasswordManager to simluate javascript execution failure. @interface MockJsPasswordManager : JsPasswordManager -// Designated initializer. -- (instancetype)initWithReceiver:(CRWJSInjectionReceiver*)receiver - NS_DESIGNATED_INITIALIZER; - -- (instancetype)init NS_UNAVAILABLE; - // For the first |targetFailureCount| calls to // |fillPasswordForm:withUserName:password:completionHandler:|, skips the // invocation of the real JavaScript manager, giving the effect that password @@ -70,26 +64,24 @@ using test_helpers::SetFillData; NSUInteger _fillPasswordFormFailureCountRemaining; } -- (instancetype)initWithReceiver:(CRWJSInjectionReceiver*)receiver { - return [super initWithReceiver:receiver]; -} - - (void)setFillPasswordFormTargetFailureCount:(NSUInteger)targetFailureCount { _fillPasswordFormFailureCountRemaining = targetFailureCount; } -- (void)fillPasswordForm:(NSString*)JSONString +- (void)fillPasswordForm:(std::unique_ptr<base::Value>)form + inFrame:(web::WebFrame*)frame withUsername:(NSString*)username password:(NSString*)password - completionHandler:(void (^)(BOOL))completionHandler { + completionHandler:(void (^)(NSString*))completionHandler { if (_fillPasswordFormFailureCountRemaining > 0) { --_fillPasswordFormFailureCountRemaining; if (completionHandler) { - completionHandler(NO); + completionHandler(@"false"); } return; } - [super fillPasswordForm:JSONString + [super fillPasswordForm:std::move(form) + inFrame:frame withUsername:username password:password completionHandler:completionHandler]; @@ -331,8 +323,8 @@ TEST_F(PasswordFormHelperTest, FindAndFillOnePasswordForm) { // that completion handler is called with the proper values. TEST_F(PasswordFormHelperTest, FindAndFillMultiplePasswordForms) { // Fails the first call to fill password form. - MockJsPasswordManager* mockJsPasswordManager = [[MockJsPasswordManager alloc] - initWithReceiver:web_state()->GetJSInjectionReceiver()]; + MockJsPasswordManager* mockJsPasswordManager = + [[MockJsPasswordManager alloc] init]; [mockJsPasswordManager setFillPasswordFormTargetFailureCount:1]; [helper_ setJsPasswordManager:mockJsPasswordManager]; LoadHtml( @@ -370,8 +362,8 @@ TEST_F(PasswordFormHelperTest, FindAndFillMultiplePasswordForms) { // Tests that extractPasswordFormData extracts wanted form on page with mutiple // forms. TEST_F(PasswordFormHelperTest, ExtractPasswordFormData) { - MockJsPasswordManager* mockJsPasswordManager = [[MockJsPasswordManager alloc] - initWithReceiver:web_state()->GetJSInjectionReceiver()]; + MockJsPasswordManager* mockJsPasswordManager = + [[MockJsPasswordManager alloc] init]; [helper_ setJsPasswordManager:mockJsPasswordManager]; LoadHtml(@"<form><input id='u1' type='text' name='un1'>" "<input id='p1' type='password' name='pw1'></form>" diff --git a/chromium/components/password_manager/ios/resources/password_controller.js b/chromium/components/password_manager/ios/resources/password_controller.js index 55a75c9c671..6343a3c7381 100644 --- a/chromium/components/password_manager/ios/resources/password_controller.js +++ b/chromium/components/password_manager/ios/resources/password_controller.js @@ -112,7 +112,7 @@ const addSubmitButtonTouchEndHandler = function(form) { */ const onSubmitButtonTouchEnd = function(evt) { const form = evt.currentTarget.form; - const formData = __gCrWeb.passwords.getPasswordFormData(form); + const formData = __gCrWeb.passwords.getPasswordFormData(form, window); if (!formData) { return; } @@ -128,7 +128,7 @@ const onSubmitButtonTouchEnd = function(evt) { * @return {HTMLInputElement} */ const findInputByUniqueFieldId = function(inputs, identifier) { - const uniqueID = Symbol.for('__gChrome~uniqueID'); + const uniqueID = Symbol.for(__gCrWeb.fill.UNIQUE_ID_SYMBOL_NAME); for (let i = 0; i < inputs.length; ++i) { if (identifier === inputs[i][uniqueID]) { return inputs[i]; @@ -181,7 +181,7 @@ __gCrWeb.passwords['getPasswordFormDataAsString'] = function(identifier) { if (!el) { return '{}'; } - const formData = __gCrWeb.passwords.getPasswordFormData(el); + const formData = __gCrWeb.passwords.getPasswordFormData(el, window); if (!formData) { return '{}'; } @@ -198,7 +198,10 @@ __gCrWeb.passwords['getPasswordFormDataAsString'] = function(identifier) { * @param {AutofillFormData} formData Form data. * @param {string} username The username to fill. * @param {string} password The password to fill. - * @return {boolean} Whether a form field has been filled. + * @return {string} Whether a form field has been filled. + * + * TODO(crbug.com/1075444): Rewrite callback handler to accept various + * return types and return boolean. */ __gCrWeb.passwords['fillPasswordForm'] = function( formData, username, password) { @@ -206,9 +209,10 @@ __gCrWeb.passwords['fillPasswordForm'] = function( __gCrWeb.common.removeQueryAndReferenceFromURL(window.location.href); const origin = /** @type {string} */ (formData['origin']); if (!__gCrWeb.common.isSameOrigin(origin, normalizedOrigin)) { - return false; + return 'false'; } - return fillPasswordFormWithData(formData, username, password, window); + return fillPasswordFormWithData(formData, username, password, window) + .toString(); }; /** @@ -220,20 +224,23 @@ __gCrWeb.passwords['fillPasswordForm'] = function( * @param {number} confirmPasswordIdentifier The id of confirm password element * to fill. * @param {string} password The password to fill. - * @return {boolean} Whether new password field has been filled. + * @return {string} Whether new password field has been filled. + * + * TODO(crbug.com/1075444): Rewrite callback handler to accept various + * return types and return boolean. */ __gCrWeb.passwords['fillPasswordFormWithGeneratedPassword'] = function( formIdentifier, newPasswordIdentifier, confirmPasswordIdentifier, password) { const form = __gCrWeb.form.getFormElementFromUniqueFormId(formIdentifier); if (!form) { - return false; + return 'false'; } const inputs = getFormInputElements(form); const newPasswordField = findInputByUniqueFieldId(inputs, newPasswordIdentifier); if (!newPasswordField) { - return false; + return 'false'; } // Avoid resetting if same value, as it moves cursor to the end. if (newPasswordField.value !== password) { @@ -244,7 +251,7 @@ __gCrWeb.passwords['fillPasswordFormWithGeneratedPassword'] = function( if (confirmPasswordField && confirmPasswordField.value !== password) { __gCrWeb.fill.setInputElementValue(password, confirmPasswordField); } - return true; + return 'true'; }; /** @@ -341,7 +348,7 @@ const getPasswordFormDataList = function(formDataList, win) { const doc = win.document; const forms = doc.forms; for (let i = 0; i < forms.length; i++) { - const formData = __gCrWeb.passwords.getPasswordFormData(forms[i]); + const formData = __gCrWeb.passwords.getPasswordFormData(forms[i], win); if (formData) { formDataList.push(formData); addSubmitButtonTouchEndHandler(forms[i]); @@ -384,13 +391,14 @@ function getPasswordFormDataFromUnownedElements_(formDataList, window) { /** * Returns a JS object containing the data from |formElement|. * @param {HTMLFormElement} formElement An HTML Form element. + * @param {Window} win A window or a frame containing formData. * @return {Object} Object of data from formElement. */ -__gCrWeb.passwords.getPasswordFormData = function(formElement) { +__gCrWeb.passwords.getPasswordFormData = function(formElement, win) { const extractMask = __gCrWeb.fill.EXTRACT_MASK_VALUE; const formData = {}; const ok = __gCrWeb.fill.webFormElementToFormData( - window, formElement, null /* formControlElement */, extractMask, formData, + win, formElement, null /* formControlElement */, extractMask, formData, null /* field */); return ok ? formData : null; }; diff --git a/chromium/components/password_manager/ios/test_helpers.cc b/chromium/components/password_manager/ios/test_helpers.cc index 103d97451bd..b8e06bb2e0b 100644 --- a/chromium/components/password_manager/ios/test_helpers.cc +++ b/chromium/components/password_manager/ios/test_helpers.cc @@ -16,7 +16,7 @@ using password_manager::FillData; namespace test_helpers { -void SetPasswordFormFillData(const std::string& origin, +void SetPasswordFormFillData(const std::string& url, const char* form_name, uint32_t unique_renderer_id, const char* username_field, @@ -29,7 +29,7 @@ void SetPasswordFormFillData(const std::string& origin, const char* additional_password, bool wait_for_username, PasswordFormFillData* form_data) { - form_data->origin = GURL(origin); + form_data->url = GURL(url); form_data->name = base::UTF8ToUTF16(form_name); form_data->form_renderer_id = FormRendererId(unique_renderer_id); autofill::FormFieldData username; |