Chromium Code Reviews| Index: chrome/renderer/autofill/autofill_renderer_browsertest.cc |
| diff --git a/chrome/renderer/autofill/autofill_renderer_browsertest.cc b/chrome/renderer/autofill/autofill_renderer_browsertest.cc |
| index 5e54b6b0b979a58373cdafd67f9d876f3fa59467..255233eed1f4022f37086774a3f4b5cdde5fbba4 100644 |
| --- a/chrome/renderer/autofill/autofill_renderer_browsertest.cc |
| +++ b/chrome/renderer/autofill/autofill_renderer_browsertest.cc |
| @@ -12,12 +12,15 @@ |
| #include "base/strings/utf_string_conversions.h" |
| #include "chrome/test/base/chrome_render_view_test.h" |
| #include "chrome/test/base/ui_test_utils.h" |
| -#include "components/autofill/content/common/autofill_messages.h" |
| +#include "components/autofill/content/public/interfaces/autofill_driver.mojom.h" |
| #include "components/autofill/content/renderer/autofill_agent.h" |
| #include "components/autofill/core/common/form_data.h" |
| #include "components/autofill/core/common/form_field_data.h" |
| #include "content/public/common/content_switches.h" |
| #include "content/public/renderer/render_frame.h" |
| +#include "content/public/renderer/render_view.h" |
| +#include "mojo/public/cpp/bindings/binding_set.h" |
| +#include "services/shell/public/cpp/interface_provider.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "third_party/WebKit/public/platform/WebString.h" |
| #include "third_party/WebKit/public/platform/WebURLRequest.h" |
| @@ -41,6 +44,60 @@ using blink::WebVector; |
| namespace autofill { |
| +namespace { |
| + |
| +class FakeContentAutofillDriver : public mojom::AutofillDriver { |
| + public: |
| + FakeContentAutofillDriver() : called_fieldchange_(false) {} |
| + ~FakeContentAutofillDriver() override {} |
| + |
| + void BindRequest(mojom::AutofillDriverRequest request) { |
| + bindings_.AddBinding(this, std::move(request)); |
| + } |
| + |
| + // Records whether TextFieldDidChange() get called. |
| + bool called_fieldchange_; |
| + // Records data received via FormSeen() call. |
| + std::unique_ptr<std::vector<FormData>> forms_; |
| + |
| + private: |
| + // mojom::AutofillDriver: |
| + void FirstUserGestureObserved() override {} |
|
vabr (Chromium)
2016/06/23 14:21:21
nit: Please separate methods with a blank line.
leonhsl(Using Gerrit)
2016/06/24 15:44:31
Done.
|
| + void FormsSeen(mojo::Array<FormData> forms, |
| + const base::TimeTicks& timestamp) override { |
| + // FormsSeen() could be called multiple times and sometimes even with empty |
| + // forms array for main frame, but we're interested in only the first time |
| + // call. |
| + if (!forms_) |
| + forms_.reset(new std::vector<FormData>(forms.PassStorage())); |
| + } |
| + void WillSubmitForm(const FormData& form, |
| + const base::TimeTicks& timestamp) override {} |
| + void FormSubmitted(const FormData& form) override {} |
| + void TextFieldDidChange(const FormData& form, |
| + const FormFieldData& field, |
| + const base::TimeTicks& timestamp) override { |
| + called_fieldchange_ = true; |
| + } |
| + void QueryFormFieldAutofill(int32_t id, |
| + const FormData& form, |
| + const FormFieldData& field, |
| + const gfx::RectF& bounding_box) override {} |
| + void HidePopup() override {} |
| + void PingAck() override {} |
| + void FocusNoLongerOnForm() override {} |
| + void DidFillAutofillFormData(const FormData& form, |
| + const base::TimeTicks& timestamp) override {} |
| + void DidPreviewAutofillFormData() override {} |
| + void DidEndTextFieldEditing() override {} |
| + void SetDataList(mojo::Array<mojo::String> values, |
| + mojo::Array<mojo::String> labels) override {} |
| + |
| + mojo::BindingSet<mojom::AutofillDriver> bindings_; |
| +}; |
| + |
| +} // namespace |
| + |
| using AutofillQueryParam = |
| std::tuple<int, autofill::FormData, autofill::FormFieldData, gfx::RectF>; |
| @@ -52,8 +109,25 @@ class AutofillRendererTest : public ChromeRenderViewTest { |
| protected: |
| void SetUp() override { |
| ChromeRenderViewTest::SetUp(); |
| + |
| + // We only use the fake driver for main frame |
|
vabr (Chromium)
2016/06/23 14:21:21
Just out of curiosity, could the added code go to
leonhsl(Using Gerrit)
2016/06/24 15:44:31
OK now I understand the rule, thanks for the shari
|
| + // because our test cases only involve the main frame. |
| + shell::InterfaceProvider* remote_interfaces = |
| + view_->GetMainRenderFrame()->GetRemoteInterfaces(); |
| + shell::InterfaceProvider::TestApi test_api(remote_interfaces); |
| + test_api.SetBinderForName( |
| + mojom::AutofillDriver::Name_, |
| + base::Bind(&AutofillRendererTest::BindAutofillDriver, |
| + base::Unretained(this))); |
| + } |
| + |
| + void BindAutofillDriver(mojo::ScopedMessagePipeHandle handle) { |
| + fake_driver_.BindRequest( |
| + mojo::MakeRequest<mojom::AutofillDriver>(std::move(handle))); |
| } |
| + FakeContentAutofillDriver fake_driver_; |
| + |
| private: |
| DISALLOW_COPY_AND_ASSIGN(AutofillRendererTest); |
| }; |
| @@ -71,13 +145,11 @@ TEST_F(AutofillRendererTest, SendForms) { |
| " </select>" |
| "</form>"); |
| + base::RunLoop run_loop; |
| + run_loop.RunUntilIdle(); |
| // Verify that "FormsSeen" sends the expected number of fields. |
| - const IPC::Message* message = render_thread_->sink().GetFirstMessageMatching( |
| - AutofillHostMsg_FormsSeen::ID); |
| - ASSERT_NE(nullptr, message); |
| - AutofillHostMsg_FormsSeen::Param params; |
| - AutofillHostMsg_FormsSeen::Read(message, ¶ms); |
| - std::vector<FormData> forms = std::get<0>(params); |
| + ASSERT_NE(nullptr, fake_driver_.forms_); |
|
vabr (Chromium)
2016/06/23 14:21:21
nit: This is the usual way to write the pointer te
leonhsl(Using Gerrit)
2016/06/24 15:44:31
Done and Thanks!
|
| + std::vector<FormData> forms = *(fake_driver_.forms_.get()); |
| ASSERT_EQ(1UL, forms.size()); |
| ASSERT_EQ(4UL, forms[0].fields.size()); |
| @@ -109,7 +181,7 @@ TEST_F(AutofillRendererTest, SendForms) { |
| expected.max_length = 0; |
| EXPECT_FORM_FIELD_DATA_EQUALS(expected, forms[0].fields[3]); |
| - render_thread_->sink().ClearMessages(); |
| + fake_driver_.forms_.reset(); |
| // Dynamically create a new form. A new message should be sent for it, but |
| // not for the previous form. |
| @@ -136,11 +208,8 @@ TEST_F(AutofillRendererTest, SendForms) { |
| "document.body.appendChild(newForm);"); |
| msg_loop_.RunUntilIdle(); |
| - message = render_thread_->sink().GetFirstMessageMatching( |
| - AutofillHostMsg_FormsSeen::ID); |
| - ASSERT_NE(nullptr, message); |
| - AutofillHostMsg_FormsSeen::Read(message, ¶ms); |
| - forms = std::get<0>(params); |
| + ASSERT_NE(nullptr, fake_driver_.forms_); |
| + forms = *(fake_driver_.forms_.get()); |
| ASSERT_EQ(1UL, forms.size()); |
| ASSERT_EQ(3UL, forms[0].fields.size()); |
| @@ -166,13 +235,11 @@ TEST_F(AutofillRendererTest, EnsureNoFormSeenIfTooFewFields) { |
| " <input type='text' id='middlename'/>" |
| "</form>"); |
| + base::RunLoop run_loop; |
| + run_loop.RunUntilIdle(); |
| // Verify that "FormsSeen" isn't sent, as there are too few fields. |
| - const IPC::Message* message = render_thread_->sink().GetFirstMessageMatching( |
| - AutofillHostMsg_FormsSeen::ID); |
| - ASSERT_NE(nullptr, message); |
| - AutofillHostMsg_FormsSeen::Param params; |
| - AutofillHostMsg_FormsSeen::Read(message, ¶ms); |
| - const std::vector<FormData>& forms = std::get<0>(params); |
| + ASSERT_NE(nullptr, fake_driver_.forms_); |
| + const std::vector<FormData>& forms = *(fake_driver_.forms_.get()); |
| ASSERT_EQ(0UL, forms.size()); |
| } |
| @@ -199,26 +266,21 @@ TEST_F(AutofillRendererTest, DynamicallyAddedUnownedFormElements) { |
| ASSERT_TRUE(base::ReadFileToString(test_path, &html_data)); |
| LoadHTML(html_data.c_str()); |
| + base::RunLoop run_loop; |
| + run_loop.RunUntilIdle(); |
| // Verify that "FormsSeen" sends the expected number of fields. |
| - const IPC::Message* message = render_thread_->sink().GetFirstMessageMatching( |
| - AutofillHostMsg_FormsSeen::ID); |
| - ASSERT_NE(nullptr, message); |
| - AutofillHostMsg_FormsSeen::Param params; |
| - AutofillHostMsg_FormsSeen::Read(message, ¶ms); |
| - std::vector<FormData> forms = std::get<0>(params); |
| + ASSERT_NE(nullptr, fake_driver_.forms_); |
| + std::vector<FormData> forms = *(fake_driver_.forms_.get()); |
| ASSERT_EQ(1UL, forms.size()); |
| ASSERT_EQ(7UL, forms[0].fields.size()); |
| - render_thread_->sink().ClearMessages(); |
| + fake_driver_.forms_.reset(); |
| ExecuteJavaScriptForTests("AddFields()"); |
| msg_loop_.RunUntilIdle(); |
| - message = render_thread_->sink().GetFirstMessageMatching( |
| - AutofillHostMsg_FormsSeen::ID); |
| - ASSERT_NE(nullptr, message); |
| - AutofillHostMsg_FormsSeen::Read(message, ¶ms); |
| - forms = std::get<0>(params); |
| + ASSERT_NE(nullptr, fake_driver_.forms_); |
| + forms = *(fake_driver_.forms_.get()); |
| ASSERT_EQ(1UL, forms.size()); |
| ASSERT_EQ(9UL, forms[0].fields.size()); |
| @@ -250,17 +312,16 @@ TEST_F(AutofillRendererTest, IgnoreNonUserGestureTextFieldChanges) { |
| // Not a user gesture, so no IPC message to browser. |
| DisableUserGestureSimulationForAutofill(); |
| + ASSERT_FALSE(fake_driver_.called_fieldchange_); |
| full_name.setValue("Alice", true); |
| GetMainFrame()->autofillClient()->textFieldDidChange(full_name); |
| base::RunLoop().RunUntilIdle(); |
| - ASSERT_EQ(nullptr, render_thread_->sink().GetFirstMessageMatching( |
| - AutofillHostMsg_TextFieldDidChange::ID)); |
| + ASSERT_FALSE(fake_driver_.called_fieldchange_); |
| // A user gesture will send a message to the browser. |
| EnableUserGestureSimulationForAutofill(); |
| SimulateUserInputChangeForElement(&full_name, "Alice"); |
| - ASSERT_NE(nullptr, render_thread_->sink().GetFirstMessageMatching( |
| - AutofillHostMsg_TextFieldDidChange::ID)); |
| + ASSERT_TRUE(fake_driver_.called_fieldchange_); |
| } |
| } // namespace autofill |