<!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>[173648] 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/173648">173648</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2014-09-15 21:09:58 -0700 (Mon, 15 Sep 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Use an AtomicString as key for caching ClassNodeList objects
https://bugs.webkit.org/show_bug.cgi?id=136830

Reviewed by Benjamin Poulain.

Use an AtomicString as key for caching ClassNodeList objects instead of
a String. ClassNodeList is the only type using a String instead of an
AtomicString as key in the cache HashTable. This brings some
complexity.

I believe this was done to avoid unnecessarily atomizing the String,
for performance reasons. However, at the moment, the String gets
atomized anyway when constructing the ClassNodeList object. This is
because the ClassNodeList::m_classNames member is of SpaceSplitString
type and the SpaceSplitString constructor takes an AtomicString in
argument.

Using an AtomicString to cache ClassNodeLists simplifies the code quite
a bit and decreases the size of NodeListsNodeData as well.

Test: fast/dom/getElementsByClassName/conflict-tag-name.html

* WebCore.order:
Remove symbol corresponding to addCacheWithName() as it was removed.

* dom/ClassNodeList.cpp:
(WebCore::ClassNodeList::~ClassNodeList):
Update the constructor to take an AtomicString in argument instead of
a String, for clarity. The String gets atomized when initializing
m_classNames anyway.

(WebCore::ClassNodeList::ClassNodeList):
Call removeCacheWithAtomicName() instead of removeCacheWithName() now
that m_originalClassNames is an AtomicString.

* dom/ClassNodeList.h:
Use AtomicString instead of String type for classNames, in both the
constructor argument and the m_originalClassNames data member.

* dom/ContainerNode.cpp:
(WebCore::ContainerNode::getElementsByClassName):
Call addCacheWithAtomicName() instead of addCacheWithName() now that
addCacheWithName() has been removed.

* dom/Node.cpp:
(WebCore::NodeListsNodeData::invalidateCaches):
Stop invalidating m_nameCaches as this HashMap no longer exists.

* dom/NodeRareData.h:
(WebCore::NodeListsNodeData::NodeListCacheMapEntryHash::hash):
(WebCore::NodeListsNodeData::NodeListCacheMapEntryHash::equal):
(WebCore::NodeListsNodeData::isEmpty):
(WebCore::NodeListsNodeData::adoptDocument):
(WebCore::NodeListsNodeData::namedNodeListKey):
(WebCore::NodeListsNodeData::deleteThisAndUpdateNodeRareDataIfAboutToRemoveLastList):
(WebCore::NodeListsNodeData::addCacheWithName): Deleted.
(WebCore::NodeListsNodeData::removeCacheWithName): Deleted.
- Drop addCacheWithName() / removeCacheWithName() now that no NodeList
  uses a String as HashMap key.
- Drop m_nameCaches now that ClassNodeLists are cached in
  m_atomicNameCaches instead.
- Remove StringType template parameter and hardcode AtomicString
  instead.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreWebCoreorder">trunk/Source/WebCore/WebCore.order</a></li>
<li><a href="#trunkSourceWebCoredomClassNodeListcpp">trunk/Source/WebCore/dom/ClassNodeList.cpp</a></li>
<li><a href="#trunkSourceWebCoredomClassNodeListh">trunk/Source/WebCore/dom/ClassNodeList.h</a></li>
<li><a href="#trunkSourceWebCoredomContainerNodecpp">trunk/Source/WebCore/dom/ContainerNode.cpp</a></li>
<li><a href="#trunkSourceWebCoredomContainerNodeh">trunk/Source/WebCore/dom/ContainerNode.h</a></li>
<li><a href="#trunkSourceWebCoredomNodecpp">trunk/Source/WebCore/dom/Node.cpp</a></li>
<li><a href="#trunkSourceWebCoredomNodeRareDatah">trunk/Source/WebCore/dom/NodeRareData.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfastdomgetElementsByClassNameconflicttagnameexpectedtxt">trunk/LayoutTests/fast/dom/getElementsByClassName/conflict-tag-name-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastdomgetElementsByClassNameconflicttagnamehtml">trunk/LayoutTests/fast/dom/getElementsByClassName/conflict-tag-name.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsfastdomgetElementsByClassNameconflicttagnameexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/dom/getElementsByClassName/conflict-tag-name-expected.txt (0 => 173648)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/getElementsByClassName/conflict-tag-name-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/dom/getElementsByClassName/conflict-tag-name-expected.txt        2014-09-16 04:09:58 UTC (rev 173648)
</span><span class="lines">@@ -0,0 +1,13 @@
</span><ins>+Checks that getElementsByClassName('foo') and getElementsByTagName('foo') do not conflict
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+PASS withFooTag.length is 1
+PASS withFooTag[0].id is &quot;a&quot;
+PASS withFooClass.length is 1
+PASS withFooClass[0].id is &quot;b&quot;
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfastdomgetElementsByClassNameconflicttagnamehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/dom/getElementsByClassName/conflict-tag-name.html (0 => 173648)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/getElementsByClassName/conflict-tag-name.html                                (rev 0)
+++ trunk/LayoutTests/fast/dom/getElementsByClassName/conflict-tag-name.html        2014-09-16 04:09:58 UTC (rev 173648)
</span><span class="lines">@@ -0,0 +1,17 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;script src=&quot;../../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+
+&lt;foo id=&quot;a&quot;&gt;&lt;/foo&gt;
+&lt;div id=&quot;b&quot; class=&quot;foo&quot;&gt;&lt;/div&gt;
+
+&lt;script&gt;
+description(&quot;Checks that getElementsByClassName('foo') and getElementsByTagName('foo') do not conflict&quot;);
+
+var withFooTag = document.getElementsByTagName(&quot;foo&quot;);
+shouldBe(&quot;withFooTag.length&quot;, &quot;1&quot;);
+shouldBeEqualToString(&quot;withFooTag[0].id&quot;, &quot;a&quot;);
+
+var withFooClass = document.getElementsByClassName(&quot;foo&quot;);
+shouldBe(&quot;withFooClass.length&quot;, &quot;1&quot;);
+shouldBeEqualToString(&quot;withFooClass[0].id&quot;, &quot;b&quot;);
+&lt;/script&gt;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (173647 => 173648)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-09-16 03:50:13 UTC (rev 173647)
+++ trunk/Source/WebCore/ChangeLog        2014-09-16 04:09:58 UTC (rev 173648)
</span><span class="lines">@@ -1,5 +1,71 @@
</span><span class="cx"> 2014-09-15  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        Use an AtomicString as key for caching ClassNodeList objects
+        https://bugs.webkit.org/show_bug.cgi?id=136830
+
+        Reviewed by Benjamin Poulain.
+
+        Use an AtomicString as key for caching ClassNodeList objects instead of
+        a String. ClassNodeList is the only type using a String instead of an
+        AtomicString as key in the cache HashTable. This brings some
+        complexity.
+
+        I believe this was done to avoid unnecessarily atomizing the String,
+        for performance reasons. However, at the moment, the String gets
+        atomized anyway when constructing the ClassNodeList object. This is
+        because the ClassNodeList::m_classNames member is of SpaceSplitString
+        type and the SpaceSplitString constructor takes an AtomicString in
+        argument.
+
+        Using an AtomicString to cache ClassNodeLists simplifies the code quite
+        a bit and decreases the size of NodeListsNodeData as well.
+
+        Test: fast/dom/getElementsByClassName/conflict-tag-name.html
+
+        * WebCore.order:
+        Remove symbol corresponding to addCacheWithName() as it was removed.
+
+        * dom/ClassNodeList.cpp:
+        (WebCore::ClassNodeList::~ClassNodeList):
+        Update the constructor to take an AtomicString in argument instead of
+        a String, for clarity. The String gets atomized when initializing
+        m_classNames anyway.
+
+        (WebCore::ClassNodeList::ClassNodeList):
+        Call removeCacheWithAtomicName() instead of removeCacheWithName() now
+        that m_originalClassNames is an AtomicString.
+
+        * dom/ClassNodeList.h:
+        Use AtomicString instead of String type for classNames, in both the
+        constructor argument and the m_originalClassNames data member.
+
+        * dom/ContainerNode.cpp:
+        (WebCore::ContainerNode::getElementsByClassName):
+        Call addCacheWithAtomicName() instead of addCacheWithName() now that
+        addCacheWithName() has been removed.
+
+        * dom/Node.cpp:
+        (WebCore::NodeListsNodeData::invalidateCaches):
+        Stop invalidating m_nameCaches as this HashMap no longer exists.
+
+        * dom/NodeRareData.h:
+        (WebCore::NodeListsNodeData::NodeListCacheMapEntryHash::hash):
+        (WebCore::NodeListsNodeData::NodeListCacheMapEntryHash::equal):
+        (WebCore::NodeListsNodeData::isEmpty):
+        (WebCore::NodeListsNodeData::adoptDocument):
+        (WebCore::NodeListsNodeData::namedNodeListKey):
+        (WebCore::NodeListsNodeData::deleteThisAndUpdateNodeRareDataIfAboutToRemoveLastList):
+        (WebCore::NodeListsNodeData::addCacheWithName): Deleted.
+        (WebCore::NodeListsNodeData::removeCacheWithName): Deleted.
+        - Drop addCacheWithName() / removeCacheWithName() now that no NodeList
+          uses a String as HashMap key.
+        - Drop m_nameCaches now that ClassNodeLists are cached in
+          m_atomicNameCaches instead.
+        - Remove StringType template parameter and hardcode AtomicString
+          instead.
+
+2014-09-15  Chris Dumez  &lt;cdumez@apple.com&gt;
+
</ins><span class="cx">         Return early in SelectorChecker::checkOne() if selector.isAttributeSelector() is true
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=136838
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCoreorder"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.order (173647 => 173648)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.order        2014-09-16 03:50:13 UTC (rev 173647)
+++ trunk/Source/WebCore/WebCore.order        2014-09-16 04:09:58 UTC (rev 173648)
</span><span class="lines">@@ -6140,7 +6140,6 @@
</span><span class="cx"> __ZN3JSC21getStaticPropertySlotIN7WebCore27JSDOMCoreExceptionPrototypeENS_8JSObjectEEEbPNS_9ExecStateEPKNS_9HashTableEPT_NS_12PropertyNameERNS_12PropertySlotE
</span><span class="cx"> __ZN7WebCore48jsElementPrototypeFunctionGetElementsByClassNameEPN3JSC9ExecStateE
</span><span class="cx"> __ZN7WebCore4Node22getElementsByClassNameERKN3WTF6StringE
</span><del>-__ZN7WebCore17NodeListsNodeData16addCacheWithNameINS_13ClassNodeListEEEN3WTF10PassRefPtrIT_EEPNS_4NodeENS_14CollectionTypeERKNS3_6StringE
</del><span class="cx"> __ZN7WebCore13ClassNodeListC1EN3WTF10PassRefPtrINS_4NodeEEERKNS1_6StringE
</span><span class="cx"> __ZN7WebCore13ClassNodeListC2EN3WTF10PassRefPtrINS_4NodeEEERKNS1_6StringE
</span><span class="cx"> __ZN7WebCore20firstMatchingElementINS_13ClassNodeListEEEPNS_7ElementEPKT_PNS_13ContainerNodeE
</span></span></pre></div>
<a id="trunkSourceWebCoredomClassNodeListcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/ClassNodeList.cpp (173647 => 173648)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/ClassNodeList.cpp        2014-09-16 03:50:13 UTC (rev 173647)
+++ trunk/Source/WebCore/dom/ClassNodeList.cpp        2014-09-16 04:09:58 UTC (rev 173648)
</span><span class="lines">@@ -35,16 +35,14 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-ClassNodeList::ClassNodeList(ContainerNode&amp; rootNode, const String&amp; classNames)
-    : CachedLiveNodeList(rootNode, InvalidateOnClassAttrChange)
-    , m_classNames(classNames, document().inQuirksMode())
-    , m_originalClassNames(classNames)
</del><ins>+PassRef&lt;ClassNodeList&gt; ClassNodeList::create(ContainerNode&amp; rootNode, const AtomicString&amp; classNames)
</ins><span class="cx"> {
</span><ins>+    return adoptRef(*new ClassNodeList(rootNode, classNames));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> ClassNodeList::~ClassNodeList()
</span><span class="cx"> {
</span><del>-    ownerNode().nodeLists()-&gt;removeCacheWithName(this, m_originalClassNames);
</del><ins>+    ownerNode().nodeLists()-&gt;removeCacheWithAtomicName(this, m_originalClassNames);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoredomClassNodeListh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/ClassNodeList.h (173647 => 173648)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/ClassNodeList.h        2014-09-16 03:50:13 UTC (rev 173647)
+++ trunk/Source/WebCore/dom/ClassNodeList.h        2014-09-16 04:09:58 UTC (rev 173648)
</span><span class="lines">@@ -39,10 +39,7 @@
</span><span class="cx"> 
</span><span class="cx"> class ClassNodeList final : public CachedLiveNodeList&lt;ClassNodeList&gt; {
</span><span class="cx"> public:
</span><del>-    static PassRef&lt;ClassNodeList&gt; create(ContainerNode&amp; rootNode, const String&amp; classNames)
-    {
-        return adoptRef(*new ClassNodeList(rootNode, classNames));
-    }
</del><ins>+    static PassRef&lt;ClassNodeList&gt; create(ContainerNode&amp;, const AtomicString&amp; classNames);
</ins><span class="cx"> 
</span><span class="cx">     virtual ~ClassNodeList();
</span><span class="cx"> 
</span><span class="lines">@@ -50,12 +47,19 @@
</span><span class="cx">     virtual bool isRootedAtDocument() const override { return false; }
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    ClassNodeList(ContainerNode&amp; rootNode, const String&amp; classNames);
</del><ins>+    ClassNodeList(ContainerNode&amp; rootNode, const AtomicString&amp; classNames);
</ins><span class="cx"> 
</span><span class="cx">     SpaceSplitString m_classNames;
</span><del>-    String m_originalClassNames;
</del><ins>+    AtomicString m_originalClassNames;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><ins>+inline ClassNodeList::ClassNodeList(ContainerNode&amp; rootNode, const AtomicString&amp; classNames)
+    : CachedLiveNodeList(rootNode, InvalidateOnClassAttrChange)
+    , m_classNames(classNames, document().inQuirksMode())
+    , m_originalClassNames(classNames)
+{
+}
+
</ins><span class="cx"> inline bool ClassNodeList::nodeMatches(Element* element) const
</span><span class="cx"> {
</span><span class="cx">     if (!element-&gt;hasClass())
</span></span></pre></div>
<a id="trunkSourceWebCoredomContainerNodecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/ContainerNode.cpp (173647 => 173648)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/ContainerNode.cpp        2014-09-16 03:50:13 UTC (rev 173647)
+++ trunk/Source/WebCore/dom/ContainerNode.cpp        2014-09-16 04:09:58 UTC (rev 173648)
</span><span class="lines">@@ -1054,9 +1054,9 @@
</span><span class="cx">     return ensureRareData().ensureNodeLists().addCacheWithAtomicName&lt;NameNodeList&gt;(*this, elementName);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-PassRefPtr&lt;NodeList&gt; ContainerNode::getElementsByClassName(const String&amp; classNames)
</del><ins>+PassRefPtr&lt;NodeList&gt; ContainerNode::getElementsByClassName(const AtomicString&amp; classNames)
</ins><span class="cx"> {
</span><del>-    return ensureRareData().ensureNodeLists().addCacheWithName&lt;ClassNodeList&gt;(*this, classNames);
</del><ins>+    return ensureRareData().ensureNodeLists().addCacheWithAtomicName&lt;ClassNodeList&gt;(*this, classNames);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> PassRefPtr&lt;RadioNodeList&gt; ContainerNode::radioNodeList(const AtomicString&amp; name)
</span></span></pre></div>
<a id="trunkSourceWebCoredomContainerNodeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/ContainerNode.h (173647 => 173648)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/ContainerNode.h        2014-09-16 03:50:13 UTC (rev 173647)
+++ trunk/Source/WebCore/dom/ContainerNode.h        2014-09-16 04:09:58 UTC (rev 173648)
</span><span class="lines">@@ -137,7 +137,7 @@
</span><span class="cx">     PassRefPtr&lt;NodeList&gt; getElementsByTagName(const AtomicString&amp;);
</span><span class="cx">     PassRefPtr&lt;NodeList&gt; getElementsByTagNameNS(const AtomicString&amp; namespaceURI, const AtomicString&amp; localName);
</span><span class="cx">     PassRefPtr&lt;NodeList&gt; getElementsByName(const String&amp; elementName);
</span><del>-    PassRefPtr&lt;NodeList&gt; getElementsByClassName(const String&amp; classNames);
</del><ins>+    PassRefPtr&lt;NodeList&gt; getElementsByClassName(const AtomicString&amp; classNames);
</ins><span class="cx">     PassRefPtr&lt;RadioNodeList&gt; radioNodeList(const AtomicString&amp;);
</span><span class="cx"> 
</span><span class="cx"> protected:
</span></span></pre></div>
<a id="trunkSourceWebCoredomNodecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Node.cpp (173647 => 173648)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Node.cpp        2014-09-16 03:50:13 UTC (rev 173647)
+++ trunk/Source/WebCore/dom/Node.cpp        2014-09-16 04:09:58 UTC (rev 173648)
</span><span class="lines">@@ -1695,9 +1695,6 @@
</span><span class="cx">     for (auto&amp; atomicName : m_atomicNameCaches)
</span><span class="cx">         atomicName.value-&gt;invalidateCacheForAttribute(attrName);
</span><span class="cx"> 
</span><del>-    for (auto&amp; name : m_nameCaches)
-        name.value-&gt;invalidateCacheForAttribute(attrName);
-
</del><span class="cx">     for (auto&amp; collection : m_cachedCollections)
</span><span class="cx">         collection.value-&gt;invalidateCache(attrName);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoredomNodeRareDatah"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/NodeRareData.h (173647 => 173648)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/NodeRareData.h        2014-09-16 03:50:13 UTC (rev 173647)
+++ trunk/Source/WebCore/dom/NodeRareData.h        2014-09-16 04:09:58 UTC (rev 173648)
</span><span class="lines">@@ -35,7 +35,6 @@
</span><span class="cx"> #include &quot;TagNodeList.h&quot;
</span><span class="cx"> #include &lt;wtf/HashSet.h&gt;
</span><span class="cx"> #include &lt;wtf/text/AtomicString.h&gt;
</span><del>-#include &lt;wtf/text/StringHash.h&gt;
</del><span class="cx"> 
</span><span class="cx"> #if ENABLE(VIDEO_TRACK)
</span><span class="cx"> #include &quot;TextTrack.h&quot;
</span><span class="lines">@@ -106,19 +105,17 @@
</span><span class="cx">         m_emptyChildNodeList = nullptr;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    template &lt;typename StringType&gt;
</del><span class="cx">     struct NodeListCacheMapEntryHash {
</span><del>-        static unsigned hash(const std::pair&lt;unsigned char, StringType&gt;&amp; entry)
</del><ins>+        static unsigned hash(const std::pair&lt;unsigned char, AtomicString&gt;&amp; entry)
</ins><span class="cx">         {
</span><del>-            return DefaultHash&lt;StringType&gt;::Hash::hash(entry.second) + entry.first;
</del><ins>+            return DefaultHash&lt;AtomicString&gt;::Hash::hash(entry.second) + entry.first;
</ins><span class="cx">         }
</span><del>-        static bool equal(const std::pair&lt;unsigned char, StringType&gt;&amp; a, const std::pair&lt;unsigned char, StringType&gt;&amp; b) { return a.first == b.first &amp;&amp; DefaultHash&lt;StringType&gt;::Hash::equal(a.second, b.second); }
-        static const bool safeToCompareToEmptyOrDeleted = DefaultHash&lt;StringType&gt;::Hash::safeToCompareToEmptyOrDeleted;
</del><ins>+        static bool equal(const std::pair&lt;unsigned char, AtomicString&gt;&amp; a, const std::pair&lt;unsigned char, AtomicString&gt;&amp; b) { return a.first == b.first &amp;&amp; DefaultHash&lt;AtomicString&gt;::Hash::equal(a.second, b.second); }
+        static const bool safeToCompareToEmptyOrDeleted = DefaultHash&lt;AtomicString&gt;::Hash::safeToCompareToEmptyOrDeleted;
</ins><span class="cx">     };
</span><span class="cx"> 
</span><del>-    typedef HashMap&lt;std::pair&lt;unsigned char, AtomicString&gt;, LiveNodeList*, NodeListCacheMapEntryHash&lt;AtomicString&gt;&gt; NodeListAtomicNameCacheMap;
-    typedef HashMap&lt;std::pair&lt;unsigned char, String&gt;, LiveNodeList*, NodeListCacheMapEntryHash&lt;String&gt;&gt; NodeListNameCacheMap;
-    typedef HashMap&lt;std::pair&lt;unsigned char, AtomicString&gt;, HTMLCollection*, NodeListCacheMapEntryHash&lt;AtomicString&gt;&gt; CollectionCacheMap;
</del><ins>+    typedef HashMap&lt;std::pair&lt;unsigned char, AtomicString&gt;, LiveNodeList*, NodeListCacheMapEntryHash&gt; NodeListAtomicNameCacheMap;
+    typedef HashMap&lt;std::pair&lt;unsigned char, AtomicString&gt;, HTMLCollection*, NodeListCacheMapEntryHash&gt; CollectionCacheMap;
</ins><span class="cx">     typedef HashMap&lt;QualifiedName, TagNodeList*&gt; TagNodeListCacheNS;
</span><span class="cx"> 
</span><span class="cx">     template&lt;typename T, typename ContainerType&gt;
</span><span class="lines">@@ -133,18 +130,6 @@
</span><span class="cx">         return list;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    template&lt;typename T&gt;
-    ALWAYS_INLINE PassRef&lt;T&gt; addCacheWithName(ContainerNode&amp; node, const String&amp; name)
-    {
-        NodeListNameCacheMap::AddResult result = m_nameCaches.fastAdd(namedNodeListKey&lt;T&gt;(name), nullptr);
-        if (!result.isNewEntry)
-            return static_cast&lt;T&amp;&gt;(*result.iterator-&gt;value);
-
-        auto list = T::create(node, name);
-        result.iterator-&gt;value = &amp;list.get();
-        return list;
-    }
-
</del><span class="cx">     ALWAYS_INLINE PassRef&lt;TagNodeList&gt; addCacheWithQualifiedName(ContainerNode&amp; node, const AtomicString&amp; namespaceURI, const AtomicString&amp; localName)
</span><span class="cx">     {
</span><span class="cx">         QualifiedName name(nullAtom, localName, namespaceURI);
</span><span class="lines">@@ -196,15 +181,6 @@
</span><span class="cx">         m_atomicNameCaches.remove(namedNodeListKey&lt;NodeListType&gt;(name));
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    template &lt;class NodeListType&gt;
-    void removeCacheWithName(NodeListType* list, const String&amp; name)
-    {
-        ASSERT(list == m_nameCaches.get(namedNodeListKey&lt;NodeListType&gt;(name)));
-        if (deleteThisAndUpdateNodeRareDataIfAboutToRemoveLastList(list-&gt;ownerNode()))
-            return;
-        m_nameCaches.remove(namedNodeListKey&lt;NodeListType&gt;(name));
-    }
-
</del><span class="cx">     void removeCacheWithQualifiedName(LiveNodeList* list, const AtomicString&amp; namespaceURI, const AtomicString&amp; localName)
</span><span class="cx">     {
</span><span class="cx">         QualifiedName name(nullAtom, localName, namespaceURI);
</span><span class="lines">@@ -225,7 +201,7 @@
</span><span class="cx">     void invalidateCaches(const QualifiedName* attrName = 0);
</span><span class="cx">     bool isEmpty() const
</span><span class="cx">     {
</span><del>-        return m_atomicNameCaches.isEmpty() &amp;&amp; m_nameCaches.isEmpty() &amp;&amp; m_cachedCollections.isEmpty() &amp;&amp; m_tagNodeListCacheNS.isEmpty();
</del><ins>+        return m_atomicNameCaches.isEmpty() &amp;&amp; m_cachedCollections.isEmpty() &amp;&amp; m_tagNodeListCacheNS.isEmpty();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     void adoptTreeScope()
</span><span class="lines">@@ -244,9 +220,6 @@
</span><span class="cx">         for (auto&amp; cache : m_atomicNameCaches.values())
</span><span class="cx">             cache-&gt;invalidateCache(*oldDocument);
</span><span class="cx"> 
</span><del>-        for (auto&amp; cache : m_nameCaches.values())
-            cache-&gt;invalidateCache(*oldDocument);
-
</del><span class="cx">         for (auto&amp; list : m_tagNodeListCacheNS.values()) {
</span><span class="cx">             ASSERT(!list-&gt;isRootedAtDocument());
</span><span class="cx">             list-&gt;invalidateCache(*oldDocument);
</span><span class="lines">@@ -263,9 +236,9 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     template &lt;class NodeListType&gt;
</span><del>-    std::pair&lt;unsigned char, String&gt; namedNodeListKey(const String&amp; name)
</del><ins>+    std::pair&lt;unsigned char, AtomicString&gt; namedNodeListKey(const AtomicString&amp; name)
</ins><span class="cx">     {
</span><del>-        return std::pair&lt;unsigned char, String&gt;(NodeListTypeIdentifier&lt;NodeListType&gt;::value(), name);
</del><ins>+        return std::pair&lt;unsigned char, AtomicString&gt;(NodeListTypeIdentifier&lt;NodeListType&gt;::value(), name);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     bool deleteThisAndUpdateNodeRareDataIfAboutToRemoveLastList(Node&amp;);
</span><span class="lines">@@ -275,7 +248,6 @@
</span><span class="cx">     EmptyNodeList* m_emptyChildNodeList;
</span><span class="cx"> 
</span><span class="cx">     NodeListAtomicNameCacheMap m_atomicNameCaches;
</span><del>-    NodeListNameCacheMap m_nameCaches;
</del><span class="cx">     TagNodeListCacheNS m_tagNodeListCacheNS;
</span><span class="cx">     CollectionCacheMap m_cachedCollections;
</span><span class="cx"> };
</span><span class="lines">@@ -336,7 +308,7 @@
</span><span class="cx"> inline bool NodeListsNodeData::deleteThisAndUpdateNodeRareDataIfAboutToRemoveLastList(Node&amp; ownerNode)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(ownerNode.nodeLists() == this);
</span><del>-    if ((m_childNodeList ? 1 : 0) + (m_emptyChildNodeList ? 1 : 0) + m_atomicNameCaches.size() + m_nameCaches.size()
</del><ins>+    if ((m_childNodeList ? 1 : 0) + (m_emptyChildNodeList ? 1 : 0) + m_atomicNameCaches.size()
</ins><span class="cx">         + m_tagNodeListCacheNS.size() + m_cachedCollections.size() != 1)
</span><span class="cx">         return false;
</span><span class="cx">     ownerNode.clearNodeLists();
</span></span></pre>
</div>
</div>

</body>
</html>