12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h" 6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/command_line.h" 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/ref_counted.h" 8a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/memory/weak_ptr.h" 99ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/autofill/personal_data_manager_factory.h" 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/profiles/profile.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/autofill/autofill_dialog_controller_impl.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/autofill/autofill_dialog_view.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/autofill/data_model_wrapper.h" 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/autofill/tab_autofill_manager_delegate.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/autofill/testable_autofill_dialog_view.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/test/base/ui_test_utils.h" 237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "components/autofill/content/browser/wallet/mock_wallet_client.h" 24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/wallet/wallet_test_util.h" 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_common_test.h" 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_metrics.h" 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/test_personal_data_manager.h" 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/validation.h" 297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/core/common/autofill_switches.h" 307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/core/common/form_data.h" 317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/core/common/form_field_data.h" 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/browser/browser_thread.h" 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/browser/web_contents.h" 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/browser/web_contents_delegate.h" 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/test/browser_test_utils.h" 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/test/test_utils.h" 377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "testing/gmock/include/gmock/gmock.h" 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "third_party/WebKit/public/web/WebInputEvent.h" 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace autofill { 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void MockCallback(const FormStructure*, const std::string&) {} 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockAutofillMetrics : public AutofillMetrics { 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockAutofillMetrics() 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : dialog_type_(static_cast<DialogType>(-1)), 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dialog_dismissal_action_( 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<AutofillMetrics::DialogDismissalAction>(-1)), 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) autocheckout_status_( 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<AutofillMetrics::AutocheckoutCompletionStatus>(-1)) {} 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~MockAutofillMetrics() {} 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // AutofillMetrics: 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void LogAutocheckoutDuration( 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::TimeDelta& duration, 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutocheckoutCompletionStatus status) const OVERRIDE { 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ignore constness for testing. 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockAutofillMetrics* mutable_this = const_cast<MockAutofillMetrics*>(this); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mutable_this->autocheckout_status_ = status; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void LogDialogUiDuration( 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::TimeDelta& duration, 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DialogType dialog_type, 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DialogDismissalAction dismissal_action) const OVERRIDE { 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ignore constness for testing. 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockAutofillMetrics* mutable_this = const_cast<MockAutofillMetrics*>(this); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mutable_this->dialog_type_ = dialog_type; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mutable_this->dialog_dismissal_action_ = dismissal_action; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DialogType dialog_type() const { return dialog_type_; } 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillMetrics::DialogDismissalAction dialog_dismissal_action() const { 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return dialog_dismissal_action_; 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillMetrics::AutocheckoutCompletionStatus autocheckout_status() const { 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return autocheckout_status_; 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MOCK_CONST_METHOD2(LogDialogDismissalState, 867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void(DialogType dialog_type, DialogDismissalState state)); 877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DialogType dialog_type_; 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillMetrics::DialogDismissalAction dialog_dismissal_action_; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillMetrics::AutocheckoutCompletionStatus autocheckout_status_; 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MockAutofillMetrics); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestAutofillDialogController : public AutofillDialogControllerImpl { 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestAutofillDialogController(content::WebContents* contents, 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FormData& form_data, 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const AutofillMetrics& metric_logger, 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<content::MessageLoopRunner> runner, 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const DialogType dialog_type) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : AutofillDialogControllerImpl(contents, 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) form_data, 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL(), 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dialog_type, 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&MockCallback)), 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) metric_logger_(metric_logger), 1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch mock_wallet_client_( 1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Profile::FromBrowserContext(contents->GetBrowserContext())-> 1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GetRequestContext(), this), 112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch message_loop_runner_(runner), 113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) use_validation_(false), 114a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) weak_ptr_factory_(this) {} 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~TestAutofillDialogController() {} 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void ViewClosed() OVERRIDE { 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) message_loop_runner_->Quit(); 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillDialogControllerImpl::ViewClosed(); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 123a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual string16 InputValidityMessage( 1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DialogSection section, 1253240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch ServerFieldType type, 1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const string16& value) OVERRIDE { 127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!use_validation_) 128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return string16(); 129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return AutofillDialogControllerImpl::InputValidityMessage( 130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch section, type, value); 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ValidityData InputsAreValid( 1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DialogSection section, 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const DetailOutputMap& inputs, 1367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ValidationType validation_type) OVERRIDE { 137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!use_validation_) 138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return ValidityData(); 139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return AutofillDialogControllerImpl::InputsAreValid( 140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch section, inputs, validation_type); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1434311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // Saving to Chrome is tested in AutofillDialogControllerImpl unit tests. 14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // TODO(estade): test that the view defaults to saving to Chrome. 14590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual bool ShouldOfferToSaveInChrome() const OVERRIDE { 14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return false; 14790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 14890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Increase visibility for testing. 150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) using AutofillDialogControllerImpl::view; 151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) using AutofillDialogControllerImpl::input_showing_popup; 152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual std::vector<DialogNotification> CurrentNotifications() OVERRIDE { 154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return notifications_; 155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void set_notifications(const std::vector<DialogNotification>& notifications) { 158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) notifications_ = notifications; 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestPersonalDataManager* GetTestingManager() { 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return &test_manager_; 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) using AutofillDialogControllerImpl::IsEditingExistingData; 166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch using AutofillDialogControllerImpl::IsManuallyEditingSection; 167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void set_use_validation(bool use_validation) { 169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch use_validation_ = use_validation; 170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 17190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 172a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::WeakPtr<TestAutofillDialogController> AsWeakPtr() { 173a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return weak_ptr_factory_.GetWeakPtr(); 174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual PersonalDataManager* GetManager() OVERRIDE { 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return &test_manager_; 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual wallet::WalletClient* GetWalletClient() OVERRIDE { 1827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return &mock_wallet_client_; 1837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // To specify our own metric logger. 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual const AutofillMetrics& GetMetricLogger() const OVERRIDE { 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return metric_logger_; 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const AutofillMetrics& metric_logger_; 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestPersonalDataManager test_manager_; 1937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch testing::NiceMock<wallet::MockWalletClient> mock_wallet_client_; 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<content::MessageLoopRunner> message_loop_runner_; 195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool use_validation_; 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // A list of notifications to show in the notification area of the dialog. 198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // This is used to control what |CurrentNotifications()| returns for testing. 199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::vector<DialogNotification> notifications_; 200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 201a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Allows generation of WeakPtrs, so controller liveness can be tested. 202a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::WeakPtrFactory<TestAutofillDialogController> weak_ptr_factory_; 203a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestAutofillDialogController); 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class AutofillDialogControllerTest : public InProcessBrowserTest { 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillDialogControllerTest() {} 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~AutofillDialogControllerTest() {} 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 214a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 215a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) autofill::test::DisableSystemServices(browser()->profile()); 216a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 217a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 218a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 219a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CommandLine::ForCurrentProcess()->AppendSwitch( 220a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) switches::kEnableInteractiveAutocomplete); 221a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 222a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void InitializeControllerOfType(DialogType dialog_type) { 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FormData form; 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) form.name = ASCIIToUTF16("TestForm"); 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) form.method = ASCIIToUTF16("POST"); 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) form.origin = GURL("http://example.com/form.html"); 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) form.action = GURL("http://example.com/submit.html"); 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) form.user_submitted = true; 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FormFieldData field; 232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch field.autocomplete_attribute = "shipping tel"; 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) form.fields.push_back(field); 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) message_loop_runner_ = new content::MessageLoopRunner; 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller_ = new TestAutofillDialogController( 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetActiveWebContents(), 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) form, 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) metric_logger_, 240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) message_loop_runner_, 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dialog_type); 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller_->Show(); 243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents* GetActiveWebContents() { 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return browser()->tab_strip_model()->GetActiveWebContents(); 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const MockAutofillMetrics& metric_logger() { return metric_logger_; } 250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestAutofillDialogController* controller() { return controller_; } 251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void RunMessageLoop() { 253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) message_loop_runner_->Run(); 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Loads an HTML page in |GetActiveWebContents()| with markup as follows: 257eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // <form>|form_inner_html|</form>. After loading, emulates a click event on 258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // the page as requestAutocomplete() must be in response to a user gesture. 259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Returns the |AutofillDialogControllerImpl| created by this invocation. 260eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AutofillDialogControllerImpl* SetUpHtmlAndInvoke( 261eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& form_inner_html) { 262eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch content::WebContents* contents = GetActiveWebContents(); 263eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TabAutofillManagerDelegate* delegate = 264eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TabAutofillManagerDelegate::FromWebContents(contents); 265eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(!delegate->GetDialogControllerForTesting()); 266eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 267eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ui_test_utils::NavigateToURL( 268eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch browser(), GURL(std::string("data:text/html,") + 269eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "<!doctype html>" 270eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "<html>" 271eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "<body>" 272eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "<form>" + form_inner_html + "</form>" 273eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "<script>" 274eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "function send(msg) {" 275eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "domAutomationController.setAutomationId(0);" 276eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "domAutomationController.send(msg);" 277eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "}" 278eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "document.forms[0].onautocompleteerror = function(e) {" 279eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "send('error: ' + e.reason);" 280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "};" 281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "document.forms[0].onautocomplete = function() {" 282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "send('success');" 283eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "};" 284eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "window.onclick = function() {" 285eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "document.forms[0].requestAutocomplete();" 286eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "send('clicked');" 287eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "};" 288eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "</script>" 289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "</body>" 290eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "</html>")); 291eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch content::WaitForLoadStop(contents); 292eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 293eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch dom_message_queue_.reset(new content::DOMMessageQueue); 294eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 295eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Triggers the onclick handler which invokes requestAutocomplete(). 296eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch content::SimulateMouseClick(contents, 0, WebKit::WebMouseEvent::ButtonLeft); 297eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ExpectDomMessage("clicked"); 298eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 299eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AutofillDialogControllerImpl* controller = 3004311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch static_cast<AutofillDialogControllerImpl*>( 3014311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch delegate->GetDialogControllerForTesting()); 302eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(controller); 303eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return controller; 304eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 305eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 306eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Wait for a message from the DOM automation controller (from JS in the 307eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // page). Requires |SetUpHtmlAndInvoke()| be called first. 308eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void ExpectDomMessage(const std::string& expected) { 309eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string message; 310eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(dom_message_queue_->WaitForMessage(&message)); 311eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch dom_message_queue_->ClearQueue(); 312eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("\"" + expected + "\"", message); 313eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 314eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 315eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void AddCreditcardToProfile(Profile* profile, const CreditCard& card) { 316eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PersonalDataManagerFactory::GetForProfile(profile)->AddCreditCard(card); 317eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WaitForWebDB(); 318eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 319eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 320eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void AddAutofillProfileToProfile(Profile* profile, 321eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const AutofillProfile& autofill_profile) { 322eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PersonalDataManagerFactory::GetForProfile(profile)->AddProfile( 323eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch autofill_profile); 324eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WaitForWebDB(); 325eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 326eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 328eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void WaitForWebDB() { 329eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch content::RunAllPendingInMessageLoop(content::BrowserThread::DB); 330eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 331eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockAutofillMetrics metric_logger_; 333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestAutofillDialogController* controller_; // Weak reference. 334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<content::MessageLoopRunner> message_loop_runner_; 335eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<content::DOMMessageQueue> dom_message_queue_; 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(AutofillDialogControllerTest); 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(TOOLKIT_VIEWS) || defined(OS_MACOSX) 340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Submit the form data. 341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, Submit) { 342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InitializeControllerOfType(DIALOG_TYPE_REQUEST_AUTOCOMPLETE); 343eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch controller()->GetTestableView()->SubmitForTesting(); 344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RunMessageLoop(); 346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(AutofillMetrics::DIALOG_ACCEPTED, 348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) metric_logger().dialog_dismissal_action()); 349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(DIALOG_TYPE_REQUEST_AUTOCOMPLETE, metric_logger().dialog_type()); 350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Cancel out of the dialog. 353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, Cancel) { 354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InitializeControllerOfType(DIALOG_TYPE_REQUEST_AUTOCOMPLETE); 355eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch controller()->GetTestableView()->CancelForTesting(); 356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RunMessageLoop(); 358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(AutofillMetrics::DIALOG_CANCELED, 360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) metric_logger().dialog_dismissal_action()); 361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(DIALOG_TYPE_REQUEST_AUTOCOMPLETE, metric_logger().dialog_type()); 362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Take some other action that dismisses the dialog. 365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, Hide) { 366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InitializeControllerOfType(DIALOG_TYPE_REQUEST_AUTOCOMPLETE); 367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller()->Hide(); 368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RunMessageLoop(); 370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(AutofillMetrics::DIALOG_CANCELED, 372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) metric_logger().dialog_dismissal_action()); 373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(DIALOG_TYPE_REQUEST_AUTOCOMPLETE, metric_logger().dialog_type()); 374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 376a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Ensure that Hide() will only destroy the controller object after the 377a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// message loop has run. Otherwise, there may be read-after-free issues 378a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// during some tests. 379a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, DeferredDestruction) { 380a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) InitializeControllerOfType(DIALOG_TYPE_REQUEST_AUTOCOMPLETE); 381a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 382a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::WeakPtr<TestAutofillDialogController> weak_ptr = 383a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) controller()->AsWeakPtr(); 384a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(weak_ptr.get()); 385a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 386a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) controller()->Hide(); 387a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(weak_ptr.get()); 388a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 389a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RunMessageLoop(); 390a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(weak_ptr.get()); 391a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 392a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Ensure that the expected metric is logged when the dialog is closed during 3947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// signin. 3957dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, CloseDuringSignin) { 3967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch InitializeControllerOfType(DIALOG_TYPE_REQUEST_AUTOCOMPLETE); 3977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch controller()->SignInLinkClicked(); 3987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_CALL(metric_logger(), 4007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LogDialogDismissalState( 4017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DIALOG_TYPE_REQUEST_AUTOCOMPLETE, 4027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch AutofillMetrics::DIALOG_CANCELED_DURING_SIGNIN)); 4037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch controller()->GetTestableView()->CancelForTesting(); 4047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch RunMessageLoop(); 4067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(AutofillMetrics::DIALOG_CANCELED, 4087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch metric_logger().dialog_dismissal_action()); 4097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(DIALOG_TYPE_REQUEST_AUTOCOMPLETE, metric_logger().dialog_type()); 4107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 4117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Test Autocheckout success metrics. 413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, AutocheckoutSuccess) { 414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InitializeControllerOfType(DIALOG_TYPE_AUTOCHECKOUT); 415eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch controller()->GetTestableView()->SubmitForTesting(); 416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(AutofillMetrics::DIALOG_ACCEPTED, 418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) metric_logger().dialog_dismissal_action()); 419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(DIALOG_TYPE_AUTOCHECKOUT, metric_logger().dialog_type()); 420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 42190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) controller()->OnAutocheckoutSuccess(); 422eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch controller()->GetTestableView()->CancelForTesting(); 423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RunMessageLoop(); 424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(AutofillMetrics::AUTOCHECKOUT_SUCCEEDED, 426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) metric_logger().autocheckout_status()); 4277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Ensure closing the dialog doesn't fire any new metrics. 4297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(AutofillMetrics::DIALOG_ACCEPTED, 4307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) metric_logger().dialog_dismissal_action()); 4317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(DIALOG_TYPE_AUTOCHECKOUT, metric_logger().dialog_type()); 432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Test Autocheckout failure metric. 435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, AutocheckoutError) { 436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InitializeControllerOfType(DIALOG_TYPE_AUTOCHECKOUT); 437eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch controller()->GetTestableView()->SubmitForTesting(); 438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(AutofillMetrics::DIALOG_ACCEPTED, 440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) metric_logger().dialog_dismissal_action()); 441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(DIALOG_TYPE_AUTOCHECKOUT, metric_logger().dialog_type()); 442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller()->OnAutocheckoutError(); 444eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch controller()->GetTestableView()->CancelForTesting(); 445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RunMessageLoop(); 446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(AutofillMetrics::AUTOCHECKOUT_FAILED, 448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) metric_logger().autocheckout_status()); 4497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Ensure closing the dialog doesn't fire any new metrics. 4517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(AutofillMetrics::DIALOG_ACCEPTED, 4527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) metric_logger().dialog_dismissal_action()); 4537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(DIALOG_TYPE_AUTOCHECKOUT, metric_logger().dialog_type()); 4547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, AutocheckoutCancelled) { 4577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) InitializeControllerOfType(DIALOG_TYPE_AUTOCHECKOUT); 458eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch controller()->GetTestableView()->SubmitForTesting(); 4597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(AutofillMetrics::DIALOG_ACCEPTED, 4617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) metric_logger().dialog_dismissal_action()); 4627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(DIALOG_TYPE_AUTOCHECKOUT, metric_logger().dialog_type()); 4637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 464eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch controller()->GetTestableView()->CancelForTesting(); 4657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) RunMessageLoop(); 4667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(AutofillMetrics::AUTOCHECKOUT_CANCELLED, 4687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) metric_logger().autocheckout_status()); 4697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Ensure closing the dialog doesn't fire any new metrics. 4717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(AutofillMetrics::DIALOG_ACCEPTED, 4727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) metric_logger().dialog_dismissal_action()); 4737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(DIALOG_TYPE_AUTOCHECKOUT, metric_logger().dialog_type()); 474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 476fb250657ef40d7500f20882d5c9909c1013367d3Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, FillInputFromAutofill) { 477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InitializeControllerOfType(DIALOG_TYPE_REQUEST_AUTOCOMPLETE); 478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AutofillProfile full_profile(test::GetFullProfile()); 480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller()->GetTestingManager()->AddTestingProfile(&full_profile); 481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const DetailInputs& inputs = 483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller()->RequestedFieldsForSection(SECTION_SHIPPING); 484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const DetailInput& triggering_input = inputs[0]; 485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) string16 value = full_profile.GetRawInfo(triggering_input.type); 486eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestableAutofillDialogView* view = controller()->GetTestableView(); 487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view->SetTextContentsOfInput(triggering_input, 488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) value.substr(0, value.size() / 2)); 489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view->ActivateInput(triggering_input); 490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(&triggering_input, controller()->input_showing_popup()); 492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller()->DidAcceptSuggestion(string16(), 0); 493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // All inputs should be filled. 495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AutofillProfileWrapper wrapper(&full_profile, 0); 496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < inputs.size(); ++i) { 4973240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch EXPECT_EQ(wrapper.GetInfo(AutofillType(inputs[i].type)), 498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view->GetTextContentsOfInput(inputs[i])); 499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Now simulate some user edits and try again. 502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<string16> expectations; 503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < inputs.size(); ++i) { 504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) string16 users_input = i % 2 == 0 ? string16() : ASCIIToUTF16("dummy"); 505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view->SetTextContentsOfInput(inputs[i], users_input); 506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Empty inputs should be filled, others should be left alone. 507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) string16 expectation = 508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &inputs[i] == &triggering_input || users_input.empty() ? 5093240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch wrapper.GetInfo(AutofillType(inputs[i].type)) : 510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) users_input; 511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) expectations.push_back(expectation); 512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view->SetTextContentsOfInput(triggering_input, 515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) value.substr(0, value.size() / 2)); 516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view->ActivateInput(triggering_input); 517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(&triggering_input, controller()->input_showing_popup()); 518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller()->DidAcceptSuggestion(string16(), 0); 519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < inputs.size(); ++i) { 521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(expectations[i], view->GetTextContentsOfInput(inputs[i])); 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 524b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 525eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Test that Autocheckout steps are shown after submitting the 526b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// dialog for controller with type DIALOG_TYPE_AUTOCHECKOUT. 5277dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, AutocheckoutShowsSteps) { 528b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) InitializeControllerOfType(DIALOG_TYPE_AUTOCHECKOUT); 529eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch controller()->AddAutocheckoutStep(AUTOCHECKOUT_STEP_PROXY_CARD); 530eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 531b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(controller()->ShouldShowDetailArea()); 532eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(controller()->CurrentAutocheckoutSteps().empty()); 533b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_FALSE(controller()->ShouldShowProgressBar()); 534b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 535eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch controller()->GetTestableView()->SubmitForTesting(); 536b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_FALSE(controller()->ShouldShowDetailArea()); 537eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(controller()->CurrentAutocheckoutSteps().empty()); 538b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(controller()->ShouldShowProgressBar()); 539ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch controller()->GetTestableView()->CancelForTesting(); 540ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch RunMessageLoop(); 541b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 542b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 543eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Test that Autocheckout steps are not showing after submitting the 544b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// dialog for controller with type DIALOG_TYPE_REQUEST_AUTOCOMPLETE. 545b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, 546a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RequestAutocompleteDoesntShowSteps) { 547b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) InitializeControllerOfType(DIALOG_TYPE_REQUEST_AUTOCOMPLETE); 548eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch controller()->AddAutocheckoutStep(AUTOCHECKOUT_STEP_PROXY_CARD); 549eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 550b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(controller()->ShouldShowDetailArea()); 551eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(controller()->CurrentAutocheckoutSteps().empty()); 552b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_FALSE(controller()->ShouldShowProgressBar()); 553b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 554eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch controller()->GetTestableView()->SubmitForTesting(); 555b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(controller()->ShouldShowDetailArea()); 556eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(controller()->CurrentAutocheckoutSteps().empty()); 557b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_FALSE(controller()->ShouldShowProgressBar()); 558b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 559b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 560b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// Tests that changing the value of a CC expiration date combobox works as 561b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// expected when Autofill is used to fill text inputs. 5624311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// 5634311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// Flaky on Win7, WinXP, and Win Aura. http://crbug.com/270314. 5644311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// TODO(groby): Enable this test on mac once AutofillDialogCocoa handles 5654311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// comboboxes for GetTextContentsForInput. http://crbug.com/270205 5664311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#if defined(OS_MACOSX) || defined(OS_WIN) 5674311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#define MAYBE_FillComboboxFromAutofill DISABLED_FillComboboxFromAutofill 5684311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#else 5694311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#define MAYBE_FillComboboxFromAutofill FillComboboxFromAutofill 5704311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#endif 5717dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, 5724311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch MAYBE_FillComboboxFromAutofill) { 573b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) InitializeControllerOfType(DIALOG_TYPE_REQUEST_AUTOCOMPLETE); 574b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 575b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) CreditCard card1; 576b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) test::SetCreditCardInfo(&card1, "JJ Smith", "4111111111111111", "12", "2018"); 577b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) controller()->GetTestingManager()->AddTestingCreditCard(&card1); 578b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) CreditCard card2; 579b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) test::SetCreditCardInfo(&card2, "B Bird", "3111111111111111", "11", "2017"); 580b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) controller()->GetTestingManager()->AddTestingCreditCard(&card2); 581b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) AutofillProfile full_profile(test::GetFullProfile()); 582b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) controller()->GetTestingManager()->AddTestingProfile(&full_profile); 583b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 584b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const DetailInputs& inputs = 585b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) controller()->RequestedFieldsForSection(SECTION_CC); 586b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const DetailInput& triggering_input = inputs[0]; 587b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) string16 value = card1.GetRawInfo(triggering_input.type); 588eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestableAutofillDialogView* view = controller()->GetTestableView(); 589b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) view->SetTextContentsOfInput(triggering_input, 590b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) value.substr(0, value.size() / 2)); 591b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) view->ActivateInput(triggering_input); 592b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 593b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ASSERT_EQ(&triggering_input, controller()->input_showing_popup()); 594b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) controller()->DidAcceptSuggestion(string16(), 0); 595b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 596b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // All inputs should be filled. 597b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) AutofillCreditCardWrapper wrapper1(&card1); 598b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) for (size_t i = 0; i < inputs.size(); ++i) { 5993240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch EXPECT_EQ(wrapper1.GetInfo(AutofillType(inputs[i].type)), 600b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) view->GetTextContentsOfInput(inputs[i])); 601b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 602b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 603b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Try again with different data. Only expiration date and the triggering 604b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // input should be overwritten. 605b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) value = card2.GetRawInfo(triggering_input.type); 606b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) view->SetTextContentsOfInput(triggering_input, 607b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) value.substr(0, value.size() / 2)); 608b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) view->ActivateInput(triggering_input); 609b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ASSERT_EQ(&triggering_input, controller()->input_showing_popup()); 610b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) controller()->DidAcceptSuggestion(string16(), 0); 611b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 612b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) AutofillCreditCardWrapper wrapper2(&card2); 613b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) for (size_t i = 0; i < inputs.size(); ++i) { 614b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const DetailInput& input = inputs[i]; 615b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (&input == &triggering_input || 616b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) input.type == CREDIT_CARD_EXP_MONTH || 617b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) input.type == CREDIT_CARD_EXP_4_DIGIT_YEAR) { 6183240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch EXPECT_EQ(wrapper2.GetInfo(AutofillType(input.type)), 619b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) view->GetTextContentsOfInput(input)); 620b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } else if (input.type == CREDIT_CARD_VERIFICATION_CODE) { 621b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(view->GetTextContentsOfInput(input).empty()); 622b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } else { 6233240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch EXPECT_EQ(wrapper1.GetInfo(AutofillType(input.type)), 624b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) view->GetTextContentsOfInput(input)); 625b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 626b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 627b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 628b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Now fill from a profile. It should not overwrite any CC info. 629b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const DetailInputs& billing_inputs = 630b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) controller()->RequestedFieldsForSection(SECTION_BILLING); 631b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const DetailInput& billing_triggering_input = billing_inputs[0]; 632b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) value = full_profile.GetRawInfo(triggering_input.type); 633b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) view->SetTextContentsOfInput(billing_triggering_input, 634b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) value.substr(0, value.size() / 2)); 635b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) view->ActivateInput(billing_triggering_input); 636b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 637b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ASSERT_EQ(&billing_triggering_input, controller()->input_showing_popup()); 638b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) controller()->DidAcceptSuggestion(string16(), 0); 639b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 640b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) for (size_t i = 0; i < inputs.size(); ++i) { 641b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const DetailInput& input = inputs[i]; 642b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (&input == &triggering_input || 643b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) input.type == CREDIT_CARD_EXP_MONTH || 644b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) input.type == CREDIT_CARD_EXP_4_DIGIT_YEAR) { 6453240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch EXPECT_EQ(wrapper2.GetInfo(AutofillType(input.type)), 646b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) view->GetTextContentsOfInput(input)); 647b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } else if (input.type == CREDIT_CARD_VERIFICATION_CODE) { 648b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(view->GetTextContentsOfInput(input).empty()); 649b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } else { 6503240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch EXPECT_EQ(wrapper1.GetInfo(AutofillType(input.type)), 651b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) view->GetTextContentsOfInput(input)); 652b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 653b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 654b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 65590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 65690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Tests that credit card number is disabled while editing a Wallet instrument. 65790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, WalletCreditCardDisabled) { 65890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) InitializeControllerOfType(DIALOG_TYPE_REQUEST_AUTOCOMPLETE); 65990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) controller()->OnUserNameFetchSuccess("user@example.com"); 66090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 66190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<wallet::WalletItems> wallet_items = wallet::GetTestWalletItems(); 66290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) wallet_items->AddInstrument(wallet::GetTestMaskedInstrument()); 66390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) controller()->OnDidGetWalletItems(wallet_items.Pass()); 66490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 66590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Click "Edit" in the billing section (while using Wallet). 66690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) controller()->EditClickedForSection(SECTION_CC_BILLING); 66790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 66890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const DetailInputs& edit_inputs = 66990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) controller()->RequestedFieldsForSection(SECTION_CC_BILLING); 67090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) size_t i; 67190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (i = 0; i < edit_inputs.size(); ++i) { 67290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (edit_inputs[i].type == CREDIT_CARD_NUMBER) { 67390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(edit_inputs[i].editable); 67490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 67590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 67690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 67790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_LT(i, edit_inputs.size()); 67890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 67990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Select "Add new billing info..." while using Wallet. 68090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ui::MenuModel* model = controller()->MenuModelForSection(SECTION_CC_BILLING); 68190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) model->ActivatedAt(model->GetItemCount() - 2); 68290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 68390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const DetailInputs& add_inputs = 68490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) controller()->RequestedFieldsForSection(SECTION_CC_BILLING); 68590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (i = 0; i < add_inputs.size(); ++i) { 68690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (add_inputs[i].type == CREDIT_CARD_NUMBER) { 68790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(add_inputs[i].editable); 68890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 68990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 69090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 69190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_LT(i, add_inputs.size()); 69290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 693868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 694868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Ensure that expired cards trigger invalid suggestions. 695868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, ExpiredCard) { 696868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) InitializeControllerOfType(DIALOG_TYPE_REQUEST_AUTOCOMPLETE); 697868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 698868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CreditCard verified_card(test::GetCreditCard()); 699868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) verified_card.set_origin("Chrome settings"); 700868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(verified_card.IsVerified()); 701868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) controller()->GetTestingManager()->AddTestingCreditCard(&verified_card); 702868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 703868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CreditCard expired_card(test::GetCreditCard()); 704868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) expired_card.set_origin("Chrome settings"); 705868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) expired_card.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("2007")); 706868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(expired_card.IsVerified()); 707868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_FALSE( 708868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) autofill::IsValidCreditCardExpirationDate( 709868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) expired_card.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR), 710868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) expired_card.GetRawInfo(CREDIT_CARD_EXP_MONTH), 711868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::Time::Now())); 712868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) controller()->GetTestingManager()->AddTestingCreditCard(&expired_card); 713868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 714868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ui::MenuModel* model = controller()->MenuModelForSection(SECTION_CC); 715868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_EQ(4, model->GetItemCount()); 716868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 717868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(model->IsItemCheckedAt(0)); 718868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(controller()->IsEditingExistingData(SECTION_CC)); 719868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 720868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) model->ActivatedAt(1); 721868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(model->IsItemCheckedAt(1)); 722868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(controller()->IsEditingExistingData(SECTION_CC)); 723868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 724868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 725868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Notifications with long message text should not make the dialog bigger. 726868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, LongNotifications) { 727868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) InitializeControllerOfType(DIALOG_TYPE_REQUEST_AUTOCOMPLETE); 728868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 729868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const gfx::Size no_notification_size = 730eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch controller()->GetTestableView()->GetSize(); 731868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_GT(no_notification_size.width(), 0); 732868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 733868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::vector<DialogNotification> notifications; 734868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) notifications.push_back( 735868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DialogNotification(DialogNotification::DEVELOPER_WARNING, ASCIIToUTF16( 736868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do " 737868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim " 738868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut " 739868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "aliquip ex ea commodo consequat. Duis aute irure dolor in " 740868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla " 741868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "pariatur. Excepteur sint occaecat cupidatat non proident, sunt in " 742868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "culpa qui officia deserunt mollit anim id est laborum."))); 743868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) controller()->set_notifications(notifications); 744868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) controller()->view()->UpdateNotificationArea(); 745868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 746868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(no_notification_size.width(), 747eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch controller()->GetTestableView()->GetSize().width()); 748eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 749eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 750a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, AutocompleteEvent) { 751eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AutofillDialogControllerImpl* controller = 752eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetUpHtmlAndInvoke("<input autocomplete='cc-name'>"); 753eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 754eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AddCreditcardToProfile(controller->profile(), test::GetVerifiedCreditCard()); 755eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AddAutofillProfileToProfile(controller->profile(), 756eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch test::GetVerifiedProfile()); 757eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 758eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestableAutofillDialogView* view = controller->GetTestableView(); 759eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch view->SetTextContentsOfSuggestionInput(SECTION_CC, ASCIIToUTF16("123")); 760eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch view->SubmitForTesting(); 761eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ExpectDomMessage("success"); 762eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 763eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 764eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochIN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, 765a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) AutocompleteErrorEventReasonInvalid) { 766eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AutofillDialogControllerImpl* controller = 767eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetUpHtmlAndInvoke("<input autocomplete='cc-name' pattern='.*zebra.*'>"); 768eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 769eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const CreditCard& credit_card = test::GetVerifiedCreditCard(); 770eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE( 771eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch credit_card.GetRawInfo(CREDIT_CARD_NAME).find(ASCIIToUTF16("zebra")) == 772eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::string16::npos); 773eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AddCreditcardToProfile(controller->profile(), credit_card); 774eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AddAutofillProfileToProfile(controller->profile(), 775eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch test::GetVerifiedProfile()); 776eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 777eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestableAutofillDialogView* view = controller->GetTestableView(); 778eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch view->SetTextContentsOfSuggestionInput(SECTION_CC, ASCIIToUTF16("123")); 779eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch view->SubmitForTesting(); 780eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ExpectDomMessage("error: invalid"); 781eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 782eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 783eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochIN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, 784a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) AutocompleteErrorEventReasonCancel) { 785eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetUpHtmlAndInvoke("<input autocomplete='cc-name'>")->GetTestableView()-> 786eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CancelForTesting(); 787eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ExpectDomMessage("error: cancel"); 788eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 789eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 790eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochIN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, NoCvcSegfault) { 791eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch InitializeControllerOfType(DIALOG_TYPE_REQUEST_AUTOCOMPLETE); 792eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch controller()->set_use_validation(true); 793eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 794eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CreditCard credit_card(test::GetVerifiedCreditCard()); 795eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch controller()->GetTestingManager()->AddTestingCreditCard(&credit_card); 796eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(controller()->IsEditingExistingData(SECTION_CC)); 797eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 798eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_NO_FATAL_FAILURE( 799eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch controller()->GetTestableView()->SubmitForTesting()); 800eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 801eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 8024311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// Flaky on Win7, WinXP, and Win Aura. http://crbug.com/270314. 8034311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#if defined(OS_WIN) 8044311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#define MAYBE_PreservedSections DISABLED_PreservedSections 8054311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#else 8064311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#define MAYBE_PreservedSections PreservedSections 8074311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#endif 8084311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochIN_PROC_BROWSER_TEST_F(AutofillDialogControllerTest, MAYBE_PreservedSections) { 809eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch InitializeControllerOfType(DIALOG_TYPE_REQUEST_AUTOCOMPLETE); 810eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch controller()->set_use_validation(true); 811eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 812eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Set up some Autofill state. 813eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CreditCard credit_card(test::GetVerifiedCreditCard()); 814eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch controller()->GetTestingManager()->AddTestingCreditCard(&credit_card); 815eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 816eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AutofillProfile profile(test::GetVerifiedProfile()); 817eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch controller()->GetTestingManager()->AddTestingProfile(&profile); 818eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 819eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(controller()->SectionIsActive(SECTION_CC)); 820eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(controller()->SectionIsActive(SECTION_BILLING)); 821eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(controller()->SectionIsActive(SECTION_CC_BILLING)); 822eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(controller()->SectionIsActive(SECTION_SHIPPING)); 823eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 824eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(controller()->IsManuallyEditingSection(SECTION_CC)); 825eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(controller()->IsManuallyEditingSection(SECTION_BILLING)); 826eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(controller()->IsManuallyEditingSection(SECTION_SHIPPING)); 827eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 828eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Set up some Wallet state. 829eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch controller()->OnUserNameFetchSuccess("user@example.com"); 830eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch controller()->OnDidGetWalletItems(wallet::GetTestWalletItems()); 831eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 832eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ui::MenuModel* account_chooser = controller()->MenuModelForAccountChooser(); 833eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(account_chooser->IsItemCheckedAt(0)); 834eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 835eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Check that the view's in the state we expect before starting to simulate 836eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // user input. 837eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(controller()->SectionIsActive(SECTION_CC)); 838eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(controller()->SectionIsActive(SECTION_BILLING)); 839eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(controller()->SectionIsActive(SECTION_CC_BILLING)); 840eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(controller()->SectionIsActive(SECTION_SHIPPING)); 841eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 842eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(controller()->IsManuallyEditingSection(SECTION_CC_BILLING)); 843eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 844eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Create some valid inputted billing data. 8457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const DetailInput& cc_number = 8467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch controller()->RequestedFieldsForSection(SECTION_CC_BILLING)[0]; 8477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(CREDIT_CARD_NUMBER, cc_number.type); 848eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestableAutofillDialogView* view = controller()->GetTestableView(); 8497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch view->SetTextContentsOfInput(cc_number, ASCIIToUTF16("4111111111111111")); 850eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 851eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Select "Add new shipping info..." from suggestions menu. 852eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ui::MenuModel* shipping_model = 853eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch controller()->MenuModelForSection(SECTION_SHIPPING); 854eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch shipping_model->ActivatedAt(shipping_model->GetItemCount() - 2); 855eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 856eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(controller()->IsManuallyEditingSection(SECTION_SHIPPING)); 857eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 858eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Create some invalid, manually inputted shipping data. 859eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const DetailInput& shipping_zip = 860eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch controller()->RequestedFieldsForSection(SECTION_SHIPPING)[5]; 861eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_EQ(ADDRESS_HOME_ZIP, shipping_zip.type); 862eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch view->SetTextContentsOfInput(shipping_zip, ASCIIToUTF16("shipping zip")); 863eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 864eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Switch to using Autofill. 865eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch account_chooser->ActivatedAt(1); 866eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 867eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Check that appropriate sections are preserved and in manually editing mode 868eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // (or disabled, in the case of the combined cc + billing section). 869eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(controller()->SectionIsActive(SECTION_CC)); 870eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(controller()->SectionIsActive(SECTION_BILLING)); 871eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(controller()->SectionIsActive(SECTION_CC_BILLING)); 872eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(controller()->SectionIsActive(SECTION_SHIPPING)); 873eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 874eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(controller()->IsManuallyEditingSection(SECTION_CC)); 875eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(controller()->IsManuallyEditingSection(SECTION_BILLING)); 876eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(controller()->IsManuallyEditingSection(SECTION_SHIPPING)); 877eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 8787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const DetailInput& new_cc_number = 8797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch controller()->RequestedFieldsForSection(SECTION_CC).front(); 8807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(cc_number.type, new_cc_number.type); 8817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(ASCIIToUTF16("4111111111111111"), 8827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch view->GetTextContentsOfInput(new_cc_number)); 883eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 884eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_NE(ASCIIToUTF16("shipping name"), 885eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch view->GetTextContentsOfInput(shipping_zip)); 886868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 8877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif // defined(TOOLKIT_VIEWS) || defined(OS_MACOSX) 8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace autofill 890