autofill_interactive_uitest.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include <string>
6ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
7ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/basictypes.h"
8ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/command_line.h"
9ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/file_util.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/ref_counted.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
12ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/rand_util.h"
13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/strings/string16.h"
14ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/strings/string_number_conversions.h"
15ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/strings/string_split.h"
16ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/strings/utf_string_conversions.h"
17ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/time/time.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/autofill/personal_data_manager_factory.h"
197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/infobars/confirm_infobar_delegate.h"
21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/infobars/infobar.h"
22ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/infobars/infobar_service.h"
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/profiles/profile.h"
24ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/translate/translate_infobar_delegate.h"
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/translate/translate_service.h"
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/translate/translate_tab_helper.h"
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/browser.h"
28ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/ui/browser_window.h"
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
30ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/common/render_messages.h"
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
32ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/test/base/test_switches.h"
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/autofill/content/browser/content_autofill_driver.h"
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_manager.h"
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_manager_test_delegate.h"
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_profile.h"
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/autofill/core/browser/autofill_test_utils.h"
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/personal_data_manager.h"
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/personal_data_manager_observer.h"
41ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/autofill/core/browser/validation.h"
42ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/browser/navigation_controller.h"
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/notification_observer.h"
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/notification_registrar.h"
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/notification_service.h"
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/render_view_host.h"
470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "content/public/browser/render_widget_host.h"
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/web_contents.h"
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/test/browser_test_utils.h"
50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/test/test_renderer_host.h"
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/test/test_utils.h"
52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "net/url_request/test_url_fetcher_factory.h"
53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "testing/gmock/include/gmock/gmock.h"
54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "testing/gtest/include/gtest/gtest.h"
55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h"
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16;
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace autofill {
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
61ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochstatic const char* kDataURIPrefix = "data:text/html;charset=utf-8,";
62ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochstatic const char* kTestFormString =
63ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "<form action=\"http://www.example.com/\" method=\"POST\">"
64ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "<label for=\"firstname\">First name:</label>"
65ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <input type=\"text\" id=\"firstname\""
66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "        onFocus=\"domAutomationController.send(true)\"><br>"
67ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "<label for=\"lastname\">Last name:</label>"
68ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <input type=\"text\" id=\"lastname\"><br>"
69ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "<label for=\"address1\">Address line 1:</label>"
70ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <input type=\"text\" id=\"address1\"><br>"
71ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "<label for=\"address2\">Address line 2:</label>"
72ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <input type=\"text\" id=\"address2\"><br>"
73ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "<label for=\"city\">City:</label>"
74ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <input type=\"text\" id=\"city\"><br>"
75ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "<label for=\"state\">State:</label>"
76ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <select id=\"state\">"
77ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <option value=\"\" selected=\"yes\">--</option>"
78ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <option value=\"CA\">California</option>"
79ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <option value=\"TX\">Texas</option>"
80ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " </select><br>"
81ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "<label for=\"zip\">ZIP code:</label>"
82ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <input type=\"text\" id=\"zip\"><br>"
83ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "<label for=\"country\">Country:</label>"
84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <select id=\"country\">"
85ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <option value=\"\" selected=\"yes\">--</option>"
86ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <option value=\"CA\">Canada</option>"
87ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <option value=\"US\">United States</option>"
88ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " </select><br>"
89ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "<label for=\"phone\">Phone number:</label>"
90ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <input type=\"text\" id=\"phone\"><br>"
91ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "</form>";
92ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
932385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
942385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// AutofillManagerTestDelegateImpl --------------------------------------------
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AutofillManagerTestDelegateImpl
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public autofill::AutofillManagerTestDelegate {
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutofillManagerTestDelegateImpl() {}
1002385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  virtual ~AutofillManagerTestDelegateImpl() {}
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // autofill::AutofillManagerTestDelegate:
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidPreviewFormData() OVERRIDE {
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    loop_runner_->Quit();
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidFillFormData() OVERRIDE {
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    loop_runner_->Quit();
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidShowSuggestions() OVERRIDE {
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    loop_runner_->Quit();
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void Reset() {
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    loop_runner_ = new content::MessageLoopRunner();
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void Wait() {
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    loop_runner_->Run();
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner_;
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AutofillManagerTestDelegateImpl);
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1292385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
1302385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// WindowedPersonalDataManagerObserver ----------------------------------------
1312385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class WindowedPersonalDataManagerObserver
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public PersonalDataManagerObserver,
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      public content::NotificationObserver {
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit WindowedPersonalDataManagerObserver(Browser* browser)
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : alerted_(false),
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        has_run_message_loop_(false),
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        browser_(browser),
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        infobar_service_(NULL) {
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PersonalDataManagerFactory::GetForProfile(browser_->profile())->
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        AddObserver(this);
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    registrar_.Add(this, chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_ADDED,
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   content::NotificationService::AllSources());
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~WindowedPersonalDataManagerObserver() {
1482385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    if (infobar_service_) {
1492385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      while (infobar_service_->infobar_count() > 0) {
1502385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        infobar_service_->RemoveInfoBar(infobar_service_->infobar_at(0));
1512385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      }
1522385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    }
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // PersonalDataManagerObserver:
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnPersonalDataChanged() OVERRIDE {
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (has_run_message_loop_) {
15890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoopForUI::current()->Quit();
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      has_run_message_loop_ = false;
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    alerted_ = true;
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnInsufficientFormData() OVERRIDE {
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    OnPersonalDataChanged();
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // content::NotificationObserver:
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void Observe(int type,
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       const content::NotificationSource& source,
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE {
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    infobar_service_ = InfoBarService::FromWebContents(
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        browser_->tab_strip_model()->GetActiveWebContents());
174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    infobar_service_->infobar_at(0)->delegate()->AsConfirmInfoBarDelegate()->
175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        Accept();
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
178a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void Wait() {
179a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (!alerted_) {
180a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      has_run_message_loop_ = true;
181a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      content::RunMessageLoop();
182a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
183a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    PersonalDataManagerFactory::GetForProfile(browser_->profile())->
184a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        RemoveObserver(this);
185a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
186a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool alerted_;
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool has_run_message_loop_;
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Browser* browser_;
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::NotificationRegistrar registrar_;
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  InfoBarService* infobar_service_;
1932385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
1942385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  DISALLOW_COPY_AND_ASSIGN(WindowedPersonalDataManagerObserver);
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1972385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// AutofillInteractiveTest ----------------------------------------------------
1982385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AutofillInteractiveTest : public InProcessBrowserTest {
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
2010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  AutofillInteractiveTest() :
2020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      key_press_event_sink_(
2030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          base::Bind(&AutofillInteractiveTest::HandleKeyPressEvent,
2040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                     base::Unretained(this))) {}
2052385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  virtual ~AutofillInteractiveTest() {}
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
207a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // InProcessBrowserTest:
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TranslateService::SetUseInfobar(true);
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Don't want Keychain coming up on Mac.
212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    test::DisableSystemServices(browser()->profile()->GetPrefs());
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // Inject the test delegate into the AutofillManager.
2150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    content::WebContents* web_contents = GetWebContents();
216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ContentAutofillDriver* autofill_driver =
217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        ContentAutofillDriver::FromWebContents(web_contents);
2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    AutofillManager* autofill_manager = autofill_driver->autofill_manager();
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    autofill_manager->SetTestDelegate(&test_delegate_);
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CleanUpOnMainThread() OVERRIDE {
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Make sure to close any showing popups prior to tearing down the UI.
2240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    content::WebContents* web_contents = GetWebContents();
225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    AutofillManager* autofill_manager = ContentAutofillDriver::FromWebContents(
226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            web_contents)->autofill_manager();
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    autofill_manager->delegate()->HideAutofillPopup();
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
230a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  PersonalDataManager* GetPersonalDataManager() {
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return PersonalDataManagerFactory::GetForProfile(browser()->profile());
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  content::WebContents* GetWebContents() {
2350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return browser()->tab_strip_model()->GetActiveWebContents();
236a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
237a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  content::RenderViewHost* GetRenderViewHost() {
2390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return GetWebContents()->GetRenderViewHost();
240a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
241a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void CreateTestProfile() {
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    AutofillProfile profile;
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test::SetProfileInfo(
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        &profile, "Milton", "C.", "Waddams",
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "red.swingline@initech.com", "Initech", "4120 Freidrich Lane",
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "Basement", "Austin", "Texas", "78744", "US", "5125551234");
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    WindowedPersonalDataManagerObserver observer(browser());
250a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    GetPersonalDataManager()->AddProfile(profile);
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // AddProfile is asynchronous. Wait for it to finish before continuing the
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // tests.
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    observer.Wait();
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
257ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void SetProfiles(std::vector<AutofillProfile>* profiles) {
258ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    WindowedPersonalDataManagerObserver observer(browser());
259ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    GetPersonalDataManager()->SetProfiles(profiles);
260ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    observer.Wait();
261ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
262ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
263ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void SetProfile(const AutofillProfile& profile) {
264ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    std::vector<AutofillProfile> profiles;
265ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    profiles.push_back(profile);
266ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    SetProfiles(&profiles);
267ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
268ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
269ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Populates a webpage form using autofill data and keypress events.
270ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // This function focuses the specified input field in the form, and then
271ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // sends keypress events to the tab to cause the form to be populated.
272ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void PopulateForm(const std::string& field_id) {
273ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    std::string js("document.getElementById('" + field_id + "').focus();");
274ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ASSERT_TRUE(content::ExecuteScript(GetRenderViewHost(), js));
275ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
276ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    SendKeyToPageAndWait(ui::VKEY_DOWN);
277ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    SendKeyToPopupAndWait(ui::VKEY_DOWN);
278ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    SendKeyToPopupAndWait(ui::VKEY_RETURN);
279ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
280ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ExpectFieldValue(const std::string& field_name,
282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        const std::string& expected_value) {
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::string value;
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(content::ExecuteScriptAndExtractString(
2850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        GetWebContents(),
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "window.domAutomationController.send("
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "    document.getElementById('" + field_name + "').value);",
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        &value));
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(expected_value, value);
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
292ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void SimulateURLFetch(bool success) {
293ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0);
294ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ASSERT_TRUE(fetcher);
295ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    net::URLRequestStatus status;
296ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    status.set_status(success ? net::URLRequestStatus::SUCCESS :
297ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                net::URLRequestStatus::FAILED);
298ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
299ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    std::string script = " var google = {};"
300ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "google.translate = (function() {"
301ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "  return {"
302ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "    TranslateService: function() {"
303ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "      return {"
304ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "        isAvailable : function() {"
305ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "          return true;"
306ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "        },"
307ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "        restore : function() {"
308ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "          return;"
309ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "        },"
310ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "        getDetectedLanguage : function() {"
311ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "          return \"ja\";"
312ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "        },"
313ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "        translatePage : function(originalLang, targetLang,"
314ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "                                 onTranslateProgress) {"
315ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "          document.getElementsByTagName(\"body\")[0].innerHTML = '" +
316ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        std::string(kTestFormString) +
317ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "              ';"
318ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "          onTranslateProgress(100, true, false);"
319ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "        }"
320ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "      };"
321ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "    }"
322ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "  };"
3233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        "})();"
3243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        "cr.googleTranslate.onTranslateElementLoad();";
325ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
326ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    fetcher->set_url(fetcher->GetOriginalURL());
327ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    fetcher->set_status(status);
328ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    fetcher->set_response_code(success ? 200 : 500);
329ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    fetcher->SetResponseString(script);
330ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    fetcher->delegate()->OnURLFetchComplete(fetcher);
331ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
332ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void FocusFirstNameField() {
334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool result = false;
335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
336a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        GetRenderViewHost(),
337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "if (document.readyState === 'complete')"
338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "  document.getElementById('firstname').focus();"
339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "else"
340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "  domAutomationController.send(false);",
341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        &result));
342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(result);
343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ExpectFilledTestForm() {
346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("firstname", "Milton");
347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("lastname", "Waddams");
348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("address1", "4120 Freidrich Lane");
349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("address2", "Basement");
350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("city", "Austin");
351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("state", "TX");
352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("zip", "78744");
353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("country", "US");
354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("phone", "5125551234");
355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SendKeyToPageAndWait(ui::KeyboardCode key) {
358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test_delegate_.Reset();
359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::SimulateKeyPress(
3600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        GetWebContents(), key, false, false, false, false);
361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test_delegate_.Wait();
362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  bool HandleKeyPressEvent(const content::NativeWebKeyboardEvent& event) {
3650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return true;
3660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
3670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SendKeyToPopupAndWait(ui::KeyboardCode key) {
3690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // Route popup-targeted key presses via the render view host.
370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::NativeWebKeyboardEvent event;
371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    event.windowsKeyCode = key;
372f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    event.type = blink::WebKeyboardEvent::RawKeyDown;
373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test_delegate_.Reset();
3740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // Install the key press event sink to ensure that any events that are not
3750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // handled by the installed callbacks do not end up crashing the test.
3760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    GetRenderViewHost()->AddKeyPressEventCallback(key_press_event_sink_);
3770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    GetRenderViewHost()->ForwardKeyboardEvent(event);
378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test_delegate_.Wait();
3790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    GetRenderViewHost()->RemoveKeyPressEventCallback(key_press_event_sink_);
380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
382ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void TryBasicFormFill() {
383ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    FocusFirstNameField();
384ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
385ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // Start filling the first name field with "M" and wait for the popup to be
386ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // shown.
387ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    SendKeyToPageAndWait(ui::VKEY_M);
388ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
389ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // Press the down arrow to select the suggestion and preview the autofilled
390ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // form.
391ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    SendKeyToPopupAndWait(ui::VKEY_DOWN);
392ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
393ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // The previewed values should not be accessible to JavaScript.
394ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ExpectFieldValue("firstname", "M");
395ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ExpectFieldValue("lastname", std::string());
396ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ExpectFieldValue("address1", std::string());
397ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ExpectFieldValue("address2", std::string());
398ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ExpectFieldValue("city", std::string());
399ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ExpectFieldValue("state", std::string());
400ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ExpectFieldValue("zip", std::string());
401ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ExpectFieldValue("country", std::string());
402ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ExpectFieldValue("phone", std::string());
403ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // TODO(isherman): It would be nice to test that the previewed values are
404ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // displayed: http://crbug.com/57220
405ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
406ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // Press Enter to accept the autofill suggestions.
407ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    SendKeyToPopupAndWait(ui::VKEY_RETURN);
408ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
409ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // The form should be filled.
410ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ExpectFilledTestForm();
411ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
412ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
4132385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch private:
414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutofillManagerTestDelegateImpl test_delegate_;
4152385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
416ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  net::TestURLFetcherFactory url_fetcher_factory_;
417ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
4180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // KeyPressEventCallback that serves as a sink to ensure that every key press
4190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // event the tests create and have the WebContents forward is handled by some
4200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // key press event callback. It is necessary to have this sinkbecause if no
4210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // key press event callback handles the event (at least on Mac), a DCHECK
4220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // ends up going off that the |event| doesn't have an |os_event| associated
4230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // with it.
4240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  content::RenderWidgetHost::KeyPressEventCallback key_press_event_sink_;
4250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
4262385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  DISALLOW_COPY_AND_ASSIGN(AutofillInteractiveTest);
427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
429ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test that basic form fill is working.
430ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, BasicFormFill) {
431ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
432ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
433ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Load the test page.
434ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
435ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GURL(std::string(kDataURIPrefix) + kTestFormString)));
4362385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
437ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Invoke Autofill.
438ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  TryBasicFormFill();
439ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
4402385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
441ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test that form filling can be initiated by pressing the down arrow.
442ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, AutofillViaDownArrow) {
443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CreateTestProfile();
444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Load the test page.
446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      GURL(std::string(kDataURIPrefix) + kTestFormString)));
448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Focus a fillable field.
450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FocusFirstNameField();
451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
452ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Press the down arrow to initiate Autofill and wait for the popup to be
453ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // shown.
454ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SendKeyToPageAndWait(ui::VKEY_DOWN);
455ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
456ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Press the down arrow to select the suggestion and preview the autofilled
457ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // form.
458ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SendKeyToPopupAndWait(ui::VKEY_DOWN);
459ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
460ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Press Enter to accept the autofill suggestions.
461ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SendKeyToPopupAndWait(ui::VKEY_RETURN);
462ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
463ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // The form should be filled.
464ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFilledTestForm();
465ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
466ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
467ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, AutofillSelectViaTab) {
468ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
469ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
470ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Load the test page.
471ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
472ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GURL(std::string(kDataURIPrefix) + kTestFormString)));
473ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
474ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Focus a fillable field.
475ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  FocusFirstNameField();
476558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Press the down arrow to initiate Autofill and wait for the popup to be
478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // shown.
479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SendKeyToPageAndWait(ui::VKEY_DOWN);
480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Press the down arrow to select the suggestion and preview the autofilled
482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // form.
483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SendKeyToPopupAndWait(ui::VKEY_DOWN);
484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Press tab to accept the autofill suggestions.
486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SendKeyToPopupAndWait(ui::VKEY_TAB);
487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The form should be filled.
489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ExpectFilledTestForm();
490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
492ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test that a JavaScript onchange event is fired after auto-filling a form.
493ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, OnChangeAfterAutofill) {
494ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
495ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
496ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const char* kOnChangeScript =
497ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "<script>"
498ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "focused_fired = false;"
499ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "unfocused_fired = false;"
500ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "changed_select_fired = false;"
501ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "unchanged_select_fired = false;"
502ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "document.getElementById('firstname').onchange = function() {"
503ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "  focused_fired = true;"
504ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "};"
505ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "document.getElementById('lastname').onchange = function() {"
506ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "  unfocused_fired = true;"
507ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "};"
508ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "document.getElementById('state').onchange = function() {"
509ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "  changed_select_fired = true;"
510ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "};"
511ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "document.getElementById('country').onchange = function() {"
512ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "  unchanged_select_fired = true;"
513ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "};"
514ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "document.getElementById('country').value = 'US';"
515ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "</script>";
516ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
517ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Load the test page.
518ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
519ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GURL(std::string(kDataURIPrefix) + kTestFormString + kOnChangeScript)));
520ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
521ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Invoke Autofill.
522ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  FocusFirstNameField();
523ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
524ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Start filling the first name field with "M" and wait for the popup to be
525ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // shown.
526ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SendKeyToPageAndWait(ui::VKEY_M);
527ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
528ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Press the down arrow to select the suggestion and preview the autofilled
529ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // form.
530ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SendKeyToPopupAndWait(ui::VKEY_DOWN);
531ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
532ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Press Enter to accept the autofill suggestions.
533ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SendKeyToPopupAndWait(ui::VKEY_RETURN);
534ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
535ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // The form should be filled.
536ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFilledTestForm();
537ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
538ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // The change event should have already fired for unfocused fields, both of
539ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // <input> and of <select> type. However, it should not yet have fired for the
540ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // focused field.
541ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool focused_fired = false;
542ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool unfocused_fired = false;
543ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool changed_select_fired = false;
544ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool unchanged_select_fired = false;
545ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
546ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GetRenderViewHost(),
547ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "domAutomationController.send(focused_fired);",
548ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &focused_fired));
549ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
550ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GetRenderViewHost(),
551ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "domAutomationController.send(unfocused_fired);",
552ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &unfocused_fired));
553ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
554ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GetRenderViewHost(),
555ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "domAutomationController.send(changed_select_fired);",
556ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &changed_select_fired));
557ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
558ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GetRenderViewHost(),
559ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "domAutomationController.send(unchanged_select_fired);",
560ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &unchanged_select_fired));
561ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(focused_fired);
562ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(unfocused_fired);
563ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(changed_select_fired);
564ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(unchanged_select_fired);
565ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
566ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Unfocus the first name field. Its change event should fire.
567ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
568ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GetRenderViewHost(),
569ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "document.getElementById('firstname').blur();"
570ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "domAutomationController.send(focused_fired);", &focused_fired));
571ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(focused_fired);
572ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
573ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
574ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test that we can autofill forms distinguished only by their |id| attribute.
575ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest,
576ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                       AutofillFormsDistinguishedById) {
577ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
578ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
579ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Load the test page.
580ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const std::string kURL =
581ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      std::string(kDataURIPrefix) + kTestFormString +
582ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "<script>"
583ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "var mainForm = document.forms[0];"
584ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "mainForm.id = 'mainForm';"
585ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "var newForm = document.createElement('form');"
586ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "newForm.action = mainForm.action;"
587ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "newForm.method = mainForm.method;"
588ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "newForm.id = 'newForm';"
589ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "mainForm.parentNode.insertBefore(newForm, mainForm);"
590ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "</script>";
591ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(), GURL(kURL)));
592ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
593ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Invoke Autofill.
594ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  TryBasicFormFill();
595ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
596ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
597ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test that we properly autofill forms with repeated fields.
598ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// In the wild, the repeated fields are typically either email fields
599ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// (duplicated for "confirmation"); or variants that are hot-swapped via
600ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// JavaScript, with only one actually visible at any given time.
601ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, AutofillFormWithRepeatedField) {
602ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
603ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
604ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Load the test page.
605ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
606ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GURL(std::string(kDataURIPrefix) +
607ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<form action=\"http://www.example.com/\" method=\"POST\">"
608ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"firstname\">First name:</label>"
609ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"firstname\""
610ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "        onFocus=\"domAutomationController.send(true)\"><br>"
611ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"lastname\">Last name:</label>"
612ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"lastname\"><br>"
613ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"address1\">Address line 1:</label>"
614ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"address1\"><br>"
615ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"address2\">Address line 2:</label>"
616ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"address2\"><br>"
617ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"city\">City:</label>"
618ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"city\"><br>"
619ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"state\">State:</label>"
620ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <select id=\"state\">"
621ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"\" selected=\"yes\">--</option>"
622ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"CA\">California</option>"
623ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"TX\">Texas</option>"
624ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " </select><br>"
625ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"state_freeform\" style=\"display:none\">State:</label>"
626ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"state_freeform\""
627ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "        style=\"display:none\"><br>"
628ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"zip\">ZIP code:</label>"
629ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"zip\"><br>"
630ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"country\">Country:</label>"
631ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <select id=\"country\">"
632ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"\" selected=\"yes\">--</option>"
633ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"CA\">Canada</option>"
634ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"US\">United States</option>"
635ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " </select><br>"
636ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"phone\">Phone number:</label>"
637ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"phone\"><br>"
638ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "</form>")));
639ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
640ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Invoke Autofill.
641ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  TryBasicFormFill();
642ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("state_freeform", std::string());
643ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
644ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
645ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test that we properly autofill forms with non-autofillable fields.
646ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest,
647ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                       AutofillFormWithNonAutofillableField) {
648ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
649ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
650ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Load the test page.
651ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
652ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GURL(std::string(kDataURIPrefix) +
653ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<form action=\"http://www.example.com/\" method=\"POST\">"
654ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"firstname\">First name:</label>"
655ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"firstname\""
656ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "        onFocus=\"domAutomationController.send(true)\"><br>"
657ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"middlename\">Middle name:</label>"
658ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"middlename\" autocomplete=\"off\" /><br>"
659ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"lastname\">Last name:</label>"
660ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"lastname\"><br>"
661ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"address1\">Address line 1:</label>"
662ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"address1\"><br>"
663ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"address2\">Address line 2:</label>"
664ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"address2\"><br>"
665ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"city\">City:</label>"
666ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"city\"><br>"
667ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"state\">State:</label>"
668ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <select id=\"state\">"
669ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"\" selected=\"yes\">--</option>"
670ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"CA\">California</option>"
671ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"TX\">Texas</option>"
672ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " </select><br>"
673ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"zip\">ZIP code:</label>"
674ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"zip\"><br>"
675ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"country\">Country:</label>"
676ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <select id=\"country\">"
677ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"\" selected=\"yes\">--</option>"
678ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"CA\">Canada</option>"
679ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"US\">United States</option>"
680ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " </select><br>"
681ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"phone\">Phone number:</label>"
682ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"phone\"><br>"
683ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "</form>")));
684ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
685ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Invoke Autofill.
686ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  TryBasicFormFill();
687ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
688ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
689ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test that we can Autofill dynamically generated forms.
690ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, DynamicFormFill) {
691ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
692ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
693ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Load the test page.
694ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
695ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GURL(std::string(kDataURIPrefix) +
696ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<form id=\"form\" action=\"http://www.example.com/\""
697ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "      method=\"POST\"></form>"
698ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<script>"
699ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "function AddElement(name, label) {"
700ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  var form = document.getElementById('form');"
701ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           ""
702ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  var label_text = document.createTextNode(label);"
703ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  var label_element = document.createElement('label');"
704ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  label_element.setAttribute('for', name);"
705ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  label_element.appendChild(label_text);"
706ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  form.appendChild(label_element);"
707ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           ""
708ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  if (name === 'state' || name === 'country') {"
709ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    var select_element = document.createElement('select');"
710ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    select_element.setAttribute('id', name);"
711ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    select_element.setAttribute('name', name);"
712ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           ""
713ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    /* Add an empty selected option. */"
714ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    var default_option = new Option('--', '', true);"
715ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    select_element.appendChild(default_option);"
716ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           ""
717ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    /* Add the other options. */"
718ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    if (name == 'state') {"
719ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "      var option1 = new Option('California', 'CA');"
720ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "      select_element.appendChild(option1);"
721ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "      var option2 = new Option('Texas', 'TX');"
722ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "      select_element.appendChild(option2);"
723ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    } else {"
724ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "      var option1 = new Option('Canada', 'CA');"
725ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "      select_element.appendChild(option1);"
726ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "      var option2 = new Option('United States', 'US');"
727ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "      select_element.appendChild(option2);"
728ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    }"
729ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           ""
730ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    form.appendChild(select_element);"
731ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  } else {"
732ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    var input_element = document.createElement('input');"
733ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    input_element.setAttribute('id', name);"
734ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    input_element.setAttribute('name', name);"
735ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           ""
736ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    /* Add the onFocus listener to the 'firstname' field. */"
737ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    if (name === 'firstname') {"
738ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "      input_element.setAttribute("
739ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "          'onFocus', 'domAutomationController.send(true)');"
740ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    }"
741ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           ""
742ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    form.appendChild(input_element);"
743ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  }"
744ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           ""
745ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  form.appendChild(document.createElement('br'));"
746ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "};"
747ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           ""
748ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "function BuildForm() {"
749ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  var elements = ["
750ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    ['firstname', 'First name:'],"
751ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    ['lastname', 'Last name:'],"
752ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    ['address1', 'Address line 1:'],"
753ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    ['address2', 'Address line 2:'],"
754ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    ['city', 'City:'],"
755ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    ['state', 'State:'],"
756ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    ['zip', 'ZIP code:'],"
757ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    ['country', 'Country:'],"
758ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    ['phone', 'Phone number:'],"
759ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  ];"
760ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           ""
761ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  for (var i = 0; i < elements.length; i++) {"
762ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    var name = elements[i][0];"
763ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    var label = elements[i][1];"
764ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    AddElement(name, label);"
765ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  }"
766ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "};"
767ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "</script>")));
768ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
769ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Dynamically construct the form.
770ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(content::ExecuteScript(GetRenderViewHost(), "BuildForm();"));
771ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
772ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Invoke Autofill.
773ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  TryBasicFormFill();
774ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
775ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
776ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test that form filling works after reloading the current page.
777ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, AutofillAfterReload) {
778ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
779ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
780ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Load the test page.
781ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
782ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GURL(std::string(kDataURIPrefix) + kTestFormString)));
783ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
784ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Reload the page.
7850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  content::WebContents* web_contents = GetWebContents();
786ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  web_contents->GetController().Reload(false);
787ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  content::WaitForLoadStop(web_contents);
788ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
789ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Invoke Autofill.
790ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  TryBasicFormFill();
791ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
792ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
7933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, AutofillAfterTranslate) {
794ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
795ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
796ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GURL url(std::string(kDataURIPrefix) +
797ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "<form action=\"http://www.example.com/\" method=\"POST\">"
798ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "<label for=\"fn\">なまえ</label>"
799ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <input type=\"text\" id=\"fn\""
800ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "        onFocus=\"domAutomationController.send(true)\""
801ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "><br>"
802ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "<label for=\"ln\">みょうじ</label>"
803ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <input type=\"text\" id=\"ln\"><br>"
804ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "<label for=\"a1\">Address line 1:</label>"
805ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <input type=\"text\" id=\"a1\"><br>"
806ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "<label for=\"a2\">Address line 2:</label>"
807ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <input type=\"text\" id=\"a2\"><br>"
808ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "<label for=\"ci\">City:</label>"
809ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <input type=\"text\" id=\"ci\"><br>"
810ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "<label for=\"st\">State:</label>"
811ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <select id=\"st\">"
812ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <option value=\"\" selected=\"yes\">--</option>"
813ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <option value=\"CA\">California</option>"
814ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <option value=\"TX\">Texas</option>"
815ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " </select><br>"
816ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "<label for=\"z\">ZIP code:</label>"
817ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <input type=\"text\" id=\"z\"><br>"
818ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "<label for=\"co\">Country:</label>"
819ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <select id=\"co\">"
820ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <option value=\"\" selected=\"yes\">--</option>"
821ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <option value=\"CA\">Canada</option>"
822ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <option value=\"US\">United States</option>"
823ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " </select><br>"
824ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "<label for=\"ph\">Phone number:</label>"
825ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <input type=\"text\" id=\"ph\"><br>"
8263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               "</form>"
8273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               // Add additional Japanese characters to ensure the translate bar
8283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               // will appear.
8293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               "我々は重要な、興味深いものになるが、時折状況が発生するため苦労や痛みは"
8303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               "彼にいくつかの素晴らしいを調達することができます。それから、いくつかの利");
8313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
832424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  content::WindowedNotificationObserver infobar_observer(
8333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_ADDED,
8343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      content::NotificationService::AllSources());
8353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
8363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      ui_test_utils::NavigateToURL(browser(), url));
837ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
8383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Wait for the translation bar to appear and get it.
839424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  infobar_observer.Wait();
840a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  TranslateInfoBarDelegate* delegate =
841a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      InfoBarService::FromWebContents(GetWebContents())->infobar_at(0)->
842a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          delegate()->AsTranslateInfoBarDelegate();
843ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(delegate);
8445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(TranslateTabHelper::BEFORE_TRANSLATE, delegate->translate_step());
845ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
846ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Simulate translation button press.
847ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  delegate->Translate();
848ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
849ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  content::WindowedNotificationObserver translation_observer(
850ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      chrome::NOTIFICATION_PAGE_TRANSLATED,
851ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      content::NotificationService::AllSources());
852ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
853424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Simulate the translate script being retrieved.
854424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Pass fake google.translate lib as the translate script.
855424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  SimulateURLFetch(true);
856424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
857ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Simulate the render notifying the translation has been done.
858ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  translation_observer.Wait();
859ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
860ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  TryBasicFormFill();
861ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
862ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
863ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test phone fields parse correctly from a given profile.
864ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// The high level key presses execute the following: Select the first text
865ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// field, invoke the autofill popup list, select the first profile within the
866ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// list, and commit to the profile to populate the form.
867ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, ComparePhoneNumbers) {
868ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(test_server()->Start());
869ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
870ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  AutofillProfile profile;
871ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Bob"));
872ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(NAME_LAST, ASCIIToUTF16("Smith"));
873ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("1234 H St."));
874ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(ADDRESS_HOME_CITY, ASCIIToUTF16("San Jose"));
875ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("CA"));
876ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(ADDRESS_HOME_ZIP, ASCIIToUTF16("95110"));
877ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(PHONE_HOME_WHOLE_NUMBER, ASCIIToUTF16("1-408-555-4567"));
878ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SetProfile(profile);
879ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
880ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GURL url = test_server()->GetURL("files/autofill/form_phones.html");
881ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ui_test_utils::NavigateToURL(browser(), url);
882ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  PopulateForm("NAME_FIRST");
883ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
884ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("NAME_FIRST", "Bob");
885ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("NAME_LAST", "Smith");
886ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("ADDRESS_HOME_LINE1", "1234 H St.");
887ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("ADDRESS_HOME_CITY", "San Jose");
888ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("ADDRESS_HOME_STATE", "CA");
889ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("ADDRESS_HOME_ZIP", "95110");
890ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_WHOLE_NUMBER", "14085554567");
891ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_CITY_CODE-1", "408");
892ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_CITY_CODE-2", "408");
893ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_NUMBER", "5554567");
894ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_NUMBER_3-1", "555");
895ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_NUMBER_3-2", "555");
896ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_NUMBER_4-1", "4567");
897ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_NUMBER_4-2", "4567");
898ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_EXT-1", std::string());
899ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_EXT-2", std::string());
900ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_COUNTRY_CODE-1", "1");
901ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
902ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
903ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test that Autofill does not fill in read-only fields.
904ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, NoAutofillForReadOnlyFields) {
905ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(test_server()->Start());
906ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
907ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string addr_line1("1234 H St.");
908ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
909ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  AutofillProfile profile;
910ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Bob"));
911ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(NAME_LAST, ASCIIToUTF16("Smith"));
912ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(EMAIL_ADDRESS, ASCIIToUTF16("bsmith@gmail.com"));
913ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16(addr_line1));
914ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(ADDRESS_HOME_CITY, ASCIIToUTF16("San Jose"));
915ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("CA"));
916ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(ADDRESS_HOME_ZIP, ASCIIToUTF16("95110"));
917ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(COMPANY_NAME, ASCIIToUTF16("Company X"));
918ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(PHONE_HOME_WHOLE_NUMBER, ASCIIToUTF16("408-871-4567"));
919ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SetProfile(profile);
920ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
921ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GURL url = test_server()->GetURL("files/autofill/read_only_field_test.html");
922ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ui_test_utils::NavigateToURL(browser(), url);
923ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  PopulateForm("firstname");
924ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
925ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("email", std::string());
926ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("address", addr_line1);
927ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
928ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
929ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test form is fillable from a profile after form was reset.
930ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Steps:
931ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch//   1. Fill form using a saved profile.
932ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch//   2. Reset the form.
933ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch//   3. Fill form using a saved profile.
934ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Flakily times out: http://crbug.com/270341
935ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, DISABLED_FormFillableOnReset) {
936ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(test_server()->Start());
937ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
938ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
939ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
940ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GURL url = test_server()->GetURL("files/autofill/autofill_test_form.html");
941ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ui_test_utils::NavigateToURL(browser(), url);
942ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  PopulateForm("NAME_FIRST");
943ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
944ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(content::ExecuteScript(
9450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)       GetWebContents(), "document.getElementById('testform').reset()"));
946ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
947ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  PopulateForm("NAME_FIRST");
948ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
949ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("NAME_FIRST", "Milton");
950ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("NAME_LAST", "Waddams");
951ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("EMAIL_ADDRESS", "red.swingline@initech.com");
952ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("ADDRESS_HOME_LINE1", "4120 Freidrich Lane");
953ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("ADDRESS_HOME_CITY", "Austin");
954ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("ADDRESS_HOME_STATE", "Texas");
955ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("ADDRESS_HOME_ZIP", "78744");
956ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("ADDRESS_HOME_COUNTRY", "United States");
957ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_WHOLE_NUMBER", "5125551234");
958ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
959ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
960ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test Autofill distinguishes a middle initial in a name.
961ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Flakily times out: http://crbug.com/270341
962ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest,
963ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                       DISABLED_DistinguishMiddleInitialWithinName) {
964ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(test_server()->Start());
965ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
966ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
967ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
968ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GURL url = test_server()->GetURL(
969ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "files/autofill/autofill_middleinit_form.html");
970ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ui_test_utils::NavigateToURL(browser(), url);
971ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  PopulateForm("NAME_FIRST");
972ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
973ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("NAME_MIDDLE", "C");
974ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
975ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
976ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test forms with multiple email addresses are filled properly.
977ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Entire form should be filled with one user gesture.
978ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Flakily times out: http://crbug.com/270341
979ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest,
980ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                       DISABLED_MultipleEmailFilledByOneUserGesture) {
981ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(test_server()->Start());
982ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
983ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string email("bsmith@gmail.com");
984ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
985ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  AutofillProfile profile;
986ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Bob"));
987ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(NAME_LAST, ASCIIToUTF16("Smith"));
988ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(EMAIL_ADDRESS, ASCIIToUTF16(email));
989ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(PHONE_HOME_WHOLE_NUMBER, ASCIIToUTF16("4088714567"));
990ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SetProfile(profile);
991ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
992ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GURL url = test_server()->GetURL(
993ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "files/autofill/autofill_confirmemail_form.html");
994ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ui_test_utils::NavigateToURL(browser(), url);
995ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  PopulateForm("NAME_FIRST");
996ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
997ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("EMAIL_CONFIRM", email);
998ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // TODO(isherman): verify entire form.
999ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1000ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1001424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// http://crbug.com/281527
1002ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#if defined(OS_MACOSX)
1003ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#define MAYBE_FormFillLatencyAfterSubmit FormFillLatencyAfterSubmit
1004ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#else
1005ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#define MAYBE_FormFillLatencyAfterSubmit DISABLED_FormFillLatencyAfterSubmit
1006ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif
1007ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test latency time on form submit with lots of stored Autofill profiles.
1008ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// This test verifies when a profile is selected from the Autofill dictionary
1009ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// that consists of thousands of profiles, the form does not hang after being
1010ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// submitted.
1011ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest,
1012ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                       MAYBE_FormFillLatencyAfterSubmit) {
1013ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(test_server()->Start());
1014ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1015ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::vector<std::string> cities;
1016ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  cities.push_back("San Jose");
1017ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  cities.push_back("San Francisco");
1018ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  cities.push_back("Sacramento");
1019ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  cities.push_back("Los Angeles");
1020ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1021ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::vector<std::string> streets;
1022ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  streets.push_back("St");
1023ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  streets.push_back("Ave");
1024ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  streets.push_back("Ln");
1025ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  streets.push_back("Ct");
1026ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1027ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const int kNumProfiles = 1500;
1028ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::Time start_time = base::Time::Now();
1029ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::vector<AutofillProfile> profiles;
1030ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  for (int i = 0; i < kNumProfiles; i++) {
1031ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    AutofillProfile profile;
1032a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16 name(base::IntToString16(i));
1033a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16 email(name + ASCIIToUTF16("@example.com"));
1034a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16 street = ASCIIToUTF16(
1035ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        base::IntToString(base::RandInt(0, 10000)) + " " +
1036ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        streets[base::RandInt(0, streets.size() - 1)]);
10375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::string16 city =
10385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ASCIIToUTF16(cities[base::RandInt(0, cities.size() - 1)]);
1039a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16 zip(base::IntToString16(base::RandInt(0, 10000)));
1040ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    profile.SetRawInfo(NAME_FIRST, name);
1041ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    profile.SetRawInfo(EMAIL_ADDRESS, email);
1042ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    profile.SetRawInfo(ADDRESS_HOME_LINE1, street);
1043ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    profile.SetRawInfo(ADDRESS_HOME_CITY, city);
10445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    profile.SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("CA"));
1045ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    profile.SetRawInfo(ADDRESS_HOME_ZIP, zip);
10465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("US"));
1047ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    profiles.push_back(profile);
1048ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
1049ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SetProfiles(&profiles);
1050ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // TODO(isherman): once we're sure this test doesn't timeout on any bots, this
1051ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // can be removd.
1052ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  LOG(INFO) << "Created " << kNumProfiles << " profiles in " <<
1053ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               (base::Time::Now() - start_time).InSeconds() << " seconds.";
1054ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1055ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GURL url = test_server()->GetURL(
1056ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "files/autofill/latency_after_submit_test.html");
1057ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ui_test_utils::NavigateToURL(browser(), url);
1058ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  PopulateForm("NAME_FIRST");
1059ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1060ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  content::WindowedNotificationObserver load_stop_observer(
1061ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      content::NOTIFICATION_LOAD_STOP,
1062ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      content::Source<content::NavigationController>(
10630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          &GetWebContents()->GetController()));
1064ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1065ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(content::ExecuteScript(
1066ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GetRenderViewHost(),
1067ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "document.getElementById('testform').submit();"));
1068ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // This will ensure the test didn't hang.
1069ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  load_stop_observer.Wait();
1070ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1071ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1072ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test that Chrome doesn't crash when autocomplete is disabled while the user
1073ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// is interacting with the form.  This is a regression test for
1074ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// http://crbug.com/160476
1075ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest,
1076ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                       DisableAutocompleteWhileFilling) {
1077ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
1078ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1079ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Load the test page.
1080ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
1081ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GURL(std::string(kDataURIPrefix) + kTestFormString)));
1082ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1083ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Invoke Autofill: Start filling the first name field with "M" and wait for
1084ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // the popup to be shown.
1085ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  FocusFirstNameField();
1086ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SendKeyToPageAndWait(ui::VKEY_M);
1087ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1088ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Now that the popup with suggestions is showing, disable autocomplete for
1089ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // the active field.
1090ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(content::ExecuteScript(
1091ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GetRenderViewHost(),
1092ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "document.querySelector('input').autocomplete = 'off';"));
1093ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1094ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Press the down arrow to select the suggestion and attempt to preview the
1095ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // autofilled form.
10960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  SendKeyToPopupAndWait(ui::VKEY_DOWN);
1097ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1098ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1099c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace autofill
1100