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