| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "base/strings/string_util.h" | 5 #include "base/strings/string_util.h" |
| 6 #include "base/strings/utf_string_conversions.h" | 6 #include "base/strings/utf_string_conversions.h" |
| 7 #include "chrome/test/base/chrome_render_view_test.h" | 7 #include "chrome/test/base/chrome_render_view_test.h" |
| 8 #include "components/autofill/content/renderer/autofill_agent.h" | 8 #include "components/autofill/content/renderer/autofill_agent.h" |
| 9 #include "components/autofill/content/renderer/form_autofill_util.h" | 9 #include "components/autofill/content/renderer/form_autofill_util.h" |
| 10 #include "components/autofill/content/renderer/password_autofill_agent.h" | 10 #include "components/autofill/content/renderer/password_autofill_agent.h" |
| 11 #include "components/autofill/content/renderer/test_password_autofill_agent.h" | 11 #include "components/autofill/content/renderer/test_password_autofill_agent.h" |
| 12 #include "components/autofill/core/common/autofill_messages.h" | 12 #include "components/autofill/core/common/autofill_messages.h" |
| 13 #include "components/autofill/core/common/form_data.h" | 13 #include "components/autofill/core/common/form_data.h" |
| 14 #include "components/autofill/core/common/form_field_data.h" | 14 #include "components/autofill/core/common/form_field_data.h" |
| 15 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
| 16 #include "third_party/WebKit/public/platform/WebString.h" | 16 #include "third_party/WebKit/public/platform/WebString.h" |
| 17 #include "third_party/WebKit/public/platform/WebVector.h" | 17 #include "third_party/WebKit/public/platform/WebVector.h" |
| 18 #include "third_party/WebKit/public/web/WebDocument.h" | 18 #include "third_party/WebKit/public/web/WebDocument.h" |
| 19 #include "third_party/WebKit/public/web/WebElement.h" | 19 #include "third_party/WebKit/public/web/WebElement.h" |
| 20 #include "third_party/WebKit/public/web/WebFormElement.h" | 20 #include "third_party/WebKit/public/web/WebFormElement.h" |
| 21 #include "third_party/WebKit/public/web/WebInputElement.h" | 21 #include "third_party/WebKit/public/web/WebInputElement.h" |
| 22 #include "third_party/WebKit/public/web/WebNode.h" | 22 #include "third_party/WebKit/public/web/WebNode.h" |
| 23 #include "third_party/WebKit/public/web/WebView.h" | 23 #include "third_party/WebKit/public/web/WebView.h" |
| 24 #include "ui/events/keycodes/keyboard_codes.h" | 24 #include "ui/events/keycodes/keyboard_codes.h" |
| 25 | 25 |
| 26 using autofill::PasswordForm; | 26 using autofill::PasswordForm; |
| 27 using WebKit::WebDocument; | 27 using blink::WebDocument; |
| 28 using WebKit::WebElement; | 28 using blink::WebElement; |
| 29 using WebKit::WebFrame; | 29 using blink::WebFrame; |
| 30 using WebKit::WebInputElement; | 30 using blink::WebInputElement; |
| 31 using WebKit::WebString; | 31 using blink::WebString; |
| 32 using WebKit::WebView; | 32 using blink::WebView; |
| 33 | 33 |
| 34 namespace { | 34 namespace { |
| 35 | 35 |
| 36 // The name of the username/password element in the form. | 36 // The name of the username/password element in the form. |
| 37 const char kUsernameName[] = "username"; | 37 const char kUsernameName[] = "username"; |
| 38 const char kPasswordName[] = "password"; | 38 const char kPasswordName[] = "password"; |
| 39 | 39 |
| 40 const char kAliceUsername[] = "alice"; | 40 const char kAliceUsername[] = "alice"; |
| 41 const char kAlicePassword[] = "password"; | 41 const char kAlicePassword[] = "password"; |
| 42 const char kBobUsername[] = "bob"; | 42 const char kBobUsername[] = "bob"; |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 192 fill_data_.basic_data.origin = GURL(origin); | 192 fill_data_.basic_data.origin = GURL(origin); |
| 193 fill_data_.basic_data.action = GURL("http://www.bidule.com"); | 193 fill_data_.basic_data.action = GURL("http://www.bidule.com"); |
| 194 | 194 |
| 195 LoadHTML(kFormHTML); | 195 LoadHTML(kFormHTML); |
| 196 | 196 |
| 197 // Now retrieves the input elements so the test can access them. | 197 // Now retrieves the input elements so the test can access them. |
| 198 WebDocument document = GetMainFrame()->document(); | 198 WebDocument document = GetMainFrame()->document(); |
| 199 WebElement element = | 199 WebElement element = |
| 200 document.getElementById(WebString::fromUTF8(kUsernameName)); | 200 document.getElementById(WebString::fromUTF8(kUsernameName)); |
| 201 ASSERT_FALSE(element.isNull()); | 201 ASSERT_FALSE(element.isNull()); |
| 202 username_element_ = element.to<WebKit::WebInputElement>(); | 202 username_element_ = element.to<blink::WebInputElement>(); |
| 203 element = document.getElementById(WebString::fromUTF8(kPasswordName)); | 203 element = document.getElementById(WebString::fromUTF8(kPasswordName)); |
| 204 ASSERT_FALSE(element.isNull()); | 204 ASSERT_FALSE(element.isNull()); |
| 205 password_element_ = element.to<WebKit::WebInputElement>(); | 205 password_element_ = element.to<blink::WebInputElement>(); |
| 206 } | 206 } |
| 207 | 207 |
| 208 virtual void TearDown() { | 208 virtual void TearDown() { |
| 209 username_element_.reset(); | 209 username_element_.reset(); |
| 210 password_element_.reset(); | 210 password_element_.reset(); |
| 211 ChromeRenderViewTest::TearDown(); | 211 ChromeRenderViewTest::TearDown(); |
| 212 } | 212 } |
| 213 | 213 |
| 214 void ClearUsernameAndPasswordFields() { | 214 void ClearUsernameAndPasswordFields() { |
| 215 username_element_.setValue(""); | 215 username_element_.setValue(""); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 228 if (move_caret_to_end) | 228 if (move_caret_to_end) |
| 229 username_element_.setSelectionRange(username.length(), username.length()); | 229 username_element_.setSelectionRange(username.length(), username.length()); |
| 230 autofill_agent_->textFieldDidChange(username_element_); | 230 autofill_agent_->textFieldDidChange(username_element_); |
| 231 // Processing is delayed because of a WebKit bug, see | 231 // Processing is delayed because of a WebKit bug, see |
| 232 // PasswordAutocompleteManager::TextDidChangeInTextField() for details. | 232 // PasswordAutocompleteManager::TextDidChangeInTextField() for details. |
| 233 base::MessageLoop::current()->RunUntilIdle(); | 233 base::MessageLoop::current()->RunUntilIdle(); |
| 234 } | 234 } |
| 235 | 235 |
| 236 void SimulateKeyDownEvent(const WebInputElement& element, | 236 void SimulateKeyDownEvent(const WebInputElement& element, |
| 237 ui::KeyboardCode key_code) { | 237 ui::KeyboardCode key_code) { |
| 238 WebKit::WebKeyboardEvent key_event; | 238 blink::WebKeyboardEvent key_event; |
| 239 key_event.windowsKeyCode = key_code; | 239 key_event.windowsKeyCode = key_code; |
| 240 autofill_agent_->textFieldDidReceiveKeyDown(element, key_event); | 240 autofill_agent_->textFieldDidReceiveKeyDown(element, key_event); |
| 241 } | 241 } |
| 242 | 242 |
| 243 void CheckTextFieldsState(const std::string& username, | 243 void CheckTextFieldsState(const std::string& username, |
| 244 bool username_autofilled, | 244 bool username_autofilled, |
| 245 const std::string& password, | 245 const std::string& password, |
| 246 bool password_autofilled) { | 246 bool password_autofilled) { |
| 247 EXPECT_EQ(username, | 247 EXPECT_EQ(username, |
| 248 static_cast<std::string>(username_element_.value().utf8())); | 248 static_cast<std::string>(username_element_.value().utf8())); |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 314 " <INPUT type='password' id='password'/>" | 314 " <INPUT type='password' id='password'/>" |
| 315 " <INPUT type='submit' value='Login'/>" | 315 " <INPUT type='submit' value='Login'/>" |
| 316 "</FORM>"; | 316 "</FORM>"; |
| 317 LoadHTML(kEmptyActionFormHTML); | 317 LoadHTML(kEmptyActionFormHTML); |
| 318 | 318 |
| 319 // Retrieve the input elements so the test can access them. | 319 // Retrieve the input elements so the test can access them. |
| 320 WebDocument document = GetMainFrame()->document(); | 320 WebDocument document = GetMainFrame()->document(); |
| 321 WebElement element = | 321 WebElement element = |
| 322 document.getElementById(WebString::fromUTF8(kUsernameName)); | 322 document.getElementById(WebString::fromUTF8(kUsernameName)); |
| 323 ASSERT_FALSE(element.isNull()); | 323 ASSERT_FALSE(element.isNull()); |
| 324 username_element_ = element.to<WebKit::WebInputElement>(); | 324 username_element_ = element.to<blink::WebInputElement>(); |
| 325 element = document.getElementById(WebString::fromUTF8(kPasswordName)); | 325 element = document.getElementById(WebString::fromUTF8(kPasswordName)); |
| 326 ASSERT_FALSE(element.isNull()); | 326 ASSERT_FALSE(element.isNull()); |
| 327 password_element_ = element.to<WebKit::WebInputElement>(); | 327 password_element_ = element.to<blink::WebInputElement>(); |
| 328 | 328 |
| 329 // Set the expected form origin and action URLs. | 329 // Set the expected form origin and action URLs. |
| 330 std::string origin("data:text/html;charset=utf-8,"); | 330 std::string origin("data:text/html;charset=utf-8,"); |
| 331 origin += kEmptyActionFormHTML; | 331 origin += kEmptyActionFormHTML; |
| 332 fill_data_.basic_data.origin = GURL(origin); | 332 fill_data_.basic_data.origin = GURL(origin); |
| 333 fill_data_.basic_data.action = GURL(origin); | 333 fill_data_.basic_data.action = GURL(origin); |
| 334 | 334 |
| 335 // Simulate the browser sending back the login info, it triggers the | 335 // Simulate the browser sending back the login info, it triggers the |
| 336 // autocomplete. | 336 // autocomplete. |
| 337 SimulateOnFillPasswordForm(fill_data_); | 337 SimulateOnFillPasswordForm(fill_data_); |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 432 " <INPUT type='text' id='password'/>" | 432 " <INPUT type='text' id='password'/>" |
| 433 " <INPUT type='submit' value='Login'/>" | 433 " <INPUT type='submit' value='Login'/>" |
| 434 "</FORM>"; | 434 "</FORM>"; |
| 435 LoadHTML(kTextFieldPasswordFormHTML); | 435 LoadHTML(kTextFieldPasswordFormHTML); |
| 436 | 436 |
| 437 // Retrieve the input elements so the test can access them. | 437 // Retrieve the input elements so the test can access them. |
| 438 WebDocument document = GetMainFrame()->document(); | 438 WebDocument document = GetMainFrame()->document(); |
| 439 WebElement element = | 439 WebElement element = |
| 440 document.getElementById(WebString::fromUTF8(kUsernameName)); | 440 document.getElementById(WebString::fromUTF8(kUsernameName)); |
| 441 ASSERT_FALSE(element.isNull()); | 441 ASSERT_FALSE(element.isNull()); |
| 442 username_element_ = element.to<WebKit::WebInputElement>(); | 442 username_element_ = element.to<blink::WebInputElement>(); |
| 443 element = document.getElementById(WebString::fromUTF8(kPasswordName)); | 443 element = document.getElementById(WebString::fromUTF8(kPasswordName)); |
| 444 ASSERT_FALSE(element.isNull()); | 444 ASSERT_FALSE(element.isNull()); |
| 445 password_element_ = element.to<WebKit::WebInputElement>(); | 445 password_element_ = element.to<blink::WebInputElement>(); |
| 446 | 446 |
| 447 // Set the expected form origin URL. | 447 // Set the expected form origin URL. |
| 448 std::string origin("data:text/html;charset=utf-8,"); | 448 std::string origin("data:text/html;charset=utf-8,"); |
| 449 origin += kTextFieldPasswordFormHTML; | 449 origin += kTextFieldPasswordFormHTML; |
| 450 fill_data_.basic_data.origin = GURL(origin); | 450 fill_data_.basic_data.origin = GURL(origin); |
| 451 | 451 |
| 452 SimulateOnFillPasswordForm(fill_data_); | 452 SimulateOnFillPasswordForm(fill_data_); |
| 453 | 453 |
| 454 // Fields should still be empty. | 454 // Fields should still be empty. |
| 455 CheckTextFieldsState(std::string(), false, std::string(), false); | 455 CheckTextFieldsState(std::string(), false, std::string(), false); |
| 456 } | 456 } |
| 457 | 457 |
| 458 TEST_F(PasswordAutofillAgentTest, NoAutocompleteForPasswordFieldUsernames) { | 458 TEST_F(PasswordAutofillAgentTest, NoAutocompleteForPasswordFieldUsernames) { |
| 459 const char kPasswordFieldUsernameFormHTML[] = | 459 const char kPasswordFieldUsernameFormHTML[] = |
| 460 "<FORM name='LoginTestForm' action='http://www.bidule.com'>" | 460 "<FORM name='LoginTestForm' action='http://www.bidule.com'>" |
| 461 " <INPUT type='password' id='username'/>" | 461 " <INPUT type='password' id='username'/>" |
| 462 " <INPUT type='password' id='password'/>" | 462 " <INPUT type='password' id='password'/>" |
| 463 " <INPUT type='submit' value='Login'/>" | 463 " <INPUT type='submit' value='Login'/>" |
| 464 "</FORM>"; | 464 "</FORM>"; |
| 465 LoadHTML(kPasswordFieldUsernameFormHTML); | 465 LoadHTML(kPasswordFieldUsernameFormHTML); |
| 466 | 466 |
| 467 // Retrieve the input elements so the test can access them. | 467 // Retrieve the input elements so the test can access them. |
| 468 WebDocument document = GetMainFrame()->document(); | 468 WebDocument document = GetMainFrame()->document(); |
| 469 WebElement element = | 469 WebElement element = |
| 470 document.getElementById(WebString::fromUTF8(kUsernameName)); | 470 document.getElementById(WebString::fromUTF8(kUsernameName)); |
| 471 ASSERT_FALSE(element.isNull()); | 471 ASSERT_FALSE(element.isNull()); |
| 472 username_element_ = element.to<WebKit::WebInputElement>(); | 472 username_element_ = element.to<blink::WebInputElement>(); |
| 473 element = document.getElementById(WebString::fromUTF8(kPasswordName)); | 473 element = document.getElementById(WebString::fromUTF8(kPasswordName)); |
| 474 ASSERT_FALSE(element.isNull()); | 474 ASSERT_FALSE(element.isNull()); |
| 475 password_element_ = element.to<WebKit::WebInputElement>(); | 475 password_element_ = element.to<blink::WebInputElement>(); |
| 476 | 476 |
| 477 // Set the expected form origin URL. | 477 // Set the expected form origin URL. |
| 478 std::string origin("data:text/html;charset=utf-8,"); | 478 std::string origin("data:text/html;charset=utf-8,"); |
| 479 origin += kPasswordFieldUsernameFormHTML; | 479 origin += kPasswordFieldUsernameFormHTML; |
| 480 fill_data_.basic_data.origin = GURL(origin); | 480 fill_data_.basic_data.origin = GURL(origin); |
| 481 | 481 |
| 482 SimulateOnFillPasswordForm(fill_data_); | 482 SimulateOnFillPasswordForm(fill_data_); |
| 483 | 483 |
| 484 // Fields should still be empty. | 484 // Fields should still be empty. |
| 485 CheckTextFieldsState(std::string(), false, std::string(), false); | 485 CheckTextFieldsState(std::string(), false, std::string(), false); |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 613 SimulateOnFillPasswordForm(fill_data_); | 613 SimulateOnFillPasswordForm(fill_data_); |
| 614 | 614 |
| 615 // Clear the text fields to start fresh. | 615 // Clear the text fields to start fresh. |
| 616 ClearUsernameAndPasswordFields(); | 616 ClearUsernameAndPasswordFields(); |
| 617 | 617 |
| 618 // To simulate accepting an item in the suggestion drop-down we just mimic | 618 // To simulate accepting an item in the suggestion drop-down we just mimic |
| 619 // what the WebView does: it sets the element value then calls | 619 // what the WebView does: it sets the element value then calls |
| 620 // didSelectAutofillSuggestion on the renderer. | 620 // didSelectAutofillSuggestion on the renderer. |
| 621 autofill_agent_->didSelectAutofillSuggestion(username_element_, | 621 autofill_agent_->didSelectAutofillSuggestion(username_element_, |
| 622 ASCIIToUTF16(kAliceUsername), | 622 ASCIIToUTF16(kAliceUsername), |
| 623 WebKit::WebString(), | 623 blink::WebString(), |
| 624 0); | 624 0); |
| 625 // Autocomplete should not have kicked in. | 625 // Autocomplete should not have kicked in. |
| 626 CheckTextFieldsState(std::string(), false, std::string(), false); | 626 CheckTextFieldsState(std::string(), false, std::string(), false); |
| 627 } | 627 } |
| 628 | 628 |
| 629 TEST_F(PasswordAutofillAgentTest, IsWebNodeVisibleTest) { | 629 TEST_F(PasswordAutofillAgentTest, IsWebNodeVisibleTest) { |
| 630 WebKit::WebVector<WebKit::WebFormElement> forms1, forms2, forms3; | 630 blink::WebVector<blink::WebFormElement> forms1, forms2, forms3; |
| 631 WebKit::WebFrame* frame; | 631 blink::WebFrame* frame; |
| 632 | 632 |
| 633 LoadHTML(kVisibleFormHTML); | 633 LoadHTML(kVisibleFormHTML); |
| 634 frame = GetMainFrame(); | 634 frame = GetMainFrame(); |
| 635 frame->document().forms(forms1); | 635 frame->document().forms(forms1); |
| 636 ASSERT_EQ(1u, forms1.size()); | 636 ASSERT_EQ(1u, forms1.size()); |
| 637 EXPECT_TRUE(IsWebNodeVisible(forms1[0])); | 637 EXPECT_TRUE(IsWebNodeVisible(forms1[0])); |
| 638 | 638 |
| 639 LoadHTML(kEmptyFormHTML); | 639 LoadHTML(kEmptyFormHTML); |
| 640 frame = GetMainFrame(); | 640 frame = GetMainFrame(); |
| 641 frame->document().forms(forms2); | 641 frame->document().forms(forms2); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 692 EXPECT_TRUE(render_thread_->sink().GetFirstMessageMatching( | 692 EXPECT_TRUE(render_thread_->sink().GetFirstMessageMatching( |
| 693 AutofillHostMsg_PasswordFormsRendered::ID)); | 693 AutofillHostMsg_PasswordFormsRendered::ID)); |
| 694 | 694 |
| 695 render_thread_->sink().ClearMessages(); | 695 render_thread_->sink().ClearMessages(); |
| 696 LoadHTML(kWebpageWithDynamicContent); | 696 LoadHTML(kWebpageWithDynamicContent); |
| 697 EXPECT_TRUE(render_thread_->sink().GetFirstMessageMatching( | 697 EXPECT_TRUE(render_thread_->sink().GetFirstMessageMatching( |
| 698 AutofillHostMsg_PasswordFormsRendered::ID)); | 698 AutofillHostMsg_PasswordFormsRendered::ID)); |
| 699 } | 699 } |
| 700 | 700 |
| 701 } // namespace autofill | 701 } // namespace autofill |
| OLD | NEW |