|
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 |
return ancestor; |
| 67 |
} |
| 68 |
ancestor = ancestor->parentElement(); |
| 69 |
} |
| 70 |
return nullptr; |
| 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() && !previous->hasDisplayContents()) |
| 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 78-84
static inline Element* parentOrPseudoHostElement(const RenderElement& renderer)
a/Source/WebCore/rendering/RenderCounter.cpp_sec2
|
| 78 |
static Element* previousSiblingOrParentElement(const Element& element) |
102 |
static Element* previousSiblingOrParentElement(const Element& element) |
| 79 |
{ |
103 |
{ |
| 80 |
if (auto* previous = ElementTraversal::pseudoAwarePreviousSibling(element)) { |
104 |
if (auto* previous = ElementTraversal::pseudoAwarePreviousSibling(element)) { |
| 81 |
while (previous && !previous->renderer()) |
105 |
while (previous && !previous->renderer() && !previous->hasDisplayContents()) |
| 82 |
previous = ElementTraversal::pseudoAwarePreviousSibling(*previous); |
106 |
previous = ElementTraversal::pseudoAwarePreviousSibling(*previous); |
| 83 |
|
107 |
|
| 84 |
if (previous) |
108 |
if (previous) |
|
Lines 92-101
static Element* previousSiblingOrParentElement(const Element& element)
a/Source/WebCore/rendering/RenderCounter.cpp_sec3
|
| 92 |
return hostElement; |
116 |
return hostElement; |
| 93 |
return previousSiblingOrParentElement(*hostElement); |
117 |
return previousSiblingOrParentElement(*hostElement); |
| 94 |
} |
118 |
} |
| 95 |
|
|
|
| 96 |
auto* parent = element.parentElement(); |
119 |
auto* parent = element.parentElement(); |
| 97 |
if (parent && !parent->renderer()) |
120 |
if (parent && !parent->renderer()) |
| 98 |
parent = previousSiblingOrParentElement(*parent); |
121 |
parent = previousSiblingOrParentElement(*parent); |
|
|
122 |
if (parent && parent->renderer() && parent->renderer()->style().containsStyle()) |
| 123 |
return nullptr; |
| 99 |
return parent; |
124 |
return parent; |
| 100 |
} |
125 |
} |
| 101 |
|
126 |
|
|
Lines 223-228
static CounterInsertionPoint findPlaceForCounter(RenderElement& counterOwner, co
a/Source/WebCore/rendering/RenderCounter.cpp_sec4
|
| 223 |
// towards the begining of the document for counters with the same identifier as the one |
248 |
// towards the begining of the document for counters with the same identifier as the one |
| 224 |
// we are trying to find a place for. This is the next renderer to be checked. |
249 |
// we are trying to find a place for. This is the next renderer to be checked. |
| 225 |
RenderElement* currentRenderer = previousInPreOrder(counterOwner); |
250 |
RenderElement* currentRenderer = previousInPreOrder(counterOwner); |
|
|
251 |
|
| 226 |
RefPtr<CounterNode> previousSibling; |
252 |
RefPtr<CounterNode> previousSibling; |
| 227 |
|
253 |
|
| 228 |
while (currentRenderer) { |
254 |
while (currentRenderer) { |
|
Lines 335-341
static CounterNode* makeCounterNode(RenderElement& renderer, const AtomString& i
a/Source/WebCore/rendering/RenderCounter.cpp_sec5
|
| 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_sec6
|
| 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_sec7
|
| 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 |
} |