OLD | NEW |
| (Empty) |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include <map> | |
6 | |
7 #include "base/strings/utf_string_conversions.h" | |
8 #include "base/tuple.h" | |
9 #include "chrome/test/base/chrome_render_view_host_test_harness.h" | |
10 #include "components/autofill/content/browser/autocheckout_manager.h" | |
11 #include "components/autofill/core/browser/autofill_common_test.h" | |
12 #include "components/autofill/core/browser/autofill_manager.h" | |
13 #include "components/autofill/core/browser/autofill_metrics.h" | |
14 #include "components/autofill/core/browser/form_structure.h" | |
15 #include "components/autofill/core/browser/test_autofill_driver.h" | |
16 #include "components/autofill/core/browser/test_autofill_manager_delegate.h" | |
17 #include "components/autofill/core/common/autofill_messages.h" | |
18 #include "components/autofill/core/common/form_data.h" | |
19 #include "content/public/browser/browser_thread.h" | |
20 #include "content/public/test/mock_render_process_host.h" | |
21 #include "content/public/test/test_browser_thread.h" | |
22 #include "content/public/test/test_utils.h" | |
23 #include "ipc/ipc_test_sink.h" | |
24 #include "testing/gmock/include/gmock/gmock.h" | |
25 #include "testing/gtest/include/gtest/gtest.h" | |
26 | |
27 using content::BrowserThread; | |
28 | |
29 namespace autofill { | |
30 | |
31 namespace { | |
32 | |
33 typedef Tuple4<std::vector<FormData>, | |
34 std::vector<WebElementDescriptor>, | |
35 std::vector<WebElementDescriptor>, | |
36 WebElementDescriptor> AutofillParam; | |
37 | |
38 enum ProceedElementPresence { | |
39 NO_PROCEED_ELEMENT, | |
40 HAS_PROCEED_ELEMENT, | |
41 }; | |
42 | |
43 FormFieldData BuildFieldWithValue( | |
44 const std::string& autocomplete_attribute, | |
45 const std::string& value) { | |
46 FormFieldData field; | |
47 field.name = ASCIIToUTF16(autocomplete_attribute); | |
48 field.value = ASCIIToUTF16(value); | |
49 field.autocomplete_attribute = autocomplete_attribute; | |
50 field.form_control_type = "text"; | |
51 return field; | |
52 } | |
53 | |
54 FormFieldData BuildField(const std::string& autocomplete_attribute) { | |
55 return BuildFieldWithValue(autocomplete_attribute, autocomplete_attribute); | |
56 } | |
57 | |
58 scoped_ptr<FormStructure> CreateTestFormStructure( | |
59 const std::vector<ServerFieldType>& autofill_types) { | |
60 FormData form; | |
61 form.name = ASCIIToUTF16("MyForm"); | |
62 form.method = ASCIIToUTF16("POST"); | |
63 form.origin = GURL("https://myform.com/form.html"); | |
64 form.action = GURL("https://myform.com/submit.html"); | |
65 form.user_submitted = true; | |
66 | |
67 // Add some fields, autocomplete_attribute is not important and we | |
68 // fake that server sends authoritative field mappings. | |
69 for (size_t i = 0; i < autofill_types.size(); ++i) | |
70 form.fields.push_back(BuildField("SomeField")); | |
71 | |
72 scoped_ptr<FormStructure> form_structure( | |
73 new FormStructure(form, std::string())); | |
74 | |
75 // Set mocked Autofill server field types. | |
76 for (size_t i = 0; i < autofill_types.size(); ++i) { | |
77 form_structure->field(i)->set_server_type(autofill_types[i]); | |
78 // Set heuristic type to make sure that server_types are used and not | |
79 // heuritic type. | |
80 form_structure->field(i)->set_heuristic_type(CREDIT_CARD_NUMBER); | |
81 } | |
82 | |
83 return form_structure.Pass(); | |
84 } | |
85 | |
86 scoped_ptr<FormStructure> CreateTestAddressFormStructure() { | |
87 std::vector<ServerFieldType> autofill_types; | |
88 autofill_types.push_back(NAME_FULL); | |
89 autofill_types.push_back(PHONE_HOME_WHOLE_NUMBER); | |
90 autofill_types.push_back(EMAIL_ADDRESS); | |
91 autofill_types.push_back(ADDRESS_HOME_LINE1); | |
92 autofill_types.push_back(ADDRESS_HOME_CITY); | |
93 autofill_types.push_back(ADDRESS_HOME_STATE); | |
94 autofill_types.push_back(ADDRESS_HOME_COUNTRY); | |
95 autofill_types.push_back(ADDRESS_HOME_ZIP); | |
96 autofill_types.push_back(NO_SERVER_DATA); | |
97 return CreateTestFormStructure(autofill_types); | |
98 } | |
99 | |
100 scoped_ptr<FormStructure> CreateTestCreditCardFormStructure() { | |
101 std::vector<ServerFieldType> autofill_types; | |
102 autofill_types.push_back(CREDIT_CARD_NAME); | |
103 autofill_types.push_back(CREDIT_CARD_NUMBER); | |
104 autofill_types.push_back(CREDIT_CARD_EXP_MONTH); | |
105 autofill_types.push_back(CREDIT_CARD_EXP_4_DIGIT_YEAR); | |
106 autofill_types.push_back(CREDIT_CARD_VERIFICATION_CODE); | |
107 autofill_types.push_back(ADDRESS_BILLING_LINE1); | |
108 autofill_types.push_back(ADDRESS_BILLING_CITY); | |
109 autofill_types.push_back(ADDRESS_BILLING_STATE); | |
110 autofill_types.push_back(ADDRESS_BILLING_COUNTRY); | |
111 autofill_types.push_back(ADDRESS_BILLING_ZIP); | |
112 return CreateTestFormStructure(autofill_types); | |
113 } | |
114 | |
115 scoped_ptr<FormStructure> CreateTestFormStructureWithDefaultValues() { | |
116 FormData form; | |
117 form.name = ASCIIToUTF16("MyForm"); | |
118 form.method = ASCIIToUTF16("POST"); | |
119 form.origin = GURL("https://myform.com/form.html"); | |
120 form.action = GURL("https://myform.com/submit.html"); | |
121 form.user_submitted = true; | |
122 | |
123 // Add two radio button fields. | |
124 FormFieldData male = BuildFieldWithValue("sex", "male"); | |
125 male.is_checkable = true; | |
126 form.fields.push_back(male); | |
127 FormFieldData female = BuildFieldWithValue("sex", "female"); | |
128 female.is_checkable = true; | |
129 form.fields.push_back(female); | |
130 FormFieldData select = BuildField("SelectField"); | |
131 select.form_control_type = "select-one"; | |
132 form.fields.push_back(select); | |
133 | |
134 scoped_ptr<FormStructure> form_structure( | |
135 new FormStructure(form, std::string())); | |
136 | |
137 // Fake server response. Set all fields as fields with default value. | |
138 form_structure->field(0)->set_server_type(FIELD_WITH_DEFAULT_VALUE); | |
139 form_structure->field(0)->set_default_value("female"); | |
140 form_structure->field(1)->set_server_type(FIELD_WITH_DEFAULT_VALUE); | |
141 form_structure->field(1)->set_default_value("female"); | |
142 form_structure->field(2)->set_server_type(FIELD_WITH_DEFAULT_VALUE); | |
143 form_structure->field(2)->set_default_value("Default Value"); | |
144 | |
145 return form_structure.Pass(); | |
146 } | |
147 | |
148 void PopulateClickElement(WebElementDescriptor* proceed_element, | |
149 const std::string& descriptor) { | |
150 proceed_element->descriptor = descriptor; | |
151 proceed_element->retrieval_method = WebElementDescriptor::ID; | |
152 } | |
153 | |
154 scoped_ptr<AutocheckoutPageMetaData> CreateStartOfFlowMetaData() { | |
155 scoped_ptr<AutocheckoutPageMetaData> start_of_flow( | |
156 new AutocheckoutPageMetaData()); | |
157 start_of_flow->current_page_number = 0; | |
158 start_of_flow->total_pages = 3; | |
159 start_of_flow->page_types[0].push_back(AUTOCHECKOUT_STEP_SHIPPING); | |
160 start_of_flow->page_types[1].push_back(AUTOCHECKOUT_STEP_DELIVERY); | |
161 start_of_flow->page_types[2].push_back(AUTOCHECKOUT_STEP_BILLING); | |
162 PopulateClickElement(&start_of_flow->proceed_element_descriptor, "#foo"); | |
163 return start_of_flow.Pass(); | |
164 } | |
165 | |
166 scoped_ptr<AutocheckoutPageMetaData> CreateInFlowMetaData() { | |
167 scoped_ptr<AutocheckoutPageMetaData> in_flow(new AutocheckoutPageMetaData()); | |
168 in_flow->current_page_number = 1; | |
169 in_flow->total_pages = 3; | |
170 PopulateClickElement(&in_flow->proceed_element_descriptor, "#foo"); | |
171 return in_flow.Pass(); | |
172 } | |
173 | |
174 scoped_ptr<AutocheckoutPageMetaData> CreateNotInFlowMetaData() { | |
175 scoped_ptr<AutocheckoutPageMetaData> not_in_flow( | |
176 new AutocheckoutPageMetaData()); | |
177 PopulateClickElement(¬_in_flow->proceed_element_descriptor, "#foo"); | |
178 return not_in_flow.Pass(); | |
179 } | |
180 | |
181 scoped_ptr<AutocheckoutPageMetaData> CreateEndOfFlowMetaData( | |
182 ProceedElementPresence proceed_element_presence) { | |
183 scoped_ptr<AutocheckoutPageMetaData> end_of_flow( | |
184 new AutocheckoutPageMetaData()); | |
185 end_of_flow->current_page_number = 2; | |
186 end_of_flow->total_pages = 3; | |
187 if (proceed_element_presence == HAS_PROCEED_ELEMENT) | |
188 PopulateClickElement(&end_of_flow->proceed_element_descriptor, "#foo"); | |
189 return end_of_flow.Pass(); | |
190 } | |
191 | |
192 scoped_ptr<AutocheckoutPageMetaData> CreateOnePageFlowMetaData( | |
193 ProceedElementPresence proceed_element_presence) { | |
194 scoped_ptr<AutocheckoutPageMetaData> one_page_flow( | |
195 new AutocheckoutPageMetaData()); | |
196 one_page_flow->current_page_number = 0; | |
197 one_page_flow->total_pages = 1; | |
198 one_page_flow->page_types[0].push_back(AUTOCHECKOUT_STEP_SHIPPING); | |
199 one_page_flow->page_types[0].push_back(AUTOCHECKOUT_STEP_DELIVERY); | |
200 one_page_flow->page_types[0].push_back(AUTOCHECKOUT_STEP_BILLING); | |
201 if (proceed_element_presence == HAS_PROCEED_ELEMENT) | |
202 PopulateClickElement(&one_page_flow->proceed_element_descriptor, "#foo"); | |
203 return one_page_flow.Pass(); | |
204 } | |
205 | |
206 scoped_ptr<AutocheckoutPageMetaData> CreateMissingProceedMetaData() { | |
207 scoped_ptr<AutocheckoutPageMetaData> missing_proceed( | |
208 new AutocheckoutPageMetaData()); | |
209 missing_proceed->current_page_number = 1; | |
210 missing_proceed->total_pages = 3; | |
211 return missing_proceed.Pass(); | |
212 } | |
213 | |
214 scoped_ptr<AutocheckoutPageMetaData> CreateMultiClickMetaData() { | |
215 scoped_ptr<AutocheckoutPageMetaData> metadata(new AutocheckoutPageMetaData()); | |
216 metadata->current_page_number = 1; | |
217 metadata->total_pages = 3; | |
218 PopulateClickElement(&metadata->proceed_element_descriptor, "#foo"); | |
219 WebElementDescriptor element; | |
220 PopulateClickElement(&element, "#before_form_fill_1"); | |
221 metadata->click_elements_before_form_fill.push_back(element); | |
222 PopulateClickElement(&element, "#before_form_fill_2"); | |
223 metadata->click_elements_before_form_fill.push_back(element); | |
224 PopulateClickElement(&element, "#after_form_fill"); | |
225 metadata->click_elements_after_form_fill.push_back(element); | |
226 return metadata.Pass(); | |
227 } | |
228 | |
229 struct TestField { | |
230 const char* const field_type; | |
231 const char* const field_value; | |
232 ServerFieldType autofill_type; | |
233 }; | |
234 | |
235 const TestField kTestFields[] = { | |
236 {"name", "Test User", NAME_FULL}, | |
237 {"tel", "650-123-9909", PHONE_HOME_WHOLE_NUMBER}, | |
238 {"email", "blah@blah.com", EMAIL_ADDRESS}, | |
239 {"cc-name", "Test User", CREDIT_CARD_NAME}, | |
240 {"cc-number", "4444444444444448", CREDIT_CARD_NUMBER}, | |
241 {"cc-exp-month", "10", CREDIT_CARD_EXP_MONTH}, | |
242 {"cc-exp-year", "2020", CREDIT_CARD_EXP_4_DIGIT_YEAR}, | |
243 {"cc-csc", "123", CREDIT_CARD_VERIFICATION_CODE}, | |
244 {"street-address", "Fake Street", ADDRESS_HOME_LINE1}, | |
245 {"locality", "Mocked City", ADDRESS_HOME_CITY}, | |
246 {"region", "California", ADDRESS_HOME_STATE}, | |
247 {"country", "USA", ADDRESS_HOME_COUNTRY}, | |
248 {"postal-code", "49012", ADDRESS_HOME_ZIP}, | |
249 {"billing-street-address", "Billing Street", ADDRESS_BILLING_LINE1}, | |
250 {"billing-locality", "Billing City", ADDRESS_BILLING_CITY}, | |
251 {"billing-region", "BillingState", ADDRESS_BILLING_STATE}, | |
252 {"billing-country", "Canada", ADDRESS_BILLING_COUNTRY}, | |
253 {"billing-postal-code", "11111", ADDRESS_BILLING_ZIP} | |
254 }; | |
255 | |
256 // Build Autocheckout specific form data to be consumed by | |
257 // AutofillDialogController to show the Autocheckout specific UI. | |
258 scoped_ptr<FormStructure> FakeUserSubmittedFormStructure() { | |
259 FormData formdata; | |
260 for (size_t i = 0; i < arraysize(kTestFields); i++) { | |
261 formdata.fields.push_back( | |
262 BuildFieldWithValue(kTestFields[i].field_type, | |
263 kTestFields[i].field_value)); | |
264 } | |
265 scoped_ptr<FormStructure> form_structure; | |
266 form_structure.reset(new FormStructure(formdata, std::string())); | |
267 for (size_t i = 0; i < arraysize(kTestFields); ++i) | |
268 form_structure->field(i)->set_server_type(kTestFields[i].autofill_type); | |
269 | |
270 return form_structure.Pass(); | |
271 } | |
272 | |
273 class MockAutofillManagerDelegate : public TestAutofillManagerDelegate { | |
274 public: | |
275 MockAutofillManagerDelegate() | |
276 : request_autocomplete_dialog_open_(false), | |
277 autocheckout_bubble_shown_(false), | |
278 should_autoclick_bubble_(true) {} | |
279 | |
280 virtual ~MockAutofillManagerDelegate() {} | |
281 | |
282 virtual void HideRequestAutocompleteDialog() OVERRIDE { | |
283 request_autocomplete_dialog_open_ = false; | |
284 } | |
285 | |
286 MOCK_METHOD0(OnAutocheckoutError, void()); | |
287 MOCK_METHOD0(OnAutocheckoutSuccess, void()); | |
288 | |
289 virtual bool ShowAutocheckoutBubble( | |
290 const gfx::RectF& bounds, | |
291 bool is_google_user, | |
292 const base::Callback<void(AutocheckoutBubbleState)>& callback) OVERRIDE { | |
293 autocheckout_bubble_shown_ = true; | |
294 if (should_autoclick_bubble_) | |
295 callback.Run(AUTOCHECKOUT_BUBBLE_ACCEPTED); | |
296 return true; | |
297 } | |
298 | |
299 virtual void ShowRequestAutocompleteDialog( | |
300 const FormData& form, | |
301 const GURL& source_url, | |
302 DialogType dialog_type, | |
303 const base::Callback<void(const FormStructure*, | |
304 const std::string&)>& callback) OVERRIDE { | |
305 request_autocomplete_dialog_open_ = true; | |
306 callback.Run(user_supplied_data_.get(), "google_transaction_id"); | |
307 } | |
308 | |
309 virtual void AddAutocheckoutStep(AutocheckoutStepType step_type) OVERRIDE { | |
310 if (autocheckout_steps_.count(step_type) == 0) | |
311 autocheckout_steps_[step_type] = AUTOCHECKOUT_STEP_UNSTARTED; | |
312 } | |
313 | |
314 virtual void UpdateAutocheckoutStep( | |
315 AutocheckoutStepType step_type, | |
316 AutocheckoutStepStatus step_status) OVERRIDE { | |
317 autocheckout_steps_[step_type] = step_status; | |
318 } | |
319 | |
320 void SetUserSuppliedData(scoped_ptr<FormStructure> user_supplied_data) { | |
321 user_supplied_data_.reset(user_supplied_data.release()); | |
322 } | |
323 | |
324 bool autocheckout_bubble_shown() const { | |
325 return autocheckout_bubble_shown_; | |
326 } | |
327 | |
328 void set_autocheckout_bubble_shown(bool autocheckout_bubble_shown) { | |
329 autocheckout_bubble_shown_ = autocheckout_bubble_shown; | |
330 } | |
331 | |
332 bool request_autocomplete_dialog_open() const { | |
333 return request_autocomplete_dialog_open_; | |
334 } | |
335 | |
336 void set_should_autoclick_bubble(bool should_autoclick_bubble) { | |
337 should_autoclick_bubble_ = should_autoclick_bubble; | |
338 } | |
339 | |
340 bool AutocheckoutStepExistsWithStatus( | |
341 AutocheckoutStepType step_type, | |
342 AutocheckoutStepStatus step_status) const { | |
343 std::map<AutocheckoutStepType, AutocheckoutStepStatus>::const_iterator it = | |
344 autocheckout_steps_.find(step_type); | |
345 return it != autocheckout_steps_.end() && it->second == step_status; | |
346 } | |
347 | |
348 private: | |
349 // Whether or not ShowRequestAutocompleteDialog method has been called. | |
350 bool request_autocomplete_dialog_open_; | |
351 | |
352 // Whether or not Autocheckout bubble is displayed to user. | |
353 bool autocheckout_bubble_shown_; | |
354 | |
355 // Whether or not to accept the Autocheckout bubble when offered. | |
356 bool should_autoclick_bubble_; | |
357 | |
358 // User specified data that would be returned to AutocheckoutManager when | |
359 // dialog is accepted. | |
360 scoped_ptr<FormStructure> user_supplied_data_; | |
361 | |
362 // Step status of various Autocheckout steps in this checkout flow. | |
363 std::map<AutocheckoutStepType, AutocheckoutStepStatus> autocheckout_steps_; | |
364 }; | |
365 | |
366 class TestAutofillManager : public AutofillManager { | |
367 public: | |
368 explicit TestAutofillManager(AutofillDriver* driver, | |
369 AutofillManagerDelegate* delegate) | |
370 : AutofillManager(driver, delegate, NULL) { | |
371 } | |
372 virtual ~TestAutofillManager() {} | |
373 | |
374 void SetFormStructure(scoped_ptr<FormStructure> form_structure) { | |
375 form_structures()->clear(); | |
376 form_structures()->push_back(form_structure.release()); | |
377 } | |
378 }; | |
379 | |
380 class MockAutofillMetrics : public AutofillMetrics { | |
381 public: | |
382 MockAutofillMetrics() {} | |
383 MOCK_CONST_METHOD1(LogAutocheckoutBubbleMetric, void(BubbleMetric)); | |
384 MOCK_CONST_METHOD1(LogAutocheckoutBuyFlowMetric, | |
385 void(AutocheckoutBuyFlowMetric)); | |
386 | |
387 private: | |
388 DISALLOW_COPY_AND_ASSIGN(MockAutofillMetrics); | |
389 }; | |
390 | |
391 class TestAutocheckoutManager: public AutocheckoutManager { | |
392 public: | |
393 explicit TestAutocheckoutManager(AutofillManager* autofill_manager) | |
394 : AutocheckoutManager(autofill_manager) { | |
395 set_metric_logger(scoped_ptr<AutofillMetrics>(new MockAutofillMetrics)); | |
396 } | |
397 | |
398 const MockAutofillMetrics& metric_logger() const { | |
399 return static_cast<const MockAutofillMetrics&>( | |
400 AutocheckoutManager::metric_logger()); | |
401 } | |
402 | |
403 virtual void MaybeShowAutocheckoutBubble( | |
404 const GURL& frame_url, | |
405 const gfx::RectF& bounding_box) OVERRIDE { | |
406 AutocheckoutManager::MaybeShowAutocheckoutBubble(frame_url, | |
407 bounding_box); | |
408 // Needed for AutocheckoutManager to post task on IO thread. | |
409 content::RunAllPendingInMessageLoop(BrowserThread::IO); | |
410 } | |
411 | |
412 using AutocheckoutManager::in_autocheckout_flow; | |
413 using AutocheckoutManager::should_show_bubble; | |
414 using AutocheckoutManager::MaybeShowAutocheckoutDialog; | |
415 using AutocheckoutManager::ReturnAutocheckoutData; | |
416 }; | |
417 | |
418 } // namespace | |
419 | |
420 class AutocheckoutManagerTest : public ChromeRenderViewHostTestHarness { | |
421 protected: | |
422 virtual void SetUp() OVERRIDE { | |
423 SetThreadBundleOptions(content::TestBrowserThreadBundle::REAL_IO_THREAD); | |
424 ChromeRenderViewHostTestHarness::SetUp(); | |
425 autofill_manager_delegate_.reset(new MockAutofillManagerDelegate()); | |
426 autofill_driver_.reset(new TestAutofillDriver(web_contents())); | |
427 autofill_manager_.reset(new TestAutofillManager( | |
428 autofill_driver_.get(), | |
429 autofill_manager_delegate_.get())); | |
430 autocheckout_manager_.reset( | |
431 new TestAutocheckoutManager(autofill_manager_.get())); | |
432 } | |
433 | |
434 virtual void TearDown() OVERRIDE { | |
435 autocheckout_manager_.reset(); | |
436 autofill_manager_delegate_.reset(); | |
437 autofill_manager_.reset(); | |
438 autofill_driver_.reset(); | |
439 ChromeRenderViewHostTestHarness::TearDown(); | |
440 } | |
441 | |
442 std::vector<FormData> ReadFilledForms() { | |
443 uint32 kMsgID = AutofillMsg_FillFormsAndClick::ID; | |
444 const IPC::Message* message = | |
445 process()->sink().GetFirstMessageMatching(kMsgID); | |
446 AutofillParam autofill_param; | |
447 AutofillMsg_FillFormsAndClick::Read(message, &autofill_param); | |
448 return autofill_param.a; | |
449 } | |
450 | |
451 void CheckFillFormsAndClickIpc( | |
452 ProceedElementPresence proceed_element_presence) { | |
453 EXPECT_EQ(1U, process()->sink().message_count()); | |
454 uint32 kMsgID = AutofillMsg_FillFormsAndClick::ID; | |
455 const IPC::Message* message = | |
456 process()->sink().GetFirstMessageMatching(kMsgID); | |
457 EXPECT_TRUE(message); | |
458 AutofillParam autofill_param; | |
459 AutofillMsg_FillFormsAndClick::Read(message, &autofill_param); | |
460 if (proceed_element_presence == HAS_PROCEED_ELEMENT) { | |
461 EXPECT_EQ(WebElementDescriptor::ID, autofill_param.d.retrieval_method); | |
462 EXPECT_EQ("#foo", autofill_param.d.descriptor); | |
463 } else { | |
464 EXPECT_EQ(WebElementDescriptor::NONE, autofill_param.d.retrieval_method); | |
465 } | |
466 ClearIpcSink(); | |
467 } | |
468 | |
469 void ClearIpcSink() { | |
470 process()->sink().ClearMessages(); | |
471 } | |
472 | |
473 void OpenRequestAutocompleteDialog() { | |
474 EXPECT_FALSE(autocheckout_manager_->in_autocheckout_flow()); | |
475 EXPECT_FALSE( | |
476 autofill_manager_delegate_->request_autocomplete_dialog_open()); | |
477 EXPECT_CALL(autocheckout_manager_->metric_logger(), | |
478 LogAutocheckoutBubbleMetric( | |
479 AutofillMetrics::BUBBLE_COULD_BE_DISPLAYED)).Times(1); | |
480 autocheckout_manager_->OnLoadedPageMetaData(CreateStartOfFlowMetaData()); | |
481 // Simulate the user submitting some data via the requestAutocomplete UI. | |
482 autofill_manager_delegate_->SetUserSuppliedData( | |
483 FakeUserSubmittedFormStructure()); | |
484 GURL frame_url; | |
485 EXPECT_CALL(autocheckout_manager_->metric_logger(), | |
486 LogAutocheckoutBuyFlowMetric( | |
487 AutofillMetrics::AUTOCHECKOUT_BUY_FLOW_STARTED)).Times(1); | |
488 autocheckout_manager_->MaybeShowAutocheckoutDialog( | |
489 frame_url, | |
490 AUTOCHECKOUT_BUBBLE_ACCEPTED); | |
491 CheckFillFormsAndClickIpc(HAS_PROCEED_ELEMENT); | |
492 EXPECT_TRUE(autocheckout_manager_->in_autocheckout_flow()); | |
493 EXPECT_TRUE(autocheckout_manager_->should_preserve_dialog()); | |
494 EXPECT_TRUE(autofill_manager_delegate_->request_autocomplete_dialog_open()); | |
495 EXPECT_TRUE(autofill_manager_delegate_ | |
496 ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_SHIPPING, | |
497 AUTOCHECKOUT_STEP_STARTED)); | |
498 EXPECT_TRUE(autofill_manager_delegate_ | |
499 ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_DELIVERY, | |
500 AUTOCHECKOUT_STEP_UNSTARTED)); | |
501 EXPECT_TRUE(autofill_manager_delegate_ | |
502 ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_BILLING, | |
503 AUTOCHECKOUT_STEP_UNSTARTED)); | |
504 } | |
505 | |
506 void HideRequestAutocompleteDialog() { | |
507 EXPECT_TRUE( | |
508 autofill_manager_delegate_->request_autocomplete_dialog_open()); | |
509 autofill_manager_delegate_->HideRequestAutocompleteDialog(); | |
510 EXPECT_FALSE( | |
511 autofill_manager_delegate_->request_autocomplete_dialog_open()); | |
512 } | |
513 | |
514 // Test a multi-page Autocheckout flow end to end. | |
515 // |proceed_element_presence_on_last_page| indicates whether the last page | |
516 // of the flow should have a proceed element. | |
517 void TestFullAutocheckoutFlow( | |
518 ProceedElementPresence proceed_element_presence_on_last_page) { | |
519 // Test for progression through last page. | |
520 OpenRequestAutocompleteDialog(); | |
521 EXPECT_TRUE(autofill_manager_delegate_ | |
522 ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_SHIPPING, | |
523 AUTOCHECKOUT_STEP_STARTED)); | |
524 // Complete the first page. | |
525 autocheckout_manager_->OnAutocheckoutPageCompleted(SUCCESS); | |
526 EXPECT_TRUE(autocheckout_manager_->should_preserve_dialog()); | |
527 EXPECT_TRUE(autofill_manager_delegate_ | |
528 ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_SHIPPING, | |
529 AUTOCHECKOUT_STEP_COMPLETED)); | |
530 | |
531 // Go to the second page. | |
532 EXPECT_CALL(*autofill_manager_delegate_, OnAutocheckoutSuccess()).Times(1); | |
533 autocheckout_manager_->OnLoadedPageMetaData(CreateInFlowMetaData()); | |
534 EXPECT_TRUE(autocheckout_manager_->in_autocheckout_flow()); | |
535 EXPECT_TRUE(autocheckout_manager_->should_preserve_dialog()); | |
536 CheckFillFormsAndClickIpc(HAS_PROCEED_ELEMENT); | |
537 EXPECT_TRUE(autofill_manager_delegate_ | |
538 ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_DELIVERY, | |
539 AUTOCHECKOUT_STEP_STARTED)); | |
540 autocheckout_manager_->OnAutocheckoutPageCompleted(SUCCESS); | |
541 EXPECT_TRUE(autofill_manager_delegate_ | |
542 ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_DELIVERY, | |
543 AUTOCHECKOUT_STEP_COMPLETED)); | |
544 | |
545 // Go to the third page. | |
546 EXPECT_CALL(autocheckout_manager_->metric_logger(), | |
547 LogAutocheckoutBuyFlowMetric( | |
548 AutofillMetrics::AUTOCHECKOUT_BUY_FLOW_SUCCESS)).Times(1); | |
549 autocheckout_manager_->OnLoadedPageMetaData( | |
550 CreateEndOfFlowMetaData(proceed_element_presence_on_last_page)); | |
551 CheckFillFormsAndClickIpc(proceed_element_presence_on_last_page); | |
552 EXPECT_TRUE(autocheckout_manager_->in_autocheckout_flow()); | |
553 EXPECT_TRUE(autocheckout_manager_->should_preserve_dialog()); | |
554 EXPECT_TRUE(autofill_manager_delegate_ | |
555 ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_BILLING, | |
556 AUTOCHECKOUT_STEP_STARTED)); | |
557 autocheckout_manager_->OnAutocheckoutPageCompleted(SUCCESS); | |
558 EXPECT_FALSE(autocheckout_manager_->in_autocheckout_flow()); | |
559 EXPECT_TRUE(autocheckout_manager_->should_preserve_dialog()); | |
560 EXPECT_TRUE(autofill_manager_delegate_ | |
561 ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_BILLING, | |
562 AUTOCHECKOUT_STEP_COMPLETED)); | |
563 | |
564 EXPECT_TRUE(autofill_manager_delegate_->request_autocomplete_dialog_open()); | |
565 | |
566 // Go to the page after the flow. | |
567 autocheckout_manager_->OnLoadedPageMetaData( | |
568 scoped_ptr<AutocheckoutPageMetaData>()); | |
569 EXPECT_EQ(proceed_element_presence_on_last_page == HAS_PROCEED_ELEMENT, | |
570 autocheckout_manager_->should_preserve_dialog()); | |
571 // Go to another page and we should not preserve the dialog now. | |
572 autocheckout_manager_->OnLoadedPageMetaData( | |
573 scoped_ptr<AutocheckoutPageMetaData>()); | |
574 EXPECT_FALSE(autocheckout_manager_->should_preserve_dialog()); | |
575 } | |
576 | |
577 // Test a signle-page Autocheckout flow. |proceed_element_presence| indicates | |
578 // whether the page should have a proceed element. | |
579 void TestSinglePageFlow(ProceedElementPresence proceed_element_presence) { | |
580 // Test one page flow. | |
581 EXPECT_FALSE(autocheckout_manager_->in_autocheckout_flow()); | |
582 EXPECT_FALSE( | |
583 autofill_manager_delegate_->request_autocomplete_dialog_open()); | |
584 EXPECT_CALL(autocheckout_manager_->metric_logger(), | |
585 LogAutocheckoutBubbleMetric( | |
586 AutofillMetrics::BUBBLE_COULD_BE_DISPLAYED)).Times(1); | |
587 EXPECT_CALL(*autofill_manager_delegate_, OnAutocheckoutSuccess()).Times(1); | |
588 autocheckout_manager_->OnLoadedPageMetaData( | |
589 CreateOnePageFlowMetaData(proceed_element_presence)); | |
590 // Simulate the user submitting some data via the requestAutocomplete UI. | |
591 autofill_manager_delegate_->SetUserSuppliedData( | |
592 FakeUserSubmittedFormStructure()); | |
593 GURL frame_url; | |
594 EXPECT_CALL(autocheckout_manager_->metric_logger(), | |
595 LogAutocheckoutBuyFlowMetric( | |
596 AutofillMetrics::AUTOCHECKOUT_BUY_FLOW_STARTED)).Times(1); | |
597 EXPECT_CALL(autocheckout_manager_->metric_logger(), | |
598 LogAutocheckoutBuyFlowMetric( | |
599 AutofillMetrics::AUTOCHECKOUT_BUY_FLOW_SUCCESS)).Times(1); | |
600 autocheckout_manager_->MaybeShowAutocheckoutDialog( | |
601 frame_url, | |
602 AUTOCHECKOUT_BUBBLE_ACCEPTED); | |
603 autocheckout_manager_->OnAutocheckoutPageCompleted(SUCCESS); | |
604 CheckFillFormsAndClickIpc(proceed_element_presence); | |
605 EXPECT_FALSE(autocheckout_manager_->in_autocheckout_flow()); | |
606 EXPECT_TRUE(autocheckout_manager_->should_preserve_dialog()); | |
607 EXPECT_TRUE(autofill_manager_delegate_->request_autocomplete_dialog_open()); | |
608 EXPECT_TRUE(autofill_manager_delegate_ | |
609 ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_SHIPPING, | |
610 AUTOCHECKOUT_STEP_COMPLETED)); | |
611 EXPECT_TRUE(autofill_manager_delegate_ | |
612 ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_DELIVERY, | |
613 AUTOCHECKOUT_STEP_COMPLETED)); | |
614 EXPECT_TRUE(autofill_manager_delegate_ | |
615 ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_BILLING, | |
616 AUTOCHECKOUT_STEP_COMPLETED)); | |
617 // Go to the page after the flow. | |
618 autocheckout_manager_->OnLoadedPageMetaData( | |
619 scoped_ptr<AutocheckoutPageMetaData>()); | |
620 EXPECT_EQ(proceed_element_presence == HAS_PROCEED_ELEMENT, | |
621 autocheckout_manager_->should_preserve_dialog()); | |
622 // Go to another page, and we should not preserve the dialog now. | |
623 autocheckout_manager_->OnLoadedPageMetaData( | |
624 scoped_ptr<AutocheckoutPageMetaData>()); | |
625 EXPECT_FALSE(autocheckout_manager_->should_preserve_dialog()); | |
626 } | |
627 | |
628 protected: | |
629 scoped_ptr<TestAutofillDriver> autofill_driver_; | |
630 scoped_ptr<TestAutofillManager> autofill_manager_; | |
631 scoped_ptr<TestAutocheckoutManager> autocheckout_manager_; | |
632 scoped_ptr<MockAutofillManagerDelegate> autofill_manager_delegate_; | |
633 }; | |
634 | |
635 TEST_F(AutocheckoutManagerTest, TestFillForms) { | |
636 OpenRequestAutocompleteDialog(); | |
637 | |
638 // Test if autocheckout manager can fill the first page. | |
639 autofill_manager_->SetFormStructure(CreateTestAddressFormStructure()); | |
640 | |
641 autocheckout_manager_->FillForms(); | |
642 | |
643 std::vector<FormData> filled_forms = ReadFilledForms(); | |
644 ASSERT_EQ(1U, filled_forms.size()); | |
645 ASSERT_EQ(9U, filled_forms[0].fields.size()); | |
646 EXPECT_EQ(ASCIIToUTF16("Test User"), filled_forms[0].fields[0].value); | |
647 EXPECT_EQ(ASCIIToUTF16("650-123-9909"), filled_forms[0].fields[1].value); | |
648 EXPECT_EQ(ASCIIToUTF16("blah@blah.com"), filled_forms[0].fields[2].value); | |
649 EXPECT_EQ(ASCIIToUTF16("Fake Street"), filled_forms[0].fields[3].value); | |
650 EXPECT_EQ(ASCIIToUTF16("Mocked City"), filled_forms[0].fields[4].value); | |
651 EXPECT_EQ(ASCIIToUTF16("California"), filled_forms[0].fields[5].value); | |
652 EXPECT_EQ(ASCIIToUTF16("United States"), filled_forms[0].fields[6].value); | |
653 EXPECT_EQ(ASCIIToUTF16("49012"), filled_forms[0].fields[7].value); | |
654 // Last field should not be filled, because there is no server mapping | |
655 // available for it. | |
656 EXPECT_EQ(ASCIIToUTF16("SomeField"), filled_forms[0].fields[8].value); | |
657 | |
658 filled_forms.clear(); | |
659 ClearIpcSink(); | |
660 | |
661 // Test if autocheckout manager can fill form on second page. | |
662 autofill_manager_->SetFormStructure(CreateTestCreditCardFormStructure()); | |
663 | |
664 autocheckout_manager_->FillForms(); | |
665 | |
666 filled_forms = ReadFilledForms(); | |
667 ASSERT_EQ(1U, filled_forms.size()); | |
668 ASSERT_EQ(10U, filled_forms[0].fields.size()); | |
669 EXPECT_EQ(ASCIIToUTF16("Test User"), filled_forms[0].fields[0].value); | |
670 EXPECT_EQ(ASCIIToUTF16("4444444444444448"), filled_forms[0].fields[1].value); | |
671 EXPECT_EQ(ASCIIToUTF16("10"), filled_forms[0].fields[2].value); | |
672 EXPECT_EQ(ASCIIToUTF16("2020"), filled_forms[0].fields[3].value); | |
673 EXPECT_EQ(ASCIIToUTF16("123"), filled_forms[0].fields[4].value); | |
674 EXPECT_EQ(ASCIIToUTF16("Billing Street"), filled_forms[0].fields[5].value); | |
675 EXPECT_EQ(ASCIIToUTF16("Billing City"), filled_forms[0].fields[6].value); | |
676 EXPECT_EQ(ASCIIToUTF16("BillingState"), filled_forms[0].fields[7].value); | |
677 EXPECT_EQ(ASCIIToUTF16("Canada"), filled_forms[0].fields[8].value); | |
678 EXPECT_EQ(ASCIIToUTF16("11111"), filled_forms[0].fields[9].value); | |
679 | |
680 filled_forms.clear(); | |
681 ClearIpcSink(); | |
682 | |
683 // Test form with default values. | |
684 autofill_manager_->SetFormStructure( | |
685 CreateTestFormStructureWithDefaultValues()); | |
686 | |
687 autocheckout_manager_->FillForms(); | |
688 | |
689 filled_forms = ReadFilledForms(); | |
690 ASSERT_EQ(1U, filled_forms.size()); | |
691 ASSERT_EQ(3U, filled_forms[0].fields.size()); | |
692 EXPECT_FALSE(filled_forms[0].fields[0].is_checked); | |
693 EXPECT_EQ(ASCIIToUTF16("male"), filled_forms[0].fields[0].value); | |
694 EXPECT_TRUE(filled_forms[0].fields[1].is_checked); | |
695 EXPECT_EQ(ASCIIToUTF16("female"), filled_forms[0].fields[1].value); | |
696 EXPECT_EQ(ASCIIToUTF16("Default Value"), filled_forms[0].fields[2].value); | |
697 } | |
698 | |
699 TEST_F(AutocheckoutManagerTest, OnFormsSeenTest) { | |
700 GURL frame_url; | |
701 gfx::RectF bounding_box; | |
702 EXPECT_CALL(autocheckout_manager_->metric_logger(), | |
703 LogAutocheckoutBubbleMetric( | |
704 AutofillMetrics::BUBBLE_COULD_BE_DISPLAYED)).Times(1); | |
705 autocheckout_manager_->OnLoadedPageMetaData(CreateStartOfFlowMetaData()); | |
706 autocheckout_manager_->MaybeShowAutocheckoutBubble(frame_url, bounding_box); | |
707 | |
708 EXPECT_FALSE(autocheckout_manager_->should_show_bubble()); | |
709 // OnFormsSeen resets whether or not the bubble was shown. | |
710 autocheckout_manager_->OnFormsSeen(); | |
711 EXPECT_TRUE(autocheckout_manager_->should_show_bubble()); | |
712 } | |
713 | |
714 TEST_F(AutocheckoutManagerTest, OnClickFailedTestMissingAdvance) { | |
715 OpenRequestAutocompleteDialog(); | |
716 | |
717 EXPECT_CALL(*autofill_manager_delegate_, OnAutocheckoutError()).Times(1); | |
718 EXPECT_CALL( | |
719 autocheckout_manager_->metric_logger(), | |
720 LogAutocheckoutBuyFlowMetric( | |
721 AutofillMetrics::AUTOCHECKOUT_BUY_FLOW_MISSING_ADVANCE_ELEMENT)) | |
722 .Times(1); | |
723 autocheckout_manager_->OnAutocheckoutPageCompleted(MISSING_ADVANCE); | |
724 EXPECT_FALSE(autocheckout_manager_->in_autocheckout_flow()); | |
725 EXPECT_TRUE( | |
726 autofill_manager_delegate_->request_autocomplete_dialog_open()); | |
727 EXPECT_TRUE(autofill_manager_delegate_ | |
728 ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_SHIPPING, | |
729 AUTOCHECKOUT_STEP_FAILED)); | |
730 } | |
731 | |
732 TEST_F(AutocheckoutManagerTest, OnClickFailedTestMissingClickBeforeFilling) { | |
733 OpenRequestAutocompleteDialog(); | |
734 | |
735 EXPECT_CALL(*autofill_manager_delegate_, OnAutocheckoutError()).Times(1); | |
736 EXPECT_CALL( | |
737 autocheckout_manager_->metric_logger(), | |
738 LogAutocheckoutBuyFlowMetric(AutofillMetrics:: | |
739 AUTOCHECKOUT_BUY_FLOW_MISSING_CLICK_ELEMENT_BEFORE_FORM_FILLING)) | |
740 .Times(1); | |
741 autocheckout_manager_->OnAutocheckoutPageCompleted( | |
742 MISSING_CLICK_ELEMENT_BEFORE_FORM_FILLING); | |
743 EXPECT_FALSE(autocheckout_manager_->in_autocheckout_flow()); | |
744 EXPECT_TRUE( | |
745 autofill_manager_delegate_->request_autocomplete_dialog_open()); | |
746 } | |
747 | |
748 TEST_F(AutocheckoutManagerTest, OnClickFailedTestMissingClickAfterFilling) { | |
749 OpenRequestAutocompleteDialog(); | |
750 | |
751 EXPECT_CALL(*autofill_manager_delegate_, OnAutocheckoutError()).Times(1); | |
752 EXPECT_CALL( | |
753 autocheckout_manager_->metric_logger(), | |
754 LogAutocheckoutBuyFlowMetric(AutofillMetrics:: | |
755 AUTOCHECKOUT_BUY_FLOW_MISSING_CLICK_ELEMENT_AFTER_FORM_FILLING)) | |
756 .Times(1); | |
757 autocheckout_manager_->OnAutocheckoutPageCompleted( | |
758 MISSING_CLICK_ELEMENT_AFTER_FORM_FILLING); | |
759 EXPECT_FALSE(autocheckout_manager_->in_autocheckout_flow()); | |
760 EXPECT_TRUE( | |
761 autofill_manager_delegate_->request_autocomplete_dialog_open()); | |
762 } | |
763 | |
764 TEST_F(AutocheckoutManagerTest, MaybeShowAutocheckoutBubbleTest) { | |
765 GURL frame_url; | |
766 gfx::RectF bounding_box; | |
767 EXPECT_CALL(autocheckout_manager_->metric_logger(), | |
768 LogAutocheckoutBubbleMetric( | |
769 AutofillMetrics::BUBBLE_COULD_BE_DISPLAYED)).Times(1); | |
770 autocheckout_manager_->OnLoadedPageMetaData(CreateStartOfFlowMetaData()); | |
771 // MaybeShowAutocheckoutBubble shows bubble if it has not been shown. | |
772 autocheckout_manager_->MaybeShowAutocheckoutBubble(frame_url, bounding_box); | |
773 EXPECT_FALSE(autocheckout_manager_->should_show_bubble()); | |
774 EXPECT_TRUE(autofill_manager_delegate_->autocheckout_bubble_shown()); | |
775 | |
776 // Reset |autofill_manager_delegate_|. | |
777 HideRequestAutocompleteDialog(); | |
778 autofill_manager_delegate_->set_autocheckout_bubble_shown(false); | |
779 | |
780 // MaybeShowAutocheckoutBubble does nothing if the bubble was already shown | |
781 // for the current page. | |
782 autocheckout_manager_->MaybeShowAutocheckoutBubble(frame_url, bounding_box); | |
783 EXPECT_FALSE(autocheckout_manager_->should_show_bubble()); | |
784 EXPECT_FALSE(autofill_manager_delegate_->autocheckout_bubble_shown()); | |
785 EXPECT_FALSE(autofill_manager_delegate_->request_autocomplete_dialog_open()); | |
786 } | |
787 | |
788 TEST_F(AutocheckoutManagerTest, OnLoadedPageMetaDataMissingMetaData) { | |
789 // Gettting no meta data after any autocheckout page is an error. | |
790 OpenRequestAutocompleteDialog(); | |
791 EXPECT_CALL(*autofill_manager_delegate_, OnAutocheckoutError()).Times(1); | |
792 EXPECT_CALL( | |
793 autocheckout_manager_->metric_logger(), | |
794 LogAutocheckoutBuyFlowMetric( | |
795 AutofillMetrics::AUTOCHECKOUT_BUY_FLOW_MISSING_FIELDMAPPING)) | |
796 .Times(1); | |
797 autocheckout_manager_->OnLoadedPageMetaData( | |
798 scoped_ptr<AutocheckoutPageMetaData>()); | |
799 EXPECT_FALSE(autocheckout_manager_->in_autocheckout_flow()); | |
800 EXPECT_EQ(0U, process()->sink().message_count()); | |
801 EXPECT_TRUE( | |
802 autofill_manager_delegate_->request_autocomplete_dialog_open()); | |
803 } | |
804 | |
805 TEST_F(AutocheckoutManagerTest, OnLoadedPageMetaDataRepeatedStartPage) { | |
806 // Getting start page twice in a row is an error. | |
807 OpenRequestAutocompleteDialog(); | |
808 EXPECT_CALL(*autofill_manager_delegate_, OnAutocheckoutError()).Times(1); | |
809 EXPECT_CALL( | |
810 autocheckout_manager_->metric_logger(), | |
811 LogAutocheckoutBuyFlowMetric( | |
812 AutofillMetrics::AUTOCHECKOUT_BUY_FLOW_CANNOT_PROCEED)).Times(1); | |
813 autocheckout_manager_->OnLoadedPageMetaData(CreateStartOfFlowMetaData()); | |
814 EXPECT_FALSE(autocheckout_manager_->in_autocheckout_flow()); | |
815 EXPECT_EQ(0U, process()->sink().message_count()); | |
816 EXPECT_TRUE( | |
817 autofill_manager_delegate_->request_autocomplete_dialog_open()); | |
818 | |
819 EXPECT_TRUE(autofill_manager_delegate_ | |
820 ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_SHIPPING, | |
821 AUTOCHECKOUT_STEP_FAILED)); | |
822 } | |
823 | |
824 TEST_F(AutocheckoutManagerTest, OnLoadedPageMetaDataRepeatedPage) { | |
825 // Repeating a page is an error. | |
826 OpenRequestAutocompleteDialog(); | |
827 // Go to second page. | |
828 autocheckout_manager_->OnLoadedPageMetaData(CreateInFlowMetaData()); | |
829 EXPECT_TRUE(autocheckout_manager_->in_autocheckout_flow()); | |
830 CheckFillFormsAndClickIpc(HAS_PROCEED_ELEMENT); | |
831 EXPECT_CALL(*autofill_manager_delegate_, OnAutocheckoutError()).Times(1); | |
832 EXPECT_CALL( | |
833 autocheckout_manager_->metric_logger(), | |
834 LogAutocheckoutBuyFlowMetric( | |
835 AutofillMetrics::AUTOCHECKOUT_BUY_FLOW_CANNOT_PROCEED)).Times(1); | |
836 autocheckout_manager_->OnLoadedPageMetaData(CreateInFlowMetaData()); | |
837 EXPECT_FALSE(autocheckout_manager_->in_autocheckout_flow()); | |
838 EXPECT_EQ(0U, process()->sink().message_count()); | |
839 EXPECT_TRUE( | |
840 autofill_manager_delegate_->request_autocomplete_dialog_open()); | |
841 EXPECT_TRUE(autofill_manager_delegate_ | |
842 ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_DELIVERY, | |
843 AUTOCHECKOUT_STEP_FAILED)); | |
844 } | |
845 | |
846 TEST_F(AutocheckoutManagerTest, OnLoadedPageMetaDataNotInFlow) { | |
847 // Repeating a page is an error. | |
848 OpenRequestAutocompleteDialog(); | |
849 // Go to second page. | |
850 autocheckout_manager_->OnLoadedPageMetaData(CreateInFlowMetaData()); | |
851 EXPECT_TRUE(autocheckout_manager_->in_autocheckout_flow()); | |
852 CheckFillFormsAndClickIpc(HAS_PROCEED_ELEMENT); | |
853 EXPECT_CALL(*autofill_manager_delegate_, OnAutocheckoutError()).Times(1); | |
854 EXPECT_CALL( | |
855 autocheckout_manager_->metric_logger(), | |
856 LogAutocheckoutBuyFlowMetric( | |
857 AutofillMetrics::AUTOCHECKOUT_BUY_FLOW_MISSING_FIELDMAPPING)) | |
858 .Times(1); | |
859 autocheckout_manager_->OnLoadedPageMetaData(CreateNotInFlowMetaData()); | |
860 EXPECT_FALSE(autocheckout_manager_->in_autocheckout_flow()); | |
861 EXPECT_EQ(0U, process()->sink().message_count()); | |
862 EXPECT_TRUE( | |
863 autofill_manager_delegate_->request_autocomplete_dialog_open()); | |
864 EXPECT_TRUE(autofill_manager_delegate_ | |
865 ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_DELIVERY, | |
866 AUTOCHECKOUT_STEP_FAILED)); | |
867 } | |
868 | |
869 TEST_F(AutocheckoutManagerTest, | |
870 OnLoadedPageMetaDataShouldNotFillFormsIfNotInFlow) { | |
871 // If not in flow, OnLoadedPageMetaData does not fill forms. | |
872 EXPECT_CALL(autocheckout_manager_->metric_logger(), | |
873 LogAutocheckoutBubbleMetric( | |
874 AutofillMetrics::BUBBLE_COULD_BE_DISPLAYED)).Times(1); | |
875 autocheckout_manager_->OnLoadedPageMetaData(CreateStartOfFlowMetaData()); | |
876 // Go to second page. | |
877 autocheckout_manager_->OnLoadedPageMetaData(CreateInFlowMetaData()); | |
878 EXPECT_EQ(0U, process()->sink().message_count()); | |
879 } | |
880 | |
881 TEST_F(AutocheckoutManagerTest, FullAutocheckoutFlow) { | |
882 TestFullAutocheckoutFlow(HAS_PROCEED_ELEMENT); | |
883 } | |
884 | |
885 TEST_F(AutocheckoutManagerTest, FullAutocheckoutFlowNoClickOnLastPage) { | |
886 TestFullAutocheckoutFlow(NO_PROCEED_ELEMENT); | |
887 } | |
888 | |
889 TEST_F(AutocheckoutManagerTest, CancelledAutocheckoutFlow) { | |
890 // Test for progression through last page. | |
891 OpenRequestAutocompleteDialog(); | |
892 // Go to second page. | |
893 autocheckout_manager_->OnLoadedPageMetaData(CreateInFlowMetaData()); | |
894 EXPECT_TRUE(autocheckout_manager_->in_autocheckout_flow()); | |
895 CheckFillFormsAndClickIpc(HAS_PROCEED_ELEMENT); | |
896 | |
897 // Cancel the flow. | |
898 autocheckout_manager_->ReturnAutocheckoutData(NULL, std::string()); | |
899 EXPECT_FALSE(autocheckout_manager_->in_autocheckout_flow()); | |
900 | |
901 // Go to third page. | |
902 EXPECT_CALL(autocheckout_manager_->metric_logger(), | |
903 LogAutocheckoutBuyFlowMetric(testing::_)).Times(0); | |
904 autocheckout_manager_->OnLoadedPageMetaData( | |
905 CreateEndOfFlowMetaData(HAS_PROCEED_ELEMENT)); | |
906 EXPECT_EQ(0U, process()->sink().message_count()); | |
907 } | |
908 | |
909 TEST_F(AutocheckoutManagerTest, SinglePageFlow) { | |
910 TestSinglePageFlow(HAS_PROCEED_ELEMENT); | |
911 } | |
912 | |
913 TEST_F(AutocheckoutManagerTest, SinglePageFlowNoClickElement) { | |
914 TestSinglePageFlow(NO_PROCEED_ELEMENT); | |
915 } | |
916 | |
917 TEST_F(AutocheckoutManagerTest, CancelAutocheckoutBubble) { | |
918 GURL frame_url; | |
919 gfx::RectF bounding_box; | |
920 autofill_manager_delegate_->set_should_autoclick_bubble(false); | |
921 EXPECT_FALSE(autocheckout_manager_->in_autocheckout_flow()); | |
922 EXPECT_FALSE(autofill_manager_delegate_->request_autocomplete_dialog_open()); | |
923 EXPECT_FALSE(autocheckout_manager_->is_autocheckout_bubble_showing()); | |
924 EXPECT_CALL(autocheckout_manager_->metric_logger(), | |
925 LogAutocheckoutBubbleMetric( | |
926 AutofillMetrics::BUBBLE_COULD_BE_DISPLAYED)).Times(1); | |
927 autocheckout_manager_->OnLoadedPageMetaData(CreateStartOfFlowMetaData()); | |
928 | |
929 autocheckout_manager_->MaybeShowAutocheckoutBubble(frame_url, bounding_box); | |
930 EXPECT_TRUE(autocheckout_manager_->is_autocheckout_bubble_showing()); | |
931 autocheckout_manager_->MaybeShowAutocheckoutDialog( | |
932 frame_url, | |
933 AUTOCHECKOUT_BUBBLE_IGNORED); | |
934 EXPECT_FALSE(autocheckout_manager_->is_autocheckout_bubble_showing()); | |
935 EXPECT_TRUE(autocheckout_manager_->should_show_bubble()); | |
936 | |
937 autocheckout_manager_->MaybeShowAutocheckoutBubble(frame_url, bounding_box); | |
938 EXPECT_TRUE(autocheckout_manager_->is_autocheckout_bubble_showing()); | |
939 autocheckout_manager_->MaybeShowAutocheckoutDialog( | |
940 frame_url, | |
941 AUTOCHECKOUT_BUBBLE_CANCELED); | |
942 EXPECT_FALSE(autocheckout_manager_->is_autocheckout_bubble_showing()); | |
943 EXPECT_FALSE(autocheckout_manager_->should_show_bubble()); | |
944 | |
945 autocheckout_manager_->MaybeShowAutocheckoutBubble(frame_url, bounding_box); | |
946 EXPECT_FALSE(autocheckout_manager_->is_autocheckout_bubble_showing()); | |
947 } | |
948 | |
949 } // namespace autofill | |
OLD | NEW |