autofill_interactive_uitest.cc revision 116680a4aac90f2aa7413d9095a592090648e557
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include <string>
6ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
7ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/basictypes.h"
8ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/command_line.h"
9ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/file_util.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/ref_counted.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
12ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/rand_util.h"
13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/strings/string16.h"
14ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/strings/string_number_conversions.h"
15ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/strings/string_split.h"
16ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/strings/utf_string_conversions.h"
17ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/time/time.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/autofill/personal_data_manager_factory.h"
197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
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"
29ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/test/base/test_switches.h"
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/autofill/content/browser/content_autofill_driver.h"
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_manager.h"
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_manager_test_delegate.h"
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_profile.h"
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/autofill/core/browser/autofill_test_utils.h"
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/personal_data_manager.h"
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/personal_data_manager_observer.h"
38ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/autofill/core/browser/validation.h"
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/infobars/core/confirm_infobar_delegate.h"
400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/infobars/core/infobar.h"
41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "components/infobars/core/infobar_manager.h"
4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/translate/core/browser/translate_infobar_delegate.h"
43ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/browser/navigation_controller.h"
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/notification_observer.h"
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/notification_registrar.h"
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/notification_service.h"
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/render_view_host.h"
480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "content/public/browser/render_widget_host.h"
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/web_contents.h"
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/test/browser_test_utils.h"
51ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/test/test_renderer_host.h"
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/test/test_utils.h"
53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "net/url_request/test_url_fetcher_factory.h"
54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "testing/gmock/include/gmock/gmock.h"
55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "testing/gtest/include/gtest/gtest.h"
56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h"
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16;
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace autofill {
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
624ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdochstatic const char kDataURIPrefix[] = "data:text/html;charset=utf-8,";
634ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdochstatic const char kTestFormString[] =
64ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "<form action=\"http://www.example.com/\" method=\"POST\">"
65ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "<label for=\"firstname\">First name:</label>"
66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <input type=\"text\" id=\"firstname\""
674ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    "        onfocus=\"domAutomationController.send(true)\"><br>"
68ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "<label for=\"lastname\">Last name:</label>"
69ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <input type=\"text\" id=\"lastname\"><br>"
70ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "<label for=\"address1\">Address line 1:</label>"
71ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <input type=\"text\" id=\"address1\"><br>"
72ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "<label for=\"address2\">Address line 2:</label>"
73ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <input type=\"text\" id=\"address2\"><br>"
74ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "<label for=\"city\">City:</label>"
75ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <input type=\"text\" id=\"city\"><br>"
76ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "<label for=\"state\">State:</label>"
77ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <select id=\"state\">"
78ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <option value=\"\" selected=\"yes\">--</option>"
79ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <option value=\"CA\">California</option>"
80ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <option value=\"TX\">Texas</option>"
81ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " </select><br>"
82ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "<label for=\"zip\">ZIP code:</label>"
83ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <input type=\"text\" id=\"zip\"><br>"
84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "<label for=\"country\">Country:</label>"
85ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <select id=\"country\">"
86ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <option value=\"\" selected=\"yes\">--</option>"
87ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <option value=\"CA\">Canada</option>"
88ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <option value=\"US\">United States</option>"
89ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " </select><br>"
90ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "<label for=\"phone\">Phone number:</label>"
91ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    " <input type=\"text\" id=\"phone\"><br>"
92ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "</form>";
93ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
942385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
952385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// AutofillManagerTestDelegateImpl --------------------------------------------
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AutofillManagerTestDelegateImpl
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public autofill::AutofillManagerTestDelegate {
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutofillManagerTestDelegateImpl() {}
1012385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  virtual ~AutofillManagerTestDelegateImpl() {}
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // autofill::AutofillManagerTestDelegate:
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidPreviewFormData() OVERRIDE {
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    loop_runner_->Quit();
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidFillFormData() OVERRIDE {
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    loop_runner_->Quit();
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DidShowSuggestions() OVERRIDE {
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    loop_runner_->Quit();
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void Reset() {
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    loop_runner_ = new content::MessageLoopRunner();
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void Wait() {
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    loop_runner_->Run();
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> loop_runner_;
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AutofillManagerTestDelegateImpl);
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1302385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
1312385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// WindowedPersonalDataManagerObserver ----------------------------------------
1322385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class WindowedPersonalDataManagerObserver
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public PersonalDataManagerObserver,
135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      public infobars::InfoBarManager::Observer {
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit WindowedPersonalDataManagerObserver(Browser* browser)
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : alerted_(false),
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        has_run_message_loop_(false),
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        browser_(browser),
141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        infobar_service_(InfoBarService::FromWebContents(
142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            browser_->tab_strip_model()->GetActiveWebContents())) {
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PersonalDataManagerFactory::GetForProfile(browser_->profile())->
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        AddObserver(this);
145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    infobar_service_->AddObserver(this);
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~WindowedPersonalDataManagerObserver() {
149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    while (infobar_service_->infobar_count() > 0) {
150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      infobar_service_->RemoveInfoBar(infobar_service_->infobar_at(0));
1512385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    }
152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    infobar_service_->RemoveObserver(this);
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // PersonalDataManagerObserver:
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnPersonalDataChanged() OVERRIDE {
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (has_run_message_loop_) {
15890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoopForUI::current()->Quit();
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      has_run_message_loop_ = false;
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    alerted_ = true;
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnInsufficientFormData() OVERRIDE {
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    OnPersonalDataChanged();
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
169a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void Wait() {
170a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (!alerted_) {
171a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      has_run_message_loop_ = true;
172a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      content::RunMessageLoop();
173a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    PersonalDataManagerFactory::GetForProfile(browser_->profile())->
175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        RemoveObserver(this);
176a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
179010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // infobars::InfoBarManager::Observer:
180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void OnInfoBarAdded(infobars::InfoBar* infobar) OVERRIDE {
181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    infobar_service_->infobar_at(0)->delegate()->AsConfirmInfoBarDelegate()->
182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        Accept();
183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
184010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool alerted_;
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool has_run_message_loop_;
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Browser* browser_;
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  InfoBarService* infobar_service_;
1892385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
1902385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  DISALLOW_COPY_AND_ASSIGN(WindowedPersonalDataManagerObserver);
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1932385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// AutofillInteractiveTest ----------------------------------------------------
1942385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AutofillInteractiveTest : public InProcessBrowserTest {
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
1970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  AutofillInteractiveTest() :
1980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      key_press_event_sink_(
1990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          base::Bind(&AutofillInteractiveTest::HandleKeyPressEvent,
2000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                     base::Unretained(this))) {}
2012385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  virtual ~AutofillInteractiveTest() {}
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
203a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // InProcessBrowserTest:
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Don't want Keychain coming up on Mac.
206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    test::DisableSystemServices(browser()->profile()->GetPrefs());
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // Inject the test delegate into the AutofillManager.
2090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    content::WebContents* web_contents = GetWebContents();
210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ContentAutofillDriver* autofill_driver =
211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        ContentAutofillDriver::FromWebContents(web_contents);
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    AutofillManager* autofill_manager = autofill_driver->autofill_manager();
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    autofill_manager->SetTestDelegate(&test_delegate_);
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void CleanUpOnMainThread() OVERRIDE {
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Make sure to close any showing popups prior to tearing down the UI.
2180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    content::WebContents* web_contents = GetWebContents();
219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    AutofillManager* autofill_manager = ContentAutofillDriver::FromWebContents(
220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            web_contents)->autofill_manager();
221f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    autofill_manager->client()->HideAutofillPopup();
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
224a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  PersonalDataManager* GetPersonalDataManager() {
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return PersonalDataManagerFactory::GetForProfile(browser()->profile());
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  content::WebContents* GetWebContents() {
2290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return browser()->tab_strip_model()->GetActiveWebContents();
230a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
231a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  content::RenderViewHost* GetRenderViewHost() {
2330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return GetWebContents()->GetRenderViewHost();
234a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
235a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void CreateTestProfile() {
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    AutofillProfile profile;
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test::SetProfileInfo(
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        &profile, "Milton", "C.", "Waddams",
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "red.swingline@initech.com", "Initech", "4120 Freidrich Lane",
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "Basement", "Austin", "Texas", "78744", "US", "5125551234");
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    WindowedPersonalDataManagerObserver observer(browser());
244a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    GetPersonalDataManager()->AddProfile(profile);
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // AddProfile is asynchronous. Wait for it to finish before continuing the
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // tests.
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    observer.Wait();
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
251ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void SetProfiles(std::vector<AutofillProfile>* profiles) {
252ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    WindowedPersonalDataManagerObserver observer(browser());
253ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    GetPersonalDataManager()->SetProfiles(profiles);
254ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    observer.Wait();
255ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
256ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
257ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void SetProfile(const AutofillProfile& profile) {
258ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    std::vector<AutofillProfile> profiles;
259ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    profiles.push_back(profile);
260ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    SetProfiles(&profiles);
261ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
262ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
263ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Populates a webpage form using autofill data and keypress events.
264ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // This function focuses the specified input field in the form, and then
265ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // sends keypress events to the tab to cause the form to be populated.
266ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void PopulateForm(const std::string& field_id) {
267ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    std::string js("document.getElementById('" + field_id + "').focus();");
268ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ASSERT_TRUE(content::ExecuteScript(GetRenderViewHost(), js));
269ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
270ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    SendKeyToPageAndWait(ui::VKEY_DOWN);
271ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    SendKeyToPopupAndWait(ui::VKEY_DOWN);
272ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    SendKeyToPopupAndWait(ui::VKEY_RETURN);
273ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
274ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ExpectFieldValue(const std::string& field_name,
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        const std::string& expected_value) {
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::string value;
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(content::ExecuteScriptAndExtractString(
2790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        GetWebContents(),
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "window.domAutomationController.send("
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "    document.getElementById('" + field_name + "').value);",
282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        &value));
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(expected_value, value);
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
286ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void SimulateURLFetch(bool success) {
287ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0);
288ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ASSERT_TRUE(fetcher);
289ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    net::URLRequestStatus status;
290ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    status.set_status(success ? net::URLRequestStatus::SUCCESS :
291ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                net::URLRequestStatus::FAILED);
292ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
293ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    std::string script = " var google = {};"
294ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "google.translate = (function() {"
295ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "  return {"
296ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "    TranslateService: function() {"
297ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "      return {"
298ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "        isAvailable : function() {"
299ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "          return true;"
300ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "        },"
301ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "        restore : function() {"
302ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "          return;"
303ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "        },"
304ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "        getDetectedLanguage : function() {"
305ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "          return \"ja\";"
306ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "        },"
307ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "        translatePage : function(originalLang, targetLang,"
308ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "                                 onTranslateProgress) {"
309ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "          document.getElementsByTagName(\"body\")[0].innerHTML = '" +
310ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        std::string(kTestFormString) +
311ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "              ';"
312ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "          onTranslateProgress(100, true, false);"
313ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "        }"
314ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "      };"
315ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "    }"
316ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        "  };"
3173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        "})();"
3183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        "cr.googleTranslate.onTranslateElementLoad();";
319ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
320ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    fetcher->set_url(fetcher->GetOriginalURL());
321ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    fetcher->set_status(status);
322ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    fetcher->set_response_code(success ? 200 : 500);
323ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    fetcher->SetResponseString(script);
324ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    fetcher->delegate()->OnURLFetchComplete(fetcher);
325ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
326ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void FocusFirstNameField() {
328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool result = false;
329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
330a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        GetRenderViewHost(),
331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "if (document.readyState === 'complete')"
332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "  document.getElementById('firstname').focus();"
333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "else"
334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "  domAutomationController.send(false);",
335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        &result));
336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(result);
337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ExpectFilledTestForm() {
340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("firstname", "Milton");
341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("lastname", "Waddams");
342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("address1", "4120 Freidrich Lane");
343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("address2", "Basement");
344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("city", "Austin");
345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("state", "TX");
346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("zip", "78744");
347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("country", "US");
348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExpectFieldValue("phone", "5125551234");
349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SendKeyToPageAndWait(ui::KeyboardCode key) {
352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test_delegate_.Reset();
353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::SimulateKeyPress(
3540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        GetWebContents(), key, false, false, false, false);
355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test_delegate_.Wait();
356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  bool HandleKeyPressEvent(const content::NativeWebKeyboardEvent& event) {
3590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return true;
3600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
3610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SendKeyToPopupAndWait(ui::KeyboardCode key) {
3630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // Route popup-targeted key presses via the render view host.
364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::NativeWebKeyboardEvent event;
365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    event.windowsKeyCode = key;
366f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    event.type = blink::WebKeyboardEvent::RawKeyDown;
367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test_delegate_.Reset();
3680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // Install the key press event sink to ensure that any events that are not
3690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // handled by the installed callbacks do not end up crashing the test.
3700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    GetRenderViewHost()->AddKeyPressEventCallback(key_press_event_sink_);
3710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    GetRenderViewHost()->ForwardKeyboardEvent(event);
372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test_delegate_.Wait();
3730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    GetRenderViewHost()->RemoveKeyPressEventCallback(key_press_event_sink_);
374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
376ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void TryBasicFormFill() {
377ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    FocusFirstNameField();
378ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
379ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // Start filling the first name field with "M" and wait for the popup to be
380ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // shown.
381ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    SendKeyToPageAndWait(ui::VKEY_M);
382ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
383ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // Press the down arrow to select the suggestion and preview the autofilled
384ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // form.
385ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    SendKeyToPopupAndWait(ui::VKEY_DOWN);
386ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
387ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // The previewed values should not be accessible to JavaScript.
388ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ExpectFieldValue("firstname", "M");
389ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ExpectFieldValue("lastname", std::string());
390ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ExpectFieldValue("address1", std::string());
391ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ExpectFieldValue("address2", std::string());
392ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ExpectFieldValue("city", std::string());
393ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ExpectFieldValue("state", std::string());
394ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ExpectFieldValue("zip", std::string());
395ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ExpectFieldValue("country", std::string());
396ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ExpectFieldValue("phone", std::string());
397ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // TODO(isherman): It would be nice to test that the previewed values are
398ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // displayed: http://crbug.com/57220
399ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
400ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // Press Enter to accept the autofill suggestions.
401ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    SendKeyToPopupAndWait(ui::VKEY_RETURN);
402ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
403ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // The form should be filled.
404ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ExpectFilledTestForm();
405ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
406ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
4072385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch private:
408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutofillManagerTestDelegateImpl test_delegate_;
4092385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
410ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  net::TestURLFetcherFactory url_fetcher_factory_;
411ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
4120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // KeyPressEventCallback that serves as a sink to ensure that every key press
4130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // event the tests create and have the WebContents forward is handled by some
4140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // key press event callback. It is necessary to have this sinkbecause if no
4150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // key press event callback handles the event (at least on Mac), a DCHECK
4160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // ends up going off that the |event| doesn't have an |os_event| associated
4170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // with it.
4180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  content::RenderWidgetHost::KeyPressEventCallback key_press_event_sink_;
4190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
4202385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  DISALLOW_COPY_AND_ASSIGN(AutofillInteractiveTest);
421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
423ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test that basic form fill is working.
424ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, BasicFormFill) {
425ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
426ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
427ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Load the test page.
428ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
429ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GURL(std::string(kDataURIPrefix) + kTestFormString)));
4302385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
431ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Invoke Autofill.
432ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  TryBasicFormFill();
433ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
4342385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
435ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test that form filling can be initiated by pressing the down arrow.
436ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, AutofillViaDownArrow) {
437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CreateTestProfile();
438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Load the test page.
440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      GURL(std::string(kDataURIPrefix) + kTestFormString)));
442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Focus a fillable field.
444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FocusFirstNameField();
445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
446ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Press the down arrow to initiate Autofill and wait for the popup to be
447ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // shown.
448ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SendKeyToPageAndWait(ui::VKEY_DOWN);
449ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
450ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Press the down arrow to select the suggestion and preview the autofilled
451ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // form.
452ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SendKeyToPopupAndWait(ui::VKEY_DOWN);
453ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
454ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Press Enter to accept the autofill suggestions.
455ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SendKeyToPopupAndWait(ui::VKEY_RETURN);
456ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
457ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // The form should be filled.
458ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFilledTestForm();
459ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
460ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
461ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, AutofillSelectViaTab) {
462ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
463ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
464ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Load the test page.
465ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
466ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GURL(std::string(kDataURIPrefix) + kTestFormString)));
467ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
468ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Focus a fillable field.
469ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  FocusFirstNameField();
470558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Press the down arrow to initiate Autofill and wait for the popup to be
472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // shown.
473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SendKeyToPageAndWait(ui::VKEY_DOWN);
474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Press the down arrow to select the suggestion and preview the autofilled
476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // form.
477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SendKeyToPopupAndWait(ui::VKEY_DOWN);
478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Press tab to accept the autofill suggestions.
480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SendKeyToPopupAndWait(ui::VKEY_TAB);
481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The form should be filled.
483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ExpectFilledTestForm();
484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
486116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Test that a field is still autofillable after the previously autofilled
487116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// value is deleted.
488116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, OnDeleteValueAfterAutofill) {
489116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CreateTestProfile();
490116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
491116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Load the test page.
492116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
493116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      GURL(std::string(kDataURIPrefix) + kTestFormString)));
494116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
495116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Invoke and accept the Autofill popup and verify the form was filled.
496116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FocusFirstNameField();
497116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SendKeyToPageAndWait(ui::VKEY_M);
498116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SendKeyToPopupAndWait(ui::VKEY_DOWN);
499116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SendKeyToPopupAndWait(ui::VKEY_RETURN);
500116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ExpectFilledTestForm();
501116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
502116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Delete the value of a filled field.
503116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(content::ExecuteScript(
504116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      GetRenderViewHost(),
505116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "document.getElementById('firstname').value = '';"));
506116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ExpectFieldValue("firstname", "");
507116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
508116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Invoke and accept the Autofill popup and verify the field was filled.
509116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SendKeyToPageAndWait(ui::VKEY_M);
510116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SendKeyToPopupAndWait(ui::VKEY_DOWN);
511116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SendKeyToPopupAndWait(ui::VKEY_RETURN);
512116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ExpectFieldValue("firstname", "Milton");
513116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
514116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5154ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch// Test that a JavaScript oninput event is fired after auto-filling a form.
5164ad1aa43a48567659193a298fad74f55e00b3dd9Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, OnInputAfterAutofill) {
5174ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  CreateTestProfile();
5184ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
5194ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  const char kOnInputScript[] =
5204ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "<script>"
5214ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "focused_fired = false;"
5224ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "unfocused_fired = false;"
5234ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "changed_select_fired = false;"
5244ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "unchanged_select_fired = false;"
5254ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "document.getElementById('firstname').oninput = function() {"
5264ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "  focused_fired = true;"
5274ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "};"
5284ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "document.getElementById('lastname').oninput = function() {"
5294ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "  unfocused_fired = true;"
5304ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "};"
5314ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "document.getElementById('state').oninput = function() {"
5324ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "  changed_select_fired = true;"
5334ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "};"
5344ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "document.getElementById('country').oninput = function() {"
5354ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "  unchanged_select_fired = true;"
5364ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "};"
5374ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "document.getElementById('country').value = 'US';"
5384ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "</script>";
5394ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
5404ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // Load the test page.
5414ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
5424ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      GURL(std::string(kDataURIPrefix) + kTestFormString + kOnInputScript)));
5434ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
5444ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // Invoke Autofill.
5454ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  FocusFirstNameField();
5464ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
5474ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // Start filling the first name field with "M" and wait for the popup to be
5484ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // shown.
5494ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  SendKeyToPageAndWait(ui::VKEY_M);
5504ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
5514ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // Press the down arrow to select the suggestion and preview the autofilled
5524ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // form.
5534ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  SendKeyToPopupAndWait(ui::VKEY_DOWN);
5544ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
5554ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // Press Enter to accept the autofill suggestions.
5564ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  SendKeyToPopupAndWait(ui::VKEY_RETURN);
5574ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
5584ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // The form should be filled.
5594ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  ExpectFilledTestForm();
5604ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
5614ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  bool focused_fired = false;
5624ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  bool unfocused_fired = false;
5634ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  bool changed_select_fired = false;
5644ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  bool unchanged_select_fired = false;
5654ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
5664ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      GetRenderViewHost(),
5674ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "domAutomationController.send(focused_fired);",
5684ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      &focused_fired));
5694ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
5704ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      GetRenderViewHost(),
5714ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "domAutomationController.send(unfocused_fired);",
5724ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      &unfocused_fired));
5734ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
5744ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      GetRenderViewHost(),
5754ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "domAutomationController.send(changed_select_fired);",
5764ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      &changed_select_fired));
5774ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
5784ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      GetRenderViewHost(),
5794ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "domAutomationController.send(unchanged_select_fired);",
5804ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      &unchanged_select_fired));
5814ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_TRUE(focused_fired);
5824ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_TRUE(unfocused_fired);
5834ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_TRUE(changed_select_fired);
5844ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_FALSE(unchanged_select_fired);
5854ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch}
5864ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
587ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test that a JavaScript onchange event is fired after auto-filling a form.
5884ad1aa43a48567659193a298fad74f55e00b3dd9Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, OnChangeAfterAutofill) {
589ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
590ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
5914ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  const char kOnChangeScript[] =
592ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "<script>"
593ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "focused_fired = false;"
594ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "unfocused_fired = false;"
595ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "changed_select_fired = false;"
596ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "unchanged_select_fired = false;"
597ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "document.getElementById('firstname').onchange = function() {"
598ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "  focused_fired = true;"
599ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "};"
600ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "document.getElementById('lastname').onchange = function() {"
601ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "  unfocused_fired = true;"
602ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "};"
603ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "document.getElementById('state').onchange = function() {"
604ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "  changed_select_fired = true;"
605ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "};"
606ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "document.getElementById('country').onchange = function() {"
607ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "  unchanged_select_fired = true;"
608ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "};"
609ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "document.getElementById('country').value = 'US';"
610ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "</script>";
611ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
612ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Load the test page.
613ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
614ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GURL(std::string(kDataURIPrefix) + kTestFormString + kOnChangeScript)));
615ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
616ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Invoke Autofill.
617ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  FocusFirstNameField();
618ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
619ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Start filling the first name field with "M" and wait for the popup to be
620ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // shown.
621ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SendKeyToPageAndWait(ui::VKEY_M);
622ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
623ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Press the down arrow to select the suggestion and preview the autofilled
624ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // form.
625ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SendKeyToPopupAndWait(ui::VKEY_DOWN);
626ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
627ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Press Enter to accept the autofill suggestions.
628ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SendKeyToPopupAndWait(ui::VKEY_RETURN);
629ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
630ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // The form should be filled.
631ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFilledTestForm();
632ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
633ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool focused_fired = false;
634ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool unfocused_fired = false;
635ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool changed_select_fired = false;
636ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool unchanged_select_fired = false;
637ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
638ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GetRenderViewHost(),
639ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "domAutomationController.send(focused_fired);",
640ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &focused_fired));
641ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
642ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GetRenderViewHost(),
643ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "domAutomationController.send(unfocused_fired);",
644ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &unfocused_fired));
645ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
646ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GetRenderViewHost(),
647ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "domAutomationController.send(changed_select_fired);",
648ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &changed_select_fired));
649ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
650ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GetRenderViewHost(),
651ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "domAutomationController.send(unchanged_select_fired);",
652ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      &unchanged_select_fired));
6534ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_TRUE(focused_fired);
654ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(unfocused_fired);
655ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(changed_select_fired);
656ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(unchanged_select_fired);
6574ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch}
658ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
6594ad1aa43a48567659193a298fad74f55e00b3dd9Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, InputFiresBeforeChange) {
6604ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  CreateTestProfile();
6614ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
6624ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  const char kInputFiresBeforeChangeScript[] =
6634ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "<script>"
6644ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "inputElementEvents = [];"
6654ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "function recordInputElementEvent(e) {"
6664ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "  if (e.target.tagName != 'INPUT') throw 'only <input> tags allowed';"
6674ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "  inputElementEvents.push(e.type);"
6684ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "}"
6694ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "selectElementEvents = [];"
6704ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "function recordSelectElementEvent(e) {"
6714ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "  if (e.target.tagName != 'SELECT') throw 'only <select> tags allowed';"
6724ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "  selectElementEvents.push(e.type);"
6734ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "}"
6744ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "document.getElementById('lastname').oninput = recordInputElementEvent;"
6754ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "document.getElementById('lastname').onchange = recordInputElementEvent;"
6764ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "document.getElementById('country').oninput = recordSelectElementEvent;"
6774ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "document.getElementById('country').onchange = recordSelectElementEvent;"
6784ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "</script>";
6794ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
6804ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // Load the test page.
6814ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
6824ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      GURL(std::string(kDataURIPrefix) + kTestFormString +
6834ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch           kInputFiresBeforeChangeScript)));
6844ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
6854ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // Invoke and accept the Autofill popup and verify the form was filled.
6864ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  FocusFirstNameField();
6874ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  SendKeyToPageAndWait(ui::VKEY_M);
6884ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  SendKeyToPopupAndWait(ui::VKEY_DOWN);
6894ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  SendKeyToPopupAndWait(ui::VKEY_RETURN);
6904ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  ExpectFilledTestForm();
6914ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
6924ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  int num_input_element_events = -1;
6934ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractInt(
694ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GetRenderViewHost(),
6954ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "domAutomationController.send(inputElementEvents.length);",
6964ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      &num_input_element_events));
6974ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_EQ(2, num_input_element_events);
6984ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
6994ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  std::vector<std::string> input_element_events;
7004ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  input_element_events.resize(2);
7014ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
7024ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractString(
7034ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      GetRenderViewHost(),
7044ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "domAutomationController.send(inputElementEvents[0]);",
7054ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      &input_element_events[0]));
7064ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractString(
7074ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      GetRenderViewHost(),
7084ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "domAutomationController.send(inputElementEvents[1]);",
7094ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      &input_element_events[1]));
7104ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
7114ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_EQ("input", input_element_events[0]);
7124ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_EQ("change", input_element_events[1]);
7134ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
7144ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  int num_select_element_events = -1;
7154ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractInt(
7164ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      GetRenderViewHost(),
7174ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "domAutomationController.send(selectElementEvents.length);",
7184ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      &num_select_element_events));
7194ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_EQ(2, num_select_element_events);
7204ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
7214ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  std::vector<std::string> select_element_events;
7224ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  select_element_events.resize(2);
7234ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
7244ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractString(
7254ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      GetRenderViewHost(),
7264ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "domAutomationController.send(selectElementEvents[0]);",
7274ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      &select_element_events[0]));
7284ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  ASSERT_TRUE(content::ExecuteScriptAndExtractString(
7294ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      GetRenderViewHost(),
7304ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      "domAutomationController.send(selectElementEvents[1]);",
7314ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      &select_element_events[1]));
7324ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
7334ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_EQ("input", select_element_events[0]);
7344ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_EQ("change", select_element_events[1]);
735ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
736ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
737ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test that we can autofill forms distinguished only by their |id| attribute.
738ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest,
739ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                       AutofillFormsDistinguishedById) {
740ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
741ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
742ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Load the test page.
743ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const std::string kURL =
744ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      std::string(kDataURIPrefix) + kTestFormString +
745ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "<script>"
746ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "var mainForm = document.forms[0];"
747ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "mainForm.id = 'mainForm';"
748ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "var newForm = document.createElement('form');"
749ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "newForm.action = mainForm.action;"
750ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "newForm.method = mainForm.method;"
751ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "newForm.id = 'newForm';"
752ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "mainForm.parentNode.insertBefore(newForm, mainForm);"
753ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "</script>";
754ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(), GURL(kURL)));
755ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
756ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Invoke Autofill.
757ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  TryBasicFormFill();
758ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
759ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
760ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test that we properly autofill forms with repeated fields.
761ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// In the wild, the repeated fields are typically either email fields
762ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// (duplicated for "confirmation"); or variants that are hot-swapped via
763ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// JavaScript, with only one actually visible at any given time.
764ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, AutofillFormWithRepeatedField) {
765ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
766ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
767ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Load the test page.
768ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
769ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GURL(std::string(kDataURIPrefix) +
770ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<form action=\"http://www.example.com/\" method=\"POST\">"
771ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"firstname\">First name:</label>"
772ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"firstname\""
7734ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch           "        onfocus=\"domAutomationController.send(true)\"><br>"
774ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"lastname\">Last name:</label>"
775ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"lastname\"><br>"
776ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"address1\">Address line 1:</label>"
777ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"address1\"><br>"
778ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"address2\">Address line 2:</label>"
779ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"address2\"><br>"
780ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"city\">City:</label>"
781ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"city\"><br>"
782ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"state\">State:</label>"
783ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <select id=\"state\">"
784ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"\" selected=\"yes\">--</option>"
785ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"CA\">California</option>"
786ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"TX\">Texas</option>"
787ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " </select><br>"
788ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"state_freeform\" style=\"display:none\">State:</label>"
789ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"state_freeform\""
790ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "        style=\"display:none\"><br>"
791ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"zip\">ZIP code:</label>"
792ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"zip\"><br>"
793ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"country\">Country:</label>"
794ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <select id=\"country\">"
795ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"\" selected=\"yes\">--</option>"
796ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"CA\">Canada</option>"
797ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"US\">United States</option>"
798ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " </select><br>"
799ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"phone\">Phone number:</label>"
800ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"phone\"><br>"
801ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "</form>")));
802ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
803ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Invoke Autofill.
804ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  TryBasicFormFill();
805ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("state_freeform", std::string());
806ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
807ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
808ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test that we properly autofill forms with non-autofillable fields.
809ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest,
810ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                       AutofillFormWithNonAutofillableField) {
811ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
812ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
813ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Load the test page.
814ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
815ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GURL(std::string(kDataURIPrefix) +
816ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<form action=\"http://www.example.com/\" method=\"POST\">"
817ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"firstname\">First name:</label>"
818ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"firstname\""
8194ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch           "        onfocus=\"domAutomationController.send(true)\"><br>"
820ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"middlename\">Middle name:</label>"
821ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"middlename\" autocomplete=\"off\" /><br>"
822ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"lastname\">Last name:</label>"
823ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"lastname\"><br>"
824ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"address1\">Address line 1:</label>"
825ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"address1\"><br>"
826ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"address2\">Address line 2:</label>"
827ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"address2\"><br>"
828ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"city\">City:</label>"
829ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"city\"><br>"
830ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"state\">State:</label>"
831ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <select id=\"state\">"
832ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"\" selected=\"yes\">--</option>"
833ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"CA\">California</option>"
834ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"TX\">Texas</option>"
835ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " </select><br>"
836ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"zip\">ZIP code:</label>"
837ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"zip\"><br>"
838ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"country\">Country:</label>"
839ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <select id=\"country\">"
840ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"\" selected=\"yes\">--</option>"
841ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"CA\">Canada</option>"
842ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <option value=\"US\">United States</option>"
843ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " </select><br>"
844ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<label for=\"phone\">Phone number:</label>"
845ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           " <input type=\"text\" id=\"phone\"><br>"
846ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "</form>")));
847ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
848ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Invoke Autofill.
849ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  TryBasicFormFill();
850ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
851ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
852ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test that we can Autofill dynamically generated forms.
853ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, DynamicFormFill) {
854ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
855ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
856ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Load the test page.
857ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
858ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GURL(std::string(kDataURIPrefix) +
859ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<form id=\"form\" action=\"http://www.example.com/\""
860ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "      method=\"POST\"></form>"
861ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "<script>"
862ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "function AddElement(name, label) {"
863ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  var form = document.getElementById('form');"
864ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           ""
865ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  var label_text = document.createTextNode(label);"
866ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  var label_element = document.createElement('label');"
867ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  label_element.setAttribute('for', name);"
868ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  label_element.appendChild(label_text);"
869ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  form.appendChild(label_element);"
870ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           ""
871ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  if (name === 'state' || name === 'country') {"
872ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    var select_element = document.createElement('select');"
873ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    select_element.setAttribute('id', name);"
874ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    select_element.setAttribute('name', name);"
875ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           ""
876ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    /* Add an empty selected option. */"
877ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    var default_option = new Option('--', '', true);"
878ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    select_element.appendChild(default_option);"
879ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           ""
880ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    /* Add the other options. */"
881ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    if (name == 'state') {"
882ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "      var option1 = new Option('California', 'CA');"
883ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "      select_element.appendChild(option1);"
884ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "      var option2 = new Option('Texas', 'TX');"
885ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "      select_element.appendChild(option2);"
886ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    } else {"
887ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "      var option1 = new Option('Canada', 'CA');"
888ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "      select_element.appendChild(option1);"
889ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "      var option2 = new Option('United States', 'US');"
890ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "      select_element.appendChild(option2);"
891ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    }"
892ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           ""
893ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    form.appendChild(select_element);"
894ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  } else {"
895ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    var input_element = document.createElement('input');"
896ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    input_element.setAttribute('id', name);"
897ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    input_element.setAttribute('name', name);"
898ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           ""
8994ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch           "    /* Add the onfocus listener to the 'firstname' field. */"
900ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    if (name === 'firstname') {"
9014ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch           "      input_element.onfocus = function() {"
9024ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch           "        domAutomationController.send(true);"
9034ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch           "      };"
904ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    }"
905ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           ""
906ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    form.appendChild(input_element);"
907ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  }"
908ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           ""
909ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  form.appendChild(document.createElement('br'));"
910ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "};"
911ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           ""
912ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "function BuildForm() {"
913ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  var elements = ["
914ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    ['firstname', 'First name:'],"
915ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    ['lastname', 'Last name:'],"
916ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    ['address1', 'Address line 1:'],"
917ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    ['address2', 'Address line 2:'],"
918ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    ['city', 'City:'],"
919ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    ['state', 'State:'],"
920ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    ['zip', 'ZIP code:'],"
921ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    ['country', 'Country:'],"
922ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    ['phone', 'Phone number:'],"
923ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  ];"
924ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           ""
925ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  for (var i = 0; i < elements.length; i++) {"
926ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    var name = elements[i][0];"
927ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    var label = elements[i][1];"
928ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "    AddElement(name, label);"
929ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "  }"
930ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "};"
931ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch           "</script>")));
932ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
933ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Dynamically construct the form.
934ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(content::ExecuteScript(GetRenderViewHost(), "BuildForm();"));
935ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
936ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Invoke Autofill.
937ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  TryBasicFormFill();
938ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
939ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
940ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test that form filling works after reloading the current page.
941ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, AutofillAfterReload) {
942ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
943ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
944ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Load the test page.
945ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
946ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GURL(std::string(kDataURIPrefix) + kTestFormString)));
947ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
948ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Reload the page.
9490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  content::WebContents* web_contents = GetWebContents();
950ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  web_contents->GetController().Reload(false);
951ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  content::WaitForLoadStop(web_contents);
952ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
953ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Invoke Autofill.
954ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  TryBasicFormFill();
955ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
956ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
9573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, AutofillAfterTranslate) {
958f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // TODO(port): Test corresponding bubble translate UX: http://crbug.com/383235
959f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (TranslateService::IsTranslateBubbleEnabled())
960f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return;
961f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
962ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
963ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
964ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GURL url(std::string(kDataURIPrefix) +
965ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "<form action=\"http://www.example.com/\" method=\"POST\">"
966ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "<label for=\"fn\">なまえ</label>"
967ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <input type=\"text\" id=\"fn\""
9684ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch               "        onfocus=\"domAutomationController.send(true)\""
969ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "><br>"
970ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "<label for=\"ln\">みょうじ</label>"
971ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <input type=\"text\" id=\"ln\"><br>"
972ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "<label for=\"a1\">Address line 1:</label>"
973ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <input type=\"text\" id=\"a1\"><br>"
974ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "<label for=\"a2\">Address line 2:</label>"
975ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <input type=\"text\" id=\"a2\"><br>"
976ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "<label for=\"ci\">City:</label>"
977ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <input type=\"text\" id=\"ci\"><br>"
978ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "<label for=\"st\">State:</label>"
979ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <select id=\"st\">"
980ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <option value=\"\" selected=\"yes\">--</option>"
981ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <option value=\"CA\">California</option>"
982ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <option value=\"TX\">Texas</option>"
983ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " </select><br>"
984ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "<label for=\"z\">ZIP code:</label>"
985ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <input type=\"text\" id=\"z\"><br>"
986ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "<label for=\"co\">Country:</label>"
987ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <select id=\"co\">"
988ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <option value=\"\" selected=\"yes\">--</option>"
989ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <option value=\"CA\">Canada</option>"
990ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <option value=\"US\">United States</option>"
991ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " </select><br>"
992ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               "<label for=\"ph\">Phone number:</label>"
993ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               " <input type=\"text\" id=\"ph\"><br>"
9943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               "</form>"
9953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               // Add additional Japanese characters to ensure the translate bar
9963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               // will appear.
9973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               "我々は重要な、興味深いものになるが、時折状況が発生するため苦労や痛みは"
9983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               "彼にいくつかの素晴らしいを調達することができます。それから、いくつかの利");
9993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1000424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  content::WindowedNotificationObserver infobar_observer(
10013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_ADDED,
10023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      content::NotificationService::AllSources());
10033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
10043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      ui_test_utils::NavigateToURL(browser(), url));
1005ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
10063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Wait for the translation bar to appear and get it.
1007424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  infobar_observer.Wait();
1008a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  InfoBarService* infobar_service =
1009a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      InfoBarService::FromWebContents(GetWebContents());
1010a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  TranslateInfoBarDelegate* delegate =
1011a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      infobar_service->infobar_at(0)->delegate()->AsTranslateInfoBarDelegate();
1012ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(delegate);
1013c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(translate::TRANSLATE_STEP_BEFORE_TRANSLATE,
1014c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            delegate->translate_step());
1015ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1016ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Simulate translation button press.
1017ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  delegate->Translate();
1018ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1019ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  content::WindowedNotificationObserver translation_observer(
1020ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      chrome::NOTIFICATION_PAGE_TRANSLATED,
1021ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      content::NotificationService::AllSources());
1022ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1023424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Simulate the translate script being retrieved.
1024424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Pass fake google.translate lib as the translate script.
1025424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  SimulateURLFetch(true);
1026424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1027ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Simulate the render notifying the translation has been done.
1028ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  translation_observer.Wait();
1029ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1030ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  TryBasicFormFill();
1031ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1032ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1033ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test phone fields parse correctly from a given profile.
1034ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// The high level key presses execute the following: Select the first text
1035ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// field, invoke the autofill popup list, select the first profile within the
1036ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// list, and commit to the profile to populate the form.
1037116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Flakily times out on windows. http://crbug.com/390564
1038116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_WIN)
1039116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MAYBE_ComparePhoneNumbers DISABLED_ComparePhoneNumbers
1040116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
1041116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MAYBE_ComparePhoneNumbers ComparePhoneNumbers
1042116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
1043116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, MAYBE_ComparePhoneNumbers) {
1044ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(test_server()->Start());
1045ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1046ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  AutofillProfile profile;
1047ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Bob"));
1048ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(NAME_LAST, ASCIIToUTF16("Smith"));
1049ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("1234 H St."));
1050ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(ADDRESS_HOME_CITY, ASCIIToUTF16("San Jose"));
1051ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("CA"));
1052ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(ADDRESS_HOME_ZIP, ASCIIToUTF16("95110"));
1053ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(PHONE_HOME_WHOLE_NUMBER, ASCIIToUTF16("1-408-555-4567"));
1054ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SetProfile(profile);
1055ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1056ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GURL url = test_server()->GetURL("files/autofill/form_phones.html");
1057ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ui_test_utils::NavigateToURL(browser(), url);
1058ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  PopulateForm("NAME_FIRST");
1059ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1060ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("NAME_FIRST", "Bob");
1061ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("NAME_LAST", "Smith");
1062ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("ADDRESS_HOME_LINE1", "1234 H St.");
1063ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("ADDRESS_HOME_CITY", "San Jose");
1064ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("ADDRESS_HOME_STATE", "CA");
1065ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("ADDRESS_HOME_ZIP", "95110");
1066ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_WHOLE_NUMBER", "14085554567");
1067ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_CITY_CODE-1", "408");
1068ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_CITY_CODE-2", "408");
1069ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_NUMBER", "5554567");
1070ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_NUMBER_3-1", "555");
1071ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_NUMBER_3-2", "555");
1072ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_NUMBER_4-1", "4567");
1073ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_NUMBER_4-2", "4567");
1074ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_EXT-1", std::string());
1075ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_EXT-2", std::string());
1076ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_COUNTRY_CODE-1", "1");
1077ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1078ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1079ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test that Autofill does not fill in read-only fields.
1080ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, NoAutofillForReadOnlyFields) {
1081ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(test_server()->Start());
1082ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1083ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string addr_line1("1234 H St.");
1084ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1085ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  AutofillProfile profile;
1086ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Bob"));
1087ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(NAME_LAST, ASCIIToUTF16("Smith"));
1088ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(EMAIL_ADDRESS, ASCIIToUTF16("bsmith@gmail.com"));
1089ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16(addr_line1));
1090ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(ADDRESS_HOME_CITY, ASCIIToUTF16("San Jose"));
1091ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("CA"));
1092ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(ADDRESS_HOME_ZIP, ASCIIToUTF16("95110"));
1093ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(COMPANY_NAME, ASCIIToUTF16("Company X"));
1094ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(PHONE_HOME_WHOLE_NUMBER, ASCIIToUTF16("408-871-4567"));
1095ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SetProfile(profile);
1096ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1097ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GURL url = test_server()->GetURL("files/autofill/read_only_field_test.html");
1098ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ui_test_utils::NavigateToURL(browser(), url);
1099ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  PopulateForm("firstname");
1100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("email", std::string());
1102ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("address", addr_line1);
1103ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1104ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1105ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test form is fillable from a profile after form was reset.
1106ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Steps:
1107ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch//   1. Fill form using a saved profile.
1108ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch//   2. Reset the form.
1109ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch//   3. Fill form using a saved profile.
1110ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Flakily times out: http://crbug.com/270341
1111ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, DISABLED_FormFillableOnReset) {
1112ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(test_server()->Start());
1113ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1114ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
1115ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1116ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GURL url = test_server()->GetURL("files/autofill/autofill_test_form.html");
1117ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ui_test_utils::NavigateToURL(browser(), url);
1118ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  PopulateForm("NAME_FIRST");
1119ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1120ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(content::ExecuteScript(
11210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)       GetWebContents(), "document.getElementById('testform').reset()"));
1122ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1123ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  PopulateForm("NAME_FIRST");
1124ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1125ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("NAME_FIRST", "Milton");
1126ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("NAME_LAST", "Waddams");
1127ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("EMAIL_ADDRESS", "red.swingline@initech.com");
1128ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("ADDRESS_HOME_LINE1", "4120 Freidrich Lane");
1129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("ADDRESS_HOME_CITY", "Austin");
1130ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("ADDRESS_HOME_STATE", "Texas");
1131ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("ADDRESS_HOME_ZIP", "78744");
1132ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("ADDRESS_HOME_COUNTRY", "United States");
1133ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("PHONE_HOME_WHOLE_NUMBER", "5125551234");
1134ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1135ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1136ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test Autofill distinguishes a middle initial in a name.
1137ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Flakily times out: http://crbug.com/270341
1138ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest,
1139ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                       DISABLED_DistinguishMiddleInitialWithinName) {
1140ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(test_server()->Start());
1141ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1142ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
1143ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1144ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GURL url = test_server()->GetURL(
1145ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "files/autofill/autofill_middleinit_form.html");
1146ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ui_test_utils::NavigateToURL(browser(), url);
1147ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  PopulateForm("NAME_FIRST");
1148ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1149ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("NAME_MIDDLE", "C");
1150ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1151ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1152ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test forms with multiple email addresses are filled properly.
1153ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Entire form should be filled with one user gesture.
1154ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Flakily times out: http://crbug.com/270341
1155ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest,
1156ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                       DISABLED_MultipleEmailFilledByOneUserGesture) {
1157ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(test_server()->Start());
1158ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1159ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string email("bsmith@gmail.com");
1160ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1161ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  AutofillProfile profile;
1162ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Bob"));
1163ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(NAME_LAST, ASCIIToUTF16("Smith"));
1164ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(EMAIL_ADDRESS, ASCIIToUTF16(email));
1165ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  profile.SetRawInfo(PHONE_HOME_WHOLE_NUMBER, ASCIIToUTF16("4088714567"));
1166ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SetProfile(profile);
1167ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1168ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GURL url = test_server()->GetURL(
1169ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "files/autofill/autofill_confirmemail_form.html");
1170ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ui_test_utils::NavigateToURL(browser(), url);
1171ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  PopulateForm("NAME_FIRST");
1172ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1173ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectFieldValue("EMAIL_CONFIRM", email);
1174ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // TODO(isherman): verify entire form.
1175ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1176ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1177424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// http://crbug.com/281527
1178ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#if defined(OS_MACOSX)
1179ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#define MAYBE_FormFillLatencyAfterSubmit FormFillLatencyAfterSubmit
1180ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#else
1181ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#define MAYBE_FormFillLatencyAfterSubmit DISABLED_FormFillLatencyAfterSubmit
1182ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif
1183ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test latency time on form submit with lots of stored Autofill profiles.
1184ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// This test verifies when a profile is selected from the Autofill dictionary
1185ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// that consists of thousands of profiles, the form does not hang after being
1186ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// submitted.
1187ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest,
1188ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                       MAYBE_FormFillLatencyAfterSubmit) {
1189ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(test_server()->Start());
1190ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1191ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::vector<std::string> cities;
1192ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  cities.push_back("San Jose");
1193ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  cities.push_back("San Francisco");
1194ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  cities.push_back("Sacramento");
1195ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  cities.push_back("Los Angeles");
1196ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1197ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::vector<std::string> streets;
1198ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  streets.push_back("St");
1199ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  streets.push_back("Ave");
1200ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  streets.push_back("Ln");
1201ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  streets.push_back("Ct");
1202ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1203ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const int kNumProfiles = 1500;
1204ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::Time start_time = base::Time::Now();
1205ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::vector<AutofillProfile> profiles;
1206ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  for (int i = 0; i < kNumProfiles; i++) {
1207ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    AutofillProfile profile;
1208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16 name(base::IntToString16(i));
1209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16 email(name + ASCIIToUTF16("@example.com"));
1210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16 street = ASCIIToUTF16(
1211ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        base::IntToString(base::RandInt(0, 10000)) + " " +
1212ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        streets[base::RandInt(0, streets.size() - 1)]);
12135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::string16 city =
12145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ASCIIToUTF16(cities[base::RandInt(0, cities.size() - 1)]);
1215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16 zip(base::IntToString16(base::RandInt(0, 10000)));
1216ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    profile.SetRawInfo(NAME_FIRST, name);
1217ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    profile.SetRawInfo(EMAIL_ADDRESS, email);
1218ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    profile.SetRawInfo(ADDRESS_HOME_LINE1, street);
1219ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    profile.SetRawInfo(ADDRESS_HOME_CITY, city);
12205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    profile.SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("CA"));
1221ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    profile.SetRawInfo(ADDRESS_HOME_ZIP, zip);
12225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("US"));
1223ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    profiles.push_back(profile);
1224ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
1225ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SetProfiles(&profiles);
1226ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // TODO(isherman): once we're sure this test doesn't timeout on any bots, this
1227ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // can be removd.
1228ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  LOG(INFO) << "Created " << kNumProfiles << " profiles in " <<
1229ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch               (base::Time::Now() - start_time).InSeconds() << " seconds.";
1230ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1231ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GURL url = test_server()->GetURL(
1232ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "files/autofill/latency_after_submit_test.html");
1233ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ui_test_utils::NavigateToURL(browser(), url);
1234ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  PopulateForm("NAME_FIRST");
1235ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1236ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  content::WindowedNotificationObserver load_stop_observer(
1237ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      content::NOTIFICATION_LOAD_STOP,
1238ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      content::Source<content::NavigationController>(
12390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          &GetWebContents()->GetController()));
1240ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1241ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(content::ExecuteScript(
1242ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GetRenderViewHost(),
1243ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "document.getElementById('testform').submit();"));
1244ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // This will ensure the test didn't hang.
1245ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  load_stop_observer.Wait();
1246ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1247ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1248ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test that Chrome doesn't crash when autocomplete is disabled while the user
1249ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// is interacting with the form.  This is a regression test for
1250ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// http://crbug.com/160476
1251ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(AutofillInteractiveTest,
1252ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                       DisableAutocompleteWhileFilling) {
1253ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CreateTestProfile();
1254ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1255ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Load the test page.
1256ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(),
1257ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GURL(std::string(kDataURIPrefix) + kTestFormString)));
1258ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1259ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Invoke Autofill: Start filling the first name field with "M" and wait for
1260ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // the popup to be shown.
1261ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  FocusFirstNameField();
1262ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SendKeyToPageAndWait(ui::VKEY_M);
1263ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1264ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Now that the popup with suggestions is showing, disable autocomplete for
1265ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // the active field.
1266ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(content::ExecuteScript(
1267ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GetRenderViewHost(),
1268ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "document.querySelector('input').autocomplete = 'off';"));
1269ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1270ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Press the down arrow to select the suggestion and attempt to preview the
1271ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // autofilled form.
12720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  SendKeyToPopupAndWait(ui::VKEY_DOWN);
1273ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1274ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace autofill
1276