| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <vector> | 5 #include <vector> |
| 6 | 6 |
| 7 #include "base/message_loop/message_loop.h" | 7 #include "base/message_loop/message_loop.h" |
| 8 #include "base/strings/string_util.h" | 8 #include "base/strings/string_util.h" |
| 9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
| 10 #include "chrome/browser/password_manager/mock_password_store.h" | 10 #include "chrome/browser/password_manager/mock_password_store.h" |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 78 form.password_autocomplete_set = true; | 78 form.password_autocomplete_set = true; |
| 79 form.submit_element = ASCIIToUTF16("signIn"); | 79 form.submit_element = ASCIIToUTF16("signIn"); |
| 80 form.signon_realm = "http://www.google.com"; | 80 form.signon_realm = "http://www.google.com"; |
| 81 return form; | 81 return form; |
| 82 } | 82 } |
| 83 | 83 |
| 84 PasswordManager* manager() { | 84 PasswordManager* manager() { |
| 85 return PasswordManager::FromWebContents(web_contents()); | 85 return PasswordManager::FromWebContents(web_contents()); |
| 86 } | 86 } |
| 87 | 87 |
| 88 void OnPasswordFormSubmitted(const content::PasswordForm& form) { |
| 89 manager()->OnPasswordFormSubmitted(form); |
| 90 } |
| 91 |
| 88 scoped_refptr<MockPasswordStore> store_; | 92 scoped_refptr<MockPasswordStore> store_; |
| 89 MockPasswordManagerDelegate delegate_; // Owned by manager_. | 93 MockPasswordManagerDelegate delegate_; // Owned by manager_. |
| 90 }; | 94 }; |
| 91 | 95 |
| 92 MATCHER_P(FormMatches, form, "") { | 96 MATCHER_P(FormMatches, form, "") { |
| 93 return form.signon_realm == arg.signon_realm && | 97 return form.signon_realm == arg.signon_realm && |
| 94 form.origin == arg.origin && | 98 form.origin == arg.origin && |
| 95 form.action == arg.action && | 99 form.action == arg.action && |
| 96 form.username_element == arg.username_element && | 100 form.username_element == arg.username_element && |
| 97 form.password_element == arg.password_element && | 101 form.password_element == arg.password_element && |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 201 std::vector<PasswordForm*> result; // Empty password store. | 205 std::vector<PasswordForm*> result; // Empty password store. |
| 202 EXPECT_CALL(delegate_, FillPasswordForm(_)).Times(Exactly(0)); | 206 EXPECT_CALL(delegate_, FillPasswordForm(_)).Times(Exactly(0)); |
| 203 EXPECT_CALL(*store_.get(), GetLogins(_, _)) | 207 EXPECT_CALL(*store_.get(), GetLogins(_, _)) |
| 204 .WillOnce(DoAll(WithArg<1>(InvokeConsumer(result)), Return(1))); | 208 .WillOnce(DoAll(WithArg<1>(InvokeConsumer(result)), Return(1))); |
| 205 std::vector<PasswordForm> observed; | 209 std::vector<PasswordForm> observed; |
| 206 PasswordForm form(MakeSimpleForm()); | 210 PasswordForm form(MakeSimpleForm()); |
| 207 observed.push_back(form); | 211 observed.push_back(form); |
| 208 manager()->OnPasswordFormsParsed(observed); // The initial load. | 212 manager()->OnPasswordFormsParsed(observed); // The initial load. |
| 209 manager()->OnPasswordFormsRendered(observed); // The initial layout. | 213 manager()->OnPasswordFormsRendered(observed); // The initial layout. |
| 210 | 214 |
| 211 PasswordForm empty_form(form); | 215 // No message from the renderer that a password was submitted. No |
| 212 empty_form.username_value = string16(); | 216 // expected calls. |
| 213 empty_form.password_value = string16(); | |
| 214 content::LoadCommittedDetails details; | |
| 215 content::FrameNavigateParams params; | |
| 216 params.password_form = empty_form; | |
| 217 manager()->DidNavigateAnyFrame(details, params); | |
| 218 | |
| 219 // No expected calls. | |
| 220 EXPECT_CALL(delegate_, AddSavePasswordInfoBarIfPermitted(_)).Times(0); | 217 EXPECT_CALL(delegate_, AddSavePasswordInfoBarIfPermitted(_)).Times(0); |
| 221 observed.clear(); | 218 observed.clear(); |
| 222 manager()->OnPasswordFormsParsed(observed); // The post-navigation load. | 219 manager()->OnPasswordFormsParsed(observed); // The post-navigation load. |
| 223 manager()->OnPasswordFormsRendered(observed); // The post-navigation layout. | 220 manager()->OnPasswordFormsRendered(observed); // The post-navigation layout. |
| 224 } | 221 } |
| 225 | 222 |
| 226 TEST_F(PasswordManagerTest, FormSubmitAfterNavigateSubframe) { | 223 TEST_F(PasswordManagerTest, FormSubmitAfterNavigateSubframe) { |
| 227 // Test that navigating a subframe does not prevent us from showing the save | 224 // Test that navigating a subframe does not prevent us from showing the save |
| 228 // password infobar. | 225 // password infobar. |
| 229 std::vector<PasswordForm*> result; // Empty password store. | 226 std::vector<PasswordForm*> result; // Empty password store. |
| 230 EXPECT_CALL(delegate_, FillPasswordForm(_)).Times(Exactly(0)); | 227 EXPECT_CALL(delegate_, FillPasswordForm(_)).Times(Exactly(0)); |
| 231 EXPECT_CALL(*store_.get(), GetLogins(_, _)) | 228 EXPECT_CALL(*store_.get(), GetLogins(_, _)) |
| 232 .WillOnce(DoAll(WithArg<1>(InvokeConsumer(result)), Return(1))); | 229 .WillOnce(DoAll(WithArg<1>(InvokeConsumer(result)), Return(1))); |
| 233 std::vector<PasswordForm> observed; | 230 std::vector<PasswordForm> observed; |
| 234 PasswordForm form(MakeSimpleForm()); | 231 PasswordForm form(MakeSimpleForm()); |
| 235 observed.push_back(form); | 232 observed.push_back(form); |
| 236 manager()->OnPasswordFormsParsed(observed); // The initial load. | 233 manager()->OnPasswordFormsParsed(observed); // The initial load. |
| 237 manager()->OnPasswordFormsRendered(observed); // The initial layout. | 234 manager()->OnPasswordFormsRendered(observed); // The initial layout. |
| 238 | 235 |
| 239 // Simulate navigating a sub-frame. | 236 // Simulate navigating a sub-frame. |
| 240 content::LoadCommittedDetails details; | 237 content::LoadCommittedDetails details; |
| 241 details.is_main_frame = false; | |
| 242 content::FrameNavigateParams params; | 238 content::FrameNavigateParams params; |
| 243 manager()->DidNavigateAnyFrame(details, params); | 239 manager()->DidNavigateAnyFrame(details, params); |
| 244 | 240 |
| 245 // Simulate navigating the real page. | 241 // Simulate submitting the password. |
| 246 details.is_main_frame = true; | 242 OnPasswordFormSubmitted(form); |
| 247 params.password_form = form; | |
| 248 manager()->DidNavigateAnyFrame(details, params); | |
| 249 | 243 |
| 250 // Now the password manager waits for the navigation to complete. | 244 // Now the password manager waits for the navigation to complete. |
| 251 scoped_ptr<PasswordFormManager> form_to_save; | 245 scoped_ptr<PasswordFormManager> form_to_save; |
| 252 EXPECT_CALL(delegate_, AddSavePasswordInfoBarIfPermitted(_)) | 246 EXPECT_CALL(delegate_, AddSavePasswordInfoBarIfPermitted(_)) |
| 253 .WillOnce(WithArg<0>(SaveToScopedPtr(&form_to_save))); | 247 .WillOnce(WithArg<0>(SaveToScopedPtr(&form_to_save))); |
| 254 | 248 |
| 255 observed.clear(); | 249 observed.clear(); |
| 256 manager()->OnPasswordFormsParsed(observed); // The post-navigation load. | 250 manager()->OnPasswordFormsParsed(observed); // The post-navigation load. |
| 257 manager()->OnPasswordFormsRendered(observed); // The post-navigation layout. | 251 manager()->OnPasswordFormsRendered(observed); // The post-navigation layout. |
| 258 | 252 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 282 std::vector<PasswordForm> observed; | 276 std::vector<PasswordForm> observed; |
| 283 observed.push_back(first_form); | 277 observed.push_back(first_form); |
| 284 manager()->OnPasswordFormsParsed(observed); | 278 manager()->OnPasswordFormsParsed(observed); |
| 285 observed.clear(); | 279 observed.clear(); |
| 286 manager()->OnPasswordFormsRendered(observed); | 280 manager()->OnPasswordFormsRendered(observed); |
| 287 | 281 |
| 288 // Now navigate to a second page. | 282 // Now navigate to a second page. |
| 289 content::LoadCommittedDetails details; | 283 content::LoadCommittedDetails details; |
| 290 details.is_main_frame = true; | 284 details.is_main_frame = true; |
| 291 content::FrameNavigateParams params; | 285 content::FrameNavigateParams params; |
| 292 manager()->DidNavigateAnyFrame(details, params); | 286 manager()->DidNavigateMainFrame(details, params); |
| 293 | 287 |
| 294 // This page contains a form with the same markup, but on a different | 288 // This page contains a form with the same markup, but on a different |
| 295 // URL. | 289 // URL. |
| 296 observed.push_back(second_form); | 290 observed.push_back(second_form); |
| 297 manager()->OnPasswordFormsParsed(observed); | 291 manager()->OnPasswordFormsParsed(observed); |
| 298 manager()->OnPasswordFormsRendered(observed); | 292 manager()->OnPasswordFormsRendered(observed); |
| 299 | 293 |
| 300 // Now submit this form | 294 // Now submit this form |
| 301 params.password_form = second_form; | 295 OnPasswordFormSubmitted(second_form); |
| 302 manager()->DidNavigateAnyFrame(details, params); | |
| 303 | 296 |
| 304 // Navigation after form submit. | 297 // Navigation after form submit. |
| 305 scoped_ptr<PasswordFormManager> form_to_save; | 298 scoped_ptr<PasswordFormManager> form_to_save; |
| 306 EXPECT_CALL(delegate_, AddSavePasswordInfoBarIfPermitted(_)) | 299 EXPECT_CALL(delegate_, AddSavePasswordInfoBarIfPermitted(_)) |
| 307 .WillOnce(WithArg<0>(SaveToScopedPtr(&form_to_save))); | 300 .WillOnce(WithArg<0>(SaveToScopedPtr(&form_to_save))); |
| 308 observed.clear(); | 301 observed.clear(); |
| 309 manager()->OnPasswordFormsParsed(observed); | 302 manager()->OnPasswordFormsParsed(observed); |
| 310 manager()->OnPasswordFormsRendered(observed); | 303 manager()->OnPasswordFormsRendered(observed); |
| 311 | 304 |
| 312 // Make sure that the saved form matches the second form, not the first. | 305 // Make sure that the saved form matches the second form, not the first. |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 468 // navigation occurs. | 461 // navigation occurs. |
| 469 EXPECT_CALL(delegate_, | 462 EXPECT_CALL(delegate_, |
| 470 AddSavePasswordInfoBarIfPermitted(_)).Times(Exactly(0)); | 463 AddSavePasswordInfoBarIfPermitted(_)).Times(Exactly(0)); |
| 471 EXPECT_CALL(*store_.get(), AddLogin(FormMatches(form))); | 464 EXPECT_CALL(*store_.get(), AddLogin(FormMatches(form))); |
| 472 | 465 |
| 473 // Now the password manager waits for the navigation to complete. | 466 // Now the password manager waits for the navigation to complete. |
| 474 observed.clear(); | 467 observed.clear(); |
| 475 manager()->OnPasswordFormsParsed(observed); // The post-navigation load. | 468 manager()->OnPasswordFormsParsed(observed); // The post-navigation load. |
| 476 manager()->OnPasswordFormsRendered(observed); // The post-navigation layout. | 469 manager()->OnPasswordFormsRendered(observed); // The post-navigation layout. |
| 477 } | 470 } |
| OLD | NEW |