blob: c86b1306cdc0b8a39be370beeb1b1f101593f416 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/macros.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/common/url_constants.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/autofill/content/browser/content_autofill_driver_factory.h"
#include "components/autofill/core/browser/test_autofill_client.h"
#include "components/autofill/core/browser/test_autofill_provider.h"
#include "components/autofill/core/common/submission_source.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/url_constants.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_utils.h"
#include "net/dns/mock_host_resolver.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
using ::testing::_;
namespace autofill {
namespace {
const base::FilePath::CharType kDocRoot[] =
FILE_PATH_LITERAL("chrome/test/data");
class MockAutofillProvider : public TestAutofillProvider {
public:
MockAutofillProvider() {}
~MockAutofillProvider() override {}
MOCK_METHOD5(OnFormSubmitted,
bool(AutofillHandlerProxy* handler,
const FormData& form,
bool,
SubmissionSource,
base::TimeTicks));
};
} // namespace
class AutofillProviderBrowserTest : public InProcessBrowserTest {
public:
AutofillProviderBrowserTest() {}
~AutofillProviderBrowserTest() override {}
void SetUpOnMainThread() override {
content::WebContents* web_contents = WebContents();
ASSERT_TRUE(web_contents != NULL);
web_contents->RemoveUserData(
ContentAutofillDriverFactory::
kContentAutofillDriverFactoryWebContentsUserDataKey);
ContentAutofillDriverFactory::CreateForWebContentsAndDelegate(
web_contents, &autofill_client_, "en-US",
AutofillManager::DISABLE_AUTOFILL_DOWNLOAD_MANAGER,
&autofill_provider_);
embedded_test_server()->AddDefaultHandlers(base::FilePath(kDocRoot));
// Serve both a.com and b.com (and any other domain).
host_resolver()->AddRule("*", "127.0.0.1");
ASSERT_TRUE(embedded_test_server()->Start());
}
void TearDownOnMainThread() override {
testing::Mock::VerifyAndClearExpectations(&autofill_provider_);
}
content::RenderViewHost* RenderViewHost() {
return WebContents()->GetRenderViewHost();
}
content::WebContents* WebContents() {
return browser()->tab_strip_model()->GetActiveWebContents();
}
void SimulateUserTypingInFocuedField() {
content::WebContents* web_contents = WebContents();
content::SimulateKeyPress(web_contents, ui::DomKey::FromCharacter('O'),
ui::DomCode::US_O, ui::VKEY_O, false, false,
false, false);
content::SimulateKeyPress(web_contents, ui::DomKey::FromCharacter('R'),
ui::DomCode::US_R, ui::VKEY_R, false, false,
false, false);
content::SimulateKeyPress(web_contents, ui::DomKey::FromCharacter('A'),
ui::DomCode::US_A, ui::VKEY_A, false, false,
false, false);
content::SimulateKeyPress(web_contents, ui::DomKey::FromCharacter('R'),
ui::DomCode::US_R, ui::VKEY_R, false, false,
false, false);
content::SimulateKeyPress(web_contents, ui::DomKey::FromCharacter('Y'),
ui::DomCode::US_Y, ui::VKEY_Y, false, false,
false, false);
}
protected:
MockAutofillProvider autofill_provider_;
private:
TestAutofillClient autofill_client_;
};
IN_PROC_BROWSER_TEST_F(AutofillProviderBrowserTest,
FrameDetachedOnFormlessSubmission) {
EXPECT_CALL(autofill_provider_,
OnFormSubmitted(_, _, _, SubmissionSource::FRAME_DETACHED, _))
.Times(1);
ui_test_utils::NavigateToURL(
browser(), embedded_test_server()->GetURL(
"/autofill/frame_detached_on_formless_submit.html"));
// Need to pay attention for a message that XHR has finished since there
// is no navigation to wait for.
content::DOMMessageQueue message_queue;
std::string focus(
"var iframe = document.getElementById('address_iframe');"
"var frame_doc = iframe.contentDocument;"
"frame_doc.getElementById('address_field').focus();");
ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), focus));
SimulateUserTypingInFocuedField();
std::string fill_and_submit =
"var iframe = document.getElementById('address_iframe');"
"var frame_doc = iframe.contentDocument;"
"frame_doc.getElementById('submit_button').click();";
ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit));
std::string message;
while (message_queue.WaitForMessage(&message)) {
if (message == "\"SUBMISSION_FINISHED\"")
break;
}
EXPECT_EQ("\"SUBMISSION_FINISHED\"", message);
}
IN_PROC_BROWSER_TEST_F(AutofillProviderBrowserTest,
FrameDetachedOnFormSubmission) {
EXPECT_CALL(autofill_provider_,
OnFormSubmitted(_, _, _, SubmissionSource::FORM_SUBMISSION, _))
.Times(1);
ui_test_utils::NavigateToURL(
browser(), embedded_test_server()->GetURL(
"/autofill/frame_detached_on_form_submit.html"));
// Need to pay attention for a message that XHR has finished since there
// is no navigation to wait for.
content::DOMMessageQueue message_queue;
std::string focus(
"var iframe = document.getElementById('address_iframe');"
"var frame_doc = iframe.contentDocument;"
"frame_doc.getElementById('address_field').focus();");
ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), focus));
SimulateUserTypingInFocuedField();
std::string fill_and_submit =
"var iframe = document.getElementById('address_iframe');"
"var frame_doc = iframe.contentDocument;"
"frame_doc.getElementById('submit_button').click();";
ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit));
std::string message;
while (message_queue.WaitForMessage(&message)) {
if (message == "\"SUBMISSION_FINISHED\"")
break;
}
EXPECT_EQ("\"SUBMISSION_FINISHED\"", message);
}
} // namespace autofill