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 |
| 119 const char kDisabledElementAccountCreationFormHTML[] = |
| 120 "<FORM name = 'blah' action = 'http://www.random.com/'> " |
| 121 " <INPUT type = 'text' id = 'username'/> " |
| 122 " <INPUT type = 'password' id = 'first_password' " |
| 123 " autocomplete = 'off' size = 5/>" |
| 124 " <INPUT type = 'password' id = 'second_password' size = 5/> " |
| 125 " <INPUT type = 'text' id = 'address'/> " |
| 126 " <INPUT type = 'text' id = 'disabled' disabled/> " |
| 127 " <INPUT type = 'button' id = 'dummy'/> " |
| 128 " <INPUT type = 'submit' value = 'LOGIN' />" |
| 129 "</FORM>"; |
| 130 |
109 const char kHiddenPasswordAccountCreationFormHTML[] = | 131 const char kHiddenPasswordAccountCreationFormHTML[] = |
110 "<FORM name = 'blah' action = 'http://www.random.com/'> " | 132 "<FORM name = 'blah' action = 'http://www.random.com/'> " |
111 " <INPUT type = 'text' id = 'username'/> " | 133 " <INPUT type = 'text' id = 'username'/> " |
112 " <INPUT type = 'password' id = 'first_password'/> " | 134 " <INPUT type = 'password' id = 'first_password'/> " |
113 " <INPUT type = 'password' id = 'second_password' style='display:none'/> " | 135 " <INPUT type = 'password' id = 'second_password' style='display:none'/> " |
| 136 " <INPUT type = 'button' id = 'dummy'/> " |
114 " <INPUT type = 'submit' value = 'LOGIN' />" | 137 " <INPUT type = 'submit' value = 'LOGIN' />" |
115 "</FORM>"; | 138 "</FORM>"; |
116 | 139 |
117 const char kInvalidActionAccountCreationFormHTML[] = | 140 const char kInvalidActionAccountCreationFormHTML[] = |
118 "<FORM name = 'blah' action = 'invalid'> " | 141 "<FORM name = 'blah' action = 'invalid'> " |
119 " <INPUT type = 'text' id = 'username'/> " | 142 " <INPUT type = 'text' id = 'username'/> " |
120 " <INPUT type = 'password' id = 'first_password'/> " | 143 " <INPUT type = 'password' id = 'first_password'/> " |
121 " <INPUT type = 'password' id = 'second_password'/> " | 144 " <INPUT type = 'password' id = 'second_password'/> " |
| 145 " <INPUT type = 'button' id = 'dummy'/> " |
122 " <INPUT type = 'submit' value = 'LOGIN' />" | 146 " <INPUT type = 'submit' value = 'LOGIN' />" |
123 "</FORM>"; | 147 "</FORM>"; |
124 | 148 |
125 const char kMultipleAccountCreationFormHTML[] = | 149 const char kMultipleAccountCreationFormHTML[] = |
126 "<FORM name = 'login' action = 'http://www.random.com/'> " | 150 "<FORM name = 'login' action = 'http://www.random.com/'> " |
127 " <INPUT type = 'text' id = 'random'/> " | 151 " <INPUT type = 'text' id = 'random'/> " |
128 " <INPUT type = 'text' id = 'username'/> " | 152 " <INPUT type = 'text' id = 'username'/> " |
129 " <INPUT type = 'password' id = 'password'/> " | 153 " <INPUT type = 'password' id = 'password'/> " |
| 154 " <INPUT type = 'button' id = 'dummy'/> " |
130 " <INPUT type = 'submit' value = 'LOGIN' />" | 155 " <INPUT type = 'submit' value = 'LOGIN' />" |
131 "</FORM>" | 156 "</FORM>" |
132 "<FORM name = 'signup' action = 'http://www.random.com/signup'> " | 157 "<FORM name = 'signup' action = 'http://www.random.com/signup'> " |
133 " <INPUT type = 'text' id = 'username'/> " | 158 " <INPUT type = 'text' id = 'username'/> " |
134 " <INPUT type = 'password' id = 'first_password' " | 159 " <INPUT type = 'password' id = 'first_password' " |
135 " autocomplete = 'off' size = 5/>" | 160 " autocomplete = 'off' size = 5/>" |
136 " <INPUT type = 'password' id = 'second_password' size = 5/> " | 161 " <INPUT type = 'password' id = 'second_password' size = 5/> " |
137 " <INPUT type = 'text' id = 'address'/> " | 162 " <INPUT type = 'text' id = 'address'/> " |
138 " <INPUT type = 'submit' value = 'LOGIN' />" | 163 " <INPUT type = 'submit' value = 'LOGIN' />" |
139 "</FORM>"; | 164 "</FORM>"; |
140 | 165 |
141 const char ChangeDetectionScript[] = | 166 const char ChangeDetectionScript[] = |
142 "<script>" | 167 "<script>" |
143 " firstOnChangeCalled = false;" | 168 " firstOnChangeCalled = false;" |
144 " secondOnChangeCalled = false;" | 169 " secondOnChangeCalled = false;" |
145 " document.getElementById('first_password').onchange = function() {" | 170 " document.getElementById('first_password').onchange = function() {" |
146 " firstOnChangeCalled = true;" | 171 " firstOnChangeCalled = true;" |
147 " };" | 172 " };" |
148 " document.getElementById('second_password').onchange = function() {" | 173 " document.getElementById('second_password').onchange = function() {" |
149 " secondOnChangeCalled = true;" | 174 " secondOnChangeCalled = true;" |
150 " };" | 175 " };" |
151 "</script>"; | 176 "</script>"; |
152 | 177 |
153 TEST_F(PasswordGenerationAgentTest, DetectionTest) { | 178 TEST_F(PasswordGenerationAgentTest, DetectionTest) { |
154 // Don't shown the icon for non account creation forms. | 179 // Don't shown the icon for non account creation forms. |
155 LoadHTML(kSigninFormHTML); | 180 LoadHTMLWithUserGesture(kSigninFormHTML); |
156 ExpectPasswordGenerationAvailable("password", false); | 181 ExpectPasswordGenerationAvailable("password", false); |
157 | 182 |
158 // We don't show the decoration yet because the feature isn't enabled. | 183 // We don't show the decoration yet because the feature isn't enabled. |
159 LoadHTML(kAccountCreationFormHTML); | 184 LoadHTMLWithUserGesture(kAccountCreationFormHTML); |
160 ExpectPasswordGenerationAvailable("first_password", false); | 185 ExpectPasswordGenerationAvailable("first_password", false); |
161 | 186 |
162 // Pretend like We have received message indicating site is not blacklisted, | 187 // Pretend like We have received message indicating site is not blacklisted, |
163 // and we have received message indicating the form is classified as | 188 // and we have received message indicating the form is classified as |
164 // ACCOUNT_CREATION_FORM form Autofill server. We should show the icon. | 189 // ACCOUNT_CREATION_FORM form Autofill server. We should show the icon. |
165 LoadHTML(kAccountCreationFormHTML); | 190 LoadHTMLWithUserGesture(kAccountCreationFormHTML); |
166 SetNotBlacklistedMessage(kAccountCreationFormHTML); | 191 SetNotBlacklistedMessage(kAccountCreationFormHTML); |
167 SetAccountCreationFormsDetectedMessage(0); | 192 SetAccountCreationFormsDetectedMessage(0); |
168 ExpectPasswordGenerationAvailable("first_password", true); | 193 ExpectPasswordGenerationAvailable("first_password", true); |
169 | 194 |
170 // Hidden fields are not treated differently. | 195 // Hidden fields are not treated differently. |
171 LoadHTML(kHiddenPasswordAccountCreationFormHTML); | 196 LoadHTMLWithUserGesture(kHiddenPasswordAccountCreationFormHTML); |
172 SetNotBlacklistedMessage(kHiddenPasswordAccountCreationFormHTML); | 197 SetNotBlacklistedMessage(kHiddenPasswordAccountCreationFormHTML); |
173 SetAccountCreationFormsDetectedMessage(0); | 198 SetAccountCreationFormsDetectedMessage(0); |
174 ExpectPasswordGenerationAvailable("first_password", true); | 199 ExpectPasswordGenerationAvailable("first_password", true); |
175 | 200 |
176 // This doesn't trigger because the form action is invalid. | 201 // This doesn't trigger because the form action is invalid. |
177 LoadHTML(kInvalidActionAccountCreationFormHTML); | 202 LoadHTMLWithUserGesture(kInvalidActionAccountCreationFormHTML); |
178 SetNotBlacklistedMessage(kInvalidActionAccountCreationFormHTML); | 203 SetNotBlacklistedMessage(kInvalidActionAccountCreationFormHTML); |
179 SetAccountCreationFormsDetectedMessage(0); | 204 SetAccountCreationFormsDetectedMessage(0); |
180 ExpectPasswordGenerationAvailable("first_password", false); | 205 ExpectPasswordGenerationAvailable("first_password", false); |
181 } | 206 } |
182 | 207 |
183 TEST_F(PasswordGenerationAgentTest, FillTest) { | 208 TEST_F(PasswordGenerationAgentTest, FillTest) { |
184 // Make sure that we are enabled before loading HTML. | 209 // Make sure that we are enabled before loading HTML. |
185 std::string html = std::string(kAccountCreationFormHTML) + | 210 std::string html = std::string(kAccountCreationFormHTML) + |
186 ChangeDetectionScript; | 211 ChangeDetectionScript; |
187 LoadHTML(html.c_str()); | 212 LoadHTMLWithUserGesture(html.c_str()); |
188 SetNotBlacklistedMessage(html.c_str()); | 213 SetNotBlacklistedMessage(html.c_str()); |
189 SetAccountCreationFormsDetectedMessage(0); | 214 SetAccountCreationFormsDetectedMessage(0); |
190 | 215 |
191 WebDocument document = GetMainFrame()->document(); | 216 WebDocument document = GetMainFrame()->document(); |
192 WebElement element = | 217 WebElement element = |
193 document.getElementById(WebString::fromUTF8("first_password")); | 218 document.getElementById(WebString::fromUTF8("first_password")); |
194 ASSERT_FALSE(element.isNull()); | 219 ASSERT_FALSE(element.isNull()); |
195 WebInputElement first_password_element = element.to<WebInputElement>(); | 220 WebInputElement first_password_element = element.to<WebInputElement>(); |
196 element = document.getElementById(WebString::fromUTF8("second_password")); | 221 element = document.getElementById(WebString::fromUTF8("second_password")); |
197 ASSERT_FALSE(element.isNull()); | 222 ASSERT_FALSE(element.isNull()); |
(...skipping 29 matching lines...) Expand all Loading... |
227 | 252 |
228 // Focus moved to the next input field. | 253 // Focus moved to the next input field. |
229 // TODO(zysxqn): Change this back to the address element once Bug 90224 | 254 // 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. | 255 // https://bugs.webkit.org/show_bug.cgi?id=90224 has been fixed. |
231 element = document.getElementById(WebString::fromUTF8("first_password")); | 256 element = document.getElementById(WebString::fromUTF8("first_password")); |
232 ASSERT_FALSE(element.isNull()); | 257 ASSERT_FALSE(element.isNull()); |
233 EXPECT_EQ(element, document.focusedElement()); | 258 EXPECT_EQ(element, document.focusedElement()); |
234 } | 259 } |
235 | 260 |
236 TEST_F(PasswordGenerationAgentTest, EditingTest) { | 261 TEST_F(PasswordGenerationAgentTest, EditingTest) { |
237 LoadHTML(kAccountCreationFormHTML); | 262 LoadHTMLWithUserGesture(kAccountCreationFormHTML); |
238 SetNotBlacklistedMessage(kAccountCreationFormHTML); | 263 SetNotBlacklistedMessage(kAccountCreationFormHTML); |
239 SetAccountCreationFormsDetectedMessage(0); | 264 SetAccountCreationFormsDetectedMessage(0); |
240 | 265 |
241 WebDocument document = GetMainFrame()->document(); | 266 WebDocument document = GetMainFrame()->document(); |
242 WebElement element = | 267 WebElement element = |
243 document.getElementById(WebString::fromUTF8("first_password")); | 268 document.getElementById(WebString::fromUTF8("first_password")); |
244 ASSERT_FALSE(element.isNull()); | 269 ASSERT_FALSE(element.isNull()); |
245 WebInputElement first_password_element = element.to<WebInputElement>(); | 270 WebInputElement first_password_element = element.to<WebInputElement>(); |
246 element = document.getElementById(WebString::fromUTF8("second_password")); | 271 element = document.getElementById(WebString::fromUTF8("second_password")); |
247 ASSERT_FALSE(element.isNull()); | 272 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 | 302 // textFieldDidChange posts a task, so we need to wait until it's been |
278 // processed. | 303 // processed. |
279 base::MessageLoop::current()->RunUntilIdle(); | 304 base::MessageLoop::current()->RunUntilIdle(); |
280 EXPECT_EQ(empty_password, first_password_element.value()); | 305 EXPECT_EQ(empty_password, first_password_element.value()); |
281 EXPECT_EQ(empty_password, second_password_element.value()); | 306 EXPECT_EQ(empty_password, second_password_element.value()); |
282 } | 307 } |
283 | 308 |
284 TEST_F(PasswordGenerationAgentTest, BlacklistedTest) { | 309 TEST_F(PasswordGenerationAgentTest, BlacklistedTest) { |
285 // Did not receive not blacklisted message. Don't show password generation | 310 // Did not receive not blacklisted message. Don't show password generation |
286 // icon. | 311 // icon. |
287 LoadHTML(kAccountCreationFormHTML); | 312 LoadHTMLWithUserGesture(kAccountCreationFormHTML); |
288 SetAccountCreationFormsDetectedMessage(0); | 313 SetAccountCreationFormsDetectedMessage(0); |
289 ExpectPasswordGenerationAvailable("first_password", false); | 314 ExpectPasswordGenerationAvailable("first_password", false); |
290 | 315 |
291 // Receive one not blacklisted message for non account creation form. Don't | 316 // Receive one not blacklisted message for non account creation form. Don't |
292 // show password generation icon. | 317 // show password generation icon. |
293 LoadHTML(kAccountCreationFormHTML); | 318 LoadHTMLWithUserGesture(kAccountCreationFormHTML); |
294 SetNotBlacklistedMessage(kSigninFormHTML); | 319 SetNotBlacklistedMessage(kSigninFormHTML); |
295 SetAccountCreationFormsDetectedMessage(0); | 320 SetAccountCreationFormsDetectedMessage(0); |
296 ExpectPasswordGenerationAvailable("first_password", false); | 321 ExpectPasswordGenerationAvailable("first_password", false); |
297 | 322 |
298 // Receive one not blackliste message for account creation form. Show password | 323 // Receive one not blacklisted message for account creation form. Show |
299 // generation icon. | 324 // password generation icon. |
300 LoadHTML(kAccountCreationFormHTML); | 325 LoadHTMLWithUserGesture(kAccountCreationFormHTML); |
301 SetNotBlacklistedMessage(kAccountCreationFormHTML); | 326 SetNotBlacklistedMessage(kAccountCreationFormHTML); |
302 SetAccountCreationFormsDetectedMessage(0); | 327 SetAccountCreationFormsDetectedMessage(0); |
303 ExpectPasswordGenerationAvailable("first_password", true); | 328 ExpectPasswordGenerationAvailable("first_password", true); |
304 | 329 |
305 // Receive two not blacklisted messages, one is for account creation form and | 330 // Receive two not blacklisted messages, one is for account creation form and |
306 // the other is not. Show password generation icon. | 331 // the other is not. Show password generation icon. |
307 LoadHTML(kAccountCreationFormHTML); | 332 LoadHTMLWithUserGesture(kAccountCreationFormHTML); |
308 SetNotBlacklistedMessage(kAccountCreationFormHTML); | 333 SetNotBlacklistedMessage(kAccountCreationFormHTML); |
309 SetNotBlacklistedMessage(kSigninFormHTML); | 334 SetNotBlacklistedMessage(kSigninFormHTML); |
310 SetAccountCreationFormsDetectedMessage(0); | 335 SetAccountCreationFormsDetectedMessage(0); |
311 ExpectPasswordGenerationAvailable("first_password", true); | 336 ExpectPasswordGenerationAvailable("first_password", true); |
312 } | 337 } |
313 | 338 |
314 TEST_F(PasswordGenerationAgentTest, AccountCreationFormsDetectedTest) { | 339 TEST_F(PasswordGenerationAgentTest, AccountCreationFormsDetectedTest) { |
315 // Did not receive account creation forms detected messege. Don't show | 340 // Did not receive account creation forms detected message. Don't show |
316 // password generation icon. | 341 // password generation icon. |
317 LoadHTML(kAccountCreationFormHTML); | 342 LoadHTMLWithUserGesture(kAccountCreationFormHTML); |
318 SetNotBlacklistedMessage(kAccountCreationFormHTML); | 343 SetNotBlacklistedMessage(kAccountCreationFormHTML); |
319 ExpectPasswordGenerationAvailable("first_password", false); | 344 ExpectPasswordGenerationAvailable("first_password", false); |
320 | 345 |
321 // Receive the account creation forms detected message. Show password | 346 // Receive the account creation forms detected message. Show password |
322 // generation icon. | 347 // generation icon. |
323 LoadHTML(kAccountCreationFormHTML); | 348 LoadHTMLWithUserGesture(kAccountCreationFormHTML); |
324 SetNotBlacklistedMessage(kAccountCreationFormHTML); | 349 SetNotBlacklistedMessage(kAccountCreationFormHTML); |
325 SetAccountCreationFormsDetectedMessage(0); | 350 SetAccountCreationFormsDetectedMessage(0); |
326 ExpectPasswordGenerationAvailable("first_password", true); | 351 ExpectPasswordGenerationAvailable("first_password", true); |
327 } | 352 } |
328 | 353 |
329 TEST_F(PasswordGenerationAgentTest, MaximumOfferSize) { | 354 TEST_F(PasswordGenerationAgentTest, MaximumOfferSize) { |
330 base::HistogramTester histogram_tester; | 355 base::HistogramTester histogram_tester; |
331 | 356 |
332 LoadHTML(kAccountCreationFormHTML); | 357 LoadHTMLWithUserGesture(kAccountCreationFormHTML); |
333 SetNotBlacklistedMessage(kAccountCreationFormHTML); | 358 SetNotBlacklistedMessage(kAccountCreationFormHTML); |
334 SetAccountCreationFormsDetectedMessage(0); | 359 SetAccountCreationFormsDetectedMessage(0); |
335 ExpectPasswordGenerationAvailable("first_password", true); | 360 ExpectPasswordGenerationAvailable("first_password", true); |
336 | 361 |
337 WebDocument document = GetMainFrame()->document(); | 362 WebDocument document = GetMainFrame()->document(); |
338 WebElement element = | 363 WebElement element = |
339 document.getElementById(WebString::fromUTF8("first_password")); | 364 document.getElementById(WebString::fromUTF8("first_password")); |
340 ASSERT_FALSE(element.isNull()); | 365 ASSERT_FALSE(element.isNull()); |
341 WebInputElement first_password_element = element.to<WebInputElement>(); | 366 WebInputElement first_password_element = element.to<WebInputElement>(); |
342 | 367 |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
390 password_generation_->clear_messages(); | 415 password_generation_->clear_messages(); |
391 | 416 |
392 // Change focus. Bubble should be hidden, but that is handled by AutofilAgent, | 417 // Change focus. Bubble should be hidden, but that is handled by AutofilAgent, |
393 // so no messages are sent. | 418 // so no messages are sent. |
394 ExecuteJavaScript("document.getElementById('username').focus();"); | 419 ExecuteJavaScript("document.getElementById('username').focus();"); |
395 EXPECT_EQ(0u, password_generation_->messages().size()); | 420 EXPECT_EQ(0u, password_generation_->messages().size()); |
396 password_generation_->clear_messages(); | 421 password_generation_->clear_messages(); |
397 | 422 |
398 // Focusing the password field will bring up the generation UI again. | 423 // Focusing the password field will bring up the generation UI again. |
399 ExecuteJavaScript("document.getElementById('first_password').focus();"); | 424 ExecuteJavaScript("document.getElementById('first_password').focus();"); |
400 EXPECT_EQ(1u, password_generation_->messages().size()); | 425 ASSERT_EQ(1u, password_generation_->messages().size()); |
401 EXPECT_EQ(AutofillHostMsg_ShowPasswordGenerationPopup::ID, | 426 EXPECT_EQ(AutofillHostMsg_ShowPasswordGenerationPopup::ID, |
402 password_generation_->messages()[0]->type()); | 427 password_generation_->messages()[0]->type()); |
403 password_generation_->clear_messages(); | 428 password_generation_->clear_messages(); |
404 | 429 |
405 // Loading a different page triggers UMA stat upload. Verify that only one | 430 // Loading a different page triggers UMA stat upload. Verify that only one |
406 // display event is sent even though | 431 // display event is sent even though |
407 LoadHTML(kSigninFormHTML); | 432 LoadHTMLWithUserGesture(kSigninFormHTML); |
408 | 433 |
409 histogram_tester.ExpectBucketCount( | 434 histogram_tester.ExpectBucketCount( |
410 "PasswordGeneration.Event", | 435 "PasswordGeneration.Event", |
411 autofill::password_generation::GENERATION_POPUP_SHOWN, | 436 autofill::password_generation::GENERATION_POPUP_SHOWN, |
412 1); | 437 1); |
413 } | 438 } |
414 | 439 |
415 TEST_F(PasswordGenerationAgentTest, DynamicFormTest) { | 440 TEST_F(PasswordGenerationAgentTest, DynamicFormTest) { |
416 LoadHTML(kSigninFormHTML); | 441 LoadHTMLWithUserGesture(kSigninFormHTML); |
417 SetNotBlacklistedMessage(kSigninFormHTML); | 442 SetNotBlacklistedMessage(kSigninFormHTML); |
418 | 443 |
419 ExecuteJavaScript( | 444 ExecuteJavaScript( |
420 "var form = document.createElement('form');" | 445 "var form = document.createElement('form');" |
421 "var username = document.createElement('input');" | 446 "var username = document.createElement('input');" |
422 "username.type = 'text';" | 447 "username.type = 'text';" |
423 "username.id = 'dynamic_username';" | 448 "username.id = 'dynamic_username';" |
424 "var first_password = document.createElement('input');" | 449 "var first_password = document.createElement('input');" |
425 "first_password.type = 'password';" | 450 "first_password.type = 'password';" |
426 "first_password.id = 'first_password';" | 451 "first_password.id = 'first_password';" |
427 "first_password.name = 'first_password';" | 452 "first_password.name = 'first_password';" |
428 "var second_password = document.createElement('input');" | 453 "var second_password = document.createElement('input');" |
429 "second_password.type = 'password';" | 454 "second_password.type = 'password';" |
430 "second_password.id = 'second_password';" | 455 "second_password.id = 'second_password';" |
431 "second_password.name = 'second_password';" | 456 "second_password.name = 'second_password';" |
432 "form.appendChild(username);" | 457 "form.appendChild(username);" |
433 "form.appendChild(first_password);" | 458 "form.appendChild(first_password);" |
434 "form.appendChild(second_password);" | 459 "form.appendChild(second_password);" |
435 "document.body.appendChild(form);"); | 460 "document.body.appendChild(form);"); |
436 ProcessPendingMessages(); | 461 ProcessPendingMessages(); |
437 | 462 |
438 // This needs to come after the DOM has been modified. | 463 // This needs to come after the DOM has been modified. |
439 SetAccountCreationFormsDetectedMessage(1); | 464 SetAccountCreationFormsDetectedMessage(1); |
440 | 465 |
441 // TODO(gcasto): I'm slighty worried about flakes in this test where | 466 // 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 | 467 // didAssociateFormControls() isn't called. If this turns out to be a problem |
443 // adding a call to OnDynamicFormsSeen(GetMainFrame()) will fix it, though | 468 // adding a call to OnDynamicFormsSeen(GetMainFrame()) will fix it, though |
444 // it will weaken the test. | 469 // it will weaken the test. |
445 ExpectPasswordGenerationAvailable("first_password", true); | 470 ExpectPasswordGenerationAvailable("first_password", true); |
446 } | 471 } |
447 | 472 |
448 TEST_F(PasswordGenerationAgentTest, MultiplePasswordFormsTest) { | 473 TEST_F(PasswordGenerationAgentTest, MultiplePasswordFormsTest) { |
449 // If two forms on the page looks like possible account creation forms, make | 474 // 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. | 475 // sure to trigger on the one that is specified from Autofill. |
451 LoadHTML(kMultipleAccountCreationFormHTML); | 476 LoadHTMLWithUserGesture(kMultipleAccountCreationFormHTML); |
452 SetNotBlacklistedMessage(kMultipleAccountCreationFormHTML); | 477 SetNotBlacklistedMessage(kMultipleAccountCreationFormHTML); |
453 | 478 |
454 // Should trigger on the second form. | 479 // Should trigger on the second form. |
455 SetAccountCreationFormsDetectedMessage(1); | 480 SetAccountCreationFormsDetectedMessage(1); |
456 | 481 |
457 ExpectPasswordGenerationAvailable("password", false); | 482 ExpectPasswordGenerationAvailable("password", false); |
458 ExpectPasswordGenerationAvailable("first_password", true); | 483 ExpectPasswordGenerationAvailable("first_password", true); |
459 } | 484 } |
460 | 485 |
461 TEST_F(PasswordGenerationAgentTest, MessagesAfterAccountSignupFormFound) { | 486 TEST_F(PasswordGenerationAgentTest, MessagesAfterAccountSignupFormFound) { |
462 LoadHTML(kAccountCreationFormHTML); | 487 LoadHTMLWithUserGesture(kAccountCreationFormHTML); |
463 SetNotBlacklistedMessage(kAccountCreationFormHTML); | 488 SetNotBlacklistedMessage(kAccountCreationFormHTML); |
464 SetAccountCreationFormsDetectedMessage(0); | 489 SetAccountCreationFormsDetectedMessage(0); |
465 | 490 |
466 // Generation should be enabled. | 491 // Generation should be enabled. |
467 ExpectPasswordGenerationAvailable("first_password", true); | 492 ExpectPasswordGenerationAvailable("first_password", true); |
468 | 493 |
469 // Extra not blacklisted messages can be sent. Make sure that they are handled | 494 // Extra not blacklisted messages can be sent. Make sure that they are handled |
470 // correctly (generation should still be available). | 495 // correctly (generation should still be available). |
471 SetNotBlacklistedMessage(kAccountCreationFormHTML); | 496 SetNotBlacklistedMessage(kAccountCreationFormHTML); |
472 | 497 |
473 // Need to focus another field first for verification to work. | 498 // Need to focus another field first for verification to work. |
474 ExpectPasswordGenerationAvailable("second_password", false); | 499 ExpectPasswordGenerationAvailable("second_password", false); |
475 ExpectPasswordGenerationAvailable("first_password", true); | 500 ExpectPasswordGenerationAvailable("first_password", true); |
476 } | 501 } |
477 | 502 |
| 503 // Losing focus should not trigger a password generation popup. |
| 504 TEST_F(PasswordGenerationAgentTest, BlurTest) { |
| 505 LoadHTMLWithUserGesture(kDisabledElementAccountCreationFormHTML); |
| 506 SetNotBlacklistedMessage(kDisabledElementAccountCreationFormHTML); |
| 507 SetAccountCreationFormsDetectedMessage(0); |
| 508 |
| 509 // Focus on the first password field: password generation popup should show |
| 510 // up. |
| 511 ExpectPasswordGenerationAvailable("first_password", true); |
| 512 |
| 513 // Remove focus from everywhere by clicking an unfocusable element: password |
| 514 // generation popup should not show up. |
| 515 EXPECT_TRUE(SimulateElementClick("disabled")); |
| 516 EXPECT_EQ(0u, password_generation_->messages().size()); |
| 517 } |
| 518 |
478 } // namespace autofill | 519 } // namespace autofill |
OLD | NEW |