Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(20)

Side by Side Diff: third_party/WebKit/Source/core/dom/shadow/ShadowRoot.h

Issue 1904923002: Reduce a shadow root object's size by not inheriting DoublyLinkedList (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@raredatav0
Patch Set: fix typo Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011 Google Inc. All rights reserved. 2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Neither the name of Google Inc. nor the names of its 10 * * Neither the name of Google Inc. nor the names of its
(...skipping 15 matching lines...) Expand all
26 26
27 #ifndef ShadowRoot_h 27 #ifndef ShadowRoot_h
28 #define ShadowRoot_h 28 #define ShadowRoot_h
29 29
30 #include "core/CoreExport.h" 30 #include "core/CoreExport.h"
31 #include "core/dom/ContainerNode.h" 31 #include "core/dom/ContainerNode.h"
32 #include "core/dom/DocumentFragment.h" 32 #include "core/dom/DocumentFragment.h"
33 #include "core/dom/Element.h" 33 #include "core/dom/Element.h"
34 #include "core/dom/TreeScope.h" 34 #include "core/dom/TreeScope.h"
35 #include "core/dom/shadow/SlotAssignment.h" 35 #include "core/dom/shadow/SlotAssignment.h"
36 #include "wtf/DoublyLinkedList.h"
37 #include <iosfwd>
38 36
39 namespace blink { 37 namespace blink {
40 38
41 class Document; 39 class Document;
42 class ElementShadow; 40 class ElementShadow;
43 class ExceptionState; 41 class ExceptionState;
44 class HTMLShadowElement; 42 class HTMLShadowElement;
45 class InsertionPoint; 43 class InsertionPoint;
46 class ShadowRootRareData; 44 class ShadowRootRareData;
47 class ShadowRootRareDataV0; 45 class ShadowRootRareDataV0;
48 class StyleSheetList; 46 class StyleSheetList;
49 47
50 enum class ShadowRootType { 48 enum class ShadowRootType {
51 UserAgent, 49 UserAgent,
52 V0, 50 V0,
53 Open, 51 Open,
54 Closed 52 Closed
55 }; 53 };
56 54
57 class CORE_EXPORT ShadowRoot final : public DocumentFragment, public TreeScope, public DoublyLinkedListNode<ShadowRoot> { 55 class CORE_EXPORT ShadowRoot final : public DocumentFragment, public TreeScope {
58 DEFINE_WRAPPERTYPEINFO(); 56 DEFINE_WRAPPERTYPEINFO();
59 USING_GARBAGE_COLLECTED_MIXIN(ShadowRoot); 57 USING_GARBAGE_COLLECTED_MIXIN(ShadowRoot);
60 friend class WTF::DoublyLinkedListNode<ShadowRoot>;
61 public: 58 public:
62 // FIXME: Current implementation does not work well if a shadow root is dyna mically created. 59 // FIXME: Current implementation does not work well if a shadow root is dyna mically created.
63 // So multiple shadow subtrees in several elements are prohibited. 60 // So multiple shadow subtrees in several elements are prohibited.
64 // See https://github.com/w3c/webcomponents/issues/102 and http://crbug.com/ 234020 61 // See https://github.com/w3c/webcomponents/issues/102 and http://crbug.com/ 234020
65 static ShadowRoot* create(Document& document, ShadowRootType type) 62 static ShadowRoot* create(Document& document, ShadowRootType type)
66 { 63 {
67 return new ShadowRoot(document, type); 64 return new ShadowRoot(document, type);
68 } 65 }
69 66
70 void recalcStyle(StyleRecalcChange); 67 void recalcStyle(StyleRecalcChange);
71 68
72 // Disambiguate between Node and TreeScope hierarchies; TreeScope's implemen tation is simpler. 69 // Disambiguate between Node and TreeScope hierarchies; TreeScope's implemen tation is simpler.
73 using TreeScope::document; 70 using TreeScope::document;
74 using TreeScope::getElementById; 71 using TreeScope::getElementById;
75 72
76 // TODO(kochi): crbug.com/507413 In non-Oilpan, host() may return null durin g queued 73 // TODO(kochi): crbug.com/507413 In non-Oilpan, host() may return null durin g queued
77 // event handling (e.g. during execCommand()). 74 // event handling (e.g. during execCommand()).
78 Element* host() const { return toElement(parentOrShadowHostNode()); } 75 Element* host() const { return toElement(parentOrShadowHostNode()); }
79 ElementShadow* owner() const { return host() ? host()->shadow() : 0; } 76 ElementShadow* owner() const { return host() ? host()->shadow() : 0; }
80 77
81 ShadowRoot* youngerShadowRoot() const { return prev(); } 78 ShadowRoot* youngerShadowRoot() const;
79 ShadowRoot* olderShadowRoot() const;
80 ShadowRoot* olderShadowRootForBindings() const;
82 81
83 ShadowRoot* olderShadowRootForBindings() const; 82 void setYoungerShadowRoot(ShadowRoot&);
83 void setOlderShadowRoot(ShadowRoot&);
84 84
85 String mode() const { return (type() == ShadowRootType::V0 || type() == Shad owRootType::Open) ? "open" : "closed"; }; 85 String mode() const { return (type() == ShadowRootType::V0 || type() == Shad owRootType::Open) ? "open" : "closed"; };
86 86
87 bool isOpenOrV0() const { return type() == ShadowRootType::V0 || type() == S hadowRootType::Open; } 87 bool isOpenOrV0() const { return type() == ShadowRootType::V0 || type() == S hadowRootType::Open; }
88 88
89 bool isV1() const { return type() == ShadowRootType::Open || type() == Shado wRootType::Closed; } 89 bool isV1() const { return type() == ShadowRootType::Open || type() == Shado wRootType::Closed; }
90 90
91 bool isYoungest() const { return !youngerShadowRoot(); } 91 bool isYoungest() const { return !youngerShadowRoot(); }
92 bool isOldest() const { return !olderShadowRoot(); } 92 bool isOldest() const { return !olderShadowRoot(); }
93 93
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 HTMLSlotElement* assignedSlotFor(const Node& node) const 128 HTMLSlotElement* assignedSlotFor(const Node& node) const
129 { 129 {
130 DCHECK(m_slotAssignment); 130 DCHECK(m_slotAssignment);
131 return m_slotAssignment->assignedSlotFor(node); 131 return m_slotAssignment->assignedSlotFor(node);
132 } 132 }
133 133
134 // Make protected methods from base class public here. 134 // Make protected methods from base class public here.
135 using TreeScope::setDocument; 135 using TreeScope::setDocument;
136 using TreeScope::setParentTreeScope; 136 using TreeScope::setParentTreeScope;
137 137
138 public:
139 Element* activeElement() const; 138 Element* activeElement() const;
140 139
141 ShadowRoot* olderShadowRoot() const { return next(); }
142
143 String innerHTML() const; 140 String innerHTML() const;
144 void setInnerHTML(const String&, ExceptionState&); 141 void setInnerHTML(const String&, ExceptionState&);
145 142
146 Node* cloneNode(bool, ExceptionState&); 143 Node* cloneNode(bool, ExceptionState&);
147 144
148 StyleSheetList* styleSheets(); 145 StyleSheetList* styleSheets();
149 146
150 void setDelegatesFocus(bool flag) { m_delegatesFocus = flag; } 147 void setDelegatesFocus(bool flag) { m_delegatesFocus = flag; }
151 bool delegatesFocus() const { return m_delegatesFocus; } 148 bool delegatesFocus() const { return m_delegatesFocus; }
152 149
153 DECLARE_VIRTUAL_TRACE(); 150 DECLARE_VIRTUAL_TRACE();
154 151
155 private: 152 private:
156 ShadowRoot(Document&, ShadowRootType); 153 ShadowRoot(Document&, ShadowRootType);
157 ~ShadowRoot() override; 154 ~ShadowRoot() override;
158 155
159 void childrenChanged(const ChildrenChange&) override; 156 void childrenChanged(const ChildrenChange&) override;
160 157
161 ShadowRootRareData* ensureShadowRootRareData(); 158 ShadowRootRareData& ensureShadowRootRareData();
162 ShadowRootRareDataV0* ensureShadowRootRareDataV0(); 159 ShadowRootRareDataV0& ensureShadowRootRareDataV0();
163 160
164 void addChildShadowRoot(); 161 void addChildShadowRoot();
165 void removeChildShadowRoot(); 162 void removeChildShadowRoot();
166 void invalidateDescendantInsertionPoints(); 163 void invalidateDescendantInsertionPoints();
167 164
168 // ShadowRoots should never be cloned. 165 // ShadowRoots should never be cloned.
169 Node* cloneNode(bool) override { return nullptr; } 166 Node* cloneNode(bool) override { return nullptr; }
170 167
171 // FIXME: This shouldn't happen. https://bugs.webkit.org/show_bug.cgi?id=888 34 168 // FIXME: This shouldn't happen. https://bugs.webkit.org/show_bug.cgi?id=888 34
172 bool isOrphan() const { return !host(); } 169 bool isOrphan() const { return !host(); }
173 170
174 void invalidateDescendantSlots(); 171 void invalidateDescendantSlots();
175 unsigned descendantSlotCount() const; 172 unsigned descendantSlotCount() const;
176 173
177 Member<ShadowRoot> m_prev;
178 Member<ShadowRoot> m_next;
179 Member<ShadowRootRareData> m_shadowRootRareData; 174 Member<ShadowRootRareData> m_shadowRootRareData;
180 Member<ShadowRootRareDataV0> m_shadowRootRareDataV0; 175 Member<ShadowRootRareDataV0> m_shadowRootRareDataV0;
181
182 Member<SlotAssignment> m_slotAssignment; 176 Member<SlotAssignment> m_slotAssignment;
183 unsigned m_numberOfStyles : 26; 177 unsigned m_numberOfStyles : 26;
184 unsigned m_type : 2; 178 unsigned m_type : 2;
185 unsigned m_registeredWithParentShadowRoot : 1; 179 unsigned m_registeredWithParentShadowRoot : 1;
186 unsigned m_descendantInsertionPointsIsValid : 1; 180 unsigned m_descendantInsertionPointsIsValid : 1;
187 unsigned m_delegatesFocus : 1; 181 unsigned m_delegatesFocus : 1;
188 unsigned m_descendantSlotsIsValid : 1; 182 unsigned m_descendantSlotsIsValid : 1;
189 }; 183 };
190 184
191 inline Element* ShadowRoot::activeElement() const 185 inline Element* ShadowRoot::activeElement() const
(...skipping 11 matching lines...) Expand all
203 197
204 DEFINE_NODE_TYPE_CASTS(ShadowRoot, isShadowRoot()); 198 DEFINE_NODE_TYPE_CASTS(ShadowRoot, isShadowRoot());
205 DEFINE_TYPE_CASTS(ShadowRoot, TreeScope, treeScope, treeScope->rootNode().isShad owRoot(), treeScope.rootNode().isShadowRoot()); 199 DEFINE_TYPE_CASTS(ShadowRoot, TreeScope, treeScope, treeScope->rootNode().isShad owRoot(), treeScope.rootNode().isShadowRoot());
206 DEFINE_TYPE_CASTS(TreeScope, ShadowRoot, shadowRoot, true, true); 200 DEFINE_TYPE_CASTS(TreeScope, ShadowRoot, shadowRoot, true, true);
207 201
208 CORE_EXPORT std::ostream& operator<<(std::ostream&, const ShadowRootType&); 202 CORE_EXPORT std::ostream& operator<<(std::ostream&, const ShadowRootType&);
209 203
210 } // namespace blink 204 } // namespace blink
211 205
212 #endif // ShadowRoot_h 206 #endif // ShadowRoot_h
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/dom/shadow/ElementShadow.cpp ('k') | third_party/WebKit/Source/core/dom/shadow/ShadowRoot.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698