Commit e82fd2ad authored by Maria Kazinova's avatar Maria Kazinova Committed by Commit Bot

[iOS] Saving passwords outside the form tag on provisional save.

Stopped ignoring forms that do not have a <form> tag in provisional
password save infrastructure. This allows submission detection on
navigating the main frame and iframe detachment to work for such forms.

Change-Id: I0ddf885532045ce52d05c0d2c508bafa96b55ed9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2414235
Commit-Queue: Maria Kazinova <kazinova@google.com>
Reviewed-by: default avatarVasilii Sukhanov <vasilii@chromium.org>
Cr-Commit-Position: refs/heads/master@{#808431}
parent 827cb575
......@@ -532,8 +532,15 @@ bool PasswordFormManager::UpdateStateOnUserInput(
FormRendererId form_id,
FieldRendererId field_id,
const base::string16& field_value) {
if (observed_form()->unique_renderer_id != form_id)
if (form_id) {
if (!observed_form()->is_form_tag ||
(observed_form()->is_form_tag &&
observed_form()->unique_renderer_id != form_id)) {
return false;
}
} else if (observed_form()->is_form_tag) {
return false;
}
bool form_data_changed = false;
for (FormFieldData& field : mutable_observed_form()->fields) {
......
......@@ -2340,3 +2340,45 @@ TEST_F(PasswordControllerTest, PasswordGenerationFieldClear) {
ASSERT_FALSE(
passwordController_.sharedPasswordController.isPasswordGenerated);
}
TEST_F(PasswordControllerTest, SavingPasswordsOutsideTheFormTag) {
NSString* kHtml = @"<html><body>"
"<input type='text' name='username'>"
"<input type='password' name='pw'>"
"</body></html>";
ON_CALL(*store_, GetLogins)
.WillByDefault(WithArg<1>(InvokeEmptyConsumerWithForms()));
LoadHtml(kHtml);
WaitForFormManagersCreation();
std::string main_frame_id = web::GetMainWebFrameId(web_state());
SimulateUserTyping("", FormRendererId(), "username", FieldRendererId(0),
"user1", main_frame_id);
SimulateUserTyping("", FormRendererId(), "pw", FieldRendererId(1),
"password1", main_frame_id);
__block std::unique_ptr<PasswordFormManagerForUI> form_manager;
EXPECT_CALL(*weak_client_, PromptUserToSaveOrUpdatePasswordPtr)
.WillOnce(WithArg<0>(SaveToScopedPtr(&form_manager)));
// Simulate a renderer initiated navigation.
web::FakeNavigationContext context;
context.SetHasCommitted(true);
context.SetIsRendererInitiated(true);
[passwordController_.sharedPasswordController webState:web_state()
didFinishNavigation:&context];
// Simulate a successful submission by loading the landing page without
// a form.
LoadHtml(@"<html><body>Login success page</body></html>");
ASSERT_TRUE(WaitUntilConditionOrTimeout(kWaitForActionTimeout, ^bool() {
return form_manager != nullptr;
}));
EXPECT_EQ(ASCIIToUTF16("user1"),
form_manager->GetPendingCredentials().username_value);
EXPECT_EQ(ASCIIToUTF16("password1"),
form_manager->GetPendingCredentials().password_value);
}
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