Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(25)

Side by Side Diff: chrome/renderer/autofill/password_autofill_agent_browsertest.cc

Issue 707173004: Refactor Autofill for out of process iframes (OOPIF). (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: mem leak Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/common/autofill_messages.h" 8 #include "components/autofill/content/common/autofill_messages.h"
9 #include "components/autofill/content/renderer/autofill_agent.h" 9 #include "components/autofill/content/renderer/autofill_agent.h"
10 #include "components/autofill/content/renderer/form_autofill_util.h" 10 #include "components/autofill/content/renderer/form_autofill_util.h"
11 #include "components/autofill/content/renderer/password_autofill_agent.h" 11 #include "components/autofill/content/renderer/password_autofill_agent.h"
12 #include "components/autofill/content/renderer/test_password_autofill_agent.h" 12 #include "components/autofill/content/renderer/test_password_autofill_agent.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 "content/public/renderer/render_frame.h"
15 #include "testing/gtest/include/gtest/gtest.h" 16 #include "testing/gtest/include/gtest/gtest.h"
16 #include "third_party/WebKit/public/platform/WebString.h" 17 #include "third_party/WebKit/public/platform/WebString.h"
17 #include "third_party/WebKit/public/platform/WebVector.h" 18 #include "third_party/WebKit/public/platform/WebVector.h"
18 #include "third_party/WebKit/public/web/WebDocument.h" 19 #include "third_party/WebKit/public/web/WebDocument.h"
19 #include "third_party/WebKit/public/web/WebElement.h" 20 #include "third_party/WebKit/public/web/WebElement.h"
20 #include "third_party/WebKit/public/web/WebFormElement.h" 21 #include "third_party/WebKit/public/web/WebFormElement.h"
21 #include "third_party/WebKit/public/web/WebInputElement.h" 22 #include "third_party/WebKit/public/web/WebInputElement.h"
22 #include "third_party/WebKit/public/web/WebLocalFrame.h" 23 #include "third_party/WebKit/public/web/WebLocalFrame.h"
23 #include "third_party/WebKit/public/web/WebNode.h" 24 #include "third_party/WebKit/public/web/WebNode.h"
24 #include "third_party/WebKit/public/web/WebView.h" 25 #include "third_party/WebKit/public/web/WebView.h"
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
171 public: 172 public:
172 PasswordAutofillAgentTest() { 173 PasswordAutofillAgentTest() {
173 } 174 }
174 175
175 // Simulates the fill password form message being sent to the renderer. 176 // Simulates the fill password form message being sent to the renderer.
176 // We use that so we don't have to make RenderView::OnFillPasswordForm() 177 // We use that so we don't have to make RenderView::OnFillPasswordForm()
177 // protected. 178 // protected.
178 void SimulateOnFillPasswordForm( 179 void SimulateOnFillPasswordForm(
179 const PasswordFormFillData& fill_data) { 180 const PasswordFormFillData& fill_data) {
180 AutofillMsg_FillPasswordForm msg(0, kPasswordFillFormDataId, fill_data); 181 AutofillMsg_FillPasswordForm msg(0, kPasswordFillFormDataId, fill_data);
181 static_cast<content::RenderViewObserver*>(password_autofill_agent_) 182 static_cast<content::RenderFrameObserver*>(password_autofill_agent_)
182 ->OnMessageReceived(msg); 183 ->OnMessageReceived(msg);
183 } 184 }
184 185
186 // As above, but fills for an iframe.
187 void SimulateOnFillPasswordFormForFrame(
188 WebFrame* frame,
189 const PasswordFormFillData& fill_data) {
190 AutofillMsg_FillPasswordForm msg(0, kPasswordFillFormDataId, fill_data);
191 content::RenderFrame::FromWebFrame(frame)->OnMessageReceived(msg);
192 }
193
185 void SendVisiblePasswordForms() { 194 void SendVisiblePasswordForms() {
186 static_cast<content::RenderViewObserver*>(password_autofill_agent_) 195 static_cast<content::RenderFrameObserver*>(password_autofill_agent_)
187 ->DidFinishLoad(GetMainFrame()); 196 ->DidFinishLoad();
188 } 197 }
189 198
190 void SetUp() override { 199 void SetUp() override {
191 ChromeRenderViewTest::SetUp(); 200 ChromeRenderViewTest::SetUp();
192 201
193 // Add a preferred login and an additional login to the FillData. 202 // Add a preferred login and an additional login to the FillData.
194 username1_ = ASCIIToUTF16(kAliceUsername); 203 username1_ = ASCIIToUTF16(kAliceUsername);
195 password1_ = ASCIIToUTF16(kAlicePassword); 204 password1_ = ASCIIToUTF16(kAlicePassword);
196 username2_ = ASCIIToUTF16(kBobUsername); 205 username2_ = ASCIIToUTF16(kBobUsername);
197 password2_ = ASCIIToUTF16(kBobPassword); 206 password2_ = ASCIIToUTF16(kBobPassword);
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
273 WebFrame* input_frame, 282 WebFrame* input_frame,
274 WebInputElement& input, 283 WebInputElement& input,
275 bool is_user_input) { 284 bool is_user_input) {
276 input.setValue(WebString::fromUTF8(new_value), is_user_input); 285 input.setValue(WebString::fromUTF8(new_value), is_user_input);
277 // The field must have focus or AutofillAgent will think the 286 // The field must have focus or AutofillAgent will think the
278 // change should be ignored. 287 // change should be ignored.
279 while (!input.focused()) 288 while (!input.focused())
280 input_frame->document().frame()->view()->advanceFocus(false); 289 input_frame->document().frame()->view()->advanceFocus(false);
281 if (move_caret_to_end) 290 if (move_caret_to_end)
282 input.setSelectionRange(new_value.length(), new_value.length()); 291 input.setSelectionRange(new_value.length(), new_value.length());
283 if (is_user_input) 292 if (is_user_input) {
284 password_autofill_agent_->FirstUserGestureObserved(); 293 AutofillMsg_FirstUserGestureObservedInTab msg(0);
285 static_cast<blink::WebAutofillClient*>(autofill_agent_) 294 content::RenderFrame::FromWebFrame(input_frame)->OnMessageReceived(msg);
286 ->textFieldDidChange(input); 295
296 // Also pass the message to the testing object.
297 if (input_frame == GetMainFrame())
298 password_autofill_agent_->FirstUserGestureObserved();
299 }
300 input_frame->toWebLocalFrame()->autofillClient()->textFieldDidChange(input);
287 // Processing is delayed because of a Blink bug: 301 // Processing is delayed because of a Blink bug:
288 // https://bugs.webkit.org/show_bug.cgi?id=16976 302 // https://bugs.webkit.org/show_bug.cgi?id=16976
289 // See PasswordAutofillAgent::TextDidChangeInTextField() for details. 303 // See PasswordAutofillAgent::TextDidChangeInTextField() for details.
290 304
291 // Autocomplete will trigger a style recalculation when we put up the next 305 // Autocomplete will trigger a style recalculation when we put up the next
292 // frame, but we don't want to wait that long. Instead, trigger a style 306 // frame, but we don't want to wait that long. Instead, trigger a style
293 // recalcuation manually after TextFieldDidChangeImpl runs. 307 // recalcuation manually after TextFieldDidChangeImpl runs.
294 base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind( 308 base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind(
295 &PasswordAutofillAgentTest::LayoutMainFrame, base::Unretained(this))); 309 &PasswordAutofillAgentTest::LayoutMainFrame, base::Unretained(this)));
296 310
297 base::MessageLoop::current()->RunUntilIdle(); 311 base::MessageLoop::current()->RunUntilIdle();
298 } 312 }
299 313
300 void SimulateSuggestionChoice(WebInputElement& username_input) { 314 void SimulateSuggestionChoice(WebInputElement& username_input) {
301 base::string16 username(base::ASCIIToUTF16(kAliceUsername)); 315 base::string16 username(base::ASCIIToUTF16(kAliceUsername));
302 base::string16 password(base::ASCIIToUTF16(kAlicePassword)); 316 base::string16 password(base::ASCIIToUTF16(kAlicePassword));
303 317
304 // This call is necessary to setup the autofill agent appropriate for the 318 // This call is necessary to setup the autofill agent appropriate for the
305 // user selection; simulates the menu actually popping up. 319 // user selection; simulates the menu actually popping up.
306 render_thread_->sink().ClearMessages(); 320 render_thread_->sink().ClearMessages();
307 static_cast<autofill::PageClickListener*>(autofill_agent_) 321 static_cast<autofill::PageClickListener*>(autofill_agent_)
308 ->FormControlElementClicked(username_input, false); 322 ->FormControlElementClicked(username_input, false);
309 323
310 AutofillMsg_FillPasswordSuggestion msg(0, username, password); 324 AutofillMsg_FillPasswordSuggestion msg(0, username, password);
311 static_cast<content::RenderViewObserver*>(autofill_agent_) 325 static_cast<content::RenderFrameObserver*>(autofill_agent_)
312 ->OnMessageReceived(msg); 326 ->OnMessageReceived(msg);
313 } 327 }
314 328
315 void LayoutMainFrame() { 329 void LayoutMainFrame() {
316 GetMainFrame()->view()->layout(); 330 GetMainFrame()->view()->layout();
317 } 331 }
318 332
319 void SimulateUsernameChange(const std::string& username, 333 void SimulateUsernameChange(const std::string& username,
320 bool move_caret_to_end, 334 bool move_caret_to_end,
321 bool is_user_input = false) { 335 bool is_user_input = false) {
(...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after
848 std::string page_html(kWebpageWithIframeStart); 862 std::string page_html(kWebpageWithIframeStart);
849 page_html += origin; 863 page_html += origin;
850 page_html += kWebpageWithIframeEnd; 864 page_html += kWebpageWithIframeEnd;
851 865
852 LoadHTML(page_html.c_str()); 866 LoadHTML(page_html.c_str());
853 867
854 // Set the expected form origin and action URLs. 868 // Set the expected form origin and action URLs.
855 fill_data_.origin = GURL(origin); 869 fill_data_.origin = GURL(origin);
856 fill_data_.action = GURL(origin); 870 fill_data_.action = GURL(origin);
857 871
858 SimulateOnFillPasswordForm(fill_data_);
859
860 // Retrieve the input elements from the iframe since that is where we want to 872 // Retrieve the input elements from the iframe since that is where we want to
861 // test the autofill. 873 // test the autofill.
862 WebFrame* iframe = GetMainFrame()->findChildByName(kIframeName); 874 WebFrame* iframe = GetMainFrame()->findChildByName(kIframeName);
863 ASSERT_TRUE(iframe); 875 ASSERT_TRUE(iframe);
876
877 SimulateOnFillPasswordFormForFrame(iframe, fill_data_);
878
864 WebDocument document = iframe->document(); 879 WebDocument document = iframe->document();
865 880
866 WebElement username_element = document.getElementById(kUsernameName); 881 WebElement username_element = document.getElementById(kUsernameName);
867 WebElement password_element = document.getElementById(kPasswordName); 882 WebElement password_element = document.getElementById(kPasswordName);
868 ASSERT_FALSE(username_element.isNull()); 883 ASSERT_FALSE(username_element.isNull());
869 ASSERT_FALSE(password_element.isNull()); 884 ASSERT_FALSE(password_element.isNull());
870 885
871 WebInputElement username_input = username_element.to<WebInputElement>(); 886 WebInputElement username_input = username_element.to<WebInputElement>();
872 WebInputElement password_input = password_element.to<WebInputElement>(); 887 WebInputElement password_input = password_element.to<WebInputElement>();
873 ASSERT_FALSE(username_element.isNull()); 888 ASSERT_FALSE(username_element.isNull());
(...skipping 527 matching lines...) Expand 10 before | Expand all | Expand 10 after
1401 RememberLastNonEmptyUsernameAndPasswordOnSubmit_ScriptCleared) { 1416 RememberLastNonEmptyUsernameAndPasswordOnSubmit_ScriptCleared) {
1402 SimulateInputChangeForElement( 1417 SimulateInputChangeForElement(
1403 "temp", true, GetMainFrame(), username_element_, true); 1418 "temp", true, GetMainFrame(), username_element_, true);
1404 SimulateInputChangeForElement( 1419 SimulateInputChangeForElement(
1405 "random", true, GetMainFrame(), password_element_, true); 1420 "random", true, GetMainFrame(), password_element_, true);
1406 1421
1407 // Simulate that the username and the password value was cleared by the 1422 // Simulate that the username and the password value was cleared by the
1408 // site's JavaScript before submit. 1423 // site's JavaScript before submit.
1409 username_element_.setValue(WebString()); 1424 username_element_.setValue(WebString());
1410 password_element_.setValue(WebString()); 1425 password_element_.setValue(WebString());
1411 static_cast<content::RenderViewObserver*>(password_autofill_agent_) 1426 static_cast<content::RenderViewObserver*>(&password_autofill_agent_->legacy_)
1412 ->WillSubmitForm(GetMainFrame(), username_element_.form()); 1427 ->WillSubmitForm(GetMainFrame(), username_element_.form());
1413 1428
1414 // Observe that the PasswordAutofillAgent still remembered the last non-empty 1429 // Observe that the PasswordAutofillAgent still remembered the last non-empty
1415 // username and password and sent that to the browser. 1430 // username and password and sent that to the browser.
1416 ExpectFormSubmittedWithUsernameAndPasswords("temp", "random", ""); 1431 ExpectFormSubmittedWithUsernameAndPasswords("temp", "random", "");
1417 } 1432 }
1418 1433
1419 // Similar to RememberLastNonEmptyPasswordOnSubmit_ScriptCleared, but this time 1434 // Similar to RememberLastNonEmptyPasswordOnSubmit_ScriptCleared, but this time
1420 // it's the user who clears the username and the password. This test checks 1435 // it's the user who clears the username and the password. This test checks
1421 // that in that case, the last non-empty username and password are not 1436 // that in that case, the last non-empty username and password are not
1422 // remembered. 1437 // remembered.
1423 TEST_F(PasswordAutofillAgentTest, 1438 TEST_F(PasswordAutofillAgentTest,
1424 RememberLastNonEmptyUsernameAndPasswordOnSubmit_UserCleared) { 1439 RememberLastNonEmptyUsernameAndPasswordOnSubmit_UserCleared) {
1425 SimulateInputChangeForElement( 1440 SimulateInputChangeForElement(
1426 "temp", true, GetMainFrame(), username_element_, true); 1441 "temp", true, GetMainFrame(), username_element_, true);
1427 SimulateInputChangeForElement( 1442 SimulateInputChangeForElement(
1428 "random", true, GetMainFrame(), password_element_, true); 1443 "random", true, GetMainFrame(), password_element_, true);
1429 1444
1430 // Simulate that the user actually cleared the username and password again. 1445 // Simulate that the user actually cleared the username and password again.
1431 SimulateInputChangeForElement("", true, GetMainFrame(), username_element_, 1446 SimulateInputChangeForElement("", true, GetMainFrame(), username_element_,
1432 true); 1447 true);
1433 SimulateInputChangeForElement( 1448 SimulateInputChangeForElement(
1434 "", true, GetMainFrame(), password_element_, true); 1449 "", true, GetMainFrame(), password_element_, true);
1435 static_cast<content::RenderViewObserver*>(password_autofill_agent_) 1450 static_cast<content::RenderViewObserver*>(&password_autofill_agent_->legacy_)
1436 ->WillSubmitForm(GetMainFrame(), username_element_.form()); 1451 ->WillSubmitForm(GetMainFrame(), username_element_.form());
1437 1452
1438 // Observe that the PasswordAutofillAgent respects the user having cleared the 1453 // Observe that the PasswordAutofillAgent respects the user having cleared the
1439 // password. 1454 // password.
1440 ExpectFormSubmittedWithUsernameAndPasswords("", "", ""); 1455 ExpectFormSubmittedWithUsernameAndPasswords("", "", "");
1441 } 1456 }
1442 1457
1443 // Similar to RememberLastNonEmptyPasswordOnSubmit_ScriptCleared, but uses the 1458 // Similar to RememberLastNonEmptyPasswordOnSubmit_ScriptCleared, but uses the
1444 // new password instead of the current password. 1459 // new password instead of the current password.
1445 TEST_F(PasswordAutofillAgentTest, 1460 TEST_F(PasswordAutofillAgentTest,
1446 RememberLastNonEmptyUsernameAndPasswordOnSubmit_New) { 1461 RememberLastNonEmptyUsernameAndPasswordOnSubmit_New) {
1447 const char kNewPasswordFormHTML[] = 1462 const char kNewPasswordFormHTML[] =
1448 "<FORM name='LoginTestForm'>" 1463 "<FORM name='LoginTestForm'>"
1449 " <INPUT type='text' id='username' autocomplete='username'/>" 1464 " <INPUT type='text' id='username' autocomplete='username'/>"
1450 " <INPUT type='password' id='password' autocomplete='new-password'/>" 1465 " <INPUT type='password' id='password' autocomplete='new-password'/>"
1451 " <INPUT type='submit' value='Login'/>" 1466 " <INPUT type='submit' value='Login'/>"
1452 "</FORM>"; 1467 "</FORM>";
1453 LoadHTML(kNewPasswordFormHTML); 1468 LoadHTML(kNewPasswordFormHTML);
1454 UpdateUsernameAndPasswordElements(); 1469 UpdateUsernameAndPasswordElements();
1455 1470
1456 SimulateInputChangeForElement( 1471 SimulateInputChangeForElement(
1457 "temp", true, GetMainFrame(), username_element_, true); 1472 "temp", true, GetMainFrame(), username_element_, true);
1458 SimulateInputChangeForElement( 1473 SimulateInputChangeForElement(
1459 "random", true, GetMainFrame(), password_element_, true); 1474 "random", true, GetMainFrame(), password_element_, true);
1460 1475
1461 // Simulate that the username and the password value was cleared by 1476 // Simulate that the username and the password value was cleared by
1462 // the site's JavaScript before submit. 1477 // the site's JavaScript before submit.
1463 username_element_.setValue(WebString()); 1478 username_element_.setValue(WebString());
1464 password_element_.setValue(WebString()); 1479 password_element_.setValue(WebString());
1465 static_cast<content::RenderViewObserver*>(password_autofill_agent_) 1480 static_cast<content::RenderViewObserver*>(&password_autofill_agent_->legacy_)
1466 ->WillSubmitForm(GetMainFrame(), username_element_.form()); 1481 ->WillSubmitForm(GetMainFrame(), username_element_.form());
1467 1482
1468 // Observe that the PasswordAutofillAgent still remembered the last non-empty 1483 // Observe that the PasswordAutofillAgent still remembered the last non-empty
1469 // password and sent that to the browser. 1484 // password and sent that to the browser.
1470 ExpectFormSubmittedWithUsernameAndPasswords("temp", "", "random"); 1485 ExpectFormSubmittedWithUsernameAndPasswords("temp", "", "random");
1471 } 1486 }
1472 1487
1473 // The user first accepts a suggestion, but then overwrites the password. This 1488 // The user first accepts a suggestion, but then overwrites the password. This
1474 // test checks that the overwritten password is not reverted back if the user 1489 // test checks that the overwritten password is not reverted back if the user
1475 // triggers autofill through focusing (but not changing) the username again. 1490 // triggers autofill through focusing (but not changing) the username again.
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1522 password_element_, 1537 password_element_,
1523 /*is_user_input=*/true); 1538 /*is_user_input=*/true);
1524 1539
1525 // Simulate the user typing a stored username. 1540 // Simulate the user typing a stored username.
1526 SimulateUsernameChange(kAliceUsername, true); 1541 SimulateUsernameChange(kAliceUsername, true);
1527 // The autofileld password should replace the typed one. 1542 // The autofileld password should replace the typed one.
1528 CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true); 1543 CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true);
1529 } 1544 }
1530 1545
1531 } // namespace autofill 1546 } // namespace autofill
OLDNEW
« no previous file with comments | « chrome/renderer/autofill/autofill_renderer_browsertest.cc ('k') | chrome/renderer/chrome_content_renderer_client.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698