Changeset 293725 in webkit


Ignore:
Timestamp:
May 3, 2022 8:45:26 AM (3 months ago)
Author:
Antti Koivisto
Message:

[CSS Cascade Layers] Endless recursion with revert-layer in other tree context
https://bugs.webkit.org/show_bug.cgi?id=239967
<rdar://92449950>

Reviewed by Alan Bujtas.

Source/WebCore:

We should only revert within a tree context (scope).

Adding more comprehensive WPTs separately.

Test: fast/css/revert-layer-tree-context-stack-overflow.html

  • style/PropertyCascade.cpp:

(WebCore::Style::PropertyCascade::PropertyCascade):

Pass the property tree scope to the rollback cascade.

(WebCore::Style::PropertyCascade::addMatch):

Don't include properties from lower priority tree scopes to rollback cascade.
Reverse the logic for clarity.

  • style/PropertyCascade.h:

(WebCore::Style::PropertyCascade::PropertyCascade):

  • style/StyleBuilder.cpp:

(WebCore::Style::Builder::ensureRollbackCascadeForRevert):
(WebCore::Style::Builder::ensureRollbackCascadeForRevertLayer):
(WebCore::Style::Builder::makeRollbackCascadeKey):

Include tree scope to the key.

  • style/StyleBuilder.h:

LayoutTests:

  • fast/css/revert-layer-tree-context-stack-overflow-expected.html: Added.
  • fast/css/revert-layer-tree-context-stack-overflow.html: Added.
Location:
trunk
Files:
2 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r293723 r293725  
     12022-05-03  Antti Koivisto  <antti@apple.com>
     2
     3        [CSS Cascade Layers] Endless recursion with revert-layer in other tree context
     4        https://bugs.webkit.org/show_bug.cgi?id=239967
     5        <rdar://92449950>
     6
     7        Reviewed by Alan Bujtas.
     8
     9        * fast/css/revert-layer-tree-context-stack-overflow-expected.html: Added.
     10        * fast/css/revert-layer-tree-context-stack-overflow.html: Added.
     11
    1122022-05-03  Kimmo Kinnunen  <kkinnunen@apple.com>
    213
  • trunk/Source/WebCore/ChangeLog

    r293719 r293725  
     12022-05-03  Antti Koivisto  <antti@apple.com>
     2
     3        [CSS Cascade Layers] Endless recursion with revert-layer in other tree context
     4        https://bugs.webkit.org/show_bug.cgi?id=239967
     5        <rdar://92449950>
     6
     7        Reviewed by Alan Bujtas.
     8
     9        We should only revert within a tree context (scope).
     10
     11        Adding more comprehensive WPTs separately.
     12
     13        Test: fast/css/revert-layer-tree-context-stack-overflow.html
     14
     15        * style/PropertyCascade.cpp:
     16        (WebCore::Style::PropertyCascade::PropertyCascade):
     17
     18        Pass the property tree scope to the rollback cascade.
     19
     20        (WebCore::Style::PropertyCascade::addMatch):
     21
     22        Don't include properties from lower priority tree scopes to rollback cascade.
     23        Reverse the logic for clarity.
     24
     25        * style/PropertyCascade.h:
     26        (WebCore::Style::PropertyCascade::PropertyCascade):
     27        * style/StyleBuilder.cpp:
     28        (WebCore::Style::Builder::ensureRollbackCascadeForRevert):
     29        (WebCore::Style::Builder::ensureRollbackCascadeForRevertLayer):
     30        (WebCore::Style::Builder::makeRollbackCascadeKey):
     31
     32        Include tree scope to the key.
     33
     34        * style/StyleBuilder.h:
     35
    1362022-05-03  Youenn Fablet  <youenn@apple.com>
    237
  • trunk/Source/WebCore/style/PropertyCascade.cpp

    r293543 r293725  
    4747}
    4848
    49 PropertyCascade::PropertyCascade(const PropertyCascade& parent, CascadeLevel maximumCascadeLevel, std::optional<CascadeLayerPriority> maximumCascadeLayerPriorityForRollback)
     49PropertyCascade::PropertyCascade(const PropertyCascade& parent, CascadeLevel maximumCascadeLevel, std::optional<ScopeOrdinal> rollbackScope, std::optional<CascadeLayerPriority> maximumCascadeLayerPriorityForRollback)
    5050    : m_matchResult(parent.m_matchResult)
    5151    , m_includedProperties(parent.m_includedProperties)
    5252    , m_maximumCascadeLevel(maximumCascadeLevel)
     53    , m_rollbackScope(rollbackScope)
    5354    , m_maximumCascadeLayerPriorityForRollback(maximumCascadeLayerPriorityForRollback)
    5455{
     
    173174bool PropertyCascade::addMatch(const MatchedProperties& matchedProperties, CascadeLevel cascadeLevel, bool important)
    174175{
    175     auto skipForRollback = [&] {
    176         if (!m_maximumCascadeLayerPriorityForRollback)
     176    auto includePropertiesForRollback = [&] {
     177        if (m_rollbackScope && matchedProperties.styleScopeOrdinal > *m_rollbackScope)
     178            return true;
     179        if (cascadeLevel < m_maximumCascadeLevel)
     180            return true;
     181        if (matchedProperties.fromStyleAttribute == FromStyleAttribute::Yes)
    177182            return false;
    178         if (matchedProperties.styleScopeOrdinal != ScopeOrdinal::Element)
    179             return false;
    180         if (cascadeLevel < m_maximumCascadeLevel)
    181             return false;
    182         if (matchedProperties.fromStyleAttribute == FromStyleAttribute::Yes)
    183             return true;
    184         return matchedProperties.cascadeLayerPriority > *m_maximumCascadeLayerPriorityForRollback;
     183        return matchedProperties.cascadeLayerPriority <= *m_maximumCascadeLayerPriorityForRollback;
    185184    };
    186     if (skipForRollback())
     185    if (m_maximumCascadeLayerPriorityForRollback && !includePropertiesForRollback())
    187186        return false;
    188187
  • trunk/Source/WebCore/style/PropertyCascade.h

    r293622 r293725  
    4242
    4343    PropertyCascade(const MatchResult&, CascadeLevel, IncludedProperties);
    44     PropertyCascade(const PropertyCascade&, CascadeLevel, std::optional<CascadeLayerPriority> maximumCascadeLayerPriorityForRollback = { });
     44    PropertyCascade(const PropertyCascade&, CascadeLevel, std::optional<ScopeOrdinal> rollbackScope = { }, std::optional<CascadeLayerPriority> maximumCascadeLayerPriorityForRollback = { });
    4545
    4646    ~PropertyCascade();
     
    8686    const IncludedProperties m_includedProperties;
    8787    const CascadeLevel m_maximumCascadeLevel;
     88    const std::optional<ScopeOrdinal> m_rollbackScope;
    8889    const std::optional<CascadeLayerPriority> m_maximumCascadeLayerPriorityForRollback;
    8990
  • trunk/Source/WebCore/style/StyleBuilder.cpp

    r293563 r293725  
    389389    --rollbackCascadeLevel;
    390390
    391     auto key = makeRollbackCascadeKey(rollbackCascadeLevel, 0);
     391    auto key = makeRollbackCascadeKey(rollbackCascadeLevel);
    392392    return m_rollbackCascades.ensure(key, [&] {
    393393        return makeUnique<const PropertyCascade>(m_cascade, rollbackCascadeLevel);
     
    408408        --rollbackLayerPriority;
    409409
    410     auto key = makeRollbackCascadeKey(property.cascadeLevel, rollbackLayerPriority);
     410    auto key = makeRollbackCascadeKey(property.cascadeLevel, property.styleScopeOrdinal, rollbackLayerPriority);
    411411    return m_rollbackCascades.ensure(key, [&] {
    412         return makeUnique<const PropertyCascade>(m_cascade, property.cascadeLevel, rollbackLayerPriority);
     412        return makeUnique<const PropertyCascade>(m_cascade, property.cascadeLevel, property.styleScopeOrdinal, rollbackLayerPriority);
    413413    }).iterator->value.get();
    414414}
    415415
    416 auto Builder::makeRollbackCascadeKey(CascadeLevel cascadeLevel, CascadeLayerPriority cascadeLayerPriority) -> RollbackCascadeKey
    417 {
    418     return { static_cast<unsigned>(cascadeLevel), static_cast<unsigned>(cascadeLayerPriority) };
    419 }
    420 
    421 }
    422 }
     416auto Builder::makeRollbackCascadeKey(CascadeLevel cascadeLevel, ScopeOrdinal scopeOrdinal, CascadeLayerPriority cascadeLayerPriority) -> RollbackCascadeKey
     417{
     418    return { static_cast<unsigned>(cascadeLevel), static_cast<unsigned>(scopeOrdinal), static_cast<unsigned>(cascadeLayerPriority) };
     419}
     420
     421}
     422}
  • trunk/Source/WebCore/style/StyleBuilder.h

    r293563 r293725  
    6666    const PropertyCascade* ensureRollbackCascadeForRevertLayer();
    6767
    68     using RollbackCascadeKey = std::pair<unsigned, unsigned>;
    69     RollbackCascadeKey makeRollbackCascadeKey(CascadeLevel, CascadeLayerPriority);
     68    using RollbackCascadeKey = std::tuple<unsigned, unsigned, unsigned>;
     69    RollbackCascadeKey makeRollbackCascadeKey(CascadeLevel, ScopeOrdinal = ScopeOrdinal::Element, CascadeLayerPriority = 0);
    7070
    7171    const PropertyCascade m_cascade;
Note: See TracChangeset for help on using the changeset viewer.