Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3717)

Unified Diff: chrome/renderer/autofill/autofill_renderer_browsertest.cc

Issue 2007473004: [Autofill] Migrate ContentAutofillDriver<-->AutofillAgent IPCs to mojo. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: gn, gyp, test codes all done Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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, &params);
- 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, &params);
- 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, &params);
- 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, &params);
- 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, &params);
- 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

Powered by Google App Engine
This is Rietveld 408576698