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

Side by Side Diff: Source/core/rendering/RenderBlockFlow.cpp

Issue 196533012: Make LayoutState always be RAII (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Updated to ToT Created 6 years, 9 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 | Annotate | Revision Log
« no previous file with comments | « Source/core/rendering/RenderBlock.cpp ('k') | Source/core/rendering/RenderBox.cpp » ('j') | 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) 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 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 return; 294 return;
295 295
296 SubtreeLayoutScope layoutScope(this); 296 SubtreeLayoutScope layoutScope(this);
297 297
298 // Multiple passes might be required for column and pagination based layout 298 // Multiple passes might be required for column and pagination based layout
299 // In the case of the old column code the number of passes will only be two 299 // In the case of the old column code the number of passes will only be two
300 // however, in the newer column code the number of passes could equal the 300 // however, in the newer column code the number of passes could equal the
301 // number of columns. 301 // number of columns.
302 bool done = false; 302 bool done = false;
303 LayoutUnit pageLogicalHeight = 0; 303 LayoutUnit pageLogicalHeight = 0;
304 LayoutRepainter repainter(*this, checkForRepaintDuringLayout());
304 while (!done) 305 while (!done)
305 done = layoutBlockFlow(relayoutChildren, pageLogicalHeight, layoutScope) ; 306 done = layoutBlockFlow(relayoutChildren, pageLogicalHeight, layoutScope) ;
307
308 fitBorderToLinesIfNeeded();
309
310 RenderView* renderView = view();
311 if (renderView->layoutState()->m_pageLogicalHeight)
312 setPageLogicalOffset(renderView->layoutState()->pageLogicalOffset(*this, logicalTop()));
313
314 updateLayerTransform();
315
316 // Update our scroll information if we're overflow:auto/scroll/hidden now th at we know if
317 // we overflow or not.
318 updateScrollInfoAfterLayout();
319
320 // Repaint with our new bounds if they are different from our old bounds.
321 bool didFullRepaint = repainter.repaintAfterLayout();
322 if (!didFullRepaint && m_repaintLogicalTop != m_repaintLogicalBottom && (sty le()->visibility() == VISIBLE || enclosingLayer()->hasVisibleContent())) {
323 if (RuntimeEnabledFeatures::repaintAfterLayoutEnabled())
324 setShouldRepaintOverflow(true);
325 else
326 repaintOverflow();
327 }
328 clearNeedsLayout();
306 } 329 }
307 330
308 inline bool RenderBlockFlow::layoutBlockFlow(bool relayoutChildren, LayoutUnit & pageLogicalHeight, SubtreeLayoutScope& layoutScope) 331 inline bool RenderBlockFlow::layoutBlockFlow(bool relayoutChildren, LayoutUnit & pageLogicalHeight, SubtreeLayoutScope& layoutScope)
309 { 332 {
310 LayoutRepainter repainter(*this, checkForRepaintDuringLayout());
311
312 LayoutUnit oldLeft = logicalLeft(); 333 LayoutUnit oldLeft = logicalLeft();
313 if (updateLogicalWidthAndColumnWidth()) 334 if (updateLogicalWidthAndColumnWidth())
314 relayoutChildren = true; 335 relayoutChildren = true;
315 336
316 rebuildFloatsFromIntruding(); 337 rebuildFloatsFromIntruding();
317 338
318 bool pageLogicalHeightChanged = false; 339 bool pageLogicalHeightChanged = false;
319 bool hasSpecifiedPageLogicalHeight = false; 340 bool hasSpecifiedPageLogicalHeight = false;
320 checkForPaginationLogicalHeightChange(pageLogicalHeight, pageLogicalHeightCh anged, hasSpecifiedPageLogicalHeight); 341 checkForPaginationLogicalHeightChange(pageLogicalHeight, pageLogicalHeightCh anged, hasSpecifiedPageLogicalHeight);
321 342
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
361 else 382 else
362 layoutBlockChildren(relayoutChildren, maxFloatLogicalBottom, layoutScope , beforeEdge, afterEdge); 383 layoutBlockChildren(relayoutChildren, maxFloatLogicalBottom, layoutScope , beforeEdge, afterEdge);
363 384
364 // Expand our intrinsic height to encompass floats. 385 // Expand our intrinsic height to encompass floats.
365 if (lowestFloatLogicalBottom() > (logicalHeight() - afterEdge) && createsBlo ckFormattingContext()) 386 if (lowestFloatLogicalBottom() > (logicalHeight() - afterEdge) && createsBlo ckFormattingContext())
366 setLogicalHeight(lowestFloatLogicalBottom() + afterEdge); 387 setLogicalHeight(lowestFloatLogicalBottom() + afterEdge);
367 388
368 if (RenderMultiColumnFlowThread* flowThread = multiColumnFlowThread()) { 389 if (RenderMultiColumnFlowThread* flowThread = multiColumnFlowThread()) {
369 if (flowThread->recalculateColumnHeights()) { 390 if (flowThread->recalculateColumnHeights()) {
370 setChildNeedsLayout(MarkOnlyThis); 391 setChildNeedsLayout(MarkOnlyThis);
371 statePusher.pop();
372 return false; 392 return false;
373 } 393 }
374 } else if (hasColumns()) { 394 } else if (hasColumns()) {
375 OwnPtr<RenderOverflow> savedOverflow = m_overflow.release(); 395 OwnPtr<RenderOverflow> savedOverflow = m_overflow.release();
376 if (childrenInline()) 396 if (childrenInline())
377 addOverflowFromInlineChildren(); 397 addOverflowFromInlineChildren();
378 else 398 else
379 addOverflowFromBlockChildren(); 399 addOverflowFromBlockChildren();
380 LayoutUnit layoutOverflowLogicalBottom = (isHorizontalWritingMode() ? la youtOverflowRect().maxY() : layoutOverflowRect().maxX()) - borderBefore() - padd ingBefore(); 400 LayoutUnit layoutOverflowLogicalBottom = (isHorizontalWritingMode() ? la youtOverflowRect().maxY() : layoutOverflowRect().maxX()) - borderBefore() - padd ingBefore();
381 m_overflow = savedOverflow.release(); 401 m_overflow = savedOverflow.release();
382 402
383 if (!hasSpecifiedPageLogicalHeight && shouldRelayoutForPagination(pageLo gicalHeight, layoutOverflowLogicalBottom)) { 403 if (!hasSpecifiedPageLogicalHeight && shouldRelayoutForPagination(pageLo gicalHeight, layoutOverflowLogicalBottom)) {
384 statePusher.pop();
385 setEverHadLayout(true); 404 setEverHadLayout(true);
386 return false; 405 return false;
387 } 406 }
388 407
389 setColumnCountAndHeight(ceilf(layoutOverflowLogicalBottom.toFloat() / pa geLogicalHeight.toFloat()), pageLogicalHeight.toFloat()); 408 setColumnCountAndHeight(ceilf(layoutOverflowLogicalBottom.toFloat() / pa geLogicalHeight.toFloat()), pageLogicalHeight.toFloat());
390 } 409 }
391 410
392 if (shouldBreakAtLineToAvoidWidow()) { 411 if (shouldBreakAtLineToAvoidWidow()) {
393 statePusher.pop();
394 setEverHadLayout(true); 412 setEverHadLayout(true);
395 return false; 413 return false;
396 } 414 }
397 415
398 // Calculate our new height. 416 // Calculate our new height.
399 LayoutUnit oldHeight = logicalHeight(); 417 LayoutUnit oldHeight = logicalHeight();
400 LayoutUnit oldClientAfterEdge = clientLogicalBottom(); 418 LayoutUnit oldClientAfterEdge = clientLogicalBottom();
401 419
402 if (isRenderFlowThread()) 420 if (isRenderFlowThread())
403 toRenderFlowThread(this)->applyBreakAfterContent(oldClientAfterEdge); 421 toRenderFlowThread(this)->applyBreakAfterContent(oldClientAfterEdge);
(...skipping 17 matching lines...) Expand all
421 if (heightChanged) 439 if (heightChanged)
422 relayoutChildren = true; 440 relayoutChildren = true;
423 441
424 layoutPositionedObjects(relayoutChildren || isRoot(), oldLeft != logicalLeft () ? ForcedLayoutAfterContainingBlockMoved : DefaultLayout); 442 layoutPositionedObjects(relayoutChildren || isRoot(), oldLeft != logicalLeft () ? ForcedLayoutAfterContainingBlockMoved : DefaultLayout);
425 443
426 updateRegionsAndShapesAfterChildLayout(flowThread, heightChanged); 444 updateRegionsAndShapesAfterChildLayout(flowThread, heightChanged);
427 445
428 // Add overflow from children (unless we're multi-column, since in that case all our child overflow is clipped anyway). 446 // Add overflow from children (unless we're multi-column, since in that case all our child overflow is clipped anyway).
429 computeOverflow(oldClientAfterEdge); 447 computeOverflow(oldClientAfterEdge);
430 448
431 statePusher.pop();
432
433 fitBorderToLinesIfNeeded();
434
435 RenderView* renderView = view();
436 if (renderView->layoutState()->m_pageLogicalHeight)
437 setPageLogicalOffset(renderView->layoutState()->pageLogicalOffset(*this, logicalTop()));
438
439 updateLayerTransform();
440
441 // Update our scroll information if we're overflow:auto/scroll/hidden now th at we know if
442 // we overflow or not.
443 updateScrollInfoAfterLayout();
444
445 // Repaint with our new bounds if they are different from our old bounds.
446 bool didFullRepaint = repainter.repaintAfterLayout();
447 if (!didFullRepaint && m_repaintLogicalTop != m_repaintLogicalBottom && (sty le()->visibility() == VISIBLE || enclosingLayer()->hasVisibleContent())) {
448 if (RuntimeEnabledFeatures::repaintAfterLayoutEnabled())
449 setShouldRepaintOverflow(true);
450 else
451 repaintOverflow();
452 }
453
454 clearNeedsLayout();
455 return true; 449 return true;
456 } 450 }
457 451
458 void RenderBlockFlow::determineLogicalLeftPositionForChild(RenderBox* child, App lyLayoutDeltaMode applyDelta) 452 void RenderBlockFlow::determineLogicalLeftPositionForChild(RenderBox* child, App lyLayoutDeltaMode applyDelta)
459 { 453 {
460 LayoutUnit startPosition = borderStart() + paddingStart(); 454 LayoutUnit startPosition = borderStart() + paddingStart();
461 if (style()->shouldPlaceBlockDirectionScrollbarOnLogicalLeft()) 455 if (style()->shouldPlaceBlockDirectionScrollbarOnLogicalLeft())
462 startPosition -= verticalScrollbarWidth(); 456 startPosition -= verticalScrollbarWidth();
463 LayoutUnit totalAvailableLogicalWidth = borderAndPaddingLogicalWidth() + ava ilableLogicalWidth(); 457 LayoutUnit totalAvailableLogicalWidth = borderAndPaddingLogicalWidth() + ava ilableLogicalWidth();
464 458
(...skipping 2357 matching lines...) Expand 10 before | Expand all | Expand 10 after
2822 RenderBlockFlow::RenderBlockFlowRareData& RenderBlockFlow::ensureRareData() 2816 RenderBlockFlow::RenderBlockFlowRareData& RenderBlockFlow::ensureRareData()
2823 { 2817 {
2824 if (m_rareData) 2818 if (m_rareData)
2825 return *m_rareData; 2819 return *m_rareData;
2826 2820
2827 m_rareData = adoptPtr(new RenderBlockFlowRareData(this)); 2821 m_rareData = adoptPtr(new RenderBlockFlowRareData(this));
2828 return *m_rareData; 2822 return *m_rareData;
2829 } 2823 }
2830 2824
2831 } // namespace WebCore 2825 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/rendering/RenderBlock.cpp ('k') | Source/core/rendering/RenderBox.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698