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

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

Issue 1995203002: Rewrite Shadow DOM distribution engine to support partial synchronous distribution for v1 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: No longer FAIL: imported/wpt/shadow-dom/HTMLSlotElement-interface.html Created 4 years, 6 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 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 54
55 ShadowRoot::ShadowRoot(Document& document, ShadowRootType type) 55 ShadowRoot::ShadowRoot(Document& document, ShadowRootType type)
56 : DocumentFragment(0, CreateShadowRoot) 56 : DocumentFragment(0, CreateShadowRoot)
57 , TreeScope(*this, document) 57 , TreeScope(*this, document)
58 , m_numberOfStyles(0) 58 , m_numberOfStyles(0)
59 , m_childShadowRootCount(0) 59 , m_childShadowRootCount(0)
60 , m_type(static_cast<unsigned>(type)) 60 , m_type(static_cast<unsigned>(type))
61 , m_registeredWithParentShadowRoot(false) 61 , m_registeredWithParentShadowRoot(false)
62 , m_descendantInsertionPointsIsValid(false) 62 , m_descendantInsertionPointsIsValid(false)
63 , m_delegatesFocus(false) 63 , m_delegatesFocus(false)
64 , m_descendantSlotsIsValid(false)
65 { 64 {
66 } 65 }
67 66
68 ShadowRoot::~ShadowRoot() 67 ShadowRoot::~ShadowRoot()
69 { 68 {
70 } 69 }
71 70
72 ShadowRoot* ShadowRoot::youngerShadowRoot() const 71 ShadowRoot* ShadowRoot::youngerShadowRoot() const
73 { 72 {
74 if (type() == ShadowRootType::V0 && m_shadowRootRareDataV0) 73 if (type() == ShadowRootType::V0 && m_shadowRootRareDataV0)
(...skipping 25 matching lines...) Expand all
100 99
101 void ShadowRoot::setOlderShadowRoot(ShadowRoot& root) 100 void ShadowRoot::setOlderShadowRoot(ShadowRoot& root)
102 { 101 {
103 DCHECK_EQ(type(), ShadowRootType::V0); 102 DCHECK_EQ(type(), ShadowRootType::V0);
104 ensureShadowRootRareDataV0().setOlderShadowRoot(root); 103 ensureShadowRootRareDataV0().setOlderShadowRoot(root);
105 } 104 }
106 105
107 SlotAssignment& ShadowRoot::ensureSlotAssignment() 106 SlotAssignment& ShadowRoot::ensureSlotAssignment()
108 { 107 {
109 if (!m_slotAssignment) 108 if (!m_slotAssignment)
110 m_slotAssignment = SlotAssignment::create(); 109 m_slotAssignment = SlotAssignment::create(*this);
111 return *m_slotAssignment; 110 return *m_slotAssignment;
112 } 111 }
113 112
114 HTMLSlotElement* ShadowRoot::assignedSlotFor(const Node& node) const
115 {
116 DCHECK(m_slotAssignment);
117 return m_slotAssignment->assignedSlotFor(node);
118 }
119
120 Node* ShadowRoot::cloneNode(bool, ExceptionState& exceptionState) 113 Node* ShadowRoot::cloneNode(bool, ExceptionState& exceptionState)
121 { 114 {
122 exceptionState.throwDOMException(NotSupportedError, "ShadowRoot nodes are no t clonable."); 115 exceptionState.throwDOMException(NotSupportedError, "ShadowRoot nodes are no t clonable.");
123 return nullptr; 116 return nullptr;
124 } 117 }
125 118
126 String ShadowRoot::innerHTML() const 119 String ShadowRoot::innerHTML() const
127 { 120 {
128 return createMarkup(this, ChildrenOnly); 121 return createMarkup(this, ChildrenOnly);
129 } 122 }
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
293 return m_shadowRootRareDataV0->descendantInsertionPoints(); 286 return m_shadowRootRareDataV0->descendantInsertionPoints();
294 } 287 }
295 288
296 StyleSheetList& ShadowRoot::styleSheets() 289 StyleSheetList& ShadowRoot::styleSheets()
297 { 290 {
298 if (!m_styleSheetList) 291 if (!m_styleSheetList)
299 setStyleSheets(StyleSheetList::create(this)); 292 setStyleSheets(StyleSheetList::create(this));
300 return *m_styleSheetList; 293 return *m_styleSheetList;
301 } 294 }
302 295
303 void ShadowRoot::didAddSlot()
304 {
305 ensureSlotAssignment().didAddSlot();
306 invalidateDescendantSlots();
307 }
308
309 void ShadowRoot::didRemoveSlot()
310 {
311 DCHECK(m_slotAssignment);
312 m_slotAssignment->didRemoveSlot();
313 invalidateDescendantSlots();
314 }
315
316 void ShadowRoot::invalidateDescendantSlots()
317 {
318 DCHECK(m_slotAssignment);
319 m_descendantSlotsIsValid = false;
320 m_slotAssignment->clearDescendantSlots();
321 }
322
323 unsigned ShadowRoot::descendantSlotCount() const
324 {
325 return m_slotAssignment ? m_slotAssignment->descendantSlotCount() : 0;
326 }
327
328 const HeapVector<Member<HTMLSlotElement>>& ShadowRoot::descendantSlots()
329 {
330 DEFINE_STATIC_LOCAL(HeapVector<Member<HTMLSlotElement>>, emptyList, (new Hea pVector<Member<HTMLSlotElement>>));
331 if (m_descendantSlotsIsValid) {
332 DCHECK(m_slotAssignment);
333 return m_slotAssignment->descendantSlots();
334 }
335 if (descendantSlotCount() == 0)
336 return emptyList;
337
338 DCHECK(m_slotAssignment);
339 HeapVector<Member<HTMLSlotElement>> slots;
340 slots.reserveCapacity(descendantSlotCount());
341 for (HTMLSlotElement& slot : Traversal<HTMLSlotElement>::descendantsOf(rootN ode()))
342 slots.append(&slot);
343 m_slotAssignment->setDescendantSlots(slots);
344 m_descendantSlotsIsValid = true;
345 return m_slotAssignment->descendantSlots();
346 }
347
348 void ShadowRoot::assignV1()
349 {
350 if (!m_slotAssignment)
351 m_slotAssignment = SlotAssignment::create();
352 m_slotAssignment->resolveAssignment(*this);
353 }
354
355 void ShadowRoot::distributeV1() 296 void ShadowRoot::distributeV1()
356 { 297 {
357 if (!m_slotAssignment) 298 ensureSlotAssignment().resolveDistribution();
358 m_slotAssignment = SlotAssignment::create();
359 m_slotAssignment->resolveDistribution(*this);
360 } 299 }
361 300
362 DEFINE_TRACE(ShadowRoot) 301 DEFINE_TRACE(ShadowRoot)
363 { 302 {
364 visitor->trace(m_shadowRootRareDataV0); 303 visitor->trace(m_shadowRootRareDataV0);
365 visitor->trace(m_slotAssignment); 304 visitor->trace(m_slotAssignment);
366 visitor->trace(m_styleSheetList); 305 visitor->trace(m_styleSheetList);
367 TreeScope::trace(visitor); 306 TreeScope::trace(visitor);
368 DocumentFragment::trace(visitor); 307 DocumentFragment::trace(visitor);
369 } 308 }
(...skipping 17 matching lines...) Expand all
387 ostream << "ShadowRootType::Open"; 326 ostream << "ShadowRootType::Open";
388 break; 327 break;
389 case ShadowRootType::Closed: 328 case ShadowRootType::Closed:
390 ostream << "ShadowRootType::Closed"; 329 ostream << "ShadowRootType::Closed";
391 break; 330 break;
392 } 331 }
393 return ostream; 332 return ostream;
394 } 333 }
395 334
396 } // namespace blink 335 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/dom/shadow/ShadowRoot.h ('k') | third_party/WebKit/Source/core/dom/shadow/SlotAssignment.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698