<!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>[171020] trunk/Source/WebCore</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/171020">171020</a></dd>
<dt>Author</dt> <dd>benjamin@webkit.org</dd>
<dt>Date</dt> <dd>2014-07-11 22:08:33 -0700 (Fri, 11 Jul 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Partition the CSS rules based on the most specific filter of the rightmost fragment
https://bugs.webkit.org/show_bug.cgi?id=134828

Reviewed by Andreas Kling.

Previously, RuleSet was partitioning each rule based on the rightmost filter.
While fast, this had the side effect of putting many selectors with ID match in the class
bucket (because the selectors are generally written starting with the ID).

This patch replace the code of findBestRuleSetAndAdd() by a simple loop going over all
the simple selectors in the rightmost fragment to find the best bucket.

* css/ElementRuleCollector.cpp:
(WebCore::ElementRuleCollector::ruleMatches):
* css/RuleSet.cpp:
(WebCore::isSelectorMatchingHTMLBasedOnRuleHash):
I unified ruleData.hasRightmostSelectorMatchingHTMLBasedOnRuleHash() and hasMultipartSelector().

(WebCore::RuleData::RuleData):
(WebCore::rulesCountForName):
(WebCore::RuleSet::addRule):
I removed the recursive part of findBestRuleSetAndAdd() (which was wrong anyway). The function
was useless so I just moved the algorithm to addRule() directly.

We first loop over all the CSSSelectors related by SubSelector, this correspond to the rightmost fragment.
If a filter with high specificity is found, we add the rule immediately and end there.
If a filter that is not very specific is found, we keep a pointer to the selector to use it later.

(WebCore::RuleSet::findBestRuleSetAndAdd): Deleted.
* css/RuleSet.h:
(WebCore::RuleData::hasMultipartSelector): Deleted.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorecssElementRuleCollectorcpp">trunk/Source/WebCore/css/ElementRuleCollector.cpp</a></li>
<li><a href="#trunkSourceWebCorecssRuleSetcpp">trunk/Source/WebCore/css/RuleSet.cpp</a></li>
<li><a href="#trunkSourceWebCorecssRuleSeth">trunk/Source/WebCore/css/RuleSet.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (171019 => 171020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-07-12 03:54:05 UTC (rev 171019)
+++ trunk/Source/WebCore/ChangeLog        2014-07-12 05:08:33 UTC (rev 171020)
</span><span class="lines">@@ -1,3 +1,37 @@
</span><ins>+2014-07-11  Benjamin Poulain  &lt;benjamin@webkit.org&gt;
+
+        Partition the CSS rules based on the most specific filter of the rightmost fragment
+        https://bugs.webkit.org/show_bug.cgi?id=134828
+
+        Reviewed by Andreas Kling.
+
+        Previously, RuleSet was partitioning each rule based on the rightmost filter.
+        While fast, this had the side effect of putting many selectors with ID match in the class
+        bucket (because the selectors are generally written starting with the ID).
+
+        This patch replace the code of findBestRuleSetAndAdd() by a simple loop going over all
+        the simple selectors in the rightmost fragment to find the best bucket.
+
+        * css/ElementRuleCollector.cpp:
+        (WebCore::ElementRuleCollector::ruleMatches):
+        * css/RuleSet.cpp:
+        (WebCore::isSelectorMatchingHTMLBasedOnRuleHash):
+        I unified ruleData.hasRightmostSelectorMatchingHTMLBasedOnRuleHash() and hasMultipartSelector().
+
+        (WebCore::RuleData::RuleData):
+        (WebCore::rulesCountForName):
+        (WebCore::RuleSet::addRule):
+        I removed the recursive part of findBestRuleSetAndAdd() (which was wrong anyway). The function
+        was useless so I just moved the algorithm to addRule() directly.
+
+        We first loop over all the CSSSelectors related by SubSelector, this correspond to the rightmost fragment.
+        If a filter with high specificity is found, we add the rule immediately and end there.
+        If a filter that is not very specific is found, we keep a pointer to the selector to use it later.
+
+        (WebCore::RuleSet::findBestRuleSetAndAdd): Deleted.
+        * css/RuleSet.h:
+        (WebCore::RuleData::hasMultipartSelector): Deleted.
+
</ins><span class="cx"> 2014-07-11  Alex Christensen  &lt;achristensen@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         [WinCairo] Unreviewed build fix after r170937.
</span></span></pre></div>
<a id="trunkSourceWebCorecssElementRuleCollectorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/ElementRuleCollector.cpp (171019 => 171020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/ElementRuleCollector.cpp        2014-07-12 03:54:05 UTC (rev 171019)
+++ trunk/Source/WebCore/css/ElementRuleCollector.cpp        2014-07-12 05:08:33 UTC (rev 171020)
</span><span class="lines">@@ -280,10 +280,8 @@
</span><span class="cx">             return false;
</span><span class="cx">         // We know a sufficiently simple single part selector matches simply because we found it from the rule hash.
</span><span class="cx">         // This is limited to HTML only so we don't need to check the namespace.
</span><del>-        if (ruleData.hasRightmostSelectorMatchingHTMLBasedOnRuleHash() &amp;&amp; m_element.isHTMLElement()) {
-            if (!ruleData.hasMultipartSelector())
-                return true;
-        }
</del><ins>+        if (ruleData.hasRightmostSelectorMatchingHTMLBasedOnRuleHash() &amp;&amp; m_element.isHTMLElement())
+            return true;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(CSS_SELECTOR_JIT)
</span></span></pre></div>
<a id="trunkSourceWebCorecssRuleSetcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/RuleSet.cpp (171019 => 171020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/RuleSet.cpp        2014-07-12 03:54:05 UTC (rev 171019)
+++ trunk/Source/WebCore/css/RuleSet.cpp        2014-07-12 05:08:33 UTC (rev 171020)
</span><span class="lines">@@ -2,7 +2,7 @@
</span><span class="cx">  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
</span><span class="cx">  *           (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com)
</span><span class="cx">  * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com)
</span><del>- * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2005-2014 Apple Inc. All rights reserved.
</ins><span class="cx">  * Copyright (C) 2007 Alexey Proskuryakov &lt;ap@webkit.org&gt;
</span><span class="cx">  * Copyright (C) 2007, 2008 Eric Seidel &lt;eric@webkit.org&gt;
</span><span class="cx">  * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
</span><span class="lines">@@ -54,20 +54,18 @@
</span><span class="cx"> 
</span><span class="cx"> // -----------------------------------------------------------------
</span><span class="cx"> 
</span><del>-static inline bool isSelectorMatchingHTMLBasedOnRuleHash(const CSSSelector* selector)
</del><ins>+static inline bool isSelectorMatchingHTMLBasedOnRuleHash(const CSSSelector&amp; selector)
</ins><span class="cx"> {
</span><del>-    ASSERT(selector);
-    if (selector-&gt;m_match == CSSSelector::Tag) {
-        const AtomicString&amp; selectorNamespace = selector-&gt;tagQName().namespaceURI();
-        if (selectorNamespace != starAtom &amp;&amp; selectorNamespace != xhtmlNamespaceURI)
-            return false;
-        if (selector-&gt;relation() == CSSSelector::SubSelector)
-            return isSelectorMatchingHTMLBasedOnRuleHash(selector-&gt;tagHistory());
-        return true;
</del><ins>+    if (selector.tagHistory())
+        return false;
+
+    if (selector.m_match == CSSSelector::Tag) {
+        const AtomicString&amp; selectorNamespace = selector.tagQName().namespaceURI();
+        return selectorNamespace == starAtom || selectorNamespace == xhtmlNamespaceURI;
</ins><span class="cx">     }
</span><del>-    if (SelectorChecker::isCommonPseudoClassSelector(selector))
</del><ins>+    if (SelectorChecker::isCommonPseudoClassSelector(&amp;selector))
</ins><span class="cx">         return true;
</span><del>-    return selector-&gt;m_match == CSSSelector::Id || selector-&gt;m_match == CSSSelector::Class;
</del><ins>+    return selector.m_match == CSSSelector::Id || selector.m_match == CSSSelector::Class;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static inline bool selectorListContainsUncommonAttributeSelector(const CSSSelector* selector)
</span><span class="lines">@@ -134,8 +132,7 @@
</span><span class="cx">     , m_position(position)
</span><span class="cx">     , m_hasFastCheckableSelector((addRuleFlags &amp; RuleCanUseFastCheckSelector) &amp;&amp; SelectorCheckerFastPath::canUse(selector()))
</span><span class="cx">     , m_specificity(selector()-&gt;specificity())
</span><del>-    , m_hasMultipartSelector(!!selector()-&gt;tagHistory())
-    , m_hasRightmostSelectorMatchingHTMLBasedOnRuleHash(isSelectorMatchingHTMLBasedOnRuleHash(selector()))
</del><ins>+    , m_hasRightmostSelectorMatchingHTMLBasedOnRuleHash(isSelectorMatchingHTMLBasedOnRuleHash(*selector()))
</ins><span class="cx">     , m_containsUncommonAttributeSelector(WebCore::containsUncommonAttributeSelector(selector()))
</span><span class="cx">     , m_linkMatchType(SelectorChecker::determineLinkMatchType(selector()))
</span><span class="cx">     , m_hasDocumentSecurityOrigin(addRuleFlags &amp; RuleHasDocumentSecurityOrigin)
</span><span class="lines">@@ -169,7 +166,7 @@
</span><span class="cx">     if (ruleData.containsUncommonAttributeSelector())
</span><span class="cx">         features.uncommonAttributeRules.append(RuleFeature(ruleData.rule(), ruleData.selectorIndex(), ruleData.hasDocumentSecurityOrigin()));
</span><span class="cx"> }
</span><del>-    
</del><ins>+
</ins><span class="cx"> void RuleSet::addToRuleSet(AtomicStringImpl* key, AtomRuleMap&amp; map, const RuleData&amp; ruleData)
</span><span class="cx"> {
</span><span class="cx">     if (!key)
</span><span class="lines">@@ -180,68 +177,101 @@
</span><span class="cx">     rules-&gt;append(ruleData);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool RuleSet::findBestRuleSetAndAdd(const CSSSelector* component, RuleData&amp; ruleData)
</del><ins>+static unsigned rulesCountForName(const RuleSet::AtomRuleMap&amp; map, AtomicStringImpl* name)
</ins><span class="cx"> {
</span><del>-    if (component-&gt;m_match == CSSSelector::Id) {
-        addToRuleSet(component-&gt;value().impl(), m_idRules, ruleData);
-        return true;
-    }
-    if (component-&gt;m_match == CSSSelector::Class) {
-        addToRuleSet(component-&gt;value().impl(), m_classRules, ruleData);
-        return true;
-    }
-    if (component-&gt;isCustomPseudoElement()) {
-        addToRuleSet(component-&gt;value().impl(), m_shadowPseudoElementRules, ruleData);
-        return true;
-    }
</del><ins>+    if (const Vector&lt;RuleData&gt;* rules = map.get(name))
+        return rules-&gt;size();
+    return 0;
+}
+
+void RuleSet::addRule(StyleRule* rule, unsigned selectorIndex, AddRuleFlags addRuleFlags)
+{
+    RuleData ruleData(rule, selectorIndex, m_ruleCount++, addRuleFlags);
+    collectFeaturesFromRuleData(m_features, ruleData);
+
+    unsigned classBucketSize = 0;
+    const CSSSelector* tagSelector = nullptr;
+    const CSSSelector* classSelector = nullptr;
+    const CSSSelector* linkSelector = nullptr;
+    const CSSSelector* focusSelector = nullptr;
+    const CSSSelector* selector = ruleData.selector();
+    do {
+        if (selector-&gt;m_match == CSSSelector::Id) {
+            addToRuleSet(selector-&gt;value().impl(), m_idRules, ruleData);
+            return;
+        }
+
</ins><span class="cx"> #if ENABLE(VIDEO_TRACK)
</span><del>-    if (component-&gt;m_match == CSSSelector::PseudoElement &amp;&amp; component-&gt;pseudoElementType() == CSSSelector::PseudoElementCue) {
-        m_cuePseudoRules.append(ruleData);
-        return true;
-    }
</del><ins>+        if (selector-&gt;m_match == CSSSelector::PseudoElement &amp;&amp; selector-&gt;pseudoElementType() == CSSSelector::PseudoElementCue) {
+            m_cuePseudoRules.append(ruleData);
+            return;
+        }
</ins><span class="cx"> #endif
</span><del>-    if (SelectorChecker::isCommonPseudoClassSelector(component)) {
-        switch (component-&gt;pseudoClassType()) {
-        case CSSSelector::PseudoClassLink:
-        case CSSSelector::PseudoClassVisited:
-        case CSSSelector::PseudoClassAnyLink:
-            m_linkPseudoClassRules.append(ruleData);
-            return true;
-        case CSSSelector::PseudoClassFocus:
-            m_focusPseudoClassRules.append(ruleData);
-            return true;
-        default:
-            ASSERT_NOT_REACHED();
-            return true;
</del><ins>+
+        if (selector-&gt;isCustomPseudoElement()) {
+            addToRuleSet(selector-&gt;value().impl(), m_shadowPseudoElementRules, ruleData);
+            return;
</ins><span class="cx">         }
</span><del>-    }
</del><span class="cx"> 
</span><del>-    if (component-&gt;m_match == CSSSelector::Tag) {
-        // If this is part of a subselector chain, recurse ahead to find a narrower set (ID/class/:pseudo)
-        if (component-&gt;relation() == CSSSelector::SubSelector) {
-            const CSSSelector* nextComponent = component-&gt;tagHistory();
-            if (nextComponent-&gt;m_match == CSSSelector::Class || nextComponent-&gt;m_match == CSSSelector::Id || SelectorChecker::isCommonPseudoClassSelector(nextComponent)) {
-                if (findBestRuleSetAndAdd(nextComponent, ruleData))
-                    return true;
</del><ins>+        if (selector-&gt;m_match == CSSSelector::Class) {
+            AtomicStringImpl* className = selector-&gt;value().impl();
+            if (!classSelector) {
+                classSelector = selector;
+                classBucketSize = rulesCountForName(m_classRules, className);
+            } else if (classBucketSize) {
+                unsigned newClassBucketSize = rulesCountForName(m_classRules, className);
+                if (newClassBucketSize &lt; classBucketSize) {
+                    classSelector = selector;
+                    classBucketSize = newClassBucketSize;
+                }
</ins><span class="cx">             }
</span><span class="cx">         }
</span><del>-        if (component-&gt;tagQName().localName() != starAtom) {
-            addToRuleSet(component-&gt;tagQName().localName().impl(), m_tagRules, ruleData);
-            return true;
</del><ins>+
+        if (selector-&gt;m_match == CSSSelector::Tag &amp;&amp; selector-&gt;tagQName().localName() != starAtom)
+            tagSelector = selector;
+
+        if (SelectorChecker::isCommonPseudoClassSelector(selector)) {
+            switch (selector-&gt;pseudoClassType()) {
+            case CSSSelector::PseudoClassLink:
+            case CSSSelector::PseudoClassVisited:
+            case CSSSelector::PseudoClassAnyLink:
+                linkSelector = selector;
+                break;
+            case CSSSelector::PseudoClassFocus:
+                focusSelector = selector;
+                break;
+            default:
+                ASSERT_NOT_REACHED();
+            }
</ins><span class="cx">         }
</span><ins>+
+        if (selector-&gt;relation() != CSSSelector::SubSelector)
+            break;
+        selector = selector-&gt;tagHistory();
+    } while (selector);
+
+    if (classSelector) {
+        addToRuleSet(classSelector-&gt;value().impl(), m_classRules, ruleData);
+        return;
</ins><span class="cx">     }
</span><del>-    return false;
-}
</del><span class="cx"> 
</span><del>-void RuleSet::addRule(StyleRule* rule, unsigned selectorIndex, AddRuleFlags addRuleFlags)
-{
-    RuleData ruleData(rule, selectorIndex, m_ruleCount++, addRuleFlags);
-    collectFeaturesFromRuleData(m_features, ruleData);
</del><ins>+    if (linkSelector) {
+        m_linkPseudoClassRules.append(ruleData);
+        return;
+    }
</ins><span class="cx"> 
</span><del>-    if (!findBestRuleSetAndAdd(ruleData.selector(), ruleData)) {
-        // If we didn't find a specialized map to stick it in, file under universal rules.
-        m_universalRules.append(ruleData);
</del><ins>+    if (focusSelector) {
+        m_focusPseudoClassRules.append(ruleData);
+        return;
</ins><span class="cx">     }
</span><ins>+
+    if (tagSelector) {
+        addToRuleSet(tagSelector-&gt;tagQName().localName().impl(), m_tagRules, ruleData);
+        return;
+    }
+
+    // If we didn't find a specialized map to stick it in, file under universal rules.
+    m_universalRules.append(ruleData);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RuleSet::addPageRule(StyleRulePage* rule)
</span></span></pre></div>
<a id="trunkSourceWebCorecssRuleSeth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/RuleSet.h (171019 => 171020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/RuleSet.h        2014-07-12 03:54:05 UTC (rev 171019)
+++ trunk/Source/WebCore/css/RuleSet.h        2014-07-12 05:08:33 UTC (rev 171020)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> /*
</span><span class="cx">  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
</span><del>- * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2003-2014 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * This library is free software; you can redistribute it and/or
</span><span class="cx">  * modify it under the terms of the GNU Library General Public
</span><span class="lines">@@ -67,7 +67,6 @@
</span><span class="cx">     unsigned selectorIndex() const { return m_selectorIndex; }
</span><span class="cx"> 
</span><span class="cx">     bool hasFastCheckableSelector() const { return m_hasFastCheckableSelector; }
</span><del>-    bool hasMultipartSelector() const { return m_hasMultipartSelector; }
</del><span class="cx">     bool hasRightmostSelectorMatchingHTMLBasedOnRuleHash() const { return m_hasRightmostSelectorMatchingHTMLBasedOnRuleHash; }
</span><span class="cx">     bool containsUncommonAttributeSelector() const { return m_containsUncommonAttributeSelector; }
</span><span class="cx">     unsigned specificity() const { return m_specificity; }
</span><span class="lines">@@ -104,7 +103,6 @@
</span><span class="cx">     unsigned m_position : 18;
</span><span class="cx">     unsigned m_hasFastCheckableSelector : 1;
</span><span class="cx">     unsigned m_specificity : 24;
</span><del>-    unsigned m_hasMultipartSelector : 1;
</del><span class="cx">     unsigned m_hasRightmostSelectorMatchingHTMLBasedOnRuleHash : 1;
</span><span class="cx">     unsigned m_containsUncommonAttributeSelector : 1;
</span><span class="cx">     unsigned m_linkMatchType : 2; //  SelectorChecker::LinkMatchMask
</span><span class="lines">@@ -185,7 +183,6 @@
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     void addChildRules(const Vector&lt;RefPtr&lt;StyleRuleBase&gt;&gt;&amp;, const MediaQueryEvaluator&amp; medium, StyleResolver*, bool hasDocumentSecurityOrigin, AddRuleFlags);
</span><del>-    bool findBestRuleSetAndAdd(const CSSSelector*, RuleData&amp;);
</del><span class="cx"> 
</span><span class="cx">     AtomRuleMap m_idRules;
</span><span class="cx">     AtomRuleMap m_classRules;
</span></span></pre>
</div>
</div>

</body>
</html>