|
Lines 57-71
static CounterMaps& counterMaps()
a/Source/WebCore/rendering/RenderCounter.cpp_sec1
|
| 57 |
return staticCounterMaps; |
57 |
return staticCounterMaps; |
| 58 |
} |
58 |
} |
| 59 |
|
59 |
|
|
|
60 |
static Element* ancestorStyleContainmentObject(const Element& element) |
| 61 |
{ |
| 62 |
Element* ancestor = is<PseudoElement>(element) ? downcast<PseudoElement>(element).hostElement() : element.parentElement(); |
| 63 |
while (ancestor) { |
| 64 |
if (auto* style = ancestor->existingComputedStyle()) { |
| 65 |
if (style->containsStyle()) |
| 66 |
break; |
| 67 |
} |
| 68 |
ancestor = ancestor->parentElement(); |
| 69 |
} |
| 70 |
return ancestor; |
| 71 |
} |
| 72 |
|
| 60 |
// This function processes the renderer tree in the order of the DOM tree |
73 |
// This function processes the renderer tree in the order of the DOM tree |
| 61 |
// including pseudo elements as defined in CSS 2.1. |
74 |
// including pseudo elements as defined in CSS 2.1. |
| 62 |
static RenderElement* previousInPreOrder(const RenderElement& renderer) |
75 |
static RenderElement* previousInPreOrder(const RenderElement& renderer) |
| 63 |
{ |
76 |
{ |
| 64 |
ASSERT(renderer.element()); |
77 |
ASSERT(renderer.element()); |
| 65 |
Element* previous = ElementTraversal::previousIncludingPseudo(*renderer.element()); |
78 |
Element* previous = ElementTraversal::previousIncludingPseudo(*renderer.element()); |
| 66 |
while (previous && !previous->renderer()) |
79 |
Element* styleContainAncestor = ancestorStyleContainmentObject(*renderer.element()); |
| 67 |
previous = ElementTraversal::previousIncludingPseudo(*previous); |
80 |
|
| 68 |
return previous ? previous->renderer() : 0; |
81 |
while (true) { |
|
|
82 |
while (previous && !previous->renderer()) |
| 83 |
previous = ElementTraversal::previousIncludingPseudo(*previous); |
| 84 |
if (!previous) |
| 85 |
return nullptr; |
| 86 |
Element* previousStyleContainAncestor = ancestorStyleContainmentObject(*previous); |
| 87 |
if (previousStyleContainAncestor == styleContainAncestor) |
| 88 |
return previous->renderer(); |
| 89 |
if (!previousStyleContainAncestor) |
| 90 |
return nullptr; |
| 91 |
previous = previousStyleContainAncestor; |
| 92 |
} |
| 69 |
} |
93 |
} |
| 70 |
|
94 |
|
| 71 |
static inline Element* parentOrPseudoHostElement(const RenderElement& renderer) |
95 |
static inline Element* parentOrPseudoHostElement(const RenderElement& renderer) |
|
Lines 96-101
static Element* previousSiblingOrParentElement(const Element& element)
a/Source/WebCore/rendering/RenderCounter.cpp_sec2
|
| 96 |
auto* parent = element.parentElement(); |
120 |
auto* parent = element.parentElement(); |
| 97 |
if (parent && !parent->renderer()) |
121 |
if (parent && !parent->renderer()) |
| 98 |
parent = previousSiblingOrParentElement(*parent); |
122 |
parent = previousSiblingOrParentElement(*parent); |
|
|
123 |
if (parent && parent->renderer() && parent->renderer()->style().containsStyle()) |
| 124 |
return nullptr; |
| 99 |
return parent; |
125 |
return parent; |
| 100 |
} |
126 |
} |
| 101 |
|
127 |
|
|
Lines 335-341
static CounterNode* makeCounterNode(RenderElement& renderer, const AtomString& i
a/Source/WebCore/rendering/RenderCounter.cpp_sec3
|
| 335 |
maps.add(&renderer, makeUnique<CounterMap>()).iterator->value->add(identifier, newNode.copyRef()); |
361 |
maps.add(&renderer, makeUnique<CounterMap>()).iterator->value->add(identifier, newNode.copyRef()); |
| 336 |
renderer.setHasCounterNodeMap(true); |
362 |
renderer.setHasCounterNodeMap(true); |
| 337 |
|
363 |
|
| 338 |
if (newNode->parent()) |
364 |
if (newNode->parent() || shouldApplyStyleContainment(renderer)) |
| 339 |
return newNode.ptr(); |
365 |
return newNode.ptr(); |
| 340 |
|
366 |
|
| 341 |
// Check if some nodes that were previously root nodes should become children of this node now. |
367 |
// Check if some nodes that were previously root nodes should become children of this node now. |
|
Lines 343-349
static CounterNode* makeCounterNode(RenderElement& renderer, const AtomString& i
a/Source/WebCore/rendering/RenderCounter.cpp_sec4
|
| 343 |
auto* stayWithin = parentOrPseudoHostElement(renderer); |
369 |
auto* stayWithin = parentOrPseudoHostElement(renderer); |
| 344 |
bool skipDescendants = false; |
370 |
bool skipDescendants = false; |
| 345 |
while ((currentRenderer = nextInPreOrder(*currentRenderer, stayWithin, skipDescendants))) { |
371 |
while ((currentRenderer = nextInPreOrder(*currentRenderer, stayWithin, skipDescendants))) { |
| 346 |
skipDescendants = false; |
372 |
skipDescendants = shouldApplyStyleContainment(*currentRenderer); |
| 347 |
if (!currentRenderer->hasCounterNodeMap()) |
373 |
if (!currentRenderer->hasCounterNodeMap()) |
| 348 |
continue; |
374 |
continue; |
| 349 |
auto* currentCounter = maps.find(currentRenderer)->value->get(identifier); |
375 |
auto* currentCounter = maps.find(currentRenderer)->value->get(identifier); |
|
Lines 549-556
void RenderCounter::rendererSubtreeAttached(RenderElement& renderer)
a/Source/WebCore/rendering/RenderCounter.cpp_sec5
|
| 549 |
element = renderer.generatingElement(); |
575 |
element = renderer.generatingElement(); |
| 550 |
if (element && !element->renderer()) |
576 |
if (element && !element->renderer()) |
| 551 |
return; // No need to update if the parent is not attached yet |
577 |
return; // No need to update if the parent is not attached yet |
|
|
578 |
bool crossedBoundary = false; |
| 552 |
for (RenderObject* descendant = &renderer; descendant; descendant = descendant->nextInPreOrder(&renderer)) { |
579 |
for (RenderObject* descendant = &renderer; descendant; descendant = descendant->nextInPreOrder(&renderer)) { |
| 553 |
if (is<RenderElement>(*descendant)) |
580 |
crossedBoundary |= shouldApplyStyleContainment(*descendant); |
|
|
581 |
if (crossedBoundary && is<RenderElement>(*descendant)) |
| 554 |
updateCounters(downcast<RenderElement>(*descendant)); |
582 |
updateCounters(downcast<RenderElement>(*descendant)); |
| 555 |
} |
583 |
} |
| 556 |
} |
584 |
} |