1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include <string>
6ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
7ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/basictypes.h"
8ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/command_line.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/ref_counted.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
12ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/rand_util.h"
13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/strings/string16.h"
14ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/strings/string_number_conversions.h"
15ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/strings/string_split.h"
16ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/strings/utf_string_conversions.h"
17ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/time/time.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/autofill/personal_data_manager_factory.h"
197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
20ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/infobars/infobar_service.h"
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/profiles/profile.h"
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/translate/chrome_translate_client.h"
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/translate/translate_service.h"
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/browser.h"
25ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/ui/browser_window.h"
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
27ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/common/render_messages.h"
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/test/base/interactive_test_utils.h"
30ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/test/base/test_switches.h"
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/autofill/content/browser/content_autofill_driver.h"
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_manager.h"
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_manager_test_delegate.h"
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_profile.h"
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/autofill/core/browser/autofill_test_utils.h"
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/personal_data_manager.h"
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/personal_data_manager_observer.h"
39ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/autofill/core/browser/validation.h"
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/infobars/core/confirm_infobar_delegate.h"
410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/infobars/core/infobar.h"
42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "components/infobars/core/infobar_manager.h"
4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/translate/core/browser/translate_infobar_delegate.h"
44ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/browser/navigation_controller.h"
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/notification_observer.h"
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/notification_registrar.h"
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/notification_service.h"
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/render_view_host.h"
490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "content/public/browser/render_widget_host.h"
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/web_contents.h"
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/test/browser_test_utils.h"
52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/test/test_renderer_host.h"
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/test/test_utils.h"
54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "net/url_request/test_url_fetcher_factory.h"
55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "testing/gmock/include/gmock/gmock.h"
56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "testing/gtest/include/gtest/gtest.h"
57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h"
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16;
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace autofill {
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
634ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdochstatic const char kDataURIPrefix[] = "data:text/html;charset=utf-8,";
644ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdochstatic const char kTestFormString[] =
65ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "<form action=\"http://www.example.com/\" method=\"POST\">"
66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "<label for=\"firstname\">First name:</label>"
67ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <input type=\"text\" id=\"firstname\""
684ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    "        onfocus=\"domAutomationController.send(true)\"><br>"
69ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "<label for=\"lastname\">Last name:</label>"
70ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <input type=\"text\" id=\"lastname\"><br>"
71ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "<label for=\"address1\">Address line 1:</label>"
72ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <input type=\"text\" id=\"address1\"><br>"
73ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "<label for=\"address2\">Address line 2:</label>"
74ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <input type=\"text\" id=\"address2\"><br>"
75ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "<label for=\"city\">City:</label>"
76ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <input type=\"text\" id=\"city\"><br>"
77ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "<label for=\"state\">State:</label>"
78ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <select id=\"state\">"
79ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <option value=\"\" selected=\"yes\">--</option>"
80ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <option value=\"CA\">California</option>"
81ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <option value=\"TX\">Texas</option>"
82ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " </select><br>"
83ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "<label for=\"zip\">ZIP code:</label>"
84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <input type=\"text\" id=\"zip\"><br>"
85ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "<label for=\"country\">Country:</label>"
86ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <select id=\"country\">"
87ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <option value=\"\" selected=\"yes\">--</option>"
88ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <option value=\"CA\">Canada</option>"
89ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <option value=\"US\">United States</option>"
90ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " </select><br>"
91ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "<label for=\"phone\">Phone number:</label>"
92ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <input type=\"text\" id=\"phone\"><br>"
93ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "</form>";
94ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
952385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
962385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// AutofillManagerTestDelegateImpl --------------------------------------------
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AutofillManagerTestDelegateImpl
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public autofill::AutofillManagerTestDelegate {
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutofillManagerTestDelegateImpl() {}
1022385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  virtual ~AutofillManagerTestDelegateImpl() {}
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // autofill::AutofillManagerTestDelegate:
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidPreviewFormData() OVERRIDE {
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ASSERT_TRUE(loop_runner_->loop_running());
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    loop_runner_->Quit();
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidFillFormData() OVERRIDE {
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ASSERT_TRUE(loop_runner_->loop_running());
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    loop_runner_->Quit();
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidShowSuggestions() OVERRIDE {
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ASSERT_TRUE(loop_runner_->loop_running());
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    loop_runner_->Quit();
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void Reset() {
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    loop_runner_ = new content::MessageLoopRunner();
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void Wait() {
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    loop_runner_->Run();
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner_;
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AutofillManagerTestDelegateImpl);
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1342385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
1352385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// WindowedPersonalDataManagerObserver ----------------------------------------
1362385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class WindowedPersonalDataManagerObserver
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public PersonalDataManagerObserver,
139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      public infobars::InfoBarManager::Observer {
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit WindowedPersonalDataManagerObserver(Browser* browser)
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : alerted_(false),
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        has_run_message_loop_(false),
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        browser_(browser),
145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        infobar_service_(InfoBarService::FromWebContents(
146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            browser_->tab_strip_model()->GetActiveWebContents())) {
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PersonalDataManagerFactory::GetForProfile(browser_->profile())->
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        AddObserver(this);
149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    infobar_service_->AddObserver(this);
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~WindowedPersonalDataManagerObserver() {
153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    while (infobar_service_->infobar_count() > 0) {
154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      infobar_service_->RemoveInfoBar(infobar_service_->infobar_at(0));
1552385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    }
156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    infobar_service_->RemoveObserver(this);
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // PersonalDataManagerObserver:
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnPersonalDataChanged() OVERRIDE {
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (has_run_message_loop_) {
16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoopForUI::current()->Quit();
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      has_run_message_loop_ = false;
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    alerted_ = true;
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnInsufficientFormData() OVERRIDE {
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    OnPersonalDataChanged();
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
173a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void Wait() {
174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (!alerted_) {
175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      has_run_message_loop_ = true;
176a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      content::RunMessageLoop();
177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
178a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    PersonalDataManagerFactory::GetForProfile(browser_->profile())->
179a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        RemoveObserver(this);
180a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
181a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // infobars::InfoBarManager::Observer:
184010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void OnInfoBarAdded(infobars::InfoBar* infobar) OVERRIDE {
185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    infobar_service_->infobar_at(0)->delegate()->AsConfirmInfoBarDelegate()->
186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        Accept();
187010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
188010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool alerted_;
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool has_run_message_loop_;
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Browser* browser_;
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  InfoBarService* infobar_service_;
1932385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
1942385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  DISALLOW_COPY_AND_ASSIGN(WindowedPersonalDataManagerObserver);
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1972385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// AutofillInteractiveTest ----------------------------------------------------
1982385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AutofillInteractiveTest : public InProcessBrowserTest {
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
2010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  AutofillInteractiveTest() :
2020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      key_press_event_sink_(
2030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          base::Bind(&AutofillInteractiveTest::HandleKeyPressEvent,
2040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                     base::Unretained(this))) {}
2052385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  virtual ~AutofillInteractiveTest() {}
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
207a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // InProcessBrowserTest:
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Don't want Keychain coming up on Mac.
210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    test::DisableSystemServices(browser()->profile()->GetPrefs());
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // Inject the test delegate into the AutofillManager.
2130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    content::WebContents* web_contents = GetWebContents();
214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ContentAutofillDriver* autofill_driver =
215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        ContentAutofillDriver::FromWebContents(web_contents);
2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    AutofillManager* autofill_manager = autofill_driver->autofill_manager();
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    autofill_manager->SetTestDelegate(&test_delegate_);
2186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    // If the mouse happened to be over where the suggestions are shown, then
2206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    // the preview will show up and will fail the tests. We need to give it a
2216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    // point that's within the browser frame, or else the method hangs.
2226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    gfx::Point reset_mouse(GetWebContents()->GetContainerBounds().origin());
2236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    reset_mouse = gfx::Point(reset_mouse.x() + 5, reset_mouse.y() + 5);
2246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ASSERT_TRUE(ui_test_utils::SendMouseMoveSync(reset_mouse));
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void TearDownOnMainThread() OVERRIDE {
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Make sure to close any showing popups prior to tearing down the UI.
2290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    content::WebContents* web_contents = GetWebContents();
230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    AutofillManager* autofill_manager = ContentAutofillDriver::FromWebContents(
231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            web_contents)->autofill_manager();
232f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    autofill_manager->client()->HideAutofillPopup();
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
235a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  PersonalDataManager* GetPersonalDataManager() {
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return PersonalDataManagerFactory::GetForProfile(browser()->profile());
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  content::WebContents* GetWebContents() {
2400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return browser()->tab_strip_model()->GetActiveWebContents();
241a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
242a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  content::RenderViewHost* GetRenderViewHost() {
2440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return GetWebContents()->GetRenderViewHost();
245a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
246a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void CreateTestProfile() {
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    AutofillProfile profile;
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test::SetProfileInfo(
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        &profile, "Milton", "C.", "Waddams",
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "red.swingline@initech.com", "Initech", "4120 Freidrich Lane",
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "Basement", "Austin", "Texas", "78744", "US", "5125551234");
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    WindowedPersonalDataManagerObserver observer(browser());
255a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    GetPersonalDataManager()->AddProfile(profile);
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // AddProfile is asynchronous. Wait for it to finish before continuing the
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // tests.
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    observer.Wait();
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
262ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void SetProfiles(std::vector<AutofillProfile>* profiles) {
263ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    WindowedPersonalDataManagerObserver observer(browser());
264ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    GetPersonalDataManager()->SetProfiles(profiles);
265ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    observer.Wait();
266ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
267ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
268ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void SetProfile(const AutofillProfile& profile) {
269ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    std::vector<AutofillProfile> profiles;
270ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    profiles.push_back(profile);
271ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    SetProfiles(&profiles);
272ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
273ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
274ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Populates a webpage form using autofill data and keypress events.
275ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // This function focuses the specified input field in the form, and then
276ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // sends keypress events to the tab to cause the form to be populated.
277ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void PopulateForm(const std::string& field_id) {
278ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    std::string js("document.getElementById('" + field_id + "').focus();");
279ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ASSERT_TRUE(content::ExecuteScript(GetRenderViewHost(), js));
280ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
281ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    SendKeyToPageAndWait(ui::VKEY_DOWN);
282ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    SendKeyToPopupAndWait(ui::VKEY_DOWN);
283ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    SendKeyToPopupAndWait(ui::VKEY_RETURN);
284ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
285ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ExpectFieldValue(const std::string& field_name,
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        const std::string& expected_value) {
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::string value;
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(content::ExecuteScriptAndExtractString(
2900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        GetWebContents(),
291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "window.domAutomationController.send("
292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "    document.getElementById('" + field_name + "').value);",
293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        &value));
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(expected_value, value);
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void GetFieldBackgroundColor(const std::string& field_name,
2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               std::string* color) {
2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ASSERT_TRUE(content::ExecuteScriptAndExtractString(
3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        GetWebContents(),
3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        "window.domAutomationController.send("
3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        "    document.defaultView.getComputedStyle(document.getElementById('" +
3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        field_name + "')).backgroundColor);",
3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        color));
3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
307ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void SimulateURLFetch(bool success) {
308ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0);
309ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ASSERT_TRUE(fetcher);
310ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    net::URLRequestStatus status;
311ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    status.set_status(success ? net::URLRequestStatus::SUCCESS :
312ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                net::URLRequestStatus::FAILED);
313ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
314ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    std::string script = " var google = {};"
315ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "google.translate = (function() {"
316ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "  return {"
317ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "    TranslateService: function() {"
318ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "      return {"
319ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "        isAvailable : function() {"
320ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "          return true;"
321ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "        },"
322ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "        restore : function() {"
323ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "          return;"
324ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "        },"
325ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "        getDetectedLanguage : function() {"
326ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "          return \"ja\";"
327ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "        },"
328ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "        translatePage : function(originalLang, targetLang,"
329ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "                                 onTranslateProgress) {"
330ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "          document.getElementsByTagName(\"body\")[0].innerHTML = '" +
331ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        std::string(kTestFormString) +
332ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "              ';"
333ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "          onTranslateProgress(100, true, false);"
334ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "        }"
335ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "      };"
336ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "    }"
337ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "  };"
3383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        "})();"
3393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        "cr.googleTranslate.onTranslateElementLoad();";
340ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
341ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    fetcher->set_url(fetcher->GetOriginalURL());
342ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    fetcher->set_status(status);
343ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    fetcher->set_response_code(success ? 200 : 500);
344ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    fetcher->SetResponseString(script);
345ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    fetcher->delegate()->OnURLFetchComplete(fetcher);
346ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
347ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void FocusFirstNameField() {
349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool result = false;
350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
351a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        GetRenderViewHost(),
352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "if (document.readyState === 'complete')"
353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "  document.getElementById('firstname').focus();"
354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "else"
355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "  domAutomationController.send(false);",
356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        &result));
357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(result);
358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Simulates a click on the middle of the DOM element with the given |id|.
3615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void ClickElementWithId(const std::string& id) {
3625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    int x;
3635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ASSERT_TRUE(content::ExecuteScriptAndExtractInt(
3645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        GetRenderViewHost(),
3655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        "var bounds = document.getElementById('" +
3665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            id +
3675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            "').getBoundingClientRect();"
3685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            "domAutomationController.send("
3695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            "    Math.floor(bounds.left + bounds.width / 2));",
3705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        &x));
3715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    int y;
3725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ASSERT_TRUE(content::ExecuteScriptAndExtractInt(
3735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        GetRenderViewHost(),
3745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        "var bounds = document.getElementById('" +
3755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            id +
3765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            "').getBoundingClientRect();"
3775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            "domAutomationController.send("
3785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            "    Math.floor(bounds.top + bounds.height / 2));",
3795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        &y));
3805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    content::SimulateMouseClickAt(GetWebContents(),
3815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                  0,
3825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                  blink::WebMouseEvent::ButtonLeft,
3835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                  gfx::Point(x, y));
3845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
3855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void ClickFirstNameField() {
3875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(ClickElementWithId("firstname"));
3885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
3895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Make a pointless round trip to the renderer, giving the popup a chance to
3915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // show if it's going to. If it does show, an assert in
3925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // AutofillManagerTestDelegateImpl will trigger.
3935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void MakeSurePopupDoesntAppear() {
3945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    int unused;
3955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ASSERT_TRUE(content::ExecuteScriptAndExtractInt(
3965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        GetRenderViewHost(), "domAutomationController.send(42)", &unused));
3975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
3985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ExpectFilledTestForm() {
400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("firstname", "Milton");
401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("lastname", "Waddams");
402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("address1", "4120 Freidrich Lane");
403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("address2", "Basement");
404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("city", "Austin");
405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("state", "TX");
406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("zip", "78744");
407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("country", "US");
408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("phone", "5125551234");
409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SendKeyToPageAndWait(ui::KeyboardCode key) {
412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test_delegate_.Reset();
413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::SimulateKeyPress(
4140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        GetWebContents(), key, false, false, false, false);
415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test_delegate_.Wait();
416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  bool HandleKeyPressEvent(const content::NativeWebKeyboardEvent& event) {
4190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return true;
4200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
4210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SendKeyToPopupAndWait(ui::KeyboardCode key) {
4230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // Route popup-targeted key presses via the render view host.
424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::NativeWebKeyboardEvent event;
425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    event.windowsKeyCode = key;
426f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    event.type = blink::WebKeyboardEvent::RawKeyDown;
427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test_delegate_.Reset();
4280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // Install the key press event sink to ensure that any events that are not
4290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // handled by the installed callbacks do not end up crashing the test.
4300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    GetRenderViewHost()->AddKeyPressEventCallback(key_press_event_sink_);
4310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    GetRenderViewHost()->ForwardKeyboardEvent(event);
432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test_delegate_.Wait();
4330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    GetRenderViewHost()->RemoveKeyPressEventCallback(key_press_event_sink_);
434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Datalist does not support autofill preview. There is no need to start
4371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // message loop for Datalist.
4381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void SendKeyToDataListPopup(ui::KeyboardCode key) {
4391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Route popup-targeted key presses via the render view host.
4401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    content::NativeWebKeyboardEvent event;
4411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    event.windowsKeyCode = key;
4421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    event.type = blink::WebKeyboardEvent::RawKeyDown;
4431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Install the key press event sink to ensure that any events that are not
4441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // handled by the installed callbacks do not end up crashing the test.
4451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    GetRenderViewHost()->AddKeyPressEventCallback(key_press_event_sink_);
4461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    GetRenderViewHost()->ForwardKeyboardEvent(event);
4471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    GetRenderViewHost()->RemoveKeyPressEventCallback(key_press_event_sink_);
4481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
4491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
450ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void TryBasicFormFill() {
451ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    FocusFirstNameField();
452ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
453ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // Start filling the first name field with "M" and wait for the popup to be
454ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // shown.
455ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    SendKeyToPageAndWait(ui::VKEY_M);
456ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
457ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // Press the down arrow to select the suggestion and preview the autofilled
458ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // form.
459ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    SendKeyToPopupAndWait(ui::VKEY_DOWN);
460ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
461ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // The previewed values should not be accessible to JavaScript.
462ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ExpectFieldValue("firstname", "M");
463ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ExpectFieldValue("lastname", std::string());
464ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ExpectFieldValue("address1", std::string());
465ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ExpectFieldValue("address2", std::string());
466ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ExpectFieldValue("city", std::string());
467ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ExpectFieldValue("state", std::string());
468ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ExpectFieldValue("zip", std::string());
469ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ExpectFieldValue("country", std::string());
470ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ExpectFieldValue("phone", std::string());
471ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // TODO(isherman): It would be nice to test that the previewed values are
472ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // displayed: http://crbug.com/57220
473ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
474ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // Press Enter to accept the autofill suggestions.
475ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    SendKeyToPopupAndWait(ui::VKEY_RETURN);
476ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
477ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // The form should be filled.
478ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ExpectFilledTestForm();
479ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
480ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
4815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  AutofillManagerTestDelegateImpl* test_delegate() { return &test_delegate_; }
4825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4832385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch private:
484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutofillManagerTestDelegateImpl test_delegate_;
4852385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
486ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  net::TestURLFetcherFactory url_fetcher_factory_;
487ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
4880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // KeyPressEventCallback that serves as a sink to ensure that every key press
4890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // event the tests create and have the WebContents forward is handled by some
4900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // key press event callback. It is necessary to have this sinkbecause if no
4910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // key press event callback handles the event (at least on Mac), a DCHECK
4920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // ends up going off that the |event| doesn't have an |os_event| associated
4930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // with it.
4940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  content::RenderWidgetHost::KeyPressEventCallback key_press_event_sink_;
4950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
4962385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  DISALLOW_COPY_AND_ASSIGN(AutofillInteractiveTest);
497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
499ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test that basic form fill is working.
500ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, BasicFormFill) {
501ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
502ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
503ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Load the test page.
504ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
505ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GURL(std::string(kDataURIPrefix) + kTestFormString)));
5062385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
507ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Invoke Autofill.
508ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  TryBasicFormFill();
509ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
5102385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
511ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test that form filling can be initiated by pressing the down arrow.
512ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, AutofillViaDownArrow) {
513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CreateTestProfile();
514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Load the test page.
516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      GURL(std::string(kDataURIPrefix) + kTestFormString)));
518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Focus a fillable field.
520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FocusFirstNameField();
521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
522ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Press the down arrow to initiate Autofill and wait for the popup to be
523ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // shown.
524ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SendKeyToPageAndWait(ui::VKEY_DOWN);
525ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
526ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Press the down arrow to select the suggestion and preview the autofilled
527ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // form.
528ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SendKeyToPopupAndWait(ui::VKEY_DOWN);
529ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
530ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Press Enter to accept the autofill suggestions.
531ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SendKeyToPopupAndWait(ui::VKEY_RETURN);
532ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
533ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // The form should be filled.
534ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFilledTestForm();
535ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
536ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
537ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, AutofillSelectViaTab) {
538ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
539ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
540ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Load the test page.
541ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
542ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GURL(std::string(kDataURIPrefix) + kTestFormString)));
543ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
544ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Focus a fillable field.
545ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  FocusFirstNameField();
546558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Press the down arrow to initiate Autofill and wait for the popup to be
548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // shown.
549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SendKeyToPageAndWait(ui::VKEY_DOWN);
550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Press the down arrow to select the suggestion and preview the autofilled
552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // form.
553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SendKeyToPopupAndWait(ui::VKEY_DOWN);
554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Press tab to accept the autofill suggestions.
556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SendKeyToPopupAndWait(ui::VKEY_TAB);
557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The form should be filled.
559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ExpectFilledTestForm();
560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, AutofillViaClick) {
5635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  CreateTestProfile();
5645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Load the test page.
5665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
5675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      browser(), GURL(std::string(kDataURIPrefix) + kTestFormString)));
5685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Focus a fillable field.
5695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(FocusFirstNameField());
5705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Now click it.
5725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  test_delegate()->Reset();
5735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(ClickFirstNameField());
5745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  test_delegate()->Wait();
5755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Press the down arrow to select the suggestion and preview the autofilled
5775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // form.
5785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  SendKeyToPopupAndWait(ui::VKEY_DOWN);
5795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Press Enter to accept the autofill suggestions.
5815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  SendKeyToPopupAndWait(ui::VKEY_RETURN);
5825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The form should be filled.
5845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExpectFilledTestForm();
5855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
5865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Makes sure that the first click does *not* activate the popup.
5885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, DontAutofillForFirstClick) {
5895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  CreateTestProfile();
5905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Load the test page.
5925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
5935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      browser(), GURL(std::string(kDataURIPrefix) + kTestFormString)));
5945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Click the first name field while it's out of focus, then twiddle our thumbs
5965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // a bit. If a popup were to show, it would hit the asserts in
5975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // AutofillManagerTestDelegateImpl while we're wasting time.
5985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(ClickFirstNameField());
5995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(MakeSurePopupDoesntAppear());
6005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The second click should activate the popup since the first click focused
6025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // the field.
6035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  test_delegate()->Reset();
6045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(ClickFirstNameField());
6055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  test_delegate()->Wait();
6065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
6075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Makes sure that clicking outside the focused field doesn't activate
6095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// the popup.
6105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, DontAutofillForOutsideClick) {
6115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  CreateTestProfile();
6125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Load the test page.
6145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
6155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      browser(),
6165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      GURL(std::string(kDataURIPrefix) + kTestFormString +
6175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)           "<button disabled id='disabled-button'>Cant click this</button>")));
6185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(FocusFirstNameField());
6205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Clicking a disabled button will generate a mouse event but focus doesn't
6225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // change. This tests that autofill can handle a mouse event outside a focused
6235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // input *without* showing the popup.
6245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(ClickElementWithId("disabled-button"));
6255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(MakeSurePopupDoesntAppear());
6265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  test_delegate()->Reset();
6285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(ClickFirstNameField());
6295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  test_delegate()->Wait();
6305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
6315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
632116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Test that a field is still autofillable after the previously autofilled
633116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// value is deleted.
634116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, OnDeleteValueAfterAutofill) {
635116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CreateTestProfile();
636116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
637116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Load the test page.
638116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
639116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      GURL(std::string(kDataURIPrefix) + kTestFormString)));
640116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
641116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Invoke and accept the Autofill popup and verify the form was filled.
642116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FocusFirstNameField();
643116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SendKeyToPageAndWait(ui::VKEY_M);
644116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SendKeyToPopupAndWait(ui::VKEY_DOWN);
645116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SendKeyToPopupAndWait(ui::VKEY_RETURN);
646116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ExpectFilledTestForm();
647116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
648116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Delete the value of a filled field.
649116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(content::ExecuteScript(
650116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      GetRenderViewHost(),
651116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "document.getElementById('firstname').value = '';"));
652116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ExpectFieldValue("firstname", "");
653116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
654116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Invoke and accept the Autofill popup and verify the field was filled.
655116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SendKeyToPageAndWait(ui::VKEY_M);
656116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SendKeyToPopupAndWait(ui::VKEY_DOWN);
657116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SendKeyToPopupAndWait(ui::VKEY_RETURN);
658116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ExpectFieldValue("firstname", "Milton");
659116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
660116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
6611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test that an input field is not rendered with the yellow autofilled
6621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// background color when choosing an option from the datalist suggestion list.
6631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, OnSelectOptionFromDatalist) {
6641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Load the test page.
6651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
6661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      browser(),
6671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      GURL(std::string(kDataURIPrefix) +
6681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           "<form action=\"http://www.example.com/\" method=\"POST\">"
6691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           "  <input list=\"dl\" type=\"search\" id=\"firstname\""
6701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           "         onfocus=\"domAutomationController.send(true)\"><br>"
6711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           "  <datalist id=\"dl\">"
6721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           "  <option value=\"Adam\"></option>"
6731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           "  <option value=\"Bob\"></option>"
6741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           "  <option value=\"Carl\"></option>"
6751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           "  </datalist>"
6761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           "</form>")));
6771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string orginalcolor;
6781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GetFieldBackgroundColor("firstname", &orginalcolor);
6791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FocusFirstNameField();
6811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SendKeyToPageAndWait(ui::VKEY_DOWN);
6821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SendKeyToDataListPopup(ui::VKEY_DOWN);
6831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SendKeyToDataListPopup(ui::VKEY_RETURN);
6841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ExpectFieldValue("firstname", "Adam");
6851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string color;
6861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GetFieldBackgroundColor("firstname", &color);
6871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(color, orginalcolor);
6881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
6891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6904ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch// Test that a JavaScript oninput event is fired after auto-filling a form.
6914ad1aa43a48567659193a298fad74f55e00b3dd9Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, OnInputAfterAutofill) {
6924ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  CreateTestProfile();
6934ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
6944ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  const char kOnInputScript[] =
6954ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "<script>"
6964ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "focused_fired = false;"
6974ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "unfocused_fired = false;"
6984ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "changed_select_fired = false;"
6994ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "unchanged_select_fired = false;"
7004ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "document.getElementById('firstname').oninput = function() {"
7014ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "  focused_fired = true;"
7024ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "};"
7034ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "document.getElementById('lastname').oninput = function() {"
7044ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "  unfocused_fired = true;"
7054ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "};"
7064ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "document.getElementById('state').oninput = function() {"
7074ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "  changed_select_fired = true;"
7084ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "};"
7094ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "document.getElementById('country').oninput = function() {"
7104ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "  unchanged_select_fired = true;"
7114ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "};"
7124ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "document.getElementById('country').value = 'US';"
7134ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "</script>";
7144ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
7154ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // Load the test page.
7164ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
7174ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      GURL(std::string(kDataURIPrefix) + kTestFormString + kOnInputScript)));
7184ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
7194ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // Invoke Autofill.
7204ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  FocusFirstNameField();
7214ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
7224ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // Start filling the first name field with "M" and wait for the popup to be
7234ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // shown.
7244ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  SendKeyToPageAndWait(ui::VKEY_M);
7254ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
7264ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // Press the down arrow to select the suggestion and preview the autofilled
7274ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // form.
7284ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  SendKeyToPopupAndWait(ui::VKEY_DOWN);
7294ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
7304ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // Press Enter to accept the autofill suggestions.
7314ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  SendKeyToPopupAndWait(ui::VKEY_RETURN);
7324ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
7334ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // The form should be filled.
7344ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  ExpectFilledTestForm();
7354ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
7364ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  bool focused_fired = false;
7374ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  bool unfocused_fired = false;
7384ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  bool changed_select_fired = false;
7394ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  bool unchanged_select_fired = false;
7404ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
7414ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      GetRenderViewHost(),
7424ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "domAutomationController.send(focused_fired);",
7434ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      &focused_fired));
7444ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
7454ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      GetRenderViewHost(),
7464ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "domAutomationController.send(unfocused_fired);",
7474ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      &unfocused_fired));
7484ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
7494ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      GetRenderViewHost(),
7504ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "domAutomationController.send(changed_select_fired);",
7514ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      &changed_select_fired));
7524ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
7534ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      GetRenderViewHost(),
7544ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "domAutomationController.send(unchanged_select_fired);",
7554ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      &unchanged_select_fired));
7564ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_TRUE(focused_fired);
7574ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_TRUE(unfocused_fired);
7584ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_TRUE(changed_select_fired);
7594ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_FALSE(unchanged_select_fired);
7604ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch}
7614ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
762ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test that a JavaScript onchange event is fired after auto-filling a form.
7634ad1aa43a48567659193a298fad74f55e00b3dd9Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, OnChangeAfterAutofill) {
764ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
765ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
7664ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  const char kOnChangeScript[] =
767ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "<script>"
768ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "focused_fired = false;"
769ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "unfocused_fired = false;"
770ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "changed_select_fired = false;"
771ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "unchanged_select_fired = false;"
772ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "document.getElementById('firstname').onchange = function() {"
773ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "  focused_fired = true;"
774ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "};"
775ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "document.getElementById('lastname').onchange = function() {"
776ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "  unfocused_fired = true;"
777ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "};"
778ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "document.getElementById('state').onchange = function() {"
779ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "  changed_select_fired = true;"
780ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "};"
781ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "document.getElementById('country').onchange = function() {"
782ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "  unchanged_select_fired = true;"
783ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "};"
784ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "document.getElementById('country').value = 'US';"
785ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "</script>";
786ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
787ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Load the test page.
788ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
789ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GURL(std::string(kDataURIPrefix) + kTestFormString + kOnChangeScript)));
790ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
791ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Invoke Autofill.
792ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  FocusFirstNameField();
793ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
794ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Start filling the first name field with "M" and wait for the popup to be
795ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // shown.
796ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SendKeyToPageAndWait(ui::VKEY_M);
797ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
798ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Press the down arrow to select the suggestion and preview the autofilled
799ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // form.
800ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SendKeyToPopupAndWait(ui::VKEY_DOWN);
801ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
802ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Press Enter to accept the autofill suggestions.
803ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SendKeyToPopupAndWait(ui::VKEY_RETURN);
804ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
805ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // The form should be filled.
806ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFilledTestForm();
807ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
808ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool focused_fired = false;
809ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool unfocused_fired = false;
810ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool changed_select_fired = false;
811ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool unchanged_select_fired = false;
812ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
813ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GetRenderViewHost(),
814ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "domAutomationController.send(focused_fired);",
815ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &focused_fired));
816ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
817ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GetRenderViewHost(),
818ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "domAutomationController.send(unfocused_fired);",
819ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &unfocused_fired));
820ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
821ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GetRenderViewHost(),
822ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "domAutomationController.send(changed_select_fired);",
823ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &changed_select_fired));
824ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
825ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GetRenderViewHost(),
826ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "domAutomationController.send(unchanged_select_fired);",
827ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &unchanged_select_fired));
8284ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_TRUE(focused_fired);
829ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(unfocused_fired);
830ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(changed_select_fired);
831ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(unchanged_select_fired);
8324ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch}
833ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
8344ad1aa43a48567659193a298fad74f55e00b3dd9Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, InputFiresBeforeChange) {
8354ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  CreateTestProfile();
8364ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
8374ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  const char kInputFiresBeforeChangeScript[] =
8384ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "<script>"
8394ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "inputElementEvents = [];"
8404ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "function recordInputElementEvent(e) {"
8414ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "  if (e.target.tagName != 'INPUT') throw 'only <input> tags allowed';"
8424ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "  inputElementEvents.push(e.type);"
8434ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "}"
8444ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "selectElementEvents = [];"
8454ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "function recordSelectElementEvent(e) {"
8464ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "  if (e.target.tagName != 'SELECT') throw 'only <select> tags allowed';"
8474ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "  selectElementEvents.push(e.type);"
8484ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "}"
8494ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "document.getElementById('lastname').oninput = recordInputElementEvent;"
8504ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "document.getElementById('lastname').onchange = recordInputElementEvent;"
8514ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "document.getElementById('country').oninput = recordSelectElementEvent;"
8524ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "document.getElementById('country').onchange = recordSelectElementEvent;"
8534ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "</script>";
8544ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
8554ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // Load the test page.
8564ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
8574ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      GURL(std::string(kDataURIPrefix) + kTestFormString +
8584ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch           kInputFiresBeforeChangeScript)));
8594ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
8604ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // Invoke and accept the Autofill popup and verify the form was filled.
8614ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  FocusFirstNameField();
8624ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  SendKeyToPageAndWait(ui::VKEY_M);
8634ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  SendKeyToPopupAndWait(ui::VKEY_DOWN);
8644ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  SendKeyToPopupAndWait(ui::VKEY_RETURN);
8654ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  ExpectFilledTestForm();
8664ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
8674ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  int num_input_element_events = -1;
8684ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractInt(
869ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GetRenderViewHost(),
8704ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "domAutomationController.send(inputElementEvents.length);",
8714ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      &num_input_element_events));
8724ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_EQ(2, num_input_element_events);
8734ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
8744ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  std::vector<std::string> input_element_events;
8754ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  input_element_events.resize(2);
8764ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
8774ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractString(
8784ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      GetRenderViewHost(),
8794ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "domAutomationController.send(inputElementEvents[0]);",
8804ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      &input_element_events[0]));
8814ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractString(
8824ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      GetRenderViewHost(),
8834ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "domAutomationController.send(inputElementEvents[1]);",
8844ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      &input_element_events[1]));
8854ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
8864ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_EQ("input", input_element_events[0]);
8874ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_EQ("change", input_element_events[1]);
8884ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
8894ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  int num_select_element_events = -1;
8904ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractInt(
8914ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      GetRenderViewHost(),
8924ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "domAutomationController.send(selectElementEvents.length);",
8934ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      &num_select_element_events));
8944ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_EQ(2, num_select_element_events);
8954ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
8964ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  std::vector<std::string> select_element_events;
8974ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  select_element_events.resize(2);
8984ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
8994ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractString(
9004ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      GetRenderViewHost(),
9014ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "domAutomationController.send(selectElementEvents[0]);",
9024ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      &select_element_events[0]));
9034ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractString(
9044ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      GetRenderViewHost(),
9054ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "domAutomationController.send(selectElementEvents[1]);",
9064ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      &select_element_events[1]));
9074ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
9084ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_EQ("input", select_element_events[0]);
9094ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_EQ("change", select_element_events[1]);
910ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
911ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
912ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test that we can autofill forms distinguished only by their |id| attribute.
913ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest,
914ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                       AutofillFormsDistinguishedById) {
915ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
916ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
917ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Load the test page.
918ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const std::string kURL =
919ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      std::string(kDataURIPrefix) + kTestFormString +
920ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "<script>"
921ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "var mainForm = document.forms[0];"
922ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "mainForm.id = 'mainForm';"
923ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "var newForm = document.createElement('form');"
924ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "newForm.action = mainForm.action;"
925ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "newForm.method = mainForm.method;"
926ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "newForm.id = 'newForm';"
927ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "mainForm.parentNode.insertBefore(newForm, mainForm);"
928ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "</script>";
929ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(), GURL(kURL)));
930ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
931ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Invoke Autofill.
932ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  TryBasicFormFill();
933ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
934ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
935ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test that we properly autofill forms with repeated fields.
936ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// In the wild, the repeated fields are typically either email fields
937ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// (duplicated for "confirmation"); or variants that are hot-swapped via
938ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// JavaScript, with only one actually visible at any given time.
939ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, AutofillFormWithRepeatedField) {
940ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
941ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
942ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Load the test page.
943ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
944ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GURL(std::string(kDataURIPrefix) +
945ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<form action=\"http://www.example.com/\" method=\"POST\">"
946ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"firstname\">First name:</label>"
947ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"firstname\""
9484ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch           "        onfocus=\"domAutomationController.send(true)\"><br>"
949ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"lastname\">Last name:</label>"
950ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"lastname\"><br>"
951ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"address1\">Address line 1:</label>"
952ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"address1\"><br>"
953ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"address2\">Address line 2:</label>"
954ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"address2\"><br>"
955ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"city\">City:</label>"
956ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"city\"><br>"
957ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"state\">State:</label>"
958ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <select id=\"state\">"
959ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"\" selected=\"yes\">--</option>"
960ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"CA\">California</option>"
961ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"TX\">Texas</option>"
962ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " </select><br>"
963ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"state_freeform\" style=\"display:none\">State:</label>"
964ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"state_freeform\""
965ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "        style=\"display:none\"><br>"
966ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"zip\">ZIP code:</label>"
967ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"zip\"><br>"
968ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"country\">Country:</label>"
969ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <select id=\"country\">"
970ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"\" selected=\"yes\">--</option>"
971ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"CA\">Canada</option>"
972ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"US\">United States</option>"
973ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " </select><br>"
974ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"phone\">Phone number:</label>"
975ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"phone\"><br>"
976ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "</form>")));
977ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
978ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Invoke Autofill.
979ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  TryBasicFormFill();
980ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("state_freeform", std::string());
981ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
982ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
983ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test that we properly autofill forms with non-autofillable fields.
984ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest,
985ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                       AutofillFormWithNonAutofillableField) {
986ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
987ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
988ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Load the test page.
989ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
990ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GURL(std::string(kDataURIPrefix) +
991ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<form action=\"http://www.example.com/\" method=\"POST\">"
992ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"firstname\">First name:</label>"
993ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"firstname\""
9944ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch           "        onfocus=\"domAutomationController.send(true)\"><br>"
995ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"middlename\">Middle name:</label>"
996ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"middlename\" autocomplete=\"off\" /><br>"
997ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"lastname\">Last name:</label>"
998ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"lastname\"><br>"
999ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"address1\">Address line 1:</label>"
1000ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"address1\"><br>"
1001ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"address2\">Address line 2:</label>"
1002ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"address2\"><br>"
1003ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"city\">City:</label>"
1004ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"city\"><br>"
1005ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"state\">State:</label>"
1006ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <select id=\"state\">"
1007ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"\" selected=\"yes\">--</option>"
1008ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"CA\">California</option>"
1009ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"TX\">Texas</option>"
1010ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " </select><br>"
1011ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"zip\">ZIP code:</label>"
1012ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"zip\"><br>"
1013ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"country\">Country:</label>"
1014ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <select id=\"country\">"
1015ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"\" selected=\"yes\">--</option>"
1016ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"CA\">Canada</option>"
1017ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"US\">United States</option>"
1018ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " </select><br>"
1019ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"phone\">Phone number:</label>"
1020ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"phone\"><br>"
1021ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "</form>")));
1022ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1023ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Invoke Autofill.
1024ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  TryBasicFormFill();
1025ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1026ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1027ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test that we can Autofill dynamically generated forms.
1028ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, DynamicFormFill) {
1029ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
1030ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1031ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Load the test page.
1032ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
1033ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GURL(std::string(kDataURIPrefix) +
1034ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<form id=\"form\" action=\"http://www.example.com/\""
1035ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "      method=\"POST\"></form>"
1036ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<script>"
1037ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "function AddElement(name, label) {"
1038ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  var form = document.getElementById('form');"
1039ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           ""
1040ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  var label_text = document.createTextNode(label);"
1041ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  var label_element = document.createElement('label');"
1042ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  label_element.setAttribute('for', name);"
1043ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  label_element.appendChild(label_text);"
1044ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  form.appendChild(label_element);"
1045ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           ""
1046ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  if (name === 'state' || name === 'country') {"
1047ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    var select_element = document.createElement('select');"
1048ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    select_element.setAttribute('id', name);"
1049ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    select_element.setAttribute('name', name);"
1050ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           ""
1051ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    /* Add an empty selected option. */"
1052ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    var default_option = new Option('--', '', true);"
1053ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    select_element.appendChild(default_option);"
1054ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           ""
1055ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    /* Add the other options. */"
1056ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    if (name == 'state') {"
1057ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "      var option1 = new Option('California', 'CA');"
1058ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "      select_element.appendChild(option1);"
1059ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "      var option2 = new Option('Texas', 'TX');"
1060ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "      select_element.appendChild(option2);"
1061ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    } else {"
1062ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "      var option1 = new Option('Canada', 'CA');"
1063ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "      select_element.appendChild(option1);"
1064ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "      var option2 = new Option('United States', 'US');"
1065ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "      select_element.appendChild(option2);"
1066ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    }"
1067ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           ""
1068ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    form.appendChild(select_element);"
1069ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  } else {"
1070ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    var input_element = document.createElement('input');"
1071ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    input_element.setAttribute('id', name);"
1072ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    input_element.setAttribute('name', name);"
1073ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           ""
10744ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch           "    /* Add the onfocus listener to the 'firstname' field. */"
1075ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    if (name === 'firstname') {"
10764ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch           "      input_element.onfocus = function() {"
10774ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch           "        domAutomationController.send(true);"
10784ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch           "      };"
1079ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    }"
1080ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           ""
1081ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    form.appendChild(input_element);"
1082ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  }"
1083ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           ""
1084ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  form.appendChild(document.createElement('br'));"
1085ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "};"
1086ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           ""
1087ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "function BuildForm() {"
1088ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  var elements = ["
1089ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    ['firstname', 'First name:'],"
1090ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    ['lastname', 'Last name:'],"
1091ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    ['address1', 'Address line 1:'],"
1092ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    ['address2', 'Address line 2:'],"
1093ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    ['city', 'City:'],"
1094ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    ['state', 'State:'],"
1095ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    ['zip', 'ZIP code:'],"
1096ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    ['country', 'Country:'],"
1097ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    ['phone', 'Phone number:'],"
1098ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  ];"
1099ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           ""
1100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  for (var i = 0; i < elements.length; i++) {"
1101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    var name = elements[i][0];"
1102ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    var label = elements[i][1];"
1103ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    AddElement(name, label);"
1104ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  }"
1105ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "};"
1106ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "</script>")));
1107ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1108ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Dynamically construct the form.
1109ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(content::ExecuteScript(GetRenderViewHost(), "BuildForm();"));
1110ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1111ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Invoke Autofill.
1112ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  TryBasicFormFill();
1113ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1114ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1115ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test that form filling works after reloading the current page.
1116ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, AutofillAfterReload) {
1117ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
1118ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1119ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Load the test page.
1120ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
1121ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GURL(std::string(kDataURIPrefix) + kTestFormString)));
1122ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1123ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Reload the page.
11240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  content::WebContents* web_contents = GetWebContents();
1125ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  web_contents->GetController().Reload(false);
1126ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  content::WaitForLoadStop(web_contents);
1127ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1128ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Invoke Autofill.
1129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  TryBasicFormFill();
1130ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1131ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
11323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, AutofillAfterTranslate) {
1133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // TODO(port): Test corresponding bubble translate UX: http://crbug.com/383235
1134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (TranslateService::IsTranslateBubbleEnabled())
1135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return;
1136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1137ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
1138ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1139ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GURL url(std::string(kDataURIPrefix) +
1140ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "<form action=\"http://www.example.com/\" method=\"POST\">"
1141ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "<label for=\"fn\">なまえ</label>"
1142ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <input type=\"text\" id=\"fn\""
11434ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch               "        onfocus=\"domAutomationController.send(true)\""
1144ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "><br>"
1145ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "<label for=\"ln\">みょうじ</label>"
1146ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <input type=\"text\" id=\"ln\"><br>"
1147ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "<label for=\"a1\">Address line 1:</label>"
1148ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <input type=\"text\" id=\"a1\"><br>"
1149ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "<label for=\"a2\">Address line 2:</label>"
1150ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <input type=\"text\" id=\"a2\"><br>"
1151ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "<label for=\"ci\">City:</label>"
1152ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <input type=\"text\" id=\"ci\"><br>"
1153ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "<label for=\"st\">State:</label>"
1154ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <select id=\"st\">"
1155ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <option value=\"\" selected=\"yes\">--</option>"
1156ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <option value=\"CA\">California</option>"
1157ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <option value=\"TX\">Texas</option>"
1158ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " </select><br>"
1159ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "<label for=\"z\">ZIP code:</label>"
1160ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <input type=\"text\" id=\"z\"><br>"
1161ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "<label for=\"co\">Country:</label>"
1162ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <select id=\"co\">"
1163ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <option value=\"\" selected=\"yes\">--</option>"
1164ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <option value=\"CA\">Canada</option>"
1165ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <option value=\"US\">United States</option>"
1166ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " </select><br>"
1167ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "<label for=\"ph\">Phone number:</label>"
1168ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <input type=\"text\" id=\"ph\"><br>"
11693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               "</form>"
11703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               // Add additional Japanese characters to ensure the translate bar
11713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               // will appear.
11723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               "我々は重要な、興味深いものになるが、時折状況が発生するため苦労や痛みは"
11733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               "彼にいくつかの素晴らしいを調達することができます。それから、いくつかの利");
11743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1175424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  content::WindowedNotificationObserver infobar_observer(
11763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_ADDED,
11773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      content::NotificationService::AllSources());
11783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
11793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      ui_test_utils::NavigateToURL(browser(), url));
1180ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
11813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Wait for the translation bar to appear and get it.
1182424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  infobar_observer.Wait();
1183a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  InfoBarService* infobar_service =
1184a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      InfoBarService::FromWebContents(GetWebContents());
11855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  translate::TranslateInfoBarDelegate* delegate =
1186a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      infobar_service->infobar_at(0)->delegate()->AsTranslateInfoBarDelegate();
1187ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(delegate);
1188c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(translate::TRANSLATE_STEP_BEFORE_TRANSLATE,
1189c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            delegate->translate_step());
1190ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1191ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Simulate translation button press.
1192ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  delegate->Translate();
1193ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1194ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  content::WindowedNotificationObserver translation_observer(
1195ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      chrome::NOTIFICATION_PAGE_TRANSLATED,
1196ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      content::NotificationService::AllSources());
1197ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1198424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Simulate the translate script being retrieved.
1199424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Pass fake google.translate lib as the translate script.
1200424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  SimulateURLFetch(true);
1201424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1202ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Simulate the render notifying the translation has been done.
1203ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  translation_observer.Wait();
1204ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1205ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  TryBasicFormFill();
1206ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1207ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1208ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test phone fields parse correctly from a given profile.
1209ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// The high level key presses execute the following: Select the first text
1210ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// field, invoke the autofill popup list, select the first profile within the
1211ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// list, and commit to the profile to populate the form.
1212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Flakily times out on windows. http://crbug.com/390564
1213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_WIN)
1214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MAYBE_ComparePhoneNumbers DISABLED_ComparePhoneNumbers
1215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
1216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MAYBE_ComparePhoneNumbers ComparePhoneNumbers
1217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
1218116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, MAYBE_ComparePhoneNumbers) {
1219ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(test_server()->Start());
1220ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1221ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  AutofillProfile profile;
1222ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Bob"));
1223ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(NAME_LAST, ASCIIToUTF16("Smith"));
1224ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("1234 H St."));
1225ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(ADDRESS_HOME_CITY, ASCIIToUTF16("San Jose"));
1226ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("CA"));
1227ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(ADDRESS_HOME_ZIP, ASCIIToUTF16("95110"));
1228ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(PHONE_HOME_WHOLE_NUMBER, ASCIIToUTF16("1-408-555-4567"));
1229ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SetProfile(profile);
1230ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1231ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GURL url = test_server()->GetURL("files/autofill/form_phones.html");
1232ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ui_test_utils::NavigateToURL(browser(), url);
1233ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  PopulateForm("NAME_FIRST");
1234ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1235ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("NAME_FIRST", "Bob");
1236ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("NAME_LAST", "Smith");
1237ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("ADDRESS_HOME_LINE1", "1234 H St.");
1238ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("ADDRESS_HOME_CITY", "San Jose");
1239ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("ADDRESS_HOME_STATE", "CA");
1240ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("ADDRESS_HOME_ZIP", "95110");
1241ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_WHOLE_NUMBER", "14085554567");
1242ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_CITY_CODE-1", "408");
1243ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_CITY_CODE-2", "408");
1244ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_NUMBER", "5554567");
1245ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_NUMBER_3-1", "555");
1246ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_NUMBER_3-2", "555");
1247ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_NUMBER_4-1", "4567");
1248ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_NUMBER_4-2", "4567");
1249ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_EXT-1", std::string());
1250ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_EXT-2", std::string());
1251ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_COUNTRY_CODE-1", "1");
1252ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1253ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1254ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test that Autofill does not fill in read-only fields.
1255ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, NoAutofillForReadOnlyFields) {
1256ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(test_server()->Start());
1257ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1258ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string addr_line1("1234 H St.");
1259ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1260ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  AutofillProfile profile;
1261ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Bob"));
1262ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(NAME_LAST, ASCIIToUTF16("Smith"));
1263ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(EMAIL_ADDRESS, ASCIIToUTF16("bsmith@gmail.com"));
1264ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16(addr_line1));
1265ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(ADDRESS_HOME_CITY, ASCIIToUTF16("San Jose"));
1266ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("CA"));
1267ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(ADDRESS_HOME_ZIP, ASCIIToUTF16("95110"));
1268ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(COMPANY_NAME, ASCIIToUTF16("Company X"));
1269ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(PHONE_HOME_WHOLE_NUMBER, ASCIIToUTF16("408-871-4567"));
1270ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SetProfile(profile);
1271ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1272ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GURL url = test_server()->GetURL("files/autofill/read_only_field_test.html");
1273ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ui_test_utils::NavigateToURL(browser(), url);
1274ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  PopulateForm("firstname");
1275ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1276ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("email", std::string());
1277ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("address", addr_line1);
1278ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1279ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1280ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test form is fillable from a profile after form was reset.
1281ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Steps:
1282ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch//   1. Fill form using a saved profile.
1283ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch//   2. Reset the form.
1284ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch//   3. Fill form using a saved profile.
1285ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Flakily times out: http://crbug.com/270341
1286ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, DISABLED_FormFillableOnReset) {
1287ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(test_server()->Start());
1288ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1289ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
1290ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1291ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GURL url = test_server()->GetURL("files/autofill/autofill_test_form.html");
1292ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ui_test_utils::NavigateToURL(browser(), url);
1293ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  PopulateForm("NAME_FIRST");
1294ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1295ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(content::ExecuteScript(
12960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)       GetWebContents(), "document.getElementById('testform').reset()"));
1297ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1298ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  PopulateForm("NAME_FIRST");
1299ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1300ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("NAME_FIRST", "Milton");
1301ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("NAME_LAST", "Waddams");
1302ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("EMAIL_ADDRESS", "red.swingline@initech.com");
1303ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("ADDRESS_HOME_LINE1", "4120 Freidrich Lane");
1304ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("ADDRESS_HOME_CITY", "Austin");
1305ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("ADDRESS_HOME_STATE", "Texas");
1306ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("ADDRESS_HOME_ZIP", "78744");
1307ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("ADDRESS_HOME_COUNTRY", "United States");
1308ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_WHOLE_NUMBER", "5125551234");
1309ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1310ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1311ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test Autofill distinguishes a middle initial in a name.
1312ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Flakily times out: http://crbug.com/270341
1313ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest,
1314ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                       DISABLED_DistinguishMiddleInitialWithinName) {
1315ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(test_server()->Start());
1316ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1317ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
1318ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1319ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GURL url = test_server()->GetURL(
1320ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "files/autofill/autofill_middleinit_form.html");
1321ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ui_test_utils::NavigateToURL(browser(), url);
1322ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  PopulateForm("NAME_FIRST");
1323ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1324ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("NAME_MIDDLE", "C");
1325ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1326ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1327ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test forms with multiple email addresses are filled properly.
1328ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Entire form should be filled with one user gesture.
1329ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Flakily times out: http://crbug.com/270341
1330ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest,
1331ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                       DISABLED_MultipleEmailFilledByOneUserGesture) {
1332ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(test_server()->Start());
1333ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1334ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string email("bsmith@gmail.com");
1335ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1336ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  AutofillProfile profile;
1337ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Bob"));
1338ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(NAME_LAST, ASCIIToUTF16("Smith"));
1339ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(EMAIL_ADDRESS, ASCIIToUTF16(email));
1340ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(PHONE_HOME_WHOLE_NUMBER, ASCIIToUTF16("4088714567"));
1341ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SetProfile(profile);
1342ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1343ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GURL url = test_server()->GetURL(
1344ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "files/autofill/autofill_confirmemail_form.html");
1345ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ui_test_utils::NavigateToURL(browser(), url);
1346ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  PopulateForm("NAME_FIRST");
1347ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1348ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("EMAIL_CONFIRM", email);
1349ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // TODO(isherman): verify entire form.
1350ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1351ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1352424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// http://crbug.com/281527
1353ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#if defined(OS_MACOSX)
1354ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#define MAYBE_FormFillLatencyAfterSubmit FormFillLatencyAfterSubmit
1355ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#else
1356ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#define MAYBE_FormFillLatencyAfterSubmit DISABLED_FormFillLatencyAfterSubmit
1357ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif
1358ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test latency time on form submit with lots of stored Autofill profiles.
1359ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// This test verifies when a profile is selected from the Autofill dictionary
1360ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// that consists of thousands of profiles, the form does not hang after being
1361ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// submitted.
1362ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest,
1363ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                       MAYBE_FormFillLatencyAfterSubmit) {
1364ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(test_server()->Start());
1365ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1366ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::vector<std::string> cities;
1367ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  cities.push_back("San Jose");
1368ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  cities.push_back("San Francisco");
1369ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  cities.push_back("Sacramento");
1370ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  cities.push_back("Los Angeles");
1371ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1372ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::vector<std::string> streets;
1373ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  streets.push_back("St");
1374ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  streets.push_back("Ave");
1375ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  streets.push_back("Ln");
1376ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  streets.push_back("Ct");
1377ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1378ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const int kNumProfiles = 1500;
1379ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::Time start_time = base::Time::Now();
1380ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::vector<AutofillProfile> profiles;
1381ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  for (int i = 0; i < kNumProfiles; i++) {
1382ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    AutofillProfile profile;
1383a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16 name(base::IntToString16(i));
1384a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16 email(name + ASCIIToUTF16("@example.com"));
1385a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16 street = ASCIIToUTF16(
1386ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        base::IntToString(base::RandInt(0, 10000)) + " " +
1387ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        streets[base::RandInt(0, streets.size() - 1)]);
13885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::string16 city =
13895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ASCIIToUTF16(cities[base::RandInt(0, cities.size() - 1)]);
1390a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16 zip(base::IntToString16(base::RandInt(0, 10000)));
1391ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    profile.SetRawInfo(NAME_FIRST, name);
1392ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    profile.SetRawInfo(EMAIL_ADDRESS, email);
1393ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    profile.SetRawInfo(ADDRESS_HOME_LINE1, street);
1394ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    profile.SetRawInfo(ADDRESS_HOME_CITY, city);
13955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    profile.SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("CA"));
1396ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    profile.SetRawInfo(ADDRESS_HOME_ZIP, zip);
13975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("US"));
1398ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    profiles.push_back(profile);
1399ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
1400ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SetProfiles(&profiles);
1401ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // TODO(isherman): once we're sure this test doesn't timeout on any bots, this
1402ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // can be removd.
1403ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  LOG(INFO) << "Created " << kNumProfiles << " profiles in " <<
1404ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               (base::Time::Now() - start_time).InSeconds() << " seconds.";
1405ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1406ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GURL url = test_server()->GetURL(
1407ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "files/autofill/latency_after_submit_test.html");
1408ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ui_test_utils::NavigateToURL(browser(), url);
1409ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  PopulateForm("NAME_FIRST");
1410ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1411ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  content::WindowedNotificationObserver load_stop_observer(
1412ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      content::NOTIFICATION_LOAD_STOP,
1413ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      content::Source<content::NavigationController>(
14140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          &GetWebContents()->GetController()));
1415ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1416ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(content::ExecuteScript(
1417ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GetRenderViewHost(),
1418ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "document.getElementById('testform').submit();"));
1419ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // This will ensure the test didn't hang.
1420ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  load_stop_observer.Wait();
1421ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1422ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1423ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test that Chrome doesn't crash when autocomplete is disabled while the user
1424ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// is interacting with the form.  This is a regression test for
1425ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// http://crbug.com/160476
1426ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest,
1427ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                       DisableAutocompleteWhileFilling) {
1428ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
1429ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1430ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Load the test page.
1431ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
1432ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GURL(std::string(kDataURIPrefix) + kTestFormString)));
1433ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1434ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Invoke Autofill: Start filling the first name field with "M" and wait for
1435ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // the popup to be shown.
1436ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  FocusFirstNameField();
1437ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SendKeyToPageAndWait(ui::VKEY_M);
1438ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1439ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Now that the popup with suggestions is showing, disable autocomplete for
1440ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // the active field.
1441ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(content::ExecuteScript(
1442ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GetRenderViewHost(),
1443ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "document.querySelector('input').autocomplete = 'off';"));
1444ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1445ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Press the down arrow to select the suggestion and attempt to preview the
1446ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // autofilled form.
14470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  SendKeyToPopupAndWait(ui::VKEY_DOWN);
1448ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1449ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace autofill
1451