You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by ts...@apache.org on 2016/12/20 19:19:27 UTC

wicket git commit: WICKET-6299

Repository: wicket
Updated Branches:
  refs/heads/master aedb98764 -> bcd55813b


WICKET-6299

Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/bcd55813
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/bcd55813
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/bcd55813

Branch: refs/heads/master
Commit: bcd55813b3afbccb5675096930aee6281c5cba3a
Parents: aedb987
Author: Tobias Soloschenko <ts...@apache.org>
Authored: Tue Dec 20 20:15:42 2016 +0100
Committer: Tobias Soloschenko <ts...@apache.org>
Committed: Tue Dec 20 20:15:42 2016 +0100

----------------------------------------------------------------------
 .../html/form/AutoCompleteAddressType.java      |  56 ++++
 .../markup/html/form/AutoCompleteBuilder.java   | 170 ++++++++++++
 .../markup/html/form/AutoCompleteContact.java   |  77 ++++++
 .../html/form/AutoCompleteContactBuilder.java   |  38 +++
 .../html/form/AutoCompleteContactDetails.java   | 102 +++++++
 .../markup/html/form/AutoCompleteFields.java    | 272 +++++++++++++++++++
 .../apache/wicket/markup/html/form/Form.java    |  14 +
 .../wicket/markup/html/form/TextField.java      |  14 +
 .../wicket/markup/html/form/FormTest.java       |  39 +++
 .../wicket/markup/html/form/TextFieldTest.java  |  23 +-
 10 files changed, 803 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteAddressType.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteAddressType.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteAddressType.java
new file mode 100644
index 0000000..6123053
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteAddressType.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.markup.html.form;
+
+/**
+ * Auto completion address type according to the whatwg specification.
+ * 
+ * @author Tobias Soloschenko
+ *
+ * @see <a href=
+ *      "https://html.spec.whatwg.org/multipage/forms.html">https://html.spec.whatwg.org/multipage/forms.html</a>
+ * 
+ */
+public enum AutoCompleteAddressType {
+
+	/**
+	 * Meaning the field is part of the shipping address or contact information
+	 */
+	SHIPPING("shipping"),
+
+	/**
+	 * meaning the field is part of the billing address or contact information
+	 */
+	BILLING("billing");
+
+	private String value;
+
+	private AutoCompleteAddressType(String value)
+	{
+		this.value = value;
+	}
+
+	/**
+	 * Gets the address type value
+	 * 
+	 * @return the value of the address type
+	 */
+	public String getValue()
+	{
+		return value;
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteBuilder.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteBuilder.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteBuilder.java
new file mode 100644
index 0000000..a3b64cd
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteBuilder.java
@@ -0,0 +1,170 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.markup.html.form;
+
+/**
+ * The auto complete builder is used to build the corresponding attribute for form and input tags.
+ * To use the auto completion just open the autofill options within your browser. In chrome for
+ * example it is accessed with the following URL:
+ * <a href="chrome://settings/autofillEditAddress">chrome://settings/autofillEditAddress</a>
+ * 
+ * @author Tobias Soloschenko
+ * 
+ * @since 8.0.0
+ *
+ */
+public class AutoCompleteBuilder implements AutoCompleteContactBuilder
+{
+	/**
+	 * The section prefix specificed by the whatwg standard
+	 */
+	public static final String SECTION_PREFIX = "section-";
+
+	private String sectionName;
+
+	private AutoCompleteAddressType addressType;
+
+	private AutoCompleteFields field;
+
+	private AutoCompleteContact contact;
+
+	private AutoCompleteContactDetails contactDetail;
+
+	private boolean empty;
+
+	/**
+	 * Initializes a new auto complete builder
+	 * 
+	 * @return the auto complete builder
+	 */
+	public static AutoCompleteBuilder init()
+	{
+		return new AutoCompleteBuilder();
+	}
+
+	/**
+	 * Empties out the autocomplete outcome
+	 * 
+	 * @return the auto complete builder
+	 */
+	public AutoCompleteBuilder empty()
+	{
+		this.empty = true;
+		return this;
+	}
+
+	/**
+	 * Applies a section to the auto completion field
+	 * 
+	 * @param sectionName
+	 *            the name of the section
+	 * @return the auto complete builder itself
+	 */
+	public AutoCompleteBuilder withSection(String sectionName)
+	{
+		this.sectionName = sectionName;
+		return this;
+	}
+
+	/**
+	 * Assigns the auto completion to a specific address type
+	 * 
+	 * @param addressType
+	 *            the auto completion address type
+	 * @return the auto complete builder itself
+	 */
+	public AutoCompleteBuilder forAddressType(AutoCompleteAddressType addressType)
+	{
+		this.addressType = addressType;
+		return this;
+	}
+
+	/**
+	 * Applies the field to the autocomplete attribute
+	 * 
+	 * @param field
+	 *            the field
+	 * @return the auto complete builder
+	 */
+	public AutoCompleteBuilder forField(AutoCompleteFields field)
+	{
+		this.field = field;
+		return this;
+	}
+
+	/**
+	 * Applies the contact information to the autocomplete attribute
+	 * 
+	 * @param contact
+	 *            the contact information are going to be applied to
+	 * @return the auto complete builder
+	 */
+	public AutoCompleteContactBuilder forContact(AutoCompleteContact contact)
+	{
+		this.contact = contact;
+		return this;
+	}
+
+	/**
+	 * @see {@link AutoCompleteContactBuilder}
+	 */
+	@Override
+	public AutoCompleteContactBuilder forField(AutoCompleteContactDetails contactDetail)
+	{
+		this.contactDetail = contactDetail;
+		return (AutoCompleteContactBuilder)this;
+	}
+
+	/**
+	 * Builds the attribute string
+	 * 
+	 * @return the attribute content in the right order
+	 */
+	@Override
+	public String toString()
+	{
+		StringBuilder stringBuilder = new StringBuilder();
+		if (!empty)
+		{
+			if (sectionName != null)
+			{
+				stringBuilder.append(SECTION_PREFIX);
+				stringBuilder.append(sectionName);
+				stringBuilder.append(" ");
+			}
+			if (addressType != null)
+			{
+				stringBuilder.append(addressType.getValue());
+				stringBuilder.append(" ");
+			}
+			if (field != null)
+			{
+				stringBuilder.append(field.getValue());
+			}
+			else
+			{
+				if (contact != null)
+				{
+					stringBuilder.append(contact.getValue());
+					stringBuilder.append(" ");
+				}
+				stringBuilder.append(contactDetail.getValue());
+			}
+		}
+		return stringBuilder.toString();
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContact.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContact.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContact.java
new file mode 100644
index 0000000..cbf86a5
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContact.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.markup.html.form;
+
+/**
+ * Auto completion contact according to the whatwg specification.
+ * 
+ * @author Tobias Soloschenko
+ *
+ * @see <a href=
+ *      "https://html.spec.whatwg.org/multipage/forms.html">https://html.spec.whatwg.org/multipage/forms.html</a>
+ * 
+ */
+public enum AutoCompleteContact {
+
+	/**
+	 * meaning the field is for contacting someone at their residence
+	 */
+	HOME("home"),
+
+	/**
+	 * meaning the field is for contacting someone at their workplace
+	 */
+	WORK("work"),
+
+	/**
+	 * meaning the field is for contacting someone regardless of location
+	 */
+	MOBILE("mobile"),
+
+	/**
+	 * meaning the field describes a fax machine's contact details
+	 */
+	FAX("fax"),
+
+	/**
+	 * meaning the field describes a pager's or beeper's contact details
+	 */
+	PAGER("pager");
+
+	private String value;
+
+	/**
+	 * Creates an auto completion contact with the given value
+	 * 
+	 * @param value
+	 *            the value of the contact
+	 */
+	private AutoCompleteContact(String value)
+	{
+		this.value = value;
+	}
+
+	/**
+	 * Gets the value of the auto completion contact
+	 * 
+	 * @return the value of the auto completion contact
+	 */
+	public String getValue()
+	{
+		return value;
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactBuilder.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactBuilder.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactBuilder.java
new file mode 100644
index 0000000..07324ff
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactBuilder.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.markup.html.form;
+
+/**
+ * The auto complete contact builder shrinks down the possibilities to the contact details
+ * 
+ * @author Tobias Soloschenko
+ * 
+ * @since 8.0.0
+ *
+ */
+public interface AutoCompleteContactBuilder
+{
+	/**
+	 * Applies the contact details information to the auto complete field
+	 * 
+	 * @param contactDetail
+	 *            the contact detail
+	 * @return the auto complete builder contact
+	 */
+	AutoCompleteContactBuilder forField(AutoCompleteContactDetails contactDetail);
+
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactDetails.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactDetails.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactDetails.java
new file mode 100644
index 0000000..e4d5e44
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactDetails.java
@@ -0,0 +1,102 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.markup.html.form;
+
+/**
+ * Auto completion contact detail according to the whatwg specification.
+ * 
+ * @author Tobias Soloschenko
+ *
+ * @see <a href=
+ *      "https://html.spec.whatwg.org/multipage/forms.html">https://html.spec.whatwg.org/multipage/forms.html</a>
+ * 
+ */
+public enum AutoCompleteContactDetails {
+
+	/**
+	 * +1 617 253 5702
+	 */
+	TEL("tel"),
+
+	/**
+	 * +1
+	 */
+	TEL_COUNTRY_CODE("tel-country-code"),
+
+	/**
+	 * 617 253 5702
+	 */
+	TEL_NATIONAL("tel-national"),
+
+	/**
+	 * 617
+	 */
+	TEL_AREA_CODE("tel-area-code"),
+
+	/**
+	 * 2535702
+	 */
+	TEL_LOCAL("tel-local"),
+
+	/**
+	 * 253
+	 */
+	TEL_LOCAL_PREFIX("tel-local-prefix"),
+
+	/**
+	 * 5702
+	 */
+	TEL_LOCAL_SUFFIX("tel-local-suffix"),
+
+	/**
+	 * 1000
+	 */
+	TEL_EXTENSION("tel-extension"),
+
+	/**
+	 * timbl@w3.org
+	 */
+	EMAIL("email"),
+
+	/**
+	 * irc://example.org/timbl,isuser
+	 */
+	IMPP("impp");
+	
+	private String value;
+	
+	/**
+	 * Creates an auto completion contact detail with the given value
+	 * 
+	 * @param value
+	 *            the value of the contact detail
+	 */
+	private AutoCompleteContactDetails(String value)
+	{
+		this.value = value;
+	}
+
+	/**
+	 * Gets the value of the auto completion contact detail
+	 * 
+	 * @return the value of the auto completion contact detail
+	 */
+	public String getValue()
+	{
+		return value;
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteFields.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteFields.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteFields.java
new file mode 100644
index 0000000..8f794c4
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteFields.java
@@ -0,0 +1,272 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.markup.html.form;
+
+/**
+ * Auto completion personal data according to the whatwg specification.
+ * 
+ * @author Tobias Soloschenko
+ *
+ * @see <a href=
+ *      "https://html.spec.whatwg.org/multipage/forms.html">https://html.spec.whatwg.org/multipage/forms.html</a>
+ * 
+ */
+public enum AutoCompleteFields {
+
+	/**
+	 * Simply turns on the auto completion
+	 */
+	ON("on"),
+
+	/**
+	 * Simply turns off the auto completion
+	 */
+	OFF("off"),
+
+	/**
+	 * Sir Timothy John Berners-Lee, OM, KBE, FRS, FREng, FRSA
+	 */
+	NAME("name"),
+
+	/**
+	 * Sir
+	 */
+	HONORIFIC_PREFIX("honorific-prefix"),
+
+	/**
+	 * Timothy
+	 */
+	GIVEN_NAME("given-name"),
+
+	/**
+	 * John
+	 */
+	ADDITIONAL_NAME("additional-name"),
+
+	/**
+	 * Berners-Lee
+	 */
+	FAMILY_NAME("family-name"),
+
+	/**
+	 * OM, KBE, FRS, FREng, FRSA
+	 */
+	HONORIFIC_SUFFIX("honorific-suffix"),
+
+	/**
+	 * Tim
+	 */
+	NICKNAME("nickname"),
+
+	/**
+	 * timbl
+	 */
+	USERNAME("username"),
+
+	/**
+	 * GUMFXbadyrS3
+	 */
+	NEW_PASSWORD("new-password"),
+
+	/**
+	 * qwerty
+	 */
+	CURRENT_PASSWORD("current-password"),
+
+	/**
+	 * Professor
+	 */
+	ORGANIZATION_TITLE("organization-title"),
+
+	/**
+	 * World Wide Web Consortium
+	 */
+	ORGANIZATION("organization"),
+
+	/**
+	 * Multiple lines 32 Vassar Street MIT Room 32-G524
+	 */
+	STREET_ADDRESS("street-address"),
+
+	/**
+	 * 32 Vassar Street
+	 */
+	ADDRESS_LINE1("address-line1"),
+
+	/**
+	 * MIT Room 32-G524
+	 */
+	ADDRESS_LINE2("address-line2"),
+
+	/**
+	 * See {@link AutoComplete.ADRESS_LINE2}
+	 */
+	ADDRESS_LINE3("address-line3"),
+
+	/**
+	 * The most fine-grained administrative level, in addresses with four administrative levels
+	 */
+	ADDRESS_LEVEL4("address-level4"),
+
+	/**
+	 * The third administrative level, in addresses with three or more administrative levels
+	 */
+	ADDRESS_LEVEL3("address-level3"),
+
+	/**
+	 * Cambridge
+	 */
+	ADDRESS_LEVEL2("address-level2"),
+
+	/**
+	 * MA
+	 */
+	ADDRESS_LEVEL1("address-level1"),
+
+	/**
+	 * US
+	 */
+	COUNTRY("country"),
+
+	/**
+	 * US
+	 */
+	COUNTRY_NAME("country-name"),
+
+	/**
+	 * 02139
+	 */
+	POSTAL_CODE("postal-code"),
+
+	/**
+	 * Tim Berners-Lee
+	 */
+	CC_NAME("cc-name"),
+
+	/**
+	 * Tim
+	 */
+	CC_GIVEN_NAME("cc-given-name"),
+
+	/**
+	 * -
+	 */
+	CC_ADDITIONAL_NAME("cc-additional-name"),
+
+	/**
+	 * Berners-Lee
+	 */
+	CC_FAMILY_NAME("cc-family-name"),
+
+	/**
+	 * 4114360123456785
+	 */
+	CC_NUMBER("cc-number"),
+
+	/**
+	 * 2014-12
+	 */
+	CC_EXP("cc-exp"),
+
+	/**
+	 * 12
+	 */
+	CC_EXP_MONTH("cc-exp-month"),
+
+	/**
+	 * 2014
+	 */
+	CC_EXP_YEAR("cc-exp-year"),
+
+	/**
+	 * 419
+	 */
+	CC_CSC("cc-csc"),
+
+	/**
+	 * Visa
+	 */
+	CC_TYPE("cc-type"),
+
+	/**
+	 * GBP
+	 */
+	TRANSACTION_CURRENCY("transaction-currency"),
+
+	/**
+	 * 401.00
+	 */
+	TRANSACTION_AMOUNT("transaction-amount"),
+
+	/**
+	 * en
+	 */
+	LANGUAGE("language"),
+
+	/**
+	 * 1955-06-08
+	 */
+	BDAY("bday"),
+
+	/**
+	 * 8
+	 */
+	BDAY_DAY("bday-day"),
+
+	/**
+	 * 6
+	 */
+	BDAY_MONTH("bday-month"),
+
+	/**
+	 * 1955
+	 */
+	BDAY_YEAR("bday-year"),
+
+	/**
+	 * Male
+	 */
+	SEX("sex"),
+
+	/**
+	 * https://www.w3.org/People/Berners-Lee/
+	 */
+	URL("url"),
+
+	/**
+	 * https://www.w3.org/Press/Stock/Berners-Lee/2001-europaeum-eighth.jpg
+	 */
+	PHOTO("photo");
+
+	private String value;
+
+	private AutoCompleteFields(String value)
+	{
+		this.value = value;
+	}
+
+	/**
+	 * Gets the value of the auto completion
+	 * 
+	 * @return the value of the auto completion
+	 */
+	public String getValue()
+	{
+		return value;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
index e8b61e7..1d3284a 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
@@ -1352,6 +1352,14 @@ public class Form<T> extends WebMarkupContainer
 	}
 
 	/**
+	 * Gets the value of the autocomplete attribute. The default behavior is that it is turned off
+	 * @return AutoCompleteBuilder the builder to generate the autocomplete attribute information
+	 */
+	protected AutoCompleteBuilder getAutoCompleteBuilder(){
+		return AutoCompleteBuilder.init().empty();
+	}
+
+	/**
 	 * 
 	 * @see org.apache.wicket.Component#getStatelessHint()
 	 */
@@ -1633,6 +1641,12 @@ public class Form<T> extends WebMarkupContainer
 					setMultiPart(true);
 				}
 			}
+
+			// Auto completion support
+			String autocompleteValue = getAutoCompleteBuilder().toString();
+			if(!autocompleteValue.isEmpty()){
+				tag.put("autocomplete", autocompleteValue);
+			}
 		}
 		else
 		{

http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/TextField.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/TextField.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/TextField.java
index 81dc828..719560c 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/TextField.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/TextField.java
@@ -107,6 +107,12 @@ public class TextField<T> extends AbstractTextComponent<T>
 
 		tag.put("value", getValue());
 
+		// Auto completion support
+		String autocompleteValue = getAutoCompleteBuilder().toString();
+		if(!autocompleteValue.isEmpty()){
+			tag.put("autocomplete", autocompleteValue);
+		}
+
 		// Default handling for component tag
 		super.onComponentTag(tag);
 	}
@@ -121,4 +127,12 @@ public class TextField<T> extends AbstractTextComponent<T>
 	{
 		return null;
 	}
+
+	/**
+	 * Gets the value of the autocomplete attribute. The default behavior is that it is turned off
+	 * @return AutoCompleteBuilder the builder to generate the autocomplete attribute information
+	 */
+	protected AutoCompleteBuilder getAutoCompleteBuilder(){
+		return AutoCompleteBuilder.init().empty();
+	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormTest.java
index 05344a5..2ee420a 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormTest.java
@@ -53,6 +53,39 @@ public class FormTest extends WicketTestCase
 		};
 	}
 
+	/**
+	 * Test auto complete functionality
+	 */
+	@Test
+	public void testAutoComplete(){
+		class TestPage extends WebPage implements IMarkupResourceStreamProvider
+		{
+			boolean shouldFail, submit, error;
+
+			public TestPage()
+			{
+				add(new Form<Void>("form")
+				{
+					@Override
+					protected AutoCompleteBuilder getAutoCompleteBuilder()
+					{
+						return AutoCompleteBuilder.init().forAddressType(AutoCompleteAddressType.BILLING).forField(AutoCompleteFields.GIVEN_NAME);
+					}
+				});
+			}
+
+			@Override
+			public IResourceStream getMarkupResourceStream(final MarkupContainer container,
+				Class<?> containerClass)
+			{
+				return new StringResourceStream("<form wicket:id='form'></form>");
+			}
+		}
+		
+		TestPage testPage = new TestPage();
+		tester.startPage(testPage);
+		assertTrue(tester.getLastResponseAsString().contains("autocomplete=\"billing given-name\""));
+	}
 
 	/**
 	 * @throws Exception
@@ -115,6 +148,12 @@ public class FormTest extends WicketTestCase
 					{
 						error = true;
 					}
+					
+					@Override
+					protected AutoCompleteBuilder getAutoCompleteBuilder()
+					{
+						return AutoCompleteBuilder.init().forAddressType(AutoCompleteAddressType.BILLING).forField(AutoCompleteFields.GIVEN_NAME);
+					}
 				});
 			}
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/test/java/org/apache/wicket/markup/html/form/TextFieldTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/TextFieldTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/TextFieldTest.java
index 5af5917..2c215e5 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/TextFieldTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/TextFieldTest.java
@@ -36,7 +36,20 @@ import org.junit.Test;
  */
 public class TextFieldTest extends WicketTestCase
 {
-	/** */
+	
+	/**
+	 * Test auto complete feature
+	 */
+	@Test
+	public void testAutoComplete(){
+		TestPage testPage = new TestPage();
+		tester.startPage(testPage);
+		assertTrue(tester.getLastResponseAsString().contains("autocomplete=\"section-blue billing name\""));
+	}
+
+	/** 
+	 * Test that inputs are converted to null 
+	 * */
 	@Test
 	public void emptyInputConvertedToNull()
 	{
@@ -111,7 +124,13 @@ public class TextFieldTest extends WicketTestCase
 		public TestPage()
 		{
 			add(form = new Form<>("form"));
-			form.add(textField = new TextField<>("text", textModel));
+			form.add(textField = new TextField<String>("text", textModel){
+				@Override
+				protected AutoCompleteBuilder getAutoCompleteBuilder()
+				{
+					return AutoCompleteBuilder.init().withSection("blue").forAddressType(AutoCompleteAddressType.BILLING).forField(AutoCompleteFields.NAME);
+				}
+			});
 		}
 
 		@Override


Re: wicket git commit: WICKET-6299

Posted by Tobias Soloschenko <to...@googlemail.com>.
Hi Sven,

yes the return type was wrong - I simply changed the interface structure 
a bit and it was just working - the return type of the method has to be 
the same like the filter interface which shrinks down the method options.

Anyway as you and Martin mentioned it would be better to use a behavior 
so I reverted the commit.

kind regards

Tobias

Am 21.12.16 um 15:56 schrieb Sven Meier:
> Hi Tobias,
>
>> try it out - you can set a contact detail without a contact. If you 
>> set a contact there has to be a contact detail next to it.
>
> I have tried it - all the following example do not fit the return type:
>
>     @Override
>     protected AutoCompleteBuilder getAutoCompleteBuilder()
>     {
>         return 
> AutoCompleteBuilder.init().forContact(AutoCompleteContact.HOME);
>     }
>
>     @Override
>     protected AutoCompleteBuilder getAutoCompleteBuilder()
>     {
>         return 
> AutoCompleteBuilder.init().forContact(AutoCompleteContact.HOME).forField(AutoCompleteContactDetails.TEL);
>     }
>
>     @Override
>     protected AutoCompleteBuilder getAutoCompleteBuilder()
>     {
>         return 
> AutoCompleteBuilder.init().forField(AutoCompleteContactDetails.TEL);
>     }
>
> Regards
> Sven
>
>
>
> On 21.12.2016 10:06, Tobias Soloschenko wrote:
>> Hi Sven,
>>
>> - try it out - you can set a contact detail without a contact. If you 
>> set a contact there has to be a contact detail next to it.
>>
>> - Yes the compile error is not ok - I have to restructure it a bit.
>>
>> - The advantage of the implementation should be:
>> * You don't have to search for the field names - just use the enums
>> * Fields are applied in the right order (if not the autofill is not 
>> working) - see the standard
>> * You can refactor it with java utils
>>
>> kind regards
>>
>> Tobias
>>
>>> Am 21.12.2016 um 09:42 schrieb Sven Meier <sv...@meiers.net>:
>>>
>>> Hi,
>>>
>>> your builder is wrong :P
>>>
>>> - It allows setting a contact detail field without contact:
>>>
>>> AutoCompleteBuilder.init().forField(AutoCompleteContactDetails.TEL);
>>>
>>> - AutoCompleteContactBuilder#forField() has the wrong return type:
>>>
>>>   // does not compile since AutoCompleteContactBuilder is no 
>>> AutoCompleteBuilder
>>>   return 
>>> AutoCompleteBuilder.init().forContact(AutoCompleteContact.HOME).forField(AutoCompleteContactDetails.TEL);
>>>
>>> Tbh I find it over the top to add an API to build a string defined 
>>> in a "living standard".
>>>
>>> When I read whatwg correctly, the "autocomplete" attribute can be 
>>> used on hidden input, textarea and select too.
>>> Instead of adding factory methods all over the place, I'd rather 
>>> have a behavior for this. We could move it to extensions, freeing 
>>> org.apache.wicket.markup.html.form from 6 new source files.
>>>
>>> Regards
>>> Sven
>>>
>>>
>>>> On 20.12.2016 20:19, tsoloschenko@apache.org wrote:
>>>> Repository: wicket
>>>> Updated Branches:
>>>>    refs/heads/master aedb98764 -> bcd55813b
>>>>
>>>>
>>>> WICKET-6299
>>>>
>>>> Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
>>>> Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/bcd55813
>>>> Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/bcd55813
>>>> Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/bcd55813
>>>>
>>>> Branch: refs/heads/master
>>>> Commit: bcd55813b3afbccb5675096930aee6281c5cba3a
>>>> Parents: aedb987
>>>> Author: Tobias Soloschenko <ts...@apache.org>
>>>> Authored: Tue Dec 20 20:15:42 2016 +0100
>>>> Committer: Tobias Soloschenko <ts...@apache.org>
>>>> Committed: Tue Dec 20 20:15:42 2016 +0100
>>>>
>>>> ----------------------------------------------------------------------
>>>>   .../html/form/AutoCompleteAddressType.java      |  56 ++++
>>>>   .../markup/html/form/AutoCompleteBuilder.java   | 170 ++++++++++++
>>>>   .../markup/html/form/AutoCompleteContact.java   |  77 ++++++
>>>>   .../html/form/AutoCompleteContactBuilder.java   |  38 +++
>>>>   .../html/form/AutoCompleteContactDetails.java   | 102 +++++++
>>>>   .../markup/html/form/AutoCompleteFields.java    | 272 
>>>> +++++++++++++++++++
>>>>   .../apache/wicket/markup/html/form/Form.java    |  14 +
>>>>   .../wicket/markup/html/form/TextField.java      |  14 +
>>>>   .../wicket/markup/html/form/FormTest.java       |  39 +++
>>>>   .../wicket/markup/html/form/TextFieldTest.java  |  23 +-
>>>>   10 files changed, 803 insertions(+), 2 deletions(-)
>>>> ----------------------------------------------------------------------
>>>>
>>>>
>>>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteAddressType.java 
>>>>
>>>> ----------------------------------------------------------------------
>>>> diff --git 
>>>> a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteAddressType.java 
>>>> b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteAddressType.java 
>>>>
>>>> new file mode 100644
>>>> index 0000000..6123053
>>>> --- /dev/null
>>>> +++ 
>>>> b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteAddressType.java
>>>> @@ -0,0 +1,56 @@
>>>> +/*
>>>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>>>> + * contributor license agreements.  See the NOTICE file 
>>>> distributed with
>>>> + * this work for additional information regarding copyright 
>>>> ownership.
>>>> + * The ASF licenses this file to You under the Apache License, 
>>>> Version 2.0
>>>> + * (the "License"); you may not use this file except in compliance 
>>>> with
>>>> + * the License.  You may obtain a copy of the License at
>>>> + *
>>>> + *      http://www.apache.org/licenses/LICENSE-2.0
>>>> + *
>>>> + * Unless required by applicable law or agreed to in writing, 
>>>> software
>>>> + * distributed under the License is distributed on an "AS IS" BASIS,
>>>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 
>>>> implied.
>>>> + * See the License for the specific language governing permissions 
>>>> and
>>>> + * limitations under the License.
>>>> + */
>>>> +package org.apache.wicket.markup.html.form;
>>>> +
>>>> +/**
>>>> + * Auto completion address type according to the whatwg 
>>>> specification.
>>>> + *
>>>> + * @author Tobias Soloschenko
>>>> + *
>>>> + * @see <a href=
>>>> + * 
>>>> "https://html.spec.whatwg.org/multipage/forms.html">https://html.spec.whatwg.org/multipage/forms.html</a>
>>>> + *
>>>> + */
>>>> +public enum AutoCompleteAddressType {
>>>> +
>>>> +    /**
>>>> +     * Meaning the field is part of the shipping address or 
>>>> contact information
>>>> +     */
>>>> +    SHIPPING("shipping"),
>>>> +
>>>> +    /**
>>>> +     * meaning the field is part of the billing address or contact 
>>>> information
>>>> +     */
>>>> +    BILLING("billing");
>>>> +
>>>> +    private String value;
>>>> +
>>>> +    private AutoCompleteAddressType(String value)
>>>> +    {
>>>> +        this.value = value;
>>>> +    }
>>>> +
>>>> +    /**
>>>> +     * Gets the address type value
>>>> +     *
>>>> +     * @return the value of the address type
>>>> +     */
>>>> +    public String getValue()
>>>> +    {
>>>> +        return value;
>>>> +    }
>>>> +}
>>>>
>>>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteBuilder.java 
>>>>
>>>> ----------------------------------------------------------------------
>>>> diff --git 
>>>> a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteBuilder.java 
>>>> b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteBuilder.java 
>>>>
>>>> new file mode 100644
>>>> index 0000000..a3b64cd
>>>> --- /dev/null
>>>> +++ 
>>>> b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteBuilder.java
>>>> @@ -0,0 +1,170 @@
>>>> +/*
>>>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>>>> + * contributor license agreements.  See the NOTICE file 
>>>> distributed with
>>>> + * this work for additional information regarding copyright 
>>>> ownership.
>>>> + * The ASF licenses this file to You under the Apache License, 
>>>> Version 2.0
>>>> + * (the "License"); you may not use this file except in compliance 
>>>> with
>>>> + * the License.  You may obtain a copy of the License at
>>>> + *
>>>> + *      http://www.apache.org/licenses/LICENSE-2.0
>>>> + *
>>>> + * Unless required by applicable law or agreed to in writing, 
>>>> software
>>>> + * distributed under the License is distributed on an "AS IS" BASIS,
>>>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 
>>>> implied.
>>>> + * See the License for the specific language governing permissions 
>>>> and
>>>> + * limitations under the License.
>>>> + */
>>>> +package org.apache.wicket.markup.html.form;
>>>> +
>>>> +/**
>>>> + * The auto complete builder is used to build the corresponding 
>>>> attribute for form and input tags.
>>>> + * To use the auto completion just open the autofill options 
>>>> within your browser. In chrome for
>>>> + * example it is accessed with the following URL:
>>>> + * <a 
>>>> href="chrome://settings/autofillEditAddress">chrome://settings/autofillEditAddress</a>
>>>> + *
>>>> + * @author Tobias Soloschenko
>>>> + *
>>>> + * @since 8.0.0
>>>> + *
>>>> + */
>>>> +public class AutoCompleteBuilder implements 
>>>> AutoCompleteContactBuilder
>>>> +{
>>>> +    /**
>>>> +     * The section prefix specificed by the whatwg standard
>>>> +     */
>>>> +    public static final String SECTION_PREFIX = "section-";
>>>> +
>>>> +    private String sectionName;
>>>> +
>>>> +    private AutoCompleteAddressType addressType;
>>>> +
>>>> +    private AutoCompleteFields field;
>>>> +
>>>> +    private AutoCompleteContact contact;
>>>> +
>>>> +    private AutoCompleteContactDetails contactDetail;
>>>> +
>>>> +    private boolean empty;
>>>> +
>>>> +    /**
>>>> +     * Initializes a new auto complete builder
>>>> +     *
>>>> +     * @return the auto complete builder
>>>> +     */
>>>> +    public static AutoCompleteBuilder init()
>>>> +    {
>>>> +        return new AutoCompleteBuilder();
>>>> +    }
>>>> +
>>>> +    /**
>>>> +     * Empties out the autocomplete outcome
>>>> +     *
>>>> +     * @return the auto complete builder
>>>> +     */
>>>> +    public AutoCompleteBuilder empty()
>>>> +    {
>>>> +        this.empty = true;
>>>> +        return this;
>>>> +    }
>>>> +
>>>> +    /**
>>>> +     * Applies a section to the auto completion field
>>>> +     *
>>>> +     * @param sectionName
>>>> +     *            the name of the section
>>>> +     * @return the auto complete builder itself
>>>> +     */
>>>> +    public AutoCompleteBuilder withSection(String sectionName)
>>>> +    {
>>>> +        this.sectionName = sectionName;
>>>> +        return this;
>>>> +    }
>>>> +
>>>> +    /**
>>>> +     * Assigns the auto completion to a specific address type
>>>> +     *
>>>> +     * @param addressType
>>>> +     *            the auto completion address type
>>>> +     * @return the auto complete builder itself
>>>> +     */
>>>> +    public AutoCompleteBuilder 
>>>> forAddressType(AutoCompleteAddressType addressType)
>>>> +    {
>>>> +        this.addressType = addressType;
>>>> +        return this;
>>>> +    }
>>>> +
>>>> +    /**
>>>> +     * Applies the field to the autocomplete attribute
>>>> +     *
>>>> +     * @param field
>>>> +     *            the field
>>>> +     * @return the auto complete builder
>>>> +     */
>>>> +    public AutoCompleteBuilder forField(AutoCompleteFields field)
>>>> +    {
>>>> +        this.field = field;
>>>> +        return this;
>>>> +    }
>>>> +
>>>> +    /**
>>>> +     * Applies the contact information to the autocomplete attribute
>>>> +     *
>>>> +     * @param contact
>>>> +     *            the contact information are going to be applied to
>>>> +     * @return the auto complete builder
>>>> +     */
>>>> +    public AutoCompleteContactBuilder 
>>>> forContact(AutoCompleteContact contact)
>>>> +    {
>>>> +        this.contact = contact;
>>>> +        return this;
>>>> +    }
>>>> +
>>>> +    /**
>>>> +     * @see {@link AutoCompleteContactBuilder}
>>>> +     */
>>>> +    @Override
>>>> +    public AutoCompleteContactBuilder 
>>>> forField(AutoCompleteContactDetails contactDetail)
>>>> +    {
>>>> +        this.contactDetail = contactDetail;
>>>> +        return (AutoCompleteContactBuilder)this;
>>>> +    }
>>>> +
>>>> +    /**
>>>> +     * Builds the attribute string
>>>> +     *
>>>> +     * @return the attribute content in the right order
>>>> +     */
>>>> +    @Override
>>>> +    public String toString()
>>>> +    {
>>>> +        StringBuilder stringBuilder = new StringBuilder();
>>>> +        if (!empty)
>>>> +        {
>>>> +            if (sectionName != null)
>>>> +            {
>>>> +                stringBuilder.append(SECTION_PREFIX);
>>>> +                stringBuilder.append(sectionName);
>>>> +                stringBuilder.append(" ");
>>>> +            }
>>>> +            if (addressType != null)
>>>> +            {
>>>> + stringBuilder.append(addressType.getValue());
>>>> +                stringBuilder.append(" ");
>>>> +            }
>>>> +            if (field != null)
>>>> +            {
>>>> +                stringBuilder.append(field.getValue());
>>>> +            }
>>>> +            else
>>>> +            {
>>>> +                if (contact != null)
>>>> +                {
>>>> + stringBuilder.append(contact.getValue());
>>>> +                    stringBuilder.append(" ");
>>>> +                }
>>>> + stringBuilder.append(contactDetail.getValue());
>>>> +            }
>>>> +        }
>>>> +        return stringBuilder.toString();
>>>> +    }
>>>> +}
>>>>
>>>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContact.java 
>>>>
>>>> ----------------------------------------------------------------------
>>>> diff --git 
>>>> a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContact.java 
>>>> b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContact.java 
>>>>
>>>> new file mode 100644
>>>> index 0000000..cbf86a5
>>>> --- /dev/null
>>>> +++ 
>>>> b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContact.java
>>>> @@ -0,0 +1,77 @@
>>>> +/*
>>>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>>>> + * contributor license agreements.  See the NOTICE file 
>>>> distributed with
>>>> + * this work for additional information regarding copyright 
>>>> ownership.
>>>> + * The ASF licenses this file to You under the Apache License, 
>>>> Version 2.0
>>>> + * (the "License"); you may not use this file except in compliance 
>>>> with
>>>> + * the License.  You may obtain a copy of the License at
>>>> + *
>>>> + *      http://www.apache.org/licenses/LICENSE-2.0
>>>> + *
>>>> + * Unless required by applicable law or agreed to in writing, 
>>>> software
>>>> + * distributed under the License is distributed on an "AS IS" BASIS,
>>>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 
>>>> implied.
>>>> + * See the License for the specific language governing permissions 
>>>> and
>>>> + * limitations under the License.
>>>> + */
>>>> +package org.apache.wicket.markup.html.form;
>>>> +
>>>> +/**
>>>> + * Auto completion contact according to the whatwg specification.
>>>> + *
>>>> + * @author Tobias Soloschenko
>>>> + *
>>>> + * @see <a href=
>>>> + * 
>>>> "https://html.spec.whatwg.org/multipage/forms.html">https://html.spec.whatwg.org/multipage/forms.html</a>
>>>> + *
>>>> + */
>>>> +public enum AutoCompleteContact {
>>>> +
>>>> +    /**
>>>> +     * meaning the field is for contacting someone at their residence
>>>> +     */
>>>> +    HOME("home"),
>>>> +
>>>> +    /**
>>>> +     * meaning the field is for contacting someone at their workplace
>>>> +     */
>>>> +    WORK("work"),
>>>> +
>>>> +    /**
>>>> +     * meaning the field is for contacting someone regardless of 
>>>> location
>>>> +     */
>>>> +    MOBILE("mobile"),
>>>> +
>>>> +    /**
>>>> +     * meaning the field describes a fax machine's contact details
>>>> +     */
>>>> +    FAX("fax"),
>>>> +
>>>> +    /**
>>>> +     * meaning the field describes a pager's or beeper's contact 
>>>> details
>>>> +     */
>>>> +    PAGER("pager");
>>>> +
>>>> +    private String value;
>>>> +
>>>> +    /**
>>>> +     * Creates an auto completion contact with the given value
>>>> +     *
>>>> +     * @param value
>>>> +     *            the value of the contact
>>>> +     */
>>>> +    private AutoCompleteContact(String value)
>>>> +    {
>>>> +        this.value = value;
>>>> +    }
>>>> +
>>>> +    /**
>>>> +     * Gets the value of the auto completion contact
>>>> +     *
>>>> +     * @return the value of the auto completion contact
>>>> +     */
>>>> +    public String getValue()
>>>> +    {
>>>> +        return value;
>>>> +    }
>>>> +}
>>>>
>>>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactBuilder.java 
>>>>
>>>> ----------------------------------------------------------------------
>>>> diff --git 
>>>> a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactBuilder.java 
>>>> b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactBuilder.java 
>>>>
>>>> new file mode 100644
>>>> index 0000000..07324ff
>>>> --- /dev/null
>>>> +++ 
>>>> b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactBuilder.java
>>>> @@ -0,0 +1,38 @@
>>>> +/*
>>>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>>>> + * contributor license agreements.  See the NOTICE file 
>>>> distributed with
>>>> + * this work for additional information regarding copyright 
>>>> ownership.
>>>> + * The ASF licenses this file to You under the Apache License, 
>>>> Version 2.0
>>>> + * (the "License"); you may not use this file except in compliance 
>>>> with
>>>> + * the License.  You may obtain a copy of the License at
>>>> + *
>>>> + *      http://www.apache.org/licenses/LICENSE-2.0
>>>> + *
>>>> + * Unless required by applicable law or agreed to in writing, 
>>>> software
>>>> + * distributed under the License is distributed on an "AS IS" BASIS,
>>>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 
>>>> implied.
>>>> + * See the License for the specific language governing permissions 
>>>> and
>>>> + * limitations under the License.
>>>> + */
>>>> +package org.apache.wicket.markup.html.form;
>>>> +
>>>> +/**
>>>> + * The auto complete contact builder shrinks down the 
>>>> possibilities to the contact details
>>>> + *
>>>> + * @author Tobias Soloschenko
>>>> + *
>>>> + * @since 8.0.0
>>>> + *
>>>> + */
>>>> +public interface AutoCompleteContactBuilder
>>>> +{
>>>> +    /**
>>>> +     * Applies the contact details information to the auto 
>>>> complete field
>>>> +     *
>>>> +     * @param contactDetail
>>>> +     *            the contact detail
>>>> +     * @return the auto complete builder contact
>>>> +     */
>>>> +    AutoCompleteContactBuilder forField(AutoCompleteContactDetails 
>>>> contactDetail);
>>>> +
>>>> +}
>>>>
>>>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactDetails.java 
>>>>
>>>> ----------------------------------------------------------------------
>>>> diff --git 
>>>> a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactDetails.java 
>>>> b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactDetails.java 
>>>>
>>>> new file mode 100644
>>>> index 0000000..e4d5e44
>>>> --- /dev/null
>>>> +++ 
>>>> b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactDetails.java
>>>> @@ -0,0 +1,102 @@
>>>> +/*
>>>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>>>> + * contributor license agreements.  See the NOTICE file 
>>>> distributed with
>>>> + * this work for additional information regarding copyright 
>>>> ownership.
>>>> + * The ASF licenses this file to You under the Apache License, 
>>>> Version 2.0
>>>> + * (the "License"); you may not use this file except in compliance 
>>>> with
>>>> + * the License.  You may obtain a copy of the License at
>>>> + *
>>>> + *      http://www.apache.org/licenses/LICENSE-2.0
>>>> + *
>>>> + * Unless required by applicable law or agreed to in writing, 
>>>> software
>>>> + * distributed under the License is distributed on an "AS IS" BASIS,
>>>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 
>>>> implied.
>>>> + * See the License for the specific language governing permissions 
>>>> and
>>>> + * limitations under the License.
>>>> + */
>>>> +package org.apache.wicket.markup.html.form;
>>>> +
>>>> +/**
>>>> + * Auto completion contact detail according to the whatwg 
>>>> specification.
>>>> + *
>>>> + * @author Tobias Soloschenko
>>>> + *
>>>> + * @see <a href=
>>>> + * 
>>>> "https://html.spec.whatwg.org/multipage/forms.html">https://html.spec.whatwg.org/multipage/forms.html</a>
>>>> + *
>>>> + */
>>>> +public enum AutoCompleteContactDetails {
>>>> +
>>>> +    /**
>>>> +     * +1 617 253 5702
>>>> +     */
>>>> +    TEL("tel"),
>>>> +
>>>> +    /**
>>>> +     * +1
>>>> +     */
>>>> +    TEL_COUNTRY_CODE("tel-country-code"),
>>>> +
>>>> +    /**
>>>> +     * 617 253 5702
>>>> +     */
>>>> +    TEL_NATIONAL("tel-national"),
>>>> +
>>>> +    /**
>>>> +     * 617
>>>> +     */
>>>> +    TEL_AREA_CODE("tel-area-code"),
>>>> +
>>>> +    /**
>>>> +     * 2535702
>>>> +     */
>>>> +    TEL_LOCAL("tel-local"),
>>>> +
>>>> +    /**
>>>> +     * 253
>>>> +     */
>>>> +    TEL_LOCAL_PREFIX("tel-local-prefix"),
>>>> +
>>>> +    /**
>>>> +     * 5702
>>>> +     */
>>>> +    TEL_LOCAL_SUFFIX("tel-local-suffix"),
>>>> +
>>>> +    /**
>>>> +     * 1000
>>>> +     */
>>>> +    TEL_EXTENSION("tel-extension"),
>>>> +
>>>> +    /**
>>>> +     * timbl@w3.org
>>>> +     */
>>>> +    EMAIL("email"),
>>>> +
>>>> +    /**
>>>> +     * irc://example.org/timbl,isuser
>>>> +     */
>>>> +    IMPP("impp");
>>>> +
>>>> +    private String value;
>>>> +
>>>> +    /**
>>>> +     * Creates an auto completion contact detail with the given value
>>>> +     *
>>>> +     * @param value
>>>> +     *            the value of the contact detail
>>>> +     */
>>>> +    private AutoCompleteContactDetails(String value)
>>>> +    {
>>>> +        this.value = value;
>>>> +    }
>>>> +
>>>> +    /**
>>>> +     * Gets the value of the auto completion contact detail
>>>> +     *
>>>> +     * @return the value of the auto completion contact detail
>>>> +     */
>>>> +    public String getValue()
>>>> +    {
>>>> +        return value;
>>>> +    }
>>>> +}
>>>>
>>>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteFields.java 
>>>>
>>>> ----------------------------------------------------------------------
>>>> diff --git 
>>>> a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteFields.java 
>>>> b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteFields.java 
>>>>
>>>> new file mode 100644
>>>> index 0000000..8f794c4
>>>> --- /dev/null
>>>> +++ 
>>>> b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteFields.java
>>>> @@ -0,0 +1,272 @@
>>>> +/*
>>>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>>>> + * contributor license agreements.  See the NOTICE file 
>>>> distributed with
>>>> + * this work for additional information regarding copyright 
>>>> ownership.
>>>> + * The ASF licenses this file to You under the Apache License, 
>>>> Version 2.0
>>>> + * (the "License"); you may not use this file except in compliance 
>>>> with
>>>> + * the License.  You may obtain a copy of the License at
>>>> + *
>>>> + *      http://www.apache.org/licenses/LICENSE-2.0
>>>> + *
>>>> + * Unless required by applicable law or agreed to in writing, 
>>>> software
>>>> + * distributed under the License is distributed on an "AS IS" BASIS,
>>>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 
>>>> implied.
>>>> + * See the License for the specific language governing permissions 
>>>> and
>>>> + * limitations under the License.
>>>> + */
>>>> +package org.apache.wicket.markup.html.form;
>>>> +
>>>> +/**
>>>> + * Auto completion personal data according to the whatwg 
>>>> specification.
>>>> + *
>>>> + * @author Tobias Soloschenko
>>>> + *
>>>> + * @see <a href=
>>>> + * 
>>>> "https://html.spec.whatwg.org/multipage/forms.html">https://html.spec.whatwg.org/multipage/forms.html</a>
>>>> + *
>>>> + */
>>>> +public enum AutoCompleteFields {
>>>> +
>>>> +    /**
>>>> +     * Simply turns on the auto completion
>>>> +     */
>>>> +    ON("on"),
>>>> +
>>>> +    /**
>>>> +     * Simply turns off the auto completion
>>>> +     */
>>>> +    OFF("off"),
>>>> +
>>>> +    /**
>>>> +     * Sir Timothy John Berners-Lee, OM, KBE, FRS, FREng, FRSA
>>>> +     */
>>>> +    NAME("name"),
>>>> +
>>>> +    /**
>>>> +     * Sir
>>>> +     */
>>>> +    HONORIFIC_PREFIX("honorific-prefix"),
>>>> +
>>>> +    /**
>>>> +     * Timothy
>>>> +     */
>>>> +    GIVEN_NAME("given-name"),
>>>> +
>>>> +    /**
>>>> +     * John
>>>> +     */
>>>> +    ADDITIONAL_NAME("additional-name"),
>>>> +
>>>> +    /**
>>>> +     * Berners-Lee
>>>> +     */
>>>> +    FAMILY_NAME("family-name"),
>>>> +
>>>> +    /**
>>>> +     * OM, KBE, FRS, FREng, FRSA
>>>> +     */
>>>> +    HONORIFIC_SUFFIX("honorific-suffix"),
>>>> +
>>>> +    /**
>>>> +     * Tim
>>>> +     */
>>>> +    NICKNAME("nickname"),
>>>> +
>>>> +    /**
>>>> +     * timbl
>>>> +     */
>>>> +    USERNAME("username"),
>>>> +
>>>> +    /**
>>>> +     * GUMFXbadyrS3
>>>> +     */
>>>> +    NEW_PASSWORD("new-password"),
>>>> +
>>>> +    /**
>>>> +     * qwerty
>>>> +     */
>>>> +    CURRENT_PASSWORD("current-password"),
>>>> +
>>>> +    /**
>>>> +     * Professor
>>>> +     */
>>>> +    ORGANIZATION_TITLE("organization-title"),
>>>> +
>>>> +    /**
>>>> +     * World Wide Web Consortium
>>>> +     */
>>>> +    ORGANIZATION("organization"),
>>>> +
>>>> +    /**
>>>> +     * Multiple lines 32 Vassar Street MIT Room 32-G524
>>>> +     */
>>>> +    STREET_ADDRESS("street-address"),
>>>> +
>>>> +    /**
>>>> +     * 32 Vassar Street
>>>> +     */
>>>> +    ADDRESS_LINE1("address-line1"),
>>>> +
>>>> +    /**
>>>> +     * MIT Room 32-G524
>>>> +     */
>>>> +    ADDRESS_LINE2("address-line2"),
>>>> +
>>>> +    /**
>>>> +     * See {@link AutoComplete.ADRESS_LINE2}
>>>> +     */
>>>> +    ADDRESS_LINE3("address-line3"),
>>>> +
>>>> +    /**
>>>> +     * The most fine-grained administrative level, in addresses 
>>>> with four administrative levels
>>>> +     */
>>>> +    ADDRESS_LEVEL4("address-level4"),
>>>> +
>>>> +    /**
>>>> +     * The third administrative level, in addresses with three or 
>>>> more administrative levels
>>>> +     */
>>>> +    ADDRESS_LEVEL3("address-level3"),
>>>> +
>>>> +    /**
>>>> +     * Cambridge
>>>> +     */
>>>> +    ADDRESS_LEVEL2("address-level2"),
>>>> +
>>>> +    /**
>>>> +     * MA
>>>> +     */
>>>> +    ADDRESS_LEVEL1("address-level1"),
>>>> +
>>>> +    /**
>>>> +     * US
>>>> +     */
>>>> +    COUNTRY("country"),
>>>> +
>>>> +    /**
>>>> +     * US
>>>> +     */
>>>> +    COUNTRY_NAME("country-name"),
>>>> +
>>>> +    /**
>>>> +     * 02139
>>>> +     */
>>>> +    POSTAL_CODE("postal-code"),
>>>> +
>>>> +    /**
>>>> +     * Tim Berners-Lee
>>>> +     */
>>>> +    CC_NAME("cc-name"),
>>>> +
>>>> +    /**
>>>> +     * Tim
>>>> +     */
>>>> +    CC_GIVEN_NAME("cc-given-name"),
>>>> +
>>>> +    /**
>>>> +     * -
>>>> +     */
>>>> +    CC_ADDITIONAL_NAME("cc-additional-name"),
>>>> +
>>>> +    /**
>>>> +     * Berners-Lee
>>>> +     */
>>>> +    CC_FAMILY_NAME("cc-family-name"),
>>>> +
>>>> +    /**
>>>> +     * 4114360123456785
>>>> +     */
>>>> +    CC_NUMBER("cc-number"),
>>>> +
>>>> +    /**
>>>> +     * 2014-12
>>>> +     */
>>>> +    CC_EXP("cc-exp"),
>>>> +
>>>> +    /**
>>>> +     * 12
>>>> +     */
>>>> +    CC_EXP_MONTH("cc-exp-month"),
>>>> +
>>>> +    /**
>>>> +     * 2014
>>>> +     */
>>>> +    CC_EXP_YEAR("cc-exp-year"),
>>>> +
>>>> +    /**
>>>> +     * 419
>>>> +     */
>>>> +    CC_CSC("cc-csc"),
>>>> +
>>>> +    /**
>>>> +     * Visa
>>>> +     */
>>>> +    CC_TYPE("cc-type"),
>>>> +
>>>> +    /**
>>>> +     * GBP
>>>> +     */
>>>> +    TRANSACTION_CURRENCY("transaction-currency"),
>>>> +
>>>> +    /**
>>>> +     * 401.00
>>>> +     */
>>>> +    TRANSACTION_AMOUNT("transaction-amount"),
>>>> +
>>>> +    /**
>>>> +     * en
>>>> +     */
>>>> +    LANGUAGE("language"),
>>>> +
>>>> +    /**
>>>> +     * 1955-06-08
>>>> +     */
>>>> +    BDAY("bday"),
>>>> +
>>>> +    /**
>>>> +     * 8
>>>> +     */
>>>> +    BDAY_DAY("bday-day"),
>>>> +
>>>> +    /**
>>>> +     * 6
>>>> +     */
>>>> +    BDAY_MONTH("bday-month"),
>>>> +
>>>> +    /**
>>>> +     * 1955
>>>> +     */
>>>> +    BDAY_YEAR("bday-year"),
>>>> +
>>>> +    /**
>>>> +     * Male
>>>> +     */
>>>> +    SEX("sex"),
>>>> +
>>>> +    /**
>>>> +     * https://www.w3.org/People/Berners-Lee/
>>>> +     */
>>>> +    URL("url"),
>>>> +
>>>> +    /**
>>>> +     * 
>>>> https://www.w3.org/Press/Stock/Berners-Lee/2001-europaeum-eighth.jpg
>>>> +     */
>>>> +    PHOTO("photo");
>>>> +
>>>> +    private String value;
>>>> +
>>>> +    private AutoCompleteFields(String value)
>>>> +    {
>>>> +        this.value = value;
>>>> +    }
>>>> +
>>>> +    /**
>>>> +     * Gets the value of the auto completion
>>>> +     *
>>>> +     * @return the value of the auto completion
>>>> +     */
>>>> +    public String getValue()
>>>> +    {
>>>> +        return value;
>>>> +    }
>>>> +
>>>> +}
>>>>
>>>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java 
>>>>
>>>> ----------------------------------------------------------------------
>>>> diff --git 
>>>> a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java 
>>>> b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java 
>>>>
>>>> index e8b61e7..1d3284a 100644
>>>> --- 
>>>> a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java 
>>>>
>>>> +++ 
>>>> b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java 
>>>>
>>>> @@ -1352,6 +1352,14 @@ public class Form<T> extends WebMarkupContainer
>>>>       }
>>>>         /**
>>>> +     * Gets the value of the autocomplete attribute. The default 
>>>> behavior is that it is turned off
>>>> +     * @return AutoCompleteBuilder the builder to generate the 
>>>> autocomplete attribute information
>>>> +     */
>>>> +    protected AutoCompleteBuilder getAutoCompleteBuilder(){
>>>> +        return AutoCompleteBuilder.init().empty();
>>>> +    }
>>>> +
>>>> +    /**
>>>>        *
>>>>        * @see org.apache.wicket.Component#getStatelessHint()
>>>>        */
>>>> @@ -1633,6 +1641,12 @@ public class Form<T> extends WebMarkupContainer
>>>>                       setMultiPart(true);
>>>>                   }
>>>>               }
>>>> +
>>>> +            // Auto completion support
>>>> +            String autocompleteValue = 
>>>> getAutoCompleteBuilder().toString();
>>>> +            if(!autocompleteValue.isEmpty()){
>>>> +                tag.put("autocomplete", autocompleteValue);
>>>> +            }
>>>>           }
>>>>           else
>>>>           {
>>>>
>>>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/TextField.java 
>>>>
>>>> ----------------------------------------------------------------------
>>>> diff --git 
>>>> a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/TextField.java 
>>>> b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/TextField.java 
>>>>
>>>> index 81dc828..719560c 100644
>>>> --- 
>>>> a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/TextField.java
>>>> +++ 
>>>> b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/TextField.java
>>>> @@ -107,6 +107,12 @@ public class TextField<T> extends 
>>>> AbstractTextComponent<T>
>>>>             tag.put("value", getValue());
>>>>   +        // Auto completion support
>>>> +        String autocompleteValue = 
>>>> getAutoCompleteBuilder().toString();
>>>> +        if(!autocompleteValue.isEmpty()){
>>>> +            tag.put("autocomplete", autocompleteValue);
>>>> +        }
>>>> +
>>>>           // Default handling for component tag
>>>>           super.onComponentTag(tag);
>>>>       }
>>>> @@ -121,4 +127,12 @@ public class TextField<T> extends 
>>>> AbstractTextComponent<T>
>>>>       {
>>>>           return null;
>>>>       }
>>>> +
>>>> +    /**
>>>> +     * Gets the value of the autocomplete attribute. The default 
>>>> behavior is that it is turned off
>>>> +     * @return AutoCompleteBuilder the builder to generate the 
>>>> autocomplete attribute information
>>>> +     */
>>>> +    protected AutoCompleteBuilder getAutoCompleteBuilder(){
>>>> +        return AutoCompleteBuilder.init().empty();
>>>> +    }
>>>>   }
>>>>
>>>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormTest.java 
>>>>
>>>> ----------------------------------------------------------------------
>>>> diff --git 
>>>> a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormTest.java 
>>>> b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormTest.java 
>>>>
>>>> index 05344a5..2ee420a 100644
>>>> --- 
>>>> a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormTest.java
>>>> +++ 
>>>> b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormTest.java
>>>> @@ -53,6 +53,39 @@ public class FormTest extends WicketTestCase
>>>>           };
>>>>       }
>>>>   +    /**
>>>> +     * Test auto complete functionality
>>>> +     */
>>>> +    @Test
>>>> +    public void testAutoComplete(){
>>>> +        class TestPage extends WebPage implements 
>>>> IMarkupResourceStreamProvider
>>>> +        {
>>>> +            boolean shouldFail, submit, error;
>>>> +
>>>> +            public TestPage()
>>>> +            {
>>>> +                add(new Form<Void>("form")
>>>> +                {
>>>> +                    @Override
>>>> +                    protected AutoCompleteBuilder 
>>>> getAutoCompleteBuilder()
>>>> +                    {
>>>> +                        return 
>>>> AutoCompleteBuilder.init().forAddressType(AutoCompleteAddressType.BILLING).forField(AutoCompleteFields.GIVEN_NAME);
>>>> +                    }
>>>> +                });
>>>> +            }
>>>> +
>>>> +            @Override
>>>> +            public IResourceStream getMarkupResourceStream(final 
>>>> MarkupContainer container,
>>>> +                Class<?> containerClass)
>>>> +            {
>>>> +                return new StringResourceStream("<form 
>>>> wicket:id='form'></form>");
>>>> +            }
>>>> +        }
>>>> +
>>>> +        TestPage testPage = new TestPage();
>>>> +        tester.startPage(testPage);
>>>> + 
>>>> assertTrue(tester.getLastResponseAsString().contains("autocomplete=\"billing 
>>>> given-name\""));
>>>> +    }
>>>>         /**
>>>>        * @throws Exception
>>>> @@ -115,6 +148,12 @@ public class FormTest extends WicketTestCase
>>>>                       {
>>>>                           error = true;
>>>>                       }
>>>> +
>>>> +                    @Override
>>>> +                    protected AutoCompleteBuilder 
>>>> getAutoCompleteBuilder()
>>>> +                    {
>>>> +                        return 
>>>> AutoCompleteBuilder.init().forAddressType(AutoCompleteAddressType.BILLING).forField(AutoCompleteFields.GIVEN_NAME);
>>>> +                    }
>>>>                   });
>>>>               }
>>>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/test/java/org/apache/wicket/markup/html/form/TextFieldTest.java
>>>> ----------------------------------------------------------------------
>>>> diff --git 
>>>> a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/TextFieldTest.java 
>>>> b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/TextFieldTest.java 
>>>>
>>>> index 5af5917..2c215e5 100644
>>>> --- 
>>>> a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/TextFieldTest.java
>>>> +++ 
>>>> b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/TextFieldTest.java
>>>> @@ -36,7 +36,20 @@ import org.junit.Test;
>>>>    */
>>>>   public class TextFieldTest extends WicketTestCase
>>>>   {
>>>> -    /** */
>>>> +
>>>> +    /**
>>>> +     * Test auto complete feature
>>>> +     */
>>>> +    @Test
>>>> +    public void testAutoComplete(){
>>>> +        TestPage testPage = new TestPage();
>>>> +        tester.startPage(testPage);
>>>> + 
>>>> assertTrue(tester.getLastResponseAsString().contains("autocomplete=\"section-blue 
>>>> billing name\""));
>>>> +    }
>>>> +
>>>> +    /**
>>>> +     * Test that inputs are converted to null
>>>> +     * */
>>>>       @Test
>>>>       public void emptyInputConvertedToNull()
>>>>       {
>>>> @@ -111,7 +124,13 @@ public class TextFieldTest extends WicketTestCase
>>>>           public TestPage()
>>>>           {
>>>>               add(form = new Form<>("form"));
>>>> -            form.add(textField = new TextField<>("text", textModel));
>>>> +            form.add(textField = new TextField<String>("text", 
>>>> textModel){
>>>> +                @Override
>>>> +                protected AutoCompleteBuilder 
>>>> getAutoCompleteBuilder()
>>>> +                {
>>>> +                    return 
>>>> AutoCompleteBuilder.init().withSection("blue").forAddressType(AutoCompleteAddressType.BILLING).forField(AutoCompleteFields.NAME);
>>>> +                }
>>>> +            });
>>>>           }
>>>>             @Override
>>>>
>



Re: wicket git commit: WICKET-6299

Posted by Sven Meier <sv...@meiers.net>.
Hi Tobias,

> try it out - you can set a contact detail without a contact. If you set a contact there has to be a contact detail next to it.

I have tried it - all the following example do not fit the return type:

	@Override
	protected AutoCompleteBuilder getAutoCompleteBuilder()
	{
		return AutoCompleteBuilder.init().forContact(AutoCompleteContact.HOME);
	}

	@Override
	protected AutoCompleteBuilder getAutoCompleteBuilder()
	{
		return AutoCompleteBuilder.init().forContact(AutoCompleteContact.HOME).forField(AutoCompleteContactDetails.TEL);
	}

	@Override
	protected AutoCompleteBuilder getAutoCompleteBuilder()
	{
		return AutoCompleteBuilder.init().forField(AutoCompleteContactDetails.TEL);
	}

Regards
Sven
  


On 21.12.2016 10:06, Tobias Soloschenko wrote:
> Hi Sven,
>
> - try it out - you can set a contact detail without a contact. If you set a contact there has to be a contact detail next to it.
>
> - Yes the compile error is not ok - I have to restructure it a bit.
>
> - The advantage of the implementation should be:
> * You don't have to search for the field names - just use the enums
> * Fields are applied in the right order (if not the autofill is not working) - see the standard
> * You can refactor it with java utils
>
> kind regards
>
> Tobias
>
>> Am 21.12.2016 um 09:42 schrieb Sven Meier <sv...@meiers.net>:
>>
>> Hi,
>>
>> your builder is wrong :P
>>
>> - It allows setting a contact detail field without contact:
>>
>> AutoCompleteBuilder.init().forField(AutoCompleteContactDetails.TEL);
>>
>> - AutoCompleteContactBuilder#forField() has the wrong return type:
>>
>>   // does not compile since AutoCompleteContactBuilder is no AutoCompleteBuilder
>>   return AutoCompleteBuilder.init().forContact(AutoCompleteContact.HOME).forField(AutoCompleteContactDetails.TEL);
>>
>> Tbh I find it over the top to add an API to build a string defined in a "living standard".
>>
>> When I read whatwg correctly, the "autocomplete" attribute can be used on hidden input, textarea and select too.
>> Instead of adding factory methods all over the place, I'd rather have a behavior for this. We could move it to extensions, freeing org.apache.wicket.markup.html.form from 6 new source files.
>>
>> Regards
>> Sven
>>
>>
>>> On 20.12.2016 20:19, tsoloschenko@apache.org wrote:
>>> Repository: wicket
>>> Updated Branches:
>>>    refs/heads/master aedb98764 -> bcd55813b
>>>
>>>
>>> WICKET-6299
>>>
>>> Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
>>> Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/bcd55813
>>> Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/bcd55813
>>> Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/bcd55813
>>>
>>> Branch: refs/heads/master
>>> Commit: bcd55813b3afbccb5675096930aee6281c5cba3a
>>> Parents: aedb987
>>> Author: Tobias Soloschenko <ts...@apache.org>
>>> Authored: Tue Dec 20 20:15:42 2016 +0100
>>> Committer: Tobias Soloschenko <ts...@apache.org>
>>> Committed: Tue Dec 20 20:15:42 2016 +0100
>>>
>>> ----------------------------------------------------------------------
>>>   .../html/form/AutoCompleteAddressType.java      |  56 ++++
>>>   .../markup/html/form/AutoCompleteBuilder.java   | 170 ++++++++++++
>>>   .../markup/html/form/AutoCompleteContact.java   |  77 ++++++
>>>   .../html/form/AutoCompleteContactBuilder.java   |  38 +++
>>>   .../html/form/AutoCompleteContactDetails.java   | 102 +++++++
>>>   .../markup/html/form/AutoCompleteFields.java    | 272 +++++++++++++++++++
>>>   .../apache/wicket/markup/html/form/Form.java    |  14 +
>>>   .../wicket/markup/html/form/TextField.java      |  14 +
>>>   .../wicket/markup/html/form/FormTest.java       |  39 +++
>>>   .../wicket/markup/html/form/TextFieldTest.java  |  23 +-
>>>   10 files changed, 803 insertions(+), 2 deletions(-)
>>> ----------------------------------------------------------------------
>>>
>>>
>>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteAddressType.java
>>> ----------------------------------------------------------------------
>>> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteAddressType.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteAddressType.java
>>> new file mode 100644
>>> index 0000000..6123053
>>> --- /dev/null
>>> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteAddressType.java
>>> @@ -0,0 +1,56 @@
>>> +/*
>>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>>> + * contributor license agreements.  See the NOTICE file distributed with
>>> + * this work for additional information regarding copyright ownership.
>>> + * The ASF licenses this file to You under the Apache License, Version 2.0
>>> + * (the "License"); you may not use this file except in compliance with
>>> + * the License.  You may obtain a copy of the License at
>>> + *
>>> + *      http://www.apache.org/licenses/LICENSE-2.0
>>> + *
>>> + * Unless required by applicable law or agreed to in writing, software
>>> + * distributed under the License is distributed on an "AS IS" BASIS,
>>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>>> + * See the License for the specific language governing permissions and
>>> + * limitations under the License.
>>> + */
>>> +package org.apache.wicket.markup.html.form;
>>> +
>>> +/**
>>> + * Auto completion address type according to the whatwg specification.
>>> + *
>>> + * @author Tobias Soloschenko
>>> + *
>>> + * @see <a href=
>>> + *      "https://html.spec.whatwg.org/multipage/forms.html">https://html.spec.whatwg.org/multipage/forms.html</a>
>>> + *
>>> + */
>>> +public enum AutoCompleteAddressType {
>>> +
>>> +    /**
>>> +     * Meaning the field is part of the shipping address or contact information
>>> +     */
>>> +    SHIPPING("shipping"),
>>> +
>>> +    /**
>>> +     * meaning the field is part of the billing address or contact information
>>> +     */
>>> +    BILLING("billing");
>>> +
>>> +    private String value;
>>> +
>>> +    private AutoCompleteAddressType(String value)
>>> +    {
>>> +        this.value = value;
>>> +    }
>>> +
>>> +    /**
>>> +     * Gets the address type value
>>> +     *
>>> +     * @return the value of the address type
>>> +     */
>>> +    public String getValue()
>>> +    {
>>> +        return value;
>>> +    }
>>> +}
>>>
>>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteBuilder.java
>>> ----------------------------------------------------------------------
>>> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteBuilder.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteBuilder.java
>>> new file mode 100644
>>> index 0000000..a3b64cd
>>> --- /dev/null
>>> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteBuilder.java
>>> @@ -0,0 +1,170 @@
>>> +/*
>>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>>> + * contributor license agreements.  See the NOTICE file distributed with
>>> + * this work for additional information regarding copyright ownership.
>>> + * The ASF licenses this file to You under the Apache License, Version 2.0
>>> + * (the "License"); you may not use this file except in compliance with
>>> + * the License.  You may obtain a copy of the License at
>>> + *
>>> + *      http://www.apache.org/licenses/LICENSE-2.0
>>> + *
>>> + * Unless required by applicable law or agreed to in writing, software
>>> + * distributed under the License is distributed on an "AS IS" BASIS,
>>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>>> + * See the License for the specific language governing permissions and
>>> + * limitations under the License.
>>> + */
>>> +package org.apache.wicket.markup.html.form;
>>> +
>>> +/**
>>> + * The auto complete builder is used to build the corresponding attribute for form and input tags.
>>> + * To use the auto completion just open the autofill options within your browser. In chrome for
>>> + * example it is accessed with the following URL:
>>> + * <a href="chrome://settings/autofillEditAddress">chrome://settings/autofillEditAddress</a>
>>> + *
>>> + * @author Tobias Soloschenko
>>> + *
>>> + * @since 8.0.0
>>> + *
>>> + */
>>> +public class AutoCompleteBuilder implements AutoCompleteContactBuilder
>>> +{
>>> +    /**
>>> +     * The section prefix specificed by the whatwg standard
>>> +     */
>>> +    public static final String SECTION_PREFIX = "section-";
>>> +
>>> +    private String sectionName;
>>> +
>>> +    private AutoCompleteAddressType addressType;
>>> +
>>> +    private AutoCompleteFields field;
>>> +
>>> +    private AutoCompleteContact contact;
>>> +
>>> +    private AutoCompleteContactDetails contactDetail;
>>> +
>>> +    private boolean empty;
>>> +
>>> +    /**
>>> +     * Initializes a new auto complete builder
>>> +     *
>>> +     * @return the auto complete builder
>>> +     */
>>> +    public static AutoCompleteBuilder init()
>>> +    {
>>> +        return new AutoCompleteBuilder();
>>> +    }
>>> +
>>> +    /**
>>> +     * Empties out the autocomplete outcome
>>> +     *
>>> +     * @return the auto complete builder
>>> +     */
>>> +    public AutoCompleteBuilder empty()
>>> +    {
>>> +        this.empty = true;
>>> +        return this;
>>> +    }
>>> +
>>> +    /**
>>> +     * Applies a section to the auto completion field
>>> +     *
>>> +     * @param sectionName
>>> +     *            the name of the section
>>> +     * @return the auto complete builder itself
>>> +     */
>>> +    public AutoCompleteBuilder withSection(String sectionName)
>>> +    {
>>> +        this.sectionName = sectionName;
>>> +        return this;
>>> +    }
>>> +
>>> +    /**
>>> +     * Assigns the auto completion to a specific address type
>>> +     *
>>> +     * @param addressType
>>> +     *            the auto completion address type
>>> +     * @return the auto complete builder itself
>>> +     */
>>> +    public AutoCompleteBuilder forAddressType(AutoCompleteAddressType addressType)
>>> +    {
>>> +        this.addressType = addressType;
>>> +        return this;
>>> +    }
>>> +
>>> +    /**
>>> +     * Applies the field to the autocomplete attribute
>>> +     *
>>> +     * @param field
>>> +     *            the field
>>> +     * @return the auto complete builder
>>> +     */
>>> +    public AutoCompleteBuilder forField(AutoCompleteFields field)
>>> +    {
>>> +        this.field = field;
>>> +        return this;
>>> +    }
>>> +
>>> +    /**
>>> +     * Applies the contact information to the autocomplete attribute
>>> +     *
>>> +     * @param contact
>>> +     *            the contact information are going to be applied to
>>> +     * @return the auto complete builder
>>> +     */
>>> +    public AutoCompleteContactBuilder forContact(AutoCompleteContact contact)
>>> +    {
>>> +        this.contact = contact;
>>> +        return this;
>>> +    }
>>> +
>>> +    /**
>>> +     * @see {@link AutoCompleteContactBuilder}
>>> +     */
>>> +    @Override
>>> +    public AutoCompleteContactBuilder forField(AutoCompleteContactDetails contactDetail)
>>> +    {
>>> +        this.contactDetail = contactDetail;
>>> +        return (AutoCompleteContactBuilder)this;
>>> +    }
>>> +
>>> +    /**
>>> +     * Builds the attribute string
>>> +     *
>>> +     * @return the attribute content in the right order
>>> +     */
>>> +    @Override
>>> +    public String toString()
>>> +    {
>>> +        StringBuilder stringBuilder = new StringBuilder();
>>> +        if (!empty)
>>> +        {
>>> +            if (sectionName != null)
>>> +            {
>>> +                stringBuilder.append(SECTION_PREFIX);
>>> +                stringBuilder.append(sectionName);
>>> +                stringBuilder.append(" ");
>>> +            }
>>> +            if (addressType != null)
>>> +            {
>>> +                stringBuilder.append(addressType.getValue());
>>> +                stringBuilder.append(" ");
>>> +            }
>>> +            if (field != null)
>>> +            {
>>> +                stringBuilder.append(field.getValue());
>>> +            }
>>> +            else
>>> +            {
>>> +                if (contact != null)
>>> +                {
>>> +                    stringBuilder.append(contact.getValue());
>>> +                    stringBuilder.append(" ");
>>> +                }
>>> +                stringBuilder.append(contactDetail.getValue());
>>> +            }
>>> +        }
>>> +        return stringBuilder.toString();
>>> +    }
>>> +}
>>>
>>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContact.java
>>> ----------------------------------------------------------------------
>>> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContact.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContact.java
>>> new file mode 100644
>>> index 0000000..cbf86a5
>>> --- /dev/null
>>> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContact.java
>>> @@ -0,0 +1,77 @@
>>> +/*
>>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>>> + * contributor license agreements.  See the NOTICE file distributed with
>>> + * this work for additional information regarding copyright ownership.
>>> + * The ASF licenses this file to You under the Apache License, Version 2.0
>>> + * (the "License"); you may not use this file except in compliance with
>>> + * the License.  You may obtain a copy of the License at
>>> + *
>>> + *      http://www.apache.org/licenses/LICENSE-2.0
>>> + *
>>> + * Unless required by applicable law or agreed to in writing, software
>>> + * distributed under the License is distributed on an "AS IS" BASIS,
>>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>>> + * See the License for the specific language governing permissions and
>>> + * limitations under the License.
>>> + */
>>> +package org.apache.wicket.markup.html.form;
>>> +
>>> +/**
>>> + * Auto completion contact according to the whatwg specification.
>>> + *
>>> + * @author Tobias Soloschenko
>>> + *
>>> + * @see <a href=
>>> + *      "https://html.spec.whatwg.org/multipage/forms.html">https://html.spec.whatwg.org/multipage/forms.html</a>
>>> + *
>>> + */
>>> +public enum AutoCompleteContact {
>>> +
>>> +    /**
>>> +     * meaning the field is for contacting someone at their residence
>>> +     */
>>> +    HOME("home"),
>>> +
>>> +    /**
>>> +     * meaning the field is for contacting someone at their workplace
>>> +     */
>>> +    WORK("work"),
>>> +
>>> +    /**
>>> +     * meaning the field is for contacting someone regardless of location
>>> +     */
>>> +    MOBILE("mobile"),
>>> +
>>> +    /**
>>> +     * meaning the field describes a fax machine's contact details
>>> +     */
>>> +    FAX("fax"),
>>> +
>>> +    /**
>>> +     * meaning the field describes a pager's or beeper's contact details
>>> +     */
>>> +    PAGER("pager");
>>> +
>>> +    private String value;
>>> +
>>> +    /**
>>> +     * Creates an auto completion contact with the given value
>>> +     *
>>> +     * @param value
>>> +     *            the value of the contact
>>> +     */
>>> +    private AutoCompleteContact(String value)
>>> +    {
>>> +        this.value = value;
>>> +    }
>>> +
>>> +    /**
>>> +     * Gets the value of the auto completion contact
>>> +     *
>>> +     * @return the value of the auto completion contact
>>> +     */
>>> +    public String getValue()
>>> +    {
>>> +        return value;
>>> +    }
>>> +}
>>>
>>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactBuilder.java
>>> ----------------------------------------------------------------------
>>> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactBuilder.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactBuilder.java
>>> new file mode 100644
>>> index 0000000..07324ff
>>> --- /dev/null
>>> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactBuilder.java
>>> @@ -0,0 +1,38 @@
>>> +/*
>>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>>> + * contributor license agreements.  See the NOTICE file distributed with
>>> + * this work for additional information regarding copyright ownership.
>>> + * The ASF licenses this file to You under the Apache License, Version 2.0
>>> + * (the "License"); you may not use this file except in compliance with
>>> + * the License.  You may obtain a copy of the License at
>>> + *
>>> + *      http://www.apache.org/licenses/LICENSE-2.0
>>> + *
>>> + * Unless required by applicable law or agreed to in writing, software
>>> + * distributed under the License is distributed on an "AS IS" BASIS,
>>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>>> + * See the License for the specific language governing permissions and
>>> + * limitations under the License.
>>> + */
>>> +package org.apache.wicket.markup.html.form;
>>> +
>>> +/**
>>> + * The auto complete contact builder shrinks down the possibilities to the contact details
>>> + *
>>> + * @author Tobias Soloschenko
>>> + *
>>> + * @since 8.0.0
>>> + *
>>> + */
>>> +public interface AutoCompleteContactBuilder
>>> +{
>>> +    /**
>>> +     * Applies the contact details information to the auto complete field
>>> +     *
>>> +     * @param contactDetail
>>> +     *            the contact detail
>>> +     * @return the auto complete builder contact
>>> +     */
>>> +    AutoCompleteContactBuilder forField(AutoCompleteContactDetails contactDetail);
>>> +
>>> +}
>>>
>>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactDetails.java
>>> ----------------------------------------------------------------------
>>> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactDetails.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactDetails.java
>>> new file mode 100644
>>> index 0000000..e4d5e44
>>> --- /dev/null
>>> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactDetails.java
>>> @@ -0,0 +1,102 @@
>>> +/*
>>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>>> + * contributor license agreements.  See the NOTICE file distributed with
>>> + * this work for additional information regarding copyright ownership.
>>> + * The ASF licenses this file to You under the Apache License, Version 2.0
>>> + * (the "License"); you may not use this file except in compliance with
>>> + * the License.  You may obtain a copy of the License at
>>> + *
>>> + *      http://www.apache.org/licenses/LICENSE-2.0
>>> + *
>>> + * Unless required by applicable law or agreed to in writing, software
>>> + * distributed under the License is distributed on an "AS IS" BASIS,
>>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>>> + * See the License for the specific language governing permissions and
>>> + * limitations under the License.
>>> + */
>>> +package org.apache.wicket.markup.html.form;
>>> +
>>> +/**
>>> + * Auto completion contact detail according to the whatwg specification.
>>> + *
>>> + * @author Tobias Soloschenko
>>> + *
>>> + * @see <a href=
>>> + *      "https://html.spec.whatwg.org/multipage/forms.html">https://html.spec.whatwg.org/multipage/forms.html</a>
>>> + *
>>> + */
>>> +public enum AutoCompleteContactDetails {
>>> +
>>> +    /**
>>> +     * +1 617 253 5702
>>> +     */
>>> +    TEL("tel"),
>>> +
>>> +    /**
>>> +     * +1
>>> +     */
>>> +    TEL_COUNTRY_CODE("tel-country-code"),
>>> +
>>> +    /**
>>> +     * 617 253 5702
>>> +     */
>>> +    TEL_NATIONAL("tel-national"),
>>> +
>>> +    /**
>>> +     * 617
>>> +     */
>>> +    TEL_AREA_CODE("tel-area-code"),
>>> +
>>> +    /**
>>> +     * 2535702
>>> +     */
>>> +    TEL_LOCAL("tel-local"),
>>> +
>>> +    /**
>>> +     * 253
>>> +     */
>>> +    TEL_LOCAL_PREFIX("tel-local-prefix"),
>>> +
>>> +    /**
>>> +     * 5702
>>> +     */
>>> +    TEL_LOCAL_SUFFIX("tel-local-suffix"),
>>> +
>>> +    /**
>>> +     * 1000
>>> +     */
>>> +    TEL_EXTENSION("tel-extension"),
>>> +
>>> +    /**
>>> +     * timbl@w3.org
>>> +     */
>>> +    EMAIL("email"),
>>> +
>>> +    /**
>>> +     * irc://example.org/timbl,isuser
>>> +     */
>>> +    IMPP("impp");
>>> +
>>> +    private String value;
>>> +
>>> +    /**
>>> +     * Creates an auto completion contact detail with the given value
>>> +     *
>>> +     * @param value
>>> +     *            the value of the contact detail
>>> +     */
>>> +    private AutoCompleteContactDetails(String value)
>>> +    {
>>> +        this.value = value;
>>> +    }
>>> +
>>> +    /**
>>> +     * Gets the value of the auto completion contact detail
>>> +     *
>>> +     * @return the value of the auto completion contact detail
>>> +     */
>>> +    public String getValue()
>>> +    {
>>> +        return value;
>>> +    }
>>> +}
>>>
>>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteFields.java
>>> ----------------------------------------------------------------------
>>> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteFields.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteFields.java
>>> new file mode 100644
>>> index 0000000..8f794c4
>>> --- /dev/null
>>> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteFields.java
>>> @@ -0,0 +1,272 @@
>>> +/*
>>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>>> + * contributor license agreements.  See the NOTICE file distributed with
>>> + * this work for additional information regarding copyright ownership.
>>> + * The ASF licenses this file to You under the Apache License, Version 2.0
>>> + * (the "License"); you may not use this file except in compliance with
>>> + * the License.  You may obtain a copy of the License at
>>> + *
>>> + *      http://www.apache.org/licenses/LICENSE-2.0
>>> + *
>>> + * Unless required by applicable law or agreed to in writing, software
>>> + * distributed under the License is distributed on an "AS IS" BASIS,
>>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>>> + * See the License for the specific language governing permissions and
>>> + * limitations under the License.
>>> + */
>>> +package org.apache.wicket.markup.html.form;
>>> +
>>> +/**
>>> + * Auto completion personal data according to the whatwg specification.
>>> + *
>>> + * @author Tobias Soloschenko
>>> + *
>>> + * @see <a href=
>>> + *      "https://html.spec.whatwg.org/multipage/forms.html">https://html.spec.whatwg.org/multipage/forms.html</a>
>>> + *
>>> + */
>>> +public enum AutoCompleteFields {
>>> +
>>> +    /**
>>> +     * Simply turns on the auto completion
>>> +     */
>>> +    ON("on"),
>>> +
>>> +    /**
>>> +     * Simply turns off the auto completion
>>> +     */
>>> +    OFF("off"),
>>> +
>>> +    /**
>>> +     * Sir Timothy John Berners-Lee, OM, KBE, FRS, FREng, FRSA
>>> +     */
>>> +    NAME("name"),
>>> +
>>> +    /**
>>> +     * Sir
>>> +     */
>>> +    HONORIFIC_PREFIX("honorific-prefix"),
>>> +
>>> +    /**
>>> +     * Timothy
>>> +     */
>>> +    GIVEN_NAME("given-name"),
>>> +
>>> +    /**
>>> +     * John
>>> +     */
>>> +    ADDITIONAL_NAME("additional-name"),
>>> +
>>> +    /**
>>> +     * Berners-Lee
>>> +     */
>>> +    FAMILY_NAME("family-name"),
>>> +
>>> +    /**
>>> +     * OM, KBE, FRS, FREng, FRSA
>>> +     */
>>> +    HONORIFIC_SUFFIX("honorific-suffix"),
>>> +
>>> +    /**
>>> +     * Tim
>>> +     */
>>> +    NICKNAME("nickname"),
>>> +
>>> +    /**
>>> +     * timbl
>>> +     */
>>> +    USERNAME("username"),
>>> +
>>> +    /**
>>> +     * GUMFXbadyrS3
>>> +     */
>>> +    NEW_PASSWORD("new-password"),
>>> +
>>> +    /**
>>> +     * qwerty
>>> +     */
>>> +    CURRENT_PASSWORD("current-password"),
>>> +
>>> +    /**
>>> +     * Professor
>>> +     */
>>> +    ORGANIZATION_TITLE("organization-title"),
>>> +
>>> +    /**
>>> +     * World Wide Web Consortium
>>> +     */
>>> +    ORGANIZATION("organization"),
>>> +
>>> +    /**
>>> +     * Multiple lines 32 Vassar Street MIT Room 32-G524
>>> +     */
>>> +    STREET_ADDRESS("street-address"),
>>> +
>>> +    /**
>>> +     * 32 Vassar Street
>>> +     */
>>> +    ADDRESS_LINE1("address-line1"),
>>> +
>>> +    /**
>>> +     * MIT Room 32-G524
>>> +     */
>>> +    ADDRESS_LINE2("address-line2"),
>>> +
>>> +    /**
>>> +     * See {@link AutoComplete.ADRESS_LINE2}
>>> +     */
>>> +    ADDRESS_LINE3("address-line3"),
>>> +
>>> +    /**
>>> +     * The most fine-grained administrative level, in addresses with four administrative levels
>>> +     */
>>> +    ADDRESS_LEVEL4("address-level4"),
>>> +
>>> +    /**
>>> +     * The third administrative level, in addresses with three or more administrative levels
>>> +     */
>>> +    ADDRESS_LEVEL3("address-level3"),
>>> +
>>> +    /**
>>> +     * Cambridge
>>> +     */
>>> +    ADDRESS_LEVEL2("address-level2"),
>>> +
>>> +    /**
>>> +     * MA
>>> +     */
>>> +    ADDRESS_LEVEL1("address-level1"),
>>> +
>>> +    /**
>>> +     * US
>>> +     */
>>> +    COUNTRY("country"),
>>> +
>>> +    /**
>>> +     * US
>>> +     */
>>> +    COUNTRY_NAME("country-name"),
>>> +
>>> +    /**
>>> +     * 02139
>>> +     */
>>> +    POSTAL_CODE("postal-code"),
>>> +
>>> +    /**
>>> +     * Tim Berners-Lee
>>> +     */
>>> +    CC_NAME("cc-name"),
>>> +
>>> +    /**
>>> +     * Tim
>>> +     */
>>> +    CC_GIVEN_NAME("cc-given-name"),
>>> +
>>> +    /**
>>> +     * -
>>> +     */
>>> +    CC_ADDITIONAL_NAME("cc-additional-name"),
>>> +
>>> +    /**
>>> +     * Berners-Lee
>>> +     */
>>> +    CC_FAMILY_NAME("cc-family-name"),
>>> +
>>> +    /**
>>> +     * 4114360123456785
>>> +     */
>>> +    CC_NUMBER("cc-number"),
>>> +
>>> +    /**
>>> +     * 2014-12
>>> +     */
>>> +    CC_EXP("cc-exp"),
>>> +
>>> +    /**
>>> +     * 12
>>> +     */
>>> +    CC_EXP_MONTH("cc-exp-month"),
>>> +
>>> +    /**
>>> +     * 2014
>>> +     */
>>> +    CC_EXP_YEAR("cc-exp-year"),
>>> +
>>> +    /**
>>> +     * 419
>>> +     */
>>> +    CC_CSC("cc-csc"),
>>> +
>>> +    /**
>>> +     * Visa
>>> +     */
>>> +    CC_TYPE("cc-type"),
>>> +
>>> +    /**
>>> +     * GBP
>>> +     */
>>> +    TRANSACTION_CURRENCY("transaction-currency"),
>>> +
>>> +    /**
>>> +     * 401.00
>>> +     */
>>> +    TRANSACTION_AMOUNT("transaction-amount"),
>>> +
>>> +    /**
>>> +     * en
>>> +     */
>>> +    LANGUAGE("language"),
>>> +
>>> +    /**
>>> +     * 1955-06-08
>>> +     */
>>> +    BDAY("bday"),
>>> +
>>> +    /**
>>> +     * 8
>>> +     */
>>> +    BDAY_DAY("bday-day"),
>>> +
>>> +    /**
>>> +     * 6
>>> +     */
>>> +    BDAY_MONTH("bday-month"),
>>> +
>>> +    /**
>>> +     * 1955
>>> +     */
>>> +    BDAY_YEAR("bday-year"),
>>> +
>>> +    /**
>>> +     * Male
>>> +     */
>>> +    SEX("sex"),
>>> +
>>> +    /**
>>> +     * https://www.w3.org/People/Berners-Lee/
>>> +     */
>>> +    URL("url"),
>>> +
>>> +    /**
>>> +     * https://www.w3.org/Press/Stock/Berners-Lee/2001-europaeum-eighth.jpg
>>> +     */
>>> +    PHOTO("photo");
>>> +
>>> +    private String value;
>>> +
>>> +    private AutoCompleteFields(String value)
>>> +    {
>>> +        this.value = value;
>>> +    }
>>> +
>>> +    /**
>>> +     * Gets the value of the auto completion
>>> +     *
>>> +     * @return the value of the auto completion
>>> +     */
>>> +    public String getValue()
>>> +    {
>>> +        return value;
>>> +    }
>>> +
>>> +}
>>>
>>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
>>> ----------------------------------------------------------------------
>>> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
>>> index e8b61e7..1d3284a 100644
>>> --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
>>> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
>>> @@ -1352,6 +1352,14 @@ public class Form<T> extends WebMarkupContainer
>>>       }
>>>         /**
>>> +     * Gets the value of the autocomplete attribute. The default behavior is that it is turned off
>>> +     * @return AutoCompleteBuilder the builder to generate the autocomplete attribute information
>>> +     */
>>> +    protected AutoCompleteBuilder getAutoCompleteBuilder(){
>>> +        return AutoCompleteBuilder.init().empty();
>>> +    }
>>> +
>>> +    /**
>>>        *
>>>        * @see org.apache.wicket.Component#getStatelessHint()
>>>        */
>>> @@ -1633,6 +1641,12 @@ public class Form<T> extends WebMarkupContainer
>>>                       setMultiPart(true);
>>>                   }
>>>               }
>>> +
>>> +            // Auto completion support
>>> +            String autocompleteValue = getAutoCompleteBuilder().toString();
>>> +            if(!autocompleteValue.isEmpty()){
>>> +                tag.put("autocomplete", autocompleteValue);
>>> +            }
>>>           }
>>>           else
>>>           {
>>>
>>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/TextField.java
>>> ----------------------------------------------------------------------
>>> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/TextField.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/TextField.java
>>> index 81dc828..719560c 100644
>>> --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/TextField.java
>>> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/TextField.java
>>> @@ -107,6 +107,12 @@ public class TextField<T> extends AbstractTextComponent<T>
>>>             tag.put("value", getValue());
>>>   +        // Auto completion support
>>> +        String autocompleteValue = getAutoCompleteBuilder().toString();
>>> +        if(!autocompleteValue.isEmpty()){
>>> +            tag.put("autocomplete", autocompleteValue);
>>> +        }
>>> +
>>>           // Default handling for component tag
>>>           super.onComponentTag(tag);
>>>       }
>>> @@ -121,4 +127,12 @@ public class TextField<T> extends AbstractTextComponent<T>
>>>       {
>>>           return null;
>>>       }
>>> +
>>> +    /**
>>> +     * Gets the value of the autocomplete attribute. The default behavior is that it is turned off
>>> +     * @return AutoCompleteBuilder the builder to generate the autocomplete attribute information
>>> +     */
>>> +    protected AutoCompleteBuilder getAutoCompleteBuilder(){
>>> +        return AutoCompleteBuilder.init().empty();
>>> +    }
>>>   }
>>>
>>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormTest.java
>>> ----------------------------------------------------------------------
>>> diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormTest.java
>>> index 05344a5..2ee420a 100644
>>> --- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormTest.java
>>> +++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormTest.java
>>> @@ -53,6 +53,39 @@ public class FormTest extends WicketTestCase
>>>           };
>>>       }
>>>   +    /**
>>> +     * Test auto complete functionality
>>> +     */
>>> +    @Test
>>> +    public void testAutoComplete(){
>>> +        class TestPage extends WebPage implements IMarkupResourceStreamProvider
>>> +        {
>>> +            boolean shouldFail, submit, error;
>>> +
>>> +            public TestPage()
>>> +            {
>>> +                add(new Form<Void>("form")
>>> +                {
>>> +                    @Override
>>> +                    protected AutoCompleteBuilder getAutoCompleteBuilder()
>>> +                    {
>>> +                        return AutoCompleteBuilder.init().forAddressType(AutoCompleteAddressType.BILLING).forField(AutoCompleteFields.GIVEN_NAME);
>>> +                    }
>>> +                });
>>> +            }
>>> +
>>> +            @Override
>>> +            public IResourceStream getMarkupResourceStream(final MarkupContainer container,
>>> +                Class<?> containerClass)
>>> +            {
>>> +                return new StringResourceStream("<form wicket:id='form'></form>");
>>> +            }
>>> +        }
>>> +
>>> +        TestPage testPage = new TestPage();
>>> +        tester.startPage(testPage);
>>> +        assertTrue(tester.getLastResponseAsString().contains("autocomplete=\"billing given-name\""));
>>> +    }
>>>         /**
>>>        * @throws Exception
>>> @@ -115,6 +148,12 @@ public class FormTest extends WicketTestCase
>>>                       {
>>>                           error = true;
>>>                       }
>>> +
>>> +                    @Override
>>> +                    protected AutoCompleteBuilder getAutoCompleteBuilder()
>>> +                    {
>>> +                        return AutoCompleteBuilder.init().forAddressType(AutoCompleteAddressType.BILLING).forField(AutoCompleteFields.GIVEN_NAME);
>>> +                    }
>>>                   });
>>>               }
>>>   
>>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/test/java/org/apache/wicket/markup/html/form/TextFieldTest.java
>>> ----------------------------------------------------------------------
>>> diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/TextFieldTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/TextFieldTest.java
>>> index 5af5917..2c215e5 100644
>>> --- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/TextFieldTest.java
>>> +++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/TextFieldTest.java
>>> @@ -36,7 +36,20 @@ import org.junit.Test;
>>>    */
>>>   public class TextFieldTest extends WicketTestCase
>>>   {
>>> -    /** */
>>> +
>>> +    /**
>>> +     * Test auto complete feature
>>> +     */
>>> +    @Test
>>> +    public void testAutoComplete(){
>>> +        TestPage testPage = new TestPage();
>>> +        tester.startPage(testPage);
>>> +        assertTrue(tester.getLastResponseAsString().contains("autocomplete=\"section-blue billing name\""));
>>> +    }
>>> +
>>> +    /**
>>> +     * Test that inputs are converted to null
>>> +     * */
>>>       @Test
>>>       public void emptyInputConvertedToNull()
>>>       {
>>> @@ -111,7 +124,13 @@ public class TextFieldTest extends WicketTestCase
>>>           public TestPage()
>>>           {
>>>               add(form = new Form<>("form"));
>>> -            form.add(textField = new TextField<>("text", textModel));
>>> +            form.add(textField = new TextField<String>("text", textModel){
>>> +                @Override
>>> +                protected AutoCompleteBuilder getAutoCompleteBuilder()
>>> +                {
>>> +                    return AutoCompleteBuilder.init().withSection("blue").forAddressType(AutoCompleteAddressType.BILLING).forField(AutoCompleteFields.NAME);
>>> +                }
>>> +            });
>>>           }
>>>             @Override
>>>


Re: wicket git commit: WICKET-6299

Posted by Tobias Soloschenko <to...@googlemail.com>.
Hi Sven,

- try it out - you can set a contact detail without a contact. If you set a contact there has to be a contact detail next to it.

- Yes the compile error is not ok - I have to restructure it a bit.

- The advantage of the implementation should be:
* You don't have to search for the field names - just use the enums
* Fields are applied in the right order (if not the autofill is not working) - see the standard
* You can refactor it with java utils

kind regards

Tobias

> Am 21.12.2016 um 09:42 schrieb Sven Meier <sv...@meiers.net>:
> 
> Hi,
> 
> your builder is wrong :P
> 
> - It allows setting a contact detail field without contact:
> 
> AutoCompleteBuilder.init().forField(AutoCompleteContactDetails.TEL);
> 
> - AutoCompleteContactBuilder#forField() has the wrong return type:
> 
>  // does not compile since AutoCompleteContactBuilder is no AutoCompleteBuilder
>  return AutoCompleteBuilder.init().forContact(AutoCompleteContact.HOME).forField(AutoCompleteContactDetails.TEL);
> 
> Tbh I find it over the top to add an API to build a string defined in a "living standard".
> 
> When I read whatwg correctly, the "autocomplete" attribute can be used on hidden input, textarea and select too.
> Instead of adding factory methods all over the place, I'd rather have a behavior for this. We could move it to extensions, freeing org.apache.wicket.markup.html.form from 6 new source files.
> 
> Regards
> Sven    
> 
> 
>> On 20.12.2016 20:19, tsoloschenko@apache.org wrote:
>> Repository: wicket
>> Updated Branches:
>>   refs/heads/master aedb98764 -> bcd55813b
>> 
>> 
>> WICKET-6299
>> 
>> Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
>> Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/bcd55813
>> Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/bcd55813
>> Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/bcd55813
>> 
>> Branch: refs/heads/master
>> Commit: bcd55813b3afbccb5675096930aee6281c5cba3a
>> Parents: aedb987
>> Author: Tobias Soloschenko <ts...@apache.org>
>> Authored: Tue Dec 20 20:15:42 2016 +0100
>> Committer: Tobias Soloschenko <ts...@apache.org>
>> Committed: Tue Dec 20 20:15:42 2016 +0100
>> 
>> ----------------------------------------------------------------------
>>  .../html/form/AutoCompleteAddressType.java      |  56 ++++
>>  .../markup/html/form/AutoCompleteBuilder.java   | 170 ++++++++++++
>>  .../markup/html/form/AutoCompleteContact.java   |  77 ++++++
>>  .../html/form/AutoCompleteContactBuilder.java   |  38 +++
>>  .../html/form/AutoCompleteContactDetails.java   | 102 +++++++
>>  .../markup/html/form/AutoCompleteFields.java    | 272 +++++++++++++++++++
>>  .../apache/wicket/markup/html/form/Form.java    |  14 +
>>  .../wicket/markup/html/form/TextField.java      |  14 +
>>  .../wicket/markup/html/form/FormTest.java       |  39 +++
>>  .../wicket/markup/html/form/TextFieldTest.java  |  23 +-
>>  10 files changed, 803 insertions(+), 2 deletions(-)
>> ----------------------------------------------------------------------
>> 
>> 
>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteAddressType.java
>> ----------------------------------------------------------------------
>> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteAddressType.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteAddressType.java
>> new file mode 100644
>> index 0000000..6123053
>> --- /dev/null
>> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteAddressType.java
>> @@ -0,0 +1,56 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>> + * contributor license agreements.  See the NOTICE file distributed with
>> + * this work for additional information regarding copyright ownership.
>> + * The ASF licenses this file to You under the Apache License, Version 2.0
>> + * (the "License"); you may not use this file except in compliance with
>> + * the License.  You may obtain a copy of the License at
>> + *
>> + *      http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing, software
>> + * distributed under the License is distributed on an "AS IS" BASIS,
>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>> + * See the License for the specific language governing permissions and
>> + * limitations under the License.
>> + */
>> +package org.apache.wicket.markup.html.form;
>> +
>> +/**
>> + * Auto completion address type according to the whatwg specification.
>> + *
>> + * @author Tobias Soloschenko
>> + *
>> + * @see <a href=
>> + *      "https://html.spec.whatwg.org/multipage/forms.html">https://html.spec.whatwg.org/multipage/forms.html</a>
>> + *
>> + */
>> +public enum AutoCompleteAddressType {
>> +
>> +    /**
>> +     * Meaning the field is part of the shipping address or contact information
>> +     */
>> +    SHIPPING("shipping"),
>> +
>> +    /**
>> +     * meaning the field is part of the billing address or contact information
>> +     */
>> +    BILLING("billing");
>> +
>> +    private String value;
>> +
>> +    private AutoCompleteAddressType(String value)
>> +    {
>> +        this.value = value;
>> +    }
>> +
>> +    /**
>> +     * Gets the address type value
>> +     *
>> +     * @return the value of the address type
>> +     */
>> +    public String getValue()
>> +    {
>> +        return value;
>> +    }
>> +}
>> 
>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteBuilder.java
>> ----------------------------------------------------------------------
>> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteBuilder.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteBuilder.java
>> new file mode 100644
>> index 0000000..a3b64cd
>> --- /dev/null
>> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteBuilder.java
>> @@ -0,0 +1,170 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>> + * contributor license agreements.  See the NOTICE file distributed with
>> + * this work for additional information regarding copyright ownership.
>> + * The ASF licenses this file to You under the Apache License, Version 2.0
>> + * (the "License"); you may not use this file except in compliance with
>> + * the License.  You may obtain a copy of the License at
>> + *
>> + *      http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing, software
>> + * distributed under the License is distributed on an "AS IS" BASIS,
>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>> + * See the License for the specific language governing permissions and
>> + * limitations under the License.
>> + */
>> +package org.apache.wicket.markup.html.form;
>> +
>> +/**
>> + * The auto complete builder is used to build the corresponding attribute for form and input tags.
>> + * To use the auto completion just open the autofill options within your browser. In chrome for
>> + * example it is accessed with the following URL:
>> + * <a href="chrome://settings/autofillEditAddress">chrome://settings/autofillEditAddress</a>
>> + *
>> + * @author Tobias Soloschenko
>> + *
>> + * @since 8.0.0
>> + *
>> + */
>> +public class AutoCompleteBuilder implements AutoCompleteContactBuilder
>> +{
>> +    /**
>> +     * The section prefix specificed by the whatwg standard
>> +     */
>> +    public static final String SECTION_PREFIX = "section-";
>> +
>> +    private String sectionName;
>> +
>> +    private AutoCompleteAddressType addressType;
>> +
>> +    private AutoCompleteFields field;
>> +
>> +    private AutoCompleteContact contact;
>> +
>> +    private AutoCompleteContactDetails contactDetail;
>> +
>> +    private boolean empty;
>> +
>> +    /**
>> +     * Initializes a new auto complete builder
>> +     *
>> +     * @return the auto complete builder
>> +     */
>> +    public static AutoCompleteBuilder init()
>> +    {
>> +        return new AutoCompleteBuilder();
>> +    }
>> +
>> +    /**
>> +     * Empties out the autocomplete outcome
>> +     *
>> +     * @return the auto complete builder
>> +     */
>> +    public AutoCompleteBuilder empty()
>> +    {
>> +        this.empty = true;
>> +        return this;
>> +    }
>> +
>> +    /**
>> +     * Applies a section to the auto completion field
>> +     *
>> +     * @param sectionName
>> +     *            the name of the section
>> +     * @return the auto complete builder itself
>> +     */
>> +    public AutoCompleteBuilder withSection(String sectionName)
>> +    {
>> +        this.sectionName = sectionName;
>> +        return this;
>> +    }
>> +
>> +    /**
>> +     * Assigns the auto completion to a specific address type
>> +     *
>> +     * @param addressType
>> +     *            the auto completion address type
>> +     * @return the auto complete builder itself
>> +     */
>> +    public AutoCompleteBuilder forAddressType(AutoCompleteAddressType addressType)
>> +    {
>> +        this.addressType = addressType;
>> +        return this;
>> +    }
>> +
>> +    /**
>> +     * Applies the field to the autocomplete attribute
>> +     *
>> +     * @param field
>> +     *            the field
>> +     * @return the auto complete builder
>> +     */
>> +    public AutoCompleteBuilder forField(AutoCompleteFields field)
>> +    {
>> +        this.field = field;
>> +        return this;
>> +    }
>> +
>> +    /**
>> +     * Applies the contact information to the autocomplete attribute
>> +     *
>> +     * @param contact
>> +     *            the contact information are going to be applied to
>> +     * @return the auto complete builder
>> +     */
>> +    public AutoCompleteContactBuilder forContact(AutoCompleteContact contact)
>> +    {
>> +        this.contact = contact;
>> +        return this;
>> +    }
>> +
>> +    /**
>> +     * @see {@link AutoCompleteContactBuilder}
>> +     */
>> +    @Override
>> +    public AutoCompleteContactBuilder forField(AutoCompleteContactDetails contactDetail)
>> +    {
>> +        this.contactDetail = contactDetail;
>> +        return (AutoCompleteContactBuilder)this;
>> +    }
>> +
>> +    /**
>> +     * Builds the attribute string
>> +     *
>> +     * @return the attribute content in the right order
>> +     */
>> +    @Override
>> +    public String toString()
>> +    {
>> +        StringBuilder stringBuilder = new StringBuilder();
>> +        if (!empty)
>> +        {
>> +            if (sectionName != null)
>> +            {
>> +                stringBuilder.append(SECTION_PREFIX);
>> +                stringBuilder.append(sectionName);
>> +                stringBuilder.append(" ");
>> +            }
>> +            if (addressType != null)
>> +            {
>> +                stringBuilder.append(addressType.getValue());
>> +                stringBuilder.append(" ");
>> +            }
>> +            if (field != null)
>> +            {
>> +                stringBuilder.append(field.getValue());
>> +            }
>> +            else
>> +            {
>> +                if (contact != null)
>> +                {
>> +                    stringBuilder.append(contact.getValue());
>> +                    stringBuilder.append(" ");
>> +                }
>> +                stringBuilder.append(contactDetail.getValue());
>> +            }
>> +        }
>> +        return stringBuilder.toString();
>> +    }
>> +}
>> 
>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContact.java
>> ----------------------------------------------------------------------
>> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContact.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContact.java
>> new file mode 100644
>> index 0000000..cbf86a5
>> --- /dev/null
>> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContact.java
>> @@ -0,0 +1,77 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>> + * contributor license agreements.  See the NOTICE file distributed with
>> + * this work for additional information regarding copyright ownership.
>> + * The ASF licenses this file to You under the Apache License, Version 2.0
>> + * (the "License"); you may not use this file except in compliance with
>> + * the License.  You may obtain a copy of the License at
>> + *
>> + *      http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing, software
>> + * distributed under the License is distributed on an "AS IS" BASIS,
>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>> + * See the License for the specific language governing permissions and
>> + * limitations under the License.
>> + */
>> +package org.apache.wicket.markup.html.form;
>> +
>> +/**
>> + * Auto completion contact according to the whatwg specification.
>> + *
>> + * @author Tobias Soloschenko
>> + *
>> + * @see <a href=
>> + *      "https://html.spec.whatwg.org/multipage/forms.html">https://html.spec.whatwg.org/multipage/forms.html</a>
>> + *
>> + */
>> +public enum AutoCompleteContact {
>> +
>> +    /**
>> +     * meaning the field is for contacting someone at their residence
>> +     */
>> +    HOME("home"),
>> +
>> +    /**
>> +     * meaning the field is for contacting someone at their workplace
>> +     */
>> +    WORK("work"),
>> +
>> +    /**
>> +     * meaning the field is for contacting someone regardless of location
>> +     */
>> +    MOBILE("mobile"),
>> +
>> +    /**
>> +     * meaning the field describes a fax machine's contact details
>> +     */
>> +    FAX("fax"),
>> +
>> +    /**
>> +     * meaning the field describes a pager's or beeper's contact details
>> +     */
>> +    PAGER("pager");
>> +
>> +    private String value;
>> +
>> +    /**
>> +     * Creates an auto completion contact with the given value
>> +     *
>> +     * @param value
>> +     *            the value of the contact
>> +     */
>> +    private AutoCompleteContact(String value)
>> +    {
>> +        this.value = value;
>> +    }
>> +
>> +    /**
>> +     * Gets the value of the auto completion contact
>> +     *
>> +     * @return the value of the auto completion contact
>> +     */
>> +    public String getValue()
>> +    {
>> +        return value;
>> +    }
>> +}
>> 
>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactBuilder.java
>> ----------------------------------------------------------------------
>> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactBuilder.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactBuilder.java
>> new file mode 100644
>> index 0000000..07324ff
>> --- /dev/null
>> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactBuilder.java
>> @@ -0,0 +1,38 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>> + * contributor license agreements.  See the NOTICE file distributed with
>> + * this work for additional information regarding copyright ownership.
>> + * The ASF licenses this file to You under the Apache License, Version 2.0
>> + * (the "License"); you may not use this file except in compliance with
>> + * the License.  You may obtain a copy of the License at
>> + *
>> + *      http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing, software
>> + * distributed under the License is distributed on an "AS IS" BASIS,
>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>> + * See the License for the specific language governing permissions and
>> + * limitations under the License.
>> + */
>> +package org.apache.wicket.markup.html.form;
>> +
>> +/**
>> + * The auto complete contact builder shrinks down the possibilities to the contact details
>> + *
>> + * @author Tobias Soloschenko
>> + *
>> + * @since 8.0.0
>> + *
>> + */
>> +public interface AutoCompleteContactBuilder
>> +{
>> +    /**
>> +     * Applies the contact details information to the auto complete field
>> +     *
>> +     * @param contactDetail
>> +     *            the contact detail
>> +     * @return the auto complete builder contact
>> +     */
>> +    AutoCompleteContactBuilder forField(AutoCompleteContactDetails contactDetail);
>> +
>> +}
>> 
>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactDetails.java
>> ----------------------------------------------------------------------
>> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactDetails.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactDetails.java
>> new file mode 100644
>> index 0000000..e4d5e44
>> --- /dev/null
>> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactDetails.java
>> @@ -0,0 +1,102 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>> + * contributor license agreements.  See the NOTICE file distributed with
>> + * this work for additional information regarding copyright ownership.
>> + * The ASF licenses this file to You under the Apache License, Version 2.0
>> + * (the "License"); you may not use this file except in compliance with
>> + * the License.  You may obtain a copy of the License at
>> + *
>> + *      http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing, software
>> + * distributed under the License is distributed on an "AS IS" BASIS,
>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>> + * See the License for the specific language governing permissions and
>> + * limitations under the License.
>> + */
>> +package org.apache.wicket.markup.html.form;
>> +
>> +/**
>> + * Auto completion contact detail according to the whatwg specification.
>> + *
>> + * @author Tobias Soloschenko
>> + *
>> + * @see <a href=
>> + *      "https://html.spec.whatwg.org/multipage/forms.html">https://html.spec.whatwg.org/multipage/forms.html</a>
>> + *
>> + */
>> +public enum AutoCompleteContactDetails {
>> +
>> +    /**
>> +     * +1 617 253 5702
>> +     */
>> +    TEL("tel"),
>> +
>> +    /**
>> +     * +1
>> +     */
>> +    TEL_COUNTRY_CODE("tel-country-code"),
>> +
>> +    /**
>> +     * 617 253 5702
>> +     */
>> +    TEL_NATIONAL("tel-national"),
>> +
>> +    /**
>> +     * 617
>> +     */
>> +    TEL_AREA_CODE("tel-area-code"),
>> +
>> +    /**
>> +     * 2535702
>> +     */
>> +    TEL_LOCAL("tel-local"),
>> +
>> +    /**
>> +     * 253
>> +     */
>> +    TEL_LOCAL_PREFIX("tel-local-prefix"),
>> +
>> +    /**
>> +     * 5702
>> +     */
>> +    TEL_LOCAL_SUFFIX("tel-local-suffix"),
>> +
>> +    /**
>> +     * 1000
>> +     */
>> +    TEL_EXTENSION("tel-extension"),
>> +
>> +    /**
>> +     * timbl@w3.org
>> +     */
>> +    EMAIL("email"),
>> +
>> +    /**
>> +     * irc://example.org/timbl,isuser
>> +     */
>> +    IMPP("impp");
>> +    
>> +    private String value;
>> +    
>> +    /**
>> +     * Creates an auto completion contact detail with the given value
>> +     *
>> +     * @param value
>> +     *            the value of the contact detail
>> +     */
>> +    private AutoCompleteContactDetails(String value)
>> +    {
>> +        this.value = value;
>> +    }
>> +
>> +    /**
>> +     * Gets the value of the auto completion contact detail
>> +     *
>> +     * @return the value of the auto completion contact detail
>> +     */
>> +    public String getValue()
>> +    {
>> +        return value;
>> +    }
>> +}
>> 
>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteFields.java
>> ----------------------------------------------------------------------
>> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteFields.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteFields.java
>> new file mode 100644
>> index 0000000..8f794c4
>> --- /dev/null
>> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteFields.java
>> @@ -0,0 +1,272 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>> + * contributor license agreements.  See the NOTICE file distributed with
>> + * this work for additional information regarding copyright ownership.
>> + * The ASF licenses this file to You under the Apache License, Version 2.0
>> + * (the "License"); you may not use this file except in compliance with
>> + * the License.  You may obtain a copy of the License at
>> + *
>> + *      http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing, software
>> + * distributed under the License is distributed on an "AS IS" BASIS,
>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>> + * See the License for the specific language governing permissions and
>> + * limitations under the License.
>> + */
>> +package org.apache.wicket.markup.html.form;
>> +
>> +/**
>> + * Auto completion personal data according to the whatwg specification.
>> + *
>> + * @author Tobias Soloschenko
>> + *
>> + * @see <a href=
>> + *      "https://html.spec.whatwg.org/multipage/forms.html">https://html.spec.whatwg.org/multipage/forms.html</a>
>> + *
>> + */
>> +public enum AutoCompleteFields {
>> +
>> +    /**
>> +     * Simply turns on the auto completion
>> +     */
>> +    ON("on"),
>> +
>> +    /**
>> +     * Simply turns off the auto completion
>> +     */
>> +    OFF("off"),
>> +
>> +    /**
>> +     * Sir Timothy John Berners-Lee, OM, KBE, FRS, FREng, FRSA
>> +     */
>> +    NAME("name"),
>> +
>> +    /**
>> +     * Sir
>> +     */
>> +    HONORIFIC_PREFIX("honorific-prefix"),
>> +
>> +    /**
>> +     * Timothy
>> +     */
>> +    GIVEN_NAME("given-name"),
>> +
>> +    /**
>> +     * John
>> +     */
>> +    ADDITIONAL_NAME("additional-name"),
>> +
>> +    /**
>> +     * Berners-Lee
>> +     */
>> +    FAMILY_NAME("family-name"),
>> +
>> +    /**
>> +     * OM, KBE, FRS, FREng, FRSA
>> +     */
>> +    HONORIFIC_SUFFIX("honorific-suffix"),
>> +
>> +    /**
>> +     * Tim
>> +     */
>> +    NICKNAME("nickname"),
>> +
>> +    /**
>> +     * timbl
>> +     */
>> +    USERNAME("username"),
>> +
>> +    /**
>> +     * GUMFXbadyrS3
>> +     */
>> +    NEW_PASSWORD("new-password"),
>> +
>> +    /**
>> +     * qwerty
>> +     */
>> +    CURRENT_PASSWORD("current-password"),
>> +
>> +    /**
>> +     * Professor
>> +     */
>> +    ORGANIZATION_TITLE("organization-title"),
>> +
>> +    /**
>> +     * World Wide Web Consortium
>> +     */
>> +    ORGANIZATION("organization"),
>> +
>> +    /**
>> +     * Multiple lines 32 Vassar Street MIT Room 32-G524
>> +     */
>> +    STREET_ADDRESS("street-address"),
>> +
>> +    /**
>> +     * 32 Vassar Street
>> +     */
>> +    ADDRESS_LINE1("address-line1"),
>> +
>> +    /**
>> +     * MIT Room 32-G524
>> +     */
>> +    ADDRESS_LINE2("address-line2"),
>> +
>> +    /**
>> +     * See {@link AutoComplete.ADRESS_LINE2}
>> +     */
>> +    ADDRESS_LINE3("address-line3"),
>> +
>> +    /**
>> +     * The most fine-grained administrative level, in addresses with four administrative levels
>> +     */
>> +    ADDRESS_LEVEL4("address-level4"),
>> +
>> +    /**
>> +     * The third administrative level, in addresses with three or more administrative levels
>> +     */
>> +    ADDRESS_LEVEL3("address-level3"),
>> +
>> +    /**
>> +     * Cambridge
>> +     */
>> +    ADDRESS_LEVEL2("address-level2"),
>> +
>> +    /**
>> +     * MA
>> +     */
>> +    ADDRESS_LEVEL1("address-level1"),
>> +
>> +    /**
>> +     * US
>> +     */
>> +    COUNTRY("country"),
>> +
>> +    /**
>> +     * US
>> +     */
>> +    COUNTRY_NAME("country-name"),
>> +
>> +    /**
>> +     * 02139
>> +     */
>> +    POSTAL_CODE("postal-code"),
>> +
>> +    /**
>> +     * Tim Berners-Lee
>> +     */
>> +    CC_NAME("cc-name"),
>> +
>> +    /**
>> +     * Tim
>> +     */
>> +    CC_GIVEN_NAME("cc-given-name"),
>> +
>> +    /**
>> +     * -
>> +     */
>> +    CC_ADDITIONAL_NAME("cc-additional-name"),
>> +
>> +    /**
>> +     * Berners-Lee
>> +     */
>> +    CC_FAMILY_NAME("cc-family-name"),
>> +
>> +    /**
>> +     * 4114360123456785
>> +     */
>> +    CC_NUMBER("cc-number"),
>> +
>> +    /**
>> +     * 2014-12
>> +     */
>> +    CC_EXP("cc-exp"),
>> +
>> +    /**
>> +     * 12
>> +     */
>> +    CC_EXP_MONTH("cc-exp-month"),
>> +
>> +    /**
>> +     * 2014
>> +     */
>> +    CC_EXP_YEAR("cc-exp-year"),
>> +
>> +    /**
>> +     * 419
>> +     */
>> +    CC_CSC("cc-csc"),
>> +
>> +    /**
>> +     * Visa
>> +     */
>> +    CC_TYPE("cc-type"),
>> +
>> +    /**
>> +     * GBP
>> +     */
>> +    TRANSACTION_CURRENCY("transaction-currency"),
>> +
>> +    /**
>> +     * 401.00
>> +     */
>> +    TRANSACTION_AMOUNT("transaction-amount"),
>> +
>> +    /**
>> +     * en
>> +     */
>> +    LANGUAGE("language"),
>> +
>> +    /**
>> +     * 1955-06-08
>> +     */
>> +    BDAY("bday"),
>> +
>> +    /**
>> +     * 8
>> +     */
>> +    BDAY_DAY("bday-day"),
>> +
>> +    /**
>> +     * 6
>> +     */
>> +    BDAY_MONTH("bday-month"),
>> +
>> +    /**
>> +     * 1955
>> +     */
>> +    BDAY_YEAR("bday-year"),
>> +
>> +    /**
>> +     * Male
>> +     */
>> +    SEX("sex"),
>> +
>> +    /**
>> +     * https://www.w3.org/People/Berners-Lee/
>> +     */
>> +    URL("url"),
>> +
>> +    /**
>> +     * https://www.w3.org/Press/Stock/Berners-Lee/2001-europaeum-eighth.jpg
>> +     */
>> +    PHOTO("photo");
>> +
>> +    private String value;
>> +
>> +    private AutoCompleteFields(String value)
>> +    {
>> +        this.value = value;
>> +    }
>> +
>> +    /**
>> +     * Gets the value of the auto completion
>> +     *
>> +     * @return the value of the auto completion
>> +     */
>> +    public String getValue()
>> +    {
>> +        return value;
>> +    }
>> +
>> +}
>> 
>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
>> ----------------------------------------------------------------------
>> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
>> index e8b61e7..1d3284a 100644
>> --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
>> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
>> @@ -1352,6 +1352,14 @@ public class Form<T> extends WebMarkupContainer
>>      }
>>        /**
>> +     * Gets the value of the autocomplete attribute. The default behavior is that it is turned off
>> +     * @return AutoCompleteBuilder the builder to generate the autocomplete attribute information
>> +     */
>> +    protected AutoCompleteBuilder getAutoCompleteBuilder(){
>> +        return AutoCompleteBuilder.init().empty();
>> +    }
>> +
>> +    /**
>>       *
>>       * @see org.apache.wicket.Component#getStatelessHint()
>>       */
>> @@ -1633,6 +1641,12 @@ public class Form<T> extends WebMarkupContainer
>>                      setMultiPart(true);
>>                  }
>>              }
>> +
>> +            // Auto completion support
>> +            String autocompleteValue = getAutoCompleteBuilder().toString();
>> +            if(!autocompleteValue.isEmpty()){
>> +                tag.put("autocomplete", autocompleteValue);
>> +            }
>>          }
>>          else
>>          {
>> 
>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/TextField.java
>> ----------------------------------------------------------------------
>> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/TextField.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/TextField.java
>> index 81dc828..719560c 100644
>> --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/TextField.java
>> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/TextField.java
>> @@ -107,6 +107,12 @@ public class TextField<T> extends AbstractTextComponent<T>
>>            tag.put("value", getValue());
>>  +        // Auto completion support
>> +        String autocompleteValue = getAutoCompleteBuilder().toString();
>> +        if(!autocompleteValue.isEmpty()){
>> +            tag.put("autocomplete", autocompleteValue);
>> +        }
>> +
>>          // Default handling for component tag
>>          super.onComponentTag(tag);
>>      }
>> @@ -121,4 +127,12 @@ public class TextField<T> extends AbstractTextComponent<T>
>>      {
>>          return null;
>>      }
>> +
>> +    /**
>> +     * Gets the value of the autocomplete attribute. The default behavior is that it is turned off
>> +     * @return AutoCompleteBuilder the builder to generate the autocomplete attribute information
>> +     */
>> +    protected AutoCompleteBuilder getAutoCompleteBuilder(){
>> +        return AutoCompleteBuilder.init().empty();
>> +    }
>>  }
>> 
>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormTest.java
>> ----------------------------------------------------------------------
>> diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormTest.java
>> index 05344a5..2ee420a 100644
>> --- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormTest.java
>> +++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormTest.java
>> @@ -53,6 +53,39 @@ public class FormTest extends WicketTestCase
>>          };
>>      }
>>  +    /**
>> +     * Test auto complete functionality
>> +     */
>> +    @Test
>> +    public void testAutoComplete(){
>> +        class TestPage extends WebPage implements IMarkupResourceStreamProvider
>> +        {
>> +            boolean shouldFail, submit, error;
>> +
>> +            public TestPage()
>> +            {
>> +                add(new Form<Void>("form")
>> +                {
>> +                    @Override
>> +                    protected AutoCompleteBuilder getAutoCompleteBuilder()
>> +                    {
>> +                        return AutoCompleteBuilder.init().forAddressType(AutoCompleteAddressType.BILLING).forField(AutoCompleteFields.GIVEN_NAME);
>> +                    }
>> +                });
>> +            }
>> +
>> +            @Override
>> +            public IResourceStream getMarkupResourceStream(final MarkupContainer container,
>> +                Class<?> containerClass)
>> +            {
>> +                return new StringResourceStream("<form wicket:id='form'></form>");
>> +            }
>> +        }
>> +        
>> +        TestPage testPage = new TestPage();
>> +        tester.startPage(testPage);
>> +        assertTrue(tester.getLastResponseAsString().contains("autocomplete=\"billing given-name\""));
>> +    }
>>        /**
>>       * @throws Exception
>> @@ -115,6 +148,12 @@ public class FormTest extends WicketTestCase
>>                      {
>>                          error = true;
>>                      }
>> +                    
>> +                    @Override
>> +                    protected AutoCompleteBuilder getAutoCompleteBuilder()
>> +                    {
>> +                        return AutoCompleteBuilder.init().forAddressType(AutoCompleteAddressType.BILLING).forField(AutoCompleteFields.GIVEN_NAME);
>> +                    }
>>                  });
>>              }
>>  
>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/test/java/org/apache/wicket/markup/html/form/TextFieldTest.java
>> ----------------------------------------------------------------------
>> diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/TextFieldTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/TextFieldTest.java
>> index 5af5917..2c215e5 100644
>> --- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/TextFieldTest.java
>> +++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/TextFieldTest.java
>> @@ -36,7 +36,20 @@ import org.junit.Test;
>>   */
>>  public class TextFieldTest extends WicketTestCase
>>  {
>> -    /** */
>> +    
>> +    /**
>> +     * Test auto complete feature
>> +     */
>> +    @Test
>> +    public void testAutoComplete(){
>> +        TestPage testPage = new TestPage();
>> +        tester.startPage(testPage);
>> +        assertTrue(tester.getLastResponseAsString().contains("autocomplete=\"section-blue billing name\""));
>> +    }
>> +
>> +    /**
>> +     * Test that inputs are converted to null
>> +     * */
>>      @Test
>>      public void emptyInputConvertedToNull()
>>      {
>> @@ -111,7 +124,13 @@ public class TextFieldTest extends WicketTestCase
>>          public TestPage()
>>          {
>>              add(form = new Form<>("form"));
>> -            form.add(textField = new TextField<>("text", textModel));
>> +            form.add(textField = new TextField<String>("text", textModel){
>> +                @Override
>> +                protected AutoCompleteBuilder getAutoCompleteBuilder()
>> +                {
>> +                    return AutoCompleteBuilder.init().withSection("blue").forAddressType(AutoCompleteAddressType.BILLING).forField(AutoCompleteFields.NAME);
>> +                }
>> +            });
>>          }
>>            @Override
>> 
> 

Re: wicket git commit: WICKET-6299

Posted by Sven Meier <sv...@meiers.net>.
Hi,

your builder is wrong :P

- It allows setting a contact detail field without contact:

AutoCompleteBuilder.init().forField(AutoCompleteContactDetails.TEL);

- AutoCompleteContactBuilder#forField() has the wrong return type:

   // does not compile since AutoCompleteContactBuilder is no 
AutoCompleteBuilder
   return 
AutoCompleteBuilder.init().forContact(AutoCompleteContact.HOME).forField(AutoCompleteContactDetails.TEL);

Tbh I find it over the top to add an API to build a string defined in a 
"living standard".

When I read whatwg correctly, the "autocomplete" attribute can be used 
on hidden input, textarea and select too.
Instead of adding factory methods all over the place, I'd rather have a 
behavior for this. We could move it to extensions, freeing 
org.apache.wicket.markup.html.form from 6 new source files.

Regards
Sven	


On 20.12.2016 20:19, tsoloschenko@apache.org wrote:
> Repository: wicket
> Updated Branches:
>    refs/heads/master aedb98764 -> bcd55813b
>
>
> WICKET-6299
>
> Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
> Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/bcd55813
> Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/bcd55813
> Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/bcd55813
>
> Branch: refs/heads/master
> Commit: bcd55813b3afbccb5675096930aee6281c5cba3a
> Parents: aedb987
> Author: Tobias Soloschenko <ts...@apache.org>
> Authored: Tue Dec 20 20:15:42 2016 +0100
> Committer: Tobias Soloschenko <ts...@apache.org>
> Committed: Tue Dec 20 20:15:42 2016 +0100
>
> ----------------------------------------------------------------------
>   .../html/form/AutoCompleteAddressType.java      |  56 ++++
>   .../markup/html/form/AutoCompleteBuilder.java   | 170 ++++++++++++
>   .../markup/html/form/AutoCompleteContact.java   |  77 ++++++
>   .../html/form/AutoCompleteContactBuilder.java   |  38 +++
>   .../html/form/AutoCompleteContactDetails.java   | 102 +++++++
>   .../markup/html/form/AutoCompleteFields.java    | 272 +++++++++++++++++++
>   .../apache/wicket/markup/html/form/Form.java    |  14 +
>   .../wicket/markup/html/form/TextField.java      |  14 +
>   .../wicket/markup/html/form/FormTest.java       |  39 +++
>   .../wicket/markup/html/form/TextFieldTest.java  |  23 +-
>   10 files changed, 803 insertions(+), 2 deletions(-)
> ----------------------------------------------------------------------
>
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteAddressType.java
> ----------------------------------------------------------------------
> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteAddressType.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteAddressType.java
> new file mode 100644
> index 0000000..6123053
> --- /dev/null
> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteAddressType.java
> @@ -0,0 +1,56 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements.  See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You under the Apache License, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License.  You may obtain a copy of the License at
> + *
> + *      http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +package org.apache.wicket.markup.html.form;
> +
> +/**
> + * Auto completion address type according to the whatwg specification.
> + *
> + * @author Tobias Soloschenko
> + *
> + * @see <a href=
> + *      "https://html.spec.whatwg.org/multipage/forms.html">https://html.spec.whatwg.org/multipage/forms.html</a>
> + *
> + */
> +public enum AutoCompleteAddressType {
> +
> +	/**
> +	 * Meaning the field is part of the shipping address or contact information
> +	 */
> +	SHIPPING("shipping"),
> +
> +	/**
> +	 * meaning the field is part of the billing address or contact information
> +	 */
> +	BILLING("billing");
> +
> +	private String value;
> +
> +	private AutoCompleteAddressType(String value)
> +	{
> +		this.value = value;
> +	}
> +
> +	/**
> +	 * Gets the address type value
> +	 *
> +	 * @return the value of the address type
> +	 */
> +	public String getValue()
> +	{
> +		return value;
> +	}
> +}
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteBuilder.java
> ----------------------------------------------------------------------
> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteBuilder.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteBuilder.java
> new file mode 100644
> index 0000000..a3b64cd
> --- /dev/null
> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteBuilder.java
> @@ -0,0 +1,170 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements.  See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You under the Apache License, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License.  You may obtain a copy of the License at
> + *
> + *      http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +package org.apache.wicket.markup.html.form;
> +
> +/**
> + * The auto complete builder is used to build the corresponding attribute for form and input tags.
> + * To use the auto completion just open the autofill options within your browser. In chrome for
> + * example it is accessed with the following URL:
> + * <a href="chrome://settings/autofillEditAddress">chrome://settings/autofillEditAddress</a>
> + *
> + * @author Tobias Soloschenko
> + *
> + * @since 8.0.0
> + *
> + */
> +public class AutoCompleteBuilder implements AutoCompleteContactBuilder
> +{
> +	/**
> +	 * The section prefix specificed by the whatwg standard
> +	 */
> +	public static final String SECTION_PREFIX = "section-";
> +
> +	private String sectionName;
> +
> +	private AutoCompleteAddressType addressType;
> +
> +	private AutoCompleteFields field;
> +
> +	private AutoCompleteContact contact;
> +
> +	private AutoCompleteContactDetails contactDetail;
> +
> +	private boolean empty;
> +
> +	/**
> +	 * Initializes a new auto complete builder
> +	 *
> +	 * @return the auto complete builder
> +	 */
> +	public static AutoCompleteBuilder init()
> +	{
> +		return new AutoCompleteBuilder();
> +	}
> +
> +	/**
> +	 * Empties out the autocomplete outcome
> +	 *
> +	 * @return the auto complete builder
> +	 */
> +	public AutoCompleteBuilder empty()
> +	{
> +		this.empty = true;
> +		return this;
> +	}
> +
> +	/**
> +	 * Applies a section to the auto completion field
> +	 *
> +	 * @param sectionName
> +	 *            the name of the section
> +	 * @return the auto complete builder itself
> +	 */
> +	public AutoCompleteBuilder withSection(String sectionName)
> +	{
> +		this.sectionName = sectionName;
> +		return this;
> +	}
> +
> +	/**
> +	 * Assigns the auto completion to a specific address type
> +	 *
> +	 * @param addressType
> +	 *            the auto completion address type
> +	 * @return the auto complete builder itself
> +	 */
> +	public AutoCompleteBuilder forAddressType(AutoCompleteAddressType addressType)
> +	{
> +		this.addressType = addressType;
> +		return this;
> +	}
> +
> +	/**
> +	 * Applies the field to the autocomplete attribute
> +	 *
> +	 * @param field
> +	 *            the field
> +	 * @return the auto complete builder
> +	 */
> +	public AutoCompleteBuilder forField(AutoCompleteFields field)
> +	{
> +		this.field = field;
> +		return this;
> +	}
> +
> +	/**
> +	 * Applies the contact information to the autocomplete attribute
> +	 *
> +	 * @param contact
> +	 *            the contact information are going to be applied to
> +	 * @return the auto complete builder
> +	 */
> +	public AutoCompleteContactBuilder forContact(AutoCompleteContact contact)
> +	{
> +		this.contact = contact;
> +		return this;
> +	}
> +
> +	/**
> +	 * @see {@link AutoCompleteContactBuilder}
> +	 */
> +	@Override
> +	public AutoCompleteContactBuilder forField(AutoCompleteContactDetails contactDetail)
> +	{
> +		this.contactDetail = contactDetail;
> +		return (AutoCompleteContactBuilder)this;
> +	}
> +
> +	/**
> +	 * Builds the attribute string
> +	 *
> +	 * @return the attribute content in the right order
> +	 */
> +	@Override
> +	public String toString()
> +	{
> +		StringBuilder stringBuilder = new StringBuilder();
> +		if (!empty)
> +		{
> +			if (sectionName != null)
> +			{
> +				stringBuilder.append(SECTION_PREFIX);
> +				stringBuilder.append(sectionName);
> +				stringBuilder.append(" ");
> +			}
> +			if (addressType != null)
> +			{
> +				stringBuilder.append(addressType.getValue());
> +				stringBuilder.append(" ");
> +			}
> +			if (field != null)
> +			{
> +				stringBuilder.append(field.getValue());
> +			}
> +			else
> +			{
> +				if (contact != null)
> +				{
> +					stringBuilder.append(contact.getValue());
> +					stringBuilder.append(" ");
> +				}
> +				stringBuilder.append(contactDetail.getValue());
> +			}
> +		}
> +		return stringBuilder.toString();
> +	}
> +}
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContact.java
> ----------------------------------------------------------------------
> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContact.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContact.java
> new file mode 100644
> index 0000000..cbf86a5
> --- /dev/null
> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContact.java
> @@ -0,0 +1,77 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements.  See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You under the Apache License, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License.  You may obtain a copy of the License at
> + *
> + *      http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +package org.apache.wicket.markup.html.form;
> +
> +/**
> + * Auto completion contact according to the whatwg specification.
> + *
> + * @author Tobias Soloschenko
> + *
> + * @see <a href=
> + *      "https://html.spec.whatwg.org/multipage/forms.html">https://html.spec.whatwg.org/multipage/forms.html</a>
> + *
> + */
> +public enum AutoCompleteContact {
> +
> +	/**
> +	 * meaning the field is for contacting someone at their residence
> +	 */
> +	HOME("home"),
> +
> +	/**
> +	 * meaning the field is for contacting someone at their workplace
> +	 */
> +	WORK("work"),
> +
> +	/**
> +	 * meaning the field is for contacting someone regardless of location
> +	 */
> +	MOBILE("mobile"),
> +
> +	/**
> +	 * meaning the field describes a fax machine's contact details
> +	 */
> +	FAX("fax"),
> +
> +	/**
> +	 * meaning the field describes a pager's or beeper's contact details
> +	 */
> +	PAGER("pager");
> +
> +	private String value;
> +
> +	/**
> +	 * Creates an auto completion contact with the given value
> +	 *
> +	 * @param value
> +	 *            the value of the contact
> +	 */
> +	private AutoCompleteContact(String value)
> +	{
> +		this.value = value;
> +	}
> +
> +	/**
> +	 * Gets the value of the auto completion contact
> +	 *
> +	 * @return the value of the auto completion contact
> +	 */
> +	public String getValue()
> +	{
> +		return value;
> +	}
> +}
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactBuilder.java
> ----------------------------------------------------------------------
> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactBuilder.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactBuilder.java
> new file mode 100644
> index 0000000..07324ff
> --- /dev/null
> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactBuilder.java
> @@ -0,0 +1,38 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements.  See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You under the Apache License, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License.  You may obtain a copy of the License at
> + *
> + *      http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +package org.apache.wicket.markup.html.form;
> +
> +/**
> + * The auto complete contact builder shrinks down the possibilities to the contact details
> + *
> + * @author Tobias Soloschenko
> + *
> + * @since 8.0.0
> + *
> + */
> +public interface AutoCompleteContactBuilder
> +{
> +	/**
> +	 * Applies the contact details information to the auto complete field
> +	 *
> +	 * @param contactDetail
> +	 *            the contact detail
> +	 * @return the auto complete builder contact
> +	 */
> +	AutoCompleteContactBuilder forField(AutoCompleteContactDetails contactDetail);
> +
> +}
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactDetails.java
> ----------------------------------------------------------------------
> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactDetails.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactDetails.java
> new file mode 100644
> index 0000000..e4d5e44
> --- /dev/null
> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContactDetails.java
> @@ -0,0 +1,102 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements.  See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You under the Apache License, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License.  You may obtain a copy of the License at
> + *
> + *      http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +package org.apache.wicket.markup.html.form;
> +
> +/**
> + * Auto completion contact detail according to the whatwg specification.
> + *
> + * @author Tobias Soloschenko
> + *
> + * @see <a href=
> + *      "https://html.spec.whatwg.org/multipage/forms.html">https://html.spec.whatwg.org/multipage/forms.html</a>
> + *
> + */
> +public enum AutoCompleteContactDetails {
> +
> +	/**
> +	 * +1 617 253 5702
> +	 */
> +	TEL("tel"),
> +
> +	/**
> +	 * +1
> +	 */
> +	TEL_COUNTRY_CODE("tel-country-code"),
> +
> +	/**
> +	 * 617 253 5702
> +	 */
> +	TEL_NATIONAL("tel-national"),
> +
> +	/**
> +	 * 617
> +	 */
> +	TEL_AREA_CODE("tel-area-code"),
> +
> +	/**
> +	 * 2535702
> +	 */
> +	TEL_LOCAL("tel-local"),
> +
> +	/**
> +	 * 253
> +	 */
> +	TEL_LOCAL_PREFIX("tel-local-prefix"),
> +
> +	/**
> +	 * 5702
> +	 */
> +	TEL_LOCAL_SUFFIX("tel-local-suffix"),
> +
> +	/**
> +	 * 1000
> +	 */
> +	TEL_EXTENSION("tel-extension"),
> +
> +	/**
> +	 * timbl@w3.org
> +	 */
> +	EMAIL("email"),
> +
> +	/**
> +	 * irc://example.org/timbl,isuser
> +	 */
> +	IMPP("impp");
> +	
> +	private String value;
> +	
> +	/**
> +	 * Creates an auto completion contact detail with the given value
> +	 *
> +	 * @param value
> +	 *            the value of the contact detail
> +	 */
> +	private AutoCompleteContactDetails(String value)
> +	{
> +		this.value = value;
> +	}
> +
> +	/**
> +	 * Gets the value of the auto completion contact detail
> +	 *
> +	 * @return the value of the auto completion contact detail
> +	 */
> +	public String getValue()
> +	{
> +		return value;
> +	}
> +}
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteFields.java
> ----------------------------------------------------------------------
> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteFields.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteFields.java
> new file mode 100644
> index 0000000..8f794c4
> --- /dev/null
> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteFields.java
> @@ -0,0 +1,272 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements.  See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You under the Apache License, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License.  You may obtain a copy of the License at
> + *
> + *      http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +package org.apache.wicket.markup.html.form;
> +
> +/**
> + * Auto completion personal data according to the whatwg specification.
> + *
> + * @author Tobias Soloschenko
> + *
> + * @see <a href=
> + *      "https://html.spec.whatwg.org/multipage/forms.html">https://html.spec.whatwg.org/multipage/forms.html</a>
> + *
> + */
> +public enum AutoCompleteFields {
> +
> +	/**
> +	 * Simply turns on the auto completion
> +	 */
> +	ON("on"),
> +
> +	/**
> +	 * Simply turns off the auto completion
> +	 */
> +	OFF("off"),
> +
> +	/**
> +	 * Sir Timothy John Berners-Lee, OM, KBE, FRS, FREng, FRSA
> +	 */
> +	NAME("name"),
> +
> +	/**
> +	 * Sir
> +	 */
> +	HONORIFIC_PREFIX("honorific-prefix"),
> +
> +	/**
> +	 * Timothy
> +	 */
> +	GIVEN_NAME("given-name"),
> +
> +	/**
> +	 * John
> +	 */
> +	ADDITIONAL_NAME("additional-name"),
> +
> +	/**
> +	 * Berners-Lee
> +	 */
> +	FAMILY_NAME("family-name"),
> +
> +	/**
> +	 * OM, KBE, FRS, FREng, FRSA
> +	 */
> +	HONORIFIC_SUFFIX("honorific-suffix"),
> +
> +	/**
> +	 * Tim
> +	 */
> +	NICKNAME("nickname"),
> +
> +	/**
> +	 * timbl
> +	 */
> +	USERNAME("username"),
> +
> +	/**
> +	 * GUMFXbadyrS3
> +	 */
> +	NEW_PASSWORD("new-password"),
> +
> +	/**
> +	 * qwerty
> +	 */
> +	CURRENT_PASSWORD("current-password"),
> +
> +	/**
> +	 * Professor
> +	 */
> +	ORGANIZATION_TITLE("organization-title"),
> +
> +	/**
> +	 * World Wide Web Consortium
> +	 */
> +	ORGANIZATION("organization"),
> +
> +	/**
> +	 * Multiple lines 32 Vassar Street MIT Room 32-G524
> +	 */
> +	STREET_ADDRESS("street-address"),
> +
> +	/**
> +	 * 32 Vassar Street
> +	 */
> +	ADDRESS_LINE1("address-line1"),
> +
> +	/**
> +	 * MIT Room 32-G524
> +	 */
> +	ADDRESS_LINE2("address-line2"),
> +
> +	/**
> +	 * See {@link AutoComplete.ADRESS_LINE2}
> +	 */
> +	ADDRESS_LINE3("address-line3"),
> +
> +	/**
> +	 * The most fine-grained administrative level, in addresses with four administrative levels
> +	 */
> +	ADDRESS_LEVEL4("address-level4"),
> +
> +	/**
> +	 * The third administrative level, in addresses with three or more administrative levels
> +	 */
> +	ADDRESS_LEVEL3("address-level3"),
> +
> +	/**
> +	 * Cambridge
> +	 */
> +	ADDRESS_LEVEL2("address-level2"),
> +
> +	/**
> +	 * MA
> +	 */
> +	ADDRESS_LEVEL1("address-level1"),
> +
> +	/**
> +	 * US
> +	 */
> +	COUNTRY("country"),
> +
> +	/**
> +	 * US
> +	 */
> +	COUNTRY_NAME("country-name"),
> +
> +	/**
> +	 * 02139
> +	 */
> +	POSTAL_CODE("postal-code"),
> +
> +	/**
> +	 * Tim Berners-Lee
> +	 */
> +	CC_NAME("cc-name"),
> +
> +	/**
> +	 * Tim
> +	 */
> +	CC_GIVEN_NAME("cc-given-name"),
> +
> +	/**
> +	 * -
> +	 */
> +	CC_ADDITIONAL_NAME("cc-additional-name"),
> +
> +	/**
> +	 * Berners-Lee
> +	 */
> +	CC_FAMILY_NAME("cc-family-name"),
> +
> +	/**
> +	 * 4114360123456785
> +	 */
> +	CC_NUMBER("cc-number"),
> +
> +	/**
> +	 * 2014-12
> +	 */
> +	CC_EXP("cc-exp"),
> +
> +	/**
> +	 * 12
> +	 */
> +	CC_EXP_MONTH("cc-exp-month"),
> +
> +	/**
> +	 * 2014
> +	 */
> +	CC_EXP_YEAR("cc-exp-year"),
> +
> +	/**
> +	 * 419
> +	 */
> +	CC_CSC("cc-csc"),
> +
> +	/**
> +	 * Visa
> +	 */
> +	CC_TYPE("cc-type"),
> +
> +	/**
> +	 * GBP
> +	 */
> +	TRANSACTION_CURRENCY("transaction-currency"),
> +
> +	/**
> +	 * 401.00
> +	 */
> +	TRANSACTION_AMOUNT("transaction-amount"),
> +
> +	/**
> +	 * en
> +	 */
> +	LANGUAGE("language"),
> +
> +	/**
> +	 * 1955-06-08
> +	 */
> +	BDAY("bday"),
> +
> +	/**
> +	 * 8
> +	 */
> +	BDAY_DAY("bday-day"),
> +
> +	/**
> +	 * 6
> +	 */
> +	BDAY_MONTH("bday-month"),
> +
> +	/**
> +	 * 1955
> +	 */
> +	BDAY_YEAR("bday-year"),
> +
> +	/**
> +	 * Male
> +	 */
> +	SEX("sex"),
> +
> +	/**
> +	 * https://www.w3.org/People/Berners-Lee/
> +	 */
> +	URL("url"),
> +
> +	/**
> +	 * https://www.w3.org/Press/Stock/Berners-Lee/2001-europaeum-eighth.jpg
> +	 */
> +	PHOTO("photo");
> +
> +	private String value;
> +
> +	private AutoCompleteFields(String value)
> +	{
> +		this.value = value;
> +	}
> +
> +	/**
> +	 * Gets the value of the auto completion
> +	 *
> +	 * @return the value of the auto completion
> +	 */
> +	public String getValue()
> +	{
> +		return value;
> +	}
> +
> +}
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
> ----------------------------------------------------------------------
> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
> index e8b61e7..1d3284a 100644
> --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
> @@ -1352,6 +1352,14 @@ public class Form<T> extends WebMarkupContainer
>   	}
>   
>   	/**
> +	 * Gets the value of the autocomplete attribute. The default behavior is that it is turned off
> +	 * @return AutoCompleteBuilder the builder to generate the autocomplete attribute information
> +	 */
> +	protected AutoCompleteBuilder getAutoCompleteBuilder(){
> +		return AutoCompleteBuilder.init().empty();
> +	}
> +
> +	/**
>   	 *
>   	 * @see org.apache.wicket.Component#getStatelessHint()
>   	 */
> @@ -1633,6 +1641,12 @@ public class Form<T> extends WebMarkupContainer
>   					setMultiPart(true);
>   				}
>   			}
> +
> +			// Auto completion support
> +			String autocompleteValue = getAutoCompleteBuilder().toString();
> +			if(!autocompleteValue.isEmpty()){
> +				tag.put("autocomplete", autocompleteValue);
> +			}
>   		}
>   		else
>   		{
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/main/java/org/apache/wicket/markup/html/form/TextField.java
> ----------------------------------------------------------------------
> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/TextField.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/TextField.java
> index 81dc828..719560c 100644
> --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/TextField.java
> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/TextField.java
> @@ -107,6 +107,12 @@ public class TextField<T> extends AbstractTextComponent<T>
>   
>   		tag.put("value", getValue());
>   
> +		// Auto completion support
> +		String autocompleteValue = getAutoCompleteBuilder().toString();
> +		if(!autocompleteValue.isEmpty()){
> +			tag.put("autocomplete", autocompleteValue);
> +		}
> +
>   		// Default handling for component tag
>   		super.onComponentTag(tag);
>   	}
> @@ -121,4 +127,12 @@ public class TextField<T> extends AbstractTextComponent<T>
>   	{
>   		return null;
>   	}
> +
> +	/**
> +	 * Gets the value of the autocomplete attribute. The default behavior is that it is turned off
> +	 * @return AutoCompleteBuilder the builder to generate the autocomplete attribute information
> +	 */
> +	protected AutoCompleteBuilder getAutoCompleteBuilder(){
> +		return AutoCompleteBuilder.init().empty();
> +	}
>   }
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormTest.java
> ----------------------------------------------------------------------
> diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormTest.java
> index 05344a5..2ee420a 100644
> --- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormTest.java
> +++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormTest.java
> @@ -53,6 +53,39 @@ public class FormTest extends WicketTestCase
>   		};
>   	}
>   
> +	/**
> +	 * Test auto complete functionality
> +	 */
> +	@Test
> +	public void testAutoComplete(){
> +		class TestPage extends WebPage implements IMarkupResourceStreamProvider
> +		{
> +			boolean shouldFail, submit, error;
> +
> +			public TestPage()
> +			{
> +				add(new Form<Void>("form")
> +				{
> +					@Override
> +					protected AutoCompleteBuilder getAutoCompleteBuilder()
> +					{
> +						return AutoCompleteBuilder.init().forAddressType(AutoCompleteAddressType.BILLING).forField(AutoCompleteFields.GIVEN_NAME);
> +					}
> +				});
> +			}
> +
> +			@Override
> +			public IResourceStream getMarkupResourceStream(final MarkupContainer container,
> +				Class<?> containerClass)
> +			{
> +				return new StringResourceStream("<form wicket:id='form'></form>");
> +			}
> +		}
> +		
> +		TestPage testPage = new TestPage();
> +		tester.startPage(testPage);
> +		assertTrue(tester.getLastResponseAsString().contains("autocomplete=\"billing given-name\""));
> +	}
>   
>   	/**
>   	 * @throws Exception
> @@ -115,6 +148,12 @@ public class FormTest extends WicketTestCase
>   					{
>   						error = true;
>   					}
> +					
> +					@Override
> +					protected AutoCompleteBuilder getAutoCompleteBuilder()
> +					{
> +						return AutoCompleteBuilder.init().forAddressType(AutoCompleteAddressType.BILLING).forField(AutoCompleteFields.GIVEN_NAME);
> +					}
>   				});
>   			}
>   
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/wicket-core/src/test/java/org/apache/wicket/markup/html/form/TextFieldTest.java
> ----------------------------------------------------------------------
> diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/TextFieldTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/TextFieldTest.java
> index 5af5917..2c215e5 100644
> --- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/TextFieldTest.java
> +++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/TextFieldTest.java
> @@ -36,7 +36,20 @@ import org.junit.Test;
>    */
>   public class TextFieldTest extends WicketTestCase
>   {
> -	/** */
> +	
> +	/**
> +	 * Test auto complete feature
> +	 */
> +	@Test
> +	public void testAutoComplete(){
> +		TestPage testPage = new TestPage();
> +		tester.startPage(testPage);
> +		assertTrue(tester.getLastResponseAsString().contains("autocomplete=\"section-blue billing name\""));
> +	}
> +
> +	/**
> +	 * Test that inputs are converted to null
> +	 * */
>   	@Test
>   	public void emptyInputConvertedToNull()
>   	{
> @@ -111,7 +124,13 @@ public class TextFieldTest extends WicketTestCase
>   		public TestPage()
>   		{
>   			add(form = new Form<>("form"));
> -			form.add(textField = new TextField<>("text", textModel));
> +			form.add(textField = new TextField<String>("text", textModel){
> +				@Override
> +				protected AutoCompleteBuilder getAutoCompleteBuilder()
> +				{
> +					return AutoCompleteBuilder.init().withSection("blue").forAddressType(AutoCompleteAddressType.BILLING).forField(AutoCompleteFields.NAME);
> +				}
> +			});
>   		}
>   
>   		@Override
>


Re: wicket git commit: WICKET-6299

Posted by Martin Grigorov <mg...@apache.org>.
And the formitting is not Wicket's one.
E.g. the opening { should be on the next line.

Martin Grigorov
Wicket Training and Consulting
https://twitter.com/mtgrigorov

On Wed, Dec 21, 2016 at 9:14 AM, Martin Grigorov <mg...@apache.org>
wrote:

> Hi Tobias,
>
> Some feedback inline:
>
> On Tue, Dec 20, 2016 at 8:19 PM, <ts...@apache.org> wrote:
>
>> Repository: wicket
>> Updated Branches:
>>   refs/heads/master aedb98764 -> bcd55813b
>>
>>
>> WICKET-6299
>>
>> Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
>> Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/bcd55813
>> Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/bcd55813
>> Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/bcd55813
>>
>> Branch: refs/heads/master
>> Commit: bcd55813b3afbccb5675096930aee6281c5cba3a
>> Parents: aedb987
>> Author: Tobias Soloschenko <ts...@apache.org>
>> Authored: Tue Dec 20 20:15:42 2016 +0100
>> Committer: Tobias Soloschenko <ts...@apache.org>
>> Committed: Tue Dec 20 20:15:42 2016 +0100
>>
>> ----------------------------------------------------------------------
>>  .../html/form/AutoCompleteAddressType.java      |  56 ++++
>>  .../markup/html/form/AutoCompleteBuilder.java   | 170 ++++++++++++
>>  .../markup/html/form/AutoCompleteContact.java   |  77 ++++++
>>  .../html/form/AutoCompleteContactBuilder.java   |  38 +++
>>  .../html/form/AutoCompleteContactDetails.java   | 102 +++++++
>>  .../markup/html/form/AutoCompleteFields.java    | 272
>> +++++++++++++++++++
>>  .../apache/wicket/markup/html/form/Form.java    |  14 +
>>  .../wicket/markup/html/form/TextField.java      |  14 +
>>  .../wicket/markup/html/form/FormTest.java       |  39 +++
>>  .../wicket/markup/html/form/TextFieldTest.java  |  23 +-
>>  10 files changed, 803 insertions(+), 2 deletions(-)
>> ----------------------------------------------------------------------
>>
>>
>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
>> wicket-core/src/main/java/org/apache/wicket/markup/html/form
>> /AutoCompleteAddressType.java
>> ----------------------------------------------------------------------
>> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/AutoCompleteAddressType.java b/wicket-core/src/main/java/or
>> g/apache/wicket/markup/html/form/AutoCompleteAddressType.java
>> new file mode 100644
>> index 0000000..6123053
>> --- /dev/null
>> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/AutoCompleteAddressType.java
>> @@ -0,0 +1,56 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>> + * contributor license agreements.  See the NOTICE file distributed with
>> + * this work for additional information regarding copyright ownership.
>> + * The ASF licenses this file to You under the Apache License, Version
>> 2.0
>> + * (the "License"); you may not use this file except in compliance with
>> + * the License.  You may obtain a copy of the License at
>> + *
>> + *      http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing, software
>> + * distributed under the License is distributed on an "AS IS" BASIS,
>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>> implied.
>> + * See the License for the specific language governing permissions and
>> + * limitations under the License.
>> + */
>> +package org.apache.wicket.markup.html.form;
>> +
>> +/**
>> + * Auto completion address type according to the whatwg specification.
>> + *
>> + * @author Tobias Soloschenko
>> + *
>> + * @see <a href=
>> + *      "https://html.spec.whatwg.org/multipage/forms.html">https://
>> html.spec.whatwg.org/multipage/forms.html</a>
>> + *
>> + */
>> +public enum AutoCompleteAddressType {
>> +
>> +       /**
>> +        * Meaning the field is part of the shipping address or contact
>> information
>> +        */
>> +       SHIPPING("shipping"),
>> +
>> +       /**
>> +        * meaning the field is part of the billing address or contact
>> information
>> +        */
>> +       BILLING("billing");
>> +
>> +       private String value;
>> +
>> +       private AutoCompleteAddressType(String value)
>> +       {
>> +               this.value = value;
>> +       }
>> +
>> +       /**
>> +        * Gets the address type value
>> +        *
>> +        * @return the value of the address type
>> +        */
>> +       public String getValue()
>> +       {
>> +               return value;
>> +       }
>> +}
>>
>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
>> wicket-core/src/main/java/org/apache/wicket/markup/html/form
>> /AutoCompleteBuilder.java
>> ----------------------------------------------------------------------
>> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteBuilder.java
>> b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/AutoCompleteBuilder.java
>> new file mode 100644
>> index 0000000..a3b64cd
>> --- /dev/null
>> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/AutoCompleteBuilder.java
>> @@ -0,0 +1,170 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>> + * contributor license agreements.  See the NOTICE file distributed with
>> + * this work for additional information regarding copyright ownership.
>> + * The ASF licenses this file to You under the Apache License, Version
>> 2.0
>> + * (the "License"); you may not use this file except in compliance with
>> + * the License.  You may obtain a copy of the License at
>> + *
>> + *      http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing, software
>> + * distributed under the License is distributed on an "AS IS" BASIS,
>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>> implied.
>> + * See the License for the specific language governing permissions and
>> + * limitations under the License.
>> + */
>> +package org.apache.wicket.markup.html.form;
>> +
>> +/**
>> + * The auto complete builder is used to build the corresponding
>> attribute for form and input tags.
>> + * To use the auto completion just open the autofill options within your
>> browser. In chrome for
>> + * example it is accessed with the following URL:
>> + * <a href="chrome://settings/autofillEditAddress">chrome://settin
>> gs/autofillEditAddress</a>
>> + *
>> + * @author Tobias Soloschenko
>> + *
>> + * @since 8.0.0
>> + *
>> + */
>> +public class AutoCompleteBuilder implements AutoCompleteContactBuilder
>> +{
>> +       /**
>> +        * The section prefix specificed by the whatwg standard
>> +        */
>> +       public static final String SECTION_PREFIX = "section-";
>> +
>> +       private String sectionName;
>> +
>> +       private AutoCompleteAddressType addressType;
>> +
>> +       private AutoCompleteFields field;
>> +
>> +       private AutoCompleteContact contact;
>> +
>> +       private AutoCompleteContactDetails contactDetail;
>> +
>> +       private boolean empty;
>> +
>> +       /**
>> +        * Initializes a new auto complete builder
>> +        *
>> +        * @return the auto complete builder
>> +        */
>> +       public static AutoCompleteBuilder init()
>> +       {
>> +               return new AutoCompleteBuilder();
>> +       }
>> +
>> +       /**
>> +        * Empties out the autocomplete outcome
>> +        *
>> +        * @return the auto complete builder
>> +        */
>> +       public AutoCompleteBuilder empty()
>> +       {
>> +               this.empty = true;
>>
>
> The way 'empty' works seems incomplete.
> Each `with**` method should set it to 'false'.
>
>
>> +               return this;
>> +       }
>> +
>> +       /**
>> +        * Applies a section to the auto completion field
>> +        *
>> +        * @param sectionName
>> +        *            the name of the section
>> +        * @return the auto complete builder itself
>> +        */
>> +       public AutoCompleteBuilder withSection(String sectionName)
>> +       {
>> +               this.sectionName = sectionName;
>>
>
> Such assignments need check for non-emptiness.
> If the value is "" then it will pass the check for '!= null' in toString()
> and produce wrong output.
>
>
>> +               return this;
>> +       }
>> +
>> +       /**
>> +        * Assigns the auto completion to a specific address type
>> +        *
>> +        * @param addressType
>> +        *            the auto completion address type
>> +        * @return the auto complete builder itself
>> +        */
>> +       public AutoCompleteBuilder forAddressType(AutoCompleteAddressType
>> addressType)
>> +       {
>> +               this.addressType = addressType;
>> +               return this;
>> +       }
>> +
>> +       /**
>> +        * Applies the field to the autocomplete attribute
>> +        *
>> +        * @param field
>> +        *            the field
>> +        * @return the auto complete builder
>> +        */
>> +       public AutoCompleteBuilder forField(AutoCompleteFields field)
>> +       {
>> +               this.field = field;
>> +               return this;
>> +       }
>> +
>> +       /**
>> +        * Applies the contact information to the autocomplete attribute
>> +        *
>> +        * @param contact
>> +        *            the contact information are going to be applied to
>> +        * @return the auto complete builder
>> +        */
>> +       public AutoCompleteContactBuilder forContact(AutoCompleteContact
>> contact)
>> +       {
>> +               this.contact = contact;
>> +               return this;
>> +       }
>> +
>> +       /**
>> +        * @see {@link AutoCompleteContactBuilder}
>> +        */
>> +       @Override
>> +       public AutoCompleteContactBuilder forField(AutoCompleteContactDetails
>> contactDetail)
>> +       {
>> +               this.contactDetail = contactDetail;
>> +               return (AutoCompleteContactBuilder)this;
>> +       }
>> +
>> +       /**
>> +        * Builds the attribute string
>> +        *
>> +        * @return the attribute content in the right order
>> +        */
>> +       @Override
>> +       public String toString()
>> +       {
>> +               StringBuilder stringBuilder = new StringBuilder();
>> +               if (!empty)
>> +               {
>> +                       if (sectionName != null)
>> +                       {
>> +                               stringBuilder.append(SECTION_PREFIX);
>> +                               stringBuilder.append(sectionName);
>> +                               stringBuilder.append(" ");
>>
>
> Append char instead, i.e. ' '.
>
>
>> +                       }
>> +                       if (addressType != null)
>> +                       {
>> +                               stringBuilder.append(addressT
>> ype.getValue());
>> +                               stringBuilder.append(" ");
>> +                       }
>> +                       if (field != null)
>> +                       {
>> +                               stringBuilder.append(field.getValue());
>> +                       }
>> +                       else
>> +                       {
>> +                               if (contact != null)
>> +                               {
>> +                                       stringBuilder.append(contact.
>> getValue());
>> +                                       stringBuilder.append(" ");
>> +                               }
>> +                               stringBuilder.append(contactD
>> etail.getValue());
>>
>
> Is it allowed to have contactDetail without a contact ?
>
>
>> +                       }
>> +               }
>> +               return stringBuilder.toString();
>> +       }
>> +}
>>
>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
>> wicket-core/src/main/java/org/apache/wicket/markup/html/form
>> /AutoCompleteContact.java
>> ----------------------------------------------------------------------
>> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContact.java
>> b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/AutoCompleteContact.java
>> new file mode 100644
>> index 0000000..cbf86a5
>> --- /dev/null
>> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/AutoCompleteContact.java
>> @@ -0,0 +1,77 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>> + * contributor license agreements.  See the NOTICE file distributed with
>> + * this work for additional information regarding copyright ownership.
>> + * The ASF licenses this file to You under the Apache License, Version
>> 2.0
>> + * (the "License"); you may not use this file except in compliance with
>> + * the License.  You may obtain a copy of the License at
>> + *
>> + *      http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing, software
>> + * distributed under the License is distributed on an "AS IS" BASIS,
>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>> implied.
>> + * See the License for the specific language governing permissions and
>> + * limitations under the License.
>> + */
>> +package org.apache.wicket.markup.html.form;
>> +
>> +/**
>> + * Auto completion contact according to the whatwg specification.
>> + *
>> + * @author Tobias Soloschenko
>> + *
>> + * @see <a href=
>> + *      "https://html.spec.whatwg.org/multipage/forms.html">https://
>> html.spec.whatwg.org/multipage/forms.html</a>
>> + *
>> + */
>> +public enum AutoCompleteContact {
>> +
>> +       /**
>> +        * meaning the field is for contacting someone at their residence
>> +        */
>> +       HOME("home"),
>> +
>> +       /**
>> +        * meaning the field is for contacting someone at their workplace
>> +        */
>> +       WORK("work"),
>> +
>> +       /**
>> +        * meaning the field is for contacting someone regardless of
>> location
>> +        */
>> +       MOBILE("mobile"),
>> +
>> +       /**
>> +        * meaning the field describes a fax machine's contact details
>> +        */
>> +       FAX("fax"),
>> +
>> +       /**
>> +        * meaning the field describes a pager's or beeper's contact
>> details
>> +        */
>> +       PAGER("pager");
>> +
>> +       private String value;
>> +
>> +       /**
>> +        * Creates an auto completion contact with the given value
>> +        *
>> +        * @param value
>> +        *            the value of the contact
>> +        */
>> +       private AutoCompleteContact(String value)
>> +       {
>> +               this.value = value;
>> +       }
>> +
>> +       /**
>> +        * Gets the value of the auto completion contact
>> +        *
>> +        * @return the value of the auto completion contact
>> +        */
>> +       public String getValue()
>> +       {
>> +               return value;
>> +       }
>> +}
>>
>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
>> wicket-core/src/main/java/org/apache/wicket/markup/html/form
>> /AutoCompleteContactBuilder.java
>> ----------------------------------------------------------------------
>> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/AutoCompleteContactBuilder.java b/wicket-core/src/main/java/or
>> g/apache/wicket/markup/html/form/AutoCompleteContactBuilder.java
>> new file mode 100644
>> index 0000000..07324ff
>> --- /dev/null
>> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/AutoCompleteContactBuilder.java
>> @@ -0,0 +1,38 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>> + * contributor license agreements.  See the NOTICE file distributed with
>> + * this work for additional information regarding copyright ownership.
>> + * The ASF licenses this file to You under the Apache License, Version
>> 2.0
>> + * (the "License"); you may not use this file except in compliance with
>> + * the License.  You may obtain a copy of the License at
>> + *
>> + *      http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing, software
>> + * distributed under the License is distributed on an "AS IS" BASIS,
>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>> implied.
>> + * See the License for the specific language governing permissions and
>> + * limitations under the License.
>> + */
>> +package org.apache.wicket.markup.html.form;
>> +
>> +/**
>> + * The auto complete contact builder shrinks down the possibilities to
>> the contact details
>> + *
>> + * @author Tobias Soloschenko
>> + *
>> + * @since 8.0.0
>> + *
>> + */
>> +public interface AutoCompleteContactBuilder
>> +{
>> +       /**
>> +        * Applies the contact details information to the auto complete
>> field
>> +        *
>> +        * @param contactDetail
>> +        *            the contact detail
>> +        * @return the auto complete builder contact
>> +        */
>> +       AutoCompleteContactBuilder forField(AutoCompleteContactDetails
>> contactDetail);
>> +
>> +}
>>
>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
>> wicket-core/src/main/java/org/apache/wicket/markup/html/form
>> /AutoCompleteContactDetails.java
>> ----------------------------------------------------------------------
>> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/AutoCompleteContactDetails.java b/wicket-core/src/main/java/or
>> g/apache/wicket/markup/html/form/AutoCompleteContactDetails.java
>> new file mode 100644
>> index 0000000..e4d5e44
>> --- /dev/null
>> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/AutoCompleteContactDetails.java
>> @@ -0,0 +1,102 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>> + * contributor license agreements.  See the NOTICE file distributed with
>> + * this work for additional information regarding copyright ownership.
>> + * The ASF licenses this file to You under the Apache License, Version
>> 2.0
>> + * (the "License"); you may not use this file except in compliance with
>> + * the License.  You may obtain a copy of the License at
>> + *
>> + *      http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing, software
>> + * distributed under the License is distributed on an "AS IS" BASIS,
>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>> implied.
>> + * See the License for the specific language governing permissions and
>> + * limitations under the License.
>> + */
>> +package org.apache.wicket.markup.html.form;
>> +
>> +/**
>> + * Auto completion contact detail according to the whatwg specification.
>> + *
>> + * @author Tobias Soloschenko
>> + *
>> + * @see <a href=
>> + *      "https://html.spec.whatwg.org/multipage/forms.html">https://
>> html.spec.whatwg.org/multipage/forms.html</a>
>> + *
>> + */
>> +public enum AutoCompleteContactDetails {
>> +
>> +       /**
>> +        * +1 617 253 5702
>
>
> Prefix it with "E.g."
>
>
>>
>> +        */
>> +       TEL("tel"),
>> +
>> +       /**
>> +        * +1
>> +        */
>> +       TEL_COUNTRY_CODE("tel-country-code"),
>> +
>> +       /**
>> +        * 617 253 5702
>> +        */
>> +       TEL_NATIONAL("tel-national"),
>> +
>> +       /**
>> +        * 617
>> +        */
>> +       TEL_AREA_CODE("tel-area-code"),
>> +
>> +       /**
>> +        * 2535702
>> +        */
>> +       TEL_LOCAL("tel-local"),
>> +
>> +       /**
>> +        * 253
>> +        */
>> +       TEL_LOCAL_PREFIX("tel-local-prefix"),
>> +
>> +       /**
>> +        * 5702
>> +        */
>> +       TEL_LOCAL_SUFFIX("tel-local-suffix"),
>> +
>> +       /**
>> +        * 1000
>> +        */
>> +       TEL_EXTENSION("tel-extension"),
>> +
>> +       /**
>> +        * timbl@w3.org
>> +        */
>> +       EMAIL("email"),
>> +
>> +       /**
>> +        * irc://example.org/timbl,isuser
>> +        */
>> +       IMPP("impp");
>> +
>> +       private String value;
>> +
>> +       /**
>> +        * Creates an auto completion contact detail with the given value
>> +        *
>> +        * @param value
>> +        *            the value of the contact detail
>> +        */
>> +       private AutoCompleteContactDetails(String value)
>> +       {
>> +               this.value = value;
>> +       }
>> +
>> +       /**
>> +        * Gets the value of the auto completion contact detail
>> +        *
>> +        * @return the value of the auto completion contact detail
>> +        */
>> +       public String getValue()
>> +       {
>> +               return value;
>> +       }
>> +}
>>
>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
>> wicket-core/src/main/java/org/apache/wicket/markup/html/form
>> /AutoCompleteFields.java
>> ----------------------------------------------------------------------
>> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteFields.java
>> b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/AutoCompleteFields.java
>> new file mode 100644
>> index 0000000..8f794c4
>> --- /dev/null
>> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/AutoCompleteFields.java
>> @@ -0,0 +1,272 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>> + * contributor license agreements.  See the NOTICE file distributed with
>> + * this work for additional information regarding copyright ownership.
>> + * The ASF licenses this file to You under the Apache License, Version
>> 2.0
>> + * (the "License"); you may not use this file except in compliance with
>> + * the License.  You may obtain a copy of the License at
>> + *
>> + *      http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing, software
>> + * distributed under the License is distributed on an "AS IS" BASIS,
>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>> implied.
>> + * See the License for the specific language governing permissions and
>> + * limitations under the License.
>> + */
>> +package org.apache.wicket.markup.html.form;
>> +
>> +/**
>> + * Auto completion personal data according to the whatwg specification.
>> + *
>> + * @author Tobias Soloschenko
>> + *
>> + * @see <a href=
>> + *      "https://html.spec.whatwg.org/multipage/forms.html">https://
>> html.spec.whatwg.org/multipage/forms.html</a>
>> + *
>> + */
>> +public enum AutoCompleteFields {
>> +
>> +       /**
>> +        * Simply turns on the auto completion
>> +        */
>> +       ON("on"),
>> +
>> +       /**
>> +        * Simply turns off the auto completion
>> +        */
>> +       OFF("off"),
>> +
>> +       /**
>> +        * Sir Timothy John Berners-Lee, OM, KBE, FRS, FREng, FRSA
>> +        */
>> +       NAME("name"),
>> +
>> +       /**
>> +        * Sir
>> +        */
>> +       HONORIFIC_PREFIX("honorific-prefix"),
>> +
>> +       /**
>> +        * Timothy
>> +        */
>> +       GIVEN_NAME("given-name"),
>> +
>> +       /**
>> +        * John
>> +        */
>> +       ADDITIONAL_NAME("additional-name"),
>> +
>> +       /**
>> +        * Berners-Lee
>> +        */
>> +       FAMILY_NAME("family-name"),
>> +
>> +       /**
>> +        * OM, KBE, FRS, FREng, FRSA
>> +        */
>> +       HONORIFIC_SUFFIX("honorific-suffix"),
>> +
>> +       /**
>> +        * Tim
>> +        */
>> +       NICKNAME("nickname"),
>> +
>> +       /**
>> +        * timbl
>> +        */
>> +       USERNAME("username"),
>> +
>> +       /**
>> +        * GUMFXbadyrS3
>> +        */
>> +       NEW_PASSWORD("new-password"),
>> +
>> +       /**
>> +        * qwerty
>> +        */
>> +       CURRENT_PASSWORD("current-password"),
>> +
>> +       /**
>> +        * Professor
>> +        */
>> +       ORGANIZATION_TITLE("organization-title"),
>> +
>> +       /**
>> +        * World Wide Web Consortium
>> +        */
>> +       ORGANIZATION("organization"),
>> +
>> +       /**
>> +        * Multiple lines 32 Vassar Street MIT Room 32-G524
>> +        */
>> +       STREET_ADDRESS("street-address"),
>> +
>> +       /**
>> +        * 32 Vassar Street
>> +        */
>> +       ADDRESS_LINE1("address-line1"),
>> +
>> +       /**
>> +        * MIT Room 32-G524
>> +        */
>> +       ADDRESS_LINE2("address-line2"),
>> +
>> +       /**
>> +        * See {@link AutoComplete.ADRESS_LINE2}
>> +        */
>> +       ADDRESS_LINE3("address-line3"),
>> +
>> +       /**
>> +        * The most fine-grained administrative level, in addresses with
>> four administrative levels
>> +        */
>> +       ADDRESS_LEVEL4("address-level4"),
>> +
>> +       /**
>> +        * The third administrative level, in addresses with three or
>> more administrative levels
>> +        */
>> +       ADDRESS_LEVEL3("address-level3"),
>> +
>> +       /**
>> +        * Cambridge
>> +        */
>> +       ADDRESS_LEVEL2("address-level2"),
>> +
>> +       /**
>> +        * MA
>> +        */
>> +       ADDRESS_LEVEL1("address-level1"),
>> +
>> +       /**
>> +        * US
>> +        */
>> +       COUNTRY("country"),
>> +
>> +       /**
>> +        * US
>> +        */
>> +       COUNTRY_NAME("country-name"),
>> +
>> +       /**
>> +        * 02139
>> +        */
>> +       POSTAL_CODE("postal-code"),
>> +
>> +       /**
>> +        * Tim Berners-Lee
>> +        */
>> +       CC_NAME("cc-name"),
>> +
>> +       /**
>> +        * Tim
>> +        */
>> +       CC_GIVEN_NAME("cc-given-name"),
>> +
>> +       /**
>> +        * -
>> +        */
>> +       CC_ADDITIONAL_NAME("cc-additional-name"),
>> +
>> +       /**
>> +        * Berners-Lee
>> +        */
>> +       CC_FAMILY_NAME("cc-family-name"),
>> +
>> +       /**
>> +        * 4114360123456785
>> +        */
>> +       CC_NUMBER("cc-number"),
>> +
>> +       /**
>> +        * 2014-12
>> +        */
>> +       CC_EXP("cc-exp"),
>> +
>> +       /**
>> +        * 12
>> +        */
>> +       CC_EXP_MONTH("cc-exp-month"),
>> +
>> +       /**
>> +        * 2014
>> +        */
>> +       CC_EXP_YEAR("cc-exp-year"),
>> +
>> +       /**
>> +        * 419
>> +        */
>> +       CC_CSC("cc-csc"),
>> +
>> +       /**
>> +        * Visa
>> +        */
>> +       CC_TYPE("cc-type"),
>> +
>> +       /**
>> +        * GBP
>> +        */
>> +       TRANSACTION_CURRENCY("transaction-currency"),
>> +
>> +       /**
>> +        * 401.00
>> +        */
>> +       TRANSACTION_AMOUNT("transaction-amount"),
>> +
>> +       /**
>> +        * en
>> +        */
>> +       LANGUAGE("language"),
>> +
>> +       /**
>> +        * 1955-06-08
>> +        */
>> +       BDAY("bday"),
>> +
>> +       /**
>> +        * 8
>> +        */
>> +       BDAY_DAY("bday-day"),
>> +
>> +       /**
>> +        * 6
>> +        */
>> +       BDAY_MONTH("bday-month"),
>> +
>> +       /**
>> +        * 1955
>> +        */
>> +       BDAY_YEAR("bday-year"),
>> +
>> +       /**
>> +        * Male
>> +        */
>> +       SEX("sex"),
>> +
>> +       /**
>> +        * https://www.w3.org/People/Berners-Lee/
>> +        */
>> +       URL("url"),
>> +
>> +       /**
>> +        * https://www.w3.org/Press/Stock/Berners-Lee/2001-europaeum-ei
>> ghth.jpg
>> +        */
>> +       PHOTO("photo");
>> +
>> +       private String value;
>> +
>> +       private AutoCompleteFields(String value)
>> +       {
>> +               this.value = value;
>> +       }
>> +
>> +       /**
>> +        * Gets the value of the auto completion
>> +        *
>> +        * @return the value of the auto completion
>> +        */
>> +       public String getValue()
>> +       {
>> +               return value;
>> +       }
>> +
>> +}
>>
>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
>> wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
>> ----------------------------------------------------------------------
>> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
>> b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
>> index e8b61e7..1d3284a 100644
>> --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/Form.java
>> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/Form.java
>> @@ -1352,6 +1352,14 @@ public class Form<T> extends WebMarkupContainer
>>         }
>>
>>         /**
>> +        * Gets the value of the autocomplete attribute. The default
>> behavior is that it is turned off
>> +        * @return AutoCompleteBuilder the builder to generate the
>> autocomplete attribute information
>> +        */
>> +       protected AutoCompleteBuilder getAutoCompleteBuilder(){
>> +               return AutoCompleteBuilder.init().empty();
>>
>
> Since there is no way to set empty=false at the moment this definitely
> doesn't work.
> Some tests for the builders would be nice!
>
>
>> +       }
>> +
>> +       /**
>>          *
>>          * @see org.apache.wicket.Component#getStatelessHint()
>>          */
>> @@ -1633,6 +1641,12 @@ public class Form<T> extends WebMarkupContainer
>>                                         setMultiPart(true);
>>                                 }
>>                         }
>> +
>> +                       // Auto completion support
>> +                       String autocompleteValue =
>> getAutoCompleteBuilder().toString();
>> +                       if(!autocompleteValue.isEmpty()){
>> +                               tag.put("autocomplete",
>> autocompleteValue);
>> +                       }
>>                 }
>>                 else
>>                 {
>>
>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
>> wicket-core/src/main/java/org/apache/wicket/markup/html/form
>> /TextField.java
>> ----------------------------------------------------------------------
>> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/TextField.java
>> b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/TextField.java
>> index 81dc828..719560c 100644
>> --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/TextField.java
>> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/TextField.java
>> @@ -107,6 +107,12 @@ public class TextField<T> extends
>> AbstractTextComponent<T>
>>
>>                 tag.put("value", getValue());
>>
>> +               // Auto completion support
>> +               String autocompleteValue = getAutoCompleteBuilder().toStr
>> ing();
>> +               if(!autocompleteValue.isEmpty()){
>> +                       tag.put("autocomplete", autocompleteValue);
>> +               }
>> +
>>                 // Default handling for component tag
>>                 super.onComponentTag(tag);
>>         }
>> @@ -121,4 +127,12 @@ public class TextField<T> extends
>> AbstractTextComponent<T>
>>         {
>>                 return null;
>>         }
>> +
>> +       /**
>> +        * Gets the value of the autocomplete attribute. The default
>> behavior is that it is turned off
>> +        * @return AutoCompleteBuilder the builder to generate the
>> autocomplete attribute information
>> +        */
>> +       protected AutoCompleteBuilder getAutoCompleteBuilder(){
>> +               return AutoCompleteBuilder.init().empty();
>> +       }
>>  }
>>
>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
>> wicket-core/src/test/java/org/apache/wicket/markup/html/form
>> /FormTest.java
>> ----------------------------------------------------------------------
>> diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormTest.java
>> b/wicket-core/src/test/java/org/apache/wicket/markup/html/fo
>> rm/FormTest.java
>> index 05344a5..2ee420a 100644
>> --- a/wicket-core/src/test/java/org/apache/wicket/markup/html/fo
>> rm/FormTest.java
>> +++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/fo
>> rm/FormTest.java
>> @@ -53,6 +53,39 @@ public class FormTest extends WicketTestCase
>>                 };
>>         }
>>
>> +       /**
>> +        * Test auto complete functionality
>> +        */
>> +       @Test
>> +       public void testAutoComplete(){
>> +               class TestPage extends WebPage implements
>> IMarkupResourceStreamProvider
>> +               {
>> +                       boolean shouldFail, submit, error;
>> +
>> +                       public TestPage()
>> +                       {
>> +                               add(new Form<Void>("form")
>> +                               {
>> +                                       @Override
>> +                                       protected AutoCompleteBuilder
>> getAutoCompleteBuilder()
>> +                                       {
>> +                                               return
>> AutoCompleteBuilder.init().forAddressType(AutoCompleteAddres
>> sType.BILLING).forField(AutoCompleteFields.GIVEN_NAME);
>> +                                       }
>> +                               });
>> +                       }
>> +
>> +                       @Override
>> +                       public IResourceStream
>> getMarkupResourceStream(final MarkupContainer container,
>> +                               Class<?> containerClass)
>> +                       {
>> +                               return new StringResourceStream("<form
>> wicket:id='form'></form>");
>> +                       }
>> +               }
>> +
>> +               TestPage testPage = new TestPage();
>> +               tester.startPage(testPage);
>> +               assertTrue(tester.getLastResp
>> onseAsString().contains("autocomplete=\"billing given-name\""));
>> +       }
>>
>>         /**
>>          * @throws Exception
>> @@ -115,6 +148,12 @@ public class FormTest extends WicketTestCase
>>                                         {
>>                                                 error = true;
>>                                         }
>> +
>> +                                       @Override
>> +                                       protected AutoCompleteBuilder
>> getAutoCompleteBuilder()
>> +                                       {
>> +                                               return
>> AutoCompleteBuilder.init().forAddressType(AutoCompleteAddres
>> sType.BILLING).forField(AutoCompleteFields.GIVEN_NAME);
>> +                                       }
>>                                 });
>>                         }
>>
>>
>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
>> wicket-core/src/test/java/org/apache/wicket/markup/html/form
>> /TextFieldTest.java
>> ----------------------------------------------------------------------
>> diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/TextFieldTest.java
>> b/wicket-core/src/test/java/org/apache/wicket/markup/html/fo
>> rm/TextFieldTest.java
>> index 5af5917..2c215e5 100644
>> --- a/wicket-core/src/test/java/org/apache/wicket/markup/html/fo
>> rm/TextFieldTest.java
>> +++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/fo
>> rm/TextFieldTest.java
>> @@ -36,7 +36,20 @@ import org.junit.Test;
>>   */
>>  public class TextFieldTest extends WicketTestCase
>>  {
>> -       /** */
>> +
>> +       /**
>> +        * Test auto complete feature
>> +        */
>> +       @Test
>> +       public void testAutoComplete(){
>> +               TestPage testPage = new TestPage();
>> +               tester.startPage(testPage);
>> +               assertTrue(tester.getLastResp
>> onseAsString().contains("autocomplete=\"section-blue billing name\""));
>> +       }
>> +
>> +       /**
>> +        * Test that inputs are converted to null
>> +        * */
>>         @Test
>>         public void emptyInputConvertedToNull()
>>         {
>> @@ -111,7 +124,13 @@ public class TextFieldTest extends WicketTestCase
>>                 public TestPage()
>>                 {
>>                         add(form = new Form<>("form"));
>> -                       form.add(textField = new TextField<>("text",
>> textModel));
>> +                       form.add(textField = new
>> TextField<String>("text", textModel){
>> +                               @Override
>> +                               protected AutoCompleteBuilder
>> getAutoCompleteBuilder()
>> +                               {
>> +                                       return
>> AutoCompleteBuilder.init().withSection("blue").forAddressTyp
>> e(AutoCompleteAddressType.BILLING).forField(AutoCompleteFields.NAME);
>> +                               }
>> +                       });
>>                 }
>>
>>                 @Override
>>
>>
>

Re: wicket git commit: WICKET-6299

Posted by Martin Grigorov <mg...@apache.org>.
Hi Tobias,

Some feedback inline:

On Tue, Dec 20, 2016 at 8:19 PM, <ts...@apache.org> wrote:

> Repository: wicket
> Updated Branches:
>   refs/heads/master aedb98764 -> bcd55813b
>
>
> WICKET-6299
>
> Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
> Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/bcd55813
> Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/bcd55813
> Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/bcd55813
>
> Branch: refs/heads/master
> Commit: bcd55813b3afbccb5675096930aee6281c5cba3a
> Parents: aedb987
> Author: Tobias Soloschenko <ts...@apache.org>
> Authored: Tue Dec 20 20:15:42 2016 +0100
> Committer: Tobias Soloschenko <ts...@apache.org>
> Committed: Tue Dec 20 20:15:42 2016 +0100
>
> ----------------------------------------------------------------------
>  .../html/form/AutoCompleteAddressType.java      |  56 ++++
>  .../markup/html/form/AutoCompleteBuilder.java   | 170 ++++++++++++
>  .../markup/html/form/AutoCompleteContact.java   |  77 ++++++
>  .../html/form/AutoCompleteContactBuilder.java   |  38 +++
>  .../html/form/AutoCompleteContactDetails.java   | 102 +++++++
>  .../markup/html/form/AutoCompleteFields.java    | 272 +++++++++++++++++++
>  .../apache/wicket/markup/html/form/Form.java    |  14 +
>  .../wicket/markup/html/form/TextField.java      |  14 +
>  .../wicket/markup/html/form/FormTest.java       |  39 +++
>  .../wicket/markup/html/form/TextFieldTest.java  |  23 +-
>  10 files changed, 803 insertions(+), 2 deletions(-)
> ----------------------------------------------------------------------
>
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
> wicket-core/src/main/java/org/apache/wicket/markup/html/
> form/AutoCompleteAddressType.java
> ----------------------------------------------------------------------
> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/AutoCompleteAddressType.java b/wicket-core/src/main/java/or
> g/apache/wicket/markup/html/form/AutoCompleteAddressType.java
> new file mode 100644
> index 0000000..6123053
> --- /dev/null
> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/AutoCompleteAddressType.java
> @@ -0,0 +1,56 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements.  See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You under the Apache License, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License.  You may obtain a copy of the License at
> + *
> + *      http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +package org.apache.wicket.markup.html.form;
> +
> +/**
> + * Auto completion address type according to the whatwg specification.
> + *
> + * @author Tobias Soloschenko
> + *
> + * @see <a href=
> + *      "https://html.spec.whatwg.org/multipage/forms.html">https://
> html.spec.whatwg.org/multipage/forms.html</a>
> + *
> + */
> +public enum AutoCompleteAddressType {
> +
> +       /**
> +        * Meaning the field is part of the shipping address or contact
> information
> +        */
> +       SHIPPING("shipping"),
> +
> +       /**
> +        * meaning the field is part of the billing address or contact
> information
> +        */
> +       BILLING("billing");
> +
> +       private String value;
> +
> +       private AutoCompleteAddressType(String value)
> +       {
> +               this.value = value;
> +       }
> +
> +       /**
> +        * Gets the address type value
> +        *
> +        * @return the value of the address type
> +        */
> +       public String getValue()
> +       {
> +               return value;
> +       }
> +}
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
> wicket-core/src/main/java/org/apache/wicket/markup/html/
> form/AutoCompleteBuilder.java
> ----------------------------------------------------------------------
> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteBuilder.java
> b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/AutoCompleteBuilder.java
> new file mode 100644
> index 0000000..a3b64cd
> --- /dev/null
> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/AutoCompleteBuilder.java
> @@ -0,0 +1,170 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements.  See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You under the Apache License, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License.  You may obtain a copy of the License at
> + *
> + *      http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +package org.apache.wicket.markup.html.form;
> +
> +/**
> + * The auto complete builder is used to build the corresponding attribute
> for form and input tags.
> + * To use the auto completion just open the autofill options within your
> browser. In chrome for
> + * example it is accessed with the following URL:
> + * <a href="chrome://settings/autofillEditAddress">chrome://settin
> gs/autofillEditAddress</a>
> + *
> + * @author Tobias Soloschenko
> + *
> + * @since 8.0.0
> + *
> + */
> +public class AutoCompleteBuilder implements AutoCompleteContactBuilder
> +{
> +       /**
> +        * The section prefix specificed by the whatwg standard
> +        */
> +       public static final String SECTION_PREFIX = "section-";
> +
> +       private String sectionName;
> +
> +       private AutoCompleteAddressType addressType;
> +
> +       private AutoCompleteFields field;
> +
> +       private AutoCompleteContact contact;
> +
> +       private AutoCompleteContactDetails contactDetail;
> +
> +       private boolean empty;
> +
> +       /**
> +        * Initializes a new auto complete builder
> +        *
> +        * @return the auto complete builder
> +        */
> +       public static AutoCompleteBuilder init()
> +       {
> +               return new AutoCompleteBuilder();
> +       }
> +
> +       /**
> +        * Empties out the autocomplete outcome
> +        *
> +        * @return the auto complete builder
> +        */
> +       public AutoCompleteBuilder empty()
> +       {
> +               this.empty = true;
>

The way 'empty' works seems incomplete.
Each `with**` method should set it to 'false'.


> +               return this;
> +       }
> +
> +       /**
> +        * Applies a section to the auto completion field
> +        *
> +        * @param sectionName
> +        *            the name of the section
> +        * @return the auto complete builder itself
> +        */
> +       public AutoCompleteBuilder withSection(String sectionName)
> +       {
> +               this.sectionName = sectionName;
>

Such assignments need check for non-emptiness.
If the value is "" then it will pass the check for '!= null' in toString()
and produce wrong output.


> +               return this;
> +       }
> +
> +       /**
> +        * Assigns the auto completion to a specific address type
> +        *
> +        * @param addressType
> +        *            the auto completion address type
> +        * @return the auto complete builder itself
> +        */
> +       public AutoCompleteBuilder forAddressType(AutoCompleteAddressType
> addressType)
> +       {
> +               this.addressType = addressType;
> +               return this;
> +       }
> +
> +       /**
> +        * Applies the field to the autocomplete attribute
> +        *
> +        * @param field
> +        *            the field
> +        * @return the auto complete builder
> +        */
> +       public AutoCompleteBuilder forField(AutoCompleteFields field)
> +       {
> +               this.field = field;
> +               return this;
> +       }
> +
> +       /**
> +        * Applies the contact information to the autocomplete attribute
> +        *
> +        * @param contact
> +        *            the contact information are going to be applied to
> +        * @return the auto complete builder
> +        */
> +       public AutoCompleteContactBuilder forContact(AutoCompleteContact
> contact)
> +       {
> +               this.contact = contact;
> +               return this;
> +       }
> +
> +       /**
> +        * @see {@link AutoCompleteContactBuilder}
> +        */
> +       @Override
> +       public AutoCompleteContactBuilder forField(AutoCompleteContactDetails
> contactDetail)
> +       {
> +               this.contactDetail = contactDetail;
> +               return (AutoCompleteContactBuilder)this;
> +       }
> +
> +       /**
> +        * Builds the attribute string
> +        *
> +        * @return the attribute content in the right order
> +        */
> +       @Override
> +       public String toString()
> +       {
> +               StringBuilder stringBuilder = new StringBuilder();
> +               if (!empty)
> +               {
> +                       if (sectionName != null)
> +                       {
> +                               stringBuilder.append(SECTION_PREFIX);
> +                               stringBuilder.append(sectionName);
> +                               stringBuilder.append(" ");
>

Append char instead, i.e. ' '.


> +                       }
> +                       if (addressType != null)
> +                       {
> +                               stringBuilder.append(addressT
> ype.getValue());
> +                               stringBuilder.append(" ");
> +                       }
> +                       if (field != null)
> +                       {
> +                               stringBuilder.append(field.getValue());
> +                       }
> +                       else
> +                       {
> +                               if (contact != null)
> +                               {
> +                                       stringBuilder.append(contact.
> getValue());
> +                                       stringBuilder.append(" ");
> +                               }
> +                               stringBuilder.append(contactD
> etail.getValue());
>

Is it allowed to have contactDetail without a contact ?


> +                       }
> +               }
> +               return stringBuilder.toString();
> +       }
> +}
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
> wicket-core/src/main/java/org/apache/wicket/markup/html/
> form/AutoCompleteContact.java
> ----------------------------------------------------------------------
> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContact.java
> b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/AutoCompleteContact.java
> new file mode 100644
> index 0000000..cbf86a5
> --- /dev/null
> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/AutoCompleteContact.java
> @@ -0,0 +1,77 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements.  See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You under the Apache License, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License.  You may obtain a copy of the License at
> + *
> + *      http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +package org.apache.wicket.markup.html.form;
> +
> +/**
> + * Auto completion contact according to the whatwg specification.
> + *
> + * @author Tobias Soloschenko
> + *
> + * @see <a href=
> + *      "https://html.spec.whatwg.org/multipage/forms.html">https://
> html.spec.whatwg.org/multipage/forms.html</a>
> + *
> + */
> +public enum AutoCompleteContact {
> +
> +       /**
> +        * meaning the field is for contacting someone at their residence
> +        */
> +       HOME("home"),
> +
> +       /**
> +        * meaning the field is for contacting someone at their workplace
> +        */
> +       WORK("work"),
> +
> +       /**
> +        * meaning the field is for contacting someone regardless of
> location
> +        */
> +       MOBILE("mobile"),
> +
> +       /**
> +        * meaning the field describes a fax machine's contact details
> +        */
> +       FAX("fax"),
> +
> +       /**
> +        * meaning the field describes a pager's or beeper's contact
> details
> +        */
> +       PAGER("pager");
> +
> +       private String value;
> +
> +       /**
> +        * Creates an auto completion contact with the given value
> +        *
> +        * @param value
> +        *            the value of the contact
> +        */
> +       private AutoCompleteContact(String value)
> +       {
> +               this.value = value;
> +       }
> +
> +       /**
> +        * Gets the value of the auto completion contact
> +        *
> +        * @return the value of the auto completion contact
> +        */
> +       public String getValue()
> +       {
> +               return value;
> +       }
> +}
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
> wicket-core/src/main/java/org/apache/wicket/markup/html/
> form/AutoCompleteContactBuilder.java
> ----------------------------------------------------------------------
> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/AutoCompleteContactBuilder.java b/wicket-core/src/main/java/or
> g/apache/wicket/markup/html/form/AutoCompleteContactBuilder.java
> new file mode 100644
> index 0000000..07324ff
> --- /dev/null
> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/AutoCompleteContactBuilder.java
> @@ -0,0 +1,38 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements.  See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You under the Apache License, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License.  You may obtain a copy of the License at
> + *
> + *      http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +package org.apache.wicket.markup.html.form;
> +
> +/**
> + * The auto complete contact builder shrinks down the possibilities to
> the contact details
> + *
> + * @author Tobias Soloschenko
> + *
> + * @since 8.0.0
> + *
> + */
> +public interface AutoCompleteContactBuilder
> +{
> +       /**
> +        * Applies the contact details information to the auto complete
> field
> +        *
> +        * @param contactDetail
> +        *            the contact detail
> +        * @return the auto complete builder contact
> +        */
> +       AutoCompleteContactBuilder forField(AutoCompleteContactDetails
> contactDetail);
> +
> +}
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
> wicket-core/src/main/java/org/apache/wicket/markup/html/
> form/AutoCompleteContactDetails.java
> ----------------------------------------------------------------------
> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/AutoCompleteContactDetails.java b/wicket-core/src/main/java/or
> g/apache/wicket/markup/html/form/AutoCompleteContactDetails.java
> new file mode 100644
> index 0000000..e4d5e44
> --- /dev/null
> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/AutoCompleteContactDetails.java
> @@ -0,0 +1,102 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements.  See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You under the Apache License, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License.  You may obtain a copy of the License at
> + *
> + *      http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +package org.apache.wicket.markup.html.form;
> +
> +/**
> + * Auto completion contact detail according to the whatwg specification.
> + *
> + * @author Tobias Soloschenko
> + *
> + * @see <a href=
> + *      "https://html.spec.whatwg.org/multipage/forms.html">https://
> html.spec.whatwg.org/multipage/forms.html</a>
> + *
> + */
> +public enum AutoCompleteContactDetails {
> +
> +       /**
> +        * +1 617 253 5702


Prefix it with "E.g."


>
> +        */
> +       TEL("tel"),
> +
> +       /**
> +        * +1
> +        */
> +       TEL_COUNTRY_CODE("tel-country-code"),
> +
> +       /**
> +        * 617 253 5702
> +        */
> +       TEL_NATIONAL("tel-national"),
> +
> +       /**
> +        * 617
> +        */
> +       TEL_AREA_CODE("tel-area-code"),
> +
> +       /**
> +        * 2535702
> +        */
> +       TEL_LOCAL("tel-local"),
> +
> +       /**
> +        * 253
> +        */
> +       TEL_LOCAL_PREFIX("tel-local-prefix"),
> +
> +       /**
> +        * 5702
> +        */
> +       TEL_LOCAL_SUFFIX("tel-local-suffix"),
> +
> +       /**
> +        * 1000
> +        */
> +       TEL_EXTENSION("tel-extension"),
> +
> +       /**
> +        * timbl@w3.org
> +        */
> +       EMAIL("email"),
> +
> +       /**
> +        * irc://example.org/timbl,isuser
> +        */
> +       IMPP("impp");
> +
> +       private String value;
> +
> +       /**
> +        * Creates an auto completion contact detail with the given value
> +        *
> +        * @param value
> +        *            the value of the contact detail
> +        */
> +       private AutoCompleteContactDetails(String value)
> +       {
> +               this.value = value;
> +       }
> +
> +       /**
> +        * Gets the value of the auto completion contact detail
> +        *
> +        * @return the value of the auto completion contact detail
> +        */
> +       public String getValue()
> +       {
> +               return value;
> +       }
> +}
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
> wicket-core/src/main/java/org/apache/wicket/markup/html/
> form/AutoCompleteFields.java
> ----------------------------------------------------------------------
> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteFields.java
> b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/AutoCompleteFields.java
> new file mode 100644
> index 0000000..8f794c4
> --- /dev/null
> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/AutoCompleteFields.java
> @@ -0,0 +1,272 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements.  See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You under the Apache License, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License.  You may obtain a copy of the License at
> + *
> + *      http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +package org.apache.wicket.markup.html.form;
> +
> +/**
> + * Auto completion personal data according to the whatwg specification.
> + *
> + * @author Tobias Soloschenko
> + *
> + * @see <a href=
> + *      "https://html.spec.whatwg.org/multipage/forms.html">https://
> html.spec.whatwg.org/multipage/forms.html</a>
> + *
> + */
> +public enum AutoCompleteFields {
> +
> +       /**
> +        * Simply turns on the auto completion
> +        */
> +       ON("on"),
> +
> +       /**
> +        * Simply turns off the auto completion
> +        */
> +       OFF("off"),
> +
> +       /**
> +        * Sir Timothy John Berners-Lee, OM, KBE, FRS, FREng, FRSA
> +        */
> +       NAME("name"),
> +
> +       /**
> +        * Sir
> +        */
> +       HONORIFIC_PREFIX("honorific-prefix"),
> +
> +       /**
> +        * Timothy
> +        */
> +       GIVEN_NAME("given-name"),
> +
> +       /**
> +        * John
> +        */
> +       ADDITIONAL_NAME("additional-name"),
> +
> +       /**
> +        * Berners-Lee
> +        */
> +       FAMILY_NAME("family-name"),
> +
> +       /**
> +        * OM, KBE, FRS, FREng, FRSA
> +        */
> +       HONORIFIC_SUFFIX("honorific-suffix"),
> +
> +       /**
> +        * Tim
> +        */
> +       NICKNAME("nickname"),
> +
> +       /**
> +        * timbl
> +        */
> +       USERNAME("username"),
> +
> +       /**
> +        * GUMFXbadyrS3
> +        */
> +       NEW_PASSWORD("new-password"),
> +
> +       /**
> +        * qwerty
> +        */
> +       CURRENT_PASSWORD("current-password"),
> +
> +       /**
> +        * Professor
> +        */
> +       ORGANIZATION_TITLE("organization-title"),
> +
> +       /**
> +        * World Wide Web Consortium
> +        */
> +       ORGANIZATION("organization"),
> +
> +       /**
> +        * Multiple lines 32 Vassar Street MIT Room 32-G524
> +        */
> +       STREET_ADDRESS("street-address"),
> +
> +       /**
> +        * 32 Vassar Street
> +        */
> +       ADDRESS_LINE1("address-line1"),
> +
> +       /**
> +        * MIT Room 32-G524
> +        */
> +       ADDRESS_LINE2("address-line2"),
> +
> +       /**
> +        * See {@link AutoComplete.ADRESS_LINE2}
> +        */
> +       ADDRESS_LINE3("address-line3"),
> +
> +       /**
> +        * The most fine-grained administrative level, in addresses with
> four administrative levels
> +        */
> +       ADDRESS_LEVEL4("address-level4"),
> +
> +       /**
> +        * The third administrative level, in addresses with three or more
> administrative levels
> +        */
> +       ADDRESS_LEVEL3("address-level3"),
> +
> +       /**
> +        * Cambridge
> +        */
> +       ADDRESS_LEVEL2("address-level2"),
> +
> +       /**
> +        * MA
> +        */
> +       ADDRESS_LEVEL1("address-level1"),
> +
> +       /**
> +        * US
> +        */
> +       COUNTRY("country"),
> +
> +       /**
> +        * US
> +        */
> +       COUNTRY_NAME("country-name"),
> +
> +       /**
> +        * 02139
> +        */
> +       POSTAL_CODE("postal-code"),
> +
> +       /**
> +        * Tim Berners-Lee
> +        */
> +       CC_NAME("cc-name"),
> +
> +       /**
> +        * Tim
> +        */
> +       CC_GIVEN_NAME("cc-given-name"),
> +
> +       /**
> +        * -
> +        */
> +       CC_ADDITIONAL_NAME("cc-additional-name"),
> +
> +       /**
> +        * Berners-Lee
> +        */
> +       CC_FAMILY_NAME("cc-family-name"),
> +
> +       /**
> +        * 4114360123456785
> +        */
> +       CC_NUMBER("cc-number"),
> +
> +       /**
> +        * 2014-12
> +        */
> +       CC_EXP("cc-exp"),
> +
> +       /**
> +        * 12
> +        */
> +       CC_EXP_MONTH("cc-exp-month"),
> +
> +       /**
> +        * 2014
> +        */
> +       CC_EXP_YEAR("cc-exp-year"),
> +
> +       /**
> +        * 419
> +        */
> +       CC_CSC("cc-csc"),
> +
> +       /**
> +        * Visa
> +        */
> +       CC_TYPE("cc-type"),
> +
> +       /**
> +        * GBP
> +        */
> +       TRANSACTION_CURRENCY("transaction-currency"),
> +
> +       /**
> +        * 401.00
> +        */
> +       TRANSACTION_AMOUNT("transaction-amount"),
> +
> +       /**
> +        * en
> +        */
> +       LANGUAGE("language"),
> +
> +       /**
> +        * 1955-06-08
> +        */
> +       BDAY("bday"),
> +
> +       /**
> +        * 8
> +        */
> +       BDAY_DAY("bday-day"),
> +
> +       /**
> +        * 6
> +        */
> +       BDAY_MONTH("bday-month"),
> +
> +       /**
> +        * 1955
> +        */
> +       BDAY_YEAR("bday-year"),
> +
> +       /**
> +        * Male
> +        */
> +       SEX("sex"),
> +
> +       /**
> +        * https://www.w3.org/People/Berners-Lee/
> +        */
> +       URL("url"),
> +
> +       /**
> +        * https://www.w3.org/Press/Stock/Berners-Lee/2001-europaeum-
> eighth.jpg
> +        */
> +       PHOTO("photo");
> +
> +       private String value;
> +
> +       private AutoCompleteFields(String value)
> +       {
> +               this.value = value;
> +       }
> +
> +       /**
> +        * Gets the value of the auto completion
> +        *
> +        * @return the value of the auto completion
> +        */
> +       public String getValue()
> +       {
> +               return value;
> +       }
> +
> +}
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
> wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
> ----------------------------------------------------------------------
> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
> b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
> index e8b61e7..1d3284a 100644
> --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/Form.java
> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/Form.java
> @@ -1352,6 +1352,14 @@ public class Form<T> extends WebMarkupContainer
>         }
>
>         /**
> +        * Gets the value of the autocomplete attribute. The default
> behavior is that it is turned off
> +        * @return AutoCompleteBuilder the builder to generate the
> autocomplete attribute information
> +        */
> +       protected AutoCompleteBuilder getAutoCompleteBuilder(){
> +               return AutoCompleteBuilder.init().empty();
>

Since there is no way to set empty=false at the moment this definitely
doesn't work.
Some tests for the builders would be nice!


> +       }
> +
> +       /**
>          *
>          * @see org.apache.wicket.Component#getStatelessHint()
>          */
> @@ -1633,6 +1641,12 @@ public class Form<T> extends WebMarkupContainer
>                                         setMultiPart(true);
>                                 }
>                         }
> +
> +                       // Auto completion support
> +                       String autocompleteValue =
> getAutoCompleteBuilder().toString();
> +                       if(!autocompleteValue.isEmpty()){
> +                               tag.put("autocomplete", autocompleteValue);
> +                       }
>                 }
>                 else
>                 {
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
> wicket-core/src/main/java/org/apache/wicket/markup/html/
> form/TextField.java
> ----------------------------------------------------------------------
> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/TextField.java
> b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/TextField.java
> index 81dc828..719560c 100644
> --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/TextField.java
> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/TextField.java
> @@ -107,6 +107,12 @@ public class TextField<T> extends
> AbstractTextComponent<T>
>
>                 tag.put("value", getValue());
>
> +               // Auto completion support
> +               String autocompleteValue = getAutoCompleteBuilder().toStr
> ing();
> +               if(!autocompleteValue.isEmpty()){
> +                       tag.put("autocomplete", autocompleteValue);
> +               }
> +
>                 // Default handling for component tag
>                 super.onComponentTag(tag);
>         }
> @@ -121,4 +127,12 @@ public class TextField<T> extends
> AbstractTextComponent<T>
>         {
>                 return null;
>         }
> +
> +       /**
> +        * Gets the value of the autocomplete attribute. The default
> behavior is that it is turned off
> +        * @return AutoCompleteBuilder the builder to generate the
> autocomplete attribute information
> +        */
> +       protected AutoCompleteBuilder getAutoCompleteBuilder(){
> +               return AutoCompleteBuilder.init().empty();
> +       }
>  }
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
> wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormTest.java
> ----------------------------------------------------------------------
> diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormTest.java
> b/wicket-core/src/test/java/org/apache/wicket/markup/html/fo
> rm/FormTest.java
> index 05344a5..2ee420a 100644
> --- a/wicket-core/src/test/java/org/apache/wicket/markup/html/fo
> rm/FormTest.java
> +++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/fo
> rm/FormTest.java
> @@ -53,6 +53,39 @@ public class FormTest extends WicketTestCase
>                 };
>         }
>
> +       /**
> +        * Test auto complete functionality
> +        */
> +       @Test
> +       public void testAutoComplete(){
> +               class TestPage extends WebPage implements
> IMarkupResourceStreamProvider
> +               {
> +                       boolean shouldFail, submit, error;
> +
> +                       public TestPage()
> +                       {
> +                               add(new Form<Void>("form")
> +                               {
> +                                       @Override
> +                                       protected AutoCompleteBuilder
> getAutoCompleteBuilder()
> +                                       {
> +                                               return
> AutoCompleteBuilder.init().forAddressType(AutoCompleteAddres
> sType.BILLING).forField(AutoCompleteFields.GIVEN_NAME);
> +                                       }
> +                               });
> +                       }
> +
> +                       @Override
> +                       public IResourceStream
> getMarkupResourceStream(final MarkupContainer container,
> +                               Class<?> containerClass)
> +                       {
> +                               return new StringResourceStream("<form
> wicket:id='form'></form>");
> +                       }
> +               }
> +
> +               TestPage testPage = new TestPage();
> +               tester.startPage(testPage);
> +               assertTrue(tester.getLastResponseAsString().contains("autocomplete=\"billing
> given-name\""));
> +       }
>
>         /**
>          * @throws Exception
> @@ -115,6 +148,12 @@ public class FormTest extends WicketTestCase
>                                         {
>                                                 error = true;
>                                         }
> +
> +                                       @Override
> +                                       protected AutoCompleteBuilder
> getAutoCompleteBuilder()
> +                                       {
> +                                               return
> AutoCompleteBuilder.init().forAddressType(AutoCompleteAddres
> sType.BILLING).forField(AutoCompleteFields.GIVEN_NAME);
> +                                       }
>                                 });
>                         }
>
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
> wicket-core/src/test/java/org/apache/wicket/markup/html/
> form/TextFieldTest.java
> ----------------------------------------------------------------------
> diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/TextFieldTest.java
> b/wicket-core/src/test/java/org/apache/wicket/markup/html/fo
> rm/TextFieldTest.java
> index 5af5917..2c215e5 100644
> --- a/wicket-core/src/test/java/org/apache/wicket/markup/html/fo
> rm/TextFieldTest.java
> +++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/fo
> rm/TextFieldTest.java
> @@ -36,7 +36,20 @@ import org.junit.Test;
>   */
>  public class TextFieldTest extends WicketTestCase
>  {
> -       /** */
> +
> +       /**
> +        * Test auto complete feature
> +        */
> +       @Test
> +       public void testAutoComplete(){
> +               TestPage testPage = new TestPage();
> +               tester.startPage(testPage);
> +               assertTrue(tester.getLastResponseAsString().contains("autocomplete=\"section-blue
> billing name\""));
> +       }
> +
> +       /**
> +        * Test that inputs are converted to null
> +        * */
>         @Test
>         public void emptyInputConvertedToNull()
>         {
> @@ -111,7 +124,13 @@ public class TextFieldTest extends WicketTestCase
>                 public TestPage()
>                 {
>                         add(form = new Form<>("form"));
> -                       form.add(textField = new TextField<>("text",
> textModel));
> +                       form.add(textField = new TextField<String>("text",
> textModel){
> +                               @Override
> +                               protected AutoCompleteBuilder
> getAutoCompleteBuilder()
> +                               {
> +                                       return
> AutoCompleteBuilder.init().withSection("blue").forAddressTyp
> e(AutoCompleteAddressType.BILLING).forField(AutoCompleteFields.NAME);
> +                               }
> +                       });
>                 }
>
>                 @Override
>
>