Changeset 103062 in webkit
- Timestamp:
- Dec 16, 2011 5:43:37 AM (12 years ago)
- Location:
- trunk
- Files:
-
- 11 added
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r103057 r103062 1 2011-12-16 Alexis Menard <alexis.menard@openbossa.org>, Jakub Wieczorek <jwieczorek@webkit.org> 2 3 Add support for <ol reversed>. 4 https://bugs.webkit.org/show_bug.cgi?id=36724 5 6 The reversed attribute makes an ordered list appear with marker values 7 decreasing from n, where n is the number of items. 8 See: http://www.whatwg.org/specs/web-apps/current-work/#attr-ol-reversed 9 10 Reviewed by Darin Adler. 11 12 * fast/lists/ol-reversed-dynamic-expected.txt: Added. 13 * fast/lists/ol-reversed-dynamic-simple-expected.txt: Added. 14 * fast/lists/ol-reversed-dynamic-simple.html: Added. 15 * fast/lists/ol-reversed-dynamic.html: Added. 16 * fast/lists/ol-reversed-nested-items-expected.txt: Added. 17 * fast/lists/ol-reversed-nested-items.html: Added. 18 * fast/lists/ol-reversed-nested-list-expected.txt: Added. 19 * fast/lists/ol-reversed-nested-list.html: Added. 20 * fast/lists/ol-reversed-simple-expected.txt: Added. 21 * fast/lists/ol-reversed-simple.html: Added. 22 1 23 2011-12-16 Hajime Morrita <morrita@chromium.org> 2 24 -
trunk/Source/WebCore/ChangeLog
r103059 r103062 1 2011-12-16 Alexis Menard <alexis.menard@openbossa.org>, Jakub Wieczorek <jwieczorek@webkit.org> 2 3 Add support for <ol reversed>. 4 https://bugs.webkit.org/show_bug.cgi?id=36724 5 6 The reversed attribute makes an ordered list appear with marker values 7 decreasing from n, where n is the number of items. 8 See: http://www.whatwg.org/specs/web-apps/current-work/#attr-ol-reversed 9 10 Reviewed by Darin Adler. 11 12 Tests: fast/lists/ol-reversed-dynamic-simple.html 13 fast/lists/ol-reversed-dynamic.html 14 fast/lists/ol-reversed-nested-items.html 15 fast/lists/ol-reversed-nested-list.html 16 fast/lists/ol-reversed-simple.html 17 18 * html/HTMLAttributeNames.in: 19 * html/HTMLOListElement.cpp: 20 (WebCore::HTMLOListElement::HTMLOListElement): 21 (WebCore::HTMLOListElement::parseMappedAttribute): 22 (WebCore::HTMLOListElement::updateItemValues): 23 (WebCore::HTMLOListElement::recalculateItemCount): 24 * html/HTMLOListElement.h: 25 (WebCore::HTMLOListElement::start): 26 (WebCore::HTMLOListElement::isReversed): 27 (WebCore::HTMLOListElement::itemCountChanged): 28 (WebCore::HTMLOListElement::itemCount): 29 * html/HTMLOListElement.idl: 30 * rendering/RenderListItem.cpp: 31 (WebCore::RenderListItem::nextListItem): 32 (WebCore::previousListItem): 33 (WebCore::RenderListItem::calcValue): 34 (WebCore::RenderListItem::explicitValueChanged): 35 (WebCore::previousOrNextItem): 36 (WebCore::RenderListItem::updateListMarkerNumbers): 37 * rendering/RenderListItem.h: 38 1 39 2011-12-15 Stephen White <senorblanco@chromium.org> 2 40 -
trunk/Source/WebCore/html/HTMLAttributeNames.in
r101987 r103062 267 267 results 268 268 rev 269 reversed 269 270 role 270 271 rows -
trunk/Source/WebCore/html/HTMLOListElement.cpp
r61959 r103062 36 36 HTMLOListElement::HTMLOListElement(const QualifiedName& tagName, Document* document) 37 37 : HTMLElement(tagName, document) 38 , m_start(1) 38 , m_start(0xBADBEEF) 39 , m_itemCount(0) 40 , m_hasExplicitStart(false) 41 , m_isReversed(false) 42 , m_shouldRecalculateItemCount(false) 39 43 { 40 44 ASSERT(hasTagName(olTag)); … … 75 79 addCSSProperty(attr, CSSPropertyListStyleType, CSSValueDecimal); 76 80 } else if (attr->name() == startAttr) { 81 int oldStart = start(); 77 82 bool canParse; 78 int start = attr->value().toInt(&canParse);79 if (!canParse)80 start = 1;81 if ( start == m_start)83 int parsedStart = attr->value().toInt(&canParse); 84 m_hasExplicitStart = canParse; 85 m_start = canParse ? parsedStart : 0xBADBEEF; 86 if (oldStart == start()) 82 87 return; 83 m_start = start; 84 for (RenderObject* child = renderer(); child; child = child->nextInPreOrder(renderer())) { 85 if (child->isListItem()) 86 toRenderListItem(child)->updateValue(); 87 } 88 updateItemValues(); 89 } else if (attr->name() == reversedAttr) { 90 bool reversed = !attr->isNull(); 91 if (reversed == m_isReversed) 92 return; 93 m_isReversed = reversed; 94 updateItemValues(); 88 95 } else 89 96 HTMLElement::parseMappedAttribute(attr); … … 95 102 } 96 103 104 void HTMLOListElement::updateItemValues() 105 { 106 for (RenderListItem* listItem = RenderListItem::nextListItem(renderer()); listItem; listItem = RenderListItem::nextListItem(renderer(), listItem)) 107 listItem->updateValue(); 97 108 } 109 110 void HTMLOListElement::recalculateItemCount() 111 { 112 m_itemCount = 0; 113 114 for (RenderListItem* listItem = RenderListItem::nextListItem(renderer()); listItem; listItem = RenderListItem::nextListItem(renderer(), listItem)) 115 m_itemCount++; 116 117 m_shouldRecalculateItemCount = false; 118 } 119 120 } -
trunk/Source/WebCore/html/HTMLOListElement.h
r66057 r103062 33 33 static PassRefPtr<HTMLOListElement> create(const QualifiedName&, Document*); 34 34 35 int start() const { return m_ start; }35 int start() const { return m_hasExplicitStart ? m_start : (m_isReversed ? itemCount() : 1); } 36 36 void setStart(int); 37 38 bool isReversed() const { return m_isReversed; } 39 40 void itemCountChanged() { m_shouldRecalculateItemCount = true; } 37 41 38 42 private: 39 43 HTMLOListElement(const QualifiedName&, Document*); 40 44 45 void updateItemValues(); 46 47 unsigned itemCount() const 48 { 49 if (m_shouldRecalculateItemCount) 50 const_cast<HTMLOListElement*>(this)->recalculateItemCount(); 51 return m_itemCount; 52 } 53 54 void recalculateItemCount(); 55 41 56 virtual bool mapToEntry(const QualifiedName&, MappedAttributeEntry&) const; 42 57 virtual void parseMappedAttribute(Attribute*); 43 58 44 59 int m_start; 60 unsigned m_itemCount; 61 62 bool m_hasExplicitStart : 1; 63 bool m_isReversed : 1; 64 bool m_shouldRecalculateItemCount : 1; 45 65 }; 46 66 -
trunk/Source/WebCore/html/HTMLOListElement.idl
r89269 r103062 23 23 attribute [Reflect] boolean compact; 24 24 attribute long start; 25 attribute [Reflect] boolean reversed; 25 26 attribute [Reflect] DOMString type; 26 27 }; -
trunk/Source/WebCore/rendering/RenderListItem.cpp
r94640 r103062 102 102 } 103 103 104 static RenderListItem* previousListItem(Node* list, const RenderListItem* item) 105 { 106 for (RenderObject* renderer = item->previousInPreOrder(); renderer && renderer != list->renderer(); renderer = renderer->previousInPreOrder()) { 104 RenderListItem* RenderListItem::nextListItem(RenderObject* list, RenderListItem* item) 105 { 106 if (!list) 107 return 0; 108 109 RenderObject* renderer = item ? item : list; 110 while ((renderer = renderer->nextInPreOrder(list))) { 111 if (renderer->node() && isList(renderer->node())) { 112 // We've found a nested, independent list: nothing to do here. 113 renderer = renderer->nextInPreOrderAfterChildren(list); 114 continue; 115 } 116 117 if (renderer->isListItem()) 118 return toRenderListItem(renderer); 119 } 120 return 0; 121 } 122 123 static RenderListItem* previousListItem(RenderObject* list, const RenderListItem* item) 124 { 125 for (RenderObject* renderer = item->previousInPreOrder(); renderer && renderer != list; renderer = renderer->previousInPreOrder()) { 107 126 if (!renderer->isListItem()) 108 127 continue; 109 128 Node* otherList = enclosingList(toRenderListItem(renderer)); 110 129 // This item is part of our current list, so it's what we're looking for. 111 if (list == otherList)130 if (list->node() == otherList) 112 131 return toRenderListItem(renderer); 113 132 // We found ourself inside another list; lets skip the rest of it. … … 125 144 if (m_hasExplicitValue) 126 145 return m_explicitValue; 146 127 147 Node* list = enclosingList(this); 148 RenderObject* listRenderer = list ? list->renderer() : 0; 149 HTMLOListElement* oListElement = (list && list->hasTagName(olTag)) ? static_cast<HTMLOListElement*>(list) : 0; 150 int valueStep = 1; 151 if (oListElement && oListElement->isReversed()) 152 valueStep = -1; 153 128 154 // FIXME: This recurses to a possible depth of the length of the list. 129 155 // That's not good -- we need to change this to an iterative algorithm. 130 if (RenderListItem* previousItem = previousListItem(list, this)) 131 return previousItem->value() + 1; 132 if (list && list->hasTagName(olTag)) 133 return static_cast<HTMLOListElement*>(list)->start(); 156 if (RenderListItem* previousItem = previousListItem(listRenderer, this)) 157 return previousItem->value() + valueStep; 158 159 if (oListElement) 160 return oListElement->start(); 161 134 162 return 1; 135 163 } … … 393 421 if (listNode) 394 422 listRenderer = listNode->renderer(); 395 for (RenderObject* renderer = this; renderer; renderer = renderer->nextInPreOrder(listRenderer)) 396 if (renderer->isListItem()) { 397 RenderListItem* item = toRenderListItem(renderer); 398 if (!item->m_hasExplicitValue) { 399 item->m_isValueUpToDate = false; 400 if (RenderListMarker* marker = item->m_marker) 401 marker->setNeedsLayoutAndPrefWidthsRecalc(); 402 } 403 } 423 for (RenderListItem* item = this; item; item = nextListItem(listRenderer, item)) 424 item->updateValue(); 404 425 } 405 426 … … 427 448 } 428 449 450 static RenderListItem* previousOrNextItem(bool isListReversed, RenderObject* list, RenderListItem* item) 451 { 452 return isListReversed ? previousListItem(list, item) : RenderListItem::nextListItem(list, item); 453 } 454 429 455 void RenderListItem::updateListMarkerNumbers() 430 456 { … … 434 460 return; 435 461 462 bool isListReversed = false; 436 463 RenderObject* list = listNode->renderer(); 437 RenderObject* child = nextInPreOrder(list); 438 while (child) { 439 if (child->node() && isList(child->node())) { 440 // We've found a nested, independent list: nothing to do here. 441 child = child->nextInPreOrderAfterChildren(list); 442 continue; 443 } 444 445 if (child->isListItem()) { 446 RenderListItem* item = toRenderListItem(child); 447 448 if (!item->m_isValueUpToDate) { 449 // If an item has been marked for update before, we can safely 450 // assume that all the following ones have too. 451 // This gives us the opportunity to stop here and avoid 452 // marking the same nodes again. 453 break; 454 } 455 456 item->updateValue(); 457 } 458 459 child = child->nextInPreOrder(list); 464 HTMLOListElement* oListElement = (listNode && listNode->hasTagName(olTag)) ? static_cast<HTMLOListElement*>(listNode) : 0; 465 if (oListElement) { 466 oListElement->itemCountChanged(); 467 isListReversed = oListElement->isReversed(); 468 } 469 for (RenderListItem* item = previousOrNextItem(isListReversed, list, this); item; item = previousOrNextItem(isListReversed, list, item)) { 470 if (!item->m_isValueUpToDate) { 471 // If an item has been marked for update before, we can safely 472 // assume that all the following ones have too. 473 // This gives us the opportunity to stop here and avoid 474 // marking the same nodes again. 475 break; 476 } 477 item->updateValue(); 460 478 } 461 479 } -
trunk/Source/WebCore/rendering/RenderListItem.h
r97054 r103062 50 50 void updateListMarkerNumbers(); 51 51 52 static RenderListItem* nextListItem(RenderObject* listRenderer, RenderListItem* = 0); 53 52 54 private: 53 55 virtual const char* renderName() const { return "RenderListItem"; }
Note: See TracChangeset
for help on using the changeset viewer.