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> | 5 #include <string> |
6 #include <utility> | 6 #include <utility> |
7 | 7 |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/macros.h" | 9 #include "base/macros.h" |
10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
159 explicit ObservingAutofillClient(content::WebContents* web_contents) | 159 explicit ObservingAutofillClient(content::WebContents* web_contents) |
160 : run_loop_(nullptr), popup_shown_(false) {} | 160 : run_loop_(nullptr), popup_shown_(false) {} |
161 friend class content::WebContentsUserData<ObservingAutofillClient>; | 161 friend class content::WebContentsUserData<ObservingAutofillClient>; |
162 | 162 |
163 base::RunLoop* run_loop_; | 163 base::RunLoop* run_loop_; |
164 bool popup_shown_; | 164 bool popup_shown_; |
165 | 165 |
166 DISALLOW_COPY_AND_ASSIGN(ObservingAutofillClient); | 166 DISALLOW_COPY_AND_ASSIGN(ObservingAutofillClient); |
167 }; | 167 }; |
168 | 168 |
169 // For simplicity we assume that password store contains only 1 credential. | |
170 void CheckThatCredentialsStored( | |
171 password_manager::TestPasswordStore* password_store, | |
172 const base::string16& username, | |
173 const base::string16& password) { | |
174 auto& passwords_map = password_store->stored_passwords(); | |
175 ASSERT_EQ(1u, passwords_map.size()); | |
176 auto& passwords_vector = passwords_map.begin()->second; | |
177 ASSERT_EQ(1u, passwords_vector.size()); | |
178 const autofill::PasswordForm& form = passwords_vector[0]; | |
179 EXPECT_EQ(username, form.username_value); | |
180 EXPECT_EQ(password, form.password_value); | |
181 } | |
182 | |
183 void TestPromptNotShown(const char* failure_message, | 169 void TestPromptNotShown(const char* failure_message, |
184 content::WebContents* web_contents, | 170 content::WebContents* web_contents, |
185 content::RenderViewHost* rvh) { | 171 content::RenderViewHost* rvh) { |
186 SCOPED_TRACE(testing::Message(failure_message)); | 172 SCOPED_TRACE(testing::Message(failure_message)); |
187 | 173 |
188 NavigationObserver observer(web_contents); | 174 NavigationObserver observer(web_contents); |
189 std::string fill_and_submit = | 175 std::string fill_and_submit = |
190 "document.getElementById('username_failed').value = 'temp';" | 176 "document.getElementById('username_failed').value = 'temp';" |
191 "document.getElementById('password_failed').value = 'random';" | 177 "document.getElementById('password_failed').value = 'random';" |
192 "document.getElementById('failed_form').submit()"; | 178 "document.getElementById('failed_form').submit()"; |
193 | 179 |
194 ASSERT_TRUE(content::ExecuteScript(rvh, fill_and_submit)); | 180 ASSERT_TRUE(content::ExecuteScript(rvh, fill_and_submit)); |
195 observer.Wait(); | 181 observer.Wait(); |
196 EXPECT_FALSE(BubbleObserver(web_contents).IsShowingSavePrompt()); | 182 EXPECT_FALSE(BubbleObserver(web_contents).WasSavePromptShown()); |
197 } | 183 } |
198 | 184 |
199 } // namespace | 185 } // namespace |
200 | 186 |
201 DEFINE_WEB_CONTENTS_USER_DATA_KEY(ObservingAutofillClient); | 187 DEFINE_WEB_CONTENTS_USER_DATA_KEY(ObservingAutofillClient); |
202 | 188 |
203 namespace password_manager { | 189 namespace password_manager { |
204 | 190 |
205 // Actual tests --------------------------------------------------------------- | 191 // Actual tests --------------------------------------------------------------- |
206 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, PromptForNormalSubmit) { | 192 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, PromptForNormalSubmit) { |
207 NavigateToFile("/password/password_form.html"); | 193 NavigateToFile("/password/password_form.html"); |
208 | 194 |
209 // Fill a form and submit through a <input type="submit"> button. Nothing | 195 // Fill a form and submit through a <input type="submit"> button. Nothing |
210 // special. | 196 // special. |
211 NavigationObserver observer(WebContents()); | 197 NavigationObserver observer(WebContents()); |
212 std::string fill_and_submit = | 198 std::string fill_and_submit = |
213 "document.getElementById('username_field').value = 'temp';" | 199 "document.getElementById('username_field').value = 'temp';" |
214 "document.getElementById('password_field').value = 'random';" | 200 "document.getElementById('password_field').value = 'random';" |
215 "document.getElementById('input_submit_button').click()"; | 201 "document.getElementById('input_submit_button').click()"; |
216 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 202 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
217 observer.Wait(); | 203 observer.Wait(); |
218 | 204 |
219 // Save the password and check the store. | 205 // Save the password and check the store. |
220 BubbleObserver bubble_observer(WebContents()); | 206 BubbleObserver bubble_observer(WebContents()); |
221 EXPECT_TRUE(bubble_observer.IsShowingSavePrompt()); | 207 EXPECT_TRUE(bubble_observer.WasSavePromptShown()); |
222 bubble_observer.AcceptSavePrompt(); | 208 bubble_observer.AcceptSavePrompt(); |
223 WaitForPasswordStore(); | 209 WaitForPasswordStore(); |
224 | 210 |
225 scoped_refptr<password_manager::TestPasswordStore> password_store = | 211 scoped_refptr<password_manager::TestPasswordStore> password_store = |
226 static_cast<password_manager::TestPasswordStore*>( | 212 static_cast<password_manager::TestPasswordStore*>( |
227 PasswordStoreFactory::GetForProfile( | 213 PasswordStoreFactory::GetForProfile( |
228 browser()->profile(), ServiceAccessType::IMPLICIT_ACCESS) | 214 browser()->profile(), ServiceAccessType::IMPLICIT_ACCESS) |
229 .get()); | 215 .get()); |
230 CheckThatCredentialsStored(password_store.get(), base::ASCIIToUTF16("temp"), | 216 CheckThatCredentialsStored(password_store.get(), base::ASCIIToUTF16("temp"), |
231 base::ASCIIToUTF16("random")); | 217 base::ASCIIToUTF16("random")); |
(...skipping 30 matching lines...) Expand all Loading... |
262 // should not send "PasswordFormsParsed" messages after the page was loaded. | 248 // should not send "PasswordFormsParsed" messages after the page was loaded. |
263 NavigationObserver observer(WebContents()); | 249 NavigationObserver observer(WebContents()); |
264 std::string fill_and_submit = | 250 std::string fill_and_submit = |
265 "document.getElementById('username_field').value = 'temp';" | 251 "document.getElementById('username_field').value = 'temp';" |
266 "document.getElementById('password_field').value = 'random';" | 252 "document.getElementById('password_field').value = 'random';" |
267 "document.getElementById('input_submit_button').click()"; | 253 "document.getElementById('input_submit_button').click()"; |
268 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 254 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
269 observer.Wait(); | 255 observer.Wait(); |
270 std::unique_ptr<BubbleObserver> prompt_observer( | 256 std::unique_ptr<BubbleObserver> prompt_observer( |
271 new BubbleObserver(WebContents())); | 257 new BubbleObserver(WebContents())); |
272 EXPECT_FALSE(prompt_observer->IsShowingSavePrompt()); | 258 EXPECT_FALSE(prompt_observer->WasSavePromptShown()); |
273 } | 259 } |
274 | 260 |
275 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 261 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
276 PromptForSubmitWithInPageNavigation) { | 262 PromptForSubmitWithInPageNavigation) { |
277 NavigateToFile("/password/password_navigate_before_submit.html"); | 263 NavigateToFile("/password/password_navigate_before_submit.html"); |
278 | 264 |
279 // Fill a form and submit through a <input type="submit"> button. Nothing | 265 // Fill a form and submit through a <input type="submit"> button. Nothing |
280 // special. The form does an in-page navigation before submitting. | 266 // special. The form does an in-page navigation before submitting. |
281 NavigationObserver observer(WebContents()); | 267 NavigationObserver observer(WebContents()); |
282 std::unique_ptr<BubbleObserver> prompt_observer( | 268 std::unique_ptr<BubbleObserver> prompt_observer( |
283 new BubbleObserver(WebContents())); | 269 new BubbleObserver(WebContents())); |
284 std::string fill_and_submit = | 270 std::string fill_and_submit = |
285 "document.getElementById('username_field').value = 'temp';" | 271 "document.getElementById('username_field').value = 'temp';" |
286 "document.getElementById('password_field').value = 'random';" | 272 "document.getElementById('password_field').value = 'random';" |
287 "document.getElementById('input_submit_button').click()"; | 273 "document.getElementById('input_submit_button').click()"; |
288 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 274 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
289 observer.Wait(); | 275 observer.Wait(); |
290 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 276 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
291 } | 277 } |
292 | 278 |
293 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 279 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
294 LoginSuccessWithUnrelatedForm) { | 280 LoginSuccessWithUnrelatedForm) { |
295 // Log in, see a form on the landing page. That form is not related to the | 281 // Log in, see a form on the landing page. That form is not related to the |
296 // login form (=has a different action), so we should offer saving the | 282 // login form (=has a different action), so we should offer saving the |
297 // password. | 283 // password. |
298 NavigateToFile("/password/password_form.html"); | 284 NavigateToFile("/password/password_form.html"); |
299 | 285 |
300 NavigationObserver observer(WebContents()); | 286 NavigationObserver observer(WebContents()); |
301 std::unique_ptr<BubbleObserver> prompt_observer( | 287 std::unique_ptr<BubbleObserver> prompt_observer( |
302 new BubbleObserver(WebContents())); | 288 new BubbleObserver(WebContents())); |
303 std::string fill_and_submit = | 289 std::string fill_and_submit = |
304 "document.getElementById('username_unrelated').value = 'temp';" | 290 "document.getElementById('username_unrelated').value = 'temp';" |
305 "document.getElementById('password_unrelated').value = 'random';" | 291 "document.getElementById('password_unrelated').value = 'random';" |
306 "document.getElementById('submit_unrelated').click()"; | 292 "document.getElementById('submit_unrelated').click()"; |
307 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 293 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
308 observer.Wait(); | 294 observer.Wait(); |
309 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 295 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
310 } | 296 } |
311 | 297 |
312 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, LoginFailed) { | 298 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, LoginFailed) { |
313 // Log in, see a form on the landing page. That form is not related to the | 299 // Log in, see a form on the landing page. That form is not related to the |
314 // login form (=has a different action), so we should offer saving the | 300 // login form (=has a different action), so we should offer saving the |
315 // password. | 301 // password. |
316 NavigateToFile("/password/password_form.html"); | 302 NavigateToFile("/password/password_form.html"); |
317 | 303 |
318 NavigationObserver observer(WebContents()); | 304 NavigationObserver observer(WebContents()); |
319 std::unique_ptr<BubbleObserver> prompt_observer( | 305 std::unique_ptr<BubbleObserver> prompt_observer( |
320 new BubbleObserver(WebContents())); | 306 new BubbleObserver(WebContents())); |
321 std::string fill_and_submit = | 307 std::string fill_and_submit = |
322 "document.getElementById('username_failed').value = 'temp';" | 308 "document.getElementById('username_failed').value = 'temp';" |
323 "document.getElementById('password_failed').value = 'random';" | 309 "document.getElementById('password_failed').value = 'random';" |
324 "document.getElementById('submit_failed').click()"; | 310 "document.getElementById('submit_failed').click()"; |
325 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 311 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
326 observer.Wait(); | 312 observer.Wait(); |
327 EXPECT_FALSE(prompt_observer->IsShowingSavePrompt()); | 313 EXPECT_FALSE(prompt_observer->WasSavePromptShown()); |
328 } | 314 } |
329 | 315 |
330 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, Redirects) { | 316 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, Redirects) { |
331 NavigateToFile("/password/password_form.html"); | 317 NavigateToFile("/password/password_form.html"); |
332 | 318 |
333 // Fill a form and submit through a <input type="submit"> button. The form | 319 // Fill a form and submit through a <input type="submit"> button. The form |
334 // points to a redirection page. | 320 // points to a redirection page. |
335 NavigationObserver observer1(WebContents()); | 321 NavigationObserver observer1(WebContents()); |
336 std::string fill_and_submit = | 322 std::string fill_and_submit = |
337 "document.getElementById('username_redirect').value = 'temp';" | 323 "document.getElementById('username_redirect').value = 'temp';" |
338 "document.getElementById('password_redirect').value = 'random';" | 324 "document.getElementById('password_redirect').value = 'random';" |
339 "document.getElementById('submit_redirect').click()"; | 325 "document.getElementById('submit_redirect').click()"; |
340 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 326 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
341 observer1.Wait(); | 327 observer1.Wait(); |
342 BubbleObserver bubble_observer(WebContents()); | 328 BubbleObserver bubble_observer(WebContents()); |
343 EXPECT_TRUE(bubble_observer.IsShowingSavePrompt()); | 329 EXPECT_TRUE(bubble_observer.WasSavePromptShown()); |
344 | 330 |
345 // The redirection page now redirects via Javascript. We check that the | 331 // The redirection page now redirects via Javascript. We check that the |
346 // bubble stays. | 332 // bubble stays. |
347 NavigationObserver observer2(WebContents()); | 333 NavigationObserver observer2(WebContents()); |
348 ASSERT_TRUE(content::ExecuteScriptWithoutUserGesture( | 334 ASSERT_TRUE(content::ExecuteScriptWithoutUserGesture( |
349 RenderFrameHost(), "window.location.href = 'done.html';")); | 335 RenderFrameHost(), "window.location.href = 'done.html';")); |
350 observer2.Wait(); | 336 observer2.Wait(); |
351 EXPECT_TRUE(bubble_observer.IsShowingSavePrompt()); | 337 EXPECT_TRUE(bubble_observer.WasSavePromptShown()); |
352 } | 338 } |
353 | 339 |
354 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 340 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
355 PromptForSubmitUsingJavaScript) { | 341 PromptForSubmitUsingJavaScript) { |
356 NavigateToFile("/password/password_form.html"); | 342 NavigateToFile("/password/password_form.html"); |
357 | 343 |
358 // Fill a form and submit using <button> that calls submit() on the form. | 344 // Fill a form and submit using <button> that calls submit() on the form. |
359 // This should work regardless of the type of element, as long as submit() is | 345 // This should work regardless of the type of element, as long as submit() is |
360 // called. | 346 // called. |
361 NavigationObserver observer(WebContents()); | 347 NavigationObserver observer(WebContents()); |
362 std::unique_ptr<BubbleObserver> prompt_observer( | 348 std::unique_ptr<BubbleObserver> prompt_observer( |
363 new BubbleObserver(WebContents())); | 349 new BubbleObserver(WebContents())); |
364 std::string fill_and_submit = | 350 std::string fill_and_submit = |
365 "document.getElementById('username_field').value = 'temp';" | 351 "document.getElementById('username_field').value = 'temp';" |
366 "document.getElementById('password_field').value = 'random';" | 352 "document.getElementById('password_field').value = 'random';" |
367 "document.getElementById('submit_button').click()"; | 353 "document.getElementById('submit_button').click()"; |
368 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 354 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
369 observer.Wait(); | 355 observer.Wait(); |
370 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 356 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
371 } | 357 } |
372 | 358 |
373 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, PromptForDynamicForm) { | 359 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, PromptForDynamicForm) { |
374 // Adding a PSL matching form is a workaround explained later. | 360 // Adding a PSL matching form is a workaround explained later. |
375 scoped_refptr<password_manager::TestPasswordStore> password_store = | 361 scoped_refptr<password_manager::TestPasswordStore> password_store = |
376 static_cast<password_manager::TestPasswordStore*>( | 362 static_cast<password_manager::TestPasswordStore*>( |
377 PasswordStoreFactory::GetForProfile( | 363 PasswordStoreFactory::GetForProfile( |
378 browser()->profile(), ServiceAccessType::IMPLICIT_ACCESS) | 364 browser()->profile(), ServiceAccessType::IMPLICIT_ACCESS) |
379 .get()); | 365 .get()); |
380 autofill::PasswordForm signin_form; | 366 autofill::PasswordForm signin_form; |
(...skipping 20 matching lines...) Expand all Loading... |
401 | 387 |
402 // Fill the dynamic password form and submit. | 388 // Fill the dynamic password form and submit. |
403 NavigationObserver observer(WebContents()); | 389 NavigationObserver observer(WebContents()); |
404 std::string fill_and_submit = | 390 std::string fill_and_submit = |
405 "document.dynamic_form.username.value = 'tempro';" | 391 "document.dynamic_form.username.value = 'tempro';" |
406 "document.dynamic_form.password.value = 'random';" | 392 "document.dynamic_form.password.value = 'random';" |
407 "document.dynamic_form.submit()"; | 393 "document.dynamic_form.submit()"; |
408 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 394 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
409 observer.Wait(); | 395 observer.Wait(); |
410 | 396 |
411 EXPECT_TRUE(BubbleObserver(WebContents()).IsShowingSavePrompt()); | 397 EXPECT_TRUE(BubbleObserver(WebContents()).WasSavePromptShown()); |
412 } | 398 } |
413 | 399 |
414 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, NoPromptForNavigation) { | 400 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, NoPromptForNavigation) { |
415 NavigateToFile("/password/password_form.html"); | 401 NavigateToFile("/password/password_form.html"); |
416 | 402 |
417 // Don't fill the password form, just navigate away. Shouldn't prompt. | 403 // Don't fill the password form, just navigate away. Shouldn't prompt. |
418 NavigationObserver observer(WebContents()); | 404 NavigationObserver observer(WebContents()); |
419 std::unique_ptr<BubbleObserver> prompt_observer( | 405 std::unique_ptr<BubbleObserver> prompt_observer( |
420 new BubbleObserver(WebContents())); | 406 new BubbleObserver(WebContents())); |
421 ASSERT_TRUE(content::ExecuteScriptWithoutUserGesture( | 407 ASSERT_TRUE(content::ExecuteScriptWithoutUserGesture( |
422 RenderFrameHost(), "window.location.href = 'done.html';")); | 408 RenderFrameHost(), "window.location.href = 'done.html';")); |
423 observer.Wait(); | 409 observer.Wait(); |
424 EXPECT_FALSE(prompt_observer->IsShowingSavePrompt()); | 410 EXPECT_FALSE(prompt_observer->WasSavePromptShown()); |
425 } | 411 } |
426 | 412 |
427 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 413 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
428 NoPromptForSubFrameNavigation) { | 414 NoPromptForSubFrameNavigation) { |
429 NavigateToFile("/password/multi_frames.html"); | 415 NavigateToFile("/password/multi_frames.html"); |
430 | 416 |
431 // If you are filling out a password form in one frame and a different frame | 417 // If you are filling out a password form in one frame and a different frame |
432 // navigates, this should not trigger the infobar. | 418 // navigates, this should not trigger the infobar. |
433 NavigationObserver observer(WebContents()); | 419 NavigationObserver observer(WebContents()); |
434 std::unique_ptr<BubbleObserver> prompt_observer( | 420 std::unique_ptr<BubbleObserver> prompt_observer( |
435 new BubbleObserver(WebContents())); | 421 new BubbleObserver(WebContents())); |
436 observer.SetPathToWaitFor("/password/done.html"); | 422 observer.SetPathToWaitFor("/password/done.html"); |
437 std::string fill = | 423 std::string fill = |
438 "var first_frame = document.getElementById('first_frame');" | 424 "var first_frame = document.getElementById('first_frame');" |
439 "var frame_doc = first_frame.contentDocument;" | 425 "var frame_doc = first_frame.contentDocument;" |
440 "frame_doc.getElementById('username_field').value = 'temp';" | 426 "frame_doc.getElementById('username_field').value = 'temp';" |
441 "frame_doc.getElementById('password_field').value = 'random';"; | 427 "frame_doc.getElementById('password_field').value = 'random';"; |
442 std::string navigate_frame = | 428 std::string navigate_frame = |
443 "var second_iframe = document.getElementById('second_frame');" | 429 "var second_iframe = document.getElementById('second_frame');" |
444 "second_iframe.contentWindow.location.href = 'done.html';"; | 430 "second_iframe.contentWindow.location.href = 'done.html';"; |
445 | 431 |
446 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill)); | 432 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill)); |
447 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), navigate_frame)); | 433 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), navigate_frame)); |
448 observer.Wait(); | 434 observer.Wait(); |
449 EXPECT_FALSE(prompt_observer->IsShowingSavePrompt()); | 435 EXPECT_FALSE(prompt_observer->WasSavePromptShown()); |
450 } | 436 } |
451 | 437 |
452 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 438 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
453 PromptAfterSubmitWithSubFrameNavigation) { | 439 PromptAfterSubmitWithSubFrameNavigation) { |
454 NavigateToFile("/password/multi_frames.html"); | 440 NavigateToFile("/password/multi_frames.html"); |
455 | 441 |
456 // Make sure that we prompt to save password even if a sub-frame navigation | 442 // Make sure that we prompt to save password even if a sub-frame navigation |
457 // happens first. | 443 // happens first. |
458 NavigationObserver observer(WebContents()); | 444 NavigationObserver observer(WebContents()); |
459 std::unique_ptr<BubbleObserver> prompt_observer( | 445 std::unique_ptr<BubbleObserver> prompt_observer( |
460 new BubbleObserver(WebContents())); | 446 new BubbleObserver(WebContents())); |
461 observer.SetPathToWaitFor("/password/done.html"); | 447 observer.SetPathToWaitFor("/password/done.html"); |
462 std::string navigate_frame = | 448 std::string navigate_frame = |
463 "var second_iframe = document.getElementById('second_frame');" | 449 "var second_iframe = document.getElementById('second_frame');" |
464 "second_iframe.contentWindow.location.href = 'other.html';"; | 450 "second_iframe.contentWindow.location.href = 'other.html';"; |
465 std::string fill_and_submit = | 451 std::string fill_and_submit = |
466 "var first_frame = document.getElementById('first_frame');" | 452 "var first_frame = document.getElementById('first_frame');" |
467 "var frame_doc = first_frame.contentDocument;" | 453 "var frame_doc = first_frame.contentDocument;" |
468 "frame_doc.getElementById('username_field').value = 'temp';" | 454 "frame_doc.getElementById('username_field').value = 'temp';" |
469 "frame_doc.getElementById('password_field').value = 'random';" | 455 "frame_doc.getElementById('password_field').value = 'random';" |
470 "frame_doc.getElementById('input_submit_button').click();"; | 456 "frame_doc.getElementById('input_submit_button').click();"; |
471 | 457 |
472 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), navigate_frame)); | 458 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), navigate_frame)); |
473 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 459 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
474 observer.Wait(); | 460 observer.Wait(); |
475 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 461 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
476 } | 462 } |
477 | 463 |
478 IN_PROC_BROWSER_TEST_F( | 464 IN_PROC_BROWSER_TEST_F( |
479 PasswordManagerBrowserTestBase, | 465 PasswordManagerBrowserTestBase, |
480 NoPromptForFailedLoginFromMainFrameWithMultiFramesInPage) { | 466 NoPromptForFailedLoginFromMainFrameWithMultiFramesInPage) { |
481 NavigateToFile("/password/multi_frames.html"); | 467 NavigateToFile("/password/multi_frames.html"); |
482 | 468 |
483 // Make sure that we don't prompt to save the password for a failed login | 469 // Make sure that we don't prompt to save the password for a failed login |
484 // from the main frame with multiple frames in the same page. | 470 // from the main frame with multiple frames in the same page. |
485 NavigationObserver observer(WebContents()); | 471 NavigationObserver observer(WebContents()); |
486 std::unique_ptr<BubbleObserver> prompt_observer( | 472 std::unique_ptr<BubbleObserver> prompt_observer( |
487 new BubbleObserver(WebContents())); | 473 new BubbleObserver(WebContents())); |
488 std::string fill_and_submit = | 474 std::string fill_and_submit = |
489 "document.getElementById('username_failed').value = 'temp';" | 475 "document.getElementById('username_failed').value = 'temp';" |
490 "document.getElementById('password_failed').value = 'random';" | 476 "document.getElementById('password_failed').value = 'random';" |
491 "document.getElementById('submit_failed').click();"; | 477 "document.getElementById('submit_failed').click();"; |
492 | 478 |
493 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 479 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
494 observer.Wait(); | 480 observer.Wait(); |
495 EXPECT_FALSE(prompt_observer->IsShowingSavePrompt()); | 481 EXPECT_FALSE(prompt_observer->WasSavePromptShown()); |
496 } | 482 } |
497 | 483 |
498 IN_PROC_BROWSER_TEST_F( | 484 IN_PROC_BROWSER_TEST_F( |
499 PasswordManagerBrowserTestBase, | 485 PasswordManagerBrowserTestBase, |
500 NoPromptForFailedLoginFromSubFrameWithMultiFramesInPage) { | 486 NoPromptForFailedLoginFromSubFrameWithMultiFramesInPage) { |
501 NavigateToFile("/password/multi_frames.html"); | 487 NavigateToFile("/password/multi_frames.html"); |
502 | 488 |
503 // Make sure that we don't prompt to save the password for a failed login | 489 // Make sure that we don't prompt to save the password for a failed login |
504 // from a sub-frame with multiple frames in the same page. | 490 // from a sub-frame with multiple frames in the same page. |
505 NavigationObserver observer(WebContents()); | 491 NavigationObserver observer(WebContents()); |
506 std::unique_ptr<BubbleObserver> prompt_observer( | 492 std::unique_ptr<BubbleObserver> prompt_observer( |
507 new BubbleObserver(WebContents())); | 493 new BubbleObserver(WebContents())); |
508 std::string fill_and_submit = | 494 std::string fill_and_submit = |
509 "var first_frame = document.getElementById('first_frame');" | 495 "var first_frame = document.getElementById('first_frame');" |
510 "var frame_doc = first_frame.contentDocument;" | 496 "var frame_doc = first_frame.contentDocument;" |
511 "frame_doc.getElementById('username_failed').value = 'temp';" | 497 "frame_doc.getElementById('username_failed').value = 'temp';" |
512 "frame_doc.getElementById('password_failed').value = 'random';" | 498 "frame_doc.getElementById('password_failed').value = 'random';" |
513 "frame_doc.getElementById('submit_failed').click();"; | 499 "frame_doc.getElementById('submit_failed').click();"; |
514 | 500 |
515 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 501 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
516 observer.SetPathToWaitFor("/password/failed.html"); | 502 observer.SetPathToWaitFor("/password/failed.html"); |
517 observer.Wait(); | 503 observer.Wait(); |
518 EXPECT_FALSE(prompt_observer->IsShowingSavePrompt()); | 504 EXPECT_FALSE(prompt_observer->WasSavePromptShown()); |
519 } | 505 } |
520 | 506 |
521 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, PromptForXHRSubmit) { | 507 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, PromptForXHRSubmit) { |
522 NavigateToFile("/password/password_xhr_submit.html"); | 508 NavigateToFile("/password/password_xhr_submit.html"); |
523 | 509 |
524 // Verify that we show the save password prompt if a form returns false | 510 // Verify that we show the save password prompt if a form returns false |
525 // in its onsubmit handler but instead logs in/navigates via XHR. | 511 // in its onsubmit handler but instead logs in/navigates via XHR. |
526 // Note that calling 'submit()' on a form with javascript doesn't call | 512 // Note that calling 'submit()' on a form with javascript doesn't call |
527 // the onsubmit handler, so we click the submit button instead. | 513 // the onsubmit handler, so we click the submit button instead. |
528 NavigationObserver observer(WebContents()); | 514 NavigationObserver observer(WebContents()); |
529 std::unique_ptr<BubbleObserver> prompt_observer( | 515 std::unique_ptr<BubbleObserver> prompt_observer( |
530 new BubbleObserver(WebContents())); | 516 new BubbleObserver(WebContents())); |
531 std::string fill_and_submit = | 517 std::string fill_and_submit = |
532 "document.getElementById('username_field').value = 'temp';" | 518 "document.getElementById('username_field').value = 'temp';" |
533 "document.getElementById('password_field').value = 'random';" | 519 "document.getElementById('password_field').value = 'random';" |
534 "document.getElementById('submit_button').click()"; | 520 "document.getElementById('submit_button').click()"; |
535 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 521 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
536 observer.Wait(); | 522 observer.Wait(); |
537 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 523 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
538 } | 524 } |
539 | 525 |
540 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 526 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
541 PromptForXHRWithoutOnSubmit) { | 527 PromptForXHRWithoutOnSubmit) { |
542 NavigateToFile("/password/password_xhr_submit.html"); | 528 NavigateToFile("/password/password_xhr_submit.html"); |
543 | 529 |
544 // Verify that if XHR navigation occurs and the form is properly filled out, | 530 // Verify that if XHR navigation occurs and the form is properly filled out, |
545 // we try and save the password even though onsubmit hasn't been called. | 531 // we try and save the password even though onsubmit hasn't been called. |
546 NavigationObserver observer(WebContents()); | 532 NavigationObserver observer(WebContents()); |
547 std::unique_ptr<BubbleObserver> prompt_observer( | 533 std::unique_ptr<BubbleObserver> prompt_observer( |
548 new BubbleObserver(WebContents())); | 534 new BubbleObserver(WebContents())); |
549 std::string fill_and_navigate = | 535 std::string fill_and_navigate = |
550 "document.getElementById('username_field').value = 'temp';" | 536 "document.getElementById('username_field').value = 'temp';" |
551 "document.getElementById('password_field').value = 'random';" | 537 "document.getElementById('password_field').value = 'random';" |
552 "send_xhr()"; | 538 "send_xhr()"; |
553 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_navigate)); | 539 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_navigate)); |
554 observer.Wait(); | 540 observer.Wait(); |
555 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 541 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
556 } | 542 } |
557 | 543 |
558 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 544 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
559 PromptForXHRWithNewPasswordsWithoutOnSubmit) { | 545 PromptForXHRWithNewPasswordsWithoutOnSubmit) { |
560 NavigateToFile("/password/password_xhr_submit.html"); | 546 NavigateToFile("/password/password_xhr_submit.html"); |
561 | 547 |
562 // Verify that if XHR navigation occurs and the form is properly filled out, | 548 // Verify that if XHR navigation occurs and the form is properly filled out, |
563 // we try and save the password even though onsubmit hasn't been called. | 549 // we try and save the password even though onsubmit hasn't been called. |
564 // Specifically verify that the password form saving new passwords is treated | 550 // Specifically verify that the password form saving new passwords is treated |
565 // the same as a login form. | 551 // the same as a login form. |
566 NavigationObserver observer(WebContents()); | 552 NavigationObserver observer(WebContents()); |
567 std::unique_ptr<BubbleObserver> prompt_observer( | 553 std::unique_ptr<BubbleObserver> prompt_observer( |
568 new BubbleObserver(WebContents())); | 554 new BubbleObserver(WebContents())); |
569 std::string fill_and_navigate = | 555 std::string fill_and_navigate = |
570 "document.getElementById('signup_username_field').value = 'temp';" | 556 "document.getElementById('signup_username_field').value = 'temp';" |
571 "document.getElementById('signup_password_field').value = 'random';" | 557 "document.getElementById('signup_password_field').value = 'random';" |
572 "document.getElementById('confirmation_password_field').value = 'random';" | 558 "document.getElementById('confirmation_password_field').value = 'random';" |
573 "send_xhr()"; | 559 "send_xhr()"; |
574 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_navigate)); | 560 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_navigate)); |
575 observer.Wait(); | 561 observer.Wait(); |
576 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 562 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
577 } | 563 } |
578 | 564 |
579 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 565 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
580 PromptForXHRSubmitWithoutNavigation) { | 566 PromptForXHRSubmitWithoutNavigation) { |
581 NavigateToFile("/password/password_xhr_submit.html"); | 567 NavigateToFile("/password/password_xhr_submit.html"); |
582 | 568 |
583 // Need to pay attention for a message that XHR has finished since there | 569 // Need to pay attention for a message that XHR has finished since there |
584 // is no navigation to wait for. | 570 // is no navigation to wait for. |
585 content::DOMMessageQueue message_queue; | 571 content::DOMMessageQueue message_queue; |
586 | 572 |
587 // Verify that if XHR without navigation occurs and the form has been filled | 573 // Verify that if XHR without navigation occurs and the form has been filled |
588 // out we try and save the password. Note that in general the submission | 574 // out we try and save the password. Note that in general the submission |
589 // doesn't need to be via form.submit(), but for testing purposes it's | 575 // doesn't need to be via form.submit(), but for testing purposes it's |
590 // necessary since we otherwise ignore changes made to the value of these | 576 // necessary since we otherwise ignore changes made to the value of these |
591 // fields by script. | 577 // fields by script. |
592 std::unique_ptr<BubbleObserver> prompt_observer( | 578 std::unique_ptr<BubbleObserver> prompt_observer( |
593 new BubbleObserver(WebContents())); | 579 new BubbleObserver(WebContents())); |
594 std::string fill_and_submit = | 580 std::string fill_and_submit = |
595 "navigate = false;" | 581 "navigate = false;" |
596 "document.getElementById('username_field').value = 'temp';" | 582 "document.getElementById('username_field').value = 'temp';" |
597 "document.getElementById('password_field').value = 'random';" | 583 "document.getElementById('password_field').value = 'random';" |
598 "document.getElementById('submit_button').click();"; | 584 "document.getElementById('submit_button').click();"; |
599 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 585 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
600 std::string message; | 586 std::string message; |
601 while (message_queue.WaitForMessage(&message)) { | 587 while (message_queue.WaitForMessage(&message)) { |
602 if (message == "\"XHR_FINISHED\"") | 588 if (message == "\"XHR_FINISHED\"") |
603 break; | 589 break; |
604 } | 590 } |
605 | 591 |
606 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 592 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
607 } | 593 } |
608 | 594 |
609 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 595 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
610 PromptForXHRSubmitWithoutNavigation_SignupForm) { | 596 PromptForXHRSubmitWithoutNavigation_SignupForm) { |
611 NavigateToFile("/password/password_xhr_submit.html"); | 597 NavigateToFile("/password/password_xhr_submit.html"); |
612 | 598 |
613 // Need to pay attention for a message that XHR has finished since there | 599 // Need to pay attention for a message that XHR has finished since there |
614 // is no navigation to wait for. | 600 // is no navigation to wait for. |
615 content::DOMMessageQueue message_queue; | 601 content::DOMMessageQueue message_queue; |
616 | 602 |
(...skipping 10 matching lines...) Expand all Loading... |
627 "document.getElementById('signup_password_field').value = 'random';" | 613 "document.getElementById('signup_password_field').value = 'random';" |
628 "document.getElementById('confirmation_password_field').value = 'random';" | 614 "document.getElementById('confirmation_password_field').value = 'random';" |
629 "document.getElementById('signup_submit_button').click();"; | 615 "document.getElementById('signup_submit_button').click();"; |
630 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 616 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
631 std::string message; | 617 std::string message; |
632 while (message_queue.WaitForMessage(&message)) { | 618 while (message_queue.WaitForMessage(&message)) { |
633 if (message == "\"XHR_FINISHED\"") | 619 if (message == "\"XHR_FINISHED\"") |
634 break; | 620 break; |
635 } | 621 } |
636 | 622 |
637 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 623 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
638 } | 624 } |
639 | 625 |
640 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 626 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
641 NoPromptForXHRSubmitWithoutNavigationWithUnfilledForm) { | 627 NoPromptForXHRSubmitWithoutNavigationWithUnfilledForm) { |
642 NavigateToFile("/password/password_xhr_submit.html"); | 628 NavigateToFile("/password/password_xhr_submit.html"); |
643 | 629 |
644 // Need to pay attention for a message that XHR has finished since there | 630 // Need to pay attention for a message that XHR has finished since there |
645 // is no navigation to wait for. | 631 // is no navigation to wait for. |
646 content::DOMMessageQueue message_queue; | 632 content::DOMMessageQueue message_queue; |
647 | 633 |
648 // Verify that if XHR without navigation occurs and the form has NOT been | 634 // Verify that if XHR without navigation occurs and the form has NOT been |
649 // filled out we don't prompt. | 635 // filled out we don't prompt. |
650 std::unique_ptr<BubbleObserver> prompt_observer( | 636 std::unique_ptr<BubbleObserver> prompt_observer( |
651 new BubbleObserver(WebContents())); | 637 new BubbleObserver(WebContents())); |
652 std::string fill_and_submit = | 638 std::string fill_and_submit = |
653 "navigate = false;" | 639 "navigate = false;" |
654 "document.getElementById('username_field').value = 'temp';" | 640 "document.getElementById('username_field').value = 'temp';" |
655 "document.getElementById('submit_button').click();"; | 641 "document.getElementById('submit_button').click();"; |
656 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 642 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
657 std::string message; | 643 std::string message; |
658 while (message_queue.WaitForMessage(&message)) { | 644 while (message_queue.WaitForMessage(&message)) { |
659 if (message == "\"XHR_FINISHED\"") | 645 if (message == "\"XHR_FINISHED\"") |
660 break; | 646 break; |
661 } | 647 } |
662 | 648 |
663 EXPECT_FALSE(prompt_observer->IsShowingSavePrompt()); | 649 EXPECT_FALSE(prompt_observer->WasSavePromptShown()); |
664 } | 650 } |
665 | 651 |
666 IN_PROC_BROWSER_TEST_F( | 652 IN_PROC_BROWSER_TEST_F( |
667 PasswordManagerBrowserTestBase, | 653 PasswordManagerBrowserTestBase, |
668 NoPromptForXHRSubmitWithoutNavigationWithUnfilledForm_SignupForm) { | 654 NoPromptForXHRSubmitWithoutNavigationWithUnfilledForm_SignupForm) { |
669 NavigateToFile("/password/password_xhr_submit.html"); | 655 NavigateToFile("/password/password_xhr_submit.html"); |
670 | 656 |
671 // Need to pay attention for a message that XHR has finished since there | 657 // Need to pay attention for a message that XHR has finished since there |
672 // is no navigation to wait for. | 658 // is no navigation to wait for. |
673 content::DOMMessageQueue message_queue; | 659 content::DOMMessageQueue message_queue; |
674 | 660 |
675 // Verify that if XHR without navigation occurs and the form has NOT been | 661 // Verify that if XHR without navigation occurs and the form has NOT been |
676 // filled out we don't prompt. | 662 // filled out we don't prompt. |
677 std::unique_ptr<BubbleObserver> prompt_observer( | 663 std::unique_ptr<BubbleObserver> prompt_observer( |
678 new BubbleObserver(WebContents())); | 664 new BubbleObserver(WebContents())); |
679 std::string fill_and_submit = | 665 std::string fill_and_submit = |
680 "navigate = false;" | 666 "navigate = false;" |
681 "document.getElementById('signup_username_field').value = 'temp';" | 667 "document.getElementById('signup_username_field').value = 'temp';" |
682 "document.getElementById('signup_submit_button').click();"; | 668 "document.getElementById('signup_submit_button').click();"; |
683 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 669 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
684 std::string message; | 670 std::string message; |
685 while (message_queue.WaitForMessage(&message)) { | 671 while (message_queue.WaitForMessage(&message)) { |
686 if (message == "\"XHR_FINISHED\"") | 672 if (message == "\"XHR_FINISHED\"") |
687 break; | 673 break; |
688 } | 674 } |
689 | 675 |
690 EXPECT_FALSE(prompt_observer->IsShowingSavePrompt()); | 676 EXPECT_FALSE(prompt_observer->WasSavePromptShown()); |
691 } | 677 } |
692 | 678 |
693 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, PromptForFetchSubmit) { | 679 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, PromptForFetchSubmit) { |
694 NavigateToFile("/password/password_fetch_submit.html"); | 680 NavigateToFile("/password/password_fetch_submit.html"); |
695 | 681 |
696 // Verify that we show the save password prompt if a form returns false | 682 // Verify that we show the save password prompt if a form returns false |
697 // in its onsubmit handler but instead logs in/navigates via Fetch. | 683 // in its onsubmit handler but instead logs in/navigates via Fetch. |
698 // Note that calling 'submit()' on a form with javascript doesn't call | 684 // Note that calling 'submit()' on a form with javascript doesn't call |
699 // the onsubmit handler, so we click the submit button instead. | 685 // the onsubmit handler, so we click the submit button instead. |
700 NavigationObserver observer(WebContents()); | 686 NavigationObserver observer(WebContents()); |
701 std::unique_ptr<BubbleObserver> prompt_observer( | 687 std::unique_ptr<BubbleObserver> prompt_observer( |
702 new BubbleObserver(WebContents())); | 688 new BubbleObserver(WebContents())); |
703 std::string fill_and_submit = | 689 std::string fill_and_submit = |
704 "document.getElementById('username_field').value = 'temp';" | 690 "document.getElementById('username_field').value = 'temp';" |
705 "document.getElementById('password_field').value = 'random';" | 691 "document.getElementById('password_field').value = 'random';" |
706 "document.getElementById('submit_button').click()"; | 692 "document.getElementById('submit_button').click()"; |
707 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 693 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
708 observer.Wait(); | 694 observer.Wait(); |
709 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 695 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
710 } | 696 } |
711 | 697 |
712 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 698 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
713 PromptForFetchWithoutOnSubmit) { | 699 PromptForFetchWithoutOnSubmit) { |
714 NavigateToFile("/password/password_fetch_submit.html"); | 700 NavigateToFile("/password/password_fetch_submit.html"); |
715 | 701 |
716 // Verify that if Fetch navigation occurs and the form is properly filled out, | 702 // Verify that if Fetch navigation occurs and the form is properly filled out, |
717 // we try and save the password even though onsubmit hasn't been called. | 703 // we try and save the password even though onsubmit hasn't been called. |
718 NavigationObserver observer(WebContents()); | 704 NavigationObserver observer(WebContents()); |
719 std::unique_ptr<BubbleObserver> prompt_observer( | 705 std::unique_ptr<BubbleObserver> prompt_observer( |
720 new BubbleObserver(WebContents())); | 706 new BubbleObserver(WebContents())); |
721 std::string fill_and_navigate = | 707 std::string fill_and_navigate = |
722 "document.getElementById('username_field').value = 'temp';" | 708 "document.getElementById('username_field').value = 'temp';" |
723 "document.getElementById('password_field').value = 'random';" | 709 "document.getElementById('password_field').value = 'random';" |
724 "send_fetch()"; | 710 "send_fetch()"; |
725 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_navigate)); | 711 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_navigate)); |
726 observer.Wait(); | 712 observer.Wait(); |
727 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 713 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
728 } | 714 } |
729 | 715 |
730 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 716 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
731 PromptForFetchWithNewPasswordsWithoutOnSubmit) { | 717 PromptForFetchWithNewPasswordsWithoutOnSubmit) { |
732 NavigateToFile("/password/password_fetch_submit.html"); | 718 NavigateToFile("/password/password_fetch_submit.html"); |
733 | 719 |
734 // Verify that if Fetch navigation occurs and the form is properly filled out, | 720 // Verify that if Fetch navigation occurs and the form is properly filled out, |
735 // we try and save the password even though onsubmit hasn't been called. | 721 // we try and save the password even though onsubmit hasn't been called. |
736 // Specifically verify that the password form saving new passwords is treated | 722 // Specifically verify that the password form saving new passwords is treated |
737 // the same as a login form. | 723 // the same as a login form. |
738 NavigationObserver observer(WebContents()); | 724 NavigationObserver observer(WebContents()); |
739 std::unique_ptr<BubbleObserver> prompt_observer( | 725 std::unique_ptr<BubbleObserver> prompt_observer( |
740 new BubbleObserver(WebContents())); | 726 new BubbleObserver(WebContents())); |
741 std::string fill_and_navigate = | 727 std::string fill_and_navigate = |
742 "document.getElementById('signup_username_field').value = 'temp';" | 728 "document.getElementById('signup_username_field').value = 'temp';" |
743 "document.getElementById('signup_password_field').value = 'random';" | 729 "document.getElementById('signup_password_field').value = 'random';" |
744 "document.getElementById('confirmation_password_field').value = 'random';" | 730 "document.getElementById('confirmation_password_field').value = 'random';" |
745 "send_fetch()"; | 731 "send_fetch()"; |
746 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_navigate)); | 732 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_navigate)); |
747 observer.Wait(); | 733 observer.Wait(); |
748 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 734 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
749 } | 735 } |
750 | 736 |
751 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 737 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
752 PromptForFetchSubmitWithoutNavigation) { | 738 PromptForFetchSubmitWithoutNavigation) { |
753 NavigateToFile("/password/password_fetch_submit.html"); | 739 NavigateToFile("/password/password_fetch_submit.html"); |
754 | 740 |
755 // Need to pay attention for a message that XHR has finished since there | 741 // Need to pay attention for a message that XHR has finished since there |
756 // is no navigation to wait for. | 742 // is no navigation to wait for. |
757 content::DOMMessageQueue message_queue; | 743 content::DOMMessageQueue message_queue; |
758 | 744 |
759 // Verify that if XHR without navigation occurs and the form has been filled | 745 // Verify that if XHR without navigation occurs and the form has been filled |
760 // out we try and save the password. Note that in general the submission | 746 // out we try and save the password. Note that in general the submission |
761 // doesn't need to be via form.submit(), but for testing purposes it's | 747 // doesn't need to be via form.submit(), but for testing purposes it's |
762 // necessary since we otherwise ignore changes made to the value of these | 748 // necessary since we otherwise ignore changes made to the value of these |
763 // fields by script. | 749 // fields by script. |
764 std::unique_ptr<BubbleObserver> prompt_observer( | 750 std::unique_ptr<BubbleObserver> prompt_observer( |
765 new BubbleObserver(WebContents())); | 751 new BubbleObserver(WebContents())); |
766 std::string fill_and_submit = | 752 std::string fill_and_submit = |
767 "navigate = false;" | 753 "navigate = false;" |
768 "document.getElementById('username_field').value = 'temp';" | 754 "document.getElementById('username_field').value = 'temp';" |
769 "document.getElementById('password_field').value = 'random';" | 755 "document.getElementById('password_field').value = 'random';" |
770 "document.getElementById('submit_button').click();"; | 756 "document.getElementById('submit_button').click();"; |
771 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 757 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
772 std::string message; | 758 std::string message; |
773 while (message_queue.WaitForMessage(&message)) { | 759 while (message_queue.WaitForMessage(&message)) { |
774 if (message == "\"FETCH_FINISHED\"") | 760 if (message == "\"FETCH_FINISHED\"") |
775 break; | 761 break; |
776 } | 762 } |
777 | 763 |
778 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 764 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
779 } | 765 } |
780 | 766 |
781 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 767 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
782 PromptForFetchSubmitWithoutNavigation_SignupForm) { | 768 PromptForFetchSubmitWithoutNavigation_SignupForm) { |
783 NavigateToFile("/password/password_fetch_submit.html"); | 769 NavigateToFile("/password/password_fetch_submit.html"); |
784 | 770 |
785 // Need to pay attention for a message that Fetch has finished since there | 771 // Need to pay attention for a message that Fetch has finished since there |
786 // is no navigation to wait for. | 772 // is no navigation to wait for. |
787 content::DOMMessageQueue message_queue; | 773 content::DOMMessageQueue message_queue; |
788 | 774 |
(...skipping 10 matching lines...) Expand all Loading... |
799 "document.getElementById('signup_password_field').value = 'random';" | 785 "document.getElementById('signup_password_field').value = 'random';" |
800 "document.getElementById('confirmation_password_field').value = 'random';" | 786 "document.getElementById('confirmation_password_field').value = 'random';" |
801 "document.getElementById('signup_submit_button').click();"; | 787 "document.getElementById('signup_submit_button').click();"; |
802 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 788 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
803 std::string message; | 789 std::string message; |
804 while (message_queue.WaitForMessage(&message)) { | 790 while (message_queue.WaitForMessage(&message)) { |
805 if (message == "\"FETCH_FINISHED\"") | 791 if (message == "\"FETCH_FINISHED\"") |
806 break; | 792 break; |
807 } | 793 } |
808 | 794 |
809 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 795 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
810 } | 796 } |
811 | 797 |
812 IN_PROC_BROWSER_TEST_F( | 798 IN_PROC_BROWSER_TEST_F( |
813 PasswordManagerBrowserTestBase, | 799 PasswordManagerBrowserTestBase, |
814 NoPromptForFetchSubmitWithoutNavigationWithUnfilledForm) { | 800 NoPromptForFetchSubmitWithoutNavigationWithUnfilledForm) { |
815 NavigateToFile("/password/password_fetch_submit.html"); | 801 NavigateToFile("/password/password_fetch_submit.html"); |
816 | 802 |
817 // Need to pay attention for a message that Fetch has finished since there | 803 // Need to pay attention for a message that Fetch has finished since there |
818 // is no navigation to wait for. | 804 // is no navigation to wait for. |
819 content::DOMMessageQueue message_queue; | 805 content::DOMMessageQueue message_queue; |
820 | 806 |
821 // Verify that if Fetch without navigation occurs and the form has NOT been | 807 // Verify that if Fetch without navigation occurs and the form has NOT been |
822 // filled out we don't prompt. | 808 // filled out we don't prompt. |
823 std::unique_ptr<BubbleObserver> prompt_observer( | 809 std::unique_ptr<BubbleObserver> prompt_observer( |
824 new BubbleObserver(WebContents())); | 810 new BubbleObserver(WebContents())); |
825 std::string fill_and_submit = | 811 std::string fill_and_submit = |
826 "navigate = false;" | 812 "navigate = false;" |
827 "document.getElementById('username_field').value = 'temp';" | 813 "document.getElementById('username_field').value = 'temp';" |
828 "document.getElementById('submit_button').click();"; | 814 "document.getElementById('submit_button').click();"; |
829 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 815 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
830 std::string message; | 816 std::string message; |
831 while (message_queue.WaitForMessage(&message)) { | 817 while (message_queue.WaitForMessage(&message)) { |
832 if (message == "\"FETCH_FINISHED\"") | 818 if (message == "\"FETCH_FINISHED\"") |
833 break; | 819 break; |
834 } | 820 } |
835 | 821 |
836 EXPECT_FALSE(prompt_observer->IsShowingSavePrompt()); | 822 EXPECT_FALSE(prompt_observer->WasSavePromptShown()); |
837 } | 823 } |
838 | 824 |
839 IN_PROC_BROWSER_TEST_F( | 825 IN_PROC_BROWSER_TEST_F( |
840 PasswordManagerBrowserTestBase, | 826 PasswordManagerBrowserTestBase, |
841 NoPromptForFetchSubmitWithoutNavigationWithUnfilledForm_SignupForm) { | 827 NoPromptForFetchSubmitWithoutNavigationWithUnfilledForm_SignupForm) { |
842 NavigateToFile("/password/password_fetch_submit.html"); | 828 NavigateToFile("/password/password_fetch_submit.html"); |
843 | 829 |
844 // Need to pay attention for a message that Fetch has finished since there | 830 // Need to pay attention for a message that Fetch has finished since there |
845 // is no navigation to wait for. | 831 // is no navigation to wait for. |
846 content::DOMMessageQueue message_queue; | 832 content::DOMMessageQueue message_queue; |
847 | 833 |
848 // Verify that if Fetch without navigation occurs and the form has NOT been | 834 // Verify that if Fetch without navigation occurs and the form has NOT been |
849 // filled out we don't prompt. | 835 // filled out we don't prompt. |
850 std::unique_ptr<BubbleObserver> prompt_observer( | 836 std::unique_ptr<BubbleObserver> prompt_observer( |
851 new BubbleObserver(WebContents())); | 837 new BubbleObserver(WebContents())); |
852 std::string fill_and_submit = | 838 std::string fill_and_submit = |
853 "navigate = false;" | 839 "navigate = false;" |
854 "document.getElementById('signup_username_field').value = 'temp';" | 840 "document.getElementById('signup_username_field').value = 'temp';" |
855 "document.getElementById('signup_submit_button').click();"; | 841 "document.getElementById('signup_submit_button').click();"; |
856 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 842 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
857 std::string message; | 843 std::string message; |
858 while (message_queue.WaitForMessage(&message)) { | 844 while (message_queue.WaitForMessage(&message)) { |
859 if (message == "\"FETCH_FINISHED\"") | 845 if (message == "\"FETCH_FINISHED\"") |
860 break; | 846 break; |
861 } | 847 } |
862 | 848 |
863 EXPECT_FALSE(prompt_observer->IsShowingSavePrompt()); | 849 EXPECT_FALSE(prompt_observer->WasSavePromptShown()); |
864 } | 850 } |
865 | 851 |
866 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, NoPromptIfLinkClicked) { | 852 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, NoPromptIfLinkClicked) { |
867 NavigateToFile("/password/password_form.html"); | 853 NavigateToFile("/password/password_form.html"); |
868 | 854 |
869 // Verify that if the user takes a direct action to leave the page, we don't | 855 // Verify that if the user takes a direct action to leave the page, we don't |
870 // prompt to save the password even if the form is already filled out. | 856 // prompt to save the password even if the form is already filled out. |
871 NavigationObserver observer(WebContents()); | 857 NavigationObserver observer(WebContents()); |
872 std::unique_ptr<BubbleObserver> prompt_observer( | 858 std::unique_ptr<BubbleObserver> prompt_observer( |
873 new BubbleObserver(WebContents())); | 859 new BubbleObserver(WebContents())); |
874 std::string fill_and_click_link = | 860 std::string fill_and_click_link = |
875 "document.getElementById('username_field').value = 'temp';" | 861 "document.getElementById('username_field').value = 'temp';" |
876 "document.getElementById('password_field').value = 'random';" | 862 "document.getElementById('password_field').value = 'random';" |
877 "document.getElementById('link').click();"; | 863 "document.getElementById('link').click();"; |
878 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_click_link)); | 864 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_click_link)); |
879 observer.Wait(); | 865 observer.Wait(); |
880 EXPECT_FALSE(prompt_observer->IsShowingSavePrompt()); | 866 EXPECT_FALSE(prompt_observer->WasSavePromptShown()); |
881 } | 867 } |
882 | 868 |
883 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 869 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
884 VerifyPasswordGenerationUpload) { | 870 VerifyPasswordGenerationUpload) { |
885 // Prevent Autofill requests from actually going over the wire. | 871 // Prevent Autofill requests from actually going over the wire. |
886 net::TestURLFetcherFactory factory; | 872 net::TestURLFetcherFactory factory; |
887 // Disable Autofill requesting access to AddressBook data. This causes | 873 // Disable Autofill requesting access to AddressBook data. This causes |
888 // the test to hang on Mac. | 874 // the test to hang on Mac. |
889 autofill::test::DisableSystemServices(browser()->profile()->GetPrefs()); | 875 autofill::test::DisableSystemServices(browser()->profile()->GetPrefs()); |
890 | 876 |
891 // Visit a signup form. | 877 // Visit a signup form. |
892 NavigateToFile("/password/signup_form.html"); | 878 NavigateToFile("/password/signup_form.html"); |
893 | 879 |
894 // Enter a password and save it. | 880 // Enter a password and save it. |
895 NavigationObserver first_observer(WebContents()); | 881 NavigationObserver first_observer(WebContents()); |
896 std::unique_ptr<BubbleObserver> prompt_observer( | 882 std::unique_ptr<BubbleObserver> prompt_observer( |
897 new BubbleObserver(WebContents())); | 883 new BubbleObserver(WebContents())); |
898 std::string fill_and_submit = | 884 std::string fill_and_submit = |
899 "document.getElementById('other_info').value = 'stuff';" | 885 "document.getElementById('other_info').value = 'stuff';" |
900 "document.getElementById('username_field').value = 'my_username';" | 886 "document.getElementById('username_field').value = 'my_username';" |
901 "document.getElementById('password_field').value = 'password';" | 887 "document.getElementById('password_field').value = 'password';" |
902 "document.getElementById('input_submit_button').click()"; | 888 "document.getElementById('input_submit_button').click()"; |
903 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 889 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
904 | 890 |
905 first_observer.Wait(); | 891 first_observer.Wait(); |
906 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 892 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
907 prompt_observer->AcceptSavePrompt(); | 893 prompt_observer->AcceptSavePrompt(); |
908 | 894 |
909 // Now navigate to a login form that has similar HTML markup. | 895 // Now navigate to a login form that has similar HTML markup. |
910 NavigateToFile("/password/password_form.html"); | 896 NavigateToFile("/password/password_form.html"); |
911 | 897 |
912 // Simulate a user click to force an autofill of the form's DOM value, not | 898 // Simulate a user click to force an autofill of the form's DOM value, not |
913 // just the suggested value. | 899 // just the suggested value. |
914 content::SimulateMouseClick(WebContents(), 0, | 900 content::SimulateMouseClick(WebContents(), 0, |
915 blink::WebMouseEvent::Button::kLeft); | 901 blink::WebMouseEvent::Button::kLeft); |
916 | 902 |
917 // The form should be filled with the previously submitted username. | 903 // The form should be filled with the previously submitted username. |
918 CheckElementValue("username_field", "my_username"); | 904 CheckElementValue("username_field", "my_username"); |
919 CheckElementValue("password_field", "password"); | 905 CheckElementValue("password_field", "password"); |
920 | 906 |
921 // Submit the form and verify that there is no infobar (as the password | 907 // Submit the form and verify that there is no infobar (as the password |
922 // has already been saved). | 908 // has already been saved). |
923 NavigationObserver second_observer(WebContents()); | 909 NavigationObserver second_observer(WebContents()); |
924 std::unique_ptr<BubbleObserver> second_prompt_observer( | 910 std::unique_ptr<BubbleObserver> second_prompt_observer( |
925 new BubbleObserver(WebContents())); | 911 new BubbleObserver(WebContents())); |
926 std::string submit_form = | 912 std::string submit_form = |
927 "document.getElementById('input_submit_button').click()"; | 913 "document.getElementById('input_submit_button').click()"; |
928 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), submit_form)); | 914 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), submit_form)); |
929 second_observer.Wait(); | 915 second_observer.Wait(); |
930 EXPECT_FALSE(second_prompt_observer->IsShowingSavePrompt()); | 916 EXPECT_FALSE(second_prompt_observer->WasSavePromptShown()); |
931 | 917 |
932 // Verify that we sent two pings to Autofill. One vote for of PASSWORD for | 918 // Verify that we sent two pings to Autofill. One vote for of PASSWORD for |
933 // the current form, and one vote for ACCOUNT_CREATION_PASSWORD on the | 919 // the current form, and one vote for ACCOUNT_CREATION_PASSWORD on the |
934 // original form since it has more than 2 text input fields and was used for | 920 // original form since it has more than 2 text input fields and was used for |
935 // the first time on a different form. | 921 // the first time on a different form. |
936 base::HistogramBase* upload_histogram = | 922 base::HistogramBase* upload_histogram = |
937 base::StatisticsRecorder::FindHistogram( | 923 base::StatisticsRecorder::FindHistogram( |
938 "PasswordGeneration.UploadStarted"); | 924 "PasswordGeneration.UploadStarted"); |
939 ASSERT_TRUE(upload_histogram); | 925 ASSERT_TRUE(upload_histogram); |
940 std::unique_ptr<base::HistogramSamples> snapshot = | 926 std::unique_ptr<base::HistogramSamples> snapshot = |
(...skipping 16 matching lines...) Expand all Loading... |
957 new BubbleObserver(WebContents())); | 943 new BubbleObserver(WebContents())); |
958 std::string fill_and_submit = | 944 std::string fill_and_submit = |
959 "var iframe = document.getElementById('test_iframe');" | 945 "var iframe = document.getElementById('test_iframe');" |
960 "var iframe_doc = iframe.contentDocument;" | 946 "var iframe_doc = iframe.contentDocument;" |
961 "iframe_doc.getElementById('username_field').value = 'temp';" | 947 "iframe_doc.getElementById('username_field').value = 'temp';" |
962 "iframe_doc.getElementById('password_field').value = 'random';" | 948 "iframe_doc.getElementById('password_field').value = 'random';" |
963 "iframe_doc.getElementById('submit_button').click()"; | 949 "iframe_doc.getElementById('submit_button').click()"; |
964 | 950 |
965 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 951 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
966 observer.Wait(); | 952 observer.Wait(); |
967 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 953 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
968 } | 954 } |
969 | 955 |
970 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 956 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
971 PromptForInputElementWithoutName) { | 957 PromptForInputElementWithoutName) { |
972 // Check that the prompt is shown for forms where input elements lack the | 958 // Check that the prompt is shown for forms where input elements lack the |
973 // "name" attribute but the "id" is present. | 959 // "name" attribute but the "id" is present. |
974 NavigateToFile("/password/password_form.html"); | 960 NavigateToFile("/password/password_form.html"); |
975 | 961 |
976 NavigationObserver observer(WebContents()); | 962 NavigationObserver observer(WebContents()); |
977 std::unique_ptr<BubbleObserver> prompt_observer( | 963 std::unique_ptr<BubbleObserver> prompt_observer( |
978 new BubbleObserver(WebContents())); | 964 new BubbleObserver(WebContents())); |
979 std::string fill_and_submit = | 965 std::string fill_and_submit = |
980 "document.getElementById('username_field_no_name').value = 'temp';" | 966 "document.getElementById('username_field_no_name').value = 'temp';" |
981 "document.getElementById('password_field_no_name').value = 'random';" | 967 "document.getElementById('password_field_no_name').value = 'random';" |
982 "document.getElementById('input_submit_button_no_name').click()"; | 968 "document.getElementById('input_submit_button_no_name').click()"; |
983 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 969 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
984 observer.Wait(); | 970 observer.Wait(); |
985 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 971 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
986 } | 972 } |
987 | 973 |
988 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 974 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
989 PromptForInputElementWithoutId) { | 975 PromptForInputElementWithoutId) { |
990 // Check that the prompt is shown for forms where input elements lack the | 976 // Check that the prompt is shown for forms where input elements lack the |
991 // "id" attribute but the "name" attribute is present. | 977 // "id" attribute but the "name" attribute is present. |
992 NavigateToFile("/password/password_form.html"); | 978 NavigateToFile("/password/password_form.html"); |
993 | 979 |
994 NavigationObserver observer(WebContents()); | 980 NavigationObserver observer(WebContents()); |
995 std::unique_ptr<BubbleObserver> prompt_observer( | 981 std::unique_ptr<BubbleObserver> prompt_observer( |
996 new BubbleObserver(WebContents())); | 982 new BubbleObserver(WebContents())); |
997 std::string fill_and_submit = | 983 std::string fill_and_submit = |
998 "document.getElementsByName('username_field_no_id')[0].value = 'temp';" | 984 "document.getElementsByName('username_field_no_id')[0].value = 'temp';" |
999 "document.getElementsByName('password_field_no_id')[0].value = 'random';" | 985 "document.getElementsByName('password_field_no_id')[0].value = 'random';" |
1000 "document.getElementsByName('input_submit_button_no_id')[0].click()"; | 986 "document.getElementsByName('input_submit_button_no_id')[0].click()"; |
1001 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 987 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
1002 observer.Wait(); | 988 observer.Wait(); |
1003 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 989 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
1004 } | 990 } |
1005 | 991 |
1006 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 992 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
1007 PromptForInputElementWithoutIdAndName) { | 993 PromptForInputElementWithoutIdAndName) { |
1008 // Check that prompt is shown for forms where the input fields lack both | 994 // Check that prompt is shown for forms where the input fields lack both |
1009 // the "id" and the "name" attributes. | 995 // the "id" and the "name" attributes. |
1010 NavigateToFile("/password/password_form.html"); | 996 NavigateToFile("/password/password_form.html"); |
1011 | 997 |
1012 NavigationObserver observer(WebContents()); | 998 NavigationObserver observer(WebContents()); |
1013 std::unique_ptr<BubbleObserver> prompt_observer( | 999 std::unique_ptr<BubbleObserver> prompt_observer( |
1014 new BubbleObserver(WebContents())); | 1000 new BubbleObserver(WebContents())); |
1015 std::string fill_and_submit = | 1001 std::string fill_and_submit = |
1016 "var form = document.getElementById('testform_elements_no_id_no_name');" | 1002 "var form = document.getElementById('testform_elements_no_id_no_name');" |
1017 "var username = form.children[0];" | 1003 "var username = form.children[0];" |
1018 "username.value = 'temp';" | 1004 "username.value = 'temp';" |
1019 "var password = form.children[1];" | 1005 "var password = form.children[1];" |
1020 "password.value = 'random';" | 1006 "password.value = 'random';" |
1021 "form.children[2].click()"; // form.children[2] is the submit button. | 1007 "form.children[2].click()"; // form.children[2] is the submit button. |
1022 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 1008 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
1023 observer.Wait(); | 1009 observer.Wait(); |
1024 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 1010 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
1025 prompt_observer->AcceptSavePrompt(); | 1011 prompt_observer->AcceptSavePrompt(); |
1026 | 1012 |
1027 // Check that credentials are stored. | 1013 // Check that credentials are stored. |
1028 scoped_refptr<password_manager::TestPasswordStore> password_store = | 1014 scoped_refptr<password_manager::TestPasswordStore> password_store = |
1029 static_cast<password_manager::TestPasswordStore*>( | 1015 static_cast<password_manager::TestPasswordStore*>( |
1030 PasswordStoreFactory::GetForProfile( | 1016 PasswordStoreFactory::GetForProfile( |
1031 browser()->profile(), ServiceAccessType::IMPLICIT_ACCESS) | 1017 browser()->profile(), ServiceAccessType::IMPLICIT_ACCESS) |
1032 .get()); | 1018 .get()); |
1033 | 1019 |
1034 WaitForPasswordStore(); | 1020 WaitForPasswordStore(); |
(...skipping 11 matching lines...) Expand all Loading... |
1046 | 1032 |
1047 NavigationObserver observer(WebContents()); | 1033 NavigationObserver observer(WebContents()); |
1048 std::unique_ptr<BubbleObserver> prompt_observer( | 1034 std::unique_ptr<BubbleObserver> prompt_observer( |
1049 new BubbleObserver(WebContents())); | 1035 new BubbleObserver(WebContents())); |
1050 std::string fill_and_submit = | 1036 std::string fill_and_submit = |
1051 "document.getElementById('username_field').value = 'temp';" | 1037 "document.getElementById('username_field').value = 'temp';" |
1052 "document.getElementById('password_field').value = 'random';" | 1038 "document.getElementById('password_field').value = 'random';" |
1053 "document.getElementById('input_submit_button').click();"; | 1039 "document.getElementById('input_submit_button').click();"; |
1054 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 1040 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
1055 observer.Wait(); | 1041 observer.Wait(); |
1056 EXPECT_FALSE(prompt_observer->IsShowingSavePrompt()); | 1042 EXPECT_FALSE(prompt_observer->WasSavePromptShown()); |
1057 } | 1043 } |
1058 | 1044 |
1059 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 1045 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
1060 NoPromptForLandingPageWithHTTPErrorStatusCode) { | 1046 NoPromptForLandingPageWithHTTPErrorStatusCode) { |
1061 // Check that no prompt is shown for forms where the landing page has | 1047 // Check that no prompt is shown for forms where the landing page has |
1062 // HTTP status 404. | 1048 // HTTP status 404. |
1063 NavigateToFile("/password/password_form.html"); | 1049 NavigateToFile("/password/password_form.html"); |
1064 | 1050 |
1065 NavigationObserver observer(WebContents()); | 1051 NavigationObserver observer(WebContents()); |
1066 std::unique_ptr<BubbleObserver> prompt_observer( | 1052 std::unique_ptr<BubbleObserver> prompt_observer( |
1067 new BubbleObserver(WebContents())); | 1053 new BubbleObserver(WebContents())); |
1068 std::string fill_and_submit = | 1054 std::string fill_and_submit = |
1069 "document.getElementById('username_field_http_error').value = 'temp';" | 1055 "document.getElementById('username_field_http_error').value = 'temp';" |
1070 "document.getElementById('password_field_http_error').value = 'random';" | 1056 "document.getElementById('password_field_http_error').value = 'random';" |
1071 "document.getElementById('input_submit_button_http_error').click()"; | 1057 "document.getElementById('input_submit_button_http_error').click()"; |
1072 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 1058 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
1073 observer.Wait(); | 1059 observer.Wait(); |
1074 EXPECT_FALSE(prompt_observer->IsShowingSavePrompt()); | 1060 EXPECT_FALSE(prompt_observer->WasSavePromptShown()); |
1075 } | 1061 } |
1076 | 1062 |
1077 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 1063 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
1078 DeleteFrameBeforeSubmit) { | 1064 DeleteFrameBeforeSubmit) { |
1079 NavigateToFile("/password/multi_frames.html"); | 1065 NavigateToFile("/password/multi_frames.html"); |
1080 | 1066 |
1081 NavigationObserver observer(WebContents()); | 1067 NavigationObserver observer(WebContents()); |
1082 // Make sure we save some password info from an iframe and then destroy it. | 1068 // Make sure we save some password info from an iframe and then destroy it. |
1083 std::string save_and_remove = | 1069 std::string save_and_remove = |
1084 "var first_frame = document.getElementById('first_frame');" | 1070 "var first_frame = document.getElementById('first_frame');" |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1195 DontPromptForPasswordFormWithDefaultValue) { | 1181 DontPromptForPasswordFormWithDefaultValue) { |
1196 NavigateToFile("/password/password_form_with_default_value.html"); | 1182 NavigateToFile("/password/password_form_with_default_value.html"); |
1197 | 1183 |
1198 // Don't prompt if we navigate away even if there is a password value since | 1184 // Don't prompt if we navigate away even if there is a password value since |
1199 // it's not coming from the user. | 1185 // it's not coming from the user. |
1200 NavigationObserver observer(WebContents()); | 1186 NavigationObserver observer(WebContents()); |
1201 std::unique_ptr<BubbleObserver> prompt_observer( | 1187 std::unique_ptr<BubbleObserver> prompt_observer( |
1202 new BubbleObserver(WebContents())); | 1188 new BubbleObserver(WebContents())); |
1203 NavigateToFile("/password/done.html"); | 1189 NavigateToFile("/password/done.html"); |
1204 observer.Wait(); | 1190 observer.Wait(); |
1205 EXPECT_FALSE(prompt_observer->IsShowingSavePrompt()); | 1191 EXPECT_FALSE(prompt_observer->WasSavePromptShown()); |
1206 } | 1192 } |
1207 | 1193 |
1208 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 1194 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
1209 DontPromptForPasswordFormWithReadonlyPasswordField) { | 1195 DontPromptForPasswordFormWithReadonlyPasswordField) { |
1210 NavigateToFile("/password/password_form_with_password_readonly.html"); | 1196 NavigateToFile("/password/password_form_with_password_readonly.html"); |
1211 | 1197 |
1212 // Fill a form and submit through a <input type="submit"> button. Nothing | 1198 // Fill a form and submit through a <input type="submit"> button. Nothing |
1213 // special. | 1199 // special. |
1214 NavigationObserver observer(WebContents()); | 1200 NavigationObserver observer(WebContents()); |
1215 std::unique_ptr<BubbleObserver> prompt_observer( | 1201 std::unique_ptr<BubbleObserver> prompt_observer( |
1216 new BubbleObserver(WebContents())); | 1202 new BubbleObserver(WebContents())); |
1217 std::string fill_and_submit = | 1203 std::string fill_and_submit = |
1218 "document.getElementById('username_field').value = 'temp';" | 1204 "document.getElementById('username_field').value = 'temp';" |
1219 "document.getElementById('password_field').value = 'random';" | 1205 "document.getElementById('password_field').value = 'random';" |
1220 "document.getElementById('input_submit_button').click()"; | 1206 "document.getElementById('input_submit_button').click()"; |
1221 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 1207 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
1222 observer.Wait(); | 1208 observer.Wait(); |
1223 EXPECT_FALSE(prompt_observer->IsShowingSavePrompt()); | 1209 EXPECT_FALSE(prompt_observer->WasSavePromptShown()); |
1224 } | 1210 } |
1225 | 1211 |
1226 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 1212 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
1227 PromptWhenEnableAutomaticPasswordSavingSwitchIsNotSet) { | 1213 PromptWhenEnableAutomaticPasswordSavingSwitchIsNotSet) { |
1228 NavigateToFile("/password/password_form.html"); | 1214 NavigateToFile("/password/password_form.html"); |
1229 | 1215 |
1230 // Fill a form and submit through a <input type="submit"> button. | 1216 // Fill a form and submit through a <input type="submit"> button. |
1231 NavigationObserver observer(WebContents()); | 1217 NavigationObserver observer(WebContents()); |
1232 std::unique_ptr<BubbleObserver> prompt_observer( | 1218 std::unique_ptr<BubbleObserver> prompt_observer( |
1233 new BubbleObserver(WebContents())); | 1219 new BubbleObserver(WebContents())); |
1234 std::string fill_and_submit = | 1220 std::string fill_and_submit = |
1235 "document.getElementById('username_field').value = 'temp';" | 1221 "document.getElementById('username_field').value = 'temp';" |
1236 "document.getElementById('password_field').value = 'random';" | 1222 "document.getElementById('password_field').value = 'random';" |
1237 "document.getElementById('input_submit_button').click()"; | 1223 "document.getElementById('input_submit_button').click()"; |
1238 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 1224 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
1239 observer.Wait(); | 1225 observer.Wait(); |
1240 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 1226 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
1241 } | 1227 } |
1242 | 1228 |
1243 // Test fix for crbug.com/368690. | 1229 // Test fix for crbug.com/368690. |
1244 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, NoPromptWhenReloading) { | 1230 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, NoPromptWhenReloading) { |
1245 NavigateToFile("/password/password_form.html"); | 1231 NavigateToFile("/password/password_form.html"); |
1246 | 1232 |
1247 std::string fill = | 1233 std::string fill = |
1248 "document.getElementById('username_redirect').value = 'temp';" | 1234 "document.getElementById('username_redirect').value = 'temp';" |
1249 "document.getElementById('password_redirect').value = 'random';"; | 1235 "document.getElementById('password_redirect').value = 'random';"; |
1250 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill)); | 1236 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill)); |
1251 | 1237 |
1252 NavigationObserver observer(WebContents()); | 1238 NavigationObserver observer(WebContents()); |
1253 std::unique_ptr<BubbleObserver> prompt_observer( | 1239 std::unique_ptr<BubbleObserver> prompt_observer( |
1254 new BubbleObserver(WebContents())); | 1240 new BubbleObserver(WebContents())); |
1255 GURL url = embedded_test_server()->GetURL("/password/password_form.html"); | 1241 GURL url = embedded_test_server()->GetURL("/password/password_form.html"); |
1256 chrome::NavigateParams params(browser(), url, ::ui::PAGE_TRANSITION_RELOAD); | 1242 chrome::NavigateParams params(browser(), url, ::ui::PAGE_TRANSITION_RELOAD); |
1257 ui_test_utils::NavigateToURL(¶ms); | 1243 ui_test_utils::NavigateToURL(¶ms); |
1258 observer.Wait(); | 1244 observer.Wait(); |
1259 EXPECT_FALSE(prompt_observer->IsShowingSavePrompt()); | 1245 EXPECT_FALSE(prompt_observer->WasSavePromptShown()); |
1260 } | 1246 } |
1261 | 1247 |
1262 // Test that if a form gets dynamically added between the form parsing and | 1248 // Test that if a form gets dynamically added between the form parsing and |
1263 // rendering, and while the main frame still loads, it still is registered, and | 1249 // rendering, and while the main frame still loads, it still is registered, and |
1264 // thus saving passwords from it works. | 1250 // thus saving passwords from it works. |
1265 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 1251 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
1266 FormsAddedBetweenParsingAndRendering) { | 1252 FormsAddedBetweenParsingAndRendering) { |
1267 NavigateToFile("/password/between_parsing_and_rendering.html"); | 1253 NavigateToFile("/password/between_parsing_and_rendering.html"); |
1268 | 1254 |
1269 NavigationObserver observer(WebContents()); | 1255 NavigationObserver observer(WebContents()); |
1270 std::string submit = | 1256 std::string submit = |
1271 "document.getElementById('username').value = 'temp';" | 1257 "document.getElementById('username').value = 'temp';" |
1272 "document.getElementById('password').value = 'random';" | 1258 "document.getElementById('password').value = 'random';" |
1273 "document.getElementById('submit-button').click();"; | 1259 "document.getElementById('submit-button').click();"; |
1274 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), submit)); | 1260 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), submit)); |
1275 observer.Wait(); | 1261 observer.Wait(); |
1276 | 1262 |
1277 EXPECT_TRUE(BubbleObserver(WebContents()).IsShowingSavePrompt()); | 1263 EXPECT_TRUE(BubbleObserver(WebContents()).WasSavePromptShown()); |
1278 } | 1264 } |
1279 | 1265 |
1280 // Test that if a hidden form gets dynamically added between the form parsing | 1266 // Test that if a hidden form gets dynamically added between the form parsing |
1281 // and rendering, it still is registered, and autofilling works. | 1267 // and rendering, it still is registered, and autofilling works. |
1282 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 1268 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
1283 HiddenFormAddedBetweenParsingAndRendering) { | 1269 HiddenFormAddedBetweenParsingAndRendering) { |
1284 // At first let us save a credential to the password store. | 1270 // At first let us save a credential to the password store. |
1285 scoped_refptr<password_manager::TestPasswordStore> password_store = | 1271 scoped_refptr<password_manager::TestPasswordStore> password_store = |
1286 static_cast<password_manager::TestPasswordStore*>( | 1272 static_cast<password_manager::TestPasswordStore*>( |
1287 PasswordStoreFactory::GetForProfile( | 1273 PasswordStoreFactory::GetForProfile( |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1370 static_cast<password_manager::TestPasswordStore*>( | 1356 static_cast<password_manager::TestPasswordStore*>( |
1371 PasswordStoreFactory::GetForProfile( | 1357 PasswordStoreFactory::GetForProfile( |
1372 browser()->profile(), ServiceAccessType::IMPLICIT_ACCESS).get()); | 1358 browser()->profile(), ServiceAccessType::IMPLICIT_ACCESS).get()); |
1373 ASSERT_TRUE(password_store->IsEmpty()); | 1359 ASSERT_TRUE(password_store->IsEmpty()); |
1374 | 1360 |
1375 // Navigate to a page requiring HTTP auth. Wait for the tab to get the correct | 1361 // Navigate to a page requiring HTTP auth. Wait for the tab to get the correct |
1376 // WebContents, but don't wait for navigation, which only finishes after | 1362 // WebContents, but don't wait for navigation, which only finishes after |
1377 // authentication. | 1363 // authentication. |
1378 ui_test_utils::NavigateToURLWithDisposition( | 1364 ui_test_utils::NavigateToURLWithDisposition( |
1379 browser(), http_test_server.GetURL("/basic_auth"), | 1365 browser(), http_test_server.GetURL("/basic_auth"), |
1380 WindowOpenDisposition::NEW_FOREGROUND_TAB, | 1366 WindowOpenDisposition::CURRENT_TAB, ui_test_utils::BROWSER_TEST_NONE); |
1381 ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB); | |
1382 | 1367 |
1383 content::WebContents* tab = | 1368 content::NavigationController* nav_controller = |
1384 browser()->tab_strip_model()->GetActiveWebContents(); | 1369 &WebContents()->GetController(); |
1385 content::NavigationController* nav_controller = &tab->GetController(); | 1370 NavigationObserver nav_observer(WebContents()); |
1386 NavigationObserver nav_observer(tab); | |
1387 WindowedAuthNeededObserver auth_needed_observer(nav_controller); | 1371 WindowedAuthNeededObserver auth_needed_observer(nav_controller); |
1388 auth_needed_observer.Wait(); | 1372 auth_needed_observer.Wait(); |
1389 | 1373 |
1390 WindowedAuthSuppliedObserver auth_supplied_observer(nav_controller); | 1374 WindowedAuthSuppliedObserver auth_supplied_observer(nav_controller); |
1391 // Offer valid credentials on the auth challenge. | 1375 // Offer valid credentials on the auth challenge. |
1392 ASSERT_EQ(1u, login_observer.handlers().size()); | 1376 ASSERT_EQ(1u, login_observer.handlers().size()); |
1393 LoginHandler* handler = *login_observer.handlers().begin(); | 1377 LoginHandler* handler = *login_observer.handlers().begin(); |
1394 ASSERT_TRUE(handler); | 1378 ASSERT_TRUE(handler); |
1395 // Any username/password will work. | 1379 // Any username/password will work. |
1396 handler->SetAuth(base::UTF8ToUTF16("user"), base::UTF8ToUTF16("pwd")); | 1380 handler->SetAuth(base::UTF8ToUTF16("user"), base::UTF8ToUTF16("pwd")); |
1397 auth_supplied_observer.Wait(); | 1381 auth_supplied_observer.Wait(); |
1398 | 1382 |
1399 // The password manager should be working correctly. | 1383 // The password manager should be working correctly. |
1400 nav_observer.Wait(); | 1384 nav_observer.Wait(); |
1401 WaitForPasswordStore(); | 1385 WaitForPasswordStore(); |
1402 BubbleObserver bubble_observer(tab); | 1386 BubbleObserver bubble_observer(WebContents()); |
1403 EXPECT_TRUE(bubble_observer.IsShowingSavePrompt()); | 1387 EXPECT_TRUE(bubble_observer.WasSavePromptShown()); |
1404 bubble_observer.AcceptSavePrompt(); | 1388 bubble_observer.AcceptSavePrompt(); |
1405 | 1389 |
1406 // Spin the message loop to make sure the password store had a chance to save | 1390 // Spin the message loop to make sure the password store had a chance to save |
1407 // the password. | 1391 // the password. |
1408 WaitForPasswordStore(); | 1392 WaitForPasswordStore(); |
1409 EXPECT_FALSE(password_store->IsEmpty()); | 1393 EXPECT_FALSE(password_store->IsEmpty()); |
1410 } | 1394 } |
1411 | 1395 |
1412 // Fill out a form and click a button. The Javascript removes the form, creates | 1396 // Fill out a form and click a button. The Javascript removes the form, creates |
1413 // a similar one with another action, fills it out and submits. Chrome can | 1397 // a similar one with another action, fills it out and submits. Chrome can |
1414 // manage to detect the new one and create a complete matching | 1398 // manage to detect the new one and create a complete matching |
1415 // PasswordFormManager. Otherwise, the all-but-action matching PFM should be | 1399 // PasswordFormManager. Otherwise, the all-but-action matching PFM should be |
1416 // used. Regardless of the internals the user sees the bubble in 100% cases. | 1400 // used. Regardless of the internals the user sees the bubble in 100% cases. |
1417 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 1401 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
1418 PreferPasswordFormManagerWhichFinishedMatching) { | 1402 PreferPasswordFormManagerWhichFinishedMatching) { |
1419 NavigateToFile("/password/create_form_copy_on_submit.html"); | 1403 NavigateToFile("/password/create_form_copy_on_submit.html"); |
1420 | 1404 |
1421 NavigationObserver observer(WebContents()); | 1405 NavigationObserver observer(WebContents()); |
1422 std::unique_ptr<BubbleObserver> prompt_observer( | 1406 std::unique_ptr<BubbleObserver> prompt_observer( |
1423 new BubbleObserver(WebContents())); | 1407 new BubbleObserver(WebContents())); |
1424 std::string submit = | 1408 std::string submit = |
1425 "document.getElementById('username').value = 'overwrite_me';" | 1409 "document.getElementById('username').value = 'overwrite_me';" |
1426 "document.getElementById('password').value = 'random';" | 1410 "document.getElementById('password').value = 'random';" |
1427 "document.getElementById('non-form-button').click();"; | 1411 "document.getElementById('non-form-button').click();"; |
1428 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), submit)); | 1412 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), submit)); |
1429 observer.Wait(); | 1413 observer.Wait(); |
1430 | 1414 |
1431 WaitForPasswordStore(); | 1415 WaitForPasswordStore(); |
1432 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 1416 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
1433 } | 1417 } |
1434 | 1418 |
1435 // Test that if login fails and content server pushes a different login form | 1419 // Test that if login fails and content server pushes a different login form |
1436 // with action URL having different schemes. Heuristic shall be able | 1420 // with action URL having different schemes. Heuristic shall be able |
1437 // identify such cases and *shall not* prompt to save incorrect password. | 1421 // identify such cases and *shall not* prompt to save incorrect password. |
1438 IN_PROC_BROWSER_TEST_F( | 1422 IN_PROC_BROWSER_TEST_F( |
1439 PasswordManagerBrowserTestBase, | 1423 PasswordManagerBrowserTestBase, |
1440 NoPromptForLoginFailedAndServerPushSeperateLoginForm_HttpToHttps) { | 1424 NoPromptForLoginFailedAndServerPushSeperateLoginForm_HttpToHttps) { |
1441 std::string path = | 1425 std::string path = |
1442 "/password/separate_login_form_with_onload_submit_script.html"; | 1426 "/password/separate_login_form_with_onload_submit_script.html"; |
1443 GURL http_url(embedded_test_server()->GetURL(path)); | 1427 GURL http_url(embedded_test_server()->GetURL(path)); |
1444 ASSERT_TRUE(http_url.SchemeIs(url::kHttpScheme)); | 1428 ASSERT_TRUE(http_url.SchemeIs(url::kHttpScheme)); |
1445 | 1429 |
1446 NavigationObserver observer(WebContents()); | 1430 NavigationObserver observer(WebContents()); |
1447 std::unique_ptr<BubbleObserver> prompt_observer( | 1431 std::unique_ptr<BubbleObserver> prompt_observer( |
1448 new BubbleObserver(WebContents())); | 1432 new BubbleObserver(WebContents())); |
1449 ui_test_utils::NavigateToURL(browser(), http_url); | 1433 ui_test_utils::NavigateToURL(browser(), http_url); |
1450 | 1434 |
1451 observer.SetPathToWaitFor("/password/done_and_separate_login_form.html"); | 1435 observer.SetPathToWaitFor("/password/done_and_separate_login_form.html"); |
1452 observer.Wait(); | 1436 observer.Wait(); |
1453 | 1437 |
1454 EXPECT_FALSE(prompt_observer->IsShowingSavePrompt()); | 1438 EXPECT_FALSE(prompt_observer->WasSavePromptShown()); |
1455 } | 1439 } |
1456 | 1440 |
1457 IN_PROC_BROWSER_TEST_F( | 1441 IN_PROC_BROWSER_TEST_F( |
1458 PasswordManagerBrowserTestBase, | 1442 PasswordManagerBrowserTestBase, |
1459 NoPromptForLoginFailedAndServerPushSeperateLoginForm_HttpsToHttp) { | 1443 NoPromptForLoginFailedAndServerPushSeperateLoginForm_HttpsToHttp) { |
1460 // This test case cannot inject the scripts via content::ExecuteScript() in | 1444 // This test case cannot inject the scripts via content::ExecuteScript() in |
1461 // files served through HTTPS. Therefore the scripts are made part of the HTML | 1445 // files served through HTTPS. Therefore the scripts are made part of the HTML |
1462 // site and executed on load. | 1446 // site and executed on load. |
1463 std::string path = | 1447 std::string path = |
1464 "/password/separate_login_form_with_onload_submit_script.html"; | 1448 "/password/separate_login_form_with_onload_submit_script.html"; |
1465 GURL https_url(https_test_server().GetURL(path)); | 1449 GURL https_url(https_test_server().GetURL(path)); |
1466 ASSERT_TRUE(https_url.SchemeIs(url::kHttpsScheme)); | 1450 ASSERT_TRUE(https_url.SchemeIs(url::kHttpsScheme)); |
1467 | 1451 |
1468 NavigationObserver observer(WebContents()); | 1452 NavigationObserver observer(WebContents()); |
1469 std::unique_ptr<BubbleObserver> prompt_observer( | 1453 std::unique_ptr<BubbleObserver> prompt_observer( |
1470 new BubbleObserver(WebContents())); | 1454 new BubbleObserver(WebContents())); |
1471 ui_test_utils::NavigateToURL(browser(), https_url); | 1455 ui_test_utils::NavigateToURL(browser(), https_url); |
1472 | 1456 |
1473 observer.SetPathToWaitFor("/password/done_and_separate_login_form.html"); | 1457 observer.SetPathToWaitFor("/password/done_and_separate_login_form.html"); |
1474 observer.Wait(); | 1458 observer.Wait(); |
1475 | 1459 |
1476 EXPECT_FALSE(prompt_observer->IsShowingSavePrompt()); | 1460 EXPECT_FALSE(prompt_observer->WasSavePromptShown()); |
1477 } | 1461 } |
1478 | 1462 |
1479 // Tests whether a attempted submission of a malicious credentials gets blocked. | 1463 // Tests whether a attempted submission of a malicious credentials gets blocked. |
1480 // This simulates a case which is described in http://crbug.com/571580. | 1464 // This simulates a case which is described in http://crbug.com/571580. |
1481 IN_PROC_BROWSER_TEST_F( | 1465 IN_PROC_BROWSER_TEST_F( |
1482 PasswordManagerBrowserTestBase, | 1466 PasswordManagerBrowserTestBase, |
1483 NoPromptForSeperateLoginFormWhenSwitchingFromHttpsToHttp) { | 1467 NoPromptForSeperateLoginFormWhenSwitchingFromHttpsToHttp) { |
1484 std::string path = "/password/password_form.html"; | 1468 std::string path = "/password/password_form.html"; |
1485 GURL https_url(https_test_server().GetURL(path)); | 1469 GURL https_url(https_test_server().GetURL(path)); |
1486 ASSERT_TRUE(https_url.SchemeIs(url::kHttpsScheme)); | 1470 ASSERT_TRUE(https_url.SchemeIs(url::kHttpsScheme)); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1519 "document.getElementById('input_submit_button').click()"; | 1503 "document.getElementById('input_submit_button').click()"; |
1520 ASSERT_TRUE( | 1504 ASSERT_TRUE( |
1521 content::ExecuteScript(RenderViewHost(), fill_and_submit_attacker_form)); | 1505 content::ExecuteScript(RenderViewHost(), fill_and_submit_attacker_form)); |
1522 | 1506 |
1523 NavigationObserver done_observer(WebContents()); | 1507 NavigationObserver done_observer(WebContents()); |
1524 done_observer.SetPathToWaitFor("/password/done.html"); | 1508 done_observer.SetPathToWaitFor("/password/done.html"); |
1525 done_observer.Wait(); | 1509 done_observer.Wait(); |
1526 | 1510 |
1527 WaitForPasswordStore(); | 1511 WaitForPasswordStore(); |
1528 BubbleObserver prompt_observer(WebContents()); | 1512 BubbleObserver prompt_observer(WebContents()); |
1529 EXPECT_TRUE(prompt_observer.IsShowingSavePrompt()); | 1513 EXPECT_TRUE(prompt_observer.WasSavePromptShown()); |
1530 prompt_observer.AcceptSavePrompt(); | 1514 prompt_observer.AcceptSavePrompt(); |
1531 | 1515 |
1532 // Wait for password store and check that credentials are stored. | 1516 // Wait for password store and check that credentials are stored. |
1533 WaitForPasswordStore(); | 1517 WaitForPasswordStore(); |
1534 scoped_refptr<password_manager::TestPasswordStore> password_store = | 1518 scoped_refptr<password_manager::TestPasswordStore> password_store = |
1535 static_cast<password_manager::TestPasswordStore*>( | 1519 static_cast<password_manager::TestPasswordStore*>( |
1536 PasswordStoreFactory::GetForProfile( | 1520 PasswordStoreFactory::GetForProfile( |
1537 browser()->profile(), ServiceAccessType::IMPLICIT_ACCESS) | 1521 browser()->profile(), ServiceAccessType::IMPLICIT_ACCESS) |
1538 .get()); | 1522 .get()); |
1539 EXPECT_FALSE(password_store->IsEmpty()); | 1523 EXPECT_FALSE(password_store->IsEmpty()); |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1649 | 1633 |
1650 NavigationObserver observer(WebContents()); | 1634 NavigationObserver observer(WebContents()); |
1651 std::unique_ptr<BubbleObserver> prompt_observer( | 1635 std::unique_ptr<BubbleObserver> prompt_observer( |
1652 new BubbleObserver(WebContents())); | 1636 new BubbleObserver(WebContents())); |
1653 std::string submit = | 1637 std::string submit = |
1654 "document.getElementById('password').value = 'password';" | 1638 "document.getElementById('password').value = 'password';" |
1655 "document.getElementById('submit-button').click();"; | 1639 "document.getElementById('submit-button').click();"; |
1656 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), submit)); | 1640 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), submit)); |
1657 observer.Wait(); | 1641 observer.Wait(); |
1658 | 1642 |
1659 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 1643 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
1660 prompt_observer->AcceptSavePrompt(); | 1644 prompt_observer->AcceptSavePrompt(); |
1661 | 1645 |
1662 WaitForPasswordStore(); | 1646 WaitForPasswordStore(); |
1663 EXPECT_FALSE(password_store->IsEmpty()); | 1647 EXPECT_FALSE(password_store->IsEmpty()); |
1664 } | 1648 } |
1665 | 1649 |
1666 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 1650 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
1667 AutofillSuggestionsForPasswordFormWithoutUsernameField) { | 1651 AutofillSuggestionsForPasswordFormWithoutUsernameField) { |
1668 std::string submit = | 1652 std::string submit = |
1669 "document.getElementById('password').value = 'mypassword';" | 1653 "document.getElementById('password').value = 'mypassword';" |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1721 NavigationObserver observer(WebContents()); | 1705 NavigationObserver observer(WebContents()); |
1722 observer.set_quit_on_entry_committed(true); | 1706 observer.set_quit_on_entry_committed(true); |
1723 std::unique_ptr<BubbleObserver> prompt_observer( | 1707 std::unique_ptr<BubbleObserver> prompt_observer( |
1724 new BubbleObserver(WebContents())); | 1708 new BubbleObserver(WebContents())); |
1725 std::string fill_and_submit = | 1709 std::string fill_and_submit = |
1726 "document.getElementById('username_field').value = 'temp';" | 1710 "document.getElementById('username_field').value = 'temp';" |
1727 "document.getElementById('password_field').value = 'random';" | 1711 "document.getElementById('password_field').value = 'random';" |
1728 "document.getElementById('submit_button').click()"; | 1712 "document.getElementById('submit_button').click()"; |
1729 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 1713 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
1730 observer.Wait(); | 1714 observer.Wait(); |
1731 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 1715 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
1732 } | 1716 } |
1733 | 1717 |
1734 // Similar to the case above, but this time the form persists after | 1718 // Similar to the case above, but this time the form persists after |
1735 // 'history.pushState()'. And save password prompt should not show up | 1719 // 'history.pushState()'. And save password prompt should not show up |
1736 // in this case. | 1720 // in this case. |
1737 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 1721 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
1738 NoPromptForPushStateWhenFormPersists) { | 1722 NoPromptForPushStateWhenFormPersists) { |
1739 NavigateToFile("/password/password_push_state.html"); | 1723 NavigateToFile("/password/password_push_state.html"); |
1740 | 1724 |
1741 // Set |should_delete_testform| to false to keep submitted form visible after | 1725 // Set |should_delete_testform| to false to keep submitted form visible after |
1742 // history.pushsTate(); | 1726 // history.pushsTate(); |
1743 NavigationObserver observer(WebContents()); | 1727 NavigationObserver observer(WebContents()); |
1744 observer.set_quit_on_entry_committed(true); | 1728 observer.set_quit_on_entry_committed(true); |
1745 std::unique_ptr<BubbleObserver> prompt_observer( | 1729 std::unique_ptr<BubbleObserver> prompt_observer( |
1746 new BubbleObserver(WebContents())); | 1730 new BubbleObserver(WebContents())); |
1747 std::string fill_and_submit = | 1731 std::string fill_and_submit = |
1748 "should_delete_testform = false;" | 1732 "should_delete_testform = false;" |
1749 "document.getElementById('username_field').value = 'temp';" | 1733 "document.getElementById('username_field').value = 'temp';" |
1750 "document.getElementById('password_field').value = 'random';" | 1734 "document.getElementById('password_field').value = 'random';" |
1751 "document.getElementById('submit_button').click()"; | 1735 "document.getElementById('submit_button').click()"; |
1752 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 1736 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
1753 observer.Wait(); | 1737 observer.Wait(); |
1754 EXPECT_FALSE(prompt_observer->IsShowingSavePrompt()); | 1738 EXPECT_FALSE(prompt_observer->WasSavePromptShown()); |
1755 } | 1739 } |
1756 | 1740 |
1757 // The password manager should distinguish forms with empty actions. After | 1741 // The password manager should distinguish forms with empty actions. After |
1758 // successful login, the login form disappears, but the another one shouldn't be | 1742 // successful login, the login form disappears, but the another one shouldn't be |
1759 // recognized as the login form. The save prompt should appear. | 1743 // recognized as the login form. The save prompt should appear. |
1760 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 1744 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
1761 PromptForPushStateWhenFormWithEmptyActionDisappears) { | 1745 PromptForPushStateWhenFormWithEmptyActionDisappears) { |
1762 NavigateToFile("/password/password_push_state.html"); | 1746 NavigateToFile("/password/password_push_state.html"); |
1763 | 1747 |
1764 NavigationObserver observer(WebContents()); | 1748 NavigationObserver observer(WebContents()); |
1765 observer.set_quit_on_entry_committed(true); | 1749 observer.set_quit_on_entry_committed(true); |
1766 std::unique_ptr<BubbleObserver> prompt_observer( | 1750 std::unique_ptr<BubbleObserver> prompt_observer( |
1767 new BubbleObserver(WebContents())); | 1751 new BubbleObserver(WebContents())); |
1768 std::string fill_and_submit = | 1752 std::string fill_and_submit = |
1769 "document.getElementById('ea_username_field').value = 'temp';" | 1753 "document.getElementById('ea_username_field').value = 'temp';" |
1770 "document.getElementById('ea_password_field').value = 'random';" | 1754 "document.getElementById('ea_password_field').value = 'random';" |
1771 "document.getElementById('ea_submit_button').click()"; | 1755 "document.getElementById('ea_submit_button').click()"; |
1772 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 1756 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
1773 observer.Wait(); | 1757 observer.Wait(); |
1774 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 1758 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
1775 } | 1759 } |
1776 | 1760 |
1777 // Similar to the case above, but this time the form persists after | 1761 // Similar to the case above, but this time the form persists after |
1778 // 'history.pushState()'. The password manager should find the login form even | 1762 // 'history.pushState()'. The password manager should find the login form even |
1779 // if the action of the form is empty. Save password prompt should not show up. | 1763 // if the action of the form is empty. Save password prompt should not show up. |
1780 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 1764 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
1781 PromptForPushStateWhenFormWithEmptyActionPersists) { | 1765 PromptForPushStateWhenFormWithEmptyActionPersists) { |
1782 NavigateToFile("/password/password_push_state.html"); | 1766 NavigateToFile("/password/password_push_state.html"); |
1783 | 1767 |
1784 NavigationObserver observer(WebContents()); | 1768 NavigationObserver observer(WebContents()); |
1785 observer.set_quit_on_entry_committed(true); | 1769 observer.set_quit_on_entry_committed(true); |
1786 std::unique_ptr<BubbleObserver> prompt_observer( | 1770 std::unique_ptr<BubbleObserver> prompt_observer( |
1787 new BubbleObserver(WebContents())); | 1771 new BubbleObserver(WebContents())); |
1788 std::string fill_and_submit = | 1772 std::string fill_and_submit = |
1789 "should_delete_testform = false;" | 1773 "should_delete_testform = false;" |
1790 "document.getElementById('ea_username_field').value = 'temp';" | 1774 "document.getElementById('ea_username_field').value = 'temp';" |
1791 "document.getElementById('ea_password_field').value = 'random';" | 1775 "document.getElementById('ea_password_field').value = 'random';" |
1792 "document.getElementById('ea_submit_button').click()"; | 1776 "document.getElementById('ea_submit_button').click()"; |
1793 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 1777 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
1794 observer.Wait(); | 1778 observer.Wait(); |
1795 EXPECT_FALSE(prompt_observer->IsShowingSavePrompt()); | 1779 EXPECT_FALSE(prompt_observer->WasSavePromptShown()); |
1796 } | 1780 } |
1797 | 1781 |
1798 // Current and target URLs contain different parameters and references. This | 1782 // Current and target URLs contain different parameters and references. This |
1799 // test checks that parameters and references in origins are ignored for | 1783 // test checks that parameters and references in origins are ignored for |
1800 // form origin comparison. | 1784 // form origin comparison. |
1801 IN_PROC_BROWSER_TEST_F( | 1785 IN_PROC_BROWSER_TEST_F( |
1802 PasswordManagerBrowserTestBase, | 1786 PasswordManagerBrowserTestBase, |
1803 PromptForPushStateWhenFormDisappears_ParametersInOrigins) { | 1787 PromptForPushStateWhenFormDisappears_ParametersInOrigins) { |
1804 NavigateToFile("/password/password_push_state.html?login#r"); | 1788 NavigateToFile("/password/password_push_state.html?login#r"); |
1805 | 1789 |
1806 NavigationObserver observer(WebContents()); | 1790 NavigationObserver observer(WebContents()); |
1807 observer.set_quit_on_entry_committed(true); | 1791 observer.set_quit_on_entry_committed(true); |
1808 std::unique_ptr<BubbleObserver> prompt_observer( | 1792 std::unique_ptr<BubbleObserver> prompt_observer( |
1809 new BubbleObserver(WebContents())); | 1793 new BubbleObserver(WebContents())); |
1810 std::string fill_and_submit = | 1794 std::string fill_and_submit = |
1811 "add_parameters_to_target_url = true;" | 1795 "add_parameters_to_target_url = true;" |
1812 "document.getElementById('pa_username_field').value = 'temp';" | 1796 "document.getElementById('pa_username_field').value = 'temp';" |
1813 "document.getElementById('pa_password_field').value = 'random';" | 1797 "document.getElementById('pa_password_field').value = 'random';" |
1814 "document.getElementById('pa_submit_button').click()"; | 1798 "document.getElementById('pa_submit_button').click()"; |
1815 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 1799 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
1816 observer.Wait(); | 1800 observer.Wait(); |
1817 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 1801 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
1818 } | 1802 } |
1819 | 1803 |
1820 // Similar to the case above, but this time the form persists after | 1804 // Similar to the case above, but this time the form persists after |
1821 // 'history.pushState()'. The password manager should find the login form even | 1805 // 'history.pushState()'. The password manager should find the login form even |
1822 // if target and current URLs contain different parameters or references. | 1806 // if target and current URLs contain different parameters or references. |
1823 // Save password prompt should not show up. | 1807 // Save password prompt should not show up. |
1824 IN_PROC_BROWSER_TEST_F( | 1808 IN_PROC_BROWSER_TEST_F( |
1825 PasswordManagerBrowserTestBase, | 1809 PasswordManagerBrowserTestBase, |
1826 PromptForPushStateWhenFormPersists_ParametersInOrigins) { | 1810 PromptForPushStateWhenFormPersists_ParametersInOrigins) { |
1827 NavigateToFile("/password/password_push_state.html?login#r"); | 1811 NavigateToFile("/password/password_push_state.html?login#r"); |
1828 | 1812 |
1829 NavigationObserver observer(WebContents()); | 1813 NavigationObserver observer(WebContents()); |
1830 observer.set_quit_on_entry_committed(true); | 1814 observer.set_quit_on_entry_committed(true); |
1831 std::unique_ptr<BubbleObserver> prompt_observer( | 1815 std::unique_ptr<BubbleObserver> prompt_observer( |
1832 new BubbleObserver(WebContents())); | 1816 new BubbleObserver(WebContents())); |
1833 std::string fill_and_submit = | 1817 std::string fill_and_submit = |
1834 "should_delete_testform = false;" | 1818 "should_delete_testform = false;" |
1835 "add_parameters_to_target_url = true;" | 1819 "add_parameters_to_target_url = true;" |
1836 "document.getElementById('pa_username_field').value = 'temp';" | 1820 "document.getElementById('pa_username_field').value = 'temp';" |
1837 "document.getElementById('pa_password_field').value = 'random';" | 1821 "document.getElementById('pa_password_field').value = 'random';" |
1838 "document.getElementById('pa_submit_button').click()"; | 1822 "document.getElementById('pa_submit_button').click()"; |
1839 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 1823 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
1840 observer.Wait(); | 1824 observer.Wait(); |
1841 EXPECT_FALSE(prompt_observer->IsShowingSavePrompt()); | 1825 EXPECT_FALSE(prompt_observer->WasSavePromptShown()); |
1842 } | 1826 } |
1843 | 1827 |
1844 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 1828 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
1845 InFrameNavigationDoesNotClearPopupState) { | 1829 InFrameNavigationDoesNotClearPopupState) { |
1846 scoped_refptr<password_manager::TestPasswordStore> password_store = | 1830 scoped_refptr<password_manager::TestPasswordStore> password_store = |
1847 static_cast<password_manager::TestPasswordStore*>( | 1831 static_cast<password_manager::TestPasswordStore*>( |
1848 PasswordStoreFactory::GetForProfile( | 1832 PasswordStoreFactory::GetForProfile( |
1849 browser()->profile(), ServiceAccessType::IMPLICIT_ACCESS) | 1833 browser()->profile(), ServiceAccessType::IMPLICIT_ACCESS) |
1850 .get()); | 1834 .get()); |
1851 autofill::PasswordForm signin_form; | 1835 autofill::PasswordForm signin_form; |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1906 std::unique_ptr<BubbleObserver> prompt_observer( | 1890 std::unique_ptr<BubbleObserver> prompt_observer( |
1907 new BubbleObserver(WebContents())); | 1891 new BubbleObserver(WebContents())); |
1908 std::string fill_and_submit = | 1892 std::string fill_and_submit = |
1909 "document.getElementById('chg_username_field').value = 'temp';" | 1893 "document.getElementById('chg_username_field').value = 'temp';" |
1910 "document.getElementById('chg_password_field').value = 'random';" | 1894 "document.getElementById('chg_password_field').value = 'random';" |
1911 "document.getElementById('chg_new_password_1').value = 'random1';" | 1895 "document.getElementById('chg_new_password_1').value = 'random1';" |
1912 "document.getElementById('chg_new_password_2').value = 'random1';" | 1896 "document.getElementById('chg_new_password_2').value = 'random1';" |
1913 "document.getElementById('chg_submit_button').click()"; | 1897 "document.getElementById('chg_submit_button').click()"; |
1914 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 1898 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
1915 observer.Wait(); | 1899 observer.Wait(); |
1916 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 1900 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
1917 } | 1901 } |
1918 | 1902 |
1919 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 1903 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
1920 ChangePwdFormPushStateBubbleShown) { | 1904 ChangePwdFormPushStateBubbleShown) { |
1921 NavigateToFile("/password/password_push_state.html"); | 1905 NavigateToFile("/password/password_push_state.html"); |
1922 | 1906 |
1923 NavigationObserver observer(WebContents()); | 1907 NavigationObserver observer(WebContents()); |
1924 observer.set_quit_on_entry_committed(true); | 1908 observer.set_quit_on_entry_committed(true); |
1925 std::unique_ptr<BubbleObserver> prompt_observer( | 1909 std::unique_ptr<BubbleObserver> prompt_observer( |
1926 new BubbleObserver(WebContents())); | 1910 new BubbleObserver(WebContents())); |
1927 std::string fill_and_submit = | 1911 std::string fill_and_submit = |
1928 "document.getElementById('chg_username_field').value = 'temp';" | 1912 "document.getElementById('chg_username_field').value = 'temp';" |
1929 "document.getElementById('chg_password_field').value = 'random';" | 1913 "document.getElementById('chg_password_field').value = 'random';" |
1930 "document.getElementById('chg_new_password_1').value = 'random1';" | 1914 "document.getElementById('chg_new_password_1').value = 'random1';" |
1931 "document.getElementById('chg_new_password_2').value = 'random1';" | 1915 "document.getElementById('chg_new_password_2').value = 'random1';" |
1932 "document.getElementById('chg_submit_button').click()"; | 1916 "document.getElementById('chg_submit_button').click()"; |
1933 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 1917 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
1934 observer.Wait(); | 1918 observer.Wait(); |
1935 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 1919 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
1936 } | 1920 } |
1937 | 1921 |
1938 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, NoPromptOnBack) { | 1922 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, NoPromptOnBack) { |
1939 // Go to a successful landing page through submitting first, so that it is | 1923 // Go to a successful landing page through submitting first, so that it is |
1940 // reachable through going back, and the remembered page transition is form | 1924 // reachable through going back, and the remembered page transition is form |
1941 // submit. There is no need to submit non-empty strings. | 1925 // submit. There is no need to submit non-empty strings. |
1942 NavigateToFile("/password/password_form.html"); | 1926 NavigateToFile("/password/password_form.html"); |
1943 | 1927 |
1944 NavigationObserver dummy_submit_observer(WebContents()); | 1928 NavigationObserver dummy_submit_observer(WebContents()); |
1945 std::string just_submit = | 1929 std::string just_submit = |
(...skipping 11 matching lines...) Expand all Loading... |
1957 // The (dummy) submit is necessary to provisionally save the typed password. A | 1941 // The (dummy) submit is necessary to provisionally save the typed password. A |
1958 // user typing in the password field would not need to submit to provisionally | 1942 // user typing in the password field would not need to submit to provisionally |
1959 // save it, but the script cannot trigger that just by assigning to the | 1943 // save it, but the script cannot trigger that just by assigning to the |
1960 // field's value. | 1944 // field's value. |
1961 std::string fill_and_back = | 1945 std::string fill_and_back = |
1962 "document.getElementById('password_field').value = 'random';" | 1946 "document.getElementById('password_field').value = 'random';" |
1963 "document.getElementById('input_submit_button').click();" | 1947 "document.getElementById('input_submit_button').click();" |
1964 "window.history.back();"; | 1948 "window.history.back();"; |
1965 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_back)); | 1949 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_back)); |
1966 observer.Wait(); | 1950 observer.Wait(); |
1967 EXPECT_FALSE(prompt_observer->IsShowingSavePrompt()); | 1951 EXPECT_FALSE(prompt_observer->WasSavePromptShown()); |
1968 } | 1952 } |
1969 | 1953 |
1970 // Regression test for http://crbug.com/452306 | 1954 // Regression test for http://crbug.com/452306 |
1971 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 1955 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
1972 ChangingTextToPasswordFieldOnSignupForm) { | 1956 ChangingTextToPasswordFieldOnSignupForm) { |
1973 NavigateToFile("/password/signup_form.html"); | 1957 NavigateToFile("/password/signup_form.html"); |
1974 | 1958 |
1975 // In this case, pretend that username_field is actually a password field | 1959 // In this case, pretend that username_field is actually a password field |
1976 // that starts as a text field to simulate placeholder. | 1960 // that starts as a text field to simulate placeholder. |
1977 NavigationObserver observer(WebContents()); | 1961 NavigationObserver observer(WebContents()); |
1978 std::unique_ptr<BubbleObserver> prompt_observer( | 1962 std::unique_ptr<BubbleObserver> prompt_observer( |
1979 new BubbleObserver(WebContents())); | 1963 new BubbleObserver(WebContents())); |
1980 std::string change_and_submit = | 1964 std::string change_and_submit = |
1981 "document.getElementById('other_info').value = 'username';" | 1965 "document.getElementById('other_info').value = 'username';" |
1982 "document.getElementById('username_field').type = 'password';" | 1966 "document.getElementById('username_field').type = 'password';" |
1983 "document.getElementById('username_field').value = 'mypass';" | 1967 "document.getElementById('username_field').value = 'mypass';" |
1984 "document.getElementById('password_field').value = 'mypass';" | 1968 "document.getElementById('password_field').value = 'mypass';" |
1985 "document.getElementById('testform').submit();"; | 1969 "document.getElementById('testform').submit();"; |
1986 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), change_and_submit)); | 1970 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), change_and_submit)); |
1987 observer.Wait(); | 1971 observer.Wait(); |
1988 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 1972 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
1989 } | 1973 } |
1990 | 1974 |
1991 // Regression test for http://crbug.com/451631 | 1975 // Regression test for http://crbug.com/451631 |
1992 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 1976 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
1993 SavingOnManyPasswordFieldsTest) { | 1977 SavingOnManyPasswordFieldsTest) { |
1994 // Simulate Macy's registration page, which contains the normal 2 password | 1978 // Simulate Macy's registration page, which contains the normal 2 password |
1995 // fields for confirming the new password plus 2 more fields for security | 1979 // fields for confirming the new password plus 2 more fields for security |
1996 // questions and credit card. Make sure that saving works correctly for such | 1980 // questions and credit card. Make sure that saving works correctly for such |
1997 // sites. | 1981 // sites. |
1998 NavigateToFile("/password/many_password_signup_form.html"); | 1982 NavigateToFile("/password/many_password_signup_form.html"); |
1999 | 1983 |
2000 NavigationObserver observer(WebContents()); | 1984 NavigationObserver observer(WebContents()); |
2001 std::unique_ptr<BubbleObserver> prompt_observer( | 1985 std::unique_ptr<BubbleObserver> prompt_observer( |
2002 new BubbleObserver(WebContents())); | 1986 new BubbleObserver(WebContents())); |
2003 std::string fill_and_submit = | 1987 std::string fill_and_submit = |
2004 "document.getElementById('username_field').value = 'username';" | 1988 "document.getElementById('username_field').value = 'username';" |
2005 "document.getElementById('password_field').value = 'mypass';" | 1989 "document.getElementById('password_field').value = 'mypass';" |
2006 "document.getElementById('confirm_field').value = 'mypass';" | 1990 "document.getElementById('confirm_field').value = 'mypass';" |
2007 "document.getElementById('security_answer').value = 'hometown';" | 1991 "document.getElementById('security_answer').value = 'hometown';" |
2008 "document.getElementById('SSN').value = '1234';" | 1992 "document.getElementById('SSN').value = '1234';" |
2009 "document.getElementById('testform').submit();"; | 1993 "document.getElementById('testform').submit();"; |
2010 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 1994 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
2011 observer.Wait(); | 1995 observer.Wait(); |
2012 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 1996 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
2013 } | 1997 } |
2014 | 1998 |
2015 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 1999 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
2016 SaveWhenIFrameDestroyedOnFormSubmit) { | 2000 SaveWhenIFrameDestroyedOnFormSubmit) { |
2017 NavigateToFile("/password/frame_detached_on_submit.html"); | 2001 NavigateToFile("/password/frame_detached_on_submit.html"); |
2018 | 2002 |
2019 // Need to pay attention for a message that XHR has finished since there | 2003 // Need to pay attention for a message that XHR has finished since there |
2020 // is no navigation to wait for. | 2004 // is no navigation to wait for. |
2021 content::DOMMessageQueue message_queue; | 2005 content::DOMMessageQueue message_queue; |
2022 | 2006 |
2023 std::unique_ptr<BubbleObserver> prompt_observer( | 2007 std::unique_ptr<BubbleObserver> prompt_observer( |
2024 new BubbleObserver(WebContents())); | 2008 new BubbleObserver(WebContents())); |
2025 std::string fill_and_submit = | 2009 std::string fill_and_submit = |
2026 "var iframe = document.getElementById('login_iframe');" | 2010 "var iframe = document.getElementById('login_iframe');" |
2027 "var frame_doc = iframe.contentDocument;" | 2011 "var frame_doc = iframe.contentDocument;" |
2028 "frame_doc.getElementById('username_field').value = 'temp';" | 2012 "frame_doc.getElementById('username_field').value = 'temp';" |
2029 "frame_doc.getElementById('password_field').value = 'random';" | 2013 "frame_doc.getElementById('password_field').value = 'random';" |
2030 "frame_doc.getElementById('submit_button').click();"; | 2014 "frame_doc.getElementById('submit_button').click();"; |
2031 | 2015 |
2032 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 2016 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
2033 std::string message; | 2017 std::string message; |
2034 while (message_queue.WaitForMessage(&message)) { | 2018 while (message_queue.WaitForMessage(&message)) { |
2035 if (message == "\"SUBMISSION_FINISHED\"") | 2019 if (message == "\"SUBMISSION_FINISHED\"") |
2036 break; | 2020 break; |
2037 } | 2021 } |
2038 | 2022 |
2039 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 2023 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
2040 } | 2024 } |
2041 | 2025 |
2042 // Tests that if a site embeds the login and signup forms into one <form>, the | 2026 // Tests that if a site embeds the login and signup forms into one <form>, the |
2043 // login form still gets autofilled. | 2027 // login form still gets autofilled. |
2044 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 2028 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
2045 AutofillSuggestionsForLoginSignupForm) { | 2029 AutofillSuggestionsForLoginSignupForm) { |
2046 std::string submit = | 2030 std::string submit = |
2047 "document.getElementById('username').value = 'myusername';" | 2031 "document.getElementById('username').value = 'myusername';" |
2048 "document.getElementById('password').value = 'mypassword';" | 2032 "document.getElementById('password').value = 'mypassword';" |
2049 "document.getElementById('submit').click();"; | 2033 "document.getElementById('submit').click();"; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2082 ifrm_observer.Wait(); | 2066 ifrm_observer.Wait(); |
2083 | 2067 |
2084 // Store a password for autofill later | 2068 // Store a password for autofill later |
2085 NavigationObserver init_observer(WebContents()); | 2069 NavigationObserver init_observer(WebContents()); |
2086 init_observer.SetPathToWaitFor("/password/done.html"); | 2070 init_observer.SetPathToWaitFor("/password/done.html"); |
2087 std::unique_ptr<BubbleObserver> prompt_observer( | 2071 std::unique_ptr<BubbleObserver> prompt_observer( |
2088 new BubbleObserver(WebContents())); | 2072 new BubbleObserver(WebContents())); |
2089 std::string init_form = "sendMessage('fill_and_submit');"; | 2073 std::string init_form = "sendMessage('fill_and_submit');"; |
2090 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), init_form)); | 2074 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), init_form)); |
2091 init_observer.Wait(); | 2075 init_observer.Wait(); |
2092 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 2076 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
2093 prompt_observer->AcceptSavePrompt(); | 2077 prompt_observer->AcceptSavePrompt(); |
2094 | 2078 |
2095 // Visit the form again | 2079 // Visit the form again |
2096 NavigationObserver reload_observer(WebContents()); | 2080 NavigationObserver reload_observer(WebContents()); |
2097 NavigateToFile("/password/password_form_in_crosssite_iframe.html"); | 2081 NavigateToFile("/password/password_form_in_crosssite_iframe.html"); |
2098 reload_observer.Wait(); | 2082 reload_observer.Wait(); |
2099 | 2083 |
2100 NavigationObserver ifrm_observer_2(WebContents()); | 2084 NavigationObserver ifrm_observer_2(WebContents()); |
2101 ifrm_observer_2.SetPathToWaitFor("/password/crossite_iframe_content.html"); | 2085 ifrm_observer_2.SetPathToWaitFor("/password/crossite_iframe_content.html"); |
2102 ASSERT_TRUE(content::ExecuteScriptWithoutUserGesture(RenderFrameHost(), | 2086 ASSERT_TRUE(content::ExecuteScriptWithoutUserGesture(RenderFrameHost(), |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2155 std::unique_ptr<BubbleObserver> prompt_observer( | 2139 std::unique_ptr<BubbleObserver> prompt_observer( |
2156 new BubbleObserver(WebContents())); | 2140 new BubbleObserver(WebContents())); |
2157 | 2141 |
2158 std::string submit = | 2142 std::string submit = |
2159 "var ifrmDoc = document.getElementById('iframe').contentDocument;" | 2143 "var ifrmDoc = document.getElementById('iframe').contentDocument;" |
2160 "ifrmDoc.getElementById('username_field').value = 'temp';" | 2144 "ifrmDoc.getElementById('username_field').value = 'temp';" |
2161 "ifrmDoc.getElementById('password_field').value = 'pa55w0rd';" | 2145 "ifrmDoc.getElementById('password_field').value = 'pa55w0rd';" |
2162 "ifrmDoc.getElementById('input_submit_button').click();"; | 2146 "ifrmDoc.getElementById('input_submit_button').click();"; |
2163 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), submit)); | 2147 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), submit)); |
2164 observer.Wait(); | 2148 observer.Wait(); |
2165 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 2149 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
2166 prompt_observer->AcceptSavePrompt(); | 2150 prompt_observer->AcceptSavePrompt(); |
2167 | 2151 |
2168 // Visit the form again | 2152 // Visit the form again |
2169 NavigationObserver reload_observer(WebContents()); | 2153 NavigationObserver reload_observer(WebContents()); |
2170 NavigateToFile("/password/password_form_in_same_origin_iframe.html"); | 2154 NavigateToFile("/password/password_form_in_same_origin_iframe.html"); |
2171 reload_observer.Wait(); | 2155 reload_observer.Wait(); |
2172 | 2156 |
2173 // Verify username is autofilled | 2157 // Verify username is autofilled |
2174 CheckElementValue("iframe", "username_field", "temp"); | 2158 CheckElementValue("iframe", "username_field", "temp"); |
2175 | 2159 |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2283 "document.getElementById('chg_password_wo_username_field').value = " | 2267 "document.getElementById('chg_password_wo_username_field').value = " |
2284 "'old_pw';" | 2268 "'old_pw';" |
2285 "document.getElementById('chg_new_password_wo_username_1').value = " | 2269 "document.getElementById('chg_new_password_wo_username_1').value = " |
2286 "'new_pw';" | 2270 "'new_pw';" |
2287 "document.getElementById('chg_new_password_wo_username_2').value = " | 2271 "document.getElementById('chg_new_password_wo_username_2').value = " |
2288 "'new_pw';" | 2272 "'new_pw';" |
2289 "document.getElementById('chg_submit_wo_username_button').click()"; | 2273 "document.getElementById('chg_submit_wo_username_button').click()"; |
2290 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 2274 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
2291 observer.Wait(); | 2275 observer.Wait(); |
2292 // No credentials stored before, so save bubble is shown. | 2276 // No credentials stored before, so save bubble is shown. |
2293 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 2277 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
2294 prompt_observer->AcceptSavePrompt(); | 2278 prompt_observer->AcceptSavePrompt(); |
2295 // Check that credentials are stored. | 2279 // Check that credentials are stored. |
2296 scoped_refptr<password_manager::TestPasswordStore> password_store = | 2280 scoped_refptr<password_manager::TestPasswordStore> password_store = |
2297 static_cast<password_manager::TestPasswordStore*>( | 2281 static_cast<password_manager::TestPasswordStore*>( |
2298 PasswordStoreFactory::GetForProfile( | 2282 PasswordStoreFactory::GetForProfile( |
2299 browser()->profile(), ServiceAccessType::IMPLICIT_ACCESS) | 2283 browser()->profile(), ServiceAccessType::IMPLICIT_ACCESS) |
2300 .get()); | 2284 .get()); |
2301 WaitForPasswordStore(); | 2285 WaitForPasswordStore(); |
2302 EXPECT_FALSE(password_store->IsEmpty()); | 2286 EXPECT_FALSE(password_store->IsEmpty()); |
2303 CheckThatCredentialsStored(password_store.get(), base::ASCIIToUTF16(""), | 2287 CheckThatCredentialsStored(password_store.get(), base::ASCIIToUTF16(""), |
(...skipping 23 matching lines...) Expand all Loading... |
2327 "document.getElementById('chg_password_wo_username_field').value = " | 2311 "document.getElementById('chg_password_wo_username_field').value = " |
2328 "'random';" | 2312 "'random';" |
2329 "document.getElementById('chg_new_password_wo_username_1').value = " | 2313 "document.getElementById('chg_new_password_wo_username_1').value = " |
2330 "'new_pw';" | 2314 "'new_pw';" |
2331 "document.getElementById('chg_new_password_wo_username_2').value = " | 2315 "document.getElementById('chg_new_password_wo_username_2').value = " |
2332 "'new_pw';" | 2316 "'new_pw';" |
2333 "document.getElementById('chg_submit_wo_username_button').click()"; | 2317 "document.getElementById('chg_submit_wo_username_button').click()"; |
2334 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), | 2318 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), |
2335 fill_and_submit_change_password)); | 2319 fill_and_submit_change_password)); |
2336 observer.Wait(); | 2320 observer.Wait(); |
2337 EXPECT_TRUE(prompt_observer->IsShowingUpdatePrompt()); | 2321 EXPECT_TRUE(prompt_observer->WasUpdatePromptShown()); |
2338 | 2322 |
2339 // We emulate that the user clicks "Update" button. | 2323 // We emulate that the user clicks "Update" button. |
2340 const autofill::PasswordForm& pending_credentials = | 2324 const autofill::PasswordForm& pending_credentials = |
2341 ManagePasswordsUIController::FromWebContents(WebContents()) | 2325 ManagePasswordsUIController::FromWebContents(WebContents()) |
2342 ->GetPendingPassword(); | 2326 ->GetPendingPassword(); |
2343 prompt_observer->AcceptUpdatePrompt(pending_credentials); | 2327 prompt_observer->AcceptUpdatePrompt(pending_credentials); |
2344 | 2328 |
2345 WaitForPasswordStore(); | 2329 WaitForPasswordStore(); |
2346 CheckThatCredentialsStored(password_store.get(), base::ASCIIToUTF16("temp"), | 2330 CheckThatCredentialsStored(password_store.get(), base::ASCIIToUTF16("temp"), |
2347 base::ASCIIToUTF16("new_pw")); | 2331 base::ASCIIToUTF16("new_pw")); |
(...skipping 25 matching lines...) Expand all Loading... |
2373 std::unique_ptr<BubbleObserver> prompt_observer( | 2357 std::unique_ptr<BubbleObserver> prompt_observer( |
2374 new BubbleObserver(WebContents())); | 2358 new BubbleObserver(WebContents())); |
2375 std::string fill_and_submit = | 2359 std::string fill_and_submit = |
2376 "document.getElementById('username_field').value = 'temp';" | 2360 "document.getElementById('username_field').value = 'temp';" |
2377 "document.getElementById('password_field').value = 'new_pw';" | 2361 "document.getElementById('password_field').value = 'new_pw';" |
2378 "document.getElementById('input_submit_button').click()"; | 2362 "document.getElementById('input_submit_button').click()"; |
2379 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 2363 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
2380 observer.Wait(); | 2364 observer.Wait(); |
2381 // The stored password "pw" was overriden with "new_pw", so update prompt is | 2365 // The stored password "pw" was overriden with "new_pw", so update prompt is |
2382 // expected. | 2366 // expected. |
2383 EXPECT_TRUE(prompt_observer->IsShowingUpdatePrompt()); | 2367 EXPECT_TRUE(prompt_observer->WasUpdatePromptShown()); |
2384 | 2368 |
2385 const autofill::PasswordForm stored_form = | 2369 const autofill::PasswordForm stored_form = |
2386 password_store->stored_passwords().begin()->second[0]; | 2370 password_store->stored_passwords().begin()->second[0]; |
2387 prompt_observer->AcceptUpdatePrompt(stored_form); | 2371 prompt_observer->AcceptUpdatePrompt(stored_form); |
2388 WaitForPasswordStore(); | 2372 WaitForPasswordStore(); |
2389 CheckThatCredentialsStored(password_store.get(), base::ASCIIToUTF16("temp"), | 2373 CheckThatCredentialsStored(password_store.get(), base::ASCIIToUTF16("temp"), |
2390 base::ASCIIToUTF16("new_pw")); | 2374 base::ASCIIToUTF16("new_pw")); |
2391 } | 2375 } |
2392 | 2376 |
2393 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 2377 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
(...skipping 16 matching lines...) Expand all Loading... |
2410 std::unique_ptr<BubbleObserver> prompt_observer( | 2394 std::unique_ptr<BubbleObserver> prompt_observer( |
2411 new BubbleObserver(WebContents())); | 2395 new BubbleObserver(WebContents())); |
2412 std::string fill_and_submit = | 2396 std::string fill_and_submit = |
2413 "document.getElementById('username_field').value = 'temp';" | 2397 "document.getElementById('username_field').value = 'temp';" |
2414 "document.getElementById('password_field').value = 'pw';" | 2398 "document.getElementById('password_field').value = 'pw';" |
2415 "document.getElementById('input_submit_button').click()"; | 2399 "document.getElementById('input_submit_button').click()"; |
2416 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 2400 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
2417 observer.Wait(); | 2401 observer.Wait(); |
2418 // The stored password "pw" was not overriden, so update prompt is not | 2402 // The stored password "pw" was not overriden, so update prompt is not |
2419 // expected. | 2403 // expected. |
2420 EXPECT_FALSE(prompt_observer->IsShowingUpdatePrompt()); | 2404 EXPECT_FALSE(prompt_observer->WasUpdatePromptShown()); |
2421 CheckThatCredentialsStored(password_store.get(), base::ASCIIToUTF16("temp"), | 2405 CheckThatCredentialsStored(password_store.get(), base::ASCIIToUTF16("temp"), |
2422 base::ASCIIToUTF16("pw")); | 2406 base::ASCIIToUTF16("pw")); |
2423 } | 2407 } |
2424 | 2408 |
2425 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 2409 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
2426 ChangePwdWhenTheFormContainNotUsernameTextfield) { | 2410 ChangePwdWhenTheFormContainNotUsernameTextfield) { |
2427 // At first let us save credentials to the PasswordManager. | 2411 // At first let us save credentials to the PasswordManager. |
2428 scoped_refptr<password_manager::TestPasswordStore> password_store = | 2412 scoped_refptr<password_manager::TestPasswordStore> password_store = |
2429 static_cast<password_manager::TestPasswordStore*>( | 2413 static_cast<password_manager::TestPasswordStore*>( |
2430 PasswordStoreFactory::GetForProfile( | 2414 PasswordStoreFactory::GetForProfile( |
(...skipping 15 matching lines...) Expand all Loading... |
2446 "document.getElementById('chg_password_withtext_field').value" | 2430 "document.getElementById('chg_password_withtext_field').value" |
2447 " = 'random';" | 2431 " = 'random';" |
2448 "document.getElementById('chg_new_password_withtext_username_1').value" | 2432 "document.getElementById('chg_new_password_withtext_username_1').value" |
2449 " = 'new_pw';" | 2433 " = 'new_pw';" |
2450 "document.getElementById('chg_new_password_withtext_username_2').value" | 2434 "document.getElementById('chg_new_password_withtext_username_2').value" |
2451 " = 'new_pw';" | 2435 " = 'new_pw';" |
2452 "document.getElementById('chg_submit_withtext_button').click()"; | 2436 "document.getElementById('chg_submit_withtext_button').click()"; |
2453 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), | 2437 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), |
2454 fill_and_submit_change_password)); | 2438 fill_and_submit_change_password)); |
2455 observer.Wait(); | 2439 observer.Wait(); |
2456 EXPECT_TRUE(prompt_observer->IsShowingUpdatePrompt()); | 2440 EXPECT_TRUE(prompt_observer->WasUpdatePromptShown()); |
2457 | 2441 |
2458 const autofill::PasswordForm stored_form = | 2442 const autofill::PasswordForm stored_form = |
2459 password_store->stored_passwords().begin()->second[0]; | 2443 password_store->stored_passwords().begin()->second[0]; |
2460 prompt_observer->AcceptUpdatePrompt(stored_form); | 2444 prompt_observer->AcceptUpdatePrompt(stored_form); |
2461 WaitForPasswordStore(); | 2445 WaitForPasswordStore(); |
2462 CheckThatCredentialsStored(password_store.get(), base::ASCIIToUTF16("temp"), | 2446 CheckThatCredentialsStored(password_store.get(), base::ASCIIToUTF16("temp"), |
2463 base::ASCIIToUTF16("new_pw")); | 2447 base::ASCIIToUTF16("new_pw")); |
2464 } | 2448 } |
2465 | 2449 |
2466 // Test whether the password form with the username and password fields having | 2450 // Test whether the password form with the username and password fields having |
(...skipping 470 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2937 // Check that password save bubble is shown. | 2921 // Check that password save bubble is shown. |
2938 NavigateToFile("/password/password_form.html"); | 2922 NavigateToFile("/password/password_form.html"); |
2939 NavigationObserver observer(WebContents()); | 2923 NavigationObserver observer(WebContents()); |
2940 std::unique_ptr<BubbleObserver> prompt_observer( | 2924 std::unique_ptr<BubbleObserver> prompt_observer( |
2941 new BubbleObserver(WebContents())); | 2925 new BubbleObserver(WebContents())); |
2942 std::string fill_and_submit = | 2926 std::string fill_and_submit = |
2943 "document.getElementById('retry_password_field').value = 'pw';" | 2927 "document.getElementById('retry_password_field').value = 'pw';" |
2944 "document.getElementById('retry_submit_button').click()"; | 2928 "document.getElementById('retry_submit_button').click()"; |
2945 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 2929 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
2946 observer.Wait(); | 2930 observer.Wait(); |
2947 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 2931 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
2948 prompt_observer->AcceptSavePrompt(); | 2932 prompt_observer->AcceptSavePrompt(); |
2949 | 2933 |
2950 WaitForPasswordStore(); | 2934 WaitForPasswordStore(); |
2951 CheckThatCredentialsStored(password_store.get(), base::string16(), | 2935 CheckThatCredentialsStored(password_store.get(), base::string16(), |
2952 base::ASCIIToUTF16("pw")); | 2936 base::ASCIIToUTF16("pw")); |
2953 } | 2937 } |
2954 | 2938 |
2955 // Tests that no bubble shown when a password form without username submitted | 2939 // Tests that no bubble shown when a password form without username submitted |
2956 // and there is stored credentials with the same password. | 2940 // and there is stored credentials with the same password. |
2957 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 2941 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
(...skipping 17 matching lines...) Expand all Loading... |
2975 // same in one of the stored credentials. | 2959 // same in one of the stored credentials. |
2976 NavigateToFile("/password/password_form.html"); | 2960 NavigateToFile("/password/password_form.html"); |
2977 NavigationObserver observer(WebContents()); | 2961 NavigationObserver observer(WebContents()); |
2978 std::unique_ptr<BubbleObserver> prompt_observer( | 2962 std::unique_ptr<BubbleObserver> prompt_observer( |
2979 new BubbleObserver(WebContents())); | 2963 new BubbleObserver(WebContents())); |
2980 std::string fill_and_submit = | 2964 std::string fill_and_submit = |
2981 "document.getElementById('retry_password_field').value = 'pw';" | 2965 "document.getElementById('retry_password_field').value = 'pw';" |
2982 "document.getElementById('retry_submit_button').click()"; | 2966 "document.getElementById('retry_submit_button').click()"; |
2983 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 2967 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
2984 observer.Wait(); | 2968 observer.Wait(); |
2985 EXPECT_FALSE(prompt_observer->IsShowingSavePrompt()); | 2969 EXPECT_FALSE(prompt_observer->WasSavePromptShown()); |
2986 EXPECT_FALSE(prompt_observer->IsShowingUpdatePrompt()); | 2970 EXPECT_FALSE(prompt_observer->WasUpdatePromptShown()); |
2987 } | 2971 } |
2988 | 2972 |
2989 // Tests that the update bubble shown when a password form without username is | 2973 // Tests that the update bubble shown when a password form without username is |
2990 // submitted and there are stored credentials but with different password. | 2974 // submitted and there are stored credentials but with different password. |
2991 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 2975 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
2992 PasswordRetryFormUpdateBubbleShown) { | 2976 PasswordRetryFormUpdateBubbleShown) { |
2993 // At first let us save credentials to the PasswordManager. | 2977 // At first let us save credentials to the PasswordManager. |
2994 scoped_refptr<password_manager::TestPasswordStore> password_store = | 2978 scoped_refptr<password_manager::TestPasswordStore> password_store = |
2995 static_cast<password_manager::TestPasswordStore*>( | 2979 static_cast<password_manager::TestPasswordStore*>( |
2996 PasswordStoreFactory::GetForProfile( | 2980 PasswordStoreFactory::GetForProfile( |
2997 browser()->profile(), ServiceAccessType::IMPLICIT_ACCESS) | 2981 browser()->profile(), ServiceAccessType::IMPLICIT_ACCESS) |
2998 .get()); | 2982 .get()); |
2999 autofill::PasswordForm signin_form; | 2983 autofill::PasswordForm signin_form; |
3000 signin_form.signon_realm = embedded_test_server()->base_url().spec(); | 2984 signin_form.signon_realm = embedded_test_server()->base_url().spec(); |
3001 signin_form.username_value = base::ASCIIToUTF16("temp"); | 2985 signin_form.username_value = base::ASCIIToUTF16("temp"); |
3002 signin_form.password_value = base::ASCIIToUTF16("pw"); | 2986 signin_form.password_value = base::ASCIIToUTF16("pw"); |
3003 password_store->AddLogin(signin_form); | 2987 password_store->AddLogin(signin_form); |
3004 | 2988 |
3005 // Check that password update bubble is shown. | 2989 // Check that password update bubble is shown. |
3006 NavigateToFile("/password/password_form.html"); | 2990 NavigateToFile("/password/password_form.html"); |
3007 NavigationObserver observer(WebContents()); | 2991 NavigationObserver observer(WebContents()); |
3008 std::unique_ptr<BubbleObserver> prompt_observer( | 2992 std::unique_ptr<BubbleObserver> prompt_observer( |
3009 new BubbleObserver(WebContents())); | 2993 new BubbleObserver(WebContents())); |
3010 std::string fill_and_submit = | 2994 std::string fill_and_submit = |
3011 "document.getElementById('retry_password_field').value = 'new_pw';" | 2995 "document.getElementById('retry_password_field').value = 'new_pw';" |
3012 "document.getElementById('retry_submit_button').click()"; | 2996 "document.getElementById('retry_submit_button').click()"; |
3013 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 2997 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
3014 observer.Wait(); | 2998 observer.Wait(); |
3015 // The new password "new_pw" is used, so update prompt is expected. | 2999 // The new password "new_pw" is used, so update prompt is expected. |
3016 EXPECT_TRUE(prompt_observer->IsShowingUpdatePrompt()); | 3000 EXPECT_TRUE(prompt_observer->WasUpdatePromptShown()); |
3017 | 3001 |
3018 const autofill::PasswordForm stored_form = | 3002 const autofill::PasswordForm stored_form = |
3019 password_store->stored_passwords().begin()->second[0]; | 3003 password_store->stored_passwords().begin()->second[0]; |
3020 prompt_observer->AcceptUpdatePrompt(stored_form); | 3004 prompt_observer->AcceptUpdatePrompt(stored_form); |
3021 | 3005 |
3022 WaitForPasswordStore(); | 3006 WaitForPasswordStore(); |
3023 CheckThatCredentialsStored(password_store.get(), base::ASCIIToUTF16("temp"), | 3007 CheckThatCredentialsStored(password_store.get(), base::ASCIIToUTF16("temp"), |
3024 base::ASCIIToUTF16("new_pw")); | 3008 base::ASCIIToUTF16("new_pw")); |
3025 } | 3009 } |
3026 | 3010 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3062 | 3046 |
3063 NavigationObserver observer(WebContents()); | 3047 NavigationObserver observer(WebContents()); |
3064 std::unique_ptr<BubbleObserver> prompt_observer( | 3048 std::unique_ptr<BubbleObserver> prompt_observer( |
3065 new BubbleObserver(WebContents())); | 3049 new BubbleObserver(WebContents())); |
3066 std::string fill_and_submit = | 3050 std::string fill_and_submit = |
3067 "document.getElementById('username').value = 'temp';" | 3051 "document.getElementById('username').value = 'temp';" |
3068 "document.getElementById('password').value = 'random';" | 3052 "document.getElementById('password').value = 'random';" |
3069 "document.getElementById('submit').click()"; | 3053 "document.getElementById('submit').click()"; |
3070 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); | 3054 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit)); |
3071 observer.Wait(); | 3055 observer.Wait(); |
3072 EXPECT_TRUE(prompt_observer->IsShowingSavePrompt()); | 3056 EXPECT_TRUE(prompt_observer->WasSavePromptShown()); |
3073 } | 3057 } |
3074 | 3058 |
3075 // Tests that password suggestions still work if the fields have the | 3059 // Tests that password suggestions still work if the fields have the |
3076 // "autocomplete" attribute set to off. | 3060 // "autocomplete" attribute set to off. |
3077 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, | 3061 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, |
3078 AutofillSuggestionsForPasswordFormWithAutocompleteOff) { | 3062 AutofillSuggestionsForPasswordFormWithAutocompleteOff) { |
3079 std::string submit = | 3063 std::string submit = |
3080 "document.getElementById('username').value = 'temp';" | 3064 "document.getElementById('username').value = 'temp';" |
3081 "document.getElementById('password').value = 'mypassword';" | 3065 "document.getElementById('password').value = 'mypassword';" |
3082 "document.getElementById('submit').click();"; | 3066 "document.getElementById('submit').click();"; |
(...skipping 29 matching lines...) Expand all Loading... |
3112 NavigationObserver observer(WebContents()); | 3096 NavigationObserver observer(WebContents()); |
3113 std::unique_ptr<BubbleObserver> prompt_observer( | 3097 std::unique_ptr<BubbleObserver> prompt_observer( |
3114 new BubbleObserver(WebContents())); | 3098 new BubbleObserver(WebContents())); |
3115 std::string fill_and_submit_change_password = | 3099 std::string fill_and_submit_change_password = |
3116 "document.getElementById('username_field').value = 'user';" | 3100 "document.getElementById('username_field').value = 'user';" |
3117 "document.getElementById('password_field').value = 'password';" | 3101 "document.getElementById('password_field').value = 'password';" |
3118 "document.getElementById('input_submit_button').click()"; | 3102 "document.getElementById('input_submit_button').click()"; |
3119 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), | 3103 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), |
3120 fill_and_submit_change_password)); | 3104 fill_and_submit_change_password)); |
3121 observer.Wait(); | 3105 observer.Wait(); |
3122 EXPECT_FALSE(prompt_observer->IsShowingSavePrompt()); | 3106 EXPECT_FALSE(prompt_observer->WasSavePromptShown()); |
3123 | 3107 |
3124 // Verify that the form's 'skip_zero_click' is not updated. | 3108 // Verify that the form's 'skip_zero_click' is not updated. |
3125 auto& passwords_map = password_store->stored_passwords(); | 3109 auto& passwords_map = password_store->stored_passwords(); |
3126 ASSERT_EQ(1u, passwords_map.size()); | 3110 ASSERT_EQ(1u, passwords_map.size()); |
3127 auto& passwords_vector = passwords_map.begin()->second; | 3111 auto& passwords_vector = passwords_map.begin()->second; |
3128 ASSERT_EQ(1u, passwords_vector.size()); | 3112 ASSERT_EQ(1u, passwords_vector.size()); |
3129 const autofill::PasswordForm& form = passwords_vector[0]; | 3113 const autofill::PasswordForm& form = passwords_vector[0]; |
3130 EXPECT_EQ(base::ASCIIToUTF16("user"), form.username_value); | 3114 EXPECT_EQ(base::ASCIIToUTF16("user"), form.username_value); |
3131 EXPECT_EQ(base::ASCIIToUTF16("password"), form.password_value); | 3115 EXPECT_EQ(base::ASCIIToUTF16("password"), form.password_value); |
3132 EXPECT_TRUE(form.skip_zero_click); | 3116 EXPECT_TRUE(form.skip_zero_click); |
(...skipping 22 matching lines...) Expand all Loading... |
3155 NavigationObserver observer(WebContents()); | 3139 NavigationObserver observer(WebContents()); |
3156 std::unique_ptr<BubbleObserver> prompt_observer( | 3140 std::unique_ptr<BubbleObserver> prompt_observer( |
3157 new BubbleObserver(WebContents())); | 3141 new BubbleObserver(WebContents())); |
3158 std::string fill_and_submit_change_password = | 3142 std::string fill_and_submit_change_password = |
3159 "document.getElementById('username_field').value = 'user';" | 3143 "document.getElementById('username_field').value = 'user';" |
3160 "document.getElementById('password_field').value = 'password';" | 3144 "document.getElementById('password_field').value = 'password';" |
3161 "document.getElementById('input_submit_button').click()"; | 3145 "document.getElementById('input_submit_button').click()"; |
3162 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), | 3146 ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), |
3163 fill_and_submit_change_password)); | 3147 fill_and_submit_change_password)); |
3164 observer.Wait(); | 3148 observer.Wait(); |
3165 EXPECT_FALSE(prompt_observer->IsShowingSavePrompt()); | 3149 EXPECT_FALSE(prompt_observer->WasSavePromptShown()); |
3166 | 3150 |
3167 // Verify that the form's 'skip_zero_click' is not updated. | 3151 // Verify that the form's 'skip_zero_click' is not updated. |
3168 auto& passwords_map = password_store->stored_passwords(); | 3152 auto& passwords_map = password_store->stored_passwords(); |
3169 ASSERT_EQ(1u, passwords_map.size()); | 3153 ASSERT_EQ(1u, passwords_map.size()); |
3170 auto& passwords_vector = passwords_map.begin()->second; | 3154 auto& passwords_vector = passwords_map.begin()->second; |
3171 ASSERT_EQ(1u, passwords_vector.size()); | 3155 ASSERT_EQ(1u, passwords_vector.size()); |
3172 const autofill::PasswordForm& form = passwords_vector[0]; | 3156 const autofill::PasswordForm& form = passwords_vector[0]; |
3173 EXPECT_EQ(base::ASCIIToUTF16("user"), form.username_value); | 3157 EXPECT_EQ(base::ASCIIToUTF16("user"), form.username_value); |
3174 EXPECT_EQ(base::ASCIIToUTF16("password"), form.password_value); | 3158 EXPECT_EQ(base::ASCIIToUTF16("password"), form.password_value); |
3175 EXPECT_TRUE(form.skip_zero_click); | 3159 EXPECT_TRUE(form.skip_zero_click); |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3306 ASSERT_TRUE(content::ExecuteScriptWithoutUserGesture(RenderFrameHost(), | 3290 ASSERT_TRUE(content::ExecuteScriptWithoutUserGesture(RenderFrameHost(), |
3307 "var noop = 'noop';")); | 3291 "var noop = 'noop';")); |
3308 // Ensure the warning was not triggered. | 3292 // Ensure the warning was not triggered. |
3309 content::RunAllBlockingPoolTasksUntilIdle(); | 3293 content::RunAllBlockingPoolTasksUntilIdle(); |
3310 ASSERT_FALSE(observing_autofill_client->popup_shown()); | 3294 ASSERT_FALSE(observing_autofill_client->popup_shown()); |
3311 // Ensure the histogram remains empty. | 3295 // Ensure the histogram remains empty. |
3312 histograms.ExpectTotalCount(kHistogram, 0); | 3296 histograms.ExpectTotalCount(kHistogram, 0); |
3313 } | 3297 } |
3314 | 3298 |
3315 } // namespace password_manager | 3299 } // namespace password_manager |
OLD | NEW |