<!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>[179497] 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/179497">179497</a></dd>
<dt>Author</dt> <dd>benjamin@webkit.org</dd>
<dt>Date</dt> <dd>2015-02-02 14:00:50 -0800 (Mon, 02 Feb 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Clean up attribute handling: part 2 - attributeNode
https://bugs.webkit.org/show_bug.cgi?id=141109

Patch by Benjamin Poulain &lt;bpoulain@apple.com&gt; on 2015-02-02
Reviewed by Andreas Kling.

Source/WebCore:

Our implementation was covering some old legacy behaviors of Firefox,
even copying bugs in some cases.

The spec (https://dom.spec.whatwg.org) now defines the behavior precisely,
let's move a bit closer to that.

Tests: fast/dom/Element/attribute-ascii-case-insensitive-3.html
       fast/dom/Element/attribute-setAttributeNode-multiple-times.html
       fast/dom/Element/attribute-setAttributeNodeNS-multiple-times.html
       fast/dom/Element/mozilla-dom-base-tests/test_bug1075702.html
       fast/dom/Element/mozilla-dom-base-tests/test_bug339494.html
       fast/dom/Element/mozilla-dom-base-tests/test_bug364092.xhtml
       fast/dom/Element/setAttributeNode-overriding-lowercase-values.html

* dom/Element.cpp:
(WebCore::findAttrNodeInList):
New getter for the name-without-namespace case.

(WebCore::Element::setAttributeNode):
This one is the tricky one: https://dom.spec.whatwg.org/#dom-element-setattributenode

When setAttributeNode() is used with an AttributeNode without namespace,
getting the old value behaves like getAttribute(), with ASCII lowercase name matching.
When used with a namespace, getting the old value behaves like getAttributeNS().

Setting the value is a whole different story, the name used always keeps
the original case.

Now that's a bit tricky for us because AttributeNodes are just legacy stuff we don't
used internally.

We have 4 cases to handle:
1) The name being set is lowercase, there was no conflicting name on the element.
   That's easy, we just override any node that would exist, set the name otherwise.
2) The name is lowercase but there was an existing attribute for it.
   -We create a new AttributeNode for the name to represent the old name.
   -We check the names are the same with attribute.name().matches(attrNode-&gt;qualifiedName())
    and override the value.
3) The name has uppercase characters, there is no conflicting name.
   We would not find an element to remove, we just use setAttributeInternal() as usual
   to add the attribute;
4) The name has uppercase characters, there is a lowercase conflicing name.
   This is the weird behavior: we need to nuke the old attribute, then add the new attribute
   with a different case.

   First we remove the attribute with a lowercase name with removeAttributeInternal().
   That becomes the old node.

   There might still be an element of the same name as what we are trying to add. We don't want
   to add another version of the same attribute. We need to use findAttributeIndexByName() again
   to find if there is a conflicting attribute. Then we call setAttributeInternal() which handle
   the both the cases where there was an element or not.

(WebCore::Element::setAttributeNodeNS):
This should work like any &quot;NS&quot; method.

(WebCore::Element::removeAttributeNode):
The method removeAttributeNode() is supposed to be exact.

(WebCore::Element::getAttributeNode):
(WebCore::Element::hasAttribute):
(WebCore::Element::attrIfExists):
* dom/Element.h:
* dom/ElementData.cpp:
(WebCore::ElementData::findAttributeIndexByNameSlowCase): Deleted.
(WebCore::ElementData::findAttributeIndexByNameForAttributeNode): Deleted.
Kill the slow case, every caller has been updated now.
* dom/ElementData.h:
(WebCore::ElementData::findAttributeIndexByName):
* dom/QualifiedName.h:
(WebCore::QualifiedName::matchesIgnoringCaseForLocalName): Deleted.

LayoutTests:

Improve the coverage a little.

Not everything is right yet: some getters return an empty string when they
should return null.

* fast/dom/Element/attribute-ascii-case-insensitive-1-expected.txt:
This is now fixed :)

* fast/dom/Element/attribute-ascii-case-insensitive-3-expected.txt: Added.
* fast/dom/Element/attribute-ascii-case-insensitive-3.html: Added.
Test prefixed-like attribute defined through the parser.

* fast/dom/Element/attribute-setAttributeNode-multiple-times-expected.txt: Added.
* fast/dom/Element/attribute-setAttributeNode-multiple-times.html: Added.
Make sure we don't accumulate nodes.

* fast/dom/Element/attribute-setAttributeNodeNS-multiple-times-expected.txt: Added.
* fast/dom/Element/attribute-setAttributeNodeNS-multiple-times.html: Added.
Same without the crazy setter.

* fast/dom/Element/script-tests/getAttribute-check-case-sensitivity.js:
* fast/dom/Element/getAttribute-check-case-sensitivity-expected.txt:
With the latest spec, getting a node with any uppercase character through
getAttributeNode() always fails. Update the test to use .getAttributeNodeNS()
were needed.

* fast/dom/Element/mozilla-dom-base-tests/test_bug1075702-expected.txt: Added.
* fast/dom/Element/mozilla-dom-base-tests/test_bug1075702.html: Added.
* fast/dom/Element/mozilla-dom-base-tests/test_bug339494-expected.txt: Added.
* fast/dom/Element/mozilla-dom-base-tests/test_bug339494.html: Added.
* fast/dom/Element/mozilla-dom-base-tests/test_bug364092-expected.txt: Added.
* fast/dom/Element/mozilla-dom-base-tests/test_bug364092.xhtml: Added.
(testGetAttributeNodeMixedCase):
(testAttribNodeNamePreservesCaseGetNode):
(testAttribNodeNamePreservesCaseGetNode2):
Some related tests from Gecko, for completeness.

* fast/dom/Element/setAttributeNode-case-insensitivity-expected.txt:
* fast/dom/Element/setAttributeNode-case-insensitivity.html:
Test that the getAttribute part of setAttributeNode() do not ignore the prefix. The spec
says to use the name, not the localname.

* fast/dom/Element/setAttributeNode-for-existing-attribute-expected.txt:
* fast/dom/Element/setAttributeNode-for-existing-attribute.html:
This test was for legacy behavior that came from Firefox. Firefox does not do that anymore.
Keep the test around for regression catching, but add a sentence explaining the 'incorrect'
behavior.

* fast/dom/Element/setAttributeNode-overriding-lowercase-values-1-expected.txt: Added.
* fast/dom/Element/setAttributeNode-overriding-lowercase-values-1.html: Added.
* fast/dom/Element/setAttributeNode-overriding-lowercase-values-2-expected.txt: Added.
* fast/dom/Element/setAttributeNode-overriding-lowercase-values-2.html: Added.
Some coverage for the name overriding craziness.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsfastdomElementattributeasciicaseinsensitive1expectedtxt">trunk/LayoutTests/fast/dom/Element/attribute-ascii-case-insensitive-1-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastdomElementgetAttributecheckcasesensitivityexpectedtxt">trunk/LayoutTests/fast/dom/Element/getAttribute-check-case-sensitivity-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastdomElementscripttestsgetAttributecheckcasesensitivityjs">trunk/LayoutTests/fast/dom/Element/script-tests/getAttribute-check-case-sensitivity.js</a></li>
<li><a href="#trunkLayoutTestsfastdomElementsetAttributeNodecaseinsensitivityexpectedtxt">trunk/LayoutTests/fast/dom/Element/setAttributeNode-case-insensitivity-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastdomElementsetAttributeNodecaseinsensitivityhtml">trunk/LayoutTests/fast/dom/Element/setAttributeNode-case-insensitivity.html</a></li>
<li><a href="#trunkLayoutTestsfastdomElementsetAttributeNodeforexistingattributeexpectedtxt">trunk/LayoutTests/fast/dom/Element/setAttributeNode-for-existing-attribute-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastdomElementsetAttributeNodeforexistingattributehtml">trunk/LayoutTests/fast/dom/Element/setAttributeNode-for-existing-attribute.html</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoredomElementcpp">trunk/Source/WebCore/dom/Element.cpp</a></li>
<li><a href="#trunkSourceWebCoredomElementh">trunk/Source/WebCore/dom/Element.h</a></li>
<li><a href="#trunkSourceWebCoredomElementDatacpp">trunk/Source/WebCore/dom/ElementData.cpp</a></li>
<li><a href="#trunkSourceWebCoredomElementDatah">trunk/Source/WebCore/dom/ElementData.h</a></li>
<li><a href="#trunkSourceWebCoredomQualifiedNameh">trunk/Source/WebCore/dom/QualifiedName.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfastdomElementattributeasciicaseinsensitive3expectedtxt">trunk/LayoutTests/fast/dom/Element/attribute-ascii-case-insensitive-3-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastdomElementattributeasciicaseinsensitive3html">trunk/LayoutTests/fast/dom/Element/attribute-ascii-case-insensitive-3.html</a></li>
<li><a href="#trunkLayoutTestsfastdomElementattributesetAttributeNodemultipletimesexpectedtxt">trunk/LayoutTests/fast/dom/Element/attribute-setAttributeNode-multiple-times-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastdomElementattributesetAttributeNodemultipletimeshtml">trunk/LayoutTests/fast/dom/Element/attribute-setAttributeNode-multiple-times.html</a></li>
<li><a href="#trunkLayoutTestsfastdomElementattributesetAttributeNodeNSmultipletimesexpectedtxt">trunk/LayoutTests/fast/dom/Element/attribute-setAttributeNodeNS-multiple-times-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastdomElementattributesetAttributeNodeNSmultipletimeshtml">trunk/LayoutTests/fast/dom/Element/attribute-setAttributeNodeNS-multiple-times.html</a></li>
<li>trunk/LayoutTests/fast/dom/Element/mozilla-dom-base-tests/</li>
<li><a href="#trunkLayoutTestsfastdomElementmozilladombaseteststest_bug1075702expectedtxt">trunk/LayoutTests/fast/dom/Element/mozilla-dom-base-tests/test_bug1075702-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastdomElementmozilladombaseteststest_bug1075702html">trunk/LayoutTests/fast/dom/Element/mozilla-dom-base-tests/test_bug1075702.html</a></li>
<li><a href="#trunkLayoutTestsfastdomElementmozilladombaseteststest_bug339494expectedtxt">trunk/LayoutTests/fast/dom/Element/mozilla-dom-base-tests/test_bug339494-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastdomElementmozilladombaseteststest_bug339494html">trunk/LayoutTests/fast/dom/Element/mozilla-dom-base-tests/test_bug339494.html</a></li>
<li><a href="#trunkLayoutTestsfastdomElementmozilladombaseteststest_bug364092expectedtxt">trunk/LayoutTests/fast/dom/Element/mozilla-dom-base-tests/test_bug364092-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastdomElementmozilladombaseteststest_bug364092xhtml">trunk/LayoutTests/fast/dom/Element/mozilla-dom-base-tests/test_bug364092.xhtml</a></li>
<li><a href="#trunkLayoutTestsfastdomElementsetAttributeNodeoverridinglowercasevalues1expectedtxt">trunk/LayoutTests/fast/dom/Element/setAttributeNode-overriding-lowercase-values-1-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastdomElementsetAttributeNodeoverridinglowercasevalues1html">trunk/LayoutTests/fast/dom/Element/setAttributeNode-overriding-lowercase-values-1.html</a></li>
<li><a href="#trunkLayoutTestsfastdomElementsetAttributeNodeoverridinglowercasevalues2expectedtxt">trunk/LayoutTests/fast/dom/Element/setAttributeNode-overriding-lowercase-values-2-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastdomElementsetAttributeNodeoverridinglowercasevalues2html">trunk/LayoutTests/fast/dom/Element/setAttributeNode-overriding-lowercase-values-2.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (179496 => 179497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2015-02-02 21:55:11 UTC (rev 179496)
+++ trunk/LayoutTests/ChangeLog        2015-02-02 22:00:50 UTC (rev 179497)
</span><span class="lines">@@ -1,3 +1,64 @@
</span><ins>+2015-02-02  Benjamin Poulain  &lt;bpoulain@apple.com&gt;
+
+        Clean up attribute handling: part 2 - attributeNode
+        https://bugs.webkit.org/show_bug.cgi?id=141109
+
+        Reviewed by Andreas Kling.
+
+        Improve the coverage a little.
+
+        Not everything is right yet: some getters return an empty string when they
+        should return null.
+
+        * fast/dom/Element/attribute-ascii-case-insensitive-1-expected.txt:
+        This is now fixed :)
+
+        * fast/dom/Element/attribute-ascii-case-insensitive-3-expected.txt: Added.
+        * fast/dom/Element/attribute-ascii-case-insensitive-3.html: Added.
+        Test prefixed-like attribute defined through the parser.
+
+        * fast/dom/Element/attribute-setAttributeNode-multiple-times-expected.txt: Added.
+        * fast/dom/Element/attribute-setAttributeNode-multiple-times.html: Added.
+        Make sure we don't accumulate nodes.
+
+        * fast/dom/Element/attribute-setAttributeNodeNS-multiple-times-expected.txt: Added.
+        * fast/dom/Element/attribute-setAttributeNodeNS-multiple-times.html: Added.
+        Same without the crazy setter.
+
+        * fast/dom/Element/script-tests/getAttribute-check-case-sensitivity.js:
+        * fast/dom/Element/getAttribute-check-case-sensitivity-expected.txt:
+        With the latest spec, getting a node with any uppercase character through
+        getAttributeNode() always fails. Update the test to use .getAttributeNodeNS()
+        were needed.
+
+        * fast/dom/Element/mozilla-dom-base-tests/test_bug1075702-expected.txt: Added.
+        * fast/dom/Element/mozilla-dom-base-tests/test_bug1075702.html: Added.
+        * fast/dom/Element/mozilla-dom-base-tests/test_bug339494-expected.txt: Added.
+        * fast/dom/Element/mozilla-dom-base-tests/test_bug339494.html: Added.
+        * fast/dom/Element/mozilla-dom-base-tests/test_bug364092-expected.txt: Added.
+        * fast/dom/Element/mozilla-dom-base-tests/test_bug364092.xhtml: Added.
+        (testGetAttributeNodeMixedCase):
+        (testAttribNodeNamePreservesCaseGetNode):
+        (testAttribNodeNamePreservesCaseGetNode2):
+        Some related tests from Gecko, for completeness.
+
+        * fast/dom/Element/setAttributeNode-case-insensitivity-expected.txt:
+        * fast/dom/Element/setAttributeNode-case-insensitivity.html:
+        Test that the getAttribute part of setAttributeNode() do not ignore the prefix. The spec
+        says to use the name, not the localname.
+
+        * fast/dom/Element/setAttributeNode-for-existing-attribute-expected.txt:
+        * fast/dom/Element/setAttributeNode-for-existing-attribute.html:
+        This test was for legacy behavior that came from Firefox. Firefox does not do that anymore.
+        Keep the test around for regression catching, but add a sentence explaining the 'incorrect'
+        behavior.
+
+        * fast/dom/Element/setAttributeNode-overriding-lowercase-values-1-expected.txt: Added.
+        * fast/dom/Element/setAttributeNode-overriding-lowercase-values-1.html: Added.
+        * fast/dom/Element/setAttributeNode-overriding-lowercase-values-2-expected.txt: Added.
+        * fast/dom/Element/setAttributeNode-overriding-lowercase-values-2.html: Added.
+        Some coverage for the name overriding craziness.
+
</ins><span class="cx"> 2015-02-02  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Rebaseline test with new expected results.
</span></span></pre></div>
<a id="trunkLayoutTestsfastdomElementattributeasciicaseinsensitive1expectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/dom/Element/attribute-ascii-case-insensitive-1-expected.txt (179496 => 179497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/Element/attribute-ascii-case-insensitive-1-expected.txt        2015-02-02 21:55:11 UTC (rev 179496)
+++ trunk/LayoutTests/fast/dom/Element/attribute-ascii-case-insensitive-1-expected.txt        2015-02-02 22:00:50 UTC (rev 179497)
</span><span class="lines">@@ -11,9 +11,9 @@
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Data-æøå&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Data-æøå&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;DATA-æøå&quot;) is true
</span><span class="lines">@@ -27,9 +27,9 @@
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Data-æøå&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Data-æøå&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;DATA-æøå&quot;) is true
</span><span class="lines">@@ -45,9 +45,9 @@
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Data-æøå&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Data-æøå&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;DATA-æøå&quot;) is true
</span><span class="lines">@@ -61,9 +61,9 @@
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Data-æøå&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Data-æøå&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;DATA-æøå&quot;) is true
</span><span class="lines">@@ -79,9 +79,9 @@
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Data-æøå&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Data-æøå&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;DATA-æøå&quot;) is true
</span><span class="lines">@@ -95,9 +95,9 @@
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Data-æøå&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Data-æøå&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;DATA-æøå&quot;) is true
</span><span class="lines">@@ -113,9 +113,9 @@
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Data-Æøå&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Data-Æøå&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;DATA-Æøå&quot;) is true
</span><span class="lines">@@ -129,9 +129,9 @@
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Data-Æøå&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Data-Æøå&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;DATA-Æøå&quot;) is true
</span><span class="lines">@@ -147,9 +147,9 @@
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Data-Æøå&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Data-Æøå&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;DATA-Æøå&quot;) is true
</span><span class="lines">@@ -163,9 +163,9 @@
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Data-Æøå&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Data-Æøå&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;DATA-Æøå&quot;) is true
</span><span class="lines">@@ -181,9 +181,9 @@
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Data-Æøå&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Data-Æøå&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;DATA-Æøå&quot;) is true
</span><span class="lines">@@ -197,9 +197,9 @@
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Data-Æøå&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Data-Æøå&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;DATA-Æøå&quot;) is true
</span><span class="lines">@@ -215,9 +215,9 @@
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Data-ÆØÅ&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Data-ÆØÅ&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;DATA-ÆØÅ&quot;) is true
</span><span class="lines">@@ -231,9 +231,9 @@
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Data-ÆØÅ&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Data-ÆØÅ&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;DATA-ÆØÅ&quot;) is true
</span><span class="lines">@@ -249,9 +249,9 @@
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Data-ÆØÅ&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Data-ÆØÅ&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;DATA-ÆØÅ&quot;) is true
</span><span class="lines">@@ -265,9 +265,9 @@
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Data-ÆØÅ&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Data-ÆØÅ&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;DATA-ÆØÅ&quot;) is true
</span><span class="lines">@@ -283,9 +283,9 @@
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Data-ÆØÅ&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Data-ÆØÅ&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;DATA-ÆØÅ&quot;) is true
</span><span class="lines">@@ -299,9 +299,9 @@
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Data-ÆØÅ&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Data-ÆØÅ&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is false
</span><del>-FAIL document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) should be null (of type object). Was WebKit! (of type string).
</del><ins>+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is null
</ins><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is true
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is &quot;WebKit!&quot;
</span><span class="cx"> PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;DATA-ÆØÅ&quot;) is true
</span></span></pre></div>
<a id="trunkLayoutTestsfastdomElementattributeasciicaseinsensitive3expectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/dom/Element/attribute-ascii-case-insensitive-3-expected.txt (0 => 179497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/Element/attribute-ascii-case-insensitive-3-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/dom/Element/attribute-ascii-case-insensitive-3-expected.txt        2015-02-02 22:00:50 UTC (rev 179497)
</span><span class="lines">@@ -0,0 +1,1029 @@
</span><ins>+In HTML, attributes should be ASCII case-insensitive. This test includes basic coverage for setting names with the prefix syntax through the simple attribute API.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+Testing foo:data-æøå
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-æøå&quot;) is &quot;WebKit!&quot;
+
+Testing foo:DATA-æøå
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-æøå&quot;) is &quot;WebKit!&quot;
+
+Testing foo:Data-æøå
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-æøå&quot;) is &quot;WebKit!&quot;
+
+Testing FOO:data-æøå
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-æøå&quot;) is &quot;WebKit!&quot;
+
+Testing Foo:data-æøå
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-æøå&quot;) is &quot;WebKit!&quot;
+
+Testing foo:data-Æøå
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+
+Testing foo:DATA-Æøå
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+
+Testing foo:Data-Æøå
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+
+Testing FOO:data-Æøå
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+
+Testing Foo:data-Æøå
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-Æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-Æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-Æøå&quot;) is &quot;WebKit!&quot;
+
+Testing foo:data-ÆØÅ
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+
+Testing foo:DATA-ÆØÅ
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+
+Testing foo:Data-ÆØÅ
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+
+Testing FOO:data-ÆØÅ
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+
+Testing Foo:data-ÆØÅ
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:DATA-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:DATA-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;foo:Data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;foo:Data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOO:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOO:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Foo:data-ÆØÅ&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Foo:data-ÆØÅ&quot;) is &quot;WebKit!&quot;
+
+Testing fooæøå:data-æøå
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooæøå:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooæøå:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Fooæøå:DATA-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Fooæøå:DATA-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOOæøå:Data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOOæøå:Data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooÆøå:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooÆøå:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FooÆøå:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FooÆøå:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOOÆøå:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOOÆøå:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooæøå:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooæøå:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooæøå:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooæøå:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooæøå:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooæøå:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooæøå:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooæøå:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Fooæøå:DATA-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Fooæøå:DATA-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOOæøå:Data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOOæøå:Data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooæøå:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooæøå:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Fooæøå:DATA-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Fooæøå:DATA-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOOæøå:Data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOOæøå:Data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooÆøå:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooÆøå:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FooÆøå:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FooÆøå:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOOÆøå:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOOÆøå:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooæøå:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooæøå:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooæøå:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooæøå:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooæøå:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooæøå:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooæøå:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooæøå:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Fooæøå:DATA-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Fooæøå:DATA-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOOæøå:Data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOOæøå:Data-æøå&quot;) is &quot;WebKit!&quot;
+
+Testing Fooæøå:DATA-æøå
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooæøå:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooæøå:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Fooæøå:DATA-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Fooæøå:DATA-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOOæøå:Data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOOæøå:Data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooÆøå:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooÆøå:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FooÆøå:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FooÆøå:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOOÆøå:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOOÆøå:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooæøå:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooæøå:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooæøå:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooæøå:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooæøå:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooæøå:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooæøå:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooæøå:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Fooæøå:DATA-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Fooæøå:DATA-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOOæøå:Data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOOæøå:Data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooæøå:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooæøå:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Fooæøå:DATA-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Fooæøå:DATA-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOOæøå:Data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOOæøå:Data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooÆøå:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooÆøå:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FooÆøå:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FooÆøå:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOOÆøå:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOOÆøå:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooæøå:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooæøå:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooæøå:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooæøå:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooæøå:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooæøå:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooæøå:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooæøå:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Fooæøå:DATA-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Fooæøå:DATA-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOOæøå:Data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOOæøå:Data-æøå&quot;) is &quot;WebKit!&quot;
+
+Testing FOOæøå:Data-æøå
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooæøå:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooæøå:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Fooæøå:DATA-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Fooæøå:DATA-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOOæøå:Data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOOæøå:Data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooÆøå:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooÆøå:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FooÆøå:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FooÆøå:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOOÆøå:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOOÆøå:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooæøå:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooæøå:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooæøå:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooæøå:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooæøå:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooæøå:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooæøå:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooæøå:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Fooæøå:DATA-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Fooæøå:DATA-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOOæøå:Data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOOæøå:Data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooæøå:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooæøå:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Fooæøå:DATA-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Fooæøå:DATA-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOOæøå:Data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOOæøå:Data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooÆøå:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooÆøå:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FooÆøå:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FooÆøå:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOOÆøå:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOOÆøå:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooæøå:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooæøå:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooæøå:data-ÆØÅ&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooæøå:data-ÆØÅ&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooæøå:data-Æøå&quot;) is false
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooæøå:data-Æøå&quot;) is null
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;fooæøå:data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;fooæøå:data-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;Fooæøå:DATA-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;Fooæøå:DATA-æøå&quot;) is &quot;WebKit!&quot;
+PASS document.getElementById(&quot;target&quot;).hasAttribute(&quot;FOOæøå:Data-æøå&quot;) is true
+PASS document.getElementById(&quot;target&quot;).getAttribute(&quot;FOOæøå:Data-æøå&quot;) is &quot;WebKit!&quot;
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfastdomElementattributeasciicaseinsensitive3html"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/dom/Element/attribute-ascii-case-insensitive-3.html (0 => 179497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/Element/attribute-ascii-case-insensitive-3.html                                (rev 0)
+++ trunk/LayoutTests/fast/dom/Element/attribute-ascii-case-insensitive-3.html        2015-02-02 22:00:50 UTC (rev 179497)
</span><span class="lines">@@ -0,0 +1,71 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html xmlns:foo=&quot;http://www.webkit.org/awesome.html&quot;&gt;
+&lt;head&gt;
+&lt;meta charset=&quot;utf-8&quot;&gt;
+&lt;script src=&quot;../../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+    &lt;div id=&quot;test-container&quot; style=&quot;display: none;&quot;&gt;&lt;/div&gt;
+&lt;/body&gt;
+&lt;script&gt;
+description('In HTML, attributes should be ASCII case-insensitive. This test includes basic coverage for setting names with the prefix syntax through the simple attribute API.');
+
+var testContainer = document.getElementById('test-container');
+
+function testAttributeOnTarget(equivalentNames, distinctNames) {
+    for (var equivalentName of equivalentNames) {
+        shouldBeTrue('document.getElementById(&quot;target&quot;).hasAttribute(&quot;' + equivalentName + '&quot;)');
+        shouldBeEqualToString('document.getElementById(&quot;target&quot;).getAttribute(&quot;' + equivalentName + '&quot;)', 'WebKit!');
+    }
+
+    for (var distinctName of distinctNames) {
+        shouldBeFalse('document.getElementById(&quot;target&quot;).hasAttribute(&quot;' + distinctName + '&quot;)');
+        shouldBe('document.getElementById(&quot;target&quot;).getAttribute(&quot;' + distinctName + '&quot;)', 'null');
+    }
+
+    var target = document.getElementById(&quot;target&quot;);
+    for (var distinctName of distinctNames) {
+        target.removeAttribute(distinctName);
+    }
+
+    for (var equivalentName of equivalentNames) {
+        shouldBeTrue('document.getElementById(&quot;target&quot;).hasAttribute(&quot;' + equivalentName + '&quot;)');
+        shouldBeEqualToString('document.getElementById(&quot;target&quot;).getAttribute(&quot;' + equivalentName + '&quot;)', 'WebKit!');
+    }
+}
+
+function testParsedAttribute(attribute, equivalentNames, distinctNames) {
+    testContainer.innerHTML = '&lt;div ' + attribute + '=&quot;WebKit!&quot; id=&quot;target&quot;&gt;&lt;/div&gt;';
+    testAttributeOnTarget(equivalentNames, distinctNames);
+    testContainer.innerHTML = '';
+}
+
+function testAttributeFromDOMApis(attribute, equivalentNames, distinctNames) {
+    var newElement = document.createElement('div');
+    newElement.setAttribute('id', 'target');
+    newElement.setAttribute(attribute, &quot;WebKit!&quot;);
+    testContainer.appendChild(newElement);
+    testAttributeOnTarget(equivalentNames, distinctNames);
+    testContainer.innerHTML = '';
+}
+
+function testAttribute(equivalentNames, distinctNames) {
+    for (var testCase of equivalentNames) {
+        debug(&quot;Testing &quot; + testCase);
+        testParsedAttribute(testCase, equivalentNames, distinctNames);
+        testAttributeFromDOMApis(testCase, equivalentNames, distinctNames);
+        debug(&quot;&quot;);
+    }
+}
+
+// ASCII prefixes.
+testAttribute(['foo:data-æøå', 'foo:DATA-æøå', 'foo:Data-æøå', 'FOO:data-æøå', 'Foo:data-æøå'], ['data-ÆØÅ', 'data-Æøå', 'foo:data-ÆØÅ', 'foo:data-Æøå']);
+testAttribute(['foo:data-Æøå', 'foo:DATA-Æøå', 'foo:Data-Æøå', 'FOO:data-Æøå', 'Foo:data-Æøå'], ['data-ÆØÅ', 'data-æøå', 'foo:data-ÆØÅ', 'foo:data-æøå']);
+testAttribute(['foo:data-ÆØÅ', 'foo:DATA-ÆØÅ', 'foo:Data-ÆØÅ', 'FOO:data-ÆØÅ', 'Foo:data-ÆØÅ'], ['data-Æøå', 'data-æøå', 'foo:data-Æøå', 'foo:data-æøå']);
+
+// Non-ASCII prefixes.
+testAttribute(['fooæøå:data-æøå', 'Fooæøå:DATA-æøå', 'FOOæøå:Data-æøå'], ['fooÆøå:data-ÆØÅ', 'FooÆøå:data-Æøå', 'FOOÆøå:data-ÆØÅ', 'fooæøå:data-Æøå', 'fooæøå:data-ÆØÅ', 'fooæøå:data-Æøå']);
+
+&lt;/script&gt;
+&lt;script src=&quot;../../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfastdomElementattributesetAttributeNodemultipletimesexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/dom/Element/attribute-setAttributeNode-multiple-times-expected.txt (0 => 179497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/Element/attribute-setAttributeNode-multiple-times-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/dom/Element/attribute-setAttributeNode-multiple-times-expected.txt        2015-02-02 22:00:50 UTC (rev 179497)
</span><span class="lines">@@ -0,0 +1,27 @@
</span><ins>+Test using setAttributeNode() multiple times with &quot;compatible&quot; names and &quot;incompatible&quot; names.&quot;
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+Testing: FooBar
+PASS document.documentElement.attributes.length is 1
+PASS document.documentElement.attributes.length is 0
+PASS document.documentElement.attributes.length is 1
+PASS document.documentElement.attributes.length is 0
+
+Testing: foobar
+PASS document.documentElement.attributes.length is 1
+PASS document.documentElement.attributes.length is 0
+PASS document.documentElement.attributes.length is 1
+PASS document.documentElement.attributes.length is 0
+
+Testing: FOOBAR
+PASS document.documentElement.attributes.length is 1
+PASS document.documentElement.attributes.length is 0
+PASS document.documentElement.attributes.length is 1
+PASS document.documentElement.attributes.length is 0
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfastdomElementattributesetAttributeNodemultipletimeshtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/dom/Element/attribute-setAttributeNode-multiple-times.html (0 => 179497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/Element/attribute-setAttributeNode-multiple-times.html                                (rev 0)
+++ trunk/LayoutTests/fast/dom/Element/attribute-setAttributeNode-multiple-times.html        2015-02-02 22:00:50 UTC (rev 179497)
</span><span class="lines">@@ -0,0 +1,61 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;meta charset=&quot;utf-8&quot;&gt;
+&lt;script src=&quot;../../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+    &lt;div id=&quot;test-container&quot; style=&quot;display: none;&quot;&gt;&lt;/div&gt;
+&lt;/body&gt;
+&lt;script&gt;
+description('Test using setAttributeNode() multiple times with &quot;compatible&quot; names and &quot;incompatible&quot; names.&quot;');
+
+function setSameAttributeNodeMultipleTimes(name) {
+     // Set the same attribute node several times.
+    var foobar = document.createAttribute(name);
+    document.documentElement.setAttributeNode(foobar);
+    document.documentElement.setAttributeNode(foobar);
+    document.documentElement.setAttributeNode(foobar);
+
+    foobar.value = 'WebKit!';
+    document.documentElement.setAttributeNode(foobar);
+    document.documentElement.setAttributeNode(foobar);
+    document.documentElement.setAttributeNode(foobar);
+
+    shouldBe('document.documentElement.attributes.length', '1');
+
+    document.documentElement.removeAttributeNode(foobar);
+    shouldBe('document.documentElement.attributes.length', '0');
+}
+
+function setAttributeNodesOfSameNameMultipleTimes(name) {
+    // Set the same attribute node several times.
+    document.documentElement.setAttributeNode(document.createAttribute(name));
+    document.documentElement.setAttributeNode(document.createAttribute(name));
+    document.documentElement.setAttributeNode(document.createAttribute(name));
+
+    document.documentElement.setAttributeNode(document.createAttribute(name));
+    document.documentElement.setAttributeNode(document.createAttribute(name));
+    document.documentElement.setAttributeNode(document.createAttribute(name));
+
+    shouldBe('document.documentElement.attributes.length', '1');
+
+    var foobar = document.createAttribute(name);
+    document.documentElement.setAttributeNode(foobar);
+    document.documentElement.removeAttributeNode(foobar);
+    shouldBe('document.documentElement.attributes.length', '0');
+}
+
+function testName(name) {
+    debug(&quot;Testing: &quot; + name);
+    setSameAttributeNodeMultipleTimes(name);
+    setAttributeNodesOfSameNameMultipleTimes(name);
+    debug(&quot;&quot;);
+}
+
+testName(&quot;FooBar&quot;);
+testName(&quot;foobar&quot;);
+testName(&quot;FOOBAR&quot;);
+&lt;/script&gt;
+&lt;script src=&quot;../../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfastdomElementattributesetAttributeNodeNSmultipletimesexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/dom/Element/attribute-setAttributeNodeNS-multiple-times-expected.txt (0 => 179497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/Element/attribute-setAttributeNodeNS-multiple-times-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/dom/Element/attribute-setAttributeNodeNS-multiple-times-expected.txt        2015-02-02 22:00:50 UTC (rev 179497)
</span><span class="lines">@@ -0,0 +1,27 @@
</span><ins>+Test using setAttributeNodeNS() multiple times with &quot;compatible&quot; names and &quot;incompatible&quot; names.&quot;
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+Testing: FooBar
+PASS document.documentElement.attributes.length is 1
+PASS document.documentElement.attributes.length is 0
+PASS document.documentElement.attributes.length is 1
+PASS document.documentElement.attributes.length is 0
+
+Testing: foobar
+PASS document.documentElement.attributes.length is 1
+PASS document.documentElement.attributes.length is 0
+PASS document.documentElement.attributes.length is 1
+PASS document.documentElement.attributes.length is 0
+
+Testing: FOOBAR
+PASS document.documentElement.attributes.length is 1
+PASS document.documentElement.attributes.length is 0
+PASS document.documentElement.attributes.length is 1
+PASS document.documentElement.attributes.length is 0
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfastdomElementattributesetAttributeNodeNSmultipletimeshtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/dom/Element/attribute-setAttributeNodeNS-multiple-times.html (0 => 179497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/Element/attribute-setAttributeNodeNS-multiple-times.html                                (rev 0)
+++ trunk/LayoutTests/fast/dom/Element/attribute-setAttributeNodeNS-multiple-times.html        2015-02-02 22:00:50 UTC (rev 179497)
</span><span class="lines">@@ -0,0 +1,61 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;meta charset=&quot;utf-8&quot;&gt;
+&lt;script src=&quot;../../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+    &lt;div id=&quot;test-container&quot; style=&quot;display: none;&quot;&gt;&lt;/div&gt;
+&lt;/body&gt;
+&lt;script&gt;
+description('Test using setAttributeNodeNS() multiple times with &quot;compatible&quot; names and &quot;incompatible&quot; names.&quot;');
+
+function setSameAttributeNodeMultipleTimes(name) {
+     // Set the same attribute node several times.
+    var foobar = document.createAttribute(name);
+    document.documentElement.setAttributeNodeNS(foobar);
+    document.documentElement.setAttributeNodeNS(foobar);
+    document.documentElement.setAttributeNodeNS(foobar);
+
+    foobar.value = 'WebKit!';
+    document.documentElement.setAttributeNodeNS(foobar);
+    document.documentElement.setAttributeNodeNS(foobar);
+    document.documentElement.setAttributeNodeNS(foobar);
+
+    shouldBe('document.documentElement.attributes.length', '1');
+
+    document.documentElement.removeAttributeNode(foobar);
+    shouldBe('document.documentElement.attributes.length', '0');
+}
+
+function setAttributeNodesOfSameNameMultipleTimes(name) {
+    // Set the same attribute node several times.
+    document.documentElement.setAttributeNodeNS(document.createAttribute(name));
+    document.documentElement.setAttributeNodeNS(document.createAttribute(name));
+    document.documentElement.setAttributeNodeNS(document.createAttribute(name));
+
+    document.documentElement.setAttributeNodeNS(document.createAttribute(name));
+    document.documentElement.setAttributeNodeNS(document.createAttribute(name));
+    document.documentElement.setAttributeNodeNS(document.createAttribute(name));
+
+    shouldBe('document.documentElement.attributes.length', '1');
+
+    var foobar = document.createAttribute(name);
+    document.documentElement.setAttributeNodeNS(foobar);
+    document.documentElement.removeAttributeNode(foobar);
+    shouldBe('document.documentElement.attributes.length', '0');
+}
+
+function testName(name) {
+    debug(&quot;Testing: &quot; + name);
+    setSameAttributeNodeMultipleTimes(name);
+    setAttributeNodesOfSameNameMultipleTimes(name);
+    debug(&quot;&quot;);
+}
+
+testName(&quot;FooBar&quot;);
+testName(&quot;foobar&quot;);
+testName(&quot;FOOBAR&quot;);
+&lt;/script&gt;
+&lt;script src=&quot;../../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfastdomElementgetAttributecheckcasesensitivityexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/dom/Element/getAttribute-check-case-sensitivity-expected.txt (179496 => 179497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/Element/getAttribute-check-case-sensitivity-expected.txt        2015-02-02 21:55:11 UTC (rev 179496)
+++ trunk/LayoutTests/fast/dom/Element/getAttribute-check-case-sensitivity-expected.txt        2015-02-02 22:00:50 UTC (rev 179497)
</span><span class="lines">@@ -14,8 +14,8 @@
</span><span class="cx"> PASS testAttribNodeNamePreservesCaseGetNode2() is &quot;B,B&quot;
</span><span class="cx"> PASS testAttribNodeNameGetMutate() is &quot;1&quot;
</span><span class="cx"> PASS (new XMLSerializer).serializeToString(node) is &quot;&lt;div xmlns=\&quot;http://www.w3.org/1999/xhtml\&quot; myAttrib=\&quot;XXX\&quot;&gt;&lt;/div&gt;&quot;
</span><del>-PASS node.getAttributeNode('myAttrib').name is &quot;myAttrib&quot;
-PASS node.getAttributeNode('myattrib').name is &quot;myAttrib&quot;
</del><ins>+PASS node.getAttributeNodeNS('', 'myAttrib').name is &quot;myAttrib&quot;
+PASS node.getAttributeNodeNS('', 'myattrib') is null
</ins><span class="cx"> PASS attrib.name is &quot;myAttrib&quot;
</span><span class="cx"> PASS successfullyParsed is true
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsfastdomElementmozilladombaseteststest_bug1075702expectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/dom/Element/mozilla-dom-base-tests/test_bug1075702-expected.txt (0 => 179497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/Element/mozilla-dom-base-tests/test_bug1075702-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/dom/Element/mozilla-dom-base-tests/test_bug1075702-expected.txt        2015-02-02 22:00:50 UTC (rev 179497)
</span><span class="lines">@@ -0,0 +1,14 @@
</span><ins>+Test adapted from Mozilla Bug 1075702
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+PASS document.documentElement.hasAttributeNS(&quot;&quot;, &quot;aa&quot;) is false
+PASS document.documentElement.getAttributeNS(&quot;&quot;, &quot;aa&quot;) is &quot;&quot;
+PASS document.documentElement.hasAttributeNS(&quot;&quot;, &quot;AA&quot;) is true
+PASS document.documentElement.getAttributeNS(&quot;&quot;, &quot;AA&quot;) is &quot;UPPERCASE&quot;
+PASS successfullyParsed is true
+
+TEST COMPLETE
+Mozilla Bug 1075702
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfastdomElementmozilladombaseteststest_bug1075702html"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/dom/Element/mozilla-dom-base-tests/test_bug1075702.html (0 => 179497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/Element/mozilla-dom-base-tests/test_bug1075702.html                                (rev 0)
+++ trunk/LayoutTests/fast/dom/Element/mozilla-dom-base-tests/test_bug1075702.html        2015-02-02 22:00:50 UTC (rev 179497)
</span><span class="lines">@@ -0,0 +1,39 @@
</span><ins>+&lt;!DOCTYPE HTML&gt;
+&lt;html&gt;
+&lt;!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1075702
+--&gt;
+&lt;head&gt;
+    &lt;meta charset=&quot;utf-8&quot;&gt;
+    &lt;script src=&quot;../../../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;a target=&quot;_blank&quot; href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=1075702&quot;&gt; Mozilla Bug 1075702 &lt;/a&gt;
+&lt;p id=&quot;display&quot;&gt;&lt;/p&gt;
+
+&lt;pre id=&quot;test&quot;&gt;&lt;/pre&gt;
+&lt;script type=&quot;application/javascript&quot;&gt;
+
+  /** Test for Bug 1075702 **/
+  // test: Element.removeAttributeNode()
+  description(&quot;Test adapted from Mozilla Bug 1075702&quot;);
+
+  var a1 = document.createAttribute(&quot;aa&quot;);
+  a1.nodeValue = &quot;lowercase&quot;;
+
+  var a2 = document.createAttribute(&quot;AA&quot;);
+  a2.nodeValue = &quot;UPPERCASE&quot;;
+
+  document.documentElement.setAttributeNode(a1);
+
+  document.documentElement.setAttributeNode(a2);
+
+  shouldBeFalse('document.documentElement.hasAttributeNS(&quot;&quot;, &quot;aa&quot;)');
+  shouldBeEqualToString('document.documentElement.getAttributeNS(&quot;&quot;, &quot;aa&quot;)', '');
+  shouldBeTrue('document.documentElement.hasAttributeNS(&quot;&quot;, &quot;AA&quot;)');
+  shouldBeEqualToString('document.documentElement.getAttributeNS(&quot;&quot;, &quot;AA&quot;)', 'UPPERCASE');
+
+&lt;/script&gt;
+&lt;script src=&quot;../../../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfastdomElementmozilladombaseteststest_bug339494expectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/dom/Element/mozilla-dom-base-tests/test_bug339494-expected.txt (0 => 179497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/Element/mozilla-dom-base-tests/test_bug339494-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/dom/Element/mozilla-dom-base-tests/test_bug339494-expected.txt        2015-02-02 22:00:50 UTC (rev 179497)
</span><span class="lines">@@ -0,0 +1,6 @@
</span><ins>+PASS successfullyParsed is true
+
+TEST COMPLETE
+Mozilla Bug 339494
+
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfastdomElementmozilladombaseteststest_bug339494html"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/dom/Element/mozilla-dom-base-tests/test_bug339494.html (0 => 179497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/Element/mozilla-dom-base-tests/test_bug339494.html                                (rev 0)
+++ trunk/LayoutTests/fast/dom/Element/mozilla-dom-base-tests/test_bug339494.html        2015-02-02 22:00:50 UTC (rev 179497)
</span><span class="lines">@@ -0,0 +1,58 @@
</span><ins>+&lt;!DOCTYPE HTML&gt;
+&lt;html&gt;
+&lt;!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=339494
+--&gt;
+&lt;head&gt;
+    &lt;meta charset=&quot;utf-8&quot;&gt;
+    &lt;script src=&quot;../../../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;a target=&quot;_blank&quot; href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=339494&quot;&gt;Mozilla Bug 339494&lt;/a&gt;
+&lt;p id=&quot;display&quot;&gt;&lt;/p&gt;
+&lt;div id=&quot;content&quot; style=&quot;display: none&quot;&gt;
+  &lt;div id=&quot;d&quot;&gt;&lt;/div&gt;
+  &lt;div id=&quot;s&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+&lt;pre id=&quot;test&quot;&gt;
+&lt;script class=&quot;testbody&quot; type=&quot;text/javascript&quot;&gt;
+
+  /** Test for Bug 339494 **/
+
+  var d = document.getElementById(&quot;d&quot;);
+  
+  d.setAttribute(&quot;hhh&quot;, &quot;testvalue&quot;);
+
+  document.addEventListener(&quot;DOMAttrModified&quot;, removeItAgain, false);
+  d.removeAttribute(&quot;hhh&quot;);
+  document.removeEventListener(&quot;DOMAttrModified&quot;, removeItAgain, false);
+
+  function removeItAgain()
+  {
+    shouldBeTrue('!d.hasAttribute(&quot;hhh&quot;)');
+    shouldNotBeEqualToString('d.getAttribute(&quot;hhh&quot;)', &quot;testvalue&quot;);
+    document.removeEventListener(&quot;DOMAttrModified&quot;, removeItAgain, false);
+    d.removeAttribute(&quot;hhh&quot;);
+  }
+  
+  var s = document.getElementById(&quot;s&quot;);
+  
+  s.setAttribute(&quot;ggg&quot;, &quot;testvalue&quot;);
+
+  document.addEventListener(&quot;DOMAttrModified&quot;, compareVal, false);
+  s.setAttribute(&quot;ggg&quot;, &quot;othervalue&quot;);
+  document.removeEventListener(&quot;DOMAttrModified&quot;, compareVal, false);
+
+  function compareVal()
+  {
+    shouldBeTrue('s.hasAttribute(&quot;ggg&quot;)');
+    shouldNotBeEqualToString('s.getAttribute(&quot;ggg&quot;)', &quot;testvalue&quot;);
+    shouldBeEqualToString('s.getAttribute(&quot;ggg&quot;)', &quot;othervalue&quot;);
+  }
+
+&lt;/script&gt;
+&lt;/pre&gt;
+&lt;script src=&quot;../../../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfastdomElementmozilladombaseteststest_bug364092expectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/dom/Element/mozilla-dom-base-tests/test_bug364092-expected.txt (0 => 179497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/Element/mozilla-dom-base-tests/test_bug364092-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/dom/Element/mozilla-dom-base-tests/test_bug364092-expected.txt        2015-02-02 22:00:50 UTC (rev 179497)
</span><span class="lines">@@ -0,0 +1,7 @@
</span><ins>+PASS successfullyParsed is true
+
+TEST COMPLETE
+Mozilla Bug 364092
+
+
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfastdomElementmozilladombaseteststest_bug364092xhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/dom/Element/mozilla-dom-base-tests/test_bug364092.xhtml (0 => 179497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/Element/mozilla-dom-base-tests/test_bug364092.xhtml                                (rev 0)
+++ trunk/LayoutTests/fast/dom/Element/mozilla-dom-base-tests/test_bug364092.xhtml        2015-02-02 22:00:50 UTC (rev 179497)
</span><span class="lines">@@ -0,0 +1,41 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot;?&gt;
+&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
+&lt;!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=364092
+--&gt;
+&lt;head&gt;
+    &lt;meta charset=&quot;utf-8&quot; /&gt;
+    &lt;script src=&quot;../../../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;a target=&quot;_blank&quot; href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=364092&quot;&gt;Mozilla Bug 364092&lt;/a&gt;
+&lt;p id=&quot;display&quot;&gt;&lt;/p&gt;
+&lt;div id=&quot;content&quot; style=&quot;display: none&quot;&gt;
+  
+&lt;/div&gt;
+&lt;div id=&quot;test1&quot; foo=&quot;foo&quot;/&gt;
+&lt;pre id=&quot;test&quot;&gt;
+&lt;script class=&quot;testbody&quot; type=&quot;text/javascript&quot;&gt;
+/** Test for Bug 364092 **/
+
+  var test1 = document.getElementById(&quot;test1&quot;);
+  var attrNode = test1.getAttributeNode(&quot;foo&quot;);
+  function mutationHandler(aEvent) {
+    mutationEvent = aEvent;
+    shouldBe('attrNode', 'mutationEvent.relatedNode');
+    shouldBeFalse('test1.hasAttribute(&quot;foo&quot;)');
+  }
+
+  function runTest() {
+    test1.addEventListener(&quot;DOMAttrModified&quot;, mutationHandler, true);
+    test1.removeAttributeNode(attrNode);
+    test1.removeEventListener(&quot;DOMAttrModified&quot;, mutationHandler, true);
+  }
+
+   runTest();
+&lt;/script&gt;
+&lt;/pre&gt;
+&lt;script src=&quot;../../../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfastdomElementscripttestsgetAttributecheckcasesensitivityjs"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/dom/Element/script-tests/getAttribute-check-case-sensitivity.js (179496 => 179497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/Element/script-tests/getAttribute-check-case-sensitivity.js        2015-02-02 21:55:11 UTC (rev 179496)
+++ trunk/LayoutTests/fast/dom/Element/script-tests/getAttribute-check-case-sensitivity.js        2015-02-02 22:00:50 UTC (rev 179497)
</span><span class="lines">@@ -19,7 +19,7 @@
</span><span class="cx">     var a = div.ownerDocument.createAttribute(&quot;mixedCaseAttrib&quot;);
</span><span class="cx">     a.nodeValue = &quot;x&quot;;
</span><span class="cx">     div.setAttributeNode(a);
</span><del>-    return div.getAttribute(&quot;mixedCaseAttrib&quot;);
</del><ins>+    return div.getAttributeNS(&quot;&quot;, &quot;mixedCaseAttrib&quot;);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> shouldBe(&quot;testGetAttributeNodeMixedCase()&quot;, '&quot;x&quot;');
</span><span class="lines">@@ -74,7 +74,7 @@
</span><span class="cx"> 
</span><span class="cx">     body.setAttributeNode(a);
</span><span class="cx"> 
</span><del>-    a = document.body.getAttributeNode(&quot;A&quot;);
</del><ins>+    a = document.body.getAttributeNodeNS(&quot;&quot;, &quot;A&quot;);
</ins><span class="cx">     if (!a)
</span><span class="cx">         return &quot;FAIL&quot;;
</span><span class="cx"> 
</span><span class="lines">@@ -94,7 +94,7 @@
</span><span class="cx"> 
</span><span class="cx">     body.setAttributeNode(a);
</span><span class="cx"> 
</span><del>-    a = document.body.getAttributeNode(&quot;B&quot;);
</del><ins>+    a = document.body.getAttributeNodeNS(&quot;&quot;, &quot;B&quot;);
</ins><span class="cx">     if (!a)
</span><span class="cx">         return &quot;FAIL&quot;;
</span><span class="cx"> 
</span><span class="lines">@@ -103,7 +103,7 @@
</span><span class="cx">     a.nodeValue = &quot;x&quot;;
</span><span class="cx">     body.setAttributeNode(a);
</span><span class="cx"> 
</span><del>-    a = document.body.getAttributeNode(&quot;B&quot;);
</del><ins>+    a = document.body.getAttributeNodeNS(&quot;&quot;, &quot;B&quot;);
</ins><span class="cx">       
</span><span class="cx">     var result = [ a.name, a.nodeName ];
</span><span class="cx">     return result.join(&quot;,&quot;);
</span><span class="lines">@@ -136,6 +136,6 @@
</span><span class="cx"> node.setAttributeNode(attrib);
</span><span class="cx"> 
</span><span class="cx"> shouldBe(&quot;(new XMLSerializer).serializeToString(node)&quot;, '&quot;&lt;div xmlns=\\&quot;http://www.w3.org/1999/xhtml\\&quot; myAttrib=\\&quot;XXX\\&quot;&gt;&lt;/div&gt;&quot;');
</span><del>-shouldBe(&quot;node.getAttributeNode('myAttrib').name&quot;, '&quot;myAttrib&quot;');
-shouldBe(&quot;node.getAttributeNode('myattrib').name&quot;, '&quot;myAttrib&quot;');
</del><ins>+shouldBe(&quot;node.getAttributeNodeNS('', 'myAttrib').name&quot;, '&quot;myAttrib&quot;');
+shouldBe(&quot;node.getAttributeNodeNS('', 'myattrib')&quot;, 'null');
</ins><span class="cx"> shouldBe(&quot;attrib.name&quot;, '&quot;myAttrib&quot;');
</span></span></pre></div>
<a id="trunkLayoutTestsfastdomElementsetAttributeNodecaseinsensitivityexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/dom/Element/setAttributeNode-case-insensitivity-expected.txt (179496 => 179497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/Element/setAttributeNode-case-insensitivity-expected.txt        2015-02-02 21:55:11 UTC (rev 179496)
+++ trunk/LayoutTests/fast/dom/Element/setAttributeNode-case-insensitivity-expected.txt        2015-02-02 22:00:50 UTC (rev 179497)
</span><span class="lines">@@ -1,16 +1,17 @@
</span><del>-Test for Bugzilla bug: 90341: createAttribute/setAttributeNode does not properly normalize case.
</del><span class="cx"> This test verifies that the setAttributeNode() API checks for existing attributes case-insensitively. Thus the value of an existing attribute with the same name but in a different case should get replaced by the new value specified via the setAttributeNode() method.
</span><span class="cx"> 
</span><span class="cx"> On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> PASS test.getAttribute('style') is test.getAttribute('STYLE')
</span><del>-PASS test.getAttributeNode('style').value is test.getAttributeNode('STYLE').value
</del><ins>+PASS test.getAttributeNode('style') is null
</ins><span class="cx"> Verifying that attributes with the same name but different namespaces are treated as unique entities. For the following test two different attribute values should be returned.
</span><span class="cx"> PASS test.getAttributeNodeNS('ns1', 'newattr').value is 'newattr1'
</span><span class="cx"> PASS test.getAttributeNodeNS('ns2', 'newattr').value is 'newattr2'
</span><span class="cx"> Verifying that attributes with same name but different case and having same namespaces are treated as same. In the following test the new attribute should overwrite the value of the existing one.
</span><del>-PASS test.getAttributeNodeNS('ns1', 'newattr').value is 'newattr3'
</del><ins>+PASS test.getAttributeNodeNS('ns1', 'NEWATTR').value is &quot;newattr3&quot;
+PASS test.getAttributeNodeNS('ns1', 'newattr').value is &quot;newattr1&quot;
</ins><span class="cx"> PASS successfullyParsed is true
</span><span class="cx"> 
</span><span class="cx"> TEST COMPLETE
</span><del>-
</del><ins>+Test for Bugzilla bug: 90341: createAttribute/setAttributeNode does not properly normalize case.
</ins></span></pre></div>
<a id="trunkLayoutTestsfastdomElementsetAttributeNodecaseinsensitivityhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/dom/Element/setAttributeNode-case-insensitivity.html (179496 => 179497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/Element/setAttributeNode-case-insensitivity.html        2015-02-02 21:55:11 UTC (rev 179496)
+++ trunk/LayoutTests/fast/dom/Element/setAttributeNode-case-insensitivity.html        2015-02-02 22:00:50 UTC (rev 179497)
</span><span class="lines">@@ -2,54 +2,48 @@
</span><span class="cx"> &lt;html&gt;
</span><span class="cx"> &lt;head&gt;
</span><span class="cx"> &lt;script src=&quot;../../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
</span><ins>+&lt;/head&gt;
+&lt;body&gt;
+&lt;div&gt;Test for Bugzilla bug:&lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=90341&quot;&gt; 90341:&lt;/a&gt;  createAttribute/setAttributeNode does not properly normalize case.&lt;/div&gt;
+&lt;div id=&quot;test&quot; style=&quot;background-color: red&quot;&gt;&amp;nbsp;&lt;/div&gt;
</ins><span class="cx"> &lt;script&gt;
</span><del>-function runTest()
-{
-    description(&quot;This test verifies that the setAttributeNode() API checks for existing attributes case-insensitively. Thus the value of an existing attribute with the same name but in a different case should get replaced by the new value specified via the setAttributeNode() method.&quot;);
-    
-    var test = document.getElementById(&quot;test&quot;);
-    var newStyleAttr = document.createAttribute(&quot;STYLE&quot;);
-    newStyleAttr.value = &quot;background-color: green&quot;;
-    test.setAttributeNode(newStyleAttr);
-    if (window.testRunner) {
</del><ins>+    function runTest()
+    {
+        description(&quot;This test verifies that the setAttributeNode() API checks for existing attributes case-insensitively. Thus the value of an existing attribute with the same name but in a different case should get replaced by the new value specified via the setAttributeNode() method.&quot;);
+
+        var test = document.getElementById(&quot;test&quot;);
+        var newStyleAttr = document.createAttribute(&quot;STYLE&quot;);
+        newStyleAttr.value = &quot;background-color: green&quot;;
+        test.setAttributeNode(newStyleAttr);
</ins><span class="cx">         shouldBe(&quot;test.getAttribute('style')&quot;, &quot;test.getAttribute('STYLE')&quot;);
</span><del>-        shouldBe(&quot;test.getAttributeNode('style').value&quot;, &quot;test.getAttributeNode('STYLE').value&quot;);
-    }
</del><ins>+        shouldBe(&quot;test.getAttributeNode('style')&quot;, &quot;null&quot;);
</ins><span class="cx"> 
</span><del>-    debug(&quot;Verifying that attributes with the same name but different namespaces are treated as unique entities. For the following test two different attribute values should be returned.&quot;);
-    var newAttr1 = document.createAttributeNS(&quot;ns1&quot;, &quot;newattr&quot;);
-    newAttr1.prefix = &quot;prefix1&quot;;
-    newAttr1.value = &quot;newattr1&quot;;
-    test.setAttributeNode(newAttr1);
-    var newAttr2 = document.createAttributeNS(&quot;ns2&quot;, &quot;newattr&quot;);
-    newAttr2.prefix = &quot;prefix2&quot;;
-    newAttr2.value = &quot;newattr2&quot;;
-    test.setAttributeNode(newAttr2);
-    if (window.testRunner) {
</del><ins>+
+        debug(&quot;Verifying that attributes with the same name but different namespaces are treated as unique entities. For the following test two different attribute values should be returned.&quot;);
+        var newAttr1 = document.createAttributeNS(&quot;ns1&quot;, &quot;newattr&quot;);
+        newAttr1.prefix = &quot;prefix1&quot;;
+        newAttr1.value = &quot;newattr1&quot;;
+        test.setAttributeNode(newAttr1);
+        var newAttr2 = document.createAttributeNS(&quot;ns2&quot;, &quot;newattr&quot;);
+        newAttr2.prefix = &quot;prefix2&quot;;
+        newAttr2.value = &quot;newattr2&quot;;
+        test.setAttributeNode(newAttr2);
</ins><span class="cx">         shouldBe(&quot;test.getAttributeNodeNS('ns1', 'newattr').value&quot;, &quot;'newattr1'&quot;);
</span><span class="cx">         shouldBe(&quot;test.getAttributeNodeNS('ns2', 'newattr').value&quot;, &quot;'newattr2'&quot;);
</span><del>-    }
</del><span class="cx"> 
</span><del>-    debug(&quot;Verifying that attributes with same name but different case and having same namespaces are treated as same. In the following test the new attribute should overwrite the value of the existing one.&quot;);
-    var newAttr3 = document.createAttributeNS(&quot;ns1&quot;, &quot;NEWATTR&quot;);
-    newAttr3.prefix = &quot;prefix2&quot;;
-    newAttr3.value = &quot;newattr3&quot;;
-    test.setAttributeNode(newAttr3);
</del><ins>+        debug(&quot;Verifying that attributes with same name but different case and having same namespaces are treated as same. In the following test the new attribute should overwrite the value of the existing one.&quot;);
+        var newAttr3 = document.createAttributeNS(&quot;ns1&quot;, &quot;NEWATTR&quot;);
+        newAttr3.prefix = &quot;prefix2&quot;;
+        newAttr3.value = &quot;newattr3&quot;;
+        test.setAttributeNode(newAttr3);
</ins><span class="cx"> 
</span><del>-    if (window.testRunner) {
-        shouldBe(&quot;test.getAttributeNodeNS('ns1', 'newattr').value&quot;, &quot;'newattr3'&quot;);
-    
-        isSuccessfullyParsed();    
</del><ins>+        shouldBeEqualToString(&quot;test.getAttributeNodeNS('ns1', 'NEWATTR').value&quot;, &quot;newattr3&quot;);
+        shouldBeEqualToString(&quot;test.getAttributeNodeNS('ns1', 'newattr').value&quot;, &quot;newattr1&quot;);
+        
</ins><span class="cx">         test.style.display = 'none';
</span><span class="cx">     }
</span><del>-    
-}
</del><ins>+    runTest();
</ins><span class="cx"> &lt;/script&gt;
</span><del>-&lt;/head&gt;
-&lt;body onload=&quot;runTest()&quot;&gt;
-&lt;div&gt;Test for Bugzilla bug:&lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=90341&quot;&gt; 90341:&lt;/a&gt;  createAttribute/setAttributeNode does not properly normalize case.&lt;/div&gt;
-&lt;div id=&quot;test&quot; style=&quot;background-color: red&quot;&gt;&amp;nbsp;&lt;/div&gt;
-&lt;div id=&quot;description&quot;&gt;&lt;/div&gt;
-&lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
</del><ins>+&lt;script src=&quot;../../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx"> &lt;/body&gt;
</span><span class="cx"> &lt;/html&gt;
</span></span></pre></div>
<a id="trunkLayoutTestsfastdomElementsetAttributeNodeforexistingattributeexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/dom/Element/setAttributeNode-for-existing-attribute-expected.txt (179496 => 179497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/Element/setAttributeNode-for-existing-attribute-expected.txt        2015-02-02 21:55:11 UTC (rev 179496)
+++ trunk/LayoutTests/fast/dom/Element/setAttributeNode-for-existing-attribute-expected.txt        2015-02-02 22:00:50 UTC (rev 179497)
</span><span class="lines">@@ -1,3 +1,5 @@
</span><ins>+This test legacy behavior that were replaced when a spec was written. This test is supposed to fail to set the style.
+
</ins><span class="cx"> Testcase for bug 120293: setAttributeNode() does not set the new value to an existing attribute if specified attribute is in a different case.\nThe issue can be manually verified by ascertaining that a green colored block is displayed instead of a red one.
</span><span class="cx">  
</span><del>-background-color specified with lowercase style attribute was: red and specified with uppercase style attribute is: green
</del><ins>+background-color specified with lowercase style attribute was: red and specified with uppercase style attribute is:
</ins></span></pre></div>
<a id="trunkLayoutTestsfastdomElementsetAttributeNodeforexistingattributehtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/dom/Element/setAttributeNode-for-existing-attribute.html (179496 => 179497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/Element/setAttributeNode-for-existing-attribute.html        2015-02-02 21:55:11 UTC (rev 179496)
+++ trunk/LayoutTests/fast/dom/Element/setAttributeNode-for-existing-attribute.html        2015-02-02 22:00:50 UTC (rev 179497)
</span><span class="lines">@@ -19,6 +19,7 @@
</span><span class="cx"> &lt;/script&gt;
</span><span class="cx"> &lt;/head&gt;
</span><span class="cx"> &lt;body onload=&quot;runTest();&quot;&gt;
</span><ins>+&lt;p&gt;This test legacy behavior that were replaced when a spec was written. This test is supposed to fail to set the style.&lt;/p&gt;
</ins><span class="cx"> &lt;div&gt;Testcase for bug &lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=120293&quot;&gt;120293&lt;/a&gt;: setAttributeNode() does not set the new value to an existing attribute if specified attribute is in a different case.\nThe issue can be manually verified by ascertaining that a green colored block is displayed instead of a red one.&lt;/div&gt;
</span><span class="cx"> &lt;div id=&quot;test&quot; style=&quot;background-color: red;&quot;/&gt;&amp;nbsp;&lt;/div&gt;
</span><span class="cx"> &lt;div id=&quot;result&quot;&gt;&lt;/div&gt;
</span></span></pre></div>
<a id="trunkLayoutTestsfastdomElementsetAttributeNodeoverridinglowercasevalues1expectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/dom/Element/setAttributeNode-overriding-lowercase-values-1-expected.txt (0 => 179497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/Element/setAttributeNode-overriding-lowercase-values-1-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/dom/Element/setAttributeNode-overriding-lowercase-values-1-expected.txt        2015-02-02 22:00:50 UTC (rev 179497)
</span><span class="lines">@@ -0,0 +1,36 @@
</span><ins>+Test using setAttributeNode() behaves like setAttribute() to get the existing attribute, but like setAttributeNS() to set the new value.&quot;
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+PASS document.documentElement.getAttribute(&quot;foobar&quot;) is &quot;WebKit&quot;
+PASS document.documentElement.hasAttribute(&quot;foobar&quot;) is true
+PASS document.documentElement.getAttribute(&quot;FooBar&quot;) is &quot;WebKit&quot;
+PASS document.documentElement.hasAttribute(&quot;FooBar&quot;) is true
+PASS document.documentElement.getAttributeNS(&quot;&quot;, &quot;foobar&quot;) is &quot;WebKit&quot;
+PASS document.documentElement.hasAttributeNS(&quot;&quot;, &quot;foobar&quot;) is true
+FAIL document.documentElement.getAttributeNS(&quot;&quot;, &quot;FooBar&quot;) should be null (of type object). Was  (of type string).
+PASS document.documentElement.hasAttributeNS(&quot;&quot;, &quot;FooBar&quot;) is false
+PASS document.documentElement.attributes.length is 1
+PASS camelCaseFoobar is not oldAttributeNode
+PASS document.documentElement.getAttribute(&quot;foobar&quot;) is null
+PASS document.documentElement.hasAttribute(&quot;foobar&quot;) is false
+PASS document.documentElement.getAttribute(&quot;FooBar&quot;) is null
+PASS document.documentElement.hasAttribute(&quot;FooBar&quot;) is false
+FAIL document.documentElement.getAttributeNS(&quot;&quot;, &quot;foobar&quot;) should be null (of type object). Was  (of type string).
+PASS document.documentElement.hasAttributeNS(&quot;&quot;, &quot;foobar&quot;) is false
+PASS document.documentElement.getAttributeNS(&quot;&quot;, &quot;FooBar&quot;) is &quot;Rocks!&quot;
+PASS document.documentElement.hasAttributeNS(&quot;&quot;, &quot;FooBar&quot;) is true
+PASS oldAttributeNode2 is null
+PASS document.documentElement.getAttribute(&quot;foobar&quot;) is &quot;WebKit2&quot;
+PASS document.documentElement.hasAttribute(&quot;foobar&quot;) is true
+PASS document.documentElement.getAttribute(&quot;FooBar&quot;) is &quot;WebKit2&quot;
+PASS document.documentElement.hasAttribute(&quot;FooBar&quot;) is true
+PASS document.documentElement.getAttributeNS(&quot;&quot;, &quot;foobar&quot;) is &quot;WebKit2&quot;
+PASS document.documentElement.hasAttributeNS(&quot;&quot;, &quot;foobar&quot;) is true
+PASS document.documentElement.getAttributeNS(&quot;&quot;, &quot;FooBar&quot;) is &quot;Rocks!&quot;
+PASS document.documentElement.hasAttributeNS(&quot;&quot;, &quot;FooBar&quot;) is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfastdomElementsetAttributeNodeoverridinglowercasevalues1html"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/dom/Element/setAttributeNode-overriding-lowercase-values-1.html (0 => 179497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/Element/setAttributeNode-overriding-lowercase-values-1.html                                (rev 0)
+++ trunk/LayoutTests/fast/dom/Element/setAttributeNode-overriding-lowercase-values-1.html        2015-02-02 22:00:50 UTC (rev 179497)
</span><span class="lines">@@ -0,0 +1,63 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;meta charset=&quot;utf-8&quot;&gt;
+&lt;script src=&quot;../../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+    &lt;div id=&quot;test-container&quot; style=&quot;display: none;&quot;&gt;&lt;/div&gt;
+&lt;/body&gt;
+&lt;script&gt;
+description('Test using setAttributeNode() behaves like setAttribute() to get the existing attribute, but like setAttributeNS() to set the new value.&quot;');
+
+document.documentElement.setAttribute('FooBar', 'WebKit');
+
+shouldBeEqualToString('document.documentElement.getAttribute(&quot;foobar&quot;)', 'WebKit');
+shouldBeTrue('document.documentElement.hasAttribute(&quot;foobar&quot;)');
+shouldBeEqualToString('document.documentElement.getAttribute(&quot;FooBar&quot;)', 'WebKit');
+shouldBeTrue('document.documentElement.hasAttribute(&quot;FooBar&quot;)');
+
+shouldBeEqualToString('document.documentElement.getAttributeNS(&quot;&quot;, &quot;foobar&quot;)', 'WebKit');
+shouldBeTrue('document.documentElement.hasAttributeNS(&quot;&quot;, &quot;foobar&quot;)');
+shouldBe('document.documentElement.getAttributeNS(&quot;&quot;, &quot;FooBar&quot;)', 'null');
+shouldBeFalse('document.documentElement.hasAttributeNS(&quot;&quot;, &quot;FooBar&quot;)');
+
+
+shouldBe('document.documentElement.attributes.length', '1');
+
+// &quot;FooBar&quot; should nuke the &quot;foobar&quot; value while itself having the &quot;FooBar&quot; name.
+var camelCaseFoobar = document.createAttribute(&quot;FooBar&quot;);
+camelCaseFoobar.value = 'Rocks!'
+var oldAttributeNode = document.documentElement.setAttributeNode(camelCaseFoobar);
+
+shouldNotBe('camelCaseFoobar', 'oldAttributeNode');
+
+shouldBe('document.documentElement.getAttribute(&quot;foobar&quot;)', 'null');
+shouldBeFalse('document.documentElement.hasAttribute(&quot;foobar&quot;)');
+shouldBe('document.documentElement.getAttribute(&quot;FooBar&quot;)', 'null');
+shouldBeFalse('document.documentElement.hasAttribute(&quot;FooBar&quot;)');
+
+shouldBe('document.documentElement.getAttributeNS(&quot;&quot;, &quot;foobar&quot;)', 'null');
+shouldBeFalse('document.documentElement.hasAttributeNS(&quot;&quot;, &quot;foobar&quot;)');
+shouldBeEqualToString('document.documentElement.getAttributeNS(&quot;&quot;, &quot;FooBar&quot;)', 'Rocks!');
+shouldBeTrue('document.documentElement.hasAttributeNS(&quot;&quot;, &quot;FooBar&quot;)');
+
+// &quot;foobar&quot; should exist alongside &quot;FooBar&quot;.
+var lowerCaseFoobar = document.createAttribute(&quot;foobar&quot;);
+lowerCaseFoobar.value = 'WebKit2'
+var oldAttributeNode2 = document.documentElement.setAttributeNode(lowerCaseFoobar);
+
+shouldBe('oldAttributeNode2', 'null');
+
+shouldBeEqualToString('document.documentElement.getAttribute(&quot;foobar&quot;)', 'WebKit2');
+shouldBeTrue('document.documentElement.hasAttribute(&quot;foobar&quot;)');
+shouldBeEqualToString('document.documentElement.getAttribute(&quot;FooBar&quot;)', 'WebKit2');
+shouldBeTrue('document.documentElement.hasAttribute(&quot;FooBar&quot;)');
+
+shouldBeEqualToString('document.documentElement.getAttributeNS(&quot;&quot;, &quot;foobar&quot;)', 'WebKit2');
+shouldBeTrue('document.documentElement.hasAttributeNS(&quot;&quot;, &quot;foobar&quot;)');
+shouldBeEqualToString('document.documentElement.getAttributeNS(&quot;&quot;, &quot;FooBar&quot;)', 'Rocks!');
+shouldBeTrue('document.documentElement.hasAttributeNS(&quot;&quot;, &quot;FooBar&quot;)');
+&lt;/script&gt;
+&lt;script src=&quot;../../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfastdomElementsetAttributeNodeoverridinglowercasevalues2expectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/dom/Element/setAttributeNode-overriding-lowercase-values-2-expected.txt (0 => 179497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/Element/setAttributeNode-overriding-lowercase-values-2-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/dom/Element/setAttributeNode-overriding-lowercase-values-2-expected.txt        2015-02-02 22:00:50 UTC (rev 179497)
</span><span class="lines">@@ -0,0 +1,35 @@
</span><ins>+Test using setAttributeNode() behaves like setAttribute() to get the existing attribute, but like setAttributeNS() to set the new value. This test covers attributes set through an AttributeNode with a namespace.&quot;
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+PASS testElement.attributes.length is 1
+PASS testElement.getAttribute(&quot;foobar&quot;) is &quot;WebKit&quot;
+PASS testElement.hasAttribute(&quot;foobar&quot;) is true
+PASS testElement.getAttribute(&quot;FooBar&quot;) is &quot;WebKit&quot;
+PASS testElement.hasAttribute(&quot;FooBar&quot;) is true
+PASS testElement.getAttributeNS(&quot;ns1&quot;, &quot;foobar&quot;) is &quot;WebKit&quot;
+PASS testElement.hasAttributeNS(&quot;ns1&quot;, &quot;foobar&quot;) is true
+FAIL testElement.getAttributeNS(&quot;ns1&quot;, &quot;FooBar&quot;) should be null (of type object). Was  (of type string).
+PASS testElement.hasAttributeNS(&quot;ns1&quot;, &quot;FooBar&quot;) is false
+FAIL testElement.getAttributeNS(&quot;&quot;, &quot;foobar&quot;) should be null (of type object). Was  (of type string).
+PASS testElement.hasAttributeNS(&quot;&quot;, &quot;foobar&quot;) is false
+FAIL testElement.getAttributeNS(&quot;&quot;, &quot;FooBar&quot;) should be null (of type object). Was  (of type string).
+PASS testElement.hasAttributeNS(&quot;&quot;, &quot;FooBar&quot;) is false
+PASS testElement.attributes.length is 1
+PASS testElement.getAttribute(&quot;foobar&quot;) is null
+PASS testElement.hasAttribute(&quot;foobar&quot;) is false
+PASS testElement.getAttribute(&quot;FooBar&quot;) is null
+PASS testElement.hasAttribute(&quot;FooBar&quot;) is false
+FAIL testElement.getAttributeNS(&quot;ns1&quot;, &quot;foobar&quot;) should be null (of type object). Was  (of type string).
+PASS testElement.hasAttributeNS(&quot;ns1&quot;, &quot;foobar&quot;) is false
+PASS testElement.getAttributeNS(&quot;ns1&quot;, &quot;FooBar&quot;) is &quot;Rocks!&quot;
+PASS testElement.hasAttributeNS(&quot;ns1&quot;, &quot;FooBar&quot;) is true
+FAIL testElement.getAttributeNS(&quot;&quot;, &quot;foobar&quot;) should be null (of type object). Was  (of type string).
+PASS testElement.hasAttributeNS(&quot;&quot;, &quot;foobar&quot;) is false
+FAIL testElement.getAttributeNS(&quot;&quot;, &quot;FooBar&quot;) should be null (of type object). Was  (of type string).
+PASS testElement.hasAttributeNS(&quot;&quot;, &quot;FooBar&quot;) is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfastdomElementsetAttributeNodeoverridinglowercasevalues2html"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/dom/Element/setAttributeNode-overriding-lowercase-values-2.html (0 => 179497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/Element/setAttributeNode-overriding-lowercase-values-2.html                                (rev 0)
+++ trunk/LayoutTests/fast/dom/Element/setAttributeNode-overriding-lowercase-values-2.html        2015-02-02 22:00:50 UTC (rev 179497)
</span><span class="lines">@@ -0,0 +1,57 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;meta charset=&quot;utf-8&quot;&gt;
+&lt;script src=&quot;../../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+    &lt;div id=&quot;test-container&quot; style=&quot;display: none;&quot;&gt;&lt;/div&gt;
+&lt;/body&gt;
+&lt;script&gt;
+description('Test using setAttributeNode() behaves like setAttribute() to get the existing attribute, but like setAttributeNS() to set the new value. This test covers attributes set through an AttributeNode with a namespace.&quot;');
+
+var testElement = document.createElement(&quot;div&quot;);
+var a = document.createAttributeNS('ns1', 'foobar');
+a.value = 'WebKit'
+testElement.setAttributeNode(a);
+
+shouldBe('testElement.attributes.length', '1');
+shouldBeEqualToString('testElement.getAttribute(&quot;foobar&quot;)', 'WebKit');
+shouldBeTrue('testElement.hasAttribute(&quot;foobar&quot;)');
+shouldBeEqualToString('testElement.getAttribute(&quot;FooBar&quot;)', 'WebKit');
+shouldBeTrue('testElement.hasAttribute(&quot;FooBar&quot;)');
+
+shouldBeEqualToString('testElement.getAttributeNS(&quot;ns1&quot;, &quot;foobar&quot;)', 'WebKit');
+shouldBeTrue('testElement.hasAttributeNS(&quot;ns1&quot;, &quot;foobar&quot;)');
+shouldBe('testElement.getAttributeNS(&quot;ns1&quot;, &quot;FooBar&quot;)', 'null');
+shouldBeFalse('testElement.hasAttributeNS(&quot;ns1&quot;, &quot;FooBar&quot;)');
+
+shouldBe('testElement.getAttributeNS(&quot;&quot;, &quot;foobar&quot;)', 'null');
+shouldBeFalse('testElement.hasAttributeNS(&quot;&quot;, &quot;foobar&quot;)');
+shouldBe('testElement.getAttributeNS(&quot;&quot;, &quot;FooBar&quot;)', 'null');
+shouldBeFalse('testElement.hasAttributeNS(&quot;&quot;, &quot;FooBar&quot;)');
+
+// Setting this node through setAttributeNode() instead of setAttributeNodeNS()
+// erases the lowercase &quot;foobar&quot;.
+var b = document.createAttributeNS('ns1', 'FooBar');
+b.value = &quot;Rocks!&quot;;
+testElement.setAttributeNode(b);
+
+shouldBe('testElement.attributes.length', '1');
+shouldBe('testElement.getAttribute(&quot;foobar&quot;)', 'null');
+shouldBeFalse('testElement.hasAttribute(&quot;foobar&quot;)');
+shouldBe('testElement.getAttribute(&quot;FooBar&quot;)', 'null');
+shouldBeFalse('testElement.hasAttribute(&quot;FooBar&quot;)');
+
+shouldBe('testElement.getAttributeNS(&quot;ns1&quot;, &quot;foobar&quot;)', 'null');
+shouldBeFalse('testElement.hasAttributeNS(&quot;ns1&quot;, &quot;foobar&quot;)');
+shouldBeEqualToString('testElement.getAttributeNS(&quot;ns1&quot;, &quot;FooBar&quot;)', 'Rocks!');
+shouldBeTrue('testElement.hasAttributeNS(&quot;ns1&quot;, &quot;FooBar&quot;)');
+
+shouldBe('testElement.getAttributeNS(&quot;&quot;, &quot;foobar&quot;)', 'null');
+shouldBeFalse('testElement.hasAttributeNS(&quot;&quot;, &quot;foobar&quot;)');
+shouldBe('testElement.getAttributeNS(&quot;&quot;, &quot;FooBar&quot;)', 'null');
+shouldBeFalse('testElement.hasAttributeNS(&quot;&quot;, &quot;FooBar&quot;)');
+&lt;/script&gt;
+&lt;script src=&quot;../../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (179496 => 179497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-02-02 21:55:11 UTC (rev 179496)
+++ trunk/Source/WebCore/ChangeLog        2015-02-02 22:00:50 UTC (rev 179497)
</span><span class="lines">@@ -1,3 +1,82 @@
</span><ins>+2015-02-02  Benjamin Poulain  &lt;bpoulain@apple.com&gt;
+
+        Clean up attribute handling: part 2 - attributeNode
+        https://bugs.webkit.org/show_bug.cgi?id=141109
+
+        Reviewed by Andreas Kling.
+
+        Our implementation was covering some old legacy behaviors of Firefox,
+        even copying bugs in some cases.
+
+        The spec (https://dom.spec.whatwg.org) now defines the behavior precisely,
+        let's move a bit closer to that.
+
+        Tests: fast/dom/Element/attribute-ascii-case-insensitive-3.html
+               fast/dom/Element/attribute-setAttributeNode-multiple-times.html
+               fast/dom/Element/attribute-setAttributeNodeNS-multiple-times.html
+               fast/dom/Element/mozilla-dom-base-tests/test_bug1075702.html
+               fast/dom/Element/mozilla-dom-base-tests/test_bug339494.html
+               fast/dom/Element/mozilla-dom-base-tests/test_bug364092.xhtml
+               fast/dom/Element/setAttributeNode-overriding-lowercase-values.html
+
+        * dom/Element.cpp:
+        (WebCore::findAttrNodeInList):
+        New getter for the name-without-namespace case.
+
+        (WebCore::Element::setAttributeNode):
+        This one is the tricky one: https://dom.spec.whatwg.org/#dom-element-setattributenode
+
+        When setAttributeNode() is used with an AttributeNode without namespace,
+        getting the old value behaves like getAttribute(), with ASCII lowercase name matching.
+        When used with a namespace, getting the old value behaves like getAttributeNS().
+
+        Setting the value is a whole different story, the name used always keeps
+        the original case.
+
+        Now that's a bit tricky for us because AttributeNodes are just legacy stuff we don't
+        used internally.
+
+        We have 4 cases to handle:
+        1) The name being set is lowercase, there was no conflicting name on the element.
+           That's easy, we just override any node that would exist, set the name otherwise.
+        2) The name is lowercase but there was an existing attribute for it.
+           -We create a new AttributeNode for the name to represent the old name.
+           -We check the names are the same with attribute.name().matches(attrNode-&gt;qualifiedName())
+            and override the value.
+        3) The name has uppercase characters, there is no conflicting name.
+           We would not find an element to remove, we just use setAttributeInternal() as usual
+           to add the attribute;
+        4) The name has uppercase characters, there is a lowercase conflicing name.
+           This is the weird behavior: we need to nuke the old attribute, then add the new attribute
+           with a different case.
+
+           First we remove the attribute with a lowercase name with removeAttributeInternal().
+           That becomes the old node.
+
+           There might still be an element of the same name as what we are trying to add. We don't want
+           to add another version of the same attribute. We need to use findAttributeIndexByName() again
+           to find if there is a conflicting attribute. Then we call setAttributeInternal() which handle
+           the both the cases where there was an element or not.
+
+        (WebCore::Element::setAttributeNodeNS):
+        This should work like any &quot;NS&quot; method.
+
+        (WebCore::Element::removeAttributeNode):
+        The method removeAttributeNode() is supposed to be exact.
+
+        (WebCore::Element::getAttributeNode):
+        (WebCore::Element::hasAttribute):
+        (WebCore::Element::attrIfExists):
+        * dom/Element.h:
+        * dom/ElementData.cpp:
+        (WebCore::ElementData::findAttributeIndexByNameSlowCase): Deleted.
+        (WebCore::ElementData::findAttributeIndexByNameForAttributeNode): Deleted.
+        Kill the slow case, every caller has been updated now.
+        * dom/ElementData.h:
+        (WebCore::ElementData::findAttributeIndexByName):
+        * dom/QualifiedName.h:
+        (WebCore::QualifiedName::matchesIgnoringCaseForLocalName): Deleted.
+
</ins><span class="cx"> 2015-02-02  peavo@outlook.com  &lt;peavo@outlook.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Memory is written to after deallocated, in GraphicsLayer::setMaskLayer.
</span></span></pre></div>
<a id="trunkSourceWebCoredomElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Element.cpp (179496 => 179497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Element.cpp        2015-02-02 21:55:11 UTC (rev 179496)
+++ trunk/Source/WebCore/dom/Element.cpp        2015-02-02 22:00:50 UTC (rev 179497)
</span><span class="lines">@@ -133,12 +133,22 @@
</span><span class="cx"> static Attr* findAttrNodeInList(Vector&lt;RefPtr&lt;Attr&gt;&gt;&amp; attrNodeList, const QualifiedName&amp; name)
</span><span class="cx"> {
</span><span class="cx">     for (auto&amp; node : attrNodeList) {
</span><del>-        if (node-&gt;qualifiedName() == name)
</del><ins>+        if (node-&gt;qualifiedName().matches(name))
</ins><span class="cx">             return node.get();
</span><span class="cx">     }
</span><span class="cx">     return nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static Attr* findAttrNodeInList(Vector&lt;RefPtr&lt;Attr&gt;&gt;&amp; attrNodeList, const AtomicString&amp; localName, bool shouldIgnoreAttributeCase)
+{
+    const AtomicString&amp; caseAdjustedName = shouldIgnoreAttributeCase ? localName.convertToASCIILowercase() : localName;
+    for (auto&amp; node : attrNodeList) {
+        if (node-&gt;qualifiedName().localName() == caseAdjustedName)
+            return node.get();
+    }
+    return nullptr;
+}
+
</ins><span class="cx"> Ref&lt;Element&gt; Element::create(const QualifiedName&amp; tagName, Document&amp; document)
</span><span class="cx"> {
</span><span class="cx">     return adoptRef(*new Element(tagName, document, CreateElement));
</span><span class="lines">@@ -1710,6 +1720,54 @@
</span><span class="cx"> {
</span><span class="cx">     if (!attrNode) {
</span><span class="cx">         ec = TYPE_MISMATCH_ERR;
</span><ins>+        return nullptr;
+    }
+
+    RefPtr&lt;Attr&gt; oldAttrNode = attrIfExists(attrNode-&gt;qualifiedName().localName(), shouldIgnoreAttributeCase(*this));
+    if (oldAttrNode.get() == attrNode)
+        return attrNode; // This Attr is already attached to the element.
+
+    // INUSE_ATTRIBUTE_ERR: Raised if node is an Attr that is already an attribute of another Element object.
+    // The DOM user must explicitly clone Attr nodes to re-use them in other elements.
+    if (attrNode-&gt;ownerElement() &amp;&amp; attrNode-&gt;ownerElement() != this) {
+        ec = INUSE_ATTRIBUTE_ERR;
+        return nullptr;
+    }
+
+    synchronizeAllAttributes();
+    UniqueElementData&amp; elementData = ensureUniqueElementData();
+
+    unsigned existingAttributeIndex = elementData.findAttributeIndexByName(attrNode-&gt;qualifiedName().localName(), shouldIgnoreAttributeCase(*this));
+    if (existingAttributeIndex != ElementData::attributeNotFound) {
+        const Attribute&amp; attribute = attributeAt(existingAttributeIndex);
+        if (oldAttrNode)
+            detachAttrNodeFromElementWithValue(oldAttrNode.get(), attribute.value());
+        else
+            oldAttrNode = Attr::create(document(), attrNode-&gt;qualifiedName(), attribute.value());
+
+        if (attribute.name().matches(attrNode-&gt;qualifiedName()))
+            setAttributeInternal(existingAttributeIndex, attrNode-&gt;qualifiedName(), attrNode-&gt;value(), NotInSynchronizationOfLazyAttribute);
+        else {
+            removeAttributeInternal(existingAttributeIndex, NotInSynchronizationOfLazyAttribute);
+            unsigned existingAttributeIndexForFullQualifiedName = elementData.findAttributeIndexByName(attrNode-&gt;qualifiedName());
+            setAttributeInternal(existingAttributeIndexForFullQualifiedName, attrNode-&gt;qualifiedName(), attrNode-&gt;value(), NotInSynchronizationOfLazyAttribute);
+        }
+    } else {
+        unsigned existingAttributeIndexForFullQualifiedName = elementData.findAttributeIndexByName(attrNode-&gt;qualifiedName());
+        setAttributeInternal(existingAttributeIndexForFullQualifiedName, attrNode-&gt;qualifiedName(), attrNode-&gt;value(), NotInSynchronizationOfLazyAttribute);
+    }
+    if (attrNode-&gt;ownerElement() != this) {
+        attrNode-&gt;attachToElement(this);
+        treeScope().adoptIfNeeded(attrNode);
+        ensureAttrNodeListForElement(*this).append(attrNode);
+    }
+    return oldAttrNode;
+}
+
+RefPtr&lt;Attr&gt; Element::setAttributeNodeNS(Attr* attrNode, ExceptionCode&amp; ec)
+{
+    if (!attrNode) {
+        ec = TYPE_MISMATCH_ERR;
</ins><span class="cx">         return 0;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -1719,7 +1777,7 @@
</span><span class="cx"> 
</span><span class="cx">     // INUSE_ATTRIBUTE_ERR: Raised if node is an Attr that is already an attribute of another Element object.
</span><span class="cx">     // The DOM user must explicitly clone Attr nodes to re-use them in other elements.
</span><del>-    if (attrNode-&gt;ownerElement()) {
</del><ins>+    if (attrNode-&gt;ownerElement() &amp;&amp; attrNode-&gt;ownerElement() != this) {
</ins><span class="cx">         ec = INUSE_ATTRIBUTE_ERR;
</span><span class="cx">         return 0;
</span><span class="cx">     }
</span><span class="lines">@@ -1727,7 +1785,7 @@
</span><span class="cx">     synchronizeAllAttributes();
</span><span class="cx">     UniqueElementData&amp; elementData = ensureUniqueElementData();
</span><span class="cx"> 
</span><del>-    unsigned index = elementData.findAttributeIndexByNameForAttributeNode(attrNode, shouldIgnoreAttributeCase(*this));
</del><ins>+    unsigned index = elementData.findAttributeIndexByName(attrNode-&gt;qualifiedName());
</ins><span class="cx">     if (index != ElementData::attributeNotFound) {
</span><span class="cx">         if (oldAttrNode)
</span><span class="cx">             detachAttrNodeFromElementWithValue(oldAttrNode.get(), elementData.attributeAt(index).value());
</span><span class="lines">@@ -1744,36 +1802,37 @@
</span><span class="cx">     return oldAttrNode.release();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-RefPtr&lt;Attr&gt; Element::setAttributeNodeNS(Attr* attr, ExceptionCode&amp; ec)
-{
-    return setAttributeNode(attr, ec);
-}
-
</del><span class="cx"> RefPtr&lt;Attr&gt; Element::removeAttributeNode(Attr* attr, ExceptionCode&amp; ec)
</span><span class="cx"> {
</span><span class="cx">     if (!attr) {
</span><span class="cx">         ec = TYPE_MISMATCH_ERR;
</span><del>-        return 0;
</del><ins>+        return nullptr;
</ins><span class="cx">     }
</span><span class="cx">     if (attr-&gt;ownerElement() != this) {
</span><span class="cx">         ec = NOT_FOUND_ERR;
</span><del>-        return 0;
</del><ins>+        return nullptr;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     ASSERT(&amp;document() == &amp;attr-&gt;document());
</span><span class="cx"> 
</span><del>-    synchronizeAttribute(attr-&gt;qualifiedName());
</del><ins>+    synchronizeAllAttributes();
</ins><span class="cx"> 
</span><del>-    unsigned index = elementData()-&gt;findAttributeIndexByNameForAttributeNode(attr);
-    if (index == ElementData::attributeNotFound) {
</del><ins>+    if (!m_elementData) {
</ins><span class="cx">         ec = NOT_FOUND_ERR;
</span><del>-        return 0;
</del><ins>+        return nullptr;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    unsigned existingAttributeIndex = m_elementData-&gt;findAttributeIndexByName(attr-&gt;qualifiedName());
+
+    if (existingAttributeIndex == ElementData::attributeNotFound) {
+        ec = NOT_FOUND_ERR;
+        return nullptr;
+    }
+
</ins><span class="cx">     RefPtr&lt;Attr&gt; attrNode = attr;
</span><del>-    detachAttrNodeFromElementWithValue(attr, elementData()-&gt;attributeAt(index).value());
-    removeAttributeInternal(index, NotInSynchronizationOfLazyAttribute);
-    return attrNode.release();
</del><ins>+    detachAttrNodeFromElementWithValue(attr, m_elementData-&gt;attributeAt(existingAttributeIndex).value());
+    removeAttributeInternal(existingAttributeIndex, NotInSynchronizationOfLazyAttribute);
+    return attrNode;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool Element::parseAttributeName(QualifiedName&amp; out, const AtomicString&amp; namespaceURI, const AtomicString&amp; qualifiedName, ExceptionCode&amp; ec)
</span><span class="lines">@@ -1859,11 +1918,11 @@
</span><span class="cx"> RefPtr&lt;Attr&gt; Element::getAttributeNode(const AtomicString&amp; localName)
</span><span class="cx"> {
</span><span class="cx">     if (!elementData())
</span><del>-        return 0;
</del><ins>+        return nullptr;
</ins><span class="cx">     synchronizeAttribute(localName);
</span><span class="cx">     const Attribute* attribute = elementData()-&gt;findAttributeByName(localName, shouldIgnoreAttributeCase(*this));
</span><span class="cx">     if (!attribute)
</span><del>-        return 0;
</del><ins>+        return nullptr;
</ins><span class="cx">     return ensureAttr(attribute-&gt;name());
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1884,7 +1943,7 @@
</span><span class="cx">     if (!elementData())
</span><span class="cx">         return false;
</span><span class="cx">     synchronizeAttribute(localName);
</span><del>-    return elementData()-&gt;findAttributeByName(shouldIgnoreAttributeCase(*this) ? localName.convertToASCIILowercase() : localName, false);
</del><ins>+    return elementData()-&gt;findAttributeByName(localName, shouldIgnoreAttributeCase(*this));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool Element::hasAttributeNS(const AtomicString&amp; namespaceURI, const AtomicString&amp; localName) const
</span><span class="lines">@@ -2875,6 +2934,13 @@
</span><span class="cx">     ensureElementRareData().setSavedLayerScrollOffset(size);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+RefPtr&lt;Attr&gt; Element::attrIfExists(const AtomicString&amp; localName, bool shouldIgnoreAttributeCase)
+{
+    if (auto* attrNodeList = attrNodeListForElement(*this))
+        return findAttrNodeInList(*attrNodeList, localName, shouldIgnoreAttributeCase);
+    return nullptr;
+}
+
</ins><span class="cx"> RefPtr&lt;Attr&gt; Element::attrIfExists(const QualifiedName&amp; name)
</span><span class="cx"> {
</span><span class="cx">     if (auto* attrNodeList = attrNodeListForElement(*this))
</span></span></pre></div>
<a id="trunkSourceWebCoredomElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Element.h (179496 => 179497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Element.h        2015-02-02 21:55:11 UTC (rev 179496)
+++ trunk/Source/WebCore/dom/Element.h        2015-02-02 22:00:50 UTC (rev 179497)
</span><span class="lines">@@ -240,6 +240,7 @@
</span><span class="cx">     RefPtr&lt;Attr&gt; removeAttributeNode(Attr*, ExceptionCode&amp;);
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;Attr&gt; attrIfExists(const QualifiedName&amp;);
</span><ins>+    RefPtr&lt;Attr&gt; attrIfExists(const AtomicString&amp; localName, bool shouldIgnoreAttributeCase);
</ins><span class="cx">     RefPtr&lt;Attr&gt; ensureAttr(const QualifiedName&amp;);
</span><span class="cx"> 
</span><span class="cx">     const Vector&lt;RefPtr&lt;Attr&gt;&gt;&amp; attrNodeList();
</span></span></pre></div>
<a id="trunkSourceWebCoredomElementDatacpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/ElementData.cpp (179496 => 179497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/ElementData.cpp        2015-02-02 21:55:11 UTC (rev 179496)
+++ trunk/Source/WebCore/dom/ElementData.cpp        2015-02-02 22:00:50 UTC (rev 179497)
</span><span class="lines">@@ -178,40 +178,6 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-unsigned ElementData::findAttributeIndexByNameSlowCase(const AtomicString&amp; name, bool shouldIgnoreAttributeCase) const
-{
-    // FIXME: this should use ASCII case-insensitive, not unicode case-insensitive.
-    // Continue to checking case-insensitively and/or full namespaced names if necessary:
-    const Attribute* attributes = attributeBase();
-    unsigned length = this-&gt;length();
-    for (unsigned i = 0; i &lt; length; ++i) {
-        const Attribute&amp; attribute = attributes[i];
-        if (!attribute.name().hasPrefix()) {
-            if (shouldIgnoreAttributeCase &amp;&amp; equalIgnoringCase(name, attribute.localName()))
-                return i;
-        } else {
-            // FIXME: Would be faster to do this comparison without calling toString, which
-            // generates a temporary string by concatenation. But this branch is only reached
-            // if the attribute name has a prefix, which is rare in HTML.
-            if (equalPossiblyIgnoringCase(name, attribute.name().toString(), shouldIgnoreAttributeCase))
-                return i;
-        }
-    }
-    return attributeNotFound;
-}
-
-unsigned ElementData::findAttributeIndexByNameForAttributeNode(const Attr* attr, bool shouldIgnoreAttributeCase) const
-{
-    ASSERT(attr);
-    const Attribute* attributes = attributeBase();
-    unsigned count = length();
-    for (unsigned i = 0; i &lt; count; ++i) {
-        if (attributes[i].name().matchesIgnoringCaseForLocalName(attr-&gt;qualifiedName(), shouldIgnoreAttributeCase))
-            return i;
-    }
-    return attributeNotFound;
-}
-
</del><span class="cx"> Attribute* UniqueElementData::findAttributeByName(const QualifiedName&amp; name)
</span><span class="cx"> {
</span><span class="cx">     for (unsigned i = 0, count = m_attributeVector.size(); i &lt; count; ++i) {
</span></span></pre></div>
<a id="trunkSourceWebCoredomElementDatah"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/ElementData.h (179496 => 179497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/ElementData.h        2015-02-02 21:55:11 UTC (rev 179496)
+++ trunk/Source/WebCore/dom/ElementData.h        2015-02-02 22:00:50 UTC (rev 179497)
</span><span class="lines">@@ -105,7 +105,6 @@
</span><span class="cx">     const Attribute* findAttributeByName(const QualifiedName&amp;) const;
</span><span class="cx">     unsigned findAttributeIndexByName(const QualifiedName&amp;) const;
</span><span class="cx">     unsigned findAttributeIndexByName(const AtomicString&amp; name, bool shouldIgnoreAttributeCase) const;
</span><del>-    unsigned findAttributeIndexByNameForAttributeNode(const Attr*, bool shouldIgnoreAttributeCase = false) const;
</del><span class="cx">     const Attribute* findLanguageAttribute() const;
</span><span class="cx"> 
</span><span class="cx">     bool hasID() const { return !m_idForStyleResolution.isNull(); }
</span><span class="lines">@@ -177,7 +176,6 @@
</span><span class="cx"> 
</span><span class="cx">     const Attribute* attributeBase() const;
</span><span class="cx">     const Attribute* findAttributeByName(const AtomicString&amp; name, bool shouldIgnoreAttributeCase) const;
</span><del>-    unsigned findAttributeIndexByNameSlowCase(const AtomicString&amp; name, bool shouldIgnoreAttributeCase) const;
</del><span class="cx"> 
</span><span class="cx">     Ref&lt;UniqueElementData&gt; makeUniqueCopy() const;
</span><span class="cx"> };
</span><span class="lines">@@ -286,21 +284,27 @@
</span><span class="cx"> // can tune the behavior (hasAttribute is case sensitive whereas getAttribute is not).
</span><span class="cx"> ALWAYS_INLINE unsigned ElementData::findAttributeIndexByName(const AtomicString&amp; name, bool shouldIgnoreAttributeCase) const
</span><span class="cx"> {
</span><ins>+    unsigned attributeCount = length();
+    if (!attributeCount)
+        return attributeNotFound;
+
</ins><span class="cx">     const Attribute* attributes = attributeBase();
</span><del>-    bool doSlowCheck = shouldIgnoreAttributeCase;
</del><span class="cx">     const AtomicString&amp; caseAdjustedName = shouldIgnoreAttributeCase ? name.convertToASCIILowercase() : name;
</span><span class="cx"> 
</span><del>-    // Optimize for the case where the attribute exists and its name exactly matches.
-    for (unsigned i = 0, count = length(); i &lt; count; ++i) {
-        if (!attributes[i].name().hasPrefix()) {
-            if (caseAdjustedName == attributes[i].localName())
-                return i;
-        } else
-            doSlowCheck = true;
-    }
</del><ins>+    unsigned attributeIndex = 0;
+    do {
+        const Attribute&amp; attribute = attributes[attributeIndex];
+        if (!attribute.name().hasPrefix()) {
+            if (attribute.localName() == caseAdjustedName)
+                return attributeIndex;
+        } else {
+            if (attribute.name().toString() == caseAdjustedName)
+                return attributeIndex;
+        }
</ins><span class="cx"> 
</span><del>-    if (doSlowCheck)
-        return findAttributeIndexByNameSlowCase(name, shouldIgnoreAttributeCase);
</del><ins>+        ++attributeIndex;
+    } while (attributeIndex &lt; attributeCount);
+
</ins><span class="cx">     return attributeNotFound;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoredomQualifiedNameh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/QualifiedName.h (179496 => 179497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/QualifiedName.h        2015-02-02 21:55:11 UTC (rev 179496)
+++ trunk/Source/WebCore/dom/QualifiedName.h        2015-02-02 22:00:50 UTC (rev 179497)
</span><span class="lines">@@ -85,8 +85,6 @@
</span><span class="cx"> 
</span><span class="cx">     bool matches(const QualifiedName&amp; other) const { return m_impl == other.m_impl || (localName() == other.localName() &amp;&amp; namespaceURI() == other.namespaceURI()); }
</span><span class="cx"> 
</span><del>-    bool matchesIgnoringCaseForLocalName(const QualifiedName&amp; other, bool shouldIgnoreCase) const { return m_impl == other.m_impl || (equalPossiblyIgnoringCase(localName(), other.localName(), shouldIgnoreCase) &amp;&amp; namespaceURI() == other.namespaceURI()); }
-
</del><span class="cx">     bool hasPrefix() const { return m_impl-&gt;m_prefix != nullAtom; }
</span><span class="cx">     void setPrefix(const AtomicString&amp; prefix) { *this = QualifiedName(prefix, localName(), namespaceURI()); }
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>