Support ::before/::after pseudo elements on elements with display:contents
[WebKit-https.git] / Source / WebCore / style / StyleTreeResolver.h
1 /*
2  * Copyright (C) 2013-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. ``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 #pragma once
27
28 #include "SelectorChecker.h"
29 #include "SelectorFilter.h"
30 #include "StyleChange.h"
31 #include "StyleSharingResolver.h"
32 #include "StyleUpdate.h"
33 #include <wtf/Function.h>
34 #include <wtf/Ref.h>
35
36 namespace WebCore {
37
38 class Document;
39 class Element;
40 class Node;
41 class RenderStyle;
42 class ShadowRoot;
43 class StyleResolver;
44
45 namespace Style {
46
47 class TreeResolver {
48 public:
49     TreeResolver(Document&);
50     ~TreeResolver();
51
52     std::unique_ptr<Update> resolve();
53
54 private:
55     std::unique_ptr<RenderStyle> styleForElement(Element&, const RenderStyle& inheritedStyle);
56
57     void resolveComposedTree();
58     ElementUpdates resolveElement(Element&);
59     ElementUpdate createAnimatedElementUpdate(std::unique_ptr<RenderStyle>, Element&, Change parentChange);
60     ElementUpdate resolvePseudoStyle(Element&, const ElementUpdate&, PseudoId);
61
62     struct Scope : RefCounted<Scope> {
63         StyleResolver& styleResolver;
64         SelectorFilter selectorFilter;
65         SharingResolver sharingResolver;
66         ShadowRoot* shadowRoot { nullptr };
67         Scope* enclosingScope { nullptr };
68
69         Scope(Document&);
70         Scope(ShadowRoot&, Scope& enclosingScope);
71         ~Scope();
72     };
73
74     struct Parent {
75         Element* element;
76         const RenderStyle& style;
77         Change change { NoChange };
78         bool didPushScope { false };
79         bool elementNeedingStyleRecalcAffectsNextSiblingElementStyle { false };
80
81         Parent(Document&);
82         Parent(Element&, const RenderStyle&, Change);
83     };
84
85     Scope& scope() { return m_scopeStack.last(); }
86     Parent& parent() { return m_parentStack.last(); }
87
88     void pushScope(ShadowRoot&);
89     void pushEnclosingScope();
90     void popScope();
91
92     void pushParent(Element&, const RenderStyle&, Change);
93     void popParent();
94     void popParentsToDepth(unsigned depth);
95
96     const RenderStyle* parentBoxStyle() const;
97
98     Document& m_document;
99     std::unique_ptr<RenderStyle> m_documentElementStyle;
100
101     Vector<Ref<Scope>, 4> m_scopeStack;
102     Vector<Parent, 32> m_parentStack;
103     bool m_didSeePendingStylesheet { false };
104
105     std::unique_ptr<Update> m_update;
106 };
107
108 void queuePostResolutionCallback(Function<void ()>&&);
109 bool postResolutionCallbacksAreSuspended();
110
111 class PostResolutionCallbackDisabler {
112 public:
113     explicit PostResolutionCallbackDisabler(Document&);
114     ~PostResolutionCallbackDisabler();
115 };
116
117 }
118
119 }