[webkit-reviews] review granted: [Bug 229666] [CSS Cascade Layers] Computer order correctly for late added sublayers : [Attachment 436764] patch

bugzilla-daemon at webkit.org bugzilla-daemon at webkit.org
Mon Aug 30 08:46:27 PDT 2021


Simon Fraser (smfr) <simon.fraser at apple.com> has granted Antti Koivisto
<koivisto at iki.fi>'s request for review:
Bug 229666: [CSS Cascade Layers] Computer order correctly for late added
sublayers
https://bugs.webkit.org/show_bug.cgi?id=229666

Attachment 436764: patch

https://bugs.webkit.org/attachment.cgi?id=436764&action=review




--- Comment #3 from Simon Fraser (smfr) <simon.fraser at apple.com> ---
Comment on attachment 436764
  --> https://bugs.webkit.org/attachment.cgi?id=436764
patch

View in context: https://bugs.webkit.org/attachment.cgi?id=436764&action=review

> Source/WebCore/ChangeLog:3
> +	   [CSS Cascade Layers] Computer order correctly for late added
sublayers

Compute order

> Source/WebCore/style/RuleSet.cpp:86
> +void RuleSet::addRule(const StyleRule& rule, unsigned selectorIndex,
unsigned selectorListIndex, unsigned cascadeLayerIdentifier,
MediaQueryCollector* mediaQueryCollector)

unsigned -> CascadeLayerIdentifier ?

> Source/WebCore/style/RuleSet.cpp:93
> +	   std::fill(m_cascadeLayerIdentifierForRulePosition.begin() + oldSize,
m_cascadeLayerIdentifierForRulePosition.end(), 0);

Shame they don't init to 0 automatically

> Source/WebCore/style/RuleSet.cpp:405
> +	   CascadeLayerIdentifier identifier = 0;

Oh there is a typedef! Perhaps it should be a type which can initialize itself
to 0.

> Source/WebCore/style/RuleSet.cpp:470
> +    auto compareCascadeLayers = [&](CascadeLayerIdentifier a,
CascadeLayerIdentifier b) {
> +	   while (a && b) {
> +	       // Identifiers are in parse order which almost corresponds to
the layer priority order.
> +	       // The only exception is when a sublayer gets added to a layer
after adding other non-sublayers.
> +	       // To resolve this we need look for a shared ancestor layer.
> +	       auto aParent =
ruleSet->cascadeLayerForIdentifier(a).parentIdentifier;
> +	       auto bParent =
ruleSet->cascadeLayerForIdentifier(b).parentIdentifier;
> +	       if (aParent == bParent || aParent == b || bParent == a)
> +		   break;
> +	       if (aParent > bParent)
> +		   a = aParent;
> +	       else
> +		   b = bParent;
> +	   }
> +	   return a < b;
> +    };
> +
> +    auto updateCascadeLayerOrder = [&] {
> +	   Vector<CascadeLayerIdentifier> orderVector;
> +	   for (CascadeLayerIdentifier identifier = 1; identifier <=
ruleSet->m_cascadeLayers.size(); ++identifier)
> +	       orderVector.append(identifier);
> +	   std::sort(orderVector.begin(), orderVector.end(),
compareCascadeLayers);
> +	   for (unsigned i = 0; i < orderVector.size(); ++i)
> +	       ruleSet->cascadeLayerForIdentifier(orderVector[i]).order = i +
1;
> +    };
> +
> +    if (mode == Mode::Normal && !ruleSet->m_cascadeLayers.isEmpty())
> +	   updateCascadeLayerOrder();

Maybe put this in its own function

> Source/WebCore/style/RuleSet.h:193
> +    CascadeLayer& cascadeLayerForIdentifier(CascadeLayerIdentifier
identifier) { return m_cascadeLayers[identifier - 1]; }
> +    const CascadeLayer& cascadeLayerForIdentifier(CascadeLayerIdentifier
identifier) const { return m_cascadeLayers[identifier - 1]; }

Maybe assert that identifier != 0


More information about the webkit-reviews mailing list