Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/files/file_util.h" | 8 #include "base/files/file_util.h" |
| 9 #include "base/macros.h" | 9 #include "base/macros.h" |
| 10 #include "base/memory/ref_counted.h" | 10 #include "base/memory/ref_counted.h" |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 35 #include "components/autofill/core/browser/autofill_profile.h" | 35 #include "components/autofill/core/browser/autofill_profile.h" |
| 36 #include "components/autofill/core/browser/autofill_test_utils.h" | 36 #include "components/autofill/core/browser/autofill_test_utils.h" |
| 37 #include "components/autofill/core/browser/validation.h" | 37 #include "components/autofill/core/browser/validation.h" |
| 38 #include "components/translate/core/browser/translate_manager.h" | 38 #include "components/translate/core/browser/translate_manager.h" |
| 39 #include "content/public/browser/navigation_controller.h" | 39 #include "content/public/browser/navigation_controller.h" |
| 40 #include "content/public/browser/notification_observer.h" | 40 #include "content/public/browser/notification_observer.h" |
| 41 #include "content/public/browser/notification_registrar.h" | 41 #include "content/public/browser/notification_registrar.h" |
| 42 #include "content/public/browser/notification_service.h" | 42 #include "content/public/browser/notification_service.h" |
| 43 #include "content/public/browser/render_view_host.h" | 43 #include "content/public/browser/render_view_host.h" |
| 44 #include "content/public/browser/render_widget_host.h" | 44 #include "content/public/browser/render_widget_host.h" |
| 45 #include "content/public/browser/render_widget_host_view.h" | |
| 45 #include "content/public/browser/web_contents.h" | 46 #include "content/public/browser/web_contents.h" |
| 46 #include "content/public/test/browser_test_utils.h" | 47 #include "content/public/test/browser_test_utils.h" |
| 47 #include "content/public/test/test_renderer_host.h" | 48 #include "content/public/test/test_renderer_host.h" |
| 48 #include "content/public/test/test_utils.h" | 49 #include "content/public/test/test_utils.h" |
| 49 #include "net/base/net_errors.h" | 50 #include "net/base/net_errors.h" |
| 51 #include "net/dns/mock_host_resolver.h" | |
| 50 #include "net/test/embedded_test_server/embedded_test_server.h" | 52 #include "net/test/embedded_test_server/embedded_test_server.h" |
| 51 #include "net/url_request/test_url_fetcher_factory.h" | 53 #include "net/url_request/test_url_fetcher_factory.h" |
| 52 #include "net/url_request/url_request_status.h" | 54 #include "net/url_request/url_request_status.h" |
| 53 #include "testing/gmock/include/gmock/gmock.h" | 55 #include "testing/gmock/include/gmock/gmock.h" |
| 54 #include "testing/gtest/include/gtest/gtest.h" | 56 #include "testing/gtest/include/gtest/gtest.h" |
| 55 #include "ui/base/clipboard/scoped_clipboard_writer.h" | 57 #include "ui/base/clipboard/scoped_clipboard_writer.h" |
| 56 #include "ui/events/base_event_utils.h" | 58 #include "ui/events/base_event_utils.h" |
| 57 #include "ui/events/keycodes/keyboard_code_conversion.h" | 59 #include "ui/events/keycodes/keyboard_code_conversion.h" |
| 58 #include "ui/events/keycodes/keyboard_codes.h" | 60 #include "ui/events/keycodes/keyboard_codes.h" |
| 59 | 61 |
| 60 using base::ASCIIToUTF16; | 62 using base::ASCIIToUTF16; |
| 61 | 63 |
| 62 namespace autofill { | 64 namespace autofill { |
| 63 | 65 |
| 66 namespace { | |
| 67 | |
| 64 static const char kDataURIPrefix[] = "data:text/html;charset=utf-8,"; | 68 static const char kDataURIPrefix[] = "data:text/html;charset=utf-8,"; |
| 65 static const char kTestFormString[] = | 69 static const char kTestFormString[] = |
| 66 "<form action=\"http://www.example.com/\" method=\"POST\">" | 70 "<form action=\"http://www.example.com/\" method=\"POST\">" |
| 67 "<label for=\"firstname\">First name:</label>" | 71 "<label for=\"firstname\">First name:</label>" |
| 68 " <input type=\"text\" id=\"firstname\"" | 72 " <input type=\"text\" id=\"firstname\"" |
| 69 " onfocus=\"domAutomationController.send(true)\"><br>" | 73 " onfocus=\"domAutomationController.send(true)\"><br>" |
| 70 "<label for=\"lastname\">Last name:</label>" | 74 "<label for=\"lastname\">Last name:</label>" |
| 71 " <input type=\"text\" id=\"lastname\"><br>" | 75 " <input type=\"text\" id=\"lastname\"><br>" |
| 72 "<label for=\"address1\">Address line 1:</label>" | 76 "<label for=\"address1\">Address line 1:</label>" |
| 73 " <input type=\"text\" id=\"address1\"><br>" | 77 " <input type=\"text\" id=\"address1\"><br>" |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 199 loop_runner_->Run(); | 203 loop_runner_->Run(); |
| 200 } | 204 } |
| 201 | 205 |
| 202 private: | 206 private: |
| 203 scoped_refptr<content::MessageLoopRunner> loop_runner_; | 207 scoped_refptr<content::MessageLoopRunner> loop_runner_; |
| 204 bool waiting_for_text_change_; | 208 bool waiting_for_text_change_; |
| 205 | 209 |
| 206 DISALLOW_COPY_AND_ASSIGN(AutofillManagerTestDelegateImpl); | 210 DISALLOW_COPY_AND_ASSIGN(AutofillManagerTestDelegateImpl); |
| 207 }; | 211 }; |
| 208 | 212 |
| 213 // Searches all frames of |web_contents| and returns one called |name|. If | |
| 214 // there are none, returns null, if there are more, returns an arbitrary one. | |
| 215 content::RenderFrameHost* RenderFrameHostForName( | |
| 216 content::WebContents* web_contents, | |
| 217 const std::string& name) { | |
| 218 for (content::RenderFrameHost* frame : web_contents->GetAllFrames()) { | |
| 219 if (frame->GetFrameName() == name) | |
| 220 return frame; | |
| 221 } | |
| 222 return nullptr; | |
| 223 } | |
| 224 | |
| 225 } // namespace | |
| 226 | |
| 209 // AutofillInteractiveTest ---------------------------------------------------- | 227 // AutofillInteractiveTest ---------------------------------------------------- |
| 210 | 228 |
| 211 class AutofillInteractiveTest : public InProcessBrowserTest { | 229 class AutofillInteractiveTest : public InProcessBrowserTest { |
| 212 protected: | 230 protected: |
| 213 AutofillInteractiveTest() : | 231 AutofillInteractiveTest() : |
| 214 key_press_event_sink_( | 232 key_press_event_sink_( |
| 215 base::Bind(&AutofillInteractiveTest::HandleKeyPressEvent, | 233 base::Bind(&AutofillInteractiveTest::HandleKeyPressEvent, |
| 216 base::Unretained(this))) {} | 234 base::Unretained(this))) {} |
| 217 ~AutofillInteractiveTest() override {} | 235 ~AutofillInteractiveTest() override {} |
| 218 | 236 |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 441 test_delegate_.WaitForTextChange(); | 459 test_delegate_.WaitForTextChange(); |
| 442 } | 460 } |
| 443 | 461 |
| 444 bool HandleKeyPressEvent(const content::NativeWebKeyboardEvent& event) { | 462 bool HandleKeyPressEvent(const content::NativeWebKeyboardEvent& event) { |
| 445 return true; | 463 return true; |
| 446 } | 464 } |
| 447 | 465 |
| 448 void SendKeyToPopupAndWait(ui::DomKey key) { | 466 void SendKeyToPopupAndWait(ui::DomKey key) { |
| 449 ui::KeyboardCode key_code = ui::NonPrintableDomKeyToKeyboardCode(key); | 467 ui::KeyboardCode key_code = ui::NonPrintableDomKeyToKeyboardCode(key); |
| 450 ui::DomCode code = ui::UsLayoutKeyboardCodeToDomCode(key_code); | 468 ui::DomCode code = ui::UsLayoutKeyboardCodeToDomCode(key_code); |
| 451 SendKeyToPopupAndWait(key, code, key_code); | 469 SendKeyToPopupAndWait(key, code, key_code, |
| 470 GetRenderViewHost()->GetWidget()); | |
| 452 } | 471 } |
| 453 | 472 |
| 454 void SendKeyToPopupAndWait(ui::DomKey key, | 473 void SendKeyToPopupAndWait(ui::DomKey key, |
| 455 ui::DomCode code, | 474 ui::DomCode code, |
| 456 ui::KeyboardCode key_code) { | 475 ui::KeyboardCode key_code, |
| 476 content::RenderWidgetHost* widget) { | |
| 457 // Route popup-targeted key presses via the render view host. | 477 // Route popup-targeted key presses via the render view host. |
| 458 content::NativeWebKeyboardEvent event(blink::WebKeyboardEvent::RawKeyDown, | 478 content::NativeWebKeyboardEvent event(blink::WebKeyboardEvent::RawKeyDown, |
| 459 blink::WebInputEvent::NoModifiers, | 479 blink::WebInputEvent::NoModifiers, |
| 460 ui::EventTimeForNow()); | 480 ui::EventTimeForNow()); |
| 461 event.windowsKeyCode = key_code; | 481 event.windowsKeyCode = key_code; |
| 462 event.domCode = static_cast<int>(code); | 482 event.domCode = static_cast<int>(code); |
| 463 event.domKey = key; | 483 event.domKey = key; |
| 464 test_delegate_.Reset(); | 484 test_delegate_.Reset(); |
| 465 // Install the key press event sink to ensure that any events that are not | 485 // Install the key press event sink to ensure that any events that are not |
| 466 // handled by the installed callbacks do not end up crashing the test. | 486 // handled by the installed callbacks do not end up crashing the test. |
| 467 GetRenderViewHost()->GetWidget()->AddKeyPressEventCallback( | 487 widget->AddKeyPressEventCallback(key_press_event_sink_); |
| 468 key_press_event_sink_); | 488 widget->ForwardKeyboardEvent(event); |
| 469 GetRenderViewHost()->GetWidget()->ForwardKeyboardEvent(event); | |
| 470 test_delegate_.Wait(); | 489 test_delegate_.Wait(); |
| 471 GetRenderViewHost()->GetWidget()->RemoveKeyPressEventCallback( | 490 widget->RemoveKeyPressEventCallback(key_press_event_sink_); |
| 472 key_press_event_sink_); | |
| 473 } | 491 } |
| 474 | 492 |
| 475 void SendKeyToDataListPopup(ui::DomKey key) { | 493 void SendKeyToDataListPopup(ui::DomKey key) { |
| 476 ui::KeyboardCode key_code = ui::NonPrintableDomKeyToKeyboardCode(key); | 494 ui::KeyboardCode key_code = ui::NonPrintableDomKeyToKeyboardCode(key); |
| 477 ui::DomCode code = ui::UsLayoutKeyboardCodeToDomCode(key_code); | 495 ui::DomCode code = ui::UsLayoutKeyboardCodeToDomCode(key_code); |
| 478 SendKeyToDataListPopup(key, code, key_code); | 496 SendKeyToDataListPopup(key, code, key_code); |
| 479 } | 497 } |
| 480 | 498 |
| 481 // Datalist does not support autofill preview. There is no need to start | 499 // Datalist does not support autofill preview. There is no need to start |
| 482 // message loop for Datalist. | 500 // message loop for Datalist. |
| (...skipping 1245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1728 GURL url = https_server.GetURL("/autofill/autofill_password_form.html"); | 1746 GURL url = https_server.GetURL("/autofill/autofill_password_form.html"); |
| 1729 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(), url)); | 1747 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(), url)); |
| 1730 | 1748 |
| 1731 ASSERT_TRUE(content::ExecuteScript( | 1749 ASSERT_TRUE(content::ExecuteScript( |
| 1732 GetRenderViewHost(), | 1750 GetRenderViewHost(), |
| 1733 "document.getElementById('user').value = 'user';")); | 1751 "document.getElementById('user').value = 'user';")); |
| 1734 FocusFieldByName("password"); | 1752 FocusFieldByName("password"); |
| 1735 PasteStringAndWait("foobar"); | 1753 PasteStringAndWait("foobar"); |
| 1736 } | 1754 } |
| 1737 | 1755 |
| 1756 // An extension of the test fixture for tests with site isolation. | |
| 1757 class AutofillInteractiveIsolationTest : public AutofillInteractiveTest { | |
| 1758 protected: | |
| 1759 void SendKeyToPopupAndWait(ui::DomKey key, | |
| 1760 content::RenderWidgetHost* widget) { | |
| 1761 ui::KeyboardCode key_code = ui::NonPrintableDomKeyToKeyboardCode(key); | |
| 1762 ui::DomCode code = ui::UsLayoutKeyboardCodeToDomCode(key_code); | |
| 1763 AutofillInteractiveTest::SendKeyToPopupAndWait(key, code, key_code, widget); | |
| 1764 } | |
| 1765 | |
| 1766 private: | |
| 1767 void SetUpCommandLine(base::CommandLine* command_line) override { | |
| 1768 AutofillInteractiveTest::SetUpCommandLine(command_line); | |
| 1769 // Append --site-per-process flag. | |
| 1770 content::IsolateAllSitesForTesting(command_line); | |
| 1771 } | |
| 1772 }; | |
| 1773 | |
| 1774 IN_PROC_BROWSER_TEST_F(AutofillInteractiveIsolationTest, SimpleCrossSiteFill) { | |
| 1775 // Ensure that |embedded_test_server()| serves both domains used below. | |
| 1776 host_resolver()->AddRule("*", "127.0.0.1"); | |
| 1777 | |
| 1778 CreateTestProfile(); | |
| 1779 | |
| 1780 // Main frame is on a.com, iframe is on b.com. | |
| 1781 GURL url = embedded_test_server()->GetURL( | |
| 1782 "a.com", "/autofill/cross_origin_iframe.html"); | |
| 1783 ui_test_utils::NavigateToURL(browser(), url); | |
| 1784 GURL iframe_url = embedded_test_server()->GetURL( | |
| 1785 "b.com", "/autofill/autofill_test_form.html"); | |
| 1786 EXPECT_TRUE( | |
| 1787 content::NavigateIframeToURL(GetWebContents(), "crossFrame", iframe_url)); | |
| 1788 | |
| 1789 // Let |test_delegate()| also observe autofill events in the iframe. | |
| 1790 content::RenderFrameHost* cross_frame = | |
| 1791 RenderFrameHostForName(GetWebContents(), "crossFrame"); | |
| 1792 ASSERT_TRUE(cross_frame); | |
| 1793 ContentAutofillDriver* cross_driver = | |
| 1794 ContentAutofillDriverFactory::FromWebContents(GetWebContents()) | |
| 1795 ->DriverForFrame(cross_frame); | |
| 1796 ASSERT_TRUE(cross_driver); | |
| 1797 cross_driver->autofill_manager()->SetTestDelegate(test_delegate()); | |
| 1798 | |
| 1799 // Focuss the form in the iframe and simulate choosing a suggestion via | |
|
Mathieu
2017/03/26 02:03:50
nit: Focus
vabr (Chromium)
2017/03/26 03:25:40
Done.
| |
| 1800 // keyboard. | |
| 1801 std::string script_focus("document.getElementById('NAME_FIRST').focus();"); | |
| 1802 ASSERT_TRUE(content::ExecuteScript(cross_frame, script_focus)); | |
| 1803 SendKeyToPageAndWait(ui::DomKey::ARROW_DOWN); | |
| 1804 content::RenderWidgetHost* widget = | |
| 1805 cross_frame->GetView()->GetRenderWidgetHost(); | |
| 1806 SendKeyToPopupAndWait(ui::DomKey::ARROW_DOWN, widget); | |
| 1807 SendKeyToPopupAndWait(ui::DomKey::ENTER, widget); | |
| 1808 | |
| 1809 // Check that the suggestion fas filled. | |
|
Mathieu
2017/03/26 02:03:51
*was
vabr (Chromium)
2017/03/26 03:25:39
Done.
| |
| 1810 std::string value; | |
| 1811 ASSERT_TRUE(content::ExecuteScriptAndExtractString( | |
| 1812 cross_frame, | |
| 1813 "window.domAutomationController.send(" | |
| 1814 " document.getElementById('NAME_FIRST').value);", | |
| 1815 &value)); | |
| 1816 EXPECT_EQ("Milton", value); | |
| 1817 } | |
| 1818 | |
| 1738 } // namespace autofill | 1819 } // namespace autofill |
| OLD | NEW |