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 "components/autofill/content/renderer/password_autofill_agent.h" | 5 #include "components/autofill/content/renderer/password_autofill_agent.h" |
6 | 6 |
7 #include "base/macros.h" | 7 #include "base/macros.h" |
8 #include "base/run_loop.h" | 8 #include "base/run_loop.h" |
9 #include "base/strings/string_number_conversions.h" | 9 #include "base/strings/string_number_conversions.h" |
10 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
(...skipping 1660 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1671 ExpectFieldPropertiesMasks(PasswordFormSubmitted, expected_properties_masks); | 1671 ExpectFieldPropertiesMasks(PasswordFormSubmitted, expected_properties_masks); |
1672 } | 1672 } |
1673 | 1673 |
1674 TEST_F(PasswordAutofillAgentTest, RememberFieldPropertiesOnInPageNavigation) { | 1674 TEST_F(PasswordAutofillAgentTest, RememberFieldPropertiesOnInPageNavigation) { |
1675 LoadHTML(kNoFormHTML); | 1675 LoadHTML(kNoFormHTML); |
1676 UpdateUsernameAndPasswordElements(); | 1676 UpdateUsernameAndPasswordElements(); |
1677 | 1677 |
1678 SimulateUsernameChange("Bob"); | 1678 SimulateUsernameChange("Bob"); |
1679 SimulatePasswordChange("mypassword"); | 1679 SimulatePasswordChange("mypassword"); |
1680 | 1680 |
1681 username_element_.SetAttribute("style", "display:none;"); | 1681 std::string hide_elements = |
1682 password_element_.SetAttribute("style", "display:none;"); | 1682 "var password = document.getElementById('password');" |
| 1683 "password.style = 'display:none';" |
| 1684 "var username = document.getElementById('username');" |
| 1685 "username.style = 'display:none';"; |
| 1686 ExecuteJavaScriptForTests(hide_elements.c_str()); |
1683 | 1687 |
1684 password_autofill_agent_->AJAXSucceeded(); | 1688 password_autofill_agent_->AJAXSucceeded(); |
1685 | 1689 |
1686 std::map<base::string16, FieldPropertiesMask> expected_properties_masks; | 1690 std::map<base::string16, FieldPropertiesMask> expected_properties_masks; |
1687 expected_properties_masks[ASCIIToUTF16("username")] = | 1691 expected_properties_masks[ASCIIToUTF16("username")] = |
1688 FieldPropertiesFlags::USER_TYPED; | 1692 FieldPropertiesFlags::USER_TYPED; |
1689 expected_properties_masks[ASCIIToUTF16("password")] = | 1693 expected_properties_masks[ASCIIToUTF16("password")] = |
1690 FieldPropertiesFlags::USER_TYPED | FieldPropertiesFlags::HAD_FOCUS; | 1694 FieldPropertiesFlags::USER_TYPED | FieldPropertiesFlags::HAD_FOCUS; |
1691 | 1695 |
1692 ExpectFieldPropertiesMasks(PasswordFormInPageNavigation, | 1696 ExpectFieldPropertiesMasks(PasswordFormInPageNavigation, |
1693 expected_properties_masks); | 1697 expected_properties_masks); |
1694 } | 1698 } |
1695 | 1699 |
| 1700 TEST_F(PasswordAutofillAgentTest, RememberFieldPropertiesOnInPageNavigation_2) { |
| 1701 LoadHTML(kNoFormHTML); |
| 1702 UpdateUsernameAndPasswordElements(); |
| 1703 |
| 1704 SimulateUsernameChange("Bob"); |
| 1705 SimulatePasswordChange("mypassword"); |
| 1706 |
| 1707 password_autofill_agent_->AJAXSucceeded(); |
| 1708 |
| 1709 std::string hide_elements = |
| 1710 "var password = document.getElementById('password');" |
| 1711 "password.style = 'display:none';" |
| 1712 "var username = document.getElementById('username');" |
| 1713 "username.style = 'display:none';"; |
| 1714 ExecuteJavaScriptForTests(hide_elements.c_str()); |
| 1715 |
| 1716 base::RunLoop().RunUntilIdle(); |
| 1717 |
| 1718 std::map<base::string16, FieldPropertiesMask> expected_properties_masks; |
| 1719 expected_properties_masks[ASCIIToUTF16("username")] = |
| 1720 FieldPropertiesFlags::USER_TYPED; |
| 1721 expected_properties_masks[ASCIIToUTF16("password")] = |
| 1722 FieldPropertiesFlags::USER_TYPED | FieldPropertiesFlags::HAD_FOCUS; |
| 1723 |
| 1724 ExpectFieldPropertiesMasks(PasswordFormInPageNavigation, |
| 1725 expected_properties_masks); |
| 1726 } |
| 1727 |
1696 // The username/password is autofilled by password manager then just before | 1728 // The username/password is autofilled by password manager then just before |
1697 // sending the form off, a script changes them. This test checks that | 1729 // sending the form off, a script changes them. This test checks that |
1698 // PasswordAutofillAgent can still get the username and the password autofilled. | 1730 // PasswordAutofillAgent can still get the username and the password autofilled. |
1699 TEST_F(PasswordAutofillAgentTest, | 1731 TEST_F(PasswordAutofillAgentTest, |
1700 RememberLastAutofilledUsernameAndPasswordOnSubmit_ScriptChanged) { | 1732 RememberLastAutofilledUsernameAndPasswordOnSubmit_ScriptChanged) { |
1701 SimulateOnFillPasswordForm(fill_data_); | 1733 SimulateOnFillPasswordForm(fill_data_); |
1702 | 1734 |
1703 // Simulate that the username and the password value was changed by the | 1735 // Simulate that the username and the password value was changed by the |
1704 // site's JavaScript before submit. | 1736 // site's JavaScript before submit. |
1705 username_element_.SetValue(WebString("new username")); | 1737 username_element_.SetValue(WebString("new username")); |
(...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2241 CheckTextFieldsState("", true, kAlicePassword, true); | 2273 CheckTextFieldsState("", true, kAlicePassword, true); |
2242 } | 2274 } |
2243 | 2275 |
2244 TEST_F(PasswordAutofillAgentTest, NoForm_PromptForAJAXSubmitWithoutNavigation) { | 2276 TEST_F(PasswordAutofillAgentTest, NoForm_PromptForAJAXSubmitWithoutNavigation) { |
2245 LoadHTML(kNoFormHTML); | 2277 LoadHTML(kNoFormHTML); |
2246 UpdateUsernameAndPasswordElements(); | 2278 UpdateUsernameAndPasswordElements(); |
2247 | 2279 |
2248 SimulateUsernameChange("Bob"); | 2280 SimulateUsernameChange("Bob"); |
2249 SimulatePasswordChange("mypassword"); | 2281 SimulatePasswordChange("mypassword"); |
2250 | 2282 |
2251 username_element_.SetAttribute("style", "display:none;"); | 2283 std::string hide_elements = |
2252 password_element_.SetAttribute("style", "display:none;"); | 2284 "var password = document.getElementById('password');" |
| 2285 "password.style = 'display:none';" |
| 2286 "var username = document.getElementById('username');" |
| 2287 "username.style = 'display:none';"; |
| 2288 ExecuteJavaScriptForTests(hide_elements.c_str()); |
2253 | 2289 |
2254 password_autofill_agent_->AJAXSucceeded(); | 2290 password_autofill_agent_->AJAXSucceeded(); |
2255 | 2291 |
2256 ExpectInPageNavigationWithUsernameAndPasswords( | 2292 ExpectInPageNavigationWithUsernameAndPasswords( |
2257 "Bob", "mypassword", "", | 2293 "Bob", "mypassword", "", |
2258 PasswordForm::SubmissionIndicatorEvent::XHR_SUCCEEDED); | 2294 PasswordForm::SubmissionIndicatorEvent::XHR_SUCCEEDED); |
2259 } | 2295 } |
2260 | 2296 |
2261 TEST_F(PasswordAutofillAgentTest, | 2297 TEST_F(PasswordAutofillAgentTest, |
| 2298 NoForm_PromptForAJAXSubmitWithoutNavigation_2) { |
| 2299 LoadHTML(kNoFormHTML); |
| 2300 UpdateUsernameAndPasswordElements(); |
| 2301 |
| 2302 SimulateUsernameChange("Bob"); |
| 2303 SimulatePasswordChange("mypassword"); |
| 2304 |
| 2305 password_autofill_agent_->AJAXSucceeded(); |
| 2306 |
| 2307 std::string hide_elements = |
| 2308 "var password = document.getElementById('password');" |
| 2309 "password.style = 'display:none';" |
| 2310 "var username = document.getElementById('username');" |
| 2311 "username.style = 'display:none';"; |
| 2312 ExecuteJavaScriptForTests(hide_elements.c_str()); |
| 2313 |
| 2314 base::RunLoop().RunUntilIdle(); |
| 2315 |
| 2316 ExpectInPageNavigationWithUsernameAndPasswords( |
| 2317 "Bob", "mypassword", "", |
| 2318 PasswordForm::SubmissionIndicatorEvent::DOM_MUTATION_AFTER_XHR); |
| 2319 } |
| 2320 |
| 2321 TEST_F(PasswordAutofillAgentTest, |
2262 NoForm_NoPromptForAJAXSubmitWithoutNavigationAndElementsVisible) { | 2322 NoForm_NoPromptForAJAXSubmitWithoutNavigationAndElementsVisible) { |
2263 LoadHTML(kNoFormHTML); | 2323 LoadHTML(kNoFormHTML); |
2264 UpdateUsernameAndPasswordElements(); | 2324 UpdateUsernameAndPasswordElements(); |
2265 | 2325 |
2266 SimulateUsernameChange("Bob"); | 2326 SimulateUsernameChange("Bob"); |
2267 SimulatePasswordChange("mypassword"); | 2327 SimulatePasswordChange("mypassword"); |
2268 | 2328 |
2269 password_autofill_agent_->AJAXSucceeded(); | 2329 password_autofill_agent_->AJAXSucceeded(); |
2270 | 2330 |
2271 base::RunLoop().RunUntilIdle(); | 2331 base::RunLoop().RunUntilIdle(); |
(...skipping 12 matching lines...) Expand all Loading... |
2284 | 2344 |
2285 UpdateUsernameAndPasswordElements(); | 2345 UpdateUsernameAndPasswordElements(); |
2286 WebElement captcha_element = GetMainFrame()->GetDocument().GetElementById( | 2346 WebElement captcha_element = GetMainFrame()->GetDocument().GetElementById( |
2287 WebString::FromUTF8("captcha")); | 2347 WebString::FromUTF8("captcha")); |
2288 ASSERT_FALSE(captcha_element.IsNull()); | 2348 ASSERT_FALSE(captcha_element.IsNull()); |
2289 | 2349 |
2290 SimulateUsernameChange("Bob"); | 2350 SimulateUsernameChange("Bob"); |
2291 SimulatePasswordChange("mypassword"); | 2351 SimulatePasswordChange("mypassword"); |
2292 | 2352 |
2293 // Simulate captcha element show up right before AJAX completed. | 2353 // Simulate captcha element show up right before AJAX completed. |
2294 captcha_element.SetAttribute("style", "display:inline;"); | 2354 std::string show_captcha = |
| 2355 "var captcha = document.getElementById('captcha');" |
| 2356 "captcha.style = 'display:inline';"; |
| 2357 ExecuteJavaScriptForTests(show_captcha.c_str()); |
2295 password_autofill_agent_->AJAXSucceeded(); | 2358 password_autofill_agent_->AJAXSucceeded(); |
2296 | 2359 |
2297 base::RunLoop().RunUntilIdle(); | 2360 base::RunLoop().RunUntilIdle(); |
2298 EXPECT_FALSE(fake_driver_.called_inpage_navigation()); | 2361 EXPECT_FALSE(fake_driver_.called_inpage_navigation()); |
2299 EXPECT_FALSE(fake_driver_.called_password_form_submitted()); | 2362 EXPECT_FALSE(fake_driver_.called_password_form_submitted()); |
2300 } | 2363 } |
2301 | 2364 |
| 2365 TEST_F(PasswordAutofillAgentTest, |
| 2366 NoForm_NoPromptForAJAXSubmitWithoutNavigationAndNewElementAppeared_2) { |
| 2367 const char kNoFormHTMLWithHiddenField[] = |
| 2368 "<INPUT type='text' id='username'/>" |
| 2369 "<INPUT type='password' id='password'/>" |
| 2370 "<INPUT type='text' id='captcha' style='display:none'/>"; |
| 2371 LoadHTML(kNoFormHTMLWithHiddenField); |
| 2372 |
| 2373 UpdateUsernameAndPasswordElements(); |
| 2374 WebElement captcha_element = GetMainFrame()->GetDocument().GetElementById( |
| 2375 WebString::FromUTF8("captcha")); |
| 2376 ASSERT_FALSE(captcha_element.IsNull()); |
| 2377 |
| 2378 SimulateUsernameChange("Bob"); |
| 2379 SimulatePasswordChange("mypassword"); |
| 2380 |
| 2381 password_autofill_agent_->AJAXSucceeded(); |
| 2382 |
| 2383 // Simulate captcha element show up right after AJAX completed. |
| 2384 std::string show_captcha = |
| 2385 "var captcha = document.getElementById('captcha');" |
| 2386 "captcha.style = 'display:inline';"; |
| 2387 ExecuteJavaScriptForTests(show_captcha.c_str()); |
| 2388 base::RunLoop().RunUntilIdle(); |
| 2389 |
| 2390 EXPECT_FALSE(fake_driver_.called_inpage_navigation()); |
| 2391 EXPECT_FALSE(fake_driver_.called_password_form_submitted()); |
| 2392 } |
| 2393 |
2302 // Tests that no save promt is shown when a form with empty action URL is | 2394 // Tests that no save promt is shown when a form with empty action URL is |
2303 // changed and AJAX completed but the form is still visible. | 2395 // changed and AJAX completed but the form is still visible. |
2304 TEST_F(PasswordAutofillAgentTest, | 2396 TEST_F(PasswordAutofillAgentTest, |
2305 NoAction_NoPromptForAJAXSubmitWithoutNavigationAndNewElementAppeared) { | 2397 NoAction_NoPromptForAJAXSubmitWithoutNavigationAndNewElementAppeared) { |
2306 // Form without an action URL. | 2398 // Form without an action URL. |
2307 const char kHTMLWithHiddenField[] = | 2399 const char kHTMLWithHiddenField[] = |
2308 "<FORM name='LoginTestForm'>" | 2400 "<FORM name='LoginTestForm'>" |
2309 " <INPUT type='text' id='username'/>" | 2401 " <INPUT type='text' id='username'/>" |
2310 " <INPUT type='password' id='password'/>" | 2402 " <INPUT type='password' id='password'/>" |
2311 " <INPUT type='text' id='captcha' style='display:none'/>" | 2403 " <INPUT type='text' id='captcha' style='display:none'/>" |
(...skipping 12 matching lines...) Expand all Loading... |
2324 | 2416 |
2325 // Simulate captcha element show up right before AJAX completed. | 2417 // Simulate captcha element show up right before AJAX completed. |
2326 captcha_element.SetAttribute("style", "display:inline;"); | 2418 captcha_element.SetAttribute("style", "display:inline;"); |
2327 password_autofill_agent_->AJAXSucceeded(); | 2419 password_autofill_agent_->AJAXSucceeded(); |
2328 | 2420 |
2329 base::RunLoop().RunUntilIdle(); | 2421 base::RunLoop().RunUntilIdle(); |
2330 EXPECT_FALSE(fake_driver_.called_inpage_navigation()); | 2422 EXPECT_FALSE(fake_driver_.called_inpage_navigation()); |
2331 EXPECT_FALSE(fake_driver_.called_password_form_submitted()); | 2423 EXPECT_FALSE(fake_driver_.called_password_form_submitted()); |
2332 } | 2424 } |
2333 | 2425 |
| 2426 TEST_F(PasswordAutofillAgentTest, |
| 2427 NoAction_NoPromptForAJAXSubmitWithoutNavigationAndNewElementAppeared_2) { |
| 2428 // Form without an action URL. |
| 2429 const char kHTMLWithHiddenField[] = |
| 2430 "<FORM name='LoginTestForm'>" |
| 2431 " <INPUT type='text' id='username'/>" |
| 2432 " <INPUT type='password' id='password'/>" |
| 2433 " <INPUT type='text' id='captcha' style='display:none'/>" |
| 2434 " <INPUT type='submit' value='Login'/>" |
| 2435 "</FORM>"; |
| 2436 // Set the valid URL so the form action URL can be generated properly. |
| 2437 LoadHTMLWithUrlOverride(kHTMLWithHiddenField, "https://www.example.com"); |
| 2438 |
| 2439 UpdateUsernameAndPasswordElements(); |
| 2440 WebElement captcha_element = GetMainFrame()->GetDocument().GetElementById( |
| 2441 WebString::FromUTF8("captcha")); |
| 2442 ASSERT_FALSE(captcha_element.IsNull()); |
| 2443 |
| 2444 SimulateUsernameChange("Bob"); |
| 2445 SimulatePasswordChange("mypassword"); |
| 2446 |
| 2447 password_autofill_agent_->AJAXSucceeded(); |
| 2448 |
| 2449 // Simulate captcha element show up right after AJAX completed. |
| 2450 captcha_element.SetAttribute("style", "display:inline;"); |
| 2451 |
| 2452 base::RunLoop().RunUntilIdle(); |
| 2453 EXPECT_FALSE(fake_driver_.called_inpage_navigation()); |
| 2454 EXPECT_FALSE(fake_driver_.called_password_form_submitted()); |
| 2455 } |
| 2456 |
2334 // Tests that credential suggestions are autofilled on a password (and change | 2457 // Tests that credential suggestions are autofilled on a password (and change |
2335 // password) forms having either ambiguous or empty name. | 2458 // password) forms having either ambiguous or empty name. |
2336 TEST_F(PasswordAutofillAgentTest, | 2459 TEST_F(PasswordAutofillAgentTest, |
2337 SuggestionsOnFormContainingAmbiguousOrEmptyNames) { | 2460 SuggestionsOnFormContainingAmbiguousOrEmptyNames) { |
2338 const char kEmpty[] = ""; | 2461 const char kEmpty[] = ""; |
2339 const char kDummyUsernameField[] = "anonymous_username"; | 2462 const char kDummyUsernameField[] = "anonymous_username"; |
2340 const char kDummyPasswordField[] = "anonymous_password"; | 2463 const char kDummyPasswordField[] = "anonymous_password"; |
2341 const char kFormContainsEmptyNamesHTML[] = | 2464 const char kFormContainsEmptyNamesHTML[] = |
2342 "<FORM name='WithoutNameIdForm' action='http://www.bidule.com' >" | 2465 "<FORM name='WithoutNameIdForm' action='http://www.bidule.com' >" |
2343 " <INPUT type='text' placeholder='username'/>" | 2466 " <INPUT type='text' placeholder='username'/>" |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2534 TEST_F(PasswordAutofillAgentTest, | 2657 TEST_F(PasswordAutofillAgentTest, |
2535 UsernameChangedAfterPasswordInput_InPageNavigation) { | 2658 UsernameChangedAfterPasswordInput_InPageNavigation) { |
2536 LoadHTML(kNoFormHTML); | 2659 LoadHTML(kNoFormHTML); |
2537 UpdateUsernameAndPasswordElements(); | 2660 UpdateUsernameAndPasswordElements(); |
2538 | 2661 |
2539 SimulateUsernameChange("Bob"); | 2662 SimulateUsernameChange("Bob"); |
2540 SimulatePasswordChange("mypassword"); | 2663 SimulatePasswordChange("mypassword"); |
2541 SimulateUsernameChange("Alice"); | 2664 SimulateUsernameChange("Alice"); |
2542 | 2665 |
2543 // Hide form elements to simulate successful login. | 2666 // Hide form elements to simulate successful login. |
2544 username_element_.SetAttribute("style", "display:none;"); | 2667 std::string hide_elements = |
2545 password_element_.SetAttribute("style", "display:none;"); | 2668 "var password = document.getElementById('password');" |
| 2669 "password.style = 'display:none';" |
| 2670 "var username = document.getElementById('username');" |
| 2671 "username.style = 'display:none';"; |
| 2672 ExecuteJavaScriptForTests(hide_elements.c_str()); |
2546 | 2673 |
2547 password_autofill_agent_->AJAXSucceeded(); | 2674 password_autofill_agent_->AJAXSucceeded(); |
2548 | 2675 |
2549 ExpectInPageNavigationWithUsernameAndPasswords( | 2676 ExpectInPageNavigationWithUsernameAndPasswords( |
2550 "Alice", "mypassword", "", | 2677 "Alice", "mypassword", "", |
2551 PasswordForm::SubmissionIndicatorEvent::XHR_SUCCEEDED); | 2678 PasswordForm::SubmissionIndicatorEvent::XHR_SUCCEEDED); |
2552 } | 2679 } |
2553 | 2680 |
2554 TEST_F(PasswordAutofillAgentTest, | 2681 TEST_F(PasswordAutofillAgentTest, |
| 2682 UsernameChangedAfterPasswordInput_InPageNavigation_2) { |
| 2683 LoadHTML(kNoFormHTML); |
| 2684 UpdateUsernameAndPasswordElements(); |
| 2685 |
| 2686 SimulateUsernameChange("Bob"); |
| 2687 SimulatePasswordChange("mypassword"); |
| 2688 SimulateUsernameChange("Alice"); |
| 2689 |
| 2690 password_autofill_agent_->AJAXSucceeded(); |
| 2691 |
| 2692 // Hide form elements to simulate successful login. |
| 2693 std::string hide_elements = |
| 2694 "var password = document.getElementById('password');" |
| 2695 "password.style = 'display:none';" |
| 2696 "var username = document.getElementById('username');" |
| 2697 "username.style = 'display:none';"; |
| 2698 ExecuteJavaScriptForTests(hide_elements.c_str()); |
| 2699 base::RunLoop().RunUntilIdle(); |
| 2700 |
| 2701 ExpectInPageNavigationWithUsernameAndPasswords( |
| 2702 "Alice", "mypassword", "", |
| 2703 PasswordForm::SubmissionIndicatorEvent::DOM_MUTATION_AFTER_XHR); |
| 2704 } |
| 2705 |
| 2706 TEST_F(PasswordAutofillAgentTest, |
2555 UsernameChangedAfterPasswordInput_FormSubmitted) { | 2707 UsernameChangedAfterPasswordInput_FormSubmitted) { |
2556 SimulateUsernameChange("Bob"); | 2708 SimulateUsernameChange("Bob"); |
2557 SimulatePasswordChange("mypassword"); | 2709 SimulatePasswordChange("mypassword"); |
2558 SimulateUsernameChange("Alice"); | 2710 SimulateUsernameChange("Alice"); |
2559 | 2711 |
2560 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) | 2712 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) |
2561 ->WillSendSubmitEvent(username_element_.Form()); | 2713 ->WillSendSubmitEvent(username_element_.Form()); |
2562 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) | 2714 static_cast<content::RenderFrameObserver*>(password_autofill_agent_) |
2563 ->WillSubmitForm(username_element_.Form()); | 2715 ->WillSubmitForm(username_element_.Form()); |
2564 | 2716 |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2737 | 2889 |
2738 // Navigate to another page and click on username field, | 2890 // Navigate to another page and click on username field, |
2739 // CheckSafeBrowsingReputation() should be triggered again. | 2891 // CheckSafeBrowsingReputation() should be triggered again. |
2740 LoadHTML(kFormHTML); | 2892 LoadHTML(kFormHTML); |
2741 SimulateElementClick(kUsernameName); | 2893 SimulateElementClick(kUsernameName); |
2742 base::RunLoop().RunUntilIdle(); | 2894 base::RunLoop().RunUntilIdle(); |
2743 EXPECT_EQ(2, fake_driver_.called_check_safe_browsing_reputation_cnt()); | 2895 EXPECT_EQ(2, fake_driver_.called_check_safe_browsing_reputation_cnt()); |
2744 } | 2896 } |
2745 #endif | 2897 #endif |
2746 } // namespace autofill | 2898 } // namespace autofill |
OLD | NEW |