| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <string.h> | 5 #include <string.h> |
| 6 | 6 |
| 7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
| 8 #include "base/strings/utf_string_conversions.h" | 8 #include "base/strings/utf_string_conversions.h" |
| 9 #include "base/test/histogram_tester.h" | 9 #include "base/test/histogram_tester.h" |
| 10 #include "chrome/test/base/chrome_render_view_test.h" | 10 #include "chrome/test/base/chrome_render_view_test.h" |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 78 if (available) { | 78 if (available) { |
| 79 ASSERT_EQ(1u, password_generation_->messages().size()); | 79 ASSERT_EQ(1u, password_generation_->messages().size()); |
| 80 EXPECT_EQ(AutofillHostMsg_ShowPasswordGenerationPopup::ID, | 80 EXPECT_EQ(AutofillHostMsg_ShowPasswordGenerationPopup::ID, |
| 81 password_generation_->messages()[0]->type()); | 81 password_generation_->messages()[0]->type()); |
| 82 } else { | 82 } else { |
| 83 EXPECT_EQ(0u, password_generation_->messages().size()); | 83 EXPECT_EQ(0u, password_generation_->messages().size()); |
| 84 } | 84 } |
| 85 password_generation_->clear_messages(); | 85 password_generation_->clear_messages(); |
| 86 } | 86 } |
| 87 | 87 |
| 88 void LoadHTMLWithUserGesture(const char* html) { |
| 89 LoadHTML(html); |
| 90 |
| 91 // Enable show-ime event when element is focused by indicating that a user |
| 92 // gesture has been processed since load. |
| 93 EXPECT_TRUE(SimulateElementClick("dummy")); |
| 94 } |
| 95 |
| 88 private: | 96 private: |
| 89 DISALLOW_COPY_AND_ASSIGN(PasswordGenerationAgentTest); | 97 DISALLOW_COPY_AND_ASSIGN(PasswordGenerationAgentTest); |
| 90 }; | 98 }; |
| 91 | 99 |
| 92 const char kSigninFormHTML[] = | 100 const char kSigninFormHTML[] = |
| 93 "<FORM name = 'blah' action = 'http://www.random.com/'> " | 101 "<FORM name = 'blah' action = 'http://www.random.com/'> " |
| 94 " <INPUT type = 'text' id = 'username'/> " | 102 " <INPUT type = 'text' id = 'username'/> " |
| 95 " <INPUT type = 'password' id = 'password'/> " | 103 " <INPUT type = 'password' id = 'password'/> " |
| 104 " <INPUT type = 'button' id = 'dummy'/> " |
| 96 " <INPUT type = 'submit' value = 'LOGIN' />" | 105 " <INPUT type = 'submit' value = 'LOGIN' />" |
| 97 "</FORM>"; | 106 "</FORM>"; |
| 98 | 107 |
| 99 const char kAccountCreationFormHTML[] = | 108 const char kAccountCreationFormHTML[] = |
| 100 "<FORM name = 'blah' action = 'http://www.random.com/'> " | 109 "<FORM name = 'blah' action = 'http://www.random.com/'> " |
| 101 " <INPUT type = 'text' id = 'username'/> " | 110 " <INPUT type = 'text' id = 'username'/> " |
| 102 " <INPUT type = 'password' id = 'first_password' " | 111 " <INPUT type = 'password' id = 'first_password' " |
| 103 " autocomplete = 'off' size = 5/>" | 112 " autocomplete = 'off' size = 5/>" |
| 104 " <INPUT type = 'password' id = 'second_password' size = 5/> " | 113 " <INPUT type = 'password' id = 'second_password' size = 5/> " |
| 105 " <INPUT type = 'text' id = 'address'/> " | 114 " <INPUT type = 'text' id = 'address'/> " |
| 115 " <INPUT type = 'button' id = 'dummy'/> " |
| 106 " <INPUT type = 'submit' value = 'LOGIN' />" | 116 " <INPUT type = 'submit' value = 'LOGIN' />" |
| 107 "</FORM>"; | 117 "</FORM>"; |
| 108 | 118 |
| 109 const char kHiddenPasswordAccountCreationFormHTML[] = | 119 const char kHiddenPasswordAccountCreationFormHTML[] = |
| 110 "<FORM name = 'blah' action = 'http://www.random.com/'> " | 120 "<FORM name = 'blah' action = 'http://www.random.com/'> " |
| 111 " <INPUT type = 'text' id = 'username'/> " | 121 " <INPUT type = 'text' id = 'username'/> " |
| 112 " <INPUT type = 'password' id = 'first_password'/> " | 122 " <INPUT type = 'password' id = 'first_password'/> " |
| 113 " <INPUT type = 'password' id = 'second_password' style='display:none'/> " | 123 " <INPUT type = 'password' id = 'second_password' style='display:none'/> " |
| 124 " <INPUT type = 'button' id = 'dummy'/> " |
| 114 " <INPUT type = 'submit' value = 'LOGIN' />" | 125 " <INPUT type = 'submit' value = 'LOGIN' />" |
| 115 "</FORM>"; | 126 "</FORM>"; |
| 116 | 127 |
| 117 const char kInvalidActionAccountCreationFormHTML[] = | 128 const char kInvalidActionAccountCreationFormHTML[] = |
| 118 "<FORM name = 'blah' action = 'invalid'> " | 129 "<FORM name = 'blah' action = 'invalid'> " |
| 119 " <INPUT type = 'text' id = 'username'/> " | 130 " <INPUT type = 'text' id = 'username'/> " |
| 120 " <INPUT type = 'password' id = 'first_password'/> " | 131 " <INPUT type = 'password' id = 'first_password'/> " |
| 121 " <INPUT type = 'password' id = 'second_password'/> " | 132 " <INPUT type = 'password' id = 'second_password'/> " |
| 133 " <INPUT type = 'button' id = 'dummy'/> " |
| 122 " <INPUT type = 'submit' value = 'LOGIN' />" | 134 " <INPUT type = 'submit' value = 'LOGIN' />" |
| 123 "</FORM>"; | 135 "</FORM>"; |
| 124 | 136 |
| 125 const char kMultipleAccountCreationFormHTML[] = | 137 const char kMultipleAccountCreationFormHTML[] = |
| 126 "<FORM name = 'login' action = 'http://www.random.com/'> " | 138 "<FORM name = 'login' action = 'http://www.random.com/'> " |
| 127 " <INPUT type = 'text' id = 'random'/> " | 139 " <INPUT type = 'text' id = 'random'/> " |
| 128 " <INPUT type = 'text' id = 'username'/> " | 140 " <INPUT type = 'text' id = 'username'/> " |
| 129 " <INPUT type = 'password' id = 'password'/> " | 141 " <INPUT type = 'password' id = 'password'/> " |
| 142 " <INPUT type = 'button' id = 'dummy'/> " |
| 130 " <INPUT type = 'submit' value = 'LOGIN' />" | 143 " <INPUT type = 'submit' value = 'LOGIN' />" |
| 131 "</FORM>" | 144 "</FORM>" |
| 132 "<FORM name = 'signup' action = 'http://www.random.com/signup'> " | 145 "<FORM name = 'signup' action = 'http://www.random.com/signup'> " |
| 133 " <INPUT type = 'text' id = 'username'/> " | 146 " <INPUT type = 'text' id = 'username'/> " |
| 134 " <INPUT type = 'password' id = 'first_password' " | 147 " <INPUT type = 'password' id = 'first_password' " |
| 135 " autocomplete = 'off' size = 5/>" | 148 " autocomplete = 'off' size = 5/>" |
| 136 " <INPUT type = 'password' id = 'second_password' size = 5/> " | 149 " <INPUT type = 'password' id = 'second_password' size = 5/> " |
| 137 " <INPUT type = 'text' id = 'address'/> " | 150 " <INPUT type = 'text' id = 'address'/> " |
| 138 " <INPUT type = 'submit' value = 'LOGIN' />" | 151 " <INPUT type = 'submit' value = 'LOGIN' />" |
| 139 "</FORM>"; | 152 "</FORM>"; |
| 140 | 153 |
| 141 const char ChangeDetectionScript[] = | 154 const char ChangeDetectionScript[] = |
| 142 "<script>" | 155 "<script>" |
| 143 " firstOnChangeCalled = false;" | 156 " firstOnChangeCalled = false;" |
| 144 " secondOnChangeCalled = false;" | 157 " secondOnChangeCalled = false;" |
| 145 " document.getElementById('first_password').onchange = function() {" | 158 " document.getElementById('first_password').onchange = function() {" |
| 146 " firstOnChangeCalled = true;" | 159 " firstOnChangeCalled = true;" |
| 147 " };" | 160 " };" |
| 148 " document.getElementById('second_password').onchange = function() {" | 161 " document.getElementById('second_password').onchange = function() {" |
| 149 " secondOnChangeCalled = true;" | 162 " secondOnChangeCalled = true;" |
| 150 " };" | 163 " };" |
| 151 "</script>"; | 164 "</script>"; |
| 152 | 165 |
| 153 TEST_F(PasswordGenerationAgentTest, DetectionTest) { | 166 TEST_F(PasswordGenerationAgentTest, DetectionTest) { |
| 154 // Don't shown the icon for non account creation forms. | 167 // Don't shown the icon for non account creation forms. |
| 155 LoadHTML(kSigninFormHTML); | 168 LoadHTMLWithUserGesture(kSigninFormHTML); |
| 156 ExpectPasswordGenerationAvailable("password", false); | 169 ExpectPasswordGenerationAvailable("password", false); |
| 157 | 170 |
| 158 // We don't show the decoration yet because the feature isn't enabled. | 171 // We don't show the decoration yet because the feature isn't enabled. |
| 159 LoadHTML(kAccountCreationFormHTML); | 172 LoadHTMLWithUserGesture(kAccountCreationFormHTML); |
| 160 ExpectPasswordGenerationAvailable("first_password", false); | 173 ExpectPasswordGenerationAvailable("first_password", false); |
| 161 | 174 |
| 162 // Pretend like We have received message indicating site is not blacklisted, | 175 // Pretend like We have received message indicating site is not blacklisted, |
| 163 // and we have received message indicating the form is classified as | 176 // and we have received message indicating the form is classified as |
| 164 // ACCOUNT_CREATION_FORM form Autofill server. We should show the icon. | 177 // ACCOUNT_CREATION_FORM form Autofill server. We should show the icon. |
| 165 LoadHTML(kAccountCreationFormHTML); | 178 LoadHTMLWithUserGesture(kAccountCreationFormHTML); |
| 166 SetNotBlacklistedMessage(kAccountCreationFormHTML); | 179 SetNotBlacklistedMessage(kAccountCreationFormHTML); |
| 167 SetAccountCreationFormsDetectedMessage(0); | 180 SetAccountCreationFormsDetectedMessage(0); |
| 168 ExpectPasswordGenerationAvailable("first_password", true); | 181 ExpectPasswordGenerationAvailable("first_password", true); |
| 169 | 182 |
| 170 // Hidden fields are not treated differently. | 183 // Hidden fields are not treated differently. |
| 171 LoadHTML(kHiddenPasswordAccountCreationFormHTML); | 184 LoadHTMLWithUserGesture(kHiddenPasswordAccountCreationFormHTML); |
| 172 SetNotBlacklistedMessage(kHiddenPasswordAccountCreationFormHTML); | 185 SetNotBlacklistedMessage(kHiddenPasswordAccountCreationFormHTML); |
| 173 SetAccountCreationFormsDetectedMessage(0); | 186 SetAccountCreationFormsDetectedMessage(0); |
| 174 ExpectPasswordGenerationAvailable("first_password", true); | 187 ExpectPasswordGenerationAvailable("first_password", true); |
| 175 | 188 |
| 176 // This doesn't trigger because the form action is invalid. | 189 // This doesn't trigger because the form action is invalid. |
| 177 LoadHTML(kInvalidActionAccountCreationFormHTML); | 190 LoadHTMLWithUserGesture(kInvalidActionAccountCreationFormHTML); |
| 178 SetNotBlacklistedMessage(kInvalidActionAccountCreationFormHTML); | 191 SetNotBlacklistedMessage(kInvalidActionAccountCreationFormHTML); |
| 179 SetAccountCreationFormsDetectedMessage(0); | 192 SetAccountCreationFormsDetectedMessage(0); |
| 180 ExpectPasswordGenerationAvailable("first_password", false); | 193 ExpectPasswordGenerationAvailable("first_password", false); |
| 181 } | 194 } |
| 182 | 195 |
| 183 TEST_F(PasswordGenerationAgentTest, FillTest) { | 196 TEST_F(PasswordGenerationAgentTest, FillTest) { |
| 184 // Make sure that we are enabled before loading HTML. | 197 // Make sure that we are enabled before loading HTML. |
| 185 std::string html = std::string(kAccountCreationFormHTML) + | 198 std::string html = std::string(kAccountCreationFormHTML) + |
| 186 ChangeDetectionScript; | 199 ChangeDetectionScript; |
| 187 LoadHTML(html.c_str()); | 200 LoadHTMLWithUserGesture(html.c_str()); |
| 188 SetNotBlacklistedMessage(html.c_str()); | 201 SetNotBlacklistedMessage(html.c_str()); |
| 189 SetAccountCreationFormsDetectedMessage(0); | 202 SetAccountCreationFormsDetectedMessage(0); |
| 190 | 203 |
| 191 WebDocument document = GetMainFrame()->document(); | 204 WebDocument document = GetMainFrame()->document(); |
| 192 WebElement element = | 205 WebElement element = |
| 193 document.getElementById(WebString::fromUTF8("first_password")); | 206 document.getElementById(WebString::fromUTF8("first_password")); |
| 194 ASSERT_FALSE(element.isNull()); | 207 ASSERT_FALSE(element.isNull()); |
| 195 WebInputElement first_password_element = element.to<WebInputElement>(); | 208 WebInputElement first_password_element = element.to<WebInputElement>(); |
| 196 element = document.getElementById(WebString::fromUTF8("second_password")); | 209 element = document.getElementById(WebString::fromUTF8("second_password")); |
| 197 ASSERT_FALSE(element.isNull()); | 210 ASSERT_FALSE(element.isNull()); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 227 | 240 |
| 228 // Focus moved to the next input field. | 241 // Focus moved to the next input field. |
| 229 // TODO(zysxqn): Change this back to the address element once Bug 90224 | 242 // TODO(zysxqn): Change this back to the address element once Bug 90224 |
| 230 // https://bugs.webkit.org/show_bug.cgi?id=90224 has been fixed. | 243 // https://bugs.webkit.org/show_bug.cgi?id=90224 has been fixed. |
| 231 element = document.getElementById(WebString::fromUTF8("first_password")); | 244 element = document.getElementById(WebString::fromUTF8("first_password")); |
| 232 ASSERT_FALSE(element.isNull()); | 245 ASSERT_FALSE(element.isNull()); |
| 233 EXPECT_EQ(element, document.focusedElement()); | 246 EXPECT_EQ(element, document.focusedElement()); |
| 234 } | 247 } |
| 235 | 248 |
| 236 TEST_F(PasswordGenerationAgentTest, EditingTest) { | 249 TEST_F(PasswordGenerationAgentTest, EditingTest) { |
| 237 LoadHTML(kAccountCreationFormHTML); | 250 LoadHTMLWithUserGesture(kAccountCreationFormHTML); |
| 238 SetNotBlacklistedMessage(kAccountCreationFormHTML); | 251 SetNotBlacklistedMessage(kAccountCreationFormHTML); |
| 239 SetAccountCreationFormsDetectedMessage(0); | 252 SetAccountCreationFormsDetectedMessage(0); |
| 240 | 253 |
| 241 WebDocument document = GetMainFrame()->document(); | 254 WebDocument document = GetMainFrame()->document(); |
| 242 WebElement element = | 255 WebElement element = |
| 243 document.getElementById(WebString::fromUTF8("first_password")); | 256 document.getElementById(WebString::fromUTF8("first_password")); |
| 244 ASSERT_FALSE(element.isNull()); | 257 ASSERT_FALSE(element.isNull()); |
| 245 WebInputElement first_password_element = element.to<WebInputElement>(); | 258 WebInputElement first_password_element = element.to<WebInputElement>(); |
| 246 element = document.getElementById(WebString::fromUTF8("second_password")); | 259 element = document.getElementById(WebString::fromUTF8("second_password")); |
| 247 ASSERT_FALSE(element.isNull()); | 260 ASSERT_FALSE(element.isNull()); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 277 // textFieldDidChange posts a task, so we need to wait until it's been | 290 // textFieldDidChange posts a task, so we need to wait until it's been |
| 278 // processed. | 291 // processed. |
| 279 base::MessageLoop::current()->RunUntilIdle(); | 292 base::MessageLoop::current()->RunUntilIdle(); |
| 280 EXPECT_EQ(empty_password, first_password_element.value()); | 293 EXPECT_EQ(empty_password, first_password_element.value()); |
| 281 EXPECT_EQ(empty_password, second_password_element.value()); | 294 EXPECT_EQ(empty_password, second_password_element.value()); |
| 282 } | 295 } |
| 283 | 296 |
| 284 TEST_F(PasswordGenerationAgentTest, BlacklistedTest) { | 297 TEST_F(PasswordGenerationAgentTest, BlacklistedTest) { |
| 285 // Did not receive not blacklisted message. Don't show password generation | 298 // Did not receive not blacklisted message. Don't show password generation |
| 286 // icon. | 299 // icon. |
| 287 LoadHTML(kAccountCreationFormHTML); | 300 LoadHTMLWithUserGesture(kAccountCreationFormHTML); |
| 288 SetAccountCreationFormsDetectedMessage(0); | 301 SetAccountCreationFormsDetectedMessage(0); |
| 289 ExpectPasswordGenerationAvailable("first_password", false); | 302 ExpectPasswordGenerationAvailable("first_password", false); |
| 290 | 303 |
| 291 // Receive one not blacklisted message for non account creation form. Don't | 304 // Receive one not blacklisted message for non account creation form. Don't |
| 292 // show password generation icon. | 305 // show password generation icon. |
| 293 LoadHTML(kAccountCreationFormHTML); | 306 LoadHTMLWithUserGesture(kAccountCreationFormHTML); |
| 294 SetNotBlacklistedMessage(kSigninFormHTML); | 307 SetNotBlacklistedMessage(kSigninFormHTML); |
| 295 SetAccountCreationFormsDetectedMessage(0); | 308 SetAccountCreationFormsDetectedMessage(0); |
| 296 ExpectPasswordGenerationAvailable("first_password", false); | 309 ExpectPasswordGenerationAvailable("first_password", false); |
| 297 | 310 |
| 298 // Receive one not blackliste message for account creation form. Show password | 311 // Receive one not blacklisted message for account creation form. Show |
| 299 // generation icon. | 312 // password generation icon. |
| 300 LoadHTML(kAccountCreationFormHTML); | 313 LoadHTMLWithUserGesture(kAccountCreationFormHTML); |
| 301 SetNotBlacklistedMessage(kAccountCreationFormHTML); | 314 SetNotBlacklistedMessage(kAccountCreationFormHTML); |
| 302 SetAccountCreationFormsDetectedMessage(0); | 315 SetAccountCreationFormsDetectedMessage(0); |
| 303 ExpectPasswordGenerationAvailable("first_password", true); | 316 ExpectPasswordGenerationAvailable("first_password", true); |
| 304 | 317 |
| 305 // Receive two not blacklisted messages, one is for account creation form and | 318 // Receive two not blacklisted messages, one is for account creation form and |
| 306 // the other is not. Show password generation icon. | 319 // the other is not. Show password generation icon. |
| 307 LoadHTML(kAccountCreationFormHTML); | 320 LoadHTMLWithUserGesture(kAccountCreationFormHTML); |
| 308 SetNotBlacklistedMessage(kAccountCreationFormHTML); | 321 SetNotBlacklistedMessage(kAccountCreationFormHTML); |
| 309 SetNotBlacklistedMessage(kSigninFormHTML); | 322 SetNotBlacklistedMessage(kSigninFormHTML); |
| 310 SetAccountCreationFormsDetectedMessage(0); | 323 SetAccountCreationFormsDetectedMessage(0); |
| 311 ExpectPasswordGenerationAvailable("first_password", true); | 324 ExpectPasswordGenerationAvailable("first_password", true); |
| 312 } | 325 } |
| 313 | 326 |
| 314 TEST_F(PasswordGenerationAgentTest, AccountCreationFormsDetectedTest) { | 327 TEST_F(PasswordGenerationAgentTest, AccountCreationFormsDetectedTest) { |
| 315 // Did not receive account creation forms detected messege. Don't show | 328 // Did not receive account creation forms detected message. Don't show |
| 316 // password generation icon. | 329 // password generation icon. |
| 317 LoadHTML(kAccountCreationFormHTML); | 330 LoadHTMLWithUserGesture(kAccountCreationFormHTML); |
| 318 SetNotBlacklistedMessage(kAccountCreationFormHTML); | 331 SetNotBlacklistedMessage(kAccountCreationFormHTML); |
| 319 ExpectPasswordGenerationAvailable("first_password", false); | 332 ExpectPasswordGenerationAvailable("first_password", false); |
| 320 | 333 |
| 321 // Receive the account creation forms detected message. Show password | 334 // Receive the account creation forms detected message. Show password |
| 322 // generation icon. | 335 // generation icon. |
| 323 LoadHTML(kAccountCreationFormHTML); | 336 LoadHTMLWithUserGesture(kAccountCreationFormHTML); |
| 324 SetNotBlacklistedMessage(kAccountCreationFormHTML); | 337 SetNotBlacklistedMessage(kAccountCreationFormHTML); |
| 325 SetAccountCreationFormsDetectedMessage(0); | 338 SetAccountCreationFormsDetectedMessage(0); |
| 326 ExpectPasswordGenerationAvailable("first_password", true); | 339 ExpectPasswordGenerationAvailable("first_password", true); |
| 327 } | 340 } |
| 328 | 341 |
| 329 TEST_F(PasswordGenerationAgentTest, MaximumOfferSize) { | 342 TEST_F(PasswordGenerationAgentTest, MaximumOfferSize) { |
| 330 base::HistogramTester histogram_tester; | 343 base::HistogramTester histogram_tester; |
| 331 | 344 |
| 332 LoadHTML(kAccountCreationFormHTML); | 345 LoadHTMLWithUserGesture(kAccountCreationFormHTML); |
| 333 SetNotBlacklistedMessage(kAccountCreationFormHTML); | 346 SetNotBlacklistedMessage(kAccountCreationFormHTML); |
| 334 SetAccountCreationFormsDetectedMessage(0); | 347 SetAccountCreationFormsDetectedMessage(0); |
| 335 ExpectPasswordGenerationAvailable("first_password", true); | 348 ExpectPasswordGenerationAvailable("first_password", true); |
| 336 | 349 |
| 337 WebDocument document = GetMainFrame()->document(); | 350 WebDocument document = GetMainFrame()->document(); |
| 338 WebElement element = | 351 WebElement element = |
| 339 document.getElementById(WebString::fromUTF8("first_password")); | 352 document.getElementById(WebString::fromUTF8("first_password")); |
| 340 ASSERT_FALSE(element.isNull()); | 353 ASSERT_FALSE(element.isNull()); |
| 341 WebInputElement first_password_element = element.to<WebInputElement>(); | 354 WebInputElement first_password_element = element.to<WebInputElement>(); |
| 342 | 355 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 390 password_generation_->clear_messages(); | 403 password_generation_->clear_messages(); |
| 391 | 404 |
| 392 // Change focus. Bubble should be hidden, but that is handled by AutofilAgent, | 405 // Change focus. Bubble should be hidden, but that is handled by AutofilAgent, |
| 393 // so no messages are sent. | 406 // so no messages are sent. |
| 394 ExecuteJavaScript("document.getElementById('username').focus();"); | 407 ExecuteJavaScript("document.getElementById('username').focus();"); |
| 395 EXPECT_EQ(0u, password_generation_->messages().size()); | 408 EXPECT_EQ(0u, password_generation_->messages().size()); |
| 396 password_generation_->clear_messages(); | 409 password_generation_->clear_messages(); |
| 397 | 410 |
| 398 // Focusing the password field will bring up the generation UI again. | 411 // Focusing the password field will bring up the generation UI again. |
| 399 ExecuteJavaScript("document.getElementById('first_password').focus();"); | 412 ExecuteJavaScript("document.getElementById('first_password').focus();"); |
| 400 EXPECT_EQ(1u, password_generation_->messages().size()); | 413 ASSERT_EQ(1u, password_generation_->messages().size()); |
| 401 EXPECT_EQ(AutofillHostMsg_ShowPasswordGenerationPopup::ID, | 414 EXPECT_EQ(AutofillHostMsg_ShowPasswordGenerationPopup::ID, |
| 402 password_generation_->messages()[0]->type()); | 415 password_generation_->messages()[0]->type()); |
| 403 password_generation_->clear_messages(); | 416 password_generation_->clear_messages(); |
| 404 | 417 |
| 405 // Loading a different page triggers UMA stat upload. Verify that only one | 418 // Loading a different page triggers UMA stat upload. Verify that only one |
| 406 // display event is sent even though | 419 // display event is sent even though |
| 407 LoadHTML(kSigninFormHTML); | 420 LoadHTMLWithUserGesture(kSigninFormHTML); |
| 408 | 421 |
| 409 histogram_tester.ExpectBucketCount( | 422 histogram_tester.ExpectBucketCount( |
| 410 "PasswordGeneration.Event", | 423 "PasswordGeneration.Event", |
| 411 autofill::password_generation::GENERATION_POPUP_SHOWN, | 424 autofill::password_generation::GENERATION_POPUP_SHOWN, |
| 412 1); | 425 1); |
| 413 } | 426 } |
| 414 | 427 |
| 415 TEST_F(PasswordGenerationAgentTest, DynamicFormTest) { | 428 TEST_F(PasswordGenerationAgentTest, DynamicFormTest) { |
| 416 LoadHTML(kSigninFormHTML); | 429 LoadHTMLWithUserGesture(kSigninFormHTML); |
| 417 SetNotBlacklistedMessage(kSigninFormHTML); | 430 SetNotBlacklistedMessage(kSigninFormHTML); |
| 418 | 431 |
| 419 ExecuteJavaScript( | 432 ExecuteJavaScript( |
| 420 "var form = document.createElement('form');" | 433 "var form = document.createElement('form');" |
| 421 "var username = document.createElement('input');" | 434 "var username = document.createElement('input');" |
| 422 "username.type = 'text';" | 435 "username.type = 'text';" |
| 423 "username.id = 'dynamic_username';" | 436 "username.id = 'dynamic_username';" |
| 424 "var first_password = document.createElement('input');" | 437 "var first_password = document.createElement('input');" |
| 425 "first_password.type = 'password';" | 438 "first_password.type = 'password';" |
| 426 "first_password.id = 'first_password';" | 439 "first_password.id = 'first_password';" |
| 427 "first_password.name = 'first_password';" | 440 "first_password.name = 'first_password';" |
| 428 "var second_password = document.createElement('input');" | 441 "var second_password = document.createElement('input');" |
| 429 "second_password.type = 'password';" | 442 "second_password.type = 'password';" |
| 430 "second_password.id = 'second_password';" | 443 "second_password.id = 'second_password';" |
| 431 "second_password.name = 'second_password';" | 444 "second_password.name = 'second_password';" |
| 432 "form.appendChild(username);" | 445 "form.appendChild(username);" |
| 433 "form.appendChild(first_password);" | 446 "form.appendChild(first_password);" |
| 434 "form.appendChild(second_password);" | 447 "form.appendChild(second_password);" |
| 435 "document.body.appendChild(form);"); | 448 "document.body.appendChild(form);"); |
| 436 ProcessPendingMessages(); | 449 ProcessPendingMessages(); |
| 437 | 450 |
| 438 // This needs to come after the DOM has been modified. | 451 // This needs to come after the DOM has been modified. |
| 439 SetAccountCreationFormsDetectedMessage(1); | 452 SetAccountCreationFormsDetectedMessage(1); |
| 440 | 453 |
| 441 // TODO(gcasto): I'm slighty worried about flakes in this test where | 454 // TODO(gcasto): I'm slightly worried about flakes in this test where |
| 442 // didAssociateFormControls() isn't called. If this turns out to be a problem | 455 // didAssociateFormControls() isn't called. If this turns out to be a problem |
| 443 // adding a call to OnDynamicFormsSeen(GetMainFrame()) will fix it, though | 456 // adding a call to OnDynamicFormsSeen(GetMainFrame()) will fix it, though |
| 444 // it will weaken the test. | 457 // it will weaken the test. |
| 445 ExpectPasswordGenerationAvailable("first_password", true); | 458 ExpectPasswordGenerationAvailable("first_password", true); |
| 446 } | 459 } |
| 447 | 460 |
| 448 TEST_F(PasswordGenerationAgentTest, MultiplePasswordFormsTest) { | 461 TEST_F(PasswordGenerationAgentTest, MultiplePasswordFormsTest) { |
| 449 // If two forms on the page looks like possible account creation forms, make | 462 // If two forms on the page looks like possible account creation forms, make |
| 450 // sure to trigger on the one that is specified from Autofill. | 463 // sure to trigger on the one that is specified from Autofill. |
| 451 LoadHTML(kMultipleAccountCreationFormHTML); | 464 LoadHTMLWithUserGesture(kMultipleAccountCreationFormHTML); |
| 452 SetNotBlacklistedMessage(kMultipleAccountCreationFormHTML); | 465 SetNotBlacklistedMessage(kMultipleAccountCreationFormHTML); |
| 453 | 466 |
| 454 // Should trigger on the second form. | 467 // Should trigger on the second form. |
| 455 SetAccountCreationFormsDetectedMessage(1); | 468 SetAccountCreationFormsDetectedMessage(1); |
| 456 | 469 |
| 457 ExpectPasswordGenerationAvailable("password", false); | 470 ExpectPasswordGenerationAvailable("password", false); |
| 458 ExpectPasswordGenerationAvailable("first_password", true); | 471 ExpectPasswordGenerationAvailable("first_password", true); |
| 459 } | 472 } |
| 460 | 473 |
| 461 TEST_F(PasswordGenerationAgentTest, MessagesAfterAccountSignupFormFound) { | 474 TEST_F(PasswordGenerationAgentTest, MessagesAfterAccountSignupFormFound) { |
| 462 LoadHTML(kAccountCreationFormHTML); | 475 LoadHTMLWithUserGesture(kAccountCreationFormHTML); |
| 463 SetNotBlacklistedMessage(kAccountCreationFormHTML); | 476 SetNotBlacklistedMessage(kAccountCreationFormHTML); |
| 464 SetAccountCreationFormsDetectedMessage(0); | 477 SetAccountCreationFormsDetectedMessage(0); |
| 465 | 478 |
| 466 // Generation should be enabled. | 479 // Generation should be enabled. |
| 467 ExpectPasswordGenerationAvailable("first_password", true); | 480 ExpectPasswordGenerationAvailable("first_password", true); |
| 468 | 481 |
| 469 // Extra not blacklisted messages can be sent. Make sure that they are handled | 482 // Extra not blacklisted messages can be sent. Make sure that they are handled |
| 470 // correctly (generation should still be available). | 483 // correctly (generation should still be available). |
| 471 SetNotBlacklistedMessage(kAccountCreationFormHTML); | 484 SetNotBlacklistedMessage(kAccountCreationFormHTML); |
| 472 | 485 |
| 473 // Need to focus another field first for verification to work. | 486 // Need to focus another field first for verification to work. |
| 474 ExpectPasswordGenerationAvailable("second_password", false); | 487 ExpectPasswordGenerationAvailable("second_password", false); |
| 475 ExpectPasswordGenerationAvailable("first_password", true); | 488 ExpectPasswordGenerationAvailable("first_password", true); |
| 476 } | 489 } |
| 477 | 490 |
| 478 } // namespace autofill | 491 } // namespace autofill |
| OLD | NEW |