Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(260)

Side by Side Diff: Source/WebCore/rendering/RenderBlockLineLayout.cpp

Issue 9253026: Merge 103206 - Positioned Floats: Assertion hit in fast/block/positioning/positioned-float-layout... (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/912/
Patch Set: Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « LayoutTests/fast/block/positioning/resources/positioned-float-layout-after-image-load-2.html ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2000 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
3 * Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r ight reserved. 3 * Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r ight reserved.
4 * Copyright (C) 2010 Google Inc. All rights reserved. 4 * Copyright (C) 2010 Google Inc. All rights reserved.
5 * 5 *
6 * This library is free software; you can redistribute it and/or 6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public 7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either 8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version. 9 * version 2 of the License, or (at your option) any later version.
10 * 10 *
(...skipping 1824 matching lines...) Expand 10 before | Expand all | Expand 10 after
1835 // FIXME: The entire concept of the skipTrailingWhitespace function is flawed, s ince we really need to be building 1835 // FIXME: The entire concept of the skipTrailingWhitespace function is flawed, s ince we really need to be building
1836 // line boxes even for containers that may ultimately collapse away. Otherwise w e'll never get positioned 1836 // line boxes even for containers that may ultimately collapse away. Otherwise w e'll never get positioned
1837 // elements quite right. In other words, we need to build this function's work i nto the normal line 1837 // elements quite right. In other words, we need to build this function's work i nto the normal line
1838 // object iteration process. 1838 // object iteration process.
1839 // NB. this function will insert any floating elements that would otherwise 1839 // NB. this function will insert any floating elements that would otherwise
1840 // be skipped but it will not position them. 1840 // be skipped but it will not position them.
1841 void RenderBlock::LineBreaker::skipTrailingWhitespace(InlineIterator& iterator, const LineInfo& lineInfo) 1841 void RenderBlock::LineBreaker::skipTrailingWhitespace(InlineIterator& iterator, const LineInfo& lineInfo)
1842 { 1842 {
1843 while (!iterator.atEnd() && !requiresLineBox(iterator, lineInfo, TrailingWhi tespace)) { 1843 while (!iterator.atEnd() && !requiresLineBox(iterator, lineInfo, TrailingWhi tespace)) {
1844 RenderObject* object = iterator.m_obj; 1844 RenderObject* object = iterator.m_obj;
1845 if (object->isFloating()) { 1845 if (object->isPositioned())
1846 setStaticPositions(m_block, toRenderBox(object));
1847 else if (object->isFloating())
1846 m_block->insertFloatingObject(toRenderBox(object)); 1848 m_block->insertFloatingObject(toRenderBox(object));
1847 } else if (object->isPositioned())
1848 setStaticPositions(m_block, toRenderBox(object));
1849 iterator.increment(); 1849 iterator.increment();
1850 } 1850 }
1851 } 1851 }
1852 1852
1853 void RenderBlock::LineBreaker::skipLeadingWhitespace(InlineBidiResolver& resolve r, LineInfo& lineInfo, 1853 void RenderBlock::LineBreaker::skipLeadingWhitespace(InlineBidiResolver& resolve r, LineInfo& lineInfo,
1854 FloatingObject* lastFloatFr omPreviousLine, LineWidth& width) 1854 FloatingObject* lastFloatFr omPreviousLine, LineWidth& width)
1855 { 1855 {
1856 while (!resolver.position().atEnd() && !requiresLineBox(resolver.position(), lineInfo, LeadingWhitespace)) { 1856 while (!resolver.position().atEnd() && !requiresLineBox(resolver.position(), lineInfo, LeadingWhitespace)) {
1857 RenderObject* object = resolver.position().m_obj; 1857 RenderObject* object = resolver.position().m_obj;
1858 if (object->isFloating()) 1858 if (object->isPositioned())
1859 setStaticPositions(m_block, toRenderBox(object));
1860 else if (object->isFloating())
1859 m_block->positionNewFloatOnLine(m_block->insertFloatingObject(toRend erBox(object)), lastFloatFromPreviousLine, lineInfo, width); 1861 m_block->positionNewFloatOnLine(m_block->insertFloatingObject(toRend erBox(object)), lastFloatFromPreviousLine, lineInfo, width);
1860 else if (object->isPositioned())
1861 setStaticPositions(m_block, toRenderBox(object));
1862 resolver.increment(); 1862 resolver.increment();
1863 } 1863 }
1864 resolver.commitExplicitEmbedding(); 1864 resolver.commitExplicitEmbedding();
1865 } 1865 }
1866 1866
1867 // This is currently just used for list markers and inline flows that have line boxes. Neither should 1867 // This is currently just used for list markers and inline flows that have line boxes. Neither should
1868 // have an effect on whitespace at the start of the line. 1868 // have an effect on whitespace at the start of the line.
1869 static bool shouldSkipWhitespaceAfterStartObject(RenderBlock* block, RenderObjec t* o, LineMidpointState& lineMidpointState) 1869 static bool shouldSkipWhitespaceAfterStartObject(RenderBlock* block, RenderObjec t* o, LineMidpointState& lineMidpointState)
1870 { 1870 {
1871 RenderObject* next = bidiNextSkippingEmptyInlines(block, o); 1871 RenderObject* next = bidiNextSkippingEmptyInlines(block, o);
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after
2125 lineInfo.setEmpty(false, m_block, &width); 2125 lineInfo.setEmpty(false, m_block, &width);
2126 trailingObjects.clear(); 2126 trailingObjects.clear();
2127 lineInfo.setPreviousLineBrokeCleanly(true); 2127 lineInfo.setPreviousLineBrokeCleanly(true);
2128 2128
2129 if (!lineInfo.isEmpty()) 2129 if (!lineInfo.isEmpty())
2130 m_clear = current.m_obj->style()->clear(); 2130 m_clear = current.m_obj->style()->clear();
2131 } 2131 }
2132 goto end; 2132 goto end;
2133 } 2133 }
2134 2134
2135 if (current.m_obj->isFloating()) { 2135 if (current.m_obj->isPositioned()) {
2136 RenderBox* floatBox = toRenderBox(current.m_obj);
2137 FloatingObject* f = m_block->insertFloatingObject(floatBox);
2138 // check if it fits in the current line.
2139 // If it does, position it now, otherwise, position
2140 // it after moving to next line (in newLine() func)
2141 if (floatsFitOnLine && width.fitsOnLine(m_block->logicalWidthForFloa t(f))) {
2142 m_block->positionNewFloatOnLine(f, lastFloatFromPreviousLine, li neInfo, width);
2143 if (lBreak.m_obj == current.m_obj) {
2144 ASSERT(!lBreak.m_pos);
2145 lBreak.increment();
2146 }
2147 } else
2148 floatsFitOnLine = false;
2149 } else if (current.m_obj->isPositioned()) {
2150 // If our original display wasn't an inline type, then we can 2136 // If our original display wasn't an inline type, then we can
2151 // go ahead and determine our static inline position now. 2137 // go ahead and determine our static inline position now.
2152 RenderBox* box = toRenderBox(current.m_obj); 2138 RenderBox* box = toRenderBox(current.m_obj);
2153 bool isInlineType = box->style()->isOriginalDisplayInlineType(); 2139 bool isInlineType = box->style()->isOriginalDisplayInlineType();
2154 if (!isInlineType) 2140 if (!isInlineType)
2155 m_block->setStaticInlinePositionForChild(box, m_block->logicalHe ight(), m_block->startOffsetForContent(m_block->logicalHeight())); 2141 m_block->setStaticInlinePositionForChild(box, m_block->logicalHe ight(), m_block->startOffsetForContent(m_block->logicalHeight()));
2156 else { 2142 else {
2157 // If our original display was an INLINE type, then we can go ah ead 2143 // If our original display was an INLINE type, then we can go ah ead
2158 // and determine our static y position now. 2144 // and determine our static y position now.
2159 box->layer()->setStaticBlockPosition(m_block->logicalHeight()); 2145 box->layer()->setStaticBlockPosition(m_block->logicalHeight());
2160 } 2146 }
2161 2147
2162 // If we're ignoring spaces, we have to stop and include this object and 2148 // If we're ignoring spaces, we have to stop and include this object and
2163 // then start ignoring spaces again. 2149 // then start ignoring spaces again.
2164 if (isInlineType || current.m_obj->container()->isRenderInline()) { 2150 if (isInlineType || current.m_obj->container()->isRenderInline()) {
2165 if (ignoringSpaces) { 2151 if (ignoringSpaces) {
2166 ignoreStart.m_obj = current.m_obj; 2152 ignoreStart.m_obj = current.m_obj;
2167 ignoreStart.m_pos = 0; 2153 ignoreStart.m_pos = 0;
2168 addMidpoint(lineMidpointState, ignoreStart); // Stop ignorin g spaces. 2154 addMidpoint(lineMidpointState, ignoreStart); // Stop ignorin g spaces.
2169 addMidpoint(lineMidpointState, ignoreStart); // Start ignori ng again. 2155 addMidpoint(lineMidpointState, ignoreStart); // Start ignori ng again.
2170 } 2156 }
2171 trailingObjects.appendBoxIfNeeded(box); 2157 trailingObjects.appendBoxIfNeeded(box);
2172 } else 2158 } else
2173 m_positionedObjects.append(box); 2159 m_positionedObjects.append(box);
2160 } else if (current.m_obj->isFloating()) {
2161 RenderBox* floatBox = toRenderBox(current.m_obj);
2162 FloatingObject* f = m_block->insertFloatingObject(floatBox);
2163 // check if it fits in the current line.
2164 // If it does, position it now, otherwise, position
2165 // it after moving to next line (in newLine() func)
2166 if (floatsFitOnLine && width.fitsOnLine(m_block->logicalWidthForFloa t(f))) {
2167 m_block->positionNewFloatOnLine(f, lastFloatFromPreviousLine, li neInfo, width);
2168 if (lBreak.m_obj == current.m_obj) {
2169 ASSERT(!lBreak.m_pos);
2170 lBreak.increment();
2171 }
2172 } else
2173 floatsFitOnLine = false;
2174 } else if (current.m_obj->isRenderInline()) { 2174 } else if (current.m_obj->isRenderInline()) {
2175 // Right now, we should only encounter empty inlines here. 2175 // Right now, we should only encounter empty inlines here.
2176 ASSERT(!current.m_obj->firstChild()); 2176 ASSERT(!current.m_obj->firstChild());
2177 2177
2178 RenderInline* flowBox = toRenderInline(current.m_obj); 2178 RenderInline* flowBox = toRenderInline(current.m_obj);
2179 2179
2180 // Now that some inline flows have line boxes, if we are already ign oring spaces, we need 2180 // Now that some inline flows have line boxes, if we are already ign oring spaces, we need
2181 // to make sure that we stop to include this object and then start i gnoring spaces again. 2181 // to make sure that we stop to include this object and then start i gnoring spaces again.
2182 // If this object is at the start of the line, we need to behave lik e list markers and 2182 // If this object is at the start of the line, we need to behave lik e list markers and
2183 // start ignoring spaces. 2183 // start ignoring spaces.
(...skipping 528 matching lines...) Expand 10 before | Expand all | Expand 10 after
2712 availableLogicalWidth = logicalRightOffsetForLine(logicalHeight(), false) - logicalLeft; 2712 availableLogicalWidth = logicalRightOffsetForLine(logicalHeight(), false) - logicalLeft;
2713 float totalLogicalWidth = logicalWidthForChild(child); 2713 float totalLogicalWidth = logicalWidthForChild(child);
2714 updateLogicalWidthForAlignment(textAlign, 0l, logicalLeft, totalLogicalWidth , availableLogicalWidth, 0); 2714 updateLogicalWidthForAlignment(textAlign, 0l, logicalLeft, totalLogicalWidth , availableLogicalWidth, 0);
2715 2715
2716 if (!style()->isLeftToRightDirection()) 2716 if (!style()->isLeftToRightDirection())
2717 return logicalWidth() - (logicalLeft + totalLogicalWidth); 2717 return logicalWidth() - (logicalLeft + totalLogicalWidth);
2718 return logicalLeft; 2718 return logicalLeft;
2719 } 2719 }
2720 2720
2721 } 2721 }
OLDNEW
« no previous file with comments | « LayoutTests/fast/block/positioning/resources/positioned-float-layout-after-image-load-2.html ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698