Torne (Richard Coles) | 7d4cd47 | 2013-06-19 11:58:07 +0100 | [diff] [blame] | 1 | // Copyright 2013 The Chromium Authors. All rights reserved. |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
Ben Murdoch | eb525c5 | 2013-07-10 11:40:50 +0100 | [diff] [blame] | 5 | #include <map> |
| 6 | |
Torne (Richard Coles) | 868fa2f | 2013-06-11 10:57:03 +0100 | [diff] [blame] | 7 | #include "base/strings/utf_string_conversions.h" |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 8 | #include "base/tuple.h" |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 9 | #include "chrome/test/base/chrome_render_view_host_test_harness.h" |
Torne (Richard Coles) | 7d4cd47 | 2013-06-19 11:58:07 +0100 | [diff] [blame] | 10 | #include "components/autofill/content/browser/autocheckout_manager.h" |
Ben Murdoch | eb525c5 | 2013-07-10 11:40:50 +0100 | [diff] [blame] | 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" |
Torne (Richard Coles) | 7d4cd47 | 2013-06-19 11:58:07 +0100 | [diff] [blame] | 17 | #include "components/autofill/core/common/autofill_messages.h" |
| 18 | #include "components/autofill/core/common/form_data.h" |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 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" |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 22 | #include "content/public/test/test_utils.h" |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 23 | #include "ipc/ipc_test_sink.h" |
| 24 | #include "testing/gmock/include/gmock/gmock.h" |
| 25 | #include "testing/gtest/include/gtest/gtest.h" |
| 26 | |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 27 | using content::BrowserThread; |
| 28 | |
| 29 | namespace autofill { |
| 30 | |
| 31 | namespace { |
| 32 | |
Torne (Richard Coles) | 5e3f23d | 2013-06-11 16:24:11 +0100 | [diff] [blame] | 33 | typedef Tuple4<std::vector<FormData>, |
| 34 | std::vector<WebElementDescriptor>, |
| 35 | std::vector<WebElementDescriptor>, |
| 36 | WebElementDescriptor> AutofillParam; |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 37 | |
Ben Murdoch | ca12bfa | 2013-07-23 11:17:05 +0100 | [diff] [blame] | 38 | enum ProceedElementPresence { |
| 39 | NO_PROCEED_ELEMENT, |
| 40 | HAS_PROCEED_ELEMENT, |
| 41 | }; |
| 42 | |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 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( |
Ben Murdoch | 3240926 | 2013-08-07 11:04:47 +0100 | [diff] [blame] | 59 | const std::vector<ServerFieldType>& autofill_types) { |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 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. |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 76 | for (size_t i = 0; i < autofill_types.size(); ++i) { |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 77 | form_structure->field(i)->set_server_type(autofill_types[i]); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 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 | } |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 82 | |
| 83 | return form_structure.Pass(); |
| 84 | } |
| 85 | |
| 86 | scoped_ptr<FormStructure> CreateTestAddressFormStructure() { |
Ben Murdoch | 3240926 | 2013-08-07 11:04:47 +0100 | [diff] [blame] | 87 | std::vector<ServerFieldType> autofill_types; |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 88 | autofill_types.push_back(NAME_FULL); |
| 89 | autofill_types.push_back(PHONE_HOME_WHOLE_NUMBER); |
| 90 | autofill_types.push_back(EMAIL_ADDRESS); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 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); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 97 | return CreateTestFormStructure(autofill_types); |
| 98 | } |
| 99 | |
| 100 | scoped_ptr<FormStructure> CreateTestCreditCardFormStructure() { |
Ben Murdoch | 3240926 | 2013-08-07 11:04:47 +0100 | [diff] [blame] | 101 | std::vector<ServerFieldType> autofill_types; |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 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); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 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); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 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); |
Torne (Richard Coles) | a36e592 | 2013-08-05 13:57:33 +0100 | [diff] [blame] | 130 | FormFieldData select = BuildField("SelectField"); |
| 131 | select.form_control_type = "select-one"; |
| 132 | form.fields.push_back(select); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 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"); |
Torne (Richard Coles) | a36e592 | 2013-08-05 13:57:33 +0100 | [diff] [blame] | 142 | form_structure->field(2)->set_server_type(FIELD_WITH_DEFAULT_VALUE); |
| 143 | form_structure->field(2)->set_default_value("Default Value"); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 144 | |
| 145 | return form_structure.Pass(); |
| 146 | } |
| 147 | |
Torne (Richard Coles) | 5e3f23d | 2013-06-11 16:24:11 +0100 | [diff] [blame] | 148 | void PopulateClickElement(WebElementDescriptor* proceed_element, |
| 149 | const std::string& descriptor) { |
| 150 | proceed_element->descriptor = descriptor; |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 151 | proceed_element->retrieval_method = WebElementDescriptor::ID; |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 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; |
Ben Murdoch | eb525c5 | 2013-07-10 11:40:50 +0100 | [diff] [blame] | 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); |
Torne (Richard Coles) | 5e3f23d | 2013-06-11 16:24:11 +0100 | [diff] [blame] | 162 | PopulateClickElement(&start_of_flow->proceed_element_descriptor, "#foo"); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 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; |
Torne (Richard Coles) | 5e3f23d | 2013-06-11 16:24:11 +0100 | [diff] [blame] | 170 | PopulateClickElement(&in_flow->proceed_element_descriptor, "#foo"); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 171 | return in_flow.Pass(); |
| 172 | } |
| 173 | |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 174 | scoped_ptr<AutocheckoutPageMetaData> CreateNotInFlowMetaData() { |
| 175 | scoped_ptr<AutocheckoutPageMetaData> not_in_flow( |
| 176 | new AutocheckoutPageMetaData()); |
Torne (Richard Coles) | 5e3f23d | 2013-06-11 16:24:11 +0100 | [diff] [blame] | 177 | PopulateClickElement(¬_in_flow->proceed_element_descriptor, "#foo"); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 178 | return not_in_flow.Pass(); |
| 179 | } |
| 180 | |
Ben Murdoch | ca12bfa | 2013-07-23 11:17:05 +0100 | [diff] [blame] | 181 | scoped_ptr<AutocheckoutPageMetaData> CreateEndOfFlowMetaData( |
| 182 | ProceedElementPresence proceed_element_presence) { |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 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; |
Ben Murdoch | ca12bfa | 2013-07-23 11:17:05 +0100 | [diff] [blame] | 187 | if (proceed_element_presence == HAS_PROCEED_ELEMENT) |
| 188 | PopulateClickElement(&end_of_flow->proceed_element_descriptor, "#foo"); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 189 | return end_of_flow.Pass(); |
| 190 | } |
| 191 | |
Ben Murdoch | ca12bfa | 2013-07-23 11:17:05 +0100 | [diff] [blame] | 192 | scoped_ptr<AutocheckoutPageMetaData> CreateOnePageFlowMetaData( |
| 193 | ProceedElementPresence proceed_element_presence) { |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 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; |
Ben Murdoch | eb525c5 | 2013-07-10 11:40:50 +0100 | [diff] [blame] | 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); |
Ben Murdoch | ca12bfa | 2013-07-23 11:17:05 +0100 | [diff] [blame] | 201 | if (proceed_element_presence == HAS_PROCEED_ELEMENT) |
| 202 | PopulateClickElement(&one_page_flow->proceed_element_descriptor, "#foo"); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 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 | |
Torne (Richard Coles) | 5e3f23d | 2013-06-11 16:24:11 +0100 | [diff] [blame] | 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 | |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 229 | struct TestField { |
| 230 | const char* const field_type; |
| 231 | const char* const field_value; |
Ben Murdoch | 3240926 | 2013-08-07 11:04:47 +0100 | [diff] [blame] | 232 | ServerFieldType autofill_type; |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 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}, |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 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} |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 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), |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 277 | autocheckout_bubble_shown_(false), |
| 278 | should_autoclick_bubble_(true) {} |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 279 | |
| 280 | virtual ~MockAutofillManagerDelegate() {} |
| 281 | |
| 282 | virtual void HideRequestAutocompleteDialog() OVERRIDE { |
| 283 | request_autocomplete_dialog_open_ = false; |
| 284 | } |
| 285 | |
| 286 | MOCK_METHOD0(OnAutocheckoutError, void()); |
Torne (Richard Coles) | 90dce4d | 2013-05-29 14:40:03 +0100 | [diff] [blame] | 287 | MOCK_METHOD0(OnAutocheckoutSuccess, void()); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 288 | |
Ben Murdoch | bb1529c | 2013-08-08 10:24:53 +0100 | [diff] [blame^] | 289 | virtual bool ShowAutocheckoutBubble( |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 290 | const gfx::RectF& bounds, |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 291 | bool is_google_user, |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 292 | const base::Callback<void(AutocheckoutBubbleState)>& callback) OVERRIDE { |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 293 | autocheckout_bubble_shown_ = true; |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 294 | if (should_autoclick_bubble_) |
| 295 | callback.Run(AUTOCHECKOUT_BUBBLE_ACCEPTED); |
Ben Murdoch | bb1529c | 2013-08-08 10:24:53 +0100 | [diff] [blame^] | 296 | return true; |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 297 | } |
| 298 | |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 299 | virtual void ShowRequestAutocompleteDialog( |
| 300 | const FormData& form, |
| 301 | const GURL& source_url, |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 302 | DialogType dialog_type, |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 303 | const base::Callback<void(const FormStructure*, |
| 304 | const std::string&)>& callback) OVERRIDE { |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 305 | request_autocomplete_dialog_open_ = true; |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 306 | callback.Run(user_supplied_data_.get(), "google_transaction_id"); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 307 | } |
| 308 | |
Ben Murdoch | eb525c5 | 2013-07-10 11:40:50 +0100 | [diff] [blame] | 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 | } |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 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 | |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 336 | void set_should_autoclick_bubble(bool should_autoclick_bubble) { |
| 337 | should_autoclick_bubble_ = should_autoclick_bubble; |
| 338 | } |
| 339 | |
Ben Murdoch | eb525c5 | 2013-07-10 11:40:50 +0100 | [diff] [blame] | 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 | |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 348 | private: |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 349 | // Whether or not ShowRequestAutocompleteDialog method has been called. |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 350 | bool request_autocomplete_dialog_open_; |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 351 | |
| 352 | // Whether or not Autocheckout bubble is displayed to user. |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 353 | bool autocheckout_bubble_shown_; |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 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. |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 360 | scoped_ptr<FormStructure> user_supplied_data_; |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 361 | |
| 362 | // Step status of various Autocheckout steps in this checkout flow. |
Ben Murdoch | eb525c5 | 2013-07-10 11:40:50 +0100 | [diff] [blame] | 363 | std::map<AutocheckoutStepType, AutocheckoutStepStatus> autocheckout_steps_; |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 364 | }; |
| 365 | |
| 366 | class TestAutofillManager : public AutofillManager { |
| 367 | public: |
Torne (Richard Coles) | 7d4cd47 | 2013-06-19 11:58:07 +0100 | [diff] [blame] | 368 | explicit TestAutofillManager(AutofillDriver* driver, |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 369 | AutofillManagerDelegate* delegate) |
Torne (Richard Coles) | 7d4cd47 | 2013-06-19 11:58:07 +0100 | [diff] [blame] | 370 | : AutofillManager(driver, delegate, NULL) { |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 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 | |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 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 | }; |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 390 | |
| 391 | class TestAutocheckoutManager: public AutocheckoutManager { |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 392 | public: |
| 393 | explicit TestAutocheckoutManager(AutofillManager* autofill_manager) |
| 394 | : AutocheckoutManager(autofill_manager) { |
| 395 | set_metric_logger(scoped_ptr<AutofillMetrics>(new MockAutofillMetrics)); |
| 396 | } |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 397 | |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 398 | const MockAutofillMetrics& metric_logger() const { |
| 399 | return static_cast<const MockAutofillMetrics&>( |
| 400 | AutocheckoutManager::metric_logger()); |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 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 | } |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 411 | |
| 412 | using AutocheckoutManager::in_autocheckout_flow; |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 413 | using AutocheckoutManager::should_show_bubble; |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 414 | using AutocheckoutManager::MaybeShowAutocheckoutDialog; |
Torne (Richard Coles) | 7d4cd47 | 2013-06-19 11:58:07 +0100 | [diff] [blame] | 415 | using AutocheckoutManager::ReturnAutocheckoutData; |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 416 | }; |
| 417 | |
| 418 | } // namespace |
| 419 | |
| 420 | class AutocheckoutManagerTest : public ChromeRenderViewHostTestHarness { |
Torne (Richard Coles) | 868fa2f | 2013-06-11 10:57:03 +0100 | [diff] [blame] | 421 | protected: |
| 422 | virtual void SetUp() OVERRIDE { |
| 423 | SetThreadBundleOptions(content::TestBrowserThreadBundle::REAL_IO_THREAD); |
| 424 | ChromeRenderViewHostTestHarness::SetUp(); |
Torne (Richard Coles) | 868fa2f | 2013-06-11 10:57:03 +0100 | [diff] [blame] | 425 | autofill_manager_delegate_.reset(new MockAutofillManagerDelegate()); |
Torne (Richard Coles) | 7d4cd47 | 2013-06-19 11:58:07 +0100 | [diff] [blame] | 426 | autofill_driver_.reset(new TestAutofillDriver(web_contents())); |
Torne (Richard Coles) | 868fa2f | 2013-06-11 10:57:03 +0100 | [diff] [blame] | 427 | autofill_manager_.reset(new TestAutofillManager( |
Torne (Richard Coles) | 7d4cd47 | 2013-06-19 11:58:07 +0100 | [diff] [blame] | 428 | autofill_driver_.get(), |
Torne (Richard Coles) | 868fa2f | 2013-06-11 10:57:03 +0100 | [diff] [blame] | 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(); |
Torne (Richard Coles) | 7d4cd47 | 2013-06-19 11:58:07 +0100 | [diff] [blame] | 438 | autofill_driver_.reset(); |
Torne (Richard Coles) | 868fa2f | 2013-06-11 10:57:03 +0100 | [diff] [blame] | 439 | ChromeRenderViewHostTestHarness::TearDown(); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 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 | |
Ben Murdoch | ca12bfa | 2013-07-23 11:17:05 +0100 | [diff] [blame] | 451 | void CheckFillFormsAndClickIpc( |
| 452 | ProceedElementPresence proceed_element_presence) { |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 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); |
Ben Murdoch | ca12bfa | 2013-07-23 11:17:05 +0100 | [diff] [blame] | 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 | } |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 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()); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 477 | EXPECT_CALL(autocheckout_manager_->metric_logger(), |
| 478 | LogAutocheckoutBubbleMetric( |
| 479 | AutofillMetrics::BUBBLE_COULD_BE_DISPLAYED)).Times(1); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 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; |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 485 | EXPECT_CALL(autocheckout_manager_->metric_logger(), |
| 486 | LogAutocheckoutBuyFlowMetric( |
| 487 | AutofillMetrics::AUTOCHECKOUT_BUY_FLOW_STARTED)).Times(1); |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 488 | autocheckout_manager_->MaybeShowAutocheckoutDialog( |
| 489 | frame_url, |
| 490 | AUTOCHECKOUT_BUBBLE_ACCEPTED); |
Ben Murdoch | ca12bfa | 2013-07-23 11:17:05 +0100 | [diff] [blame] | 491 | CheckFillFormsAndClickIpc(HAS_PROCEED_ELEMENT); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 492 | EXPECT_TRUE(autocheckout_manager_->in_autocheckout_flow()); |
Ben Murdoch | ca12bfa | 2013-07-23 11:17:05 +0100 | [diff] [blame] | 493 | EXPECT_TRUE(autocheckout_manager_->should_preserve_dialog()); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 494 | EXPECT_TRUE(autofill_manager_delegate_->request_autocomplete_dialog_open()); |
Ben Murdoch | eb525c5 | 2013-07-10 11:40:50 +0100 | [diff] [blame] | 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)); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 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 | |
Ben Murdoch | ca12bfa | 2013-07-23 11:17:05 +0100 | [diff] [blame] | 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 | |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 628 | protected: |
Torne (Richard Coles) | 7d4cd47 | 2013-06-19 11:58:07 +0100 | [diff] [blame] | 629 | scoped_ptr<TestAutofillDriver> autofill_driver_; |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 630 | scoped_ptr<TestAutofillManager> autofill_manager_; |
| 631 | scoped_ptr<TestAutocheckoutManager> autocheckout_manager_; |
| 632 | scoped_ptr<MockAutofillManagerDelegate> autofill_manager_delegate_; |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 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()); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 645 | ASSERT_EQ(9U, filled_forms[0].fields.size()); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 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); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 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); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 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); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 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); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 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()); |
Torne (Richard Coles) | a36e592 | 2013-08-05 13:57:33 +0100 | [diff] [blame] | 691 | ASSERT_EQ(3U, filled_forms[0].fields.size()); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 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); |
Torne (Richard Coles) | a36e592 | 2013-08-05 13:57:33 +0100 | [diff] [blame] | 696 | EXPECT_EQ(ASCIIToUTF16("Default Value"), filled_forms[0].fields[2].value); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 697 | } |
| 698 | |
| 699 | TEST_F(AutocheckoutManagerTest, OnFormsSeenTest) { |
| 700 | GURL frame_url; |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 701 | gfx::RectF bounding_box; |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 702 | EXPECT_CALL(autocheckout_manager_->metric_logger(), |
| 703 | LogAutocheckoutBubbleMetric( |
| 704 | AutofillMetrics::BUBBLE_COULD_BE_DISPLAYED)).Times(1); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 705 | autocheckout_manager_->OnLoadedPageMetaData(CreateStartOfFlowMetaData()); |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 706 | autocheckout_manager_->MaybeShowAutocheckoutBubble(frame_url, bounding_box); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 707 | |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 708 | EXPECT_FALSE(autocheckout_manager_->should_show_bubble()); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 709 | // OnFormsSeen resets whether or not the bubble was shown. |
| 710 | autocheckout_manager_->OnFormsSeen(); |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 711 | EXPECT_TRUE(autocheckout_manager_->should_show_bubble()); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 712 | } |
| 713 | |
Torne (Richard Coles) | 5e3f23d | 2013-06-11 16:24:11 +0100 | [diff] [blame] | 714 | TEST_F(AutocheckoutManagerTest, OnClickFailedTestMissingAdvance) { |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 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); |
Ben Murdoch | ca12bfa | 2013-07-23 11:17:05 +0100 | [diff] [blame] | 723 | autocheckout_manager_->OnAutocheckoutPageCompleted(MISSING_ADVANCE); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 724 | EXPECT_FALSE(autocheckout_manager_->in_autocheckout_flow()); |
Torne (Richard Coles) | 90dce4d | 2013-05-29 14:40:03 +0100 | [diff] [blame] | 725 | EXPECT_TRUE( |
| 726 | autofill_manager_delegate_->request_autocomplete_dialog_open()); |
Ben Murdoch | eb525c5 | 2013-07-10 11:40:50 +0100 | [diff] [blame] | 727 | EXPECT_TRUE(autofill_manager_delegate_ |
| 728 | ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_SHIPPING, |
| 729 | AUTOCHECKOUT_STEP_FAILED)); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 730 | } |
| 731 | |
Torne (Richard Coles) | 5e3f23d | 2013-06-11 16:24:11 +0100 | [diff] [blame] | 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); |
Ben Murdoch | ca12bfa | 2013-07-23 11:17:05 +0100 | [diff] [blame] | 741 | autocheckout_manager_->OnAutocheckoutPageCompleted( |
Torne (Richard Coles) | 5e3f23d | 2013-06-11 16:24:11 +0100 | [diff] [blame] | 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); |
Ben Murdoch | ca12bfa | 2013-07-23 11:17:05 +0100 | [diff] [blame] | 757 | autocheckout_manager_->OnAutocheckoutPageCompleted( |
Torne (Richard Coles) | 5e3f23d | 2013-06-11 16:24:11 +0100 | [diff] [blame] | 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 | |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 764 | TEST_F(AutocheckoutManagerTest, MaybeShowAutocheckoutBubbleTest) { |
| 765 | GURL frame_url; |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 766 | gfx::RectF bounding_box; |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 767 | EXPECT_CALL(autocheckout_manager_->metric_logger(), |
| 768 | LogAutocheckoutBubbleMetric( |
| 769 | AutofillMetrics::BUBBLE_COULD_BE_DISPLAYED)).Times(1); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 770 | autocheckout_manager_->OnLoadedPageMetaData(CreateStartOfFlowMetaData()); |
| 771 | // MaybeShowAutocheckoutBubble shows bubble if it has not been shown. |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 772 | autocheckout_manager_->MaybeShowAutocheckoutBubble(frame_url, bounding_box); |
| 773 | EXPECT_FALSE(autocheckout_manager_->should_show_bubble()); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 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. |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 782 | autocheckout_manager_->MaybeShowAutocheckoutBubble(frame_url, bounding_box); |
| 783 | EXPECT_FALSE(autocheckout_manager_->should_show_bubble()); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 784 | EXPECT_FALSE(autofill_manager_delegate_->autocheckout_bubble_shown()); |
| 785 | EXPECT_FALSE(autofill_manager_delegate_->request_autocomplete_dialog_open()); |
| 786 | } |
| 787 | |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 788 | TEST_F(AutocheckoutManagerTest, OnLoadedPageMetaDataMissingMetaData) { |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 789 | // Gettting no meta data after any autocheckout page is an error. |
| 790 | OpenRequestAutocompleteDialog(); |
| 791 | EXPECT_CALL(*autofill_manager_delegate_, OnAutocheckoutError()).Times(1); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 792 | EXPECT_CALL( |
| 793 | autocheckout_manager_->metric_logger(), |
| 794 | LogAutocheckoutBuyFlowMetric( |
| 795 | AutofillMetrics::AUTOCHECKOUT_BUY_FLOW_MISSING_FIELDMAPPING)) |
| 796 | .Times(1); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 797 | autocheckout_manager_->OnLoadedPageMetaData( |
| 798 | scoped_ptr<AutocheckoutPageMetaData>()); |
| 799 | EXPECT_FALSE(autocheckout_manager_->in_autocheckout_flow()); |
| 800 | EXPECT_EQ(0U, process()->sink().message_count()); |
Torne (Richard Coles) | 90dce4d | 2013-05-29 14:40:03 +0100 | [diff] [blame] | 801 | EXPECT_TRUE( |
| 802 | autofill_manager_delegate_->request_autocomplete_dialog_open()); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 803 | } |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 804 | |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 805 | TEST_F(AutocheckoutManagerTest, OnLoadedPageMetaDataRepeatedStartPage) { |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 806 | // Getting start page twice in a row is an error. |
| 807 | OpenRequestAutocompleteDialog(); |
| 808 | EXPECT_CALL(*autofill_manager_delegate_, OnAutocheckoutError()).Times(1); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 809 | EXPECT_CALL( |
| 810 | autocheckout_manager_->metric_logger(), |
| 811 | LogAutocheckoutBuyFlowMetric( |
| 812 | AutofillMetrics::AUTOCHECKOUT_BUY_FLOW_CANNOT_PROCEED)).Times(1); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 813 | autocheckout_manager_->OnLoadedPageMetaData(CreateStartOfFlowMetaData()); |
| 814 | EXPECT_FALSE(autocheckout_manager_->in_autocheckout_flow()); |
| 815 | EXPECT_EQ(0U, process()->sink().message_count()); |
Torne (Richard Coles) | 90dce4d | 2013-05-29 14:40:03 +0100 | [diff] [blame] | 816 | EXPECT_TRUE( |
| 817 | autofill_manager_delegate_->request_autocomplete_dialog_open()); |
Ben Murdoch | ca12bfa | 2013-07-23 11:17:05 +0100 | [diff] [blame] | 818 | |
Ben Murdoch | eb525c5 | 2013-07-10 11:40:50 +0100 | [diff] [blame] | 819 | EXPECT_TRUE(autofill_manager_delegate_ |
| 820 | ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_SHIPPING, |
| 821 | AUTOCHECKOUT_STEP_FAILED)); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 822 | } |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 823 | |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 824 | TEST_F(AutocheckoutManagerTest, OnLoadedPageMetaDataRepeatedPage) { |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 825 | // Repeating a page is an error. |
| 826 | OpenRequestAutocompleteDialog(); |
| 827 | // Go to second page. |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 828 | autocheckout_manager_->OnLoadedPageMetaData(CreateInFlowMetaData()); |
| 829 | EXPECT_TRUE(autocheckout_manager_->in_autocheckout_flow()); |
Ben Murdoch | ca12bfa | 2013-07-23 11:17:05 +0100 | [diff] [blame] | 830 | CheckFillFormsAndClickIpc(HAS_PROCEED_ELEMENT); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 831 | EXPECT_CALL(*autofill_manager_delegate_, OnAutocheckoutError()).Times(1); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 832 | EXPECT_CALL( |
| 833 | autocheckout_manager_->metric_logger(), |
| 834 | LogAutocheckoutBuyFlowMetric( |
| 835 | AutofillMetrics::AUTOCHECKOUT_BUY_FLOW_CANNOT_PROCEED)).Times(1); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 836 | autocheckout_manager_->OnLoadedPageMetaData(CreateInFlowMetaData()); |
| 837 | EXPECT_FALSE(autocheckout_manager_->in_autocheckout_flow()); |
| 838 | EXPECT_EQ(0U, process()->sink().message_count()); |
Torne (Richard Coles) | 90dce4d | 2013-05-29 14:40:03 +0100 | [diff] [blame] | 839 | EXPECT_TRUE( |
| 840 | autofill_manager_delegate_->request_autocomplete_dialog_open()); |
Ben Murdoch | eb525c5 | 2013-07-10 11:40:50 +0100 | [diff] [blame] | 841 | EXPECT_TRUE(autofill_manager_delegate_ |
| 842 | ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_DELIVERY, |
| 843 | AUTOCHECKOUT_STEP_FAILED)); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 844 | } |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 845 | |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 846 | TEST_F(AutocheckoutManagerTest, OnLoadedPageMetaDataNotInFlow) { |
| 847 | // Repeating a page is an error. |
| 848 | OpenRequestAutocompleteDialog(); |
| 849 | // Go to second page. |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 850 | autocheckout_manager_->OnLoadedPageMetaData(CreateInFlowMetaData()); |
| 851 | EXPECT_TRUE(autocheckout_manager_->in_autocheckout_flow()); |
Ben Murdoch | ca12bfa | 2013-07-23 11:17:05 +0100 | [diff] [blame] | 852 | CheckFillFormsAndClickIpc(HAS_PROCEED_ELEMENT); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 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()); |
Torne (Richard Coles) | 90dce4d | 2013-05-29 14:40:03 +0100 | [diff] [blame] | 862 | EXPECT_TRUE( |
| 863 | autofill_manager_delegate_->request_autocomplete_dialog_open()); |
Ben Murdoch | eb525c5 | 2013-07-10 11:40:50 +0100 | [diff] [blame] | 864 | EXPECT_TRUE(autofill_manager_delegate_ |
| 865 | ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_DELIVERY, |
| 866 | AUTOCHECKOUT_STEP_FAILED)); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 867 | } |
| 868 | |
| 869 | TEST_F(AutocheckoutManagerTest, |
| 870 | OnLoadedPageMetaDataShouldNotFillFormsIfNotInFlow) { |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 871 | // If not in flow, OnLoadedPageMetaData does not fill forms. |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 872 | EXPECT_CALL(autocheckout_manager_->metric_logger(), |
| 873 | LogAutocheckoutBubbleMetric( |
| 874 | AutofillMetrics::BUBBLE_COULD_BE_DISPLAYED)).Times(1); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 875 | autocheckout_manager_->OnLoadedPageMetaData(CreateStartOfFlowMetaData()); |
| 876 | // Go to second page. |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 877 | autocheckout_manager_->OnLoadedPageMetaData(CreateInFlowMetaData()); |
| 878 | EXPECT_EQ(0U, process()->sink().message_count()); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 879 | } |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 880 | |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 881 | TEST_F(AutocheckoutManagerTest, FullAutocheckoutFlow) { |
Ben Murdoch | ca12bfa | 2013-07-23 11:17:05 +0100 | [diff] [blame] | 882 | TestFullAutocheckoutFlow(HAS_PROCEED_ELEMENT); |
| 883 | } |
| 884 | |
| 885 | TEST_F(AutocheckoutManagerTest, FullAutocheckoutFlowNoClickOnLastPage) { |
| 886 | TestFullAutocheckoutFlow(NO_PROCEED_ELEMENT); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 887 | } |
| 888 | |
Torne (Richard Coles) | 7d4cd47 | 2013-06-19 11:58:07 +0100 | [diff] [blame] | 889 | TEST_F(AutocheckoutManagerTest, CancelledAutocheckoutFlow) { |
| 890 | // Test for progression through last page. |
| 891 | OpenRequestAutocompleteDialog(); |
| 892 | // Go to second page. |
Torne (Richard Coles) | 7d4cd47 | 2013-06-19 11:58:07 +0100 | [diff] [blame] | 893 | autocheckout_manager_->OnLoadedPageMetaData(CreateInFlowMetaData()); |
| 894 | EXPECT_TRUE(autocheckout_manager_->in_autocheckout_flow()); |
Ben Murdoch | ca12bfa | 2013-07-23 11:17:05 +0100 | [diff] [blame] | 895 | CheckFillFormsAndClickIpc(HAS_PROCEED_ELEMENT); |
Torne (Richard Coles) | 7d4cd47 | 2013-06-19 11:58:07 +0100 | [diff] [blame] | 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. |
Torne (Richard Coles) | 7d4cd47 | 2013-06-19 11:58:07 +0100 | [diff] [blame] | 902 | EXPECT_CALL(autocheckout_manager_->metric_logger(), |
| 903 | LogAutocheckoutBuyFlowMetric(testing::_)).Times(0); |
Ben Murdoch | ca12bfa | 2013-07-23 11:17:05 +0100 | [diff] [blame] | 904 | autocheckout_manager_->OnLoadedPageMetaData( |
| 905 | CreateEndOfFlowMetaData(HAS_PROCEED_ELEMENT)); |
Torne (Richard Coles) | 7d4cd47 | 2013-06-19 11:58:07 +0100 | [diff] [blame] | 906 | EXPECT_EQ(0U, process()->sink().message_count()); |
| 907 | } |
| 908 | |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 909 | TEST_F(AutocheckoutManagerTest, SinglePageFlow) { |
Ben Murdoch | ca12bfa | 2013-07-23 11:17:05 +0100 | [diff] [blame] | 910 | TestSinglePageFlow(HAS_PROCEED_ELEMENT); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 911 | } |
| 912 | |
Ben Murdoch | ca12bfa | 2013-07-23 11:17:05 +0100 | [diff] [blame] | 913 | TEST_F(AutocheckoutManagerTest, SinglePageFlowNoClickElement) { |
| 914 | TestSinglePageFlow(NO_PROCEED_ELEMENT); |
| 915 | } |
| 916 | |
| 917 | TEST_F(AutocheckoutManagerTest, CancelAutocheckoutBubble) { |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 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 | |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 949 | } // namespace autofill |