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)
54311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include <string>
64311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
74311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "base/basictypes.h"
84311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "base/command_line.h"
94311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "base/file_util.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/ref_counted.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
124311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "base/rand_util.h"
134311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "base/strings/string16.h"
144311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "base/strings/string_number_conversions.h"
154311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "base/strings/string_split.h"
164311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "base/strings/utf_string_conversions.h"
174311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen 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"
214311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "chrome/browser/infobars/infobar_service.h"
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/profiles/profile.h"
234311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "chrome/browser/translate/translate_infobar_delegate.h"
244311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "chrome/browser/translate/translate_manager.h"
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/browser.h"
264311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "chrome/browser/ui/browser_window.h"
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
284311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "chrome/common/render_messages.h"
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
304311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "chrome/test/base/test_switches.h"
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/content/browser/autofill_driver_impl.h"
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_common_test.h"
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_external_delegate.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"
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/personal_data_manager.h"
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/personal_data_manager_observer.h"
404311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "components/autofill/core/browser/validation.h"
414311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "content/public/browser/navigation_controller.h"
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/notification_observer.h"
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/notification_registrar.h"
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/notification_service.h"
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/render_view_host.h"
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/web_contents.h"
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/test/browser_test_utils.h"
484311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "content/public/test/test_renderer_host.h"
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/test/test_utils.h"
504311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "net/url_request/test_url_fetcher_factory.h"
514311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "testing/gmock/include/gmock/gmock.h"
524311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/base/keycodes/keyboard_codes.h"
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace autofill {
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
584311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochstatic const char* kDataURIPrefix = "data:text/html;charset=utf-8,";
594311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochstatic const char* kTestFormString =
604311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    "<form action=\"http://www.example.com/\" method=\"POST\">"
614311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    "<label for=\"firstname\">First name:</label>"
624311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    " <input type=\"text\" id=\"firstname\""
634311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    "        onFocus=\"domAutomationController.send(true)\"><br>"
644311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    "<label for=\"lastname\">Last name:</label>"
654311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    " <input type=\"text\" id=\"lastname\"><br>"
664311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    "<label for=\"address1\">Address line 1:</label>"
674311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    " <input type=\"text\" id=\"address1\"><br>"
684311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    "<label for=\"address2\">Address line 2:</label>"
694311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    " <input type=\"text\" id=\"address2\"><br>"
704311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    "<label for=\"city\">City:</label>"
714311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    " <input type=\"text\" id=\"city\"><br>"
724311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    "<label for=\"state\">State:</label>"
734311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    " <select id=\"state\">"
744311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    " <option value=\"\" selected=\"yes\">--</option>"
754311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    " <option value=\"CA\">California</option>"
764311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    " <option value=\"TX\">Texas</option>"
774311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    " </select><br>"
784311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    "<label for=\"zip\">ZIP code:</label>"
794311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    " <input type=\"text\" id=\"zip\"><br>"
804311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    "<label for=\"country\">Country:</label>"
814311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    " <select id=\"country\">"
824311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    " <option value=\"\" selected=\"yes\">--</option>"
834311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    " <option value=\"CA\">Canada</option>"
844311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    " <option value=\"US\">United States</option>"
854311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    " </select><br>"
864311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    "<label for=\"phone\">Phone number:</label>"
874311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    " <input type=\"text\" id=\"phone\"><br>"
884311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    "</form>";
894311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
902385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
912385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// AutofillManagerTestDelegateImpl --------------------------------------------
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AutofillManagerTestDelegateImpl
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public autofill::AutofillManagerTestDelegate {
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutofillManagerTestDelegateImpl() {}
972385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  virtual ~AutofillManagerTestDelegateImpl() {}
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
99a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // autofill::AutofillManagerTestDelegate:
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidPreviewFormData() OVERRIDE {
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    loop_runner_->Quit();
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidFillFormData() OVERRIDE {
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    loop_runner_->Quit();
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidShowSuggestions() OVERRIDE {
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    loop_runner_->Quit();
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void Reset() {
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    loop_runner_ = new content::MessageLoopRunner();
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void Wait() {
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    loop_runner_->Run();
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner_;
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AutofillManagerTestDelegateImpl);
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1262385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
1272385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// WindowedPersonalDataManagerObserver ----------------------------------------
1282385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class WindowedPersonalDataManagerObserver
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public PersonalDataManagerObserver,
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      public content::NotificationObserver {
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit WindowedPersonalDataManagerObserver(Browser* browser)
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : alerted_(false),
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        has_run_message_loop_(false),
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        browser_(browser),
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        infobar_service_(NULL) {
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PersonalDataManagerFactory::GetForProfile(browser_->profile())->
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        AddObserver(this);
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    registrar_.Add(this, chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_ADDED,
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   content::NotificationService::AllSources());
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~WindowedPersonalDataManagerObserver() {
1452385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    if (infobar_service_) {
1462385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      while (infobar_service_->infobar_count() > 0) {
1472385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        infobar_service_->RemoveInfoBar(infobar_service_->infobar_at(0));
1482385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      }
1492385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    }
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // PersonalDataManagerObserver:
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnPersonalDataChanged() OVERRIDE {
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (has_run_message_loop_) {
15590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoopForUI::current()->Quit();
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      has_run_message_loop_ = false;
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    alerted_ = true;
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnInsufficientFormData() OVERRIDE {
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    OnPersonalDataChanged();
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // content::NotificationObserver:
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void Observe(int type,
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       const content::NotificationSource& source,
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE {
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    infobar_service_ = InfoBarService::FromWebContents(
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        browser_->tab_strip_model()->GetActiveWebContents());
1712385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    infobar_service_->infobar_at(0)->AsConfirmInfoBarDelegate()->Accept();
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void Wait() {
175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (!alerted_) {
176a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      has_run_message_loop_ = true;
177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      content::RunMessageLoop();
178a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
179a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    PersonalDataManagerFactory::GetForProfile(browser_->profile())->
180a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        RemoveObserver(this);
181a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
182a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool alerted_;
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool has_run_message_loop_;
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Browser* browser_;
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::NotificationRegistrar registrar_;
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  InfoBarService* infobar_service_;
1892385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
1902385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  DISALLOW_COPY_AND_ASSIGN(WindowedPersonalDataManagerObserver);
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1932385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
1942385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// TestAutofillExternalDelegate -----------------------------------------------
1952385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class TestAutofillExternalDelegate : public AutofillExternalDelegate {
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestAutofillExternalDelegate(content::WebContents* web_contents,
1997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                               AutofillManager* autofill_manager,
2007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                               AutofillDriver* autofill_driver)
2017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      : AutofillExternalDelegate(web_contents, autofill_manager,
2027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                 autofill_driver),
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        keyboard_listener_(NULL) {
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2052385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~TestAutofillExternalDelegate() {}
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
208a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // AutofillExternalDelegate:
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnPopupShown(content::KeyboardListener* listener) OVERRIDE {
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    AutofillExternalDelegate::OnPopupShown(listener);
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    keyboard_listener_ = listener;
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnPopupHidden(content::KeyboardListener* listener) OVERRIDE {
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    keyboard_listener_ = NULL;
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    AutofillExternalDelegate::OnPopupHidden(listener);
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::KeyboardListener* keyboard_listener() {
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return keyboard_listener_;
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The popup that is currently registered as a keyboard listener, or NULL if
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // there is none.
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::KeyboardListener* keyboard_listener_;
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestAutofillExternalDelegate);
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2312385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
2322385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// AutofillInteractiveTest ----------------------------------------------------
2332385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AutofillInteractiveTest : public InProcessBrowserTest {
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutofillInteractiveTest() {}
2372385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  virtual ~AutofillInteractiveTest() {}
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
239a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // InProcessBrowserTest:
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Don't want Keychain coming up on Mac.
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test::DisableSystemServices(browser()->profile());
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // When testing the native UI, hook up a test external delegate, which
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // allows us to forward keyboard events to the popup directly.
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::WebContents* web_contents =
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        browser()->tab_strip_model()->GetActiveWebContents();
2487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    AutofillDriverImpl* autofill_driver =
2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        AutofillDriverImpl::FromWebContents(web_contents);
2507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    AutofillManager* autofill_manager = autofill_driver->autofill_manager();
251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_ptr<AutofillExternalDelegate> external_delegate(
2527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        new TestAutofillExternalDelegate(web_contents, autofill_manager,
2537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                         autofill_driver));
254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    autofill_driver->SetAutofillExternalDelegate(external_delegate.Pass());
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    autofill_manager->SetTestDelegate(&test_delegate_);
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CleanUpOnMainThread() OVERRIDE {
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Make sure to close any showing popups prior to tearing down the UI.
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::WebContents* web_contents =
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        browser()->tab_strip_model()->GetActiveWebContents();
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    AutofillManager* autofill_manager =
2637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        AutofillDriverImpl::FromWebContents(web_contents)->autofill_manager();
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    autofill_manager->delegate()->HideAutofillPopup();
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
267a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  PersonalDataManager* GetPersonalDataManager() {
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return PersonalDataManagerFactory::GetForProfile(browser()->profile());
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
271a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  content::RenderViewHost* GetRenderViewHost() {
272a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return browser()->tab_strip_model()->GetActiveWebContents()->
273a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        GetRenderViewHost();
274a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
275a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
276a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  TestAutofillExternalDelegate* GetExternalDelegate() {
277a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    content::WebContents* web_contents =
278a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        browser()->tab_strip_model()->GetActiveWebContents();
279a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    AutofillDriverImpl* autofill_driver =
280a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        AutofillDriverImpl::FromWebContents(web_contents);
281a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return static_cast<TestAutofillExternalDelegate*>(
282a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        autofill_driver->autofill_external_delegate());
283a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
284a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void CreateTestProfile() {
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    AutofillProfile profile;
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test::SetProfileInfo(
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        &profile, "Milton", "C.", "Waddams",
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "red.swingline@initech.com", "Initech", "4120 Freidrich Lane",
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "Basement", "Austin", "Texas", "78744", "US", "5125551234");
291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    WindowedPersonalDataManagerObserver observer(browser());
293a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    GetPersonalDataManager()->AddProfile(profile);
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // AddProfile is asynchronous. Wait for it to finish before continuing the
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // tests.
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    observer.Wait();
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3004311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  void SetProfiles(std::vector<AutofillProfile>* profiles) {
3014311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    WindowedPersonalDataManagerObserver observer(browser());
3024311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    GetPersonalDataManager()->SetProfiles(profiles);
3034311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    observer.Wait();
3044311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  }
3054311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
3064311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  void SetProfile(const AutofillProfile& profile) {
3074311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    std::vector<AutofillProfile> profiles;
3084311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    profiles.push_back(profile);
3094311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    SetProfiles(&profiles);
3104311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  }
3114311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
3124311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Populates a webpage form using autofill data and keypress events.
3134311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // This function focuses the specified input field in the form, and then
3144311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // sends keypress events to the tab to cause the form to be populated.
3154311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  void PopulateForm(const std::string& field_id) {
3164311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    std::string js("document.getElementById('" + field_id + "').focus();");
3174311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    ASSERT_TRUE(content::ExecuteScript(GetRenderViewHost(), js));
3184311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
3194311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    SendKeyToPageAndWait(ui::VKEY_DOWN);
3204311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    SendKeyToPopupAndWait(ui::VKEY_DOWN);
3214311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    SendKeyToPopupAndWait(ui::VKEY_RETURN);
3224311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  }
3234311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ExpectFieldValue(const std::string& field_name,
325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        const std::string& expected_value) {
326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::string value;
327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(content::ExecuteScriptAndExtractString(
328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        browser()->tab_strip_model()->GetActiveWebContents(),
329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "window.domAutomationController.send("
330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "    document.getElementById('" + field_name + "').value);",
331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        &value));
332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(expected_value, value);
333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3354311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  void SimulateURLFetch(bool success) {
3364311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0);
3374311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    ASSERT_TRUE(fetcher);
3384311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    net::URLRequestStatus status;
3394311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    status.set_status(success ? net::URLRequestStatus::SUCCESS :
3404311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                                net::URLRequestStatus::FAILED);
3414311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
3424311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    std::string script = " var google = {};"
3434311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        "google.translate = (function() {"
3444311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        "  return {"
3454311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        "    TranslateService: function() {"
3464311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        "      return {"
3474311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        "        isAvailable : function() {"
3484311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        "          return true;"
3494311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        "        },"
3504311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        "        restore : function() {"
3514311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        "          return;"
3524311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        "        },"
3534311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        "        getDetectedLanguage : function() {"
3544311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        "          return \"ja\";"
3554311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        "        },"
3564311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        "        translatePage : function(originalLang, targetLang,"
3574311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        "                                 onTranslateProgress) {"
3584311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        "          document.getElementsByTagName(\"body\")[0].innerHTML = '" +
3594311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        std::string(kTestFormString) +
3604311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        "              ';"
3614311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        "          onTranslateProgress(100, true, false);"
3624311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        "        }"
3634311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        "      };"
3644311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        "    }"
3654311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        "  };"
3664311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        "})();";
3674311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
3684311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    fetcher->set_url(fetcher->GetOriginalURL());
3694311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    fetcher->set_status(status);
3704311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    fetcher->set_response_code(success ? 200 : 500);
3714311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    fetcher->SetResponseString(script);
3724311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    fetcher->delegate()->OnURLFetchComplete(fetcher);
3734311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  }
3744311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void FocusFirstNameField() {
376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool result = false;
377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
378a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        GetRenderViewHost(),
379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "if (document.readyState === 'complete')"
380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "  document.getElementById('firstname').focus();"
381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "else"
382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "  domAutomationController.send(false);",
383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        &result));
384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(result);
385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ExpectFilledTestForm() {
388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("firstname", "Milton");
389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("lastname", "Waddams");
390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("address1", "4120 Freidrich Lane");
391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("address2", "Basement");
392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("city", "Austin");
393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("state", "TX");
394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("zip", "78744");
395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("country", "US");
396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("phone", "5125551234");
397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SendKeyToPageAndWait(ui::KeyboardCode key) {
400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test_delegate_.Reset();
401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::SimulateKeyPress(
402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        browser()->tab_strip_model()->GetActiveWebContents(),
403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        key, false, false, false, false);
404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test_delegate_.Wait();
405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SendKeyToPopupAndWait(ui::KeyboardCode key) {
408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // When testing the native UI, route popup-targeted key presses via the
409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // external delegate.
410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::NativeWebKeyboardEvent event;
411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    event.windowsKeyCode = key;
412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test_delegate_.Reset();
413a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    GetExternalDelegate()->keyboard_listener()->HandleKeyPressEvent(event);
414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test_delegate_.Wait();
415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4174311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  void TryBasicFormFill() {
4184311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    FocusFirstNameField();
4194311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
4204311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    // Start filling the first name field with "M" and wait for the popup to be
4214311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    // shown.
4224311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    SendKeyToPageAndWait(ui::VKEY_M);
4234311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
4244311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    // Press the down arrow to select the suggestion and preview the autofilled
4254311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    // form.
4264311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    SendKeyToPopupAndWait(ui::VKEY_DOWN);
4274311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
4284311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    // The previewed values should not be accessible to JavaScript.
4294311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    ExpectFieldValue("firstname", "M");
4304311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    ExpectFieldValue("lastname", std::string());
4314311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    ExpectFieldValue("address1", std::string());
4324311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    ExpectFieldValue("address2", std::string());
4334311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    ExpectFieldValue("city", std::string());
4344311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    ExpectFieldValue("state", std::string());
4354311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    ExpectFieldValue("zip", std::string());
4364311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    ExpectFieldValue("country", std::string());
4374311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    ExpectFieldValue("phone", std::string());
4384311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    // TODO(isherman): It would be nice to test that the previewed values are
4394311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    // displayed: http://crbug.com/57220
4404311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
4414311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    // Press Enter to accept the autofill suggestions.
4424311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    SendKeyToPopupAndWait(ui::VKEY_RETURN);
4434311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
4444311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    // The form should be filled.
4454311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    ExpectFilledTestForm();
4464311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  }
4474311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
4482385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch private:
449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutofillManagerTestDelegateImpl test_delegate_;
4502385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
4514311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  net::TestURLFetcherFactory url_fetcher_factory_;
4524311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
4532385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  DISALLOW_COPY_AND_ASSIGN(AutofillInteractiveTest);
454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4564311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// Test that basic form fill is working.
4574311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, BasicFormFill) {
4584311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  CreateTestProfile();
4594311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
4604311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Load the test page.
4614311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
4624311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      GURL(std::string(kDataURIPrefix) + kTestFormString)));
4632385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
4644311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Invoke Autofill.
4654311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  TryBasicFormFill();
4664311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch}
4672385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
4684311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// Test that form filling can be initiated by pressing the down arrow.
4694311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, AutofillViaDownArrow) {
470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CreateTestProfile();
471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Load the test page.
473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      GURL(std::string(kDataURIPrefix) + kTestFormString)));
475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Focus a fillable field.
477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FocusFirstNameField();
478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4794311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Press the down arrow to initiate Autofill and wait for the popup to be
4804311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // shown.
4814311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  SendKeyToPageAndWait(ui::VKEY_DOWN);
4824311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
4834311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Press the down arrow to select the suggestion and preview the autofilled
4844311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // form.
4854311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  SendKeyToPopupAndWait(ui::VKEY_DOWN);
4864311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
4874311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Press Enter to accept the autofill suggestions.
4884311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  SendKeyToPopupAndWait(ui::VKEY_RETURN);
4894311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
4904311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // The form should be filled.
4914311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ExpectFilledTestForm();
4924311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch}
4934311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
4944311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, AutofillSelectViaTab) {
4954311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  CreateTestProfile();
4964311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
4974311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Load the test page.
4984311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
4994311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      GURL(std::string(kDataURIPrefix) + kTestFormString)));
5004311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
5014311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Focus a fillable field.
5024311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  FocusFirstNameField();
503558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Press the down arrow to initiate Autofill and wait for the popup to be
505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // shown.
506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SendKeyToPageAndWait(ui::VKEY_DOWN);
507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Press the down arrow to select the suggestion and preview the autofilled
509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // form.
510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SendKeyToPopupAndWait(ui::VKEY_DOWN);
511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Press tab to accept the autofill suggestions.
513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SendKeyToPopupAndWait(ui::VKEY_TAB);
514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The form should be filled.
516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ExpectFilledTestForm();
517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5194311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// Test that a JavaScript onchange event is fired after auto-filling a form.
5204311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, OnChangeAfterAutofill) {
5214311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  CreateTestProfile();
5224311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
5234311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  const char* kOnChangeScript =
5244311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "<script>"
5254311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "focused_fired = false;"
5264311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "unfocused_fired = false;"
5274311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "changed_select_fired = false;"
5284311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "unchanged_select_fired = false;"
5294311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "document.getElementById('firstname').onchange = function() {"
5304311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "  focused_fired = true;"
5314311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "};"
5324311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "document.getElementById('lastname').onchange = function() {"
5334311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "  unfocused_fired = true;"
5344311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "};"
5354311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "document.getElementById('state').onchange = function() {"
5364311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "  changed_select_fired = true;"
5374311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "};"
5384311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "document.getElementById('country').onchange = function() {"
5394311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "  unchanged_select_fired = true;"
5404311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "};"
5414311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "document.getElementById('country').value = 'US';"
5424311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "</script>";
5434311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
5444311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Load the test page.
5454311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
5464311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      GURL(std::string(kDataURIPrefix) + kTestFormString + kOnChangeScript)));
5474311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
5484311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Invoke Autofill.
5494311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  FocusFirstNameField();
5504311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
5514311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Start filling the first name field with "M" and wait for the popup to be
5524311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // shown.
5534311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  SendKeyToPageAndWait(ui::VKEY_M);
5544311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
5554311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Press the down arrow to select the suggestion and preview the autofilled
5564311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // form.
5574311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  SendKeyToPopupAndWait(ui::VKEY_DOWN);
5584311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
5594311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Press Enter to accept the autofill suggestions.
5604311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  SendKeyToPopupAndWait(ui::VKEY_RETURN);
5614311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
5624311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // The form should be filled.
5634311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ExpectFilledTestForm();
5644311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
5654311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // The change event should have already fired for unfocused fields, both of
5664311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // <input> and of <select> type. However, it should not yet have fired for the
5674311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // focused field.
5684311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  bool focused_fired = false;
5694311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  bool unfocused_fired = false;
5704311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  bool changed_select_fired = false;
5714311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  bool unchanged_select_fired = false;
5724311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
5734311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      GetRenderViewHost(),
5744311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "domAutomationController.send(focused_fired);",
5754311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      &focused_fired));
5764311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
5774311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      GetRenderViewHost(),
5784311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "domAutomationController.send(unfocused_fired);",
5794311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      &unfocused_fired));
5804311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
5814311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      GetRenderViewHost(),
5824311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "domAutomationController.send(changed_select_fired);",
5834311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      &changed_select_fired));
5844311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
5854311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      GetRenderViewHost(),
5864311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "domAutomationController.send(unchanged_select_fired);",
5874311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      &unchanged_select_fired));
5884311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_FALSE(focused_fired);
5894311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_TRUE(unfocused_fired);
5904311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_TRUE(changed_select_fired);
5914311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_FALSE(unchanged_select_fired);
5924311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
5934311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Unfocus the first name field. Its change event should fire.
5944311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
5954311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      GetRenderViewHost(),
5964311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "document.getElementById('firstname').blur();"
5974311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "domAutomationController.send(focused_fired);", &focused_fired));
5984311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_TRUE(focused_fired);
5994311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch}
6004311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
6014311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// Test that we can autofill forms distinguished only by their |id| attribute.
6024311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest,
6034311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                       AutofillFormsDistinguishedById) {
6044311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  CreateTestProfile();
6054311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
6064311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Load the test page.
6074311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  const std::string kURL =
6084311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      std::string(kDataURIPrefix) + kTestFormString +
6094311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "<script>"
6104311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "var mainForm = document.forms[0];"
6114311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "mainForm.id = 'mainForm';"
6124311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "var newForm = document.createElement('form');"
6134311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "newForm.action = mainForm.action;"
6144311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "newForm.method = mainForm.method;"
6154311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "newForm.id = 'newForm';"
6164311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "mainForm.parentNode.insertBefore(newForm, mainForm);"
6174311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "</script>";
6184311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(), GURL(kURL)));
6194311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
6204311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Invoke Autofill.
6214311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  TryBasicFormFill();
6224311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch}
6234311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
6244311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// Test that we properly autofill forms with repeated fields.
6254311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// In the wild, the repeated fields are typically either email fields
6264311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// (duplicated for "confirmation"); or variants that are hot-swapped via
6274311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// JavaScript, with only one actually visible at any given time.
6284311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, AutofillFormWithRepeatedField) {
6294311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  CreateTestProfile();
6304311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
6314311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Load the test page.
6324311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
6334311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      GURL(std::string(kDataURIPrefix) +
6344311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "<form action=\"http://www.example.com/\" method=\"POST\">"
6354311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "<label for=\"firstname\">First name:</label>"
6364311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " <input type=\"text\" id=\"firstname\""
6374311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "        onFocus=\"domAutomationController.send(true)\"><br>"
6384311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "<label for=\"lastname\">Last name:</label>"
6394311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " <input type=\"text\" id=\"lastname\"><br>"
6404311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "<label for=\"address1\">Address line 1:</label>"
6414311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " <input type=\"text\" id=\"address1\"><br>"
6424311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "<label for=\"address2\">Address line 2:</label>"
6434311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " <input type=\"text\" id=\"address2\"><br>"
6444311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "<label for=\"city\">City:</label>"
6454311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " <input type=\"text\" id=\"city\"><br>"
6464311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "<label for=\"state\">State:</label>"
6474311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " <select id=\"state\">"
6484311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " <option value=\"\" selected=\"yes\">--</option>"
6494311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " <option value=\"CA\">California</option>"
6504311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " <option value=\"TX\">Texas</option>"
6514311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " </select><br>"
6524311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "<label for=\"state_freeform\" style=\"display:none\">State:</label>"
6534311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " <input type=\"text\" id=\"state_freeform\""
6544311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "        style=\"display:none\"><br>"
6554311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "<label for=\"zip\">ZIP code:</label>"
6564311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " <input type=\"text\" id=\"zip\"><br>"
6574311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "<label for=\"country\">Country:</label>"
6584311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " <select id=\"country\">"
6594311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " <option value=\"\" selected=\"yes\">--</option>"
6604311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " <option value=\"CA\">Canada</option>"
6614311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " <option value=\"US\">United States</option>"
6624311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " </select><br>"
6634311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "<label for=\"phone\">Phone number:</label>"
6644311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " <input type=\"text\" id=\"phone\"><br>"
6654311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "</form>")));
6664311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
6674311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Invoke Autofill.
6684311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  TryBasicFormFill();
6694311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ExpectFieldValue("state_freeform", std::string());
6704311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch}
6714311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
6724311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// Test that we properly autofill forms with non-autofillable fields.
6734311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest,
6744311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                       AutofillFormWithNonAutofillableField) {
6754311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  CreateTestProfile();
6764311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
6774311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Load the test page.
6784311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
6794311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      GURL(std::string(kDataURIPrefix) +
6804311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "<form action=\"http://www.example.com/\" method=\"POST\">"
6814311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "<label for=\"firstname\">First name:</label>"
6824311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " <input type=\"text\" id=\"firstname\""
6834311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "        onFocus=\"domAutomationController.send(true)\"><br>"
6844311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "<label for=\"middlename\">Middle name:</label>"
6854311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " <input type=\"text\" id=\"middlename\" autocomplete=\"off\" /><br>"
6864311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "<label for=\"lastname\">Last name:</label>"
6874311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " <input type=\"text\" id=\"lastname\"><br>"
6884311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "<label for=\"address1\">Address line 1:</label>"
6894311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " <input type=\"text\" id=\"address1\"><br>"
6904311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "<label for=\"address2\">Address line 2:</label>"
6914311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " <input type=\"text\" id=\"address2\"><br>"
6924311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "<label for=\"city\">City:</label>"
6934311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " <input type=\"text\" id=\"city\"><br>"
6944311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "<label for=\"state\">State:</label>"
6954311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " <select id=\"state\">"
6964311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " <option value=\"\" selected=\"yes\">--</option>"
6974311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " <option value=\"CA\">California</option>"
6984311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " <option value=\"TX\">Texas</option>"
6994311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " </select><br>"
7004311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "<label for=\"zip\">ZIP code:</label>"
7014311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " <input type=\"text\" id=\"zip\"><br>"
7024311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "<label for=\"country\">Country:</label>"
7034311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " <select id=\"country\">"
7044311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " <option value=\"\" selected=\"yes\">--</option>"
7054311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " <option value=\"CA\">Canada</option>"
7064311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " <option value=\"US\">United States</option>"
7074311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " </select><br>"
7084311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "<label for=\"phone\">Phone number:</label>"
7094311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           " <input type=\"text\" id=\"phone\"><br>"
7104311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "</form>")));
7114311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
7124311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Invoke Autofill.
7134311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  TryBasicFormFill();
7144311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch}
7154311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
7164311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// Test that we can Autofill dynamically generated forms.
7174311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, DynamicFormFill) {
7184311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  CreateTestProfile();
7194311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
7204311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Load the test page.
7214311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
7224311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      GURL(std::string(kDataURIPrefix) +
7234311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "<form id=\"form\" action=\"http://www.example.com/\""
7244311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "      method=\"POST\"></form>"
7254311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "<script>"
7264311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "function AddElement(name, label) {"
7274311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "  var form = document.getElementById('form');"
7284311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           ""
7294311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "  var label_text = document.createTextNode(label);"
7304311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "  var label_element = document.createElement('label');"
7314311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "  label_element.setAttribute('for', name);"
7324311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "  label_element.appendChild(label_text);"
7334311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "  form.appendChild(label_element);"
7344311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           ""
7354311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "  if (name === 'state' || name === 'country') {"
7364311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "    var select_element = document.createElement('select');"
7374311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "    select_element.setAttribute('id', name);"
7384311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "    select_element.setAttribute('name', name);"
7394311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           ""
7404311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "    /* Add an empty selected option. */"
7414311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "    var default_option = new Option('--', '', true);"
7424311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "    select_element.appendChild(default_option);"
7434311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           ""
7444311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "    /* Add the other options. */"
7454311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "    if (name == 'state') {"
7464311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "      var option1 = new Option('California', 'CA');"
7474311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "      select_element.appendChild(option1);"
7484311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "      var option2 = new Option('Texas', 'TX');"
7494311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "      select_element.appendChild(option2);"
7504311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "    } else {"
7514311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "      var option1 = new Option('Canada', 'CA');"
7524311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "      select_element.appendChild(option1);"
7534311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "      var option2 = new Option('United States', 'US');"
7544311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "      select_element.appendChild(option2);"
7554311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "    }"
7564311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           ""
7574311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "    form.appendChild(select_element);"
7584311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "  } else {"
7594311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "    var input_element = document.createElement('input');"
7604311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "    input_element.setAttribute('id', name);"
7614311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "    input_element.setAttribute('name', name);"
7624311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           ""
7634311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "    /* Add the onFocus listener to the 'firstname' field. */"
7644311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "    if (name === 'firstname') {"
7654311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "      input_element.setAttribute("
7664311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "          'onFocus', 'domAutomationController.send(true)');"
7674311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "    }"
7684311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           ""
7694311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "    form.appendChild(input_element);"
7704311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "  }"
7714311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           ""
7724311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "  form.appendChild(document.createElement('br'));"
7734311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "};"
7744311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           ""
7754311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "function BuildForm() {"
7764311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "  var elements = ["
7774311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "    ['firstname', 'First name:'],"
7784311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "    ['lastname', 'Last name:'],"
7794311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "    ['address1', 'Address line 1:'],"
7804311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "    ['address2', 'Address line 2:'],"
7814311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "    ['city', 'City:'],"
7824311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "    ['state', 'State:'],"
7834311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "    ['zip', 'ZIP code:'],"
7844311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "    ['country', 'Country:'],"
7854311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "    ['phone', 'Phone number:'],"
7864311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "  ];"
7874311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           ""
7884311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "  for (var i = 0; i < elements.length; i++) {"
7894311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "    var name = elements[i][0];"
7904311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "    var label = elements[i][1];"
7914311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "    AddElement(name, label);"
7924311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "  }"
7934311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "};"
7944311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch           "</script>")));
7954311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
7964311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Dynamically construct the form.
7974311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ASSERT_TRUE(content::ExecuteScript(GetRenderViewHost(), "BuildForm();"));
7984311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
7994311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Invoke Autofill.
8004311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  TryBasicFormFill();
8014311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch}
8024311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
8034311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// Test that form filling works after reloading the current page.
8044311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, AutofillAfterReload) {
8054311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  CreateTestProfile();
8064311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
8074311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Load the test page.
8084311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
8094311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      GURL(std::string(kDataURIPrefix) + kTestFormString)));
8104311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
8114311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Reload the page.
8124311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  content::WebContents* web_contents =
8134311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      browser()->tab_strip_model()->GetActiveWebContents();
8144311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  web_contents->GetController().Reload(false);
8154311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  content::WaitForLoadStop(web_contents);
8164311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
8174311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Invoke Autofill.
8184311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  TryBasicFormFill();
8194311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch}
8204311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
8214311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// DISABLED: http://crbug.com/150084
8224311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest,
8234311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                       DISABLED_AutofillAfterTranslate) {
8244311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  CreateTestProfile();
8254311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
8264311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  GURL url(std::string(kDataURIPrefix) +
8274311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch               "<form action=\"http://www.example.com/\" method=\"POST\">"
8284311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch               "<label for=\"fn\">なまえ</label>"
8294311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch               " <input type=\"text\" id=\"fn\""
8304311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch               "        onFocus=\"domAutomationController.send(true)\""
8314311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch               "><br>"
8324311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch               "<label for=\"ln\">みょうじ</label>"
8334311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch               " <input type=\"text\" id=\"ln\"><br>"
8344311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch               "<label for=\"a1\">Address line 1:</label>"
8354311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch               " <input type=\"text\" id=\"a1\"><br>"
8364311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch               "<label for=\"a2\">Address line 2:</label>"
8374311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch               " <input type=\"text\" id=\"a2\"><br>"
8384311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch               "<label for=\"ci\">City:</label>"
8394311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch               " <input type=\"text\" id=\"ci\"><br>"
8404311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch               "<label for=\"st\">State:</label>"
8414311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch               " <select id=\"st\">"
8424311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch               " <option value=\"\" selected=\"yes\">--</option>"
8434311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch               " <option value=\"CA\">California</option>"
8444311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch               " <option value=\"TX\">Texas</option>"
8454311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch               " </select><br>"
8464311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch               "<label for=\"z\">ZIP code:</label>"
8474311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch               " <input type=\"text\" id=\"z\"><br>"
8484311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch               "<label for=\"co\">Country:</label>"
8494311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch               " <select id=\"co\">"
8504311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch               " <option value=\"\" selected=\"yes\">--</option>"
8514311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch               " <option value=\"CA\">Canada</option>"
8524311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch               " <option value=\"US\">United States</option>"
8534311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch               " </select><br>"
8544311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch               "<label for=\"ph\">Phone number:</label>"
8554311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch               " <input type=\"text\" id=\"ph\"><br>"
8564311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch               "</form>");
8574311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(), url));
8584311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
8594311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Get translation bar.
8604311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  LanguageDetectionDetails details;
8614311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  details.adopted_language = "ja";
8624311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  content::RenderViewHostTester::TestOnMessageReceived(
8634311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      GetRenderViewHost(),
8644311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      ChromeViewHostMsg_TranslateLanguageDetermined(0, details, true));
8654311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  TranslateInfoBarDelegate* delegate = InfoBarService::FromWebContents(
8664311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      browser()->tab_strip_model()->GetActiveWebContents())->infobar_at(0)->
8674311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch          AsTranslateInfoBarDelegate();
8684311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ASSERT_TRUE(delegate);
8694311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_EQ(TranslateInfoBarDelegate::BEFORE_TRANSLATE,
8704311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch            delegate->infobar_type());
8714311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
8724311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Simulate translation button press.
8734311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  delegate->Translate();
8744311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
8754311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Simulate the translate script being retrieved.
8764311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Pass fake google.translate lib as the translate script.
8774311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  SimulateURLFetch(true);
8784311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
8794311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  content::WindowedNotificationObserver translation_observer(
8804311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      chrome::NOTIFICATION_PAGE_TRANSLATED,
8814311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      content::NotificationService::AllSources());
8824311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
8834311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Simulate translation to kick onTranslateElementLoad.
8844311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // But right now, the call stucks here.
8854311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Once click the text field, it starts again.
8864311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ASSERT_TRUE(content::ExecuteScript(
8874311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      GetRenderViewHost(), "cr.googleTranslate.onTranslateElementLoad();"));
8884311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
8894311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Simulate the render notifying the translation has been done.
8904311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  translation_observer.Wait();
8914311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
8924311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  TryBasicFormFill();
8934311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch}
8944311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
8954311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// Test phone fields parse correctly from a given profile.
8964311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// The high level key presses execute the following: Select the first text
8974311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// field, invoke the autofill popup list, select the first profile within the
8984311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// list, and commit to the profile to populate the form.
8994311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, ComparePhoneNumbers) {
9004311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ASSERT_TRUE(test_server()->Start());
9014311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
9024311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  AutofillProfile profile;
9034311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Bob"));
9044311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  profile.SetRawInfo(NAME_LAST, ASCIIToUTF16("Smith"));
9054311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  profile.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("1234 H St."));
9064311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  profile.SetRawInfo(ADDRESS_HOME_CITY, ASCIIToUTF16("San Jose"));
9074311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  profile.SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("CA"));
9084311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  profile.SetRawInfo(ADDRESS_HOME_ZIP, ASCIIToUTF16("95110"));
9094311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  profile.SetRawInfo(PHONE_HOME_WHOLE_NUMBER, ASCIIToUTF16("1-408-555-4567"));
9104311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  SetProfile(profile);
9114311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
9124311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  GURL url = test_server()->GetURL("files/autofill/form_phones.html");
9134311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
9144311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  PopulateForm("NAME_FIRST");
9154311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
9164311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ExpectFieldValue("NAME_FIRST", "Bob");
9174311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ExpectFieldValue("NAME_LAST", "Smith");
9184311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ExpectFieldValue("ADDRESS_HOME_LINE1", "1234 H St.");
9194311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ExpectFieldValue("ADDRESS_HOME_CITY", "San Jose");
9204311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ExpectFieldValue("ADDRESS_HOME_STATE", "CA");
9214311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ExpectFieldValue("ADDRESS_HOME_ZIP", "95110");
9224311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ExpectFieldValue("PHONE_HOME_WHOLE_NUMBER", "14085554567");
9234311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ExpectFieldValue("PHONE_HOME_CITY_CODE-1", "408");
9244311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ExpectFieldValue("PHONE_HOME_CITY_CODE-2", "408");
9254311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ExpectFieldValue("PHONE_HOME_NUMBER", "5554567");
9264311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ExpectFieldValue("PHONE_HOME_NUMBER_3-1", "555");
9274311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ExpectFieldValue("PHONE_HOME_NUMBER_3-2", "555");
9284311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ExpectFieldValue("PHONE_HOME_NUMBER_4-1", "4567");
9294311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ExpectFieldValue("PHONE_HOME_NUMBER_4-2", "4567");
9304311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ExpectFieldValue("PHONE_HOME_EXT-1", std::string());
9314311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ExpectFieldValue("PHONE_HOME_EXT-2", std::string());
9324311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ExpectFieldValue("PHONE_HOME_COUNTRY_CODE-1", "1");
9334311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch}
9344311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
9354311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// Test that Autofill does not fill in read-only fields.
9364311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, NoAutofillForReadOnlyFields) {
9374311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ASSERT_TRUE(test_server()->Start());
9384311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
9394311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  std::string addr_line1("1234 H St.");
9404311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
9414311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  AutofillProfile profile;
9424311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Bob"));
9434311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  profile.SetRawInfo(NAME_LAST, ASCIIToUTF16("Smith"));
9444311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  profile.SetRawInfo(EMAIL_ADDRESS, ASCIIToUTF16("bsmith@gmail.com"));
9454311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  profile.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16(addr_line1));
9464311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  profile.SetRawInfo(ADDRESS_HOME_CITY, ASCIIToUTF16("San Jose"));
9474311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  profile.SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("CA"));
9484311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  profile.SetRawInfo(ADDRESS_HOME_ZIP, ASCIIToUTF16("95110"));
9494311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  profile.SetRawInfo(COMPANY_NAME, ASCIIToUTF16("Company X"));
9504311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  profile.SetRawInfo(PHONE_HOME_WHOLE_NUMBER, ASCIIToUTF16("408-871-4567"));
9514311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  SetProfile(profile);
9524311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
9534311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  GURL url = test_server()->GetURL("files/autofill/read_only_field_test.html");
9544311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
9554311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  PopulateForm("firstname");
9564311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
9574311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ExpectFieldValue("email", std::string());
9584311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ExpectFieldValue("address", addr_line1);
9594311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch}
9604311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
9614311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// Test form is fillable from a profile after form was reset.
9624311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// Steps:
9634311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch//   1. Fill form using a saved profile.
9644311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch//   2. Reset the form.
9654311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch//   3. Fill form using a saved profile.
9664311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// Flakily times out: http://crbug.com/270341
9674311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, DISABLED_FormFillableOnReset) {
9684311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ASSERT_TRUE(test_server()->Start());
9694311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
9704311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  CreateTestProfile();
9714311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
9724311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  GURL url = test_server()->GetURL("files/autofill/autofill_test_form.html");
9734311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
9744311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  PopulateForm("NAME_FIRST");
9754311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
9764311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ASSERT_TRUE(content::ExecuteScript(
9774311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      browser()->tab_strip_model()->GetActiveWebContents(),
9784311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "document.getElementById('testform').reset()"));
9794311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
9804311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  PopulateForm("NAME_FIRST");
9814311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
9824311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ExpectFieldValue("NAME_FIRST", "Milton");
9834311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ExpectFieldValue("NAME_LAST", "Waddams");
9844311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ExpectFieldValue("EMAIL_ADDRESS", "red.swingline@initech.com");
9854311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ExpectFieldValue("ADDRESS_HOME_LINE1", "4120 Freidrich Lane");
9864311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ExpectFieldValue("ADDRESS_HOME_CITY", "Austin");
9874311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ExpectFieldValue("ADDRESS_HOME_STATE", "Texas");
9884311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ExpectFieldValue("ADDRESS_HOME_ZIP", "78744");
9894311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ExpectFieldValue("ADDRESS_HOME_COUNTRY", "United States");
9904311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ExpectFieldValue("PHONE_HOME_WHOLE_NUMBER", "5125551234");
9914311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch}
9924311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
9934311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// Test Autofill distinguishes a middle initial in a name.
9944311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// Flakily times out: http://crbug.com/270341
9954311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest,
9964311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                       DISABLED_DistinguishMiddleInitialWithinName) {
9974311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ASSERT_TRUE(test_server()->Start());
9984311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
9994311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  CreateTestProfile();
10004311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
10014311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  GURL url = test_server()->GetURL(
10024311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "files/autofill/autofill_middleinit_form.html");
10034311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
10044311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  PopulateForm("NAME_FIRST");
10054311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
10064311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ExpectFieldValue("NAME_MIDDLE", "C");
10074311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch}
10084311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
10094311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// Test forms with multiple email addresses are filled properly.
10104311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// Entire form should be filled with one user gesture.
10114311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// Flakily times out: http://crbug.com/270341
10124311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest,
10134311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                       DISABLED_MultipleEmailFilledByOneUserGesture) {
10144311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ASSERT_TRUE(test_server()->Start());
10154311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
10164311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  std::string email("bsmith@gmail.com");
10174311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
10184311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  AutofillProfile profile;
10194311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Bob"));
10204311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  profile.SetRawInfo(NAME_LAST, ASCIIToUTF16("Smith"));
10214311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  profile.SetRawInfo(EMAIL_ADDRESS, ASCIIToUTF16(email));
10224311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  profile.SetRawInfo(PHONE_HOME_WHOLE_NUMBER, ASCIIToUTF16("4088714567"));
10234311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  SetProfile(profile);
10244311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
10254311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  GURL url = test_server()->GetURL(
10264311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "files/autofill/autofill_confirmemail_form.html");
10274311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
10284311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  PopulateForm("NAME_FIRST");
10294311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
10304311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ExpectFieldValue("EMAIL_CONFIRM", email);
10314311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // TODO(isherman): verify entire form.
10324311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch}
10334311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
10344311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// http://crbug.com/150084
10354311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#if defined(OS_MACOSX)
10364311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#define MAYBE_FormFillLatencyAfterSubmit FormFillLatencyAfterSubmit
10374311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#else
10384311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#define MAYBE_FormFillLatencyAfterSubmit DISABLED_FormFillLatencyAfterSubmit
10394311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#endif
10404311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// Test latency time on form submit with lots of stored Autofill profiles.
10414311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// This test verifies when a profile is selected from the Autofill dictionary
10424311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// that consists of thousands of profiles, the form does not hang after being
10434311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// submitted.
10444311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest,
10454311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                       MAYBE_FormFillLatencyAfterSubmit) {
10464311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ASSERT_TRUE(test_server()->Start());
10474311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
10484311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  std::vector<std::string> cities;
10494311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  cities.push_back("San Jose");
10504311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  cities.push_back("San Francisco");
10514311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  cities.push_back("Sacramento");
10524311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  cities.push_back("Los Angeles");
10534311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
10544311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  std::vector<std::string> streets;
10554311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  streets.push_back("St");
10564311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  streets.push_back("Ave");
10574311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  streets.push_back("Ln");
10584311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  streets.push_back("Ct");
10594311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
10604311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  const int kNumProfiles = 1500;
10614311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  base::Time start_time = base::Time::Now();
10624311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  std::vector<AutofillProfile> profiles;
10634311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  for (int i = 0; i < kNumProfiles; i++) {
10644311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    AutofillProfile profile;
10654311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    string16 name(base::IntToString16(i));
10664311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    string16 email(name + ASCIIToUTF16("@example.com"));
10674311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    string16 street = ASCIIToUTF16(
10684311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        base::IntToString(base::RandInt(0, 10000)) + " " +
10694311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        streets[base::RandInt(0, streets.size() - 1)]);
10704311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    string16 city = ASCIIToUTF16(cities[base::RandInt(0, cities.size() - 1)]);
10714311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    string16 zip(base::IntToString16(base::RandInt(0, 10000)));
10724311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    profile.SetRawInfo(NAME_FIRST, name);
10734311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    profile.SetRawInfo(EMAIL_ADDRESS, email);
10744311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    profile.SetRawInfo(ADDRESS_HOME_LINE1, street);
10754311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    profile.SetRawInfo(ADDRESS_HOME_CITY, city);
10764311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    profile.SetRawInfo(ADDRESS_HOME_STATE, WideToUTF16(L"CA"));
10774311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    profile.SetRawInfo(ADDRESS_HOME_ZIP, zip);
10784311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    profile.SetRawInfo(ADDRESS_HOME_COUNTRY, WideToUTF16(L"US"));
10794311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    profiles.push_back(profile);
10804311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  }
10814311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  SetProfiles(&profiles);
10824311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // TODO(isherman): once we're sure this test doesn't timeout on any bots, this
10834311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // can be removd.
10844311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  LOG(INFO) << "Created " << kNumProfiles << " profiles in " <<
10854311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch               (base::Time::Now() - start_time).InSeconds() << " seconds.";
10864311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
10874311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  GURL url = test_server()->GetURL(
10884311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "files/autofill/latency_after_submit_test.html");
10894311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
10904311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  PopulateForm("NAME_FIRST");
10914311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
10924311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  content::WindowedNotificationObserver load_stop_observer(
10934311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      content::NOTIFICATION_LOAD_STOP,
10944311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      content::Source<content::NavigationController>(
10954311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch          &browser()->tab_strip_model()->GetActiveWebContents()->
10964311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch              GetController()));
10974311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
10984311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ASSERT_TRUE(content::ExecuteScript(
10994311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      GetRenderViewHost(),
11004311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "document.getElementById('testform').submit();"));
11014311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // This will ensure the test didn't hang.
11024311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  load_stop_observer.Wait();
11034311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch}
11044311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
11054311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// Test that Chrome doesn't crash when autocomplete is disabled while the user
11064311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// is interacting with the form.  This is a regression test for
11074311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// http://crbug.com/160476
11084311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest,
11094311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                       DisableAutocompleteWhileFilling) {
11104311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  CreateTestProfile();
11114311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
11124311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Load the test page.
11134311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
11144311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      GURL(std::string(kDataURIPrefix) + kTestFormString)));
11154311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
11164311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Invoke Autofill: Start filling the first name field with "M" and wait for
11174311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // the popup to be shown.
11184311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  FocusFirstNameField();
11194311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  SendKeyToPageAndWait(ui::VKEY_M);
11204311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
11214311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Now that the popup with suggestions is showing, disable autocomplete for
11224311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // the active field.
11234311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ASSERT_TRUE(content::ExecuteScript(
11244311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      GetRenderViewHost(),
11254311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "document.querySelector('input').autocomplete = 'off';"));
11264311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
11274311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Press the down arrow to select the suggestion and attempt to preview the
11284311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // autofilled form.
11294311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  content::NativeWebKeyboardEvent event;
11304311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  event.windowsKeyCode = ui::VKEY_DOWN;
11314311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  GetExternalDelegate()->keyboard_listener()->HandleKeyPressEvent(event);
11324311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
11334311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Wait for any IPCs to complete by performing an action that generates an
11344311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // IPC that's easy to wait for.  Chrome shouldn't crash.
11354311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  bool result = false;
11364311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
11374311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      GetRenderViewHost(),
11384311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "var city = document.getElementById('city');"
11394311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "city.onfocus = function() { domAutomationController.send(true); };"
11404311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      "city.focus()",
11414311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      &result));
11424311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ASSERT_TRUE(result);
11434311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  SendKeyToPageAndWait(ui::VKEY_A);
11444311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch}
11454311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
1146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace autofill
1147