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" |
| 11 #include "base/strings/stringprintf.h" |
11 #include "base/strings/utf_string_conversions.h" | 12 #include "base/strings/utf_string_conversions.h" |
12 #include "base/test/histogram_tester.h" | 13 #include "base/test/histogram_tester.h" |
13 #include "chrome/renderer/autofill/fake_content_password_manager_driver.h" | 14 #include "chrome/renderer/autofill/fake_content_password_manager_driver.h" |
| 15 #include "chrome/renderer/autofill/fake_password_manager_client.h" |
14 #include "chrome/renderer/autofill/password_generation_test_utils.h" | 16 #include "chrome/renderer/autofill/password_generation_test_utils.h" |
15 #include "chrome/test/base/chrome_render_view_test.h" | 17 #include "chrome/test/base/chrome_render_view_test.h" |
16 #include "components/autofill/content/common/autofill_messages.h" | |
17 #include "components/autofill/content/renderer/autofill_agent.h" | 18 #include "components/autofill/content/renderer/autofill_agent.h" |
18 #include "components/autofill/content/renderer/test_password_generation_agent.h" | 19 #include "components/autofill/content/renderer/test_password_generation_agent.h" |
19 #include "components/autofill/core/common/form_data.h" | 20 #include "components/autofill/core/common/form_data.h" |
20 #include "components/autofill/core/common/password_generation_util.h" | 21 #include "components/autofill/core/common/password_generation_util.h" |
| 22 #include "content/public/common/associated_interface_provider.h" |
21 #include "content/public/renderer/render_frame.h" | 23 #include "content/public/renderer/render_frame.h" |
22 #include "content/public/renderer/render_view.h" | 24 #include "content/public/renderer/render_view.h" |
23 #include "services/shell/public/cpp/interface_provider.h" | 25 #include "services/shell/public/cpp/interface_provider.h" |
24 #include "testing/gtest/include/gtest/gtest.h" | 26 #include "testing/gtest/include/gtest/gtest.h" |
25 #include "third_party/WebKit/public/platform/WebString.h" | 27 #include "third_party/WebKit/public/platform/WebString.h" |
26 #include "third_party/WebKit/public/web/WebDocument.h" | 28 #include "third_party/WebKit/public/web/WebDocument.h" |
27 #include "third_party/WebKit/public/web/WebLocalFrame.h" | 29 #include "third_party/WebKit/public/web/WebLocalFrame.h" |
28 #include "third_party/WebKit/public/web/WebWidget.h" | 30 #include "third_party/WebKit/public/web/WebWidget.h" |
29 #include "ui/events/keycodes/keyboard_codes.h" | 31 #include "ui/events/keycodes/keyboard_codes.h" |
30 | 32 |
(...skipping 12 matching lines...) Expand all Loading... |
43 void RegisterMainFrameRemoteInterfaces() override { | 45 void RegisterMainFrameRemoteInterfaces() override { |
44 // We only use the fake driver for main frame | 46 // We only use the fake driver for main frame |
45 // because our test cases only involve the main frame. | 47 // because our test cases only involve the main frame. |
46 shell::InterfaceProvider* remote_interfaces = | 48 shell::InterfaceProvider* remote_interfaces = |
47 view_->GetMainRenderFrame()->GetRemoteInterfaces(); | 49 view_->GetMainRenderFrame()->GetRemoteInterfaces(); |
48 shell::InterfaceProvider::TestApi test_api(remote_interfaces); | 50 shell::InterfaceProvider::TestApi test_api(remote_interfaces); |
49 test_api.SetBinderForName( | 51 test_api.SetBinderForName( |
50 mojom::PasswordManagerDriver::Name_, | 52 mojom::PasswordManagerDriver::Name_, |
51 base::Bind(&PasswordGenerationAgentTest::BindPasswordManagerDriver, | 53 base::Bind(&PasswordGenerationAgentTest::BindPasswordManagerDriver, |
52 base::Unretained(this))); | 54 base::Unretained(this))); |
| 55 |
| 56 // Because the test cases only involve the main frame in this test, |
| 57 // the fake password client is only used for the main frame. |
| 58 content::AssociatedInterfaceProvider* remote_associated_interfaces = |
| 59 view_->GetMainRenderFrame()->GetRemoteAssociatedInterfaces(); |
| 60 remote_associated_interfaces->OverrideBinderForTesting( |
| 61 mojom::PasswordManagerClient::Name_, |
| 62 base::Bind(&PasswordGenerationAgentTest::BindPasswordManagerClient, |
| 63 base::Unretained(this))); |
53 } | 64 } |
54 | 65 |
55 void TearDown() override { | 66 void TearDown() override { |
56 LoadHTML(""); | 67 LoadHTML(""); |
57 ChromeRenderViewTest::TearDown(); | 68 ChromeRenderViewTest::TearDown(); |
58 } | 69 } |
59 | 70 |
60 void LoadHTMLWithUserGesture(const char* html) { | 71 void LoadHTMLWithUserGesture(const char* html) { |
61 LoadHTML(html); | 72 LoadHTML(html); |
62 | 73 |
63 // Enable show-ime event when element is focused by indicating that a user | 74 // Enable show-ime event when element is focused by indicating that a user |
64 // gesture has been processed since load. | 75 // gesture has been processed since load. |
65 EXPECT_TRUE(SimulateElementClick("dummy")); | 76 EXPECT_TRUE(SimulateElementClick("dummy")); |
66 } | 77 } |
67 | 78 |
68 void FocusField(const char* element_id) { | 79 void FocusField(const char* element_id) { |
69 WebDocument document = GetMainFrame()->document(); | 80 WebDocument document = GetMainFrame()->document(); |
70 blink::WebElement element = | 81 blink::WebElement element = |
71 document.getElementById(blink::WebString::fromUTF8(element_id)); | 82 document.getElementById(blink::WebString::fromUTF8(element_id)); |
72 ASSERT_FALSE(element.isNull()); | 83 ASSERT_FALSE(element.isNull()); |
73 ExecuteJavaScriptForTests( | 84 ExecuteJavaScriptForTests( |
74 base::StringPrintf("document.getElementById('%s').focus();", | 85 base::StringPrintf("document.getElementById('%s').focus();", |
75 element_id).c_str()); | 86 element_id).c_str()); |
76 } | 87 } |
77 | 88 |
78 void ExpectGenerationAvailable(const char* element_id, | 89 void ExpectGenerationAvailable(const char* element_id, |
79 bool available) { | 90 bool available) { |
80 FocusField(element_id); | 91 FocusField(element_id); |
81 const IPC::Message* message = | 92 base::RunLoop().RunUntilIdle(); |
82 render_thread_->sink().GetFirstMessageMatching( | 93 fake_pw_client_.Flush(); |
83 AutofillHostMsg_ShowPasswordGenerationPopup::ID); | 94 bool called = fake_pw_client_.called_show_pw_generation_popup(); |
84 if (available) | 95 if (available) |
85 ASSERT_TRUE(message); | 96 ASSERT_TRUE(called); |
86 else | 97 else |
87 ASSERT_FALSE(message); | 98 ASSERT_FALSE(called); |
88 | 99 |
89 render_thread_->sink().ClearMessages(); | 100 fake_pw_client_.reset_called_show_pw_generation_popup(); |
90 } | 101 } |
91 | 102 |
92 void AllowToRunFormClassifier() { | 103 void AllowToRunFormClassifier() { |
93 password_generation_->AllowToRunFormClassifier(); | 104 password_generation_->AllowToRunFormClassifier(); |
94 } | 105 } |
95 | 106 |
96 void ExpectFormClassifierVoteReceived( | 107 void ExpectFormClassifierVoteReceived( |
97 bool received, | 108 bool received, |
98 const base::string16& expected_generation_element) { | 109 const base::string16& expected_generation_element) { |
99 base::RunLoop().RunUntilIdle(); | 110 base::RunLoop().RunUntilIdle(); |
100 if (received) { | 111 if (received) { |
101 ASSERT_TRUE(fake_driver_.called_save_generation_field()); | 112 ASSERT_TRUE(fake_driver_.called_save_generation_field()); |
102 EXPECT_EQ(expected_generation_element, | 113 EXPECT_EQ(expected_generation_element, |
103 fake_driver_.save_generation_field()); | 114 fake_driver_.save_generation_field()); |
104 } else { | 115 } else { |
105 ASSERT_FALSE(fake_driver_.called_save_generation_field()); | 116 ASSERT_FALSE(fake_driver_.called_save_generation_field()); |
106 } | 117 } |
107 | 118 |
108 fake_driver_.reset_save_generation_field(); | 119 fake_driver_.reset_save_generation_field(); |
109 } | 120 } |
110 | 121 |
| 122 bool GetCalledShowPasswordGenerationPopup() { |
| 123 fake_pw_client_.Flush(); |
| 124 return fake_pw_client_.called_show_pw_generation_popup(); |
| 125 } |
| 126 |
111 void ShowGenerationPopUpManually(const char* element_id) { | 127 void ShowGenerationPopUpManually(const char* element_id) { |
112 FocusField(element_id); | 128 FocusField(element_id); |
113 password_generation_->UserTriggeredGeneratePassword(); | 129 password_generation_->UserTriggeredGeneratePassword(); |
114 } | 130 } |
115 | 131 |
116 void BindPasswordManagerDriver(mojo::ScopedMessagePipeHandle handle) { | 132 void BindPasswordManagerDriver(mojo::ScopedMessagePipeHandle handle) { |
117 fake_driver_.BindRequest( | 133 fake_driver_.BindRequest( |
118 mojo::MakeRequest<mojom::PasswordManagerDriver>(std::move(handle))); | 134 mojo::MakeRequest<mojom::PasswordManagerDriver>(std::move(handle))); |
119 } | 135 } |
120 | 136 |
| 137 void BindPasswordManagerClient(mojo::ScopedInterfaceEndpointHandle handle) { |
| 138 fake_pw_client_.BindRequest( |
| 139 mojo::MakeAssociatedRequest<mojom::PasswordManagerClient>( |
| 140 std::move(handle))); |
| 141 } |
| 142 |
121 FakeContentPasswordManagerDriver fake_driver_; | 143 FakeContentPasswordManagerDriver fake_driver_; |
| 144 FakePasswordManagerClient fake_pw_client_; |
122 | 145 |
123 private: | 146 private: |
124 DISALLOW_COPY_AND_ASSIGN(PasswordGenerationAgentTest); | 147 DISALLOW_COPY_AND_ASSIGN(PasswordGenerationAgentTest); |
125 }; | 148 }; |
126 | 149 |
127 const char kSigninFormHTML[] = | 150 const char kSigninFormHTML[] = |
128 "<FORM name = 'blah' action = 'http://www.random.com/'> " | 151 "<FORM name = 'blah' action = 'http://www.random.com/'> " |
129 " <INPUT type = 'text' id = 'username'/> " | 152 " <INPUT type = 'text' id = 'username'/> " |
130 " <INPUT type = 'password' id = 'password'/> " | 153 " <INPUT type = 'password' id = 'password'/> " |
131 " <INPUT type = 'button' id = 'dummy'/> " | 154 " <INPUT type = 'button' id = 'dummy'/> " |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
359 EXPECT_EQ(password, second_password_element.value()); | 382 EXPECT_EQ(password, second_password_element.value()); |
360 | 383 |
361 // After editing the first field they are still the same. | 384 // After editing the first field they are still the same. |
362 std::string edited_password_ascii = "edited_password"; | 385 std::string edited_password_ascii = "edited_password"; |
363 SimulateUserInputChangeForElement(&first_password_element, | 386 SimulateUserInputChangeForElement(&first_password_element, |
364 edited_password_ascii); | 387 edited_password_ascii); |
365 base::string16 edited_password = base::ASCIIToUTF16(edited_password_ascii); | 388 base::string16 edited_password = base::ASCIIToUTF16(edited_password_ascii); |
366 EXPECT_EQ(edited_password, first_password_element.value()); | 389 EXPECT_EQ(edited_password, first_password_element.value()); |
367 EXPECT_EQ(edited_password, second_password_element.value()); | 390 EXPECT_EQ(edited_password, second_password_element.value()); |
368 | 391 |
369 // Clear any uninteresting sent messages. | |
370 render_thread_->sink().ClearMessages(); | |
371 fake_driver_.reset_called_password_no_longer_generated(); | 392 fake_driver_.reset_called_password_no_longer_generated(); |
372 | 393 |
373 // Verify that password mirroring works correctly even when the password | 394 // Verify that password mirroring works correctly even when the password |
374 // is deleted. | 395 // is deleted. |
375 SimulateUserInputChangeForElement(&first_password_element, std::string()); | 396 SimulateUserInputChangeForElement(&first_password_element, std::string()); |
376 EXPECT_EQ(base::string16(), first_password_element.value()); | 397 EXPECT_EQ(base::string16(), first_password_element.value()); |
377 EXPECT_EQ(base::string16(), second_password_element.value()); | 398 EXPECT_EQ(base::string16(), second_password_element.value()); |
378 | 399 |
379 // Should have notified the browser that the password is no longer generated | 400 // Should have notified the browser that the password is no longer generated |
380 // and trigger generation again. | 401 // and trigger generation again. |
381 base::RunLoop().RunUntilIdle(); | 402 base::RunLoop().RunUntilIdle(); |
382 EXPECT_TRUE(fake_driver_.called_password_no_longer_generated()); | 403 EXPECT_TRUE(fake_driver_.called_password_no_longer_generated()); |
383 EXPECT_TRUE(render_thread_->sink().GetFirstMessageMatching( | 404 EXPECT_TRUE(GetCalledShowPasswordGenerationPopup()); |
384 AutofillHostMsg_ShowPasswordGenerationPopup::ID)); | |
385 } | 405 } |
386 | 406 |
387 TEST_F(PasswordGenerationAgentTest, BlacklistedTest) { | 407 TEST_F(PasswordGenerationAgentTest, BlacklistedTest) { |
388 // Did not receive not blacklisted message. Don't show password generation | 408 // Did not receive not blacklisted message. Don't show password generation |
389 // icon. | 409 // icon. |
390 LoadHTMLWithUserGesture(kAccountCreationFormHTML); | 410 LoadHTMLWithUserGesture(kAccountCreationFormHTML); |
391 SetAccountCreationFormsDetectedMessage(password_generation_, | 411 SetAccountCreationFormsDetectedMessage(password_generation_, |
392 GetMainFrame()->document(), 0, 1); | 412 GetMainFrame()->document(), 0, 1); |
393 ExpectGenerationAvailable("first_password", false); | 413 ExpectGenerationAvailable("first_password", false); |
394 | 414 |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
447 WebElement element = | 467 WebElement element = |
448 document.getElementById(WebString::fromUTF8("first_password")); | 468 document.getElementById(WebString::fromUTF8("first_password")); |
449 ASSERT_FALSE(element.isNull()); | 469 ASSERT_FALSE(element.isNull()); |
450 WebInputElement first_password_element = element.to<WebInputElement>(); | 470 WebInputElement first_password_element = element.to<WebInputElement>(); |
451 | 471 |
452 // Make a password just under maximum offer size. | 472 // Make a password just under maximum offer size. |
453 SimulateUserInputChangeForElement( | 473 SimulateUserInputChangeForElement( |
454 &first_password_element, | 474 &first_password_element, |
455 std::string(password_generation_->kMaximumOfferSize - 1, 'a')); | 475 std::string(password_generation_->kMaximumOfferSize - 1, 'a')); |
456 // There should now be a message to show the UI. | 476 // There should now be a message to show the UI. |
457 EXPECT_TRUE(render_thread_->sink().GetFirstMessageMatching( | 477 EXPECT_TRUE(GetCalledShowPasswordGenerationPopup()); |
458 AutofillHostMsg_ShowPasswordGenerationPopup::ID)); | 478 fake_pw_client_.reset_called_show_pw_generation_popup(); |
459 render_thread_->sink().ClearMessages(); | |
460 | 479 |
| 480 fake_pw_client_.reset_called_hide_pw_generation_popup(); |
461 // Simulate a user typing a password just over maximum offer size. | 481 // Simulate a user typing a password just over maximum offer size. |
462 SimulateUserTypingASCIICharacter('a', false); | 482 SimulateUserTypingASCIICharacter('a', false); |
463 SimulateUserTypingASCIICharacter('a', true); | 483 SimulateUserTypingASCIICharacter('a', true); |
464 // There should now be a message to hide the UI. | 484 // There should now be a message to hide the UI. |
465 EXPECT_TRUE(render_thread_->sink().GetFirstMessageMatching( | 485 fake_pw_client_.Flush(); |
466 AutofillHostMsg_HidePasswordGenerationPopup::ID)); | 486 EXPECT_TRUE(fake_pw_client_.called_hide_pw_generation_popup()); |
467 render_thread_->sink().ClearMessages(); | 487 fake_pw_client_.reset_called_show_pw_generation_popup(); |
468 | 488 |
469 // Simulate the user deleting characters. The generation popup should be shown | 489 // Simulate the user deleting characters. The generation popup should be shown |
470 // again. | 490 // again. |
471 SimulateUserTypingASCIICharacter(ui::VKEY_BACK, true); | 491 SimulateUserTypingASCIICharacter(ui::VKEY_BACK, true); |
472 // There should now be a message to show the UI. | 492 // There should now be a message to show the UI. |
473 EXPECT_TRUE(render_thread_->sink().GetFirstMessageMatching( | 493 EXPECT_TRUE(GetCalledShowPasswordGenerationPopup()); |
474 AutofillHostMsg_ShowPasswordGenerationPopup::ID)); | 494 fake_pw_client_.reset_called_show_pw_generation_popup(); |
475 render_thread_->sink().ClearMessages(); | |
476 | 495 |
477 // Change focus. Bubble should be hidden, but that is handled by AutofilAgent, | 496 // Change focus. Bubble should be hidden, but that is handled by AutofilAgent, |
478 // so no messages are sent. | 497 // so no messages are sent. |
479 ExecuteJavaScriptForTests("document.getElementById('username').focus();"); | 498 ExecuteJavaScriptForTests("document.getElementById('username').focus();"); |
480 EXPECT_FALSE(render_thread_->sink().GetFirstMessageMatching( | 499 EXPECT_FALSE(GetCalledShowPasswordGenerationPopup()); |
481 AutofillHostMsg_ShowPasswordGenerationPopup::ID)); | 500 fake_pw_client_.reset_called_show_pw_generation_popup(); |
482 render_thread_->sink().ClearMessages(); | |
483 | 501 |
484 // Focusing the password field will bring up the generation UI again. | 502 // Focusing the password field will bring up the generation UI again. |
485 ExecuteJavaScriptForTests( | 503 ExecuteJavaScriptForTests( |
486 "document.getElementById('first_password').focus();"); | 504 "document.getElementById('first_password').focus();"); |
487 EXPECT_TRUE(render_thread_->sink().GetFirstMessageMatching( | 505 EXPECT_TRUE(GetCalledShowPasswordGenerationPopup()); |
488 AutofillHostMsg_ShowPasswordGenerationPopup::ID)); | 506 fake_pw_client_.reset_called_show_pw_generation_popup(); |
489 render_thread_->sink().ClearMessages(); | |
490 | 507 |
491 // Loading a different page triggers UMA stat upload. Verify that only one | 508 // Loading a different page triggers UMA stat upload. Verify that only one |
492 // display event is sent even though | 509 // display event is sent even though |
493 LoadHTMLWithUserGesture(kSigninFormHTML); | 510 LoadHTMLWithUserGesture(kSigninFormHTML); |
494 | 511 |
495 histogram_tester.ExpectBucketCount( | 512 histogram_tester.ExpectBucketCount( |
496 "PasswordGeneration.Event", | 513 "PasswordGeneration.Event", |
497 autofill::password_generation::GENERATION_POPUP_SHOWN, | 514 autofill::password_generation::GENERATION_POPUP_SHOWN, |
498 1); | 515 1); |
499 } | 516 } |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
561 // correctly (generation should still be available). | 578 // correctly (generation should still be available). |
562 SetNotBlacklistedMessage(password_generation_, kAccountCreationFormHTML); | 579 SetNotBlacklistedMessage(password_generation_, kAccountCreationFormHTML); |
563 | 580 |
564 // Need to focus another field first for verification to work. | 581 // Need to focus another field first for verification to work. |
565 ExpectGenerationAvailable("second_password", false); | 582 ExpectGenerationAvailable("second_password", false); |
566 ExpectGenerationAvailable("first_password", true); | 583 ExpectGenerationAvailable("first_password", true); |
567 } | 584 } |
568 | 585 |
569 // Losing focus should not trigger a password generation popup. | 586 // Losing focus should not trigger a password generation popup. |
570 TEST_F(PasswordGenerationAgentTest, BlurTest) { | 587 TEST_F(PasswordGenerationAgentTest, BlurTest) { |
571 render_thread_->sink().ClearMessages(); | |
572 LoadHTMLWithUserGesture(kDisabledElementAccountCreationFormHTML); | 588 LoadHTMLWithUserGesture(kDisabledElementAccountCreationFormHTML); |
573 SetNotBlacklistedMessage(password_generation_, | 589 SetNotBlacklistedMessage(password_generation_, |
574 kDisabledElementAccountCreationFormHTML); | 590 kDisabledElementAccountCreationFormHTML); |
575 SetAccountCreationFormsDetectedMessage(password_generation_, | 591 SetAccountCreationFormsDetectedMessage(password_generation_, |
576 GetMainFrame()->document(), 0, 1); | 592 GetMainFrame()->document(), 0, 1); |
577 | 593 |
578 // Focus on the first password field: password generation popup should show | 594 // Focus on the first password field: password generation popup should show |
579 // up. | 595 // up. |
580 ExpectGenerationAvailable("first_password", true); | 596 ExpectGenerationAvailable("first_password", true); |
581 | 597 |
| 598 fake_pw_client_.reset_called_generation_available_for_form(); |
582 // Remove focus from everywhere by clicking an unfocusable element: password | 599 // Remove focus from everywhere by clicking an unfocusable element: password |
583 // generation popup should not show up. | 600 // generation popup should not show up. |
584 EXPECT_TRUE(SimulateElementClick("disabled")); | 601 EXPECT_TRUE(SimulateElementClick("disabled")); |
585 EXPECT_FALSE(render_thread_->sink().GetFirstMessageMatching( | 602 fake_pw_client_.Flush(); |
586 AutofillHostMsg_GenerationAvailableForForm::ID)); | 603 EXPECT_FALSE(fake_pw_client_.called_generation_available_for_form()); |
587 EXPECT_FALSE(render_thread_->sink().GetFirstMessageMatching( | 604 EXPECT_FALSE(GetCalledShowPasswordGenerationPopup()); |
588 AutofillHostMsg_ShowPasswordGenerationPopup::ID)); | |
589 } | 605 } |
590 | 606 |
591 TEST_F(PasswordGenerationAgentTest, AutocompleteAttributesTest) { | 607 TEST_F(PasswordGenerationAgentTest, AutocompleteAttributesTest) { |
592 // Verify that autocomplete attributes can override Autofill to enable | 608 // Verify that autocomplete attributes can override Autofill to enable |
593 // generation | 609 // generation |
594 LoadHTMLWithUserGesture(kBothAutocompleteAttributesFormHTML); | 610 LoadHTMLWithUserGesture(kBothAutocompleteAttributesFormHTML); |
595 SetNotBlacklistedMessage(password_generation_, | 611 SetNotBlacklistedMessage(password_generation_, |
596 kBothAutocompleteAttributesFormHTML); | 612 kBothAutocompleteAttributesFormHTML); |
597 | 613 |
598 ExpectGenerationAvailable("first_password", true); | 614 ExpectGenerationAvailable("first_password", true); |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
701 base::string16()); | 717 base::string16()); |
702 } | 718 } |
703 | 719 |
704 TEST_F(PasswordGenerationAgentTest, FormClassifierDisabled) { | 720 TEST_F(PasswordGenerationAgentTest, FormClassifierDisabled) { |
705 LoadHTMLWithUserGesture(kSigninFormHTML); | 721 LoadHTMLWithUserGesture(kSigninFormHTML); |
706 ExpectFormClassifierVoteReceived(false /* vote is not expected */, | 722 ExpectFormClassifierVoteReceived(false /* vote is not expected */, |
707 base::string16()); | 723 base::string16()); |
708 } | 724 } |
709 | 725 |
710 } // namespace autofill | 726 } // namespace autofill |
OLD | NEW |