5aa560f93870cf0c7bd1059fa167d61c5c49e4d0
[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 "SelectorFilter.h"
31 #include "StyleChange.h"
32 #include "StyleSharingResolver.h"
33 #include <functional>
34 #include <wtf/RefPtr.h>
35
36 namespace WebCore {
37
38 class ContainerNode;
39 class Document;
40 class Element;
41 class HTMLSlotElement;
42 class Node;
43 class RenderStyle;
44 class RenderTreePosition;
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     void resolveShadowTree(Change, RenderStyle& inheritedStyle);
60
61     Ref<RenderStyle> styleForElement(Element&, RenderStyle& inheritedStyle);
62
63     void resolveRecursively(Element&, RenderStyle& inheritedStyle, RenderTreePosition&, Change);
64     Change resolveLocally(Element&, RenderStyle& inheritedStyle, RenderTreePosition&, Change inheritedChange);
65     void resolveChildren(Element&, RenderStyle&, Change, RenderTreePosition&);
66     void resolveChildAtShadowBoundary(Node&, RenderStyle& inheritedStyle, RenderTreePosition&, Change);
67     void resolveBeforeOrAfterPseudoElement(Element&, Change, PseudoId, RenderTreePosition&);
68
69     void createRenderTreeRecursively(Element&, RenderStyle&, RenderTreePosition&, RefPtr<RenderStyle>&& resolvedStyle);
70     void createRenderer(Element&, RenderTreePosition&, RefPtr<RenderStyle>&& resolvedStyle);
71     void createRenderTreeForBeforeOrAfterPseudoElement(Element&, PseudoId, RenderTreePosition&);
72     void createRenderTreeForChildren(ContainerNode&, RenderStyle&, RenderTreePosition&);
73     void createRenderTreeForShadowRoot(ShadowRoot&);
74
75 #if ENABLE(SHADOW_DOM) || ENABLE(DETAILS_ELEMENT)
76     void resolveSlotAssignees(HTMLSlotElement&, RenderStyle& inheritedStyle, RenderTreePosition&, Change);
77     void createRenderTreeForSlotAssignees(HTMLSlotElement&, RenderStyle& inheritedStyle, RenderTreePosition&);
78 #endif
79
80     struct Scope : RefCounted<Scope> {
81         StyleResolver& styleResolver;
82         SelectorFilter selectorFilter;
83         SharingResolver sharingResolver;
84         ShadowRoot* shadowRoot { nullptr };
85         Scope* enclosingScope { nullptr };
86
87         Scope(Document&);
88         Scope(ShadowRoot&, Scope& enclosingScope);
89     };
90     Scope& scope() { return m_scopeStack.last(); }
91     void pushScope(ShadowRoot&);
92     void pushEnclosingScope();
93     void popScope();
94
95     Document& m_document;
96     Vector<Ref<Scope>, 4> m_scopeStack;
97 };
98
99 void detachRenderTree(Element&);
100 void detachTextRenderer(Text&);
101
102 void updateTextRendererAfterContentChange(Text&, unsigned offsetOfReplacedData, unsigned lengthOfReplacedData);
103
104 void queuePostResolutionCallback(std::function<void ()>);
105 bool postResolutionCallbacksAreSuspended();
106
107 bool isPlaceholderStyle(const RenderStyle&);
108
109 class PostResolutionCallbackDisabler {
110 public:
111     explicit PostResolutionCallbackDisabler(Document&);
112     ~PostResolutionCallbackDisabler();
113 };
114
115 }
116
117 }
118
119 #endif