| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 881 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 892 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); | 892 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); |
| 893 FloatingObjectSetIterator end = floatingObjectSet.end(); | 893 FloatingObjectSetIterator end = floatingObjectSet.end(); |
| 894 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end
; ++it) { | 894 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end
; ++it) { |
| 895 FloatingObject* floatingObject = it->get(); | 895 FloatingObject* floatingObject = it->get(); |
| 896 if (!floatingObject->isDescendant()) | 896 if (!floatingObject->isDescendant()) |
| 897 oldIntrudingFloatSet.add(floatingObject->renderer()); | 897 oldIntrudingFloatSet.add(floatingObject->renderer()); |
| 898 } | 898 } |
| 899 } | 899 } |
| 900 | 900 |
| 901 // Inline blocks are covered by the isReplaced() check in the avoidFloats me
thod. | 901 // Inline blocks are covered by the isReplaced() check in the avoidFloats me
thod. |
| 902 if (avoidsFloats() || isDocumentElement() || isRenderView() || isFloatingOrO
utOfFlowPositioned() || isTableCell()) { | 902 if (avoidsOrIgnoresFloats() || isRenderView()) { |
| 903 if (m_floatingObjects) { | 903 if (m_floatingObjects) { |
| 904 m_floatingObjects->clear(); | 904 m_floatingObjects->clear(); |
| 905 } | 905 } |
| 906 if (!oldIntrudingFloatSet.isEmpty()) | 906 if (!oldIntrudingFloatSet.isEmpty()) |
| 907 markAllDescendantsWithFloatsForLayout(); | 907 markAllDescendantsWithFloatsForLayout(); |
| 908 return; | 908 return; |
| 909 } | 909 } |
| 910 | 910 |
| 911 RendererToFloatInfoMap floatMap; | 911 RendererToFloatInfoMap floatMap; |
| 912 | 912 |
| 913 if (m_floatingObjects) { | 913 if (m_floatingObjects) { |
| 914 if (childrenInline()) | 914 if (childrenInline()) |
| 915 m_floatingObjects->moveAllToFloatInfoMap(floatMap); | 915 m_floatingObjects->moveAllToFloatInfoMap(floatMap); |
| 916 else | 916 else |
| 917 m_floatingObjects->clear(); | 917 m_floatingObjects->clear(); |
| 918 } | 918 } |
| 919 | 919 |
| 920 // We should not process floats if the parent node is not a RenderBlockFlow.
Otherwise, we will add | 920 // We should not process floats if the parent node is not a RenderBlockFlow.
Otherwise, we will add |
| 921 // floats in an invalid context. This will cause a crash arising from a bad
cast on the parent. | 921 // floats in an invalid context. This will cause a crash arising from a bad
cast on the parent. |
| 922 // See <rdar://problem/8049753>, where float property is applied on a text n
ode in a SVG. | 922 // See <rdar://problem/8049753>, where float property is applied on a text n
ode in a SVG. |
| 923 if (!parent() || !parent()->isRenderBlockFlow()) | 923 if (!parent() || !parent()->isRenderBlockFlow()) |
| 924 return; | 924 return; |
| 925 | 925 |
| 926 // Attempt to locate a previous sibling with overhanging floats. We skip any
elements that | 926 // Attempt to locate a previous sibling with overhanging floats. We skip any
elements that |
| 927 // may have shifted to avoid floats, and any objects whose floats cannot int
eract with objects | 927 // may have shifted to avoid floats, and any objects whose floats cannot int
eract with objects |
| 928 // outside it (i.e. objects that create a new block formatting context). | 928 // outside it (i.e. objects that create a new block formatting context). |
| 929 RenderBlockFlow* parentBlockFlow = toRenderBlockFlow(parent()); | 929 RenderBlockFlow* parentBlockFlow = toRenderBlockFlow(parent()); |
| 930 bool parentHasFloats = false; | 930 bool parentHasFloats = false; |
| 931 RenderObject* prev = previousSibling(); | 931 RenderObject* prev = previousSibling(); |
| 932 while (prev && (!prev->isBox() || !prev->isRenderBlock() || toRenderBlock(pr
ev)->avoidsFloats() || toRenderBlock(prev)->createsBlockFormattingContext())) { | 932 while (prev && (!prev->isBox() || !prev->isRenderBlock() || toRenderBlock(pr
ev)->avoidsOrIgnoresFloats())) { |
| 933 if (prev->isFloating()) | 933 if (prev->isFloating()) |
| 934 parentHasFloats = true; | 934 parentHasFloats = true; |
| 935 prev = prev->previousSibling(); | 935 prev = prev->previousSibling(); |
| 936 } | 936 } |
| 937 | 937 |
| 938 // First add in floats from the parent. Self-collapsing blocks let their par
ent track any floats that intrude into | 938 // First add in floats from the parent. Self-collapsing blocks let their par
ent track any floats that intrude into |
| 939 // them (as opposed to floats they contain themselves) so check for those he
re too. | 939 // them (as opposed to floats they contain themselves) so check for those he
re too. |
| 940 LayoutUnit logicalTopOffset = logicalTop(); | 940 LayoutUnit logicalTopOffset = logicalTop(); |
| 941 bool parentHasIntrudingFloats = !parentHasFloats && (!prev || toRenderBlockF
low(prev)->isSelfCollapsingBlock()) && parentBlockFlow->lowestFloatLogicalBottom
() > logicalTopOffset; | 941 bool parentHasIntrudingFloats = !parentHasFloats && (!prev || toRenderBlockF
low(prev)->isSelfCollapsingBlock()) && parentBlockFlow->lowestFloatLogicalBottom
() > logicalTopOffset; |
| 942 if (parentHasFloats || parentHasIntrudingFloats) | 942 if (parentHasFloats || parentHasIntrudingFloats) |
| (...skipping 888 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1831 | 1831 |
| 1832 void RenderBlockFlow::markSiblingsWithFloatsForLayout(RenderBox* floatToRemove) | 1832 void RenderBlockFlow::markSiblingsWithFloatsForLayout(RenderBox* floatToRemove) |
| 1833 { | 1833 { |
| 1834 if (!m_floatingObjects) | 1834 if (!m_floatingObjects) |
| 1835 return; | 1835 return; |
| 1836 | 1836 |
| 1837 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); | 1837 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); |
| 1838 FloatingObjectSetIterator end = floatingObjectSet.end(); | 1838 FloatingObjectSetIterator end = floatingObjectSet.end(); |
| 1839 | 1839 |
| 1840 for (RenderObject* next = nextSibling(); next; next = next->nextSibling()) { | 1840 for (RenderObject* next = nextSibling(); next; next = next->nextSibling()) { |
| 1841 if (!next->isRenderBlockFlow() || next->isFloatingOrOutOfFlowPositioned(
) || toRenderBlockFlow(next)->avoidsFloats()) | 1841 if (!next->isRenderBlockFlow() || toRenderBlockFlow(next)->avoidsOrIgnor
esFloats()) |
| 1842 continue; | 1842 continue; |
| 1843 | 1843 |
| 1844 RenderBlockFlow* nextBlock = toRenderBlockFlow(next); | 1844 RenderBlockFlow* nextBlock = toRenderBlockFlow(next); |
| 1845 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end
; ++it) { | 1845 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end
; ++it) { |
| 1846 RenderBox* floatingBox = (*it)->renderer(); | 1846 RenderBox* floatingBox = (*it)->renderer(); |
| 1847 if (floatToRemove && floatingBox != floatToRemove) | 1847 if (floatToRemove && floatingBox != floatToRemove) |
| 1848 continue; | 1848 continue; |
| 1849 if (nextBlock->containsFloat(floatingBox)) | 1849 if (nextBlock->containsFloat(floatingBox)) |
| 1850 nextBlock->markAllDescendantsWithFloatsForLayout(floatingBox); | 1850 nextBlock->markAllDescendantsWithFloatsForLayout(floatingBox); |
| 1851 } | 1851 } |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1910 } | 1910 } |
| 1911 | 1911 |
| 1912 void RenderBlockFlow::createFloatingObjects() | 1912 void RenderBlockFlow::createFloatingObjects() |
| 1913 { | 1913 { |
| 1914 m_floatingObjects = adoptPtr(new FloatingObjects(this, isHorizontalWritingMo
de())); | 1914 m_floatingObjects = adoptPtr(new FloatingObjects(this, isHorizontalWritingMo
de())); |
| 1915 } | 1915 } |
| 1916 | 1916 |
| 1917 void RenderBlockFlow::styleWillChange(StyleDifference diff, const RenderStyle& n
ewStyle) | 1917 void RenderBlockFlow::styleWillChange(StyleDifference diff, const RenderStyle& n
ewStyle) |
| 1918 { | 1918 { |
| 1919 RenderStyle* oldStyle = style(); | 1919 RenderStyle* oldStyle = style(); |
| 1920 s_canPropagateFloatIntoSibling = oldStyle ? !isFloatingOrOutOfFlowPositioned
() && !avoidsFloats() : false; | 1920 s_canPropagateFloatIntoSibling = oldStyle ? !avoidsOrIgnoresFloats() : false
; |
| 1921 if (oldStyle && parent() && diff.needsFullLayout() && oldStyle->position() !
= newStyle.position() | 1921 if (oldStyle && parent() && diff.needsFullLayout() && oldStyle->position() !
= newStyle.position() |
| 1922 && containsFloats() && !isFloating() && !isOutOfFlowPositioned() && newS
tyle.hasOutOfFlowPosition()) | 1922 && containsFloats() && !isFloating() && !isOutOfFlowPositioned() && newS
tyle.hasOutOfFlowPosition()) |
| 1923 markAllDescendantsWithFloatsForLayout(); | 1923 markAllDescendantsWithFloatsForLayout(); |
| 1924 | 1924 |
| 1925 RenderBlock::styleWillChange(diff, newStyle); | 1925 RenderBlock::styleWillChange(diff, newStyle); |
| 1926 } | 1926 } |
| 1927 | 1927 |
| 1928 void RenderBlockFlow::styleDidChange(StyleDifference diff, const RenderStyle* ol
dStyle) | 1928 void RenderBlockFlow::styleDidChange(StyleDifference diff, const RenderStyle* ol
dStyle) |
| 1929 { | 1929 { |
| 1930 RenderBlock::styleDidChange(diff, oldStyle); | 1930 RenderBlock::styleDidChange(diff, oldStyle); |
| 1931 | 1931 |
| 1932 // After our style changed, if we lose our ability to propagate floats into
next sibling | 1932 // After our style changed, if we lose our ability to propagate floats into
next sibling |
| 1933 // blocks, then we need to find the top most parent containing that overhang
ing float and | 1933 // blocks, then we need to find the top most parent containing that overhang
ing float and |
| 1934 // then mark its descendants with floats for layout and clear all floats fro
m its next | 1934 // then mark its descendants with floats for layout and clear all floats fro
m its next |
| 1935 // sibling blocks that exist in our floating objects list. See bug 56299 and
62875. | 1935 // sibling blocks that exist in our floating objects list. See bug 56299 and
62875. |
| 1936 bool canPropagateFloatIntoSibling = !isFloatingOrOutOfFlowPositioned() && !a
voidsFloats(); | 1936 bool canPropagateFloatIntoSibling = !avoidsOrIgnoresFloats(); |
| 1937 if (diff.needsFullLayout() && s_canPropagateFloatIntoSibling && !canPropagat
eFloatIntoSibling && hasOverhangingFloats()) { | 1937 if (diff.needsFullLayout() && s_canPropagateFloatIntoSibling && !canPropagat
eFloatIntoSibling && hasOverhangingFloats()) { |
| 1938 RenderBlockFlow* parentBlockFlow = this; | 1938 RenderBlockFlow* parentBlockFlow = this; |
| 1939 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); | 1939 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); |
| 1940 FloatingObjectSetIterator end = floatingObjectSet.end(); | 1940 FloatingObjectSetIterator end = floatingObjectSet.end(); |
| 1941 | 1941 |
| 1942 for (RenderObject* curr = parent(); curr && !curr->isRenderView(); curr
= curr->parent()) { | 1942 for (RenderObject* curr = parent(); curr && !curr->isRenderView(); curr
= curr->parent()) { |
| 1943 if (curr->isRenderBlockFlow()) { | 1943 if (curr->isRenderBlockFlow()) { |
| 1944 RenderBlockFlow* currBlock = toRenderBlockFlow(curr); | 1944 RenderBlockFlow* currBlock = toRenderBlockFlow(curr); |
| 1945 | 1945 |
| 1946 if (currBlock->hasOverhangingFloats()) { | 1946 if (currBlock->hasOverhangingFloats()) { |
| (...skipping 756 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2703 void RenderBlockFlow::setPaginationStrut(LayoutUnit strut) | 2703 void RenderBlockFlow::setPaginationStrut(LayoutUnit strut) |
| 2704 { | 2704 { |
| 2705 if (!m_rareData) { | 2705 if (!m_rareData) { |
| 2706 if (!strut) | 2706 if (!strut) |
| 2707 return; | 2707 return; |
| 2708 m_rareData = adoptPtrWillBeNoop(new RenderBlockFlowRareData(this)); | 2708 m_rareData = adoptPtrWillBeNoop(new RenderBlockFlowRareData(this)); |
| 2709 } | 2709 } |
| 2710 m_rareData->m_paginationStrut = strut; | 2710 m_rareData->m_paginationStrut = strut; |
| 2711 } | 2711 } |
| 2712 | 2712 |
| 2713 bool RenderBlockFlow::avoidsFloats() const | |
| 2714 { | |
| 2715 // Floats can't intrude into our box if we have a non-auto column count or w
idth. | |
| 2716 // Note: we need to use RenderBox::avoidsFloats here since RenderBlock::avoi
dsFloats is always true. | |
| 2717 return RenderBox::avoidsFloats() || !style()->hasAutoColumnCount() || !style
()->hasAutoColumnWidth(); | |
| 2718 } | |
| 2719 | |
| 2720 LayoutUnit RenderBlockFlow::logicalLeftSelectionOffset(const RenderBlock* rootBl
ock, LayoutUnit position) const | 2713 LayoutUnit RenderBlockFlow::logicalLeftSelectionOffset(const RenderBlock* rootBl
ock, LayoutUnit position) const |
| 2721 { | 2714 { |
| 2722 LayoutUnit logicalLeft = logicalLeftOffsetForLine(position, false); | 2715 LayoutUnit logicalLeft = logicalLeftOffsetForLine(position, false); |
| 2723 if (logicalLeft == logicalLeftOffsetForContent()) | 2716 if (logicalLeft == logicalLeftOffsetForContent()) |
| 2724 return RenderBlock::logicalLeftSelectionOffset(rootBlock, position); | 2717 return RenderBlock::logicalLeftSelectionOffset(rootBlock, position); |
| 2725 | 2718 |
| 2726 const RenderBlock* cb = this; | 2719 const RenderBlock* cb = this; |
| 2727 while (cb != rootBlock) { | 2720 while (cb != rootBlock) { |
| 2728 logicalLeft += cb->logicalLeft(); | 2721 logicalLeft += cb->logicalLeft(); |
| 2729 cb = cb->containingBlock(); | 2722 cb = cb->containingBlock(); |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2844 FrameView* frameView = document().view(); | 2837 FrameView* frameView = document().view(); |
| 2845 LayoutUnit top = (style()->position() == FixedPosition) ? 0 : frameView->scr
ollOffset().height(); | 2838 LayoutUnit top = (style()->position() == FixedPosition) ? 0 : frameView->scr
ollOffset().height(); |
| 2846 int visibleHeight = frameView->visibleContentRect(IncludeScrollbars).height(
); | 2839 int visibleHeight = frameView->visibleContentRect(IncludeScrollbars).height(
); |
| 2847 if (height() < visibleHeight) | 2840 if (height() < visibleHeight) |
| 2848 top += (visibleHeight - height()) / 2; | 2841 top += (visibleHeight - height()) / 2; |
| 2849 setY(top); | 2842 setY(top); |
| 2850 dialog->setCentered(top); | 2843 dialog->setCentered(top); |
| 2851 } | 2844 } |
| 2852 | 2845 |
| 2853 } // namespace blink | 2846 } // namespace blink |
| OLD | NEW |