Пример #1
0
void StyleInvalidator::scheduleInvalidationSetsForElement(const InvalidationLists& invalidationLists, Element& element)
{
    ASSERT(element.inActiveDocument());
    bool requiresDescendantInvalidation = false;

    if (element.styleChangeType() < SubtreeStyleChange) {
        for (auto& invalidationSet : invalidationLists.descendants) {
            if (invalidationSet->wholeSubtreeInvalid()) {
                element.setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTracing::create(StyleChangeReason::StyleInvalidator));
                requiresDescendantInvalidation = false;
                break;
            }

            if (invalidationSet->invalidatesSelf())
                element.setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTracing::create(StyleChangeReason::StyleInvalidator));

            if (!invalidationSet->isEmpty())
                requiresDescendantInvalidation = true;
        }
    }

    if (!requiresDescendantInvalidation && (invalidationLists.siblings.isEmpty() || !element.nextSibling()))
        return;

    element.setNeedsStyleInvalidation();

    PendingInvalidations& pendingInvalidations = ensurePendingInvalidations(element);
    if (element.nextSibling()) {
        for (auto& invalidationSet : invalidationLists.siblings) {
            if (pendingInvalidations.siblings().contains(invalidationSet))
                continue;
            pendingInvalidations.siblings().append(invalidationSet);
        }
    }

    if (!requiresDescendantInvalidation)
        return;

    for (auto& invalidationSet : invalidationLists.descendants) {
        ASSERT(!invalidationSet->wholeSubtreeInvalid());
        if (invalidationSet->isEmpty())
            continue;
        if (pendingInvalidations.descendants().contains(invalidationSet))
            continue;
        pendingInvalidations.descendants().append(invalidationSet);
    }
}
void StyleInvalidator::scheduleSiblingInvalidationsAsDescendants(const InvalidationLists& invalidationLists, ContainerNode& schedulingParent)
{
    if (invalidationLists.siblings.isEmpty())
        return;

    PendingInvalidations& pendingInvalidations = ensurePendingInvalidations(schedulingParent);

    for (auto& invalidationSet : invalidationLists.siblings) {
        if (invalidationSet->invalidatesSelf() && !pendingInvalidations.descendants().contains(invalidationSet))
            pendingInvalidations.descendants().append(invalidationSet);

        if (DescendantInvalidationSet* descendants = toSiblingInvalidationSet(*invalidationSet).siblingDescendants()) {
            if (!pendingInvalidations.descendants().contains(descendants))
                pendingInvalidations.descendants().append(descendants);
        }
    }
    schedulingParent.setNeedsStyleInvalidation();
}