9b6b1c9235a0b229c4f8aff19441cbad38602e3c
[WebKit-https.git] / Source / WebCore / dom / ShadowRoot.h
1 /*
2  * Copyright (C) 2011 Google 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 are
6  * met:
7  *
8  *     * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *     * Neither the name of Google Inc. nor the names of its
11  * contributors may be used to endorse or promote products derived from
12  * this software without specific prior written permission.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
15  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
16  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
17  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
18  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
19  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
20  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #ifndef ShadowRoot_h
28 #define ShadowRoot_h
29
30 #include "ContainerNode.h"
31 #include "Document.h"
32 #include "DocumentFragment.h"
33 #include "Element.h"
34 #include "ExceptionCode.h"
35 #include "TreeScope.h"
36
37 namespace WebCore {
38
39 class AuthorStyleSheets;
40 class ContentDistributor;
41 class HTMLSlotElement;
42 class SlotAssignment;
43
44 class ShadowRoot : public DocumentFragment, public TreeScope {
45 public:
46     enum class Type : uint8_t {
47         UserAgent = 0,
48         Closed,
49         Open,
50     };
51
52     static Ref<ShadowRoot> create(Document& document, Type type)
53     {
54         return adoptRef(*new ShadowRoot(document, type));
55     }
56
57 #if ENABLE(SHADOW_DOM) || ENABLE(DETAILS_ELEMENT)
58     static Ref<ShadowRoot> create(Document& document, std::unique_ptr<SlotAssignment>&& assignment)
59     {
60         return adoptRef(*new ShadowRoot(document, WTF::move(assignment)));
61     }
62 #endif
63
64     virtual ~ShadowRoot();
65
66     StyleResolver& styleResolver();
67     AuthorStyleSheets& authorStyleSheets();
68     
69     void updateStyle();
70     void resetStyleResolver();
71
72     bool resetStyleInheritance() const { return m_resetStyleInheritance; }
73     void setResetStyleInheritance(bool);
74
75     Element* host() const { return m_host; }
76     void setHost(Element* host) { m_host = host; }
77
78     String innerHTML() const;
79     void setInnerHTML(const String&, ExceptionCode&);
80
81     Element* activeElement() const;
82
83     Type type() const { return m_type; }
84
85     PassRefPtr<Node> cloneNode(bool, ExceptionCode&);
86
87     virtual void removeAllEventListeners() override;
88
89     virtual ContentDistributor* distributor() { return nullptr; }
90
91 #if ENABLE(SHADOW_DOM) || ENABLE(DETAILS_ELEMENT)
92     HTMLSlotElement* findAssignedSlot(const Node&);
93
94     void addSlotElementByName(const AtomicString&, HTMLSlotElement&);
95     void removeSlotElementByName(const AtomicString&, HTMLSlotElement&);
96
97     void invalidateSlotAssignments();
98     void invalidateDefaultSlotAssignments();
99
100     const Vector<Node*>* assignedNodesForSlot(const HTMLSlotElement&);
101 #endif
102
103 protected:
104     ShadowRoot(Document&, Type);
105
106 #if ENABLE(SHADOW_DOM) || ENABLE(DETAILS_ELEMENT)
107     ShadowRoot(Document&, std::unique_ptr<SlotAssignment>&&);
108 #endif
109
110     // FIXME: This shouldn't happen. https://bugs.webkit.org/show_bug.cgi?id=88834
111     bool isOrphan() const { return !m_host; }
112
113 private:
114     virtual bool childTypeAllowed(NodeType) const override;
115
116     virtual Ref<Node> cloneNodeInternal(Document&, CloningOperation) override;
117
118     bool m_resetStyleInheritance { false };
119     Type m_type { Type::UserAgent };
120
121     Element* m_host { nullptr };
122
123     std::unique_ptr<StyleResolver> m_styleResolver;
124     std::unique_ptr<AuthorStyleSheets> m_authorStyleSheets;
125
126 #if ENABLE(SHADOW_DOM) || ENABLE(DETAILS_ELEMENT)
127     std::unique_ptr<SlotAssignment> m_slotAssignment;
128 #endif
129 };
130
131 inline Element* ShadowRoot::activeElement() const
132 {
133     return treeScope().focusedElement();
134 }
135
136 inline ShadowRoot* Node::shadowRoot() const
137 {
138     if (!is<Element>(*this))
139         return nullptr;
140     return downcast<Element>(*this).shadowRoot();
141 }
142
143 inline ContainerNode* Node::parentOrShadowHostNode() const
144 {
145     ASSERT(isMainThreadOrGCThread());
146     if (is<ShadowRoot>(*this))
147         return downcast<ShadowRoot>(*this).host();
148     return parentNode();
149 }
150
151 inline bool hasShadowRootParent(const Node& node)
152 {
153     return node.parentNode() && node.parentNode()->isShadowRoot();
154 }
155
156 } // namespace WebCore
157
158 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::ShadowRoot)
159     static bool isType(const WebCore::Node& node) { return node.isShadowRoot(); }
160 SPECIALIZE_TYPE_TRAITS_END()
161
162 #endif