<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[175622] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/175622">175622</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2014-11-05 09:41:08 -0800 (Wed, 05 Nov 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Stop special-casing the empty string in HTMLInputElement.type setter
https://bugs.webkit.org/show_bug.cgi?id=138403

Reviewed by Ryosuke Niwa.

Source/WebCore:

Stop special-casing the empty string in HTMLInputElement.type setter.
Previously, if input.type is set to &quot;&quot;, we would remove the type
attribute. This is inconsistent with the specification and the behavior
of other browsers (tested Firefox 33 and Chrome 38). Instead, we should
set the attribute to the empty string.

Also stop treating null as a null string to align with the
specification and other browsers (tested Firefox 33 and Chrome 38).

Finally, update HTMLInputElement::setType() to take an AtomicString in
argument instead of a String as it ends up calling setAttribute(), and
thus needing an AtomicString.

Test: fast/dom/HTMLInputElement/input-type-attribute.html

* html/FileInputType.cpp:
(WebCore::UploadButtonElement::UploadButtonElement):
* html/HTMLInputElement.cpp:
(WebCore::HTMLInputElement::setType):
* html/HTMLInputElement.h:
* html/HTMLInputElement.idl:

LayoutTests:

Add layout test to check the functionality of the HTMLInputElement.type
getter and setter.

* fast/dom/HTMLInputElement/input-type-attribute-expected.txt: Added.
* fast/dom/HTMLInputElement/input-type-attribute.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorehtmlFileInputTypecpp">trunk/Source/WebCore/html/FileInputType.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLInputElementcpp">trunk/Source/WebCore/html/HTMLInputElement.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLInputElementh">trunk/Source/WebCore/html/HTMLInputElement.h</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLInputElementidl">trunk/Source/WebCore/html/HTMLInputElement.idl</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfastdomHTMLInputElementinputtypeattributeexpectedtxt">trunk/LayoutTests/fast/dom/HTMLInputElement/input-type-attribute-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastdomHTMLInputElementinputtypeattributehtml">trunk/LayoutTests/fast/dom/HTMLInputElement/input-type-attribute.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (175621 => 175622)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-11-05 17:35:17 UTC (rev 175621)
+++ trunk/LayoutTests/ChangeLog        2014-11-05 17:41:08 UTC (rev 175622)
</span><span class="lines">@@ -1,3 +1,16 @@
</span><ins>+2014-11-05  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        Stop special-casing the empty string in HTMLInputElement.type setter
+        https://bugs.webkit.org/show_bug.cgi?id=138403
+
+        Reviewed by Ryosuke Niwa.
+
+        Add layout test to check the functionality of the HTMLInputElement.type
+        getter and setter.
+
+        * fast/dom/HTMLInputElement/input-type-attribute-expected.txt: Added.
+        * fast/dom/HTMLInputElement/input-type-attribute.html: Added.
+
</ins><span class="cx"> 2014-11-05  Andreas Kling  &lt;akling@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Simple line layout: support text-transform: lowercase|uppercase|capitalize
</span></span></pre></div>
<a id="trunkLayoutTestsfastdomHTMLInputElementinputtypeattributeexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/dom/HTMLInputElement/input-type-attribute-expected.txt (0 => 175622)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/HTMLInputElement/input-type-attribute-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/dom/HTMLInputElement/input-type-attribute-expected.txt        2014-11-05 17:41:08 UTC (rev 175622)
</span><span class="lines">@@ -0,0 +1,37 @@
</span><ins>+Tests the HTMLInputElement type attribute
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+input = document.createElement('input')
+PASS input.type is &quot;text&quot;
+PASS input.hasAttribute('type') is false
+PASS input.getAttribute('type') is null
+input.type = 'button'
+PASS input.type is &quot;button&quot;
+PASS input.hasAttribute('type') is true
+PASS input.getAttribute('type') is &quot;button&quot;
+input.type = ''
+PASS input.type is &quot;text&quot;
+PASS input.hasAttribute('type') is true
+PASS input.getAttribute('type') is &quot;&quot;
+input.type = 'text'
+PASS input.type is &quot;text&quot;
+PASS input.hasAttribute('type') is true
+PASS input.getAttribute('type') is &quot;text&quot;
+input.type = 'invalid'
+PASS input.type is &quot;text&quot;
+PASS input.hasAttribute('type') is true
+PASS input.getAttribute('type') is &quot;invalid&quot;
+input.type = null
+PASS input.type is &quot;text&quot;
+PASS input.hasAttribute('type') is true
+PASS input.getAttribute('type') is &quot;null&quot;
+input.removeAttribute('type')
+PASS input.type is &quot;text&quot;
+PASS input.hasAttribute('type') is false
+PASS input.getAttribute('type') is null
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfastdomHTMLInputElementinputtypeattributehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/dom/HTMLInputElement/input-type-attribute.html (0 => 175622)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/HTMLInputElement/input-type-attribute.html                                (rev 0)
+++ trunk/LayoutTests/fast/dom/HTMLInputElement/input-type-attribute.html        2014-11-05 17:41:08 UTC (rev 175622)
</span><span class="lines">@@ -0,0 +1,43 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;script src=&quot;../../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;script&gt;
+description(&quot;Tests the HTMLInputElement type attribute&quot;);
+
+var input;
+evalAndLog(&quot;input = document.createElement('input')&quot;);
+
+shouldBeEqualToString(&quot;input.type&quot;, &quot;text&quot;);
+shouldBeFalse(&quot;input.hasAttribute('type')&quot;);
+shouldBeNull(&quot;input.getAttribute('type')&quot;);
+
+evalAndLog(&quot;input.type = 'button'&quot;);
+shouldBeEqualToString(&quot;input.type&quot;, &quot;button&quot;);
+shouldBeTrue(&quot;input.hasAttribute('type')&quot;);
+shouldBeEqualToString(&quot;input.getAttribute('type')&quot;, &quot;button&quot;);
+
+evalAndLog(&quot;input.type = ''&quot;);
+shouldBeEqualToString(&quot;input.type&quot;, &quot;text&quot;);
+shouldBeTrue(&quot;input.hasAttribute('type')&quot;);
+shouldBeEqualToString(&quot;input.getAttribute('type')&quot;, &quot;&quot;);
+
+evalAndLog(&quot;input.type = 'text'&quot;);
+shouldBeEqualToString(&quot;input.type&quot;, &quot;text&quot;);
+shouldBeTrue(&quot;input.hasAttribute('type')&quot;);
+shouldBeEqualToString(&quot;input.getAttribute('type')&quot;, &quot;text&quot;);
+
+evalAndLog(&quot;input.type = 'invalid'&quot;);
+shouldBeEqualToString(&quot;input.type&quot;, &quot;text&quot;);
+shouldBeTrue(&quot;input.hasAttribute('type')&quot;);
+shouldBeEqualToString(&quot;input.getAttribute('type')&quot;, &quot;invalid&quot;);
+
+evalAndLog(&quot;input.type = null&quot;);
+shouldBeEqualToString(&quot;input.type&quot;, &quot;text&quot;);
+shouldBeTrue(&quot;input.hasAttribute('type')&quot;);
+shouldBeEqualToString(&quot;input.getAttribute('type')&quot;, &quot;null&quot;);
+
+evalAndLog(&quot;input.removeAttribute('type')&quot;);
+shouldBeEqualToString(&quot;input.type&quot;, &quot;text&quot;);
+shouldBeFalse(&quot;input.hasAttribute('type')&quot;);
+shouldBeNull(&quot;input.getAttribute('type')&quot;);
+&lt;/script&gt;
+&lt;script src=&quot;../../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (175621 => 175622)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-11-05 17:35:17 UTC (rev 175621)
+++ trunk/Source/WebCore/ChangeLog        2014-11-05 17:41:08 UTC (rev 175622)
</span><span class="lines">@@ -1,3 +1,33 @@
</span><ins>+2014-11-05  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        Stop special-casing the empty string in HTMLInputElement.type setter
+        https://bugs.webkit.org/show_bug.cgi?id=138403
+
+        Reviewed by Ryosuke Niwa.
+
+        Stop special-casing the empty string in HTMLInputElement.type setter.
+        Previously, if input.type is set to &quot;&quot;, we would remove the type
+        attribute. This is inconsistent with the specification and the behavior
+        of other browsers (tested Firefox 33 and Chrome 38). Instead, we should
+        set the attribute to the empty string.
+
+        Also stop treating null as a null string to align with the
+        specification and other browsers (tested Firefox 33 and Chrome 38).
+
+        Finally, update HTMLInputElement::setType() to take an AtomicString in
+        argument instead of a String as it ends up calling setAttribute(), and
+        thus needing an AtomicString.
+
+
+        Test: fast/dom/HTMLInputElement/input-type-attribute.html
+
+        * html/FileInputType.cpp:
+        (WebCore::UploadButtonElement::UploadButtonElement):
+        * html/HTMLInputElement.cpp:
+        (WebCore::HTMLInputElement::setType):
+        * html/HTMLInputElement.h:
+        * html/HTMLInputElement.idl:
+
</ins><span class="cx"> 2014-11-05  peavo@outlook.com  &lt;peavo@outlook.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [WinCairo] Compile error, missing guard.
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlFileInputTypecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/FileInputType.cpp (175621 => 175622)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/FileInputType.cpp        2014-11-05 17:35:17 UTC (rev 175621)
+++ trunk/Source/WebCore/html/FileInputType.cpp        2014-11-05 17:41:08 UTC (rev 175622)
</span><span class="lines">@@ -71,7 +71,7 @@
</span><span class="cx"> UploadButtonElement::UploadButtonElement(Document&amp; document)
</span><span class="cx">     : HTMLInputElement(inputTag, document, 0, false)
</span><span class="cx"> {
</span><del>-    setType(ASCIILiteral(&quot;button&quot;));
</del><ins>+    setType(AtomicString(&quot;button&quot;, AtomicString::ConstructFromLiteral));
</ins><span class="cx">     setPseudo(AtomicString(&quot;-webkit-file-upload-button&quot;, AtomicString::ConstructFromLiteral));
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLInputElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLInputElement.cpp (175621 => 175622)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLInputElement.cpp        2014-11-05 17:35:17 UTC (rev 175621)
+++ trunk/Source/WebCore/html/HTMLInputElement.cpp        2014-11-05 17:41:08 UTC (rev 175622)
</span><span class="lines">@@ -425,16 +425,9 @@
</span><span class="cx">     m_inputType-&gt;handleBlurEvent();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void HTMLInputElement::setType(const String&amp; type)
</del><ins>+void HTMLInputElement::setType(const AtomicString&amp; type)
</ins><span class="cx"> {
</span><del>-    // FIXME: This should just call setAttribute. No reason to handle the empty string specially.
-    // We should write a test case to show that setting to the empty string does not remove the
-    // attribute in other browsers and then fix this. Note that setting to null *does* remove
-    // the attribute and setAttribute implements that.
-    if (type.isEmpty())
-        removeAttribute(typeAttr);
-    else
-        setAttribute(typeAttr, type);
</del><ins>+    setAttribute(typeAttr, type);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void HTMLInputElement::updateType()
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLInputElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLInputElement.h (175621 => 175622)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLInputElement.h        2014-11-05 17:35:17 UTC (rev 175621)
+++ trunk/Source/WebCore/html/HTMLInputElement.h        2014-11-05 17:41:08 UTC (rev 175622)
</span><span class="lines">@@ -167,7 +167,7 @@
</span><span class="cx">     bool sizeShouldIncludeDecoration(int&amp; preferredSize) const;
</span><span class="cx">     float decorationWidth() const;
</span><span class="cx"> 
</span><del>-    void setType(const String&amp;);
</del><ins>+    void setType(const AtomicString&amp;);
</ins><span class="cx"> 
</span><span class="cx">     virtual String value() const override;
</span><span class="cx">     void setValue(const String&amp;, ExceptionCode&amp;, TextFieldEventBehavior = DispatchNoEvent);
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLInputElementidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLInputElement.idl (175621 => 175622)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLInputElement.idl        2014-11-05 17:35:17 UTC (rev 175621)
+++ trunk/Source/WebCore/html/HTMLInputElement.idl        2014-11-05 17:41:08 UTC (rev 175622)
</span><span class="lines">@@ -54,7 +54,7 @@
</span><span class="cx"> #endif
</span><span class="cx">     [Reflect, URL] attribute DOMString src;
</span><span class="cx">     [Reflect] attribute DOMString step;
</span><del>-    [TreatNullAs=NullString] attribute DOMString type; // readonly dropped as part of DOM level 2
</del><ins>+    attribute DOMString type; // readonly dropped as part of DOM level 2
</ins><span class="cx">     [TreatNullAs=NullString] attribute DOMString defaultValue;
</span><span class="cx">     // See the discussion in https://bugs.webkit.org/show_bug.cgi?id=100085
</span><span class="cx"> #if defined(LANGUAGE_JAVASCRIPT) &amp;&amp; LANGUAGE_JAVASCRIPT
</span></span></pre>
</div>
</div>

</body>
</html>