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 (at) 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 (at) 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 950