[Webkit-unassigned] [Bug 229666] [CSS Cascade Layers] Computer order correctly for late added sublayers
bugzilla-daemon at webkit.org
bugzilla-daemon at webkit.org
Mon Aug 30 08:46:27 PDT 2021
https://bugs.webkit.org/show_bug.cgi?id=229666
Simon Fraser (smfr) <simon.fraser at apple.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
Attachment #436764|review? |review+
Flags| |
--- 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
--
You are receiving this mail because:
You are the assignee for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.webkit.org/pipermail/webkit-unassigned/attachments/20210830/6a6ecbe7/attachment.htm>
More information about the webkit-unassigned
mailing list