diff options
Diffstat (limited to 'WebCore/rendering/RenderListItem.cpp')
-rw-r--r-- | WebCore/rendering/RenderListItem.cpp | 79 |
1 files changed, 52 insertions, 27 deletions
diff --git a/WebCore/rendering/RenderListItem.cpp b/WebCore/rendering/RenderListItem.cpp index 54a7dd2..f861467 100644 --- a/WebCore/rendering/RenderListItem.cpp +++ b/WebCore/rendering/RenderListItem.cpp @@ -80,33 +80,24 @@ static bool isList(Node* node) return (node->hasTagName(ulTag) || node->hasTagName(olTag)); } -static Node* enclosingList(Node* node) +static Node* enclosingList(const RenderListItem* listItem) { - Node* parent = node->parentNode(); - for (Node* n = parent; n; n = n->parentNode()) - if (isList(n)) - return n; - // If there's no actual <ul> or <ol> list element, then our parent acts as - // our list for purposes of determining what other list items should be - // numbered as part of the same list. - return parent; -} - -static Node* enclosingList(const RenderObject* renderer) -{ - Node* node = renderer->node(); - if (node) - return enclosingList(node); - - renderer = renderer->parent(); - while (renderer && !renderer->node()) - renderer = renderer->parent(); - - node = renderer->node(); - if (isList(node)) - return node; + Node* firstNode = 0; + + for (const RenderObject* renderer = listItem->parent(); renderer; renderer = renderer->parent()) { + Node* node = renderer->node(); + if (node) { + if (isList(node)) + return node; + if (!firstNode) + firstNode = node; + } + } - return enclosingList(node); + // If there's no actual <ul> or <ol> list element, then the first found + // node acts as our list for purposes of determining what other list items + // should be numbered as part of the same list. + return firstNode; } static RenderListItem* previousListItem(Node* list, const RenderListItem* item) @@ -114,7 +105,7 @@ static RenderListItem* previousListItem(Node* list, const RenderListItem* item) for (RenderObject* renderer = item->previousInPreOrder(); renderer != list->renderer(); renderer = renderer->previousInPreOrder()) { if (!renderer->isListItem()) continue; - Node* otherList = enclosingList(renderer); + Node* otherList = enclosingList(toRenderListItem(renderer)); // This item is part of our current list, so it's what we're looking for. if (list == otherList) return toRenderListItem(renderer); @@ -326,7 +317,7 @@ void RenderListItem::explicitValueChanged() { if (m_marker) m_marker->setNeedsLayoutAndPrefWidthsRecalc(); - Node* listNode = enclosingList(node()); + Node* listNode = enclosingList(this); RenderObject* listRenderer = 0; if (listNode) listRenderer = listNode->renderer(); @@ -364,4 +355,38 @@ void RenderListItem::clearExplicitValue() explicitValueChanged(); } +void RenderListItem::updateListMarkerNumbers() +{ + Node* listNode = enclosingList(this); + ASSERT(listNode && listNode->renderer()); + if (!listNode || !listNode->renderer()) + return; + + RenderObject* list = listNode->renderer(); + RenderObject* child = nextInPreOrder(list); + while (child) { + if (child->node() && isList(child->node())) { + // We've found a nested, independent list: nothing to do here. + child = child->nextInPreOrderAfterChildren(list); + continue; + } + + if (child->isListItem()) { + RenderListItem* item = toRenderListItem(child); + + if (!item->m_isValueUpToDate) { + // If an item has been marked for update before, we can safely + // assume that all the following ones have too. + // This gives us the opportunity to stop here and avoid + // marking the same nodes again. + break; + } + + item->updateValue(); + } + + child = child->nextInPreOrder(list); + } +} + } // namespace WebCore |