Separate render tree updating from style resolve
[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 "SelectorChecker.h"
32 #include "SelectorFilter.h"
33 #include "StyleChange.h"
34 #include "StyleSharingResolver.h"
35 #include "StyleUpdate.h"
36 #include <functional>
37 #include <wtf/HashMap.h>
38 #include <wtf/RefPtr.h>
39
40 namespace WebCore {
41
42 class ContainerNode;
43 class Document;
44 class Element;
45 class HTMLSlotElement;
46 class Node;
47 class RenderStyle;
48 class Settings;
49 class ShadowRoot;
50 class StyleResolver;
51 class Text;
52 class TreeChange;
53
54 namespace Style {
55
56 class TreeResolver {
57 public:
58     TreeResolver(Document&);
59     ~TreeResolver();
60
61     std::unique_ptr<const Update> resolve(Change);
62
63 private:
64     Ref<RenderStyle> styleForElement(Element&, RenderStyle& inheritedStyle);
65
66     void resolveComposedTree();
67     ElementUpdate resolveElement(Element&);
68
69     struct Scope : RefCounted<Scope> {
70         StyleResolver& styleResolver;
71         SelectorFilter selectorFilter;
72         SharingResolver sharingResolver;
73         ShadowRoot* shadowRoot { nullptr };
74         Scope* enclosingScope { nullptr };
75
76         Scope(Document&);
77         Scope(ShadowRoot&, Scope& enclosingScope);
78     };
79
80     struct Parent {
81         Element* element;
82         Ref<RenderStyle> style;
83         Change change;
84         bool didPushScope { false };
85         bool elementNeedingStyleRecalcAffectsNextSiblingElementStyle { false };
86
87         Parent(Document&, Change);
88         Parent(Element&, ElementUpdate&);
89     };
90
91     Scope& scope() { return m_scopeStack.last(); }
92     Parent& parent() { return m_parentStack.last(); }
93
94     void pushScope(ShadowRoot&);
95     void pushEnclosingScope();
96     void popScope();
97
98     void pushParent(Element&, ElementUpdate&);
99     void popParent();
100     void popParentsToDepth(unsigned depth);
101
102     Document& m_document;
103     RefPtr<RenderStyle> m_documentElementStyle;
104
105     Vector<Ref<Scope>, 4> m_scopeStack;
106     Vector<Parent, 32> m_parentStack;
107
108     std::unique_ptr<Update> m_update;
109 };
110
111 enum DetachType { NormalDetach, ReattachDetach };
112 void detachRenderTree(Element&, DetachType = NormalDetach);
113 void detachTextRenderer(Text&);
114
115 void updateTextRendererAfterContentChange(Text&, unsigned offsetOfReplacedData, unsigned lengthOfReplacedData);
116
117 void queuePostResolutionCallback(std::function<void ()>);
118 bool postResolutionCallbacksAreSuspended();
119
120 bool isPlaceholderStyle(const RenderStyle&);
121
122 class PostResolutionCallbackDisabler {
123 public:
124     explicit PostResolutionCallbackDisabler(Document&);
125     ~PostResolutionCallbackDisabler();
126 };
127
128 }
129
130 }
131
132 #endif