OLD | NEW |
1 /** | 1 /** |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * Copyright (C) 2003, 2004, 2005, 2006, 2010 Apple Inc. All rights reserved. | 4 * Copyright (C) 2003, 2004, 2005, 2006, 2010 Apple Inc. All rights reserved. |
5 * Copyright (C) 2006 Andrew Wellington (proton@wiretapped.net) | 5 * Copyright (C) 2006 Andrew Wellington (proton@wiretapped.net) |
6 * | 6 * |
7 * This library is free software; you can redistribute it and/or | 7 * This library is free software; you can redistribute it and/or |
8 * modify it under the terms of the GNU Library General Public | 8 * modify it under the terms of the GNU Library General Public |
9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
10 * version 2 of the License, or (at your option) any later version. | 10 * version 2 of the License, or (at your option) any later version. |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
112 static bool isList(const Node& node) { | 112 static bool isList(const Node& node) { |
113 return isHTMLUListElement(node) || isHTMLOListElement(node); | 113 return isHTMLUListElement(node) || isHTMLOListElement(node); |
114 } | 114 } |
115 | 115 |
116 // Returns the enclosing list with respect to the DOM order. | 116 // Returns the enclosing list with respect to the DOM order. |
117 static Node* enclosingList(const LayoutListItem* listItem) { | 117 static Node* enclosingList(const LayoutListItem* listItem) { |
118 Node* listItemNode = listItem->node(); | 118 Node* listItemNode = listItem->node(); |
119 if (!listItemNode) | 119 if (!listItemNode) |
120 return nullptr; | 120 return nullptr; |
121 Node* firstNode = nullptr; | 121 Node* firstNode = nullptr; |
122 // We use parentNode because the enclosing list could be a ShadowRoot that's n
ot Element. | 122 // We use parentNode because the enclosing list could be a ShadowRoot that's |
| 123 // not Element. |
123 for (Node* parent = FlatTreeTraversal::parent(*listItemNode); parent; | 124 for (Node* parent = FlatTreeTraversal::parent(*listItemNode); parent; |
124 parent = FlatTreeTraversal::parent(*parent)) { | 125 parent = FlatTreeTraversal::parent(*parent)) { |
125 if (isList(*parent)) | 126 if (isList(*parent)) |
126 return parent; | 127 return parent; |
127 if (!firstNode) | 128 if (!firstNode) |
128 firstNode = parent; | 129 firstNode = parent; |
129 } | 130 } |
130 | 131 |
131 // If there's no actual <ul> or <ol> list element, then the first found | 132 // If there's no actual <ul> or <ol> list element, then the first found |
132 // node acts as our list for purposes of determining what other list items | 133 // node acts as our list for purposes of determining what other list items |
(...skipping 17 matching lines...) Expand all Loading... |
150 // We've found a nested, independent list: nothing to do here. | 151 // We've found a nested, independent list: nothing to do here. |
151 current = | 152 current = |
152 LayoutTreeBuilderTraversal::nextSkippingChildren(*current, listNode); | 153 LayoutTreeBuilderTraversal::nextSkippingChildren(*current, listNode); |
153 continue; | 154 continue; |
154 } | 155 } |
155 | 156 |
156 LayoutObject* layoutObject = current->layoutObject(); | 157 LayoutObject* layoutObject = current->layoutObject(); |
157 if (layoutObject && layoutObject->isListItem()) | 158 if (layoutObject && layoutObject->isListItem()) |
158 return toLayoutListItem(layoutObject); | 159 return toLayoutListItem(layoutObject); |
159 | 160 |
160 // FIXME: Can this be optimized to skip the children of the elements without
a layoutObject? | 161 // FIXME: Can this be optimized to skip the children of the elements without |
| 162 // a layoutObject? |
161 current = LayoutTreeBuilderTraversal::next(*current, listNode); | 163 current = LayoutTreeBuilderTraversal::next(*current, listNode); |
162 } | 164 } |
163 | 165 |
164 return nullptr; | 166 return nullptr; |
165 } | 167 } |
166 | 168 |
167 // Returns the previous list item with respect to the DOM order. | 169 // Returns the previous list item with respect to the DOM order. |
168 static LayoutListItem* previousListItem(const Node* listNode, | 170 static LayoutListItem* previousListItem(const Node* listNode, |
169 const LayoutListItem* item) { | 171 const LayoutListItem* item) { |
170 Node* current = item->node(); | 172 Node* current = item->node(); |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
293 LayoutObject* result = parent->slowFirstChild(); | 295 LayoutObject* result = parent->slowFirstChild(); |
294 while (result && result->isListMarker()) | 296 while (result && result->isListMarker()) |
295 result = result->nextSibling(); | 297 result = result->nextSibling(); |
296 return result; | 298 return result; |
297 } | 299 } |
298 | 300 |
299 bool LayoutListItem::updateMarkerLocation() { | 301 bool LayoutListItem::updateMarkerLocation() { |
300 ASSERT(m_marker); | 302 ASSERT(m_marker); |
301 | 303 |
302 LayoutObject* markerParent = m_marker->parent(); | 304 LayoutObject* markerParent = m_marker->parent(); |
303 // list-style-position:inside makes the ::marker pseudo an ordinary position:s
tatic element that should be attached to LayoutListItem block. | 305 // list-style-position:inside makes the ::marker pseudo an ordinary |
| 306 // position:static element that should be attached to LayoutListItem block. |
304 LayoutObject* lineBoxParent = | 307 LayoutObject* lineBoxParent = |
305 m_marker->isInside() ? this : getParentOfFirstLineBox(this, m_marker); | 308 m_marker->isInside() ? this : getParentOfFirstLineBox(this, m_marker); |
306 if (!lineBoxParent) { | 309 if (!lineBoxParent) { |
307 // If the marker is currently contained inside an anonymous box, then we | 310 // If the marker is currently contained inside an anonymous box, then we |
308 // are the only item in that anonymous box (since no line box parent was | 311 // are the only item in that anonymous box (since no line box parent was |
309 // found). It's ok to just leave the marker where it is in this case. | 312 // found). It's ok to just leave the marker where it is in this case. |
310 if (markerParent && markerParent->isAnonymousBlock()) | 313 if (markerParent && markerParent->isAnonymousBlock()) |
311 lineBoxParent = markerParent; | 314 lineBoxParent = markerParent; |
312 else | 315 else |
313 lineBoxParent = this; | 316 lineBoxParent = this; |
314 } | 317 } |
315 | 318 |
316 if (markerParent != lineBoxParent) { | 319 if (markerParent != lineBoxParent) { |
317 m_marker->remove(); | 320 m_marker->remove(); |
318 lineBoxParent->addChild(m_marker, firstNonMarkerChild(lineBoxParent)); | 321 lineBoxParent->addChild(m_marker, firstNonMarkerChild(lineBoxParent)); |
319 // TODO(rhogan): lineBoxParent and markerParent may be deleted by addChild,
so they are not safe to reference here. | 322 // TODO(rhogan): lineBoxParent and markerParent may be deleted by addChild, |
320 // Once we have a safe way of referencing them delete markerParent if it is
an empty anonymous block. | 323 // so they are not safe to reference here. |
| 324 // Once we have a safe way of referencing them delete markerParent if it is |
| 325 // an empty anonymous block. |
321 m_marker->updateMarginsAndContent(); | 326 m_marker->updateMarginsAndContent(); |
322 return true; | 327 return true; |
323 } | 328 } |
324 | 329 |
325 return false; | 330 return false; |
326 } | 331 } |
327 | 332 |
328 void LayoutListItem::addOverflowFromChildren() { | 333 void LayoutListItem::addOverflowFromChildren() { |
329 LayoutBlockFlow::addOverflowFromChildren(); | 334 LayoutBlockFlow::addOverflowFromChildren(); |
330 positionListMarker(); | 335 positionListMarker(); |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
518 ASSERT(listNode); | 523 ASSERT(listNode); |
519 | 524 |
520 bool isListReversed = false; | 525 bool isListReversed = false; |
521 HTMLOListElement* oListElement = | 526 HTMLOListElement* oListElement = |
522 isHTMLOListElement(listNode) ? toHTMLOListElement(listNode) : 0; | 527 isHTMLOListElement(listNode) ? toHTMLOListElement(listNode) : 0; |
523 if (oListElement) { | 528 if (oListElement) { |
524 oListElement->itemCountChanged(); | 529 oListElement->itemCountChanged(); |
525 isListReversed = oListElement->isReversed(); | 530 isListReversed = oListElement->isReversed(); |
526 } | 531 } |
527 | 532 |
528 // FIXME: The n^2 protection below doesn't help if the elements were inserted
after the | 533 // FIXME: The n^2 protection below doesn't help if the elements were inserted |
529 // the list had already been displayed. | 534 // after the the list had already been displayed. |
530 | 535 |
531 // Avoid an O(n^2) walk over the children below when they're all known to be a
ttaching. | 536 // Avoid an O(n^2) walk over the children below when they're all known to be |
| 537 // attaching. |
532 if (listNode->needsAttach()) | 538 if (listNode->needsAttach()) |
533 return; | 539 return; |
534 | 540 |
535 for (LayoutListItem* item = | 541 for (LayoutListItem* item = |
536 previousOrNextItem(isListReversed, listNode, this); | 542 previousOrNextItem(isListReversed, listNode, this); |
537 item; item = previousOrNextItem(isListReversed, listNode, item)) { | 543 item; item = previousOrNextItem(isListReversed, listNode, item)) { |
538 if (!item->m_isValueUpToDate) { | 544 if (!item->m_isValueUpToDate) { |
539 // If an item has been marked for update before, we can safely | 545 // If an item has been marked for update before, we can safely |
540 // assume that all the following ones have too. | 546 // assume that all the following ones have too. |
541 // This gives us the opportunity to stop here and avoid | 547 // This gives us the opportunity to stop here and avoid |
542 // marking the same nodes again. | 548 // marking the same nodes again. |
543 break; | 549 break; |
544 } | 550 } |
545 item->updateValue(); | 551 item->updateValue(); |
546 } | 552 } |
547 } | 553 } |
548 | 554 |
549 } // namespace blink | 555 } // namespace blink |
OLD | NEW |