Add ChildrenAffectedByForwardPositionalRules bit for nth-child pseudo class marking
[WebKit-https.git] / Source / WebCore / style / StyleUpdate.h
1 /*
2  * Copyright (C) 2016 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #include "Node.h"
29 #include "StyleChange.h"
30 #include <wtf/HashMap.h>
31 #include <wtf/HashSet.h>
32 #include <wtf/ListHashSet.h>
33
34 namespace WebCore {
35
36 class ContainerNode;
37 class Document;
38 class Element;
39 class Node;
40 class RenderStyle;
41 class Text;
42
43 namespace Style {
44
45 struct ElementUpdate {
46 #if !COMPILER_SUPPORTS(NSDMI_FOR_AGGREGATES)
47     ElementUpdate() = default;
48     ElementUpdate(std::unique_ptr<RenderStyle> style, Change change, bool recompositeLayer)
49         : style { WTFMove(style) }
50         , change { change }
51         , recompositeLayer { recompositeLayer }
52     {
53     }
54 #endif
55     std::unique_ptr<RenderStyle> style;
56     Change change { NoChange };
57     bool recompositeLayer { false };
58 };
59
60 enum class DescendantsToResolve { None, ChildrenWithExplicitInherit, Children, All };
61
62 struct ElementUpdates {
63 #if !COMPILER_SUPPORTS(NSDMI_FOR_AGGREGATES)
64     ElementUpdates() = default;
65     ElementUpdates(ElementUpdate update, DescendantsToResolve descendantsToResolve, std::optional<ElementUpdate> beforePseudoElementUpdate, std::optional<ElementUpdate> afterPseudoElementUpdate)
66         : update { WTFMove(update) }
67         , descendantsToResolve(descendantsToResolve)
68         , beforePseudoElementUpdate { WTFMove(beforePseudoElementUpdate) }
69         , afterPseudoElementUpdate { WTFMove(afterPseudoElementUpdate) }
70     {
71     }
72 #endif
73     ElementUpdate update;
74     DescendantsToResolve descendantsToResolve { DescendantsToResolve::None };
75     std::optional<ElementUpdate> beforePseudoElementUpdate;
76     std::optional<ElementUpdate> afterPseudoElementUpdate;
77 };
78
79 struct TextUpdate {
80 #if !COMPILER_SUPPORTS(NSDMI_FOR_AGGREGATES)
81     TextUpdate() = default;
82     TextUpdate(unsigned offset, unsigned length, std::optional<std::unique_ptr<RenderStyle>> inheritedDisplayContentsStyle)
83         : offset { offset }
84         , length { length }
85         , inheritedDisplayContentsStyle { WTFMove(inheritedDisplayContentsStyle) }
86     {
87     }
88 #endif
89
90     unsigned offset { 0 };
91     unsigned length { std::numeric_limits<unsigned>::max() };
92     std::optional<std::unique_ptr<RenderStyle>> inheritedDisplayContentsStyle;
93 };
94
95 class Update {
96     WTF_MAKE_FAST_ALLOCATED;
97 public:
98     Update(Document&);
99
100     const ListHashSet<ContainerNode*>& roots() const { return m_roots; }
101
102     const ElementUpdates* elementUpdates(const Element&) const;
103     ElementUpdates* elementUpdates(const Element&);
104
105     const TextUpdate* textUpdate(const Text&) const;
106
107     const RenderStyle* elementStyle(const Element&) const;
108     RenderStyle* elementStyle(const Element&);
109
110     const Document& document() const { return m_document; }
111
112     unsigned size() const { return m_elements.size() + m_texts.size(); }
113
114     void addElement(Element&, Element* parent, ElementUpdates&&);
115     void addText(Text&, Element* parent, TextUpdate&&);
116     void addText(Text&, TextUpdate&&);
117
118 private:
119     void addPossibleRoot(Element*);
120
121     Document& m_document;
122     ListHashSet<ContainerNode*> m_roots;
123     HashMap<const Element*, ElementUpdates> m_elements;
124     HashMap<const Text*, TextUpdate> m_texts;
125 };
126
127 }
128 }