17dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
27dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
37dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// found in the LICENSE file.
47dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochpackage org.chromium.chrome.browser.autofill;
67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import android.test.suitebuilder.annotation.MediumTest;
8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import android.text.TextUtils;
9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import android.view.View;
100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochimport android.view.ViewGroup;
11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)import org.chromium.base.ThreadUtils;
137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport org.chromium.base.test.util.Feature;
147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport org.chromium.base.test.util.UrlUtils;
157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport org.chromium.chrome.R;
167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import org.chromium.chrome.shell.ChromeShellTestBase;
18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochimport org.chromium.content.browser.ContentViewCore;
197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport org.chromium.content.browser.test.util.Criteria;
207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport org.chromium.content.browser.test.util.CriteriaHelper;
217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport org.chromium.content.browser.test.util.DOMUtils;
227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport org.chromium.content.browser.test.util.TestInputMethodManagerWrapper;
237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport org.chromium.content.browser.test.util.TouchCommon;
247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport org.chromium.ui.autofill.AutofillPopup;
257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochimport java.util.ArrayList;
27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochimport java.util.List;
287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport java.util.concurrent.ExecutionException;
297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport java.util.concurrent.TimeoutException;
307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch/**
327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * Integration tests for the AutofillPopup.
337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch */
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)public class AutofillPopupTest extends ChromeShellTestBase {
357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    private static final String FIRST_NAME = "John";
377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    private static final String LAST_NAME = "Smith";
387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    private static final String COMPANY_NAME = "Acme Inc.";
397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    private static final String ADDRESS_LINE1 = "1 Main";
407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    private static final String ADDRESS_LINE2 = "Apt A";
41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    private static final String STREET_ADDRESS_TEXTAREA = ADDRESS_LINE1 + "\n" + ADDRESS_LINE2;
427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    private static final String CITY = "San Francisco";
43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    private static final String DEPENDENT_LOCALITY = "";
447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    private static final String STATE = "CA";
457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    private static final String ZIP_CODE = "94102";
46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    private static final String SORTING_CODE = "";
477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    private static final String COUNTRY = "US";
487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    private static final String PHONE_NUMBER = "4158889999";
497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    private static final String EMAIL = "john@acme.inc";
50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    private static final String LANGUAGE_CODE = "";
517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    private static final String ORIGIN = "https://www.example.com";
527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    private static final String BASIC_PAGE_DATA = UrlUtils.encodeHtmlDataUri(
547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            "<html><head><meta name=\"viewport\"" +
557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            "content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0\" /></head>" +
567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            "<body><form method=\"POST\">" +
57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            "<input type=\"text\" id=\"fn\" autocomplete=\"given-name\" /><br>" +
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            "<input type=\"text\" id=\"ln\" autocomplete=\"family-name\" /><br>" +
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            "<textarea id=\"sa\" autocomplete=\"street-address\"></textarea><br>" +
60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            "<input type=\"text\" id=\"a1\" autocomplete=\"address-line1\" /><br>" +
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            "<input type=\"text\" id=\"a2\" autocomplete=\"address-line2\" /><br>" +
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            "<input type=\"text\" id=\"ct\" autocomplete=\"locality\" /><br>" +
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            "<input type=\"text\" id=\"zc\" autocomplete=\"postal-code\" /><br>" +
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            "<input type=\"text\" id=\"em\" autocomplete=\"email\" /><br>" +
65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            "<input type=\"text\" id=\"ph\" autocomplete=\"tel\" /><br>" +
66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            "<input type=\"text\" id=\"fx\" autocomplete=\"fax\" /><br>" +
67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "<select id=\"co\" autocomplete=\"country\"><br>" +
68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "<option value=\"BR\">Brazil</option>" +
69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "<option value=\"US\">United States</option>" +
70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "</select>" +
71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "<input type=\"submit\" />" +
72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "</form></body></html>");
73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    private static final String INITIATING_ELEMENT_FILLED = UrlUtils.encodeHtmlDataUri(
75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "<html><head><meta name=\"viewport\"" +
76effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0\" /></head>" +
77effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "<body><form method=\"POST\">" +
78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "<input type=\"text\" id=\"fn\" autocomplete=\"given-name\" value=\"J\"><br>" +
79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "<input type=\"text\" id=\"ln\" autocomplete=\"family-name\"><br>" +
80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "<input type=\"text\" id=\"em\" autocomplete=\"email\"><br>" +
81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "<select id=\"co\" autocomplete=\"country\"><br>" +
82effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "<option value=\"US\">United States</option>" +
83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "<option value=\"BR\">Brazil</option>" +
84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "</select>" +
85effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "<input type=\"submit\" />" +
86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "</form></body></html>");
87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    private static final String ANOTHER_ELEMENT_FILLED = UrlUtils.encodeHtmlDataUri(
89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "<html><head><meta name=\"viewport\"" +
90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0\" /></head>" +
91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "<body><form method=\"POST\">" +
92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "<input type=\"text\" id=\"fn\" autocomplete=\"given-name\"><br>" +
93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "<input type=\"text\" id=\"ln\" autocomplete=\"family-name\"><br>" +
94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "<input type=\"text\" id=\"em\" autocomplete=\"email\" value=\"foo@example.com\"><br>" +
95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "<select id=\"co\" autocomplete=\"country\"><br>" +
96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "<option></option>" +
97effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "<option value=\"BR\">Brazil</option>" +
98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "<option value=\"US\">United States</option>" +
99effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "</select>" +
100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "<input type=\"submit\" />" +
101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "</form></body></html>");
102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    private static final String INVALID_OPTION = UrlUtils.encodeHtmlDataUri(
104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "<html><head><meta name=\"viewport\"" +
105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0\" /></head>" +
106effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "<body><form method=\"POST\">" +
107effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "<input type=\"text\" id=\"fn\" autocomplete=\"given-name\" value=\"J\"><br>" +
108effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "<input type=\"text\" id=\"ln\" autocomplete=\"family-name\"><br>" +
109effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "<input type=\"text\" id=\"em\" autocomplete=\"email\"><br>" +
110effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "<select id=\"co\" autocomplete=\"country\"><br>" +
111effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "<option value=\"GB\">Great Britain</option>" +
112effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "<option value=\"BR\">Brazil</option>" +
113effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            "</select>" +
1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            "<input type=\"submit\" />" +
1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            "</form></body></html>");
1167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    private AutofillTestHelper mHelper;
118effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    private List<AutofillLogger.LogEntry> mAutofillLoggedEntries;
1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    @Override
1217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    public void setUp() throws Exception {
1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        super.setUp();
1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        clearAppData();
124effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        mAutofillLoggedEntries = new ArrayList<AutofillLogger.LogEntry>();
125effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        AutofillLogger.setLogger(
126effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AutofillLogger.Logger() {
127effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                @Override
128effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                public void didFillField(AutofillLogger.LogEntry logEntry) {
129effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                    mAutofillLoggedEntries.add(logEntry);
130effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                }}
131effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        );
1327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
1337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
134c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    private void loadAndFillForm(
135effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            final String formDataUrl, final String inputText)
1367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            throws InterruptedException, ExecutionException, TimeoutException {
137effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        launchChromeShellWithUrl(formDataUrl);
138effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        assertTrue(waitForActiveShellToBeDoneLoading());
139effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        mHelper = new AutofillTestHelper();
140effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // The TestInputMethodManagerWrapper intercepts showSoftInput so that a keyboard is never
1427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // brought up.
1430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        final ContentViewCore viewCore = getActivity().getActiveContentViewCore();
1440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        final ViewGroup view = viewCore.getContainerView();
1457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        final TestInputMethodManagerWrapper immw =
146c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                new TestInputMethodManagerWrapper(viewCore);
147c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        viewCore.getImeAdapterForTest().setInputMethodManagerWrapper(immw);
1487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // Add an Autofill profile.
1507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        AutofillProfile profile = new AutofillProfile(
151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                "" /* guid */, ORIGIN, FIRST_NAME + " " + LAST_NAME, COMPANY_NAME,
152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                STREET_ADDRESS_TEXTAREA,
153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                STATE, CITY, DEPENDENT_LOCALITY,
154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                ZIP_CODE, SORTING_CODE, COUNTRY, PHONE_NUMBER, EMAIL,
155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                LANGUAGE_CODE);
156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        mHelper.setProfile(profile);
1577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        assertEquals(1, mHelper.getNumberOfProfiles());
1587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // Click the input field for the first name.
160c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        assertTrue(DOMUtils.waitForNonZeroNodeBounds(viewCore, "fn"));
1610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        DOMUtils.clickNode(this, viewCore, "fn");
1627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        waitForKeyboardShowRequest(immw, 1);
1647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            @Override
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            public void run() {
168c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                viewCore.getInputConnectionForTest().setComposingText(
169effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                        inputText, 1);
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            }
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        });
1727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        waitForAnchorViewAdd(view);
174010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        View anchorView = view.findViewById(R.id.dropdown_popup_window);
1757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        assertTrue(anchorView.getTag() instanceof AutofillPopup);
1777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        final AutofillPopup popup = (AutofillPopup) anchorView.getTag();
1787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        waitForAutofillPopopShow(popup);
1807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        TouchCommon touchCommon = new TouchCommon(this);
1827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        touchCommon.singleClickViewRelative(popup.getListView(), 10, 10);
1837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
184c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        waitForInputFieldFill(viewCore);
185effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
186effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
187effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    /**
188effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch     * Tests that bringing up an Autofill and clicking on the first entry fills out the expected
189effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch     * Autofill information.
190effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch     */
191effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    @MediumTest
192effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    @Feature({"autofill"})
193effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    public void testClickAutofillPopupSuggestion()
194effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            throws InterruptedException, ExecutionException, TimeoutException {
195c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        loadAndFillForm(BASIC_PAGE_DATA, "J");
1965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        final ContentViewCore viewCore = getActivity().getActiveContentViewCore();
197effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        assertEquals("First name did not match",
199c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                FIRST_NAME, DOMUtils.getNodeValue(viewCore, "fn"));
2007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        assertEquals("Last name did not match",
201c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                LAST_NAME, DOMUtils.getNodeValue(viewCore, "ln"));
202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        assertEquals("Street address (textarea) did not match",
203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                STREET_ADDRESS_TEXTAREA, DOMUtils.getNodeValue(viewCore, "sa"));
2047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        assertEquals("Address line 1 did not match",
205c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                ADDRESS_LINE1, DOMUtils.getNodeValue(viewCore, "a1"));
2067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        assertEquals("Address line 2 did not match",
207c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                ADDRESS_LINE2, DOMUtils.getNodeValue(viewCore, "a2"));
2087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        assertEquals("City did not match",
209c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                CITY, DOMUtils.getNodeValue(viewCore, "ct"));
210effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        assertEquals("Zip code did not match",
211c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                ZIP_CODE, DOMUtils.getNodeValue(viewCore, "zc"));
212effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        assertEquals("Country did not match",
213c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                COUNTRY, DOMUtils.getNodeValue(viewCore, "co"));
214effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        assertEquals("Email did not match",
215c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                EMAIL, DOMUtils.getNodeValue(viewCore, "em"));
216effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        assertEquals("Phone number did not match",
217c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                PHONE_NUMBER, DOMUtils.getNodeValue(viewCore, "ph"));
218effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
219effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        final String profileFullName = FIRST_NAME + " " + LAST_NAME;
220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        final int loggedEntries = 10;
221effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        assertEquals("Mismatched number of logged entries",
222effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                loggedEntries, mAutofillLoggedEntries.size());
223effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        assertLogged(FIRST_NAME, profileFullName);
224effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        assertLogged(LAST_NAME, profileFullName);
225010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        assertLogged(STREET_ADDRESS_TEXTAREA, profileFullName);
226effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        assertLogged(ADDRESS_LINE1, profileFullName);
227effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        assertLogged(ADDRESS_LINE2, profileFullName);
228effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        assertLogged(CITY, profileFullName);
229effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        assertLogged(ZIP_CODE, profileFullName);
230effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        assertLogged(COUNTRY, profileFullName);
231effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        assertLogged(EMAIL, profileFullName);
232effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        assertLogged(PHONE_NUMBER, profileFullName);
233effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
234effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
235effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    /**
236effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch     * Tests that bringing up an Autofill and clicking on the partially filled first
237effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch     * element will still fill the entire form (including the initiating element itself).
238effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch     */
239effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    @MediumTest
240effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    @Feature({"autofill"})
241effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    public void testLoggingInitiatedElementFilled()
242effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            throws InterruptedException, ExecutionException, TimeoutException {
243effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        loadAndFillForm(INITIATING_ELEMENT_FILLED, "o");
244effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        final String profileFullName = FIRST_NAME + " " + LAST_NAME;
245effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        final int loggedEntries = 4;
246effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        assertEquals("Mismatched number of logged entries",
247effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                loggedEntries, mAutofillLoggedEntries.size());
248effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        assertLogged(FIRST_NAME, profileFullName);
249effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        assertLogged(LAST_NAME, profileFullName);
250effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        assertLogged(EMAIL, profileFullName);
251effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        assertLogged(COUNTRY, profileFullName);
252effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
253effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
254effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    /**
255effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch     * Tests that bringing up an Autofill and clicking on the empty first element
256effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch     * will fill the all other elements except the previously filled email.
257effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch     */
258effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    @MediumTest
259effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    @Feature({"autofill"})
260effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    public void testLoggingAnotherElementFilled()
261effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            throws InterruptedException, ExecutionException, TimeoutException {
262effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        loadAndFillForm(ANOTHER_ELEMENT_FILLED, "J");
263effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        final String profileFullName = FIRST_NAME + " " + LAST_NAME;
264effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        final int loggedEntries = 3;
265effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        assertEquals("Mismatched number of logged entries",
266effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                loggedEntries, mAutofillLoggedEntries.size());
267effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        assertLogged(FIRST_NAME, profileFullName);
268effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        assertLogged(LAST_NAME, profileFullName);
269effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        assertLogged(COUNTRY, profileFullName);
270effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        // Email will not be logged since it already had some data.
271effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
272effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
273effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    /**
274effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch     * Tests that selecting a value not present in <option> will not be filled.
275effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch     */
276effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    @MediumTest
277effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    @Feature({"autofill"})
278effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    public void testNotLoggingInvalidOption()
279effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            throws InterruptedException, ExecutionException, TimeoutException {
280effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        loadAndFillForm(INVALID_OPTION, "o");
281effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        final String profileFullName = FIRST_NAME + " " + LAST_NAME;
282effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        final int loggedEntries = 3;
283effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        assertEquals("Mismatched number of logged entries",
284effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                loggedEntries, mAutofillLoggedEntries.size());
285effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        assertLogged(FIRST_NAME, profileFullName);
286effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        assertLogged(LAST_NAME, profileFullName);
287effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        assertLogged(EMAIL, profileFullName);
288effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        // Country will not be logged since "US" is not a valid <option>.
2897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
2907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // Wait and assert helper methods -------------------------------------------------------------
2927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    private void waitForKeyboardShowRequest(final TestInputMethodManagerWrapper immw,
2947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            final int count) throws InterruptedException {
2957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        assertTrue("Keyboard was never requested to be shown.",
2967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                CriteriaHelper.pollForCriteria(new Criteria() {
2977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                    @Override
2987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                    public boolean isSatisfied() {
2997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                        return immw.getShowSoftInputCounter() == count;
3007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                    }
3017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                }));
3027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
3037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    private void waitForAnchorViewAdd(final ViewGroup view) throws InterruptedException {
3057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        assertTrue("Autofill Popup anchor view was never added.",
3067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                CriteriaHelper.pollForCriteria(new Criteria() {
3077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                    @Override
3087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                    public boolean isSatisfied() {
309010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        return view.findViewById(R.id.dropdown_popup_window) != null;
3107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                    }
3117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                }));
3127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
3137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    private void waitForAutofillPopopShow(final AutofillPopup popup) throws InterruptedException {
3157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        assertTrue("Autofill Popup anchor view was never added.",
3167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                CriteriaHelper.pollForCriteria(new Criteria() {
3177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                    @Override
3187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                    public boolean isSatisfied() {
3197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                        return popup.isShowing();
3207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                    }
3217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                }));
3227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
3237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
324c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    private void waitForInputFieldFill(final ContentViewCore viewCore) throws InterruptedException {
3257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        assertTrue("First name field was never filled.",
3267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                CriteriaHelper.pollForCriteria(new Criteria() {
3277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                    @Override
3287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                    public boolean isSatisfied() {
3297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                        try {
3307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                            return TextUtils.equals(FIRST_NAME,
331c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                    DOMUtils.getNodeValue(viewCore, "fn"));
332a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        } catch (InterruptedException e) {
333a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            return false;
334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        } catch (TimeoutException e) {
3357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                            return false;
3367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                        }
337a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
3387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                    }
3397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                }));
3407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
341effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
342effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    private void assertLogged(String autofilledValue, String profileFullName) {
343effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        for (AutofillLogger.LogEntry entry : mAutofillLoggedEntries) {
344effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            if (entry.getAutofilledValue().equals(autofilledValue) &&
345effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                entry.getProfileFullName().equals(profileFullName)) {
346effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                return;
347effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            }
348effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        }
349effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        fail("Logged entry not found [" + autofilledValue + "," + profileFullName + "]");
350effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
3517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
352