Chromium Code Reviews| Index: chrome/browser/autofill/autofill_interactive_uitest.cc |
| diff --git a/chrome/browser/autofill/autofill_interactive_uitest.cc b/chrome/browser/autofill/autofill_interactive_uitest.cc |
| index cbefb075964daf1412fec4d8918a2754eb435181..657da329800d9c015cf5efbf85145bc6e6e62483 100644 |
| --- a/chrome/browser/autofill/autofill_interactive_uitest.cc |
| +++ b/chrome/browser/autofill/autofill_interactive_uitest.cc |
| @@ -42,11 +42,13 @@ |
| #include "content/public/browser/notification_service.h" |
| #include "content/public/browser/render_view_host.h" |
| #include "content/public/browser/render_widget_host.h" |
| +#include "content/public/browser/render_widget_host_view.h" |
| #include "content/public/browser/web_contents.h" |
| #include "content/public/test/browser_test_utils.h" |
| #include "content/public/test/test_renderer_host.h" |
| #include "content/public/test/test_utils.h" |
| #include "net/base/net_errors.h" |
| +#include "net/dns/mock_host_resolver.h" |
| #include "net/test/embedded_test_server/embedded_test_server.h" |
| #include "net/url_request/test_url_fetcher_factory.h" |
| #include "net/url_request/url_request_status.h" |
| @@ -61,6 +63,8 @@ using base::ASCIIToUTF16; |
| namespace autofill { |
| +namespace { |
| + |
| static const char kDataURIPrefix[] = "data:text/html;charset=utf-8,"; |
| static const char kTestFormString[] = |
| "<form action=\"http://www.example.com/\" method=\"POST\">" |
| @@ -206,6 +210,20 @@ class AutofillManagerTestDelegateImpl |
| DISALLOW_COPY_AND_ASSIGN(AutofillManagerTestDelegateImpl); |
| }; |
| +// Searches all frames of |web_contents| and returns one called |name|. If |
| +// there are none, returns null, if there are more, returns an arbitrary one. |
| +content::RenderFrameHost* RenderFrameHostForName( |
| + content::WebContents* web_contents, |
| + const std::string& name) { |
| + for (content::RenderFrameHost* frame : web_contents->GetAllFrames()) { |
| + if (frame->GetFrameName() == name) |
| + return frame; |
| + } |
| + return nullptr; |
| +} |
| + |
| +} // namespace |
| + |
| // AutofillInteractiveTest ---------------------------------------------------- |
| class AutofillInteractiveTest : public InProcessBrowserTest { |
| @@ -448,12 +466,14 @@ class AutofillInteractiveTest : public InProcessBrowserTest { |
| void SendKeyToPopupAndWait(ui::DomKey key) { |
| ui::KeyboardCode key_code = ui::NonPrintableDomKeyToKeyboardCode(key); |
| ui::DomCode code = ui::UsLayoutKeyboardCodeToDomCode(key_code); |
| - SendKeyToPopupAndWait(key, code, key_code); |
| + SendKeyToPopupAndWait(key, code, key_code, |
| + GetRenderViewHost()->GetWidget()); |
| } |
| void SendKeyToPopupAndWait(ui::DomKey key, |
| ui::DomCode code, |
| - ui::KeyboardCode key_code) { |
| + ui::KeyboardCode key_code, |
| + content::RenderWidgetHost* widget) { |
| // Route popup-targeted key presses via the render view host. |
| content::NativeWebKeyboardEvent event(blink::WebKeyboardEvent::RawKeyDown, |
| blink::WebInputEvent::NoModifiers, |
| @@ -464,12 +484,10 @@ class AutofillInteractiveTest : public InProcessBrowserTest { |
| test_delegate_.Reset(); |
| // Install the key press event sink to ensure that any events that are not |
| // handled by the installed callbacks do not end up crashing the test. |
| - GetRenderViewHost()->GetWidget()->AddKeyPressEventCallback( |
| - key_press_event_sink_); |
| - GetRenderViewHost()->GetWidget()->ForwardKeyboardEvent(event); |
| + widget->AddKeyPressEventCallback(key_press_event_sink_); |
| + widget->ForwardKeyboardEvent(event); |
| test_delegate_.Wait(); |
| - GetRenderViewHost()->GetWidget()->RemoveKeyPressEventCallback( |
| - key_press_event_sink_); |
| + widget->RemoveKeyPressEventCallback(key_press_event_sink_); |
| } |
| void SendKeyToDataListPopup(ui::DomKey key) { |
| @@ -1735,4 +1753,67 @@ IN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, |
| PasteStringAndWait("foobar"); |
| } |
| +// An extension of the test fixture for tests with site isolation. |
| +class AutofillInteractiveIsolationTest : public AutofillInteractiveTest { |
| + protected: |
| + void SendKeyToPopupAndWait(ui::DomKey key, |
| + content::RenderWidgetHost* widget) { |
| + ui::KeyboardCode key_code = ui::NonPrintableDomKeyToKeyboardCode(key); |
| + ui::DomCode code = ui::UsLayoutKeyboardCodeToDomCode(key_code); |
| + AutofillInteractiveTest::SendKeyToPopupAndWait(key, code, key_code, widget); |
| + } |
| + |
| + private: |
| + void SetUpCommandLine(base::CommandLine* command_line) override { |
| + AutofillInteractiveTest::SetUpCommandLine(command_line); |
| + // Append --site-per-process flag. |
| + content::IsolateAllSitesForTesting(command_line); |
| + } |
| +}; |
| + |
| +IN_PROC_BROWSER_TEST_F(AutofillInteractiveIsolationTest, SimpleCrossSiteFill) { |
| + // Ensure that |embedded_test_server()| serves both domains used below. |
| + host_resolver()->AddRule("*", "127.0.0.1"); |
| + |
| + CreateTestProfile(); |
| + |
| + // Main frame is on a.com, iframe is on b.com. |
| + GURL url = embedded_test_server()->GetURL( |
| + "a.com", "/autofill/cross_origin_iframe.html"); |
| + ui_test_utils::NavigateToURL(browser(), url); |
| + GURL iframe_url = embedded_test_server()->GetURL( |
| + "b.com", "/autofill/autofill_test_form.html"); |
| + EXPECT_TRUE( |
| + content::NavigateIframeToURL(GetWebContents(), "crossFrame", iframe_url)); |
| + |
| + // Let |test_delegate()| also observe autofill events in the iframe. |
| + content::RenderFrameHost* cross_frame = |
| + RenderFrameHostForName(GetWebContents(), "crossFrame"); |
| + ASSERT_TRUE(cross_frame); |
| + ContentAutofillDriver* cross_driver = |
| + ContentAutofillDriverFactory::FromWebContents(GetWebContents()) |
| + ->DriverForFrame(cross_frame); |
| + ASSERT_TRUE(cross_driver); |
| + cross_driver->autofill_manager()->SetTestDelegate(test_delegate()); |
| + |
| + // 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.
|
| + // keyboard. |
| + std::string script_focus("document.getElementById('NAME_FIRST').focus();"); |
| + ASSERT_TRUE(content::ExecuteScript(cross_frame, script_focus)); |
| + SendKeyToPageAndWait(ui::DomKey::ARROW_DOWN); |
| + content::RenderWidgetHost* widget = |
| + cross_frame->GetView()->GetRenderWidgetHost(); |
| + SendKeyToPopupAndWait(ui::DomKey::ARROW_DOWN, widget); |
| + SendKeyToPopupAndWait(ui::DomKey::ENTER, widget); |
| + |
| + // Check that the suggestion fas filled. |
|
Mathieu
2017/03/26 02:03:51
*was
vabr (Chromium)
2017/03/26 03:25:39
Done.
|
| + std::string value; |
| + ASSERT_TRUE(content::ExecuteScriptAndExtractString( |
| + cross_frame, |
| + "window.domAutomationController.send(" |
| + " document.getElementById('NAME_FIRST').value);", |
| + &value)); |
| + EXPECT_EQ("Milton", value); |
| +} |
| + |
| } // namespace autofill |