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

Unified Diff: third_party/WebKit/Source/core/dom/shadow/ElementShadow.cpp

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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/dom/shadow/ElementShadow.cpp
diff --git a/third_party/WebKit/Source/core/dom/shadow/ElementShadow.cpp b/third_party/WebKit/Source/core/dom/shadow/ElementShadow.cpp
index b4e93ba31e21a2d560841d0c6c4d0367a5f4cac1..393a0eae0cf5616eb33844ae44059fa123cfad97 100644
--- a/third_party/WebKit/Source/core/dom/shadow/ElementShadow.cpp
+++ b/third_party/WebKit/Source/core/dom/shadow/ElementShadow.cpp
@@ -144,23 +144,35 @@ ElementShadow::~ElementShadow()
{
}
+ShadowRoot& ElementShadow::youngestShadowRoot() const
+{
+ ShadowRoot* current = m_shadowRoot;
+ DCHECK(current);
+ while (current->youngerShadowRoot())
+ current = current->youngerShadowRoot();
+ return *current;
+}
+
ShadowRoot& ElementShadow::addShadowRoot(Element& shadowHost, ShadowRootType type)
{
EventDispatchForbiddenScope assertNoEventDispatch;
ScriptForbiddenScope forbidScript;
- if (type == ShadowRootType::V0 && !m_shadowRoots.isEmpty()) {
- DCHECK_NE(ShadowRootType::UserAgent, m_shadowRoots.head()->type());
+ if (type == ShadowRootType::V0 && m_shadowRoot) {
+ DCHECK_EQ(m_shadowRoot->type(), ShadowRootType::V0);
Deprecation::countDeprecation(shadowHost.document(), UseCounter::ElementCreateShadowRootMultiple);
}
- for (ShadowRoot* root = m_shadowRoots.head(); root; root = root->olderShadowRoot())
- root->lazyReattachIfAttached();
+ if (m_shadowRoot) {
+ // TODO(hayato): Is the order, from the youngest to the oldest, important?
+ for (ShadowRoot* root = &youngestShadowRoot(); root; root = root->olderShadowRoot())
+ root->lazyReattachIfAttached();
+ }
ShadowRoot* shadowRoot = ShadowRoot::create(shadowHost.document(), type);
shadowRoot->setParentOrShadowHostNode(&shadowHost);
shadowRoot->setParentTreeScope(shadowHost.treeScope());
- m_shadowRoots.push(shadowRoot);
+ appendShadowRoot(*shadowRoot);
setNeedsDistributionRecalc();
shadowRoot->insertedInto(&shadowHost);
@@ -172,6 +184,19 @@ ShadowRoot& ElementShadow::addShadowRoot(Element& shadowHost, ShadowRootType typ
return *shadowRoot;
}
+void ElementShadow::appendShadowRoot(ShadowRoot& shadowRoot)
+{
+ if (!m_shadowRoot) {
+ m_shadowRoot = &shadowRoot;
+ return;
+ }
+ ShadowRoot& youngest = youngestShadowRoot();
+ DCHECK(shadowRoot.type() == ShadowRootType::V0);
+ DCHECK(youngest.type() == ShadowRootType::V0);
+ youngest.setYoungerShadowRoot(shadowRoot);
+ shadowRoot.setOlderShadowRoot(youngest);
+}
+
void ElementShadow::attach(const Node::AttachContext& context)
{
Node::AttachContext childrenContext(context);
@@ -354,10 +379,7 @@ DEFINE_TRACE(ElementShadow)
{
visitor->trace(m_nodeToInsertionPoints);
visitor->trace(m_selectFeatures);
- // Shadow roots are linked with previous and next pointers which are traced.
- // It is therefore enough to trace one of the shadow roots here and the
- // rest will be traced from there.
- visitor->trace(m_shadowRoots.head());
+ visitor->trace(m_shadowRoot);
}
} // namespace blink
« no previous file with comments | « third_party/WebKit/Source/core/dom/shadow/ElementShadow.h ('k') | third_party/WebKit/Source/core/dom/shadow/ShadowRoot.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698