Changeset 94887 in webkit


Ignore:
Timestamp:
Sep 9, 2011 4:22:49 PM (13 years ago)
Author:
commit-queue@webkit.org
Message:

CSS rules not being applied when a hidden field is inserted between an input[type=checkbox] and a label
https://bugs.webkit.org/show_bug.cgi?id=66887

Patch by Kulanthaivel Palanichamy <kulanthaivel@codeaurora.org> on 2011-09-09
Reviewed by David Hyatt.

Source/WebCore:

Test: fast/css/adjacent-sibling-selector.html

This patch addresses the problem of elements not getting their style recomputed
when they are affected by direct adjacent sibling rules and one of their sibling in
their corresponding rules is modified dynamically.

  • css/CSSStyleSelector.cpp:

(WebCore::CSSStyleSelector::canShareStyleWithElement):
(WebCore::parentStylePreventsSharing):

  • css/SelectorChecker.cpp:

(WebCore::SelectorChecker::checkSelector):

  • dom/Element.cpp:

(WebCore::Element::recalcStyle):
(WebCore::checkForSiblingStyleChanges):

  • rendering/style/RenderStyle.cpp:

(WebCore::RenderStyle::RenderStyle):

  • rendering/style/RenderStyle.h:

(WebCore::InheritedFlags::affectedByDirectAdjacentRules):
(WebCore::InheritedFlags::setAffectedByDirectAdjacentRules):

LayoutTests:

  • fast/css/adjacent-sibling-selector-expected.txt: Added.
  • fast/css/adjacent-sibling-selector.html: Added.
Location:
trunk
Files:
2 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r94884 r94887  
     12011-09-09  Kulanthaivel Palanichamy  <kulanthaivel@codeaurora.org>
     2
     3        CSS rules not being applied when a hidden field is inserted between an input[type=checkbox] and a label
     4        https://bugs.webkit.org/show_bug.cgi?id=66887
     5
     6        Reviewed by David Hyatt.
     7
     8        * fast/css/adjacent-sibling-selector-expected.txt: Added.
     9        * fast/css/adjacent-sibling-selector.html: Added.
     10
    1112011-09-09  Tom Sepez  <tsepez@chromium.org>
    212
  • trunk/Source/WebCore/ChangeLog

    r94886 r94887  
     12011-09-09  Kulanthaivel Palanichamy  <kulanthaivel@codeaurora.org>
     2
     3        CSS rules not being applied when a hidden field is inserted between an input[type=checkbox] and a label
     4        https://bugs.webkit.org/show_bug.cgi?id=66887
     5
     6        Reviewed by David Hyatt.
     7
     8        Test: fast/css/adjacent-sibling-selector.html
     9
     10        This patch addresses the problem of elements not getting their style recomputed
     11        when they are affected by direct adjacent sibling rules and one of their sibling in
     12        their corresponding rules is modified dynamically.
     13
     14        * css/CSSStyleSelector.cpp:
     15        (WebCore::CSSStyleSelector::canShareStyleWithElement):
     16        (WebCore::parentStylePreventsSharing):
     17        * css/SelectorChecker.cpp:
     18        (WebCore::SelectorChecker::checkSelector):
     19        * dom/Element.cpp:
     20        (WebCore::Element::recalcStyle):
     21        (WebCore::checkForSiblingStyleChanges):
     22        * rendering/style/RenderStyle.cpp:
     23        (WebCore::RenderStyle::RenderStyle):
     24        * rendering/style/RenderStyle.h:
     25        (WebCore::InheritedFlags::affectedByDirectAdjacentRules):
     26        (WebCore::InheritedFlags::setAffectedByDirectAdjacentRules):
     27
    1282011-09-09  Rafael Antognolli  <antognolli@profusion.mobi>
    229
  • trunk/Source/WebCore/css/CSSStyleSelector.cpp

    r94710 r94887  
    949949        return false;
    950950
     951    if (style->affectedByDirectAdjacentRules())
     952        return false;
     953
    951954#if USE(ACCELERATED_COMPOSITING)
    952955    // Turn off style sharing for elements that can gain layers for reasons outside of the style system.
     
    988991    return parentStyle->childrenAffectedByPositionalRules()
    989992        || parentStyle->childrenAffectedByFirstChildRules()
    990         || parentStyle->childrenAffectedByLastChildRules()
    991         || parentStyle->childrenAffectedByDirectAdjacentRules();
     993        || parentStyle->childrenAffectedByLastChildRules();
    992994}
    993995
  • trunk/Source/WebCore/css/SelectorChecker.cpp

    r94657 r94887  
    342342    case CSSSelector::DirectAdjacent:
    343343        {
    344             if (!m_isCollectingRulesOnly && e->parentNode() && e->parentNode()->isElementNode()) {
    345                 RenderStyle* parentStyle = elementStyle ? elementParentStyle : e->parentNode()->renderStyle();
    346                 if (parentStyle)
    347                     parentStyle->setChildrenAffectedByDirectAdjacentRules();
     344            if (!m_isCollectingRulesOnly) {
     345                RenderStyle* currentStyle = elementStyle ? elementStyle : e->renderStyle();
     346                if (currentStyle)
     347                    currentStyle->setAffectedByDirectAdjacentRules();
    348348            }
    349349            Node* n = e->previousSibling();
  • trunk/Source/WebCore/dom/Element.cpp

    r94869 r94887  
    10701070    RefPtr<RenderStyle> currentStyle(renderStyle());
    10711071    bool hasParentStyle = parentNodeForRenderingAndStyle() ? static_cast<bool>(parentNodeForRenderingAndStyle()->renderStyle()) : false;
    1072     bool hasDirectAdjacentRules = currentStyle && currentStyle->childrenAffectedByDirectAdjacentRules();
    10731072    bool hasIndirectAdjacentRules = currentStyle && currentStyle->childrenAffectedByForwardPositionalRules();
    10741073
     
    11121111            if (currentStyle->childrenAffectedByLastChildRules())
    11131112                newStyle->setChildrenAffectedByLastChildRules();
    1114             if (currentStyle->childrenAffectedByDirectAdjacentRules())
    1115                 newStyle->setChildrenAffectedByDirectAdjacentRules();
     1113            if (currentStyle->affectedByDirectAdjacentRules())
     1114                newStyle->setAffectedByDirectAdjacentRules();
    11161115        }
    11171116
     
    11431142    // For now we will just worry about the common case, since it's a lot trickier to get the second case right
    11441143    // without doing way too much re-resolution.
    1145     bool forceCheckOfNextElementSibling = false;
     1144    bool previousSiblingHadDirectAdjacentRules = false;
    11461145    bool forceCheckOfAnyElementSibling = false;
    11471146    for (Node *n = firstChild(); n; n = n->nextSibling()) {
     
    11551154        Element* element = static_cast<Element*>(n);
    11561155        bool childRulesChanged = element->needsStyleRecalc() && element->styleChangeType() == FullStyleChange;
    1157         if ((forceCheckOfNextElementSibling || forceCheckOfAnyElementSibling))
     1156        bool childAffectedByDirectAdjacentRules = element->renderStyle() ? element->renderStyle()->affectedByDirectAdjacentRules() : previousSiblingHadDirectAdjacentRules;
     1157        if (childAffectedByDirectAdjacentRules || forceCheckOfAnyElementSibling)
    11581158            element->setNeedsStyleRecalc();
    11591159        if (change >= Inherit || element->childNeedsStyleRecalc() || element->needsStyleRecalc()) {
     
    11611161            element->recalcStyle(change);
    11621162        }
    1163         forceCheckOfNextElementSibling = childRulesChanged && hasDirectAdjacentRules;
     1163        previousSiblingHadDirectAdjacentRules = childAffectedByDirectAdjacentRules;
    11641164        forceCheckOfAnyElementSibling = forceCheckOfAnyElementSibling || (childRulesChanged && hasIndirectAdjacentRules);
    11651165    }
     
    13481348    }
    13491349
    1350     // The + selector.  We need to invalidate the first element following the insertion point.  It is the only possible element
    1351     // that could be affected by this DOM change.
    1352     if (style->childrenAffectedByDirectAdjacentRules() && afterChange) {
    1353         Node* firstElementAfterInsertion = 0;
    1354         for (firstElementAfterInsertion = afterChange;
    1355              firstElementAfterInsertion && !firstElementAfterInsertion->isElementNode();
    1356              firstElementAfterInsertion = firstElementAfterInsertion->nextSibling()) {};
    1357         if (firstElementAfterInsertion && firstElementAfterInsertion->attached())
    1358             firstElementAfterInsertion->setNeedsStyleRecalc();
    1359     }
    1360 
    13611350    // Forward positional selectors include the ~ selector, nth-child, nth-of-type, first-of-type and only-of-type.
    13621351    // Backward positional selectors include nth-last-child, nth-last-of-type, last-of-type and only-of-type.
  • trunk/Source/WebCore/rendering/style/RenderStyle.cpp

    r92871 r94887  
    7878    , m_childrenAffectedByFirstChildRules(false)
    7979    , m_childrenAffectedByLastChildRules(false)
    80     , m_childrenAffectedByDirectAdjacentRules(false)
    8180    , m_childrenAffectedByForwardPositionalRules(false)
    8281    , m_childrenAffectedByBackwardPositionalRules(false)
    8382    , m_firstChildState(false)
    8483    , m_lastChildState(false)
     84    , m_affectedByDirectAdjacentRules(false)
    8585    , m_childIndex(0)
    8686    , m_box(defaultStyle()->m_box)
     
    105105    , m_childrenAffectedByFirstChildRules(false)
    106106    , m_childrenAffectedByLastChildRules(false)
    107     , m_childrenAffectedByDirectAdjacentRules(false)
    108107    , m_childrenAffectedByForwardPositionalRules(false)
    109108    , m_childrenAffectedByBackwardPositionalRules(false)
    110109    , m_firstChildState(false)
    111110    , m_lastChildState(false)
     111    , m_affectedByDirectAdjacentRules(false)
    112112    , m_childIndex(0)
    113113{
     
    142142    , m_childrenAffectedByFirstChildRules(false)
    143143    , m_childrenAffectedByLastChildRules(false)
    144     , m_childrenAffectedByDirectAdjacentRules(false)
    145144    , m_childrenAffectedByForwardPositionalRules(false)
    146145    , m_childrenAffectedByBackwardPositionalRules(false)
    147146    , m_firstChildState(false)
    148147    , m_lastChildState(false)
     148    , m_affectedByDirectAdjacentRules(false)
    149149    , m_childIndex(0)
    150150    , m_box(o.m_box)
  • trunk/Source/WebCore/rendering/style/RenderStyle.h

    r94710 r94887  
    133133    bool m_childrenAffectedByFirstChildRules : 1;
    134134    bool m_childrenAffectedByLastChildRules : 1;
    135     bool m_childrenAffectedByDirectAdjacentRules : 1;
    136135    bool m_childrenAffectedByForwardPositionalRules : 1;
    137136    bool m_childrenAffectedByBackwardPositionalRules : 1;
    138137    bool m_firstChildState : 1;
    139138    bool m_lastChildState : 1;
     139    bool m_affectedByDirectAdjacentRules : 1;
    140140    unsigned m_childIndex : 21; // Plenty of bits to cache an index.
    141141
     
    12631263    void setAffectedByAttributeSelectors() { m_affectedByAttributeSelectors = true; }
    12641264
     1265    bool affectedByDirectAdjacentRules() const { return m_affectedByDirectAdjacentRules; }
     1266    void setAffectedByDirectAdjacentRules() { m_affectedByDirectAdjacentRules = true; }
     1267
    12651268    bool unique() const { return m_unique; }
    12661269    void setUnique() { m_unique = true; }
     
    12751278    bool childrenAffectedByLastChildRules() const { return m_childrenAffectedByLastChildRules; }
    12761279    void setChildrenAffectedByLastChildRules() { m_childrenAffectedByLastChildRules = true; }
    1277     bool childrenAffectedByDirectAdjacentRules() const { return m_childrenAffectedByDirectAdjacentRules; }
    1278     void setChildrenAffectedByDirectAdjacentRules() { m_childrenAffectedByDirectAdjacentRules = true; }
    12791280    bool childrenAffectedByForwardPositionalRules() const { return m_childrenAffectedByForwardPositionalRules; }
    12801281    void setChildrenAffectedByForwardPositionalRules() { m_childrenAffectedByForwardPositionalRules = true; }
Note: See TracChangeset for help on using the changeset viewer.