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 * (C) 2007 David Smith (catfish.man@gmail.com) | 4 * (C) 2007 David Smith (catfish.man@gmail.com) |
5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc.
All rights reserved. | 5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc.
All rights reserved. |
6 * Copyright (C) Research In Motion Limited 2010. All rights reserved. | 6 * Copyright (C) Research In Motion Limited 2010. All rights reserved. |
7 * | 7 * |
8 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
9 * modify it under the terms of the GNU Library General Public | 9 * modify it under the terms of the GNU Library General Public |
10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
367 LayoutBlock* newBox = createAnonymousBlock(); | 367 LayoutBlock* newBox = createAnonymousBlock(); |
368 LayoutBox::addChild(newBox, beforeChild); | 368 LayoutBox::addChild(newBox, beforeChild); |
369 newBox->addChild(newChild); | 369 newBox->addChild(newChild); |
370 return; | 370 return; |
371 } | 371 } |
372 } | 372 } |
373 | 373 |
374 LayoutBox::addChild(newChild, beforeChild); | 374 LayoutBox::addChild(newChild, beforeChild); |
375 } | 375 } |
376 | 376 |
377 static void getInlineRun(LayoutObject* start, LayoutObject* boundary, | |
378 LayoutObject*& inlineRunStart, | |
379 LayoutObject*& inlineRunEnd) | |
380 { | |
381 // Beginning at |start| we find the largest contiguous run of inlines that | |
382 // we can. We denote the run with start and end points, |inlineRunStart| | |
383 // and |inlineRunEnd|. Note that these two values may be the same if | |
384 // we encounter only one inline. | |
385 // | |
386 // We skip any non-inlines we encounter as long as we haven't found any | |
387 // inlines yet. | |
388 // | |
389 // |boundary| indicates a non-inclusive boundary point. Regardless of wheth
er |boundary| | |
390 // is inline or not, we will not include it in a run with inlines before it.
It's as though we encountered | |
391 // a non-inline. | |
392 | |
393 // Start by skipping as many non-inlines as we can. | |
394 LayoutObject * curr = start; | |
395 bool sawInline; | |
396 do { | |
397 while (curr && !(curr->isInline() || curr->isFloatingOrOutOfFlowPosition
ed())) | |
398 curr = curr->nextSibling(); | |
399 | |
400 inlineRunStart = inlineRunEnd = curr; | |
401 | |
402 if (!curr) | |
403 return; // No more inline children to be found. | |
404 | |
405 sawInline = curr->isInline(); | |
406 | |
407 curr = curr->nextSibling(); | |
408 while (curr && (curr->isInline() || curr->isFloatingOrOutOfFlowPositione
d()) && (curr != boundary)) { | |
409 inlineRunEnd = curr; | |
410 if (curr->isInline()) | |
411 sawInline = true; | |
412 curr = curr->nextSibling(); | |
413 } | |
414 } while (!sawInline); | |
415 } | |
416 | |
417 void LayoutBlock::deleteLineBoxTree() | 377 void LayoutBlock::deleteLineBoxTree() |
418 { | 378 { |
419 ASSERT(!m_lineBoxes.firstLineBox()); | 379 ASSERT(!m_lineBoxes.firstLineBox()); |
420 } | 380 } |
421 | 381 |
422 void LayoutBlock::makeChildrenNonInline(LayoutObject *insertionPoint) | |
423 { | |
424 // makeChildrenNonInline takes a block whose children are *all* inline and i
t | |
425 // makes sure that inline children are coalesced under anonymous | |
426 // blocks. If |insertionPoint| is defined, then it represents the insertion
point for | |
427 // the new block child that is causing us to have to wrap all the inlines.
This | |
428 // means that we cannot coalesce inlines before |insertionPoint| with inline
s following | |
429 // |insertionPoint|, because the new child is going to be inserted in betwee
n the inlines, | |
430 // splitting them. | |
431 ASSERT(isInlineBlockOrInlineTable() || !isInline()); | |
432 ASSERT(!insertionPoint || insertionPoint->parent() == this); | |
433 | |
434 setChildrenInline(false); | |
435 | |
436 LayoutObject* child = firstChild(); | |
437 if (!child) | |
438 return; | |
439 | |
440 deleteLineBoxTree(); | |
441 | |
442 while (child) { | |
443 LayoutObject* inlineRunStart; | |
444 LayoutObject* inlineRunEnd; | |
445 getInlineRun(child, insertionPoint, inlineRunStart, inlineRunEnd); | |
446 | |
447 if (!inlineRunStart) | |
448 break; | |
449 | |
450 child = inlineRunEnd->nextSibling(); | |
451 | |
452 LayoutBlock* block = createAnonymousBlock(); | |
453 children()->insertChildNode(this, block, inlineRunStart); | |
454 moveChildrenTo(block, inlineRunStart, child); | |
455 } | |
456 | |
457 #if ENABLE(ASSERT) | |
458 for (LayoutObject *c = firstChild(); c; c = c->nextSibling()) | |
459 ASSERT(!c->isInline()); | |
460 #endif | |
461 | |
462 setShouldDoFullPaintInvalidation(); | |
463 } | |
464 | |
465 void LayoutBlock::removeLeftoverAnonymousBlock(LayoutBlock* child) | 382 void LayoutBlock::removeLeftoverAnonymousBlock(LayoutBlock* child) |
466 { | 383 { |
467 ASSERT(child->isAnonymousBlock()); | 384 ASSERT(child->isAnonymousBlock()); |
468 ASSERT(!child->childrenInline()); | 385 ASSERT(!child->childrenInline()); |
469 ASSERT(child->parent() == this); | 386 ASSERT(child->parent() == this); |
470 | 387 |
471 if (child->continuation()) | 388 if (child->continuation()) |
472 return; | 389 return; |
473 | 390 |
474 // Promote all the leftover anonymous block's children (to become children o
f this block | 391 // Promote all the leftover anonymous block's children (to become children o
f this block |
(...skipping 1300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1775 { | 1692 { |
1776 if (childrenInline()) | 1693 if (childrenInline()) |
1777 return toLayoutBlockFlow(this); | 1694 return toLayoutBlockFlow(this); |
1778 for (LayoutObject* child = firstChild(); child && !child->isFloatingOrOutOfF
lowPositioned() && child->isLayoutBlockFlow(); child = toLayoutBlock(child)->fir
stChild()) { | 1695 for (LayoutObject* child = firstChild(); child && !child->isFloatingOrOutOfF
lowPositioned() && child->isLayoutBlockFlow(); child = toLayoutBlock(child)->fir
stChild()) { |
1779 if (child->childrenInline()) | 1696 if (child->childrenInline()) |
1780 return toLayoutBlockFlow(child); | 1697 return toLayoutBlockFlow(child); |
1781 } | 1698 } |
1782 return nullptr; | 1699 return nullptr; |
1783 } | 1700 } |
1784 | 1701 |
1785 void LayoutBlock::childBecameNonInline(LayoutObject*) | |
1786 { | |
1787 makeChildrenNonInline(); | |
1788 if (isAnonymousBlock() && parent() && parent()->isLayoutBlock()) | |
1789 toLayoutBlock(parent())->removeLeftoverAnonymousBlock(this); | |
1790 // |this| may be dead here | |
1791 } | |
1792 | |
1793 void LayoutBlock::updateHitTestResult(HitTestResult& result, const LayoutPoint&
point) | 1702 void LayoutBlock::updateHitTestResult(HitTestResult& result, const LayoutPoint&
point) |
1794 { | 1703 { |
1795 if (result.innerNode()) | 1704 if (result.innerNode()) |
1796 return; | 1705 return; |
1797 | 1706 |
1798 if (Node* n = nodeForHitTest()) | 1707 if (Node* n = nodeForHitTest()) |
1799 result.setNodeAndPosition(n, point); | 1708 result.setNodeAndPosition(n, point); |
1800 } | 1709 } |
1801 | 1710 |
1802 // An inline-block uses its inlineBox as the inlineBoxWrapper, | 1711 // An inline-block uses its inlineBox as the inlineBoxWrapper, |
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2079 for (TrackedLayoutBoxListHashSet::const_iterator it = positionedDescenda
ntSet->begin(); it != end; ++it) { | 1988 for (TrackedLayoutBoxListHashSet::const_iterator it = positionedDescenda
ntSet->begin(); it != end; ++it) { |
2080 LayoutBox* currBox = *it; | 1989 LayoutBox* currBox = *it; |
2081 ASSERT(!currBox->needsLayout()); | 1990 ASSERT(!currBox->needsLayout()); |
2082 } | 1991 } |
2083 } | 1992 } |
2084 } | 1993 } |
2085 | 1994 |
2086 #endif | 1995 #endif |
2087 | 1996 |
2088 } // namespace blink | 1997 } // namespace blink |
OLD | NEW |