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