summaryrefslogtreecommitdiffstats
path: root/WebCore/rendering/RenderListItem.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/rendering/RenderListItem.cpp')
-rw-r--r--WebCore/rendering/RenderListItem.cpp79
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