OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <string.h> | 5 #include <string.h> |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "base/macros.h" | 9 #include "base/macros.h" |
10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 const char kNewPasswordAutocompleteAttributeFormHTML[] = | 243 const char kNewPasswordAutocompleteAttributeFormHTML[] = |
244 "<FORM name = 'blah' action = 'http://www.random.com/'> " | 244 "<FORM name = 'blah' action = 'http://www.random.com/'> " |
245 " <INPUT type = 'text' id = 'username'/> " | 245 " <INPUT type = 'text' id = 'username'/> " |
246 " <INPUT type = 'password' id = 'first_password' " | 246 " <INPUT type = 'password' id = 'first_password' " |
247 " autocomplete='new-password' size = 5/>" | 247 " autocomplete='new-password' size = 5/>" |
248 " <INPUT type = 'password' id = 'second_password' size = 5/> " | 248 " <INPUT type = 'password' id = 'second_password' size = 5/> " |
249 " <INPUT type = 'button' id = 'dummy'/> " | 249 " <INPUT type = 'button' id = 'dummy'/> " |
250 " <INPUT type = 'submit' value = 'LOGIN' />" | 250 " <INPUT type = 'submit' value = 'LOGIN' />" |
251 "</FORM>"; | 251 "</FORM>"; |
252 | 252 |
253 const char ChangeDetectionScript[] = | |
254 "<script>" | |
255 " firstOnChangeCalled = false;" | |
256 " secondOnChangeCalled = false;" | |
257 " document.getElementById('first_password').onchange = function() {" | |
258 " firstOnChangeCalled = true;" | |
259 " };" | |
260 " document.getElementById('second_password').onchange = function() {" | |
261 " secondOnChangeCalled = true;" | |
262 " };" | |
263 "</script>"; | |
264 | |
265 const char kPasswordChangeFormHTML[] = | 253 const char kPasswordChangeFormHTML[] = |
266 "<FORM name = 'ChangeWithUsernameForm' action = 'http://www.bidule.com'> " | 254 "<FORM name = 'ChangeWithUsernameForm' action = 'http://www.bidule.com'> " |
267 " <INPUT type = 'text' id = 'username'/> " | 255 " <INPUT type = 'text' id = 'username'/> " |
268 " <INPUT type = 'password' id = 'password'/> " | 256 " <INPUT type = 'password' id = 'password'/> " |
269 " <INPUT type = 'password' id = 'newpassword'/> " | 257 " <INPUT type = 'password' id = 'newpassword'/> " |
270 " <INPUT type = 'password' id = 'confirmpassword'/> " | 258 " <INPUT type = 'password' id = 'confirmpassword'/> " |
271 " <INPUT type = 'button' id = 'dummy'/> " | 259 " <INPUT type = 'button' id = 'dummy'/> " |
272 " <INPUT type = 'submit' value = 'Login'/> " | 260 " <INPUT type = 'submit' value = 'Login'/> " |
273 "</FORM>"; | 261 "</FORM>"; |
274 | 262 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
309 // This doesn't trigger because the form action is invalid. | 297 // This doesn't trigger because the form action is invalid. |
310 LoadHTMLWithUserGesture(kInvalidActionAccountCreationFormHTML); | 298 LoadHTMLWithUserGesture(kInvalidActionAccountCreationFormHTML); |
311 SetNotBlacklistedMessage(password_generation_, | 299 SetNotBlacklistedMessage(password_generation_, |
312 kInvalidActionAccountCreationFormHTML); | 300 kInvalidActionAccountCreationFormHTML); |
313 SetAccountCreationFormsDetectedMessage(password_generation_, | 301 SetAccountCreationFormsDetectedMessage(password_generation_, |
314 GetMainFrame()->document(), 0, 1); | 302 GetMainFrame()->document(), 0, 1); |
315 ExpectGenerationAvailable("first_password", false); | 303 ExpectGenerationAvailable("first_password", false); |
316 } | 304 } |
317 | 305 |
318 TEST_F(PasswordGenerationAgentTest, FillTest) { | 306 TEST_F(PasswordGenerationAgentTest, FillTest) { |
| 307 // Add event listeners for password fields. |
| 308 std::vector<base::string16> variables_to_check; |
| 309 std::string events_registration_script = |
| 310 CreateScriptToRegisterListeners("first_password", &variables_to_check) + |
| 311 CreateScriptToRegisterListeners("second_password", &variables_to_check); |
| 312 |
319 // Make sure that we are enabled before loading HTML. | 313 // Make sure that we are enabled before loading HTML. |
320 std::string html = std::string(kAccountCreationFormHTML) + | 314 std::string html = |
321 ChangeDetectionScript; | 315 std::string(kAccountCreationFormHTML) + events_registration_script; |
322 LoadHTMLWithUserGesture(html.c_str()); | 316 LoadHTMLWithUserGesture(html.c_str()); |
323 SetNotBlacklistedMessage(password_generation_, html.c_str()); | 317 SetNotBlacklistedMessage(password_generation_, html.c_str()); |
324 SetAccountCreationFormsDetectedMessage(password_generation_, | 318 SetAccountCreationFormsDetectedMessage(password_generation_, |
325 GetMainFrame()->document(), 0, 1); | 319 GetMainFrame()->document(), 0, 1); |
326 | 320 |
327 WebDocument document = GetMainFrame()->document(); | 321 WebDocument document = GetMainFrame()->document(); |
328 WebElement element = | 322 WebElement element = |
329 document.getElementById(WebString::fromUTF8("first_password")); | 323 document.getElementById(WebString::fromUTF8("first_password")); |
330 ASSERT_FALSE(element.isNull()); | 324 ASSERT_FALSE(element.isNull()); |
331 WebInputElement first_password_element = element.to<WebInputElement>(); | 325 WebInputElement first_password_element = element.to<WebInputElement>(); |
332 element = document.getElementById(WebString::fromUTF8("second_password")); | 326 element = document.getElementById(WebString::fromUTF8("second_password")); |
333 ASSERT_FALSE(element.isNull()); | 327 ASSERT_FALSE(element.isNull()); |
334 WebInputElement second_password_element = element.to<WebInputElement>(); | 328 WebInputElement second_password_element = element.to<WebInputElement>(); |
335 | 329 |
336 // Both password fields should be empty. | 330 // Both password fields should be empty. |
337 EXPECT_TRUE(first_password_element.value().isNull()); | 331 EXPECT_TRUE(first_password_element.value().isNull()); |
338 EXPECT_TRUE(second_password_element.value().isNull()); | 332 EXPECT_TRUE(second_password_element.value().isNull()); |
339 | 333 |
340 base::string16 password = base::ASCIIToUTF16("random_password"); | 334 base::string16 password = base::ASCIIToUTF16("random_password"); |
341 password_generation_->GeneratedPasswordAccepted(password); | 335 password_generation_->GeneratedPasswordAccepted(password); |
342 | 336 |
343 // Password fields are filled out and set as being autofilled. | 337 // Password fields are filled out and set as being autofilled. |
344 EXPECT_EQ(password, first_password_element.value().utf16()); | 338 EXPECT_EQ(password, first_password_element.value().utf16()); |
345 EXPECT_EQ(password, second_password_element.value().utf16()); | 339 EXPECT_EQ(password, second_password_element.value().utf16()); |
346 EXPECT_TRUE(first_password_element.isAutofilled()); | 340 EXPECT_TRUE(first_password_element.isAutofilled()); |
347 EXPECT_TRUE(second_password_element.isAutofilled()); | 341 EXPECT_TRUE(second_password_element.isAutofilled()); |
348 | 342 |
349 // Make sure onchange events are called. | 343 // Make sure all events are called. |
350 int first_onchange_called = -1; | 344 for (const base::string16& variable : variables_to_check) { |
351 int second_onchange_called = -1; | 345 int value; |
352 ASSERT_TRUE( | 346 EXPECT_TRUE(ExecuteJavaScriptAndReturnIntValue(variable, &value)); |
353 ExecuteJavaScriptAndReturnIntValue( | 347 EXPECT_EQ(1, value) << variable; |
354 base::ASCIIToUTF16("firstOnChangeCalled ? 1 : 0"), | 348 } |
355 &first_onchange_called)); | |
356 EXPECT_EQ(1, first_onchange_called); | |
357 ASSERT_TRUE( | |
358 ExecuteJavaScriptAndReturnIntValue( | |
359 base::ASCIIToUTF16("secondOnChangeCalled ? 1 : 0"), | |
360 &second_onchange_called)); | |
361 EXPECT_EQ(1, second_onchange_called); | |
362 | 349 |
363 // Focus moved to the next input field. | 350 // Focus moved to the next input field. |
364 // TODO(zysxqn): Change this back to the address element once Bug 90224 | 351 // TODO(zysxqn): Change this back to the address element once Bug 90224 |
365 // https://bugs.webkit.org/show_bug.cgi?id=90224 has been fixed. | 352 // https://bugs.webkit.org/show_bug.cgi?id=90224 has been fixed. |
366 element = document.getElementById(WebString::fromUTF8("first_password")); | 353 element = document.getElementById(WebString::fromUTF8("first_password")); |
367 ASSERT_FALSE(element.isNull()); | 354 ASSERT_FALSE(element.isNull()); |
368 EXPECT_EQ(element, document.focusedElement()); | 355 EXPECT_EQ(element, document.focusedElement()); |
369 } | 356 } |
370 | 357 |
371 TEST_F(PasswordGenerationAgentTest, EditingTest) { | 358 TEST_F(PasswordGenerationAgentTest, EditingTest) { |
(...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
804 | 791 |
805 // Click on another HTML element. | 792 // Click on another HTML element. |
806 const char* const click_target_name = | 793 const char* const click_target_name = |
807 clickOnInputField ? kTextFieldId : kSpanId; | 794 clickOnInputField ? kTextFieldId : kSpanId; |
808 EXPECT_TRUE(SimulateElementClick(click_target_name)); | 795 EXPECT_TRUE(SimulateElementClick(click_target_name)); |
809 EXPECT_FALSE(input.shouldRevealPassword()); | 796 EXPECT_FALSE(input.shouldRevealPassword()); |
810 } | 797 } |
811 } | 798 } |
812 | 799 |
813 } // namespace autofill | 800 } // namespace autofill |
OLD | NEW |