Resolve style iteratively
[WebKit-https.git] / Source / WebCore / style / StyleTreeResolver.h
1 /*
2  * Copyright (C) 2013 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. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef StyleTreeResolver_h
27 #define StyleTreeResolver_h
28
29 #include "RenderStyleConstants.h"
30 #include "RenderTreePosition.h"
31 #include "SelectorFilter.h"
32 #include "StyleChange.h"
33 #include "StyleSharingResolver.h"
34 #include <functional>
35 #include <wtf/RefPtr.h>
36
37 namespace WebCore {
38
39 class ContainerNode;
40 class Document;
41 class Element;
42 class HTMLSlotElement;
43 class Node;
44 class RenderStyle;
45 class Settings;
46 class ShadowRoot;
47 class StyleResolver;
48 class Text;
49
50 namespace Style {
51
52 class TreeResolver {
53 public:
54     TreeResolver(Document&);
55
56     void resolve(Change);
57
58 private:
59     Ref<RenderStyle> styleForElement(Element&, RenderStyle& inheritedStyle);
60
61     void resolveComposedTree();
62     Change resolveElement(Element&);
63     void resolveBeforeOrAfterPseudoElement(Element&, Change, PseudoId, RenderTreePosition&);
64
65     void createRenderTreeRecursively(Element&, RenderStyle&, RenderTreePosition&, RefPtr<RenderStyle>&& resolvedStyle);
66     void createRenderer(Element&, RenderTreePosition&, RefPtr<RenderStyle>&& resolvedStyle);
67     void createRenderTreeForBeforeOrAfterPseudoElement(Element&, PseudoId, RenderTreePosition&);
68     void createRenderTreeForChildren(ContainerNode&, RenderStyle&, RenderTreePosition&);
69     void createRenderTreeForShadowRoot(ShadowRoot&);
70
71 #if ENABLE(SHADOW_DOM) || ENABLE(DETAILS_ELEMENT)
72     void createRenderTreeForSlotAssignees(HTMLSlotElement&, RenderStyle& inheritedStyle, RenderTreePosition&);
73 #endif
74
75     struct Scope : RefCounted<Scope> {
76         StyleResolver& styleResolver;
77         SelectorFilter selectorFilter;
78         SharingResolver sharingResolver;
79         ShadowRoot* shadowRoot { nullptr };
80         Scope* enclosingScope { nullptr };
81
82         Scope(Document&);
83         Scope(ShadowRoot&, Scope& enclosingScope);
84     };
85
86     struct Parent {
87         Element* element;
88         Ref<RenderStyle> style;
89         RenderTreePosition renderTreePosition;
90         Change change;
91         bool didPushScope { false };
92         bool elementNeedingStyleRecalcAffectsNextSiblingElementStyle { false };
93
94         Parent(Document&, Change);
95         Parent(Element&, RenderStyle&, RenderTreePosition, Change);
96     };
97
98     Scope& scope() { return m_scopeStack.last(); }
99     Parent& parent() { return m_parentStack.last(); }
100
101     void pushScope(ShadowRoot&);
102     void pushEnclosingScope();
103     void popScope();
104
105     void pushParent(Element&, RenderStyle&, RenderTreePosition, Change);
106     void popParent();
107     void popParentsToDepth(unsigned depth);
108
109     Document& m_document;
110     Vector<Ref<Scope>, 4> m_scopeStack;
111     Vector<Parent, 32> m_parentStack;
112 };
113
114 void detachRenderTree(Element&);
115 void detachTextRenderer(Text&);
116
117 void updateTextRendererAfterContentChange(Text&, unsigned offsetOfReplacedData, unsigned lengthOfReplacedData);
118
119 void queuePostResolutionCallback(std::function<void ()>);
120 bool postResolutionCallbacksAreSuspended();
121
122 bool isPlaceholderStyle(const RenderStyle&);
123
124 class PostResolutionCallbackDisabler {
125 public:
126     explicit PostResolutionCallbackDisabler(Document&);
127     ~PostResolutionCallbackDisabler();
128 };
129
130 }
131
132 }
133
134 #endif