Bug 1490661 - Part 1. Support HTML.enterKeyHint in Nighly. r=webidl,smaug,hsivonen
authorMakoto Kato <m_kato@ga2.so-net.ne.jp>
Tue, 23 Jun 2020 06:37:20 +0000
changeset 536732 7c732d35b39746dddb68cae556b97d2de6ecf5fd
parent 536731 9556117ca7806e17b79f8e894a13ba226b09c300
child 536733 9b7202e779eb71a7368c075fba8a183a3118fb43
push id37532
push userabutkovits@mozilla.com
push dateTue, 23 Jun 2020 16:15:06 +0000
treeherdermozilla-central@3add3a174755 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerswebidl, smaug, hsivonen
bugs1490661
milestone79.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1490661 - Part 1. Support HTML.enterKeyHint in Nighly. r=webidl,smaug,hsivonen On mobile platform, "ENTER" key on software keyboard key can sometimes change to "Next" and etc. Although Firefox OS/Firefox Android have `mozactionhint` attribute for its behaviour, This is standardized version of it. Chrome and Safari already support it now, so I would like to support this on Firefox/GeckoView Nightly. Differential Revision: https://phabricator.services.mozilla.com/D79641
dom/html/nsGenericHTMLElement.cpp
dom/html/nsGenericHTMLElement.h
dom/webidl/HTMLElement.webidl
modules/libpref/init/StaticPrefList.yaml
testing/web-platform/meta/html/dom/idlharness.https.html.ini
testing/web-platform/meta/html/dom/reflection-misc.html.ini
xpcom/ds/StaticAtoms.py
--- a/dom/html/nsGenericHTMLElement.cpp
+++ b/dom/html/nsGenericHTMLElement.cpp
@@ -117,16 +117,34 @@ static const nsAttrValue::EnumTable kInp
     {"tel", NS_INPUTMODE_TEL},
     {"url", NS_INPUTMODE_URL},
     {"email", NS_INPUTMODE_EMAIL},
     {"numeric", NS_INPUTMODE_NUMERIC},
     {"decimal", NS_INPUTMODE_DECIMAL},
     {"search", NS_INPUTMODE_SEARCH},
     {nullptr, 0}};
 
+static const uint8_t NS_ENTERKEYHINT_ENTER = 1;
+static const uint8_t NS_ENTERKEYHINT_DONE = 2;
+static const uint8_t NS_ENTERKEYHINT_GO = 3;
+static const uint8_t NS_ENTERKEYHINT_NEXT = 4;
+static const uint8_t NS_ENTERKEYHINT_PREVIOUS = 5;
+static const uint8_t NS_ENTERKEYHINT_SEARCH = 6;
+static const uint8_t NS_ENTERKEYHINT_SEND = 7;
+
+static const nsAttrValue::EnumTable kEnterKeyHintTable[] = {
+    {"enter", NS_ENTERKEYHINT_ENTER},
+    {"done", NS_ENTERKEYHINT_DONE},
+    {"go", NS_ENTERKEYHINT_GO},
+    {"next", NS_ENTERKEYHINT_NEXT},
+    {"previous", NS_ENTERKEYHINT_PREVIOUS},
+    {"search", NS_ENTERKEYHINT_SEARCH},
+    {"send", NS_ENTERKEYHINT_SEND},
+    {nullptr, 0}};
+
 nsresult nsGenericHTMLElement::CopyInnerTo(Element* aDst) {
   MOZ_ASSERT(!aDst->GetUncomposedDoc(),
              "Should not CopyInnerTo an Element in a document");
 
   auto reparse = aDst->OwnerDoc() == OwnerDoc() ? ReparseAttributes::No
                                                 : ReparseAttributes::Yes;
   nsresult rv = Element::CopyInnerTo(aDst, reparse);
   NS_ENSURE_SUCCESS(rv, rv);
@@ -852,16 +870,20 @@ bool nsGenericHTMLElement::ParseAttribut
     if (aAttribute == nsGkAtoms::rel) {
       aResult.ParseAtomArray(aValue);
       return true;
     }
 
     if (aAttribute == nsGkAtoms::inputmode) {
       return aResult.ParseEnumValue(aValue, kInputmodeTable, false);
     }
+
+    if (aAttribute == nsGkAtoms::enterkeyhint) {
+      return aResult.ParseEnumValue(aValue, kEnterKeyHintTable, false);
+    }
   }
 
   return nsGenericHTMLElementBase::ParseAttribute(
       aNamespaceID, aAttribute, aValue, aMaybeScriptedPrincipal, aResult);
 }
 
 bool nsGenericHTMLElement::ParseBackgroundAttribute(int32_t aNamespaceID,
                                                     nsAtom* aAttribute,
--- a/dom/html/nsGenericHTMLElement.h
+++ b/dom/html/nsGenericHTMLElement.h
@@ -175,16 +175,23 @@ class nsGenericHTMLElement : public nsGe
 
   void GetInputMode(nsAString& aValue) {
     GetEnumAttr(nsGkAtoms::inputmode, nullptr, aValue);
   }
   void SetInputMode(const nsAString& aValue, ErrorResult& aRv) {
     SetHTMLAttr(nsGkAtoms::inputmode, aValue, aRv);
   }
 
+  void GetEnterKeyHint(nsAString& aValue) {
+    GetEnumAttr(nsGkAtoms::enterkeyhint, nullptr, aValue);
+  }
+  void SetEnterKeyHint(const nsAString& aValue, ErrorResult& aRv) {
+    SetHTMLAttr(nsGkAtoms::enterkeyhint, aValue, aRv);
+  }
+
   /**
    * Determine whether an attribute is an event (onclick, etc.)
    * @param aName the attribute
    * @return whether the name is an event handler name
    */
   virtual bool IsEventAttributeNameInternal(nsAtom* aName) override;
 
 #define EVENT(name_, id_, type_, struct_) /* nothing; handled by nsINode */
--- a/dom/webidl/HTMLElement.webidl
+++ b/dom/webidl/HTMLElement.webidl
@@ -47,16 +47,18 @@ interface HTMLElement : Element {
   [Pure]
   readonly attribute HTMLMenuElement? contextMenu;
   //[SetterThrows]
   //         attribute HTMLMenuElement? contextMenu;
   [CEReactions, SetterThrows, Pure]
            attribute boolean spellcheck;
   [CEReactions, Pure, SetterThrows, Pref="dom.forms.inputmode"]
            attribute DOMString inputMode;
+  [CEReactions, Pure, SetterThrows, Pref="dom.forms.enterkeyhint"]
+           attribute DOMString enterKeyHint;
 
   attribute DOMString nonce;
 
   // command API
   //readonly attribute DOMString? commandType;
   //readonly attribute DOMString? commandLabel;
   //readonly attribute DOMString? commandIcon;
   //readonly attribute boolean? commandHidden;
--- a/modules/libpref/init/StaticPrefList.yaml
+++ b/modules/libpref/init/StaticPrefList.yaml
@@ -2021,16 +2021,22 @@
 
 # Support for input type=month, type=week and type=datetime-local. By default,
 # disabled.
 - name: dom.forms.datetime.others
   type: bool
   value: @IS_ANDROID@
   mirror: always
 
+# Is support for HTMLElement.enterKeyHint enabled?
+- name: dom.forms.enterkeyhint
+  type: bool
+  value: @IS_NIGHTLY_BUILD@
+  mirror: always
+
 # Is support for HTMLElement.inputMode enabled?
 - name: dom.forms.inputmode
   type: bool
 #if defined(ANDROID)
   value: true
 #else
   value: @IS_NOT_RELEASE_OR_BETA@
 #endif
--- a/testing/web-platform/meta/html/dom/idlharness.https.html.ini
+++ b/testing/web-platform/meta/html/dom/idlharness.https.html.ini
@@ -1,9 +1,9 @@
-prefs: [dom.security.featurePolicy.enabled:true, dom.security.featurePolicy.experimental.enabled:true, dom.security.featurePolicy.header.enabled:true, dom.security.featurePolicy.webidl.enabled:true, dom.webcomponents.elementInternals.enabled:true, dom.forms.requestsubmit.enabled:true, dom.forms.inputmode:true]
+prefs: [dom.security.featurePolicy.enabled:true, dom.security.featurePolicy.experimental.enabled:true, dom.security.featurePolicy.header.enabled:true, dom.security.featurePolicy.webidl.enabled:true, dom.webcomponents.elementInternals.enabled:true, dom.forms.requestsubmit.enabled:true, dom.forms.inputmode:true, dom.forms.enterkeyhint:true]
 [idlharness.https.html?exclude=(Document|Window|HTML.*)]
   [OffscreenCanvasRenderingContext2D interface: operation lineTo(unrestricted double, unrestricted double)]
     expected: FAIL
 
   [OffscreenCanvasRenderingContext2D interface: attribute globalAlpha]
     expected: FAIL
 
   [AudioTrack interface: existence and properties of interface prototype object]
@@ -880,19 +880,16 @@ prefs: [dom.security.featurePolicy.enabl
     expected: FAIL
 
   [HTMLDialogElement interface: operation show()]
     expected: FAIL
 
   [HTMLInputElement interface: createInput("search") must inherit property "dirName" with the proper type]
     expected: FAIL
 
-  [HTMLElement interface: attribute enterKeyHint]
-    expected: FAIL
-
   [HTMLInputElement interface: createInput("checkbox") must inherit property "dirName" with the proper type]
     expected: FAIL
 
   [HTMLFormElement interface: attribute relList]
     expected: FAIL
 
   [HTMLDialogElement interface: existence and properties of interface prototype object]
     expected: FAIL
@@ -937,19 +934,16 @@ prefs: [dom.security.featurePolicy.enabl
     expected: FAIL
 
   [HTMLInputElement interface: createInput("password") must inherit property "dirName" with the proper type]
     expected: FAIL
 
   [HTMLInputElement interface: document.createElement("input") must inherit property "dirName" with the proper type]
     expected: FAIL
 
-  [HTMLElement interface: document.createElement("noscript") must inherit property "enterKeyHint" with the proper type]
-    expected: FAIL
-
   [HTMLMediaElement interface: new Audio() must inherit property "videoTracks" with the proper type]
     expected: FAIL
 
   [HTMLDialogElement interface: existence and properties of interface prototype object's "constructor" property]
     expected: FAIL
 
   [HTMLMediaElement interface: attribute videoTracks]
     expected: FAIL
--- a/testing/web-platform/meta/html/dom/reflection-misc.html.ini
+++ b/testing/web-platform/meta/html/dom/reflection-misc.html.ini
@@ -1,10 +1,10 @@
 [reflection-misc.html]
-  prefs: [dom.dialog_element.enabled:true, dom.forms.inputmode:true]
+  prefs: [dom.dialog_element.enabled:true, dom.forms.inputmode:true, dom.forms.enterkeyhint:true]
   [script.nonce: IDL set to ""]
     expected: FAIL
 
   [script.nonce: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f  foo "]
     expected: FAIL
 
   [script.nonce: IDL set to undefined]
     expected: FAIL
@@ -46,340 +46,16 @@
     expected: FAIL
 
   [script.nonce: IDL set to null]
     expected: FAIL
 
   [script.nonce: IDL set to object "test-toString"]
     expected: FAIL
 
-  [undefinedelement.enterKeyHint: IDL set to "send\\0"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to null]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to ""]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to true]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "go"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "o"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "revious"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to null]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "go\\0"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "nter"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "xgo"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "next"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to Infinity]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to object "test-valueOf"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "enter"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to NaN]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "ENTER"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "NEXT"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "SEARCH"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "xgo"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "next\\0"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "DONE"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to Infinity]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "send"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "enter\\0"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "done\\0"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "PREVIOUS"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "nter"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "GO"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "search"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "NEXT"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "next\\0"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "xsend"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "\\0"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "SEARCH"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "done"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "ext"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "previous\\0"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "xsearch"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "xenter"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "SEND"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to false]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "GO"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "send"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "xprevious"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to object "test-valueOf"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "PREVIOUS"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to undefined]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "enter\\0"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "earch"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f  foo "]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to ""]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "go"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "search\\0"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to -Infinity]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to undefined]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "send\\0"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to 7]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "\\0"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "done\\0"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "end"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "ENTER"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "previous"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "xsend"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL get with DOM attribute unset]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "SEND"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "previous"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "xprevious"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to 1.5]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "5%"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "+100"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to ".5"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to 1.5]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "5%"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "+100"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to ".5"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "next"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to -Infinity]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f  foo "]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "one"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "earch"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "xnext"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "xnext"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "enter"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "xdone"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "DONE"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "o"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "xsearch"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "search\\0"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "end"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to false]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "one"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "xenter"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "go\\0"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to true]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "ext"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "search"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to object "test-toString"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to 7]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "xdone"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to object "[object Object\]"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to object "[object Object\]"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to object "test-toString"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to NaN]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "previous\\0"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: typeof IDL attribute]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "done"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "revious"]
-    expected: FAIL
-
   [script.autofocus: setAttribute() to NaN]
     expected: FAIL
 
   [undefinedelement.autofocus: setAttribute() to "5%"]
     expected: FAIL
 
   [details.autofocus: setAttribute() to "\\0"]
     expected: FAIL
@@ -1737,27 +1413,8 @@
   [html.autofocus: IDL set to " foo "]
     expected: FAIL
 
   [script.autofocus: IDL set to object "test-valueOf"]
     expected: FAIL
 
   [summary.autofocus: typeof IDL attribute]
     expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "previouſ"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "ſearch"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: IDL set to "ſend"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "ſend"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "ſearch"]
-    expected: FAIL
-
-  [undefinedelement.enterKeyHint: setAttribute() to "previouſ"]
-    expected: FAIL
-
--- a/xpcom/ds/StaticAtoms.py
+++ b/xpcom/ds/StaticAtoms.py
@@ -405,16 +405,17 @@ STATIC_ATOMS = [
     Atom("elements", "elements"),
     Atom("em", "em"),
     Atom("embed", "embed"),
     Atom("empty", "empty"),
     Atom("encoding", "encoding"),
     Atom("enctype", "enctype"),
     Atom("end", "end"),
     Atom("endEvent", "endEvent"),
+    Atom("enterkeyhint", "enterkeyhint"),
     Atom("equalsize", "equalsize"),
     Atom("error", "error"),
     Atom("ethiopic_numeric", "ethiopic-numeric"),
     Atom("even", "even"),
     Atom("event", "event"),
     Atom("events", "events"),
     Atom("excludeResultPrefixes", "exclude-result-prefixes"),
     Atom("exportparts", "exportparts"),