| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.chrome.browser.autofill; | 5 package org.chromium.chrome.browser.autofill; |
| 6 | 6 |
| 7 import android.test.suitebuilder.annotation.MediumTest; | 7 import android.test.suitebuilder.annotation.MediumTest; |
| 8 import android.text.TextUtils; | 8 import android.text.TextUtils; |
| 9 import android.view.View; | 9 import android.view.View; |
| 10 import android.view.ViewGroup; | 10 import android.view.ViewGroup; |
| 11 | 11 |
| 12 import org.chromium.base.ThreadUtils; | 12 import org.chromium.base.ThreadUtils; |
| 13 import org.chromium.base.test.util.Feature; | 13 import org.chromium.base.test.util.Feature; |
| 14 import org.chromium.base.test.util.UrlUtils; | 14 import org.chromium.base.test.util.UrlUtils; |
| 15 import org.chromium.chrome.R; | 15 import org.chromium.chrome.R; |
| 16 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile; | 16 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile; |
| 17 import org.chromium.chrome.shell.ChromeShellTestBase; | 17 import org.chromium.chrome.shell.ChromeShellTestBase; |
| 18 import org.chromium.content.browser.ContentViewCore; | 18 import org.chromium.content.browser.ContentViewCore; |
| 19 import org.chromium.content.browser.test.util.Criteria; | 19 import org.chromium.content.browser.test.util.Criteria; |
| 20 import org.chromium.content.browser.test.util.CriteriaHelper; | 20 import org.chromium.content.browser.test.util.CriteriaHelper; |
| 21 import org.chromium.content.browser.test.util.DOMUtils; | 21 import org.chromium.content.browser.test.util.DOMUtils; |
| 22 import org.chromium.content.browser.test.util.TestInputMethodManagerWrapper; | 22 import org.chromium.content.browser.test.util.TestInputMethodManagerWrapper; |
| 23 import org.chromium.content.browser.test.util.TouchCommon; | 23 import org.chromium.content.browser.test.util.TouchCommon; |
| 24 import org.chromium.content_public.browser.WebContents; |
| 24 import org.chromium.ui.autofill.AutofillPopup; | 25 import org.chromium.ui.autofill.AutofillPopup; |
| 25 | 26 |
| 26 import java.util.ArrayList; | 27 import java.util.ArrayList; |
| 27 import java.util.List; | 28 import java.util.List; |
| 28 import java.util.concurrent.ExecutionException; | 29 import java.util.concurrent.ExecutionException; |
| 29 import java.util.concurrent.TimeoutException; | 30 import java.util.concurrent.TimeoutException; |
| 30 | 31 |
| 31 /** | 32 /** |
| 32 * Integration tests for the AutofillPopup. | 33 * Integration tests for the AutofillPopup. |
| 33 */ | 34 */ |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 private void loadAndFillForm( | 135 private void loadAndFillForm( |
| 135 final String formDataUrl, final String inputText) | 136 final String formDataUrl, final String inputText) |
| 136 throws InterruptedException, ExecutionException, TimeoutException { | 137 throws InterruptedException, ExecutionException, TimeoutException { |
| 137 launchChromeShellWithUrl(formDataUrl); | 138 launchChromeShellWithUrl(formDataUrl); |
| 138 assertTrue(waitForActiveShellToBeDoneLoading()); | 139 assertTrue(waitForActiveShellToBeDoneLoading()); |
| 139 mHelper = new AutofillTestHelper(); | 140 mHelper = new AutofillTestHelper(); |
| 140 | 141 |
| 141 // The TestInputMethodManagerWrapper intercepts showSoftInput so that a
keyboard is never | 142 // The TestInputMethodManagerWrapper intercepts showSoftInput so that a
keyboard is never |
| 142 // brought up. | 143 // brought up. |
| 143 final ContentViewCore viewCore = getActivity().getActiveContentViewCore(
); | 144 final ContentViewCore viewCore = getActivity().getActiveContentViewCore(
); |
| 145 final WebContents webContents = viewCore.getWebContents(); |
| 144 final ViewGroup view = viewCore.getContainerView(); | 146 final ViewGroup view = viewCore.getContainerView(); |
| 145 final TestInputMethodManagerWrapper immw = | 147 final TestInputMethodManagerWrapper immw = |
| 146 new TestInputMethodManagerWrapper(viewCore); | 148 new TestInputMethodManagerWrapper(viewCore); |
| 147 viewCore.getImeAdapterForTest().setInputMethodManagerWrapper(immw); | 149 viewCore.getImeAdapterForTest().setInputMethodManagerWrapper(immw); |
| 148 | 150 |
| 149 // Add an Autofill profile. | 151 // Add an Autofill profile. |
| 150 AutofillProfile profile = new AutofillProfile( | 152 AutofillProfile profile = new AutofillProfile( |
| 151 "" /* guid */, ORIGIN, FIRST_NAME + " " + LAST_NAME, COMPANY_NAM
E, | 153 "" /* guid */, ORIGIN, FIRST_NAME + " " + LAST_NAME, COMPANY_NAM
E, |
| 152 STREET_ADDRESS_TEXTAREA, | 154 STREET_ADDRESS_TEXTAREA, |
| 153 STATE, CITY, DEPENDENT_LOCALITY, | 155 STATE, CITY, DEPENDENT_LOCALITY, |
| 154 ZIP_CODE, SORTING_CODE, COUNTRY, PHONE_NUMBER, EMAIL, | 156 ZIP_CODE, SORTING_CODE, COUNTRY, PHONE_NUMBER, EMAIL, |
| 155 LANGUAGE_CODE); | 157 LANGUAGE_CODE); |
| 156 mHelper.setProfile(profile); | 158 mHelper.setProfile(profile); |
| 157 assertEquals(1, mHelper.getNumberOfProfiles()); | 159 assertEquals(1, mHelper.getNumberOfProfiles()); |
| 158 | 160 |
| 159 // Click the input field for the first name. | 161 // Click the input field for the first name. |
| 160 assertTrue(DOMUtils.waitForNonZeroNodeBounds(viewCore, "fn")); | 162 assertTrue(DOMUtils.waitForNonZeroNodeBounds(webContents, "fn")); |
| 161 DOMUtils.clickNode(this, viewCore, "fn"); | 163 DOMUtils.clickNode(this, viewCore, "fn"); |
| 162 | 164 |
| 163 waitForKeyboardShowRequest(immw, 1); | 165 waitForKeyboardShowRequest(immw, 1); |
| 164 | 166 |
| 165 ThreadUtils.runOnUiThreadBlocking(new Runnable() { | 167 ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| 166 @Override | 168 @Override |
| 167 public void run() { | 169 public void run() { |
| 168 viewCore.getInputConnectionForTest().setComposingText( | 170 viewCore.getInputConnectionForTest().setComposingText( |
| 169 inputText, 1); | 171 inputText, 1); |
| 170 } | 172 } |
| 171 }); | 173 }); |
| 172 | 174 |
| 173 waitForAnchorViewAdd(view); | 175 waitForAnchorViewAdd(view); |
| 174 View anchorView = view.findViewById(R.id.dropdown_popup_window); | 176 View anchorView = view.findViewById(R.id.dropdown_popup_window); |
| 175 | 177 |
| 176 assertTrue(anchorView.getTag() instanceof AutofillPopup); | 178 assertTrue(anchorView.getTag() instanceof AutofillPopup); |
| 177 final AutofillPopup popup = (AutofillPopup) anchorView.getTag(); | 179 final AutofillPopup popup = (AutofillPopup) anchorView.getTag(); |
| 178 | 180 |
| 179 waitForAutofillPopopShow(popup); | 181 waitForAutofillPopopShow(popup); |
| 180 | 182 |
| 181 TouchCommon touchCommon = new TouchCommon(this); | 183 TouchCommon touchCommon = new TouchCommon(this); |
| 182 touchCommon.singleClickViewRelative(popup.getListView(), 10, 10); | 184 touchCommon.singleClickViewRelative(popup.getListView(), 10, 10); |
| 183 | 185 |
| 184 waitForInputFieldFill(viewCore); | 186 waitForInputFieldFill(webContents); |
| 185 } | 187 } |
| 186 | 188 |
| 187 /** | 189 /** |
| 188 * Tests that bringing up an Autofill and clicking on the first entry fills
out the expected | 190 * Tests that bringing up an Autofill and clicking on the first entry fills
out the expected |
| 189 * Autofill information. | 191 * Autofill information. |
| 190 */ | 192 */ |
| 191 @MediumTest | 193 @MediumTest |
| 192 @Feature({"autofill"}) | 194 @Feature({"autofill"}) |
| 193 public void testClickAutofillPopupSuggestion() | 195 public void testClickAutofillPopupSuggestion() |
| 194 throws InterruptedException, ExecutionException, TimeoutException { | 196 throws InterruptedException, ExecutionException, TimeoutException { |
| 195 loadAndFillForm(BASIC_PAGE_DATA, "J"); | 197 loadAndFillForm(BASIC_PAGE_DATA, "J"); |
| 196 final ContentViewCore viewCore = getActivity().getActiveContentViewCore(
); | 198 final ContentViewCore viewCore = getActivity().getActiveContentViewCore(
); |
| 199 final WebContents webContents = viewCore.getWebContents(); |
| 197 | 200 |
| 198 assertEquals("First name did not match", | 201 assertEquals("First name did not match", |
| 199 FIRST_NAME, DOMUtils.getNodeValue(viewCore, "fn")); | 202 FIRST_NAME, DOMUtils.getNodeValue(webContents, "fn")); |
| 200 assertEquals("Last name did not match", | 203 assertEquals("Last name did not match", |
| 201 LAST_NAME, DOMUtils.getNodeValue(viewCore, "ln")); | 204 LAST_NAME, DOMUtils.getNodeValue(webContents, "ln")); |
| 202 assertEquals("Street address (textarea) did not match", | 205 assertEquals("Street address (textarea) did not match", |
| 203 STREET_ADDRESS_TEXTAREA, DOMUtils.getNodeValue(viewCore, "sa")); | 206 STREET_ADDRESS_TEXTAREA, DOMUtils.getNodeValue(webContents, "sa"
)); |
| 204 assertEquals("Address line 1 did not match", | 207 assertEquals("Address line 1 did not match", |
| 205 ADDRESS_LINE1, DOMUtils.getNodeValue(viewCore, "a1")); | 208 ADDRESS_LINE1, DOMUtils.getNodeValue(webContents, "a1")); |
| 206 assertEquals("Address line 2 did not match", | 209 assertEquals("Address line 2 did not match", |
| 207 ADDRESS_LINE2, DOMUtils.getNodeValue(viewCore, "a2")); | 210 ADDRESS_LINE2, DOMUtils.getNodeValue(webContents, "a2")); |
| 208 assertEquals("City did not match", | 211 assertEquals("City did not match", |
| 209 CITY, DOMUtils.getNodeValue(viewCore, "ct")); | 212 CITY, DOMUtils.getNodeValue(webContents, "ct")); |
| 210 assertEquals("Zip code did not match", | 213 assertEquals("Zip code did not match", |
| 211 ZIP_CODE, DOMUtils.getNodeValue(viewCore, "zc")); | 214 ZIP_CODE, DOMUtils.getNodeValue(webContents, "zc")); |
| 212 assertEquals("Country did not match", | 215 assertEquals("Country did not match", |
| 213 COUNTRY, DOMUtils.getNodeValue(viewCore, "co")); | 216 COUNTRY, DOMUtils.getNodeValue(webContents, "co")); |
| 214 assertEquals("Email did not match", | 217 assertEquals("Email did not match", |
| 215 EMAIL, DOMUtils.getNodeValue(viewCore, "em")); | 218 EMAIL, DOMUtils.getNodeValue(webContents, "em")); |
| 216 assertEquals("Phone number did not match", | 219 assertEquals("Phone number did not match", |
| 217 PHONE_NUMBER, DOMUtils.getNodeValue(viewCore, "ph")); | 220 PHONE_NUMBER, DOMUtils.getNodeValue(webContents, "ph")); |
| 218 | 221 |
| 219 final String profileFullName = FIRST_NAME + " " + LAST_NAME; | 222 final String profileFullName = FIRST_NAME + " " + LAST_NAME; |
| 220 final int loggedEntries = 10; | 223 final int loggedEntries = 10; |
| 221 assertEquals("Mismatched number of logged entries", | 224 assertEquals("Mismatched number of logged entries", |
| 222 loggedEntries, mAutofillLoggedEntries.size()); | 225 loggedEntries, mAutofillLoggedEntries.size()); |
| 223 assertLogged(FIRST_NAME, profileFullName); | 226 assertLogged(FIRST_NAME, profileFullName); |
| 224 assertLogged(LAST_NAME, profileFullName); | 227 assertLogged(LAST_NAME, profileFullName); |
| 225 assertLogged(STREET_ADDRESS_TEXTAREA, profileFullName); | 228 assertLogged(STREET_ADDRESS_TEXTAREA, profileFullName); |
| 226 assertLogged(ADDRESS_LINE1, profileFullName); | 229 assertLogged(ADDRESS_LINE1, profileFullName); |
| 227 assertLogged(ADDRESS_LINE2, profileFullName); | 230 assertLogged(ADDRESS_LINE2, profileFullName); |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 314 private void waitForAutofillPopopShow(final AutofillPopup popup) throws Inte
rruptedException { | 317 private void waitForAutofillPopopShow(final AutofillPopup popup) throws Inte
rruptedException { |
| 315 assertTrue("Autofill Popup anchor view was never added.", | 318 assertTrue("Autofill Popup anchor view was never added.", |
| 316 CriteriaHelper.pollForCriteria(new Criteria() { | 319 CriteriaHelper.pollForCriteria(new Criteria() { |
| 317 @Override | 320 @Override |
| 318 public boolean isSatisfied() { | 321 public boolean isSatisfied() { |
| 319 return popup.isShowing(); | 322 return popup.isShowing(); |
| 320 } | 323 } |
| 321 })); | 324 })); |
| 322 } | 325 } |
| 323 | 326 |
| 324 private void waitForInputFieldFill(final ContentViewCore viewCore) throws In
terruptedException { | 327 private void waitForInputFieldFill(final WebContents webContents) throws Int
erruptedException { |
| 325 assertTrue("First name field was never filled.", | 328 assertTrue("First name field was never filled.", |
| 326 CriteriaHelper.pollForCriteria(new Criteria() { | 329 CriteriaHelper.pollForCriteria(new Criteria() { |
| 327 @Override | 330 @Override |
| 328 public boolean isSatisfied() { | 331 public boolean isSatisfied() { |
| 329 try { | 332 try { |
| 330 return TextUtils.equals(FIRST_NAME, | 333 return TextUtils.equals(FIRST_NAME, |
| 331 DOMUtils.getNodeValue(viewCore, "fn")); | 334 DOMUtils.getNodeValue(webContents, "fn")); |
| 332 } catch (InterruptedException e) { | 335 } catch (InterruptedException e) { |
| 333 return false; | 336 return false; |
| 334 } catch (TimeoutException e) { | 337 } catch (TimeoutException e) { |
| 335 return false; | 338 return false; |
| 336 } | 339 } |
| 337 | 340 |
| 338 } | 341 } |
| 339 })); | 342 })); |
| 340 } | 343 } |
| 341 | 344 |
| 342 private void assertLogged(String autofilledValue, String profileFullName) { | 345 private void assertLogged(String autofilledValue, String profileFullName) { |
| 343 for (AutofillLogger.LogEntry entry : mAutofillLoggedEntries) { | 346 for (AutofillLogger.LogEntry entry : mAutofillLoggedEntries) { |
| 344 if (entry.getAutofilledValue().equals(autofilledValue) && | 347 if (entry.getAutofilledValue().equals(autofilledValue) && |
| 345 entry.getProfileFullName().equals(profileFullName)) { | 348 entry.getProfileFullName().equals(profileFullName)) { |
| 346 return; | 349 return; |
| 347 } | 350 } |
| 348 } | 351 } |
| 349 fail("Logged entry not found [" + autofilledValue + "," + profileFullNam
e + "]"); | 352 fail("Logged entry not found [" + autofilledValue + "," + profileFullNam
e + "]"); |
| 350 } | 353 } |
| 351 } | 354 } |
| OLD | NEW |