summaryrefslogtreecommitdiff
path: root/chromium/components/password_manager/ios
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/components/password_manager/ios')
-rw-r--r--chromium/components/password_manager/ios/account_select_fill_data.cc2
-rw-r--r--chromium/components/password_manager/ios/account_select_fill_data_unittest.cc2
-rw-r--r--chromium/components/password_manager/ios/js_password_manager.h35
-rw-r--r--chromium/components/password_manager/ios/js_password_manager.mm142
-rw-r--r--chromium/components/password_manager/ios/password_form_helper.h5
-rw-r--r--chromium/components/password_manager/ios/password_form_helper.mm64
-rw-r--r--chromium/components/password_manager/ios/password_form_helper_unittest.mm28
-rw-r--r--chromium/components/password_manager/ios/resources/password_controller.js34
-rw-r--r--chromium/components/password_manager/ios/test_helpers.cc4
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;