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

Side by Side Diff: third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp

Issue 2846923003: Fix regression in page_cycler_v2.tough_layout_cases (Closed)
Patch Set: bug 716385 Created 3 years, 7 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 | « no previous file | 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) 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 673 matching lines...) Expand 10 before | Expand all | Expand 10 after
684 // The logical top might be saturated for very large elements. Comparing 684 // The logical top might be saturated for very large elements. Comparing
685 // with the old logical top might then yield a false negative, as adding and 685 // with the old logical top might then yield a false negative, as adding and
686 // removing margins, borders etc. from a saturated number might yield 686 // removing margins, borders etc. from a saturated number might yield
687 // incorrect results. If this is the case, always mark for layout. 687 // incorrect results. If this is the case, always mark for layout.
688 mark_descendants_with_floats = true; 688 mark_descendants_with_floats = true;
689 } else if (!child.AvoidsFloats() || child.ShrinkToAvoidFloats()) { 689 } else if (!child.AvoidsFloats() || child.ShrinkToAvoidFloats()) {
690 // If an element might be affected by the presence of floats, then always 690 // If an element might be affected by the presence of floats, then always
691 // mark it for layout. 691 // mark it for layout.
692 LayoutUnit lowest_float = 692 LayoutUnit lowest_float =
693 std::max(previous_float_logical_bottom, LowestFloatLogicalBottom()); 693 std::max(previous_float_logical_bottom, LowestFloatLogicalBottom());
694 lowest_float = std::max(lowest_float, child.LowestFloatLogicalBottom());
695 if (lowest_float > new_logical_top) 694 if (lowest_float > new_logical_top)
696 mark_descendants_with_floats = true; 695 mark_descendants_with_floats = true;
697 } 696 }
698 697
699 if (mark_descendants_with_floats) 698 if (mark_descendants_with_floats)
700 child.MarkAllDescendantsWithFloatsForLayout(); 699 child.MarkAllDescendantsWithFloatsForLayout();
701 } 700 }
702 701
703 bool LayoutBlockFlow::PositionAndLayoutOnceIfNeeded( 702 bool LayoutBlockFlow::PositionAndLayoutOnceIfNeeded(
704 LayoutBox& child, 703 LayoutBox& child,
(...skipping 3005 matching lines...) Expand 10 before | Expand all | Expand 10 after
3710 bool is_paginated = View()->GetLayoutState()->IsPaginated(); 3709 bool is_paginated = View()->GetLayoutState()->IsPaginated();
3711 if (is_paginated && !ChildrenInline()) { 3710 if (is_paginated && !ChildrenInline()) {
3712 // Forced breaks are inserted at class A break points. Floats may be 3711 // Forced breaks are inserted at class A break points. Floats may be
3713 // affected by a break-after value on the previous in-flow sibling. 3712 // affected by a break-after value on the previous in-flow sibling.
3714 if (LayoutBox* previous_in_flow_box = child.PreviousInFlowSiblingBox()) { 3713 if (LayoutBox* previous_in_flow_box = child.PreviousInFlowSiblingBox()) {
3715 logical_top_margin_edge = ApplyForcedBreak( 3714 logical_top_margin_edge = ApplyForcedBreak(
3716 logical_top_margin_edge, previous_in_flow_box->BreakAfter()); 3715 logical_top_margin_edge, previous_in_flow_box->BreakAfter());
3717 } 3716 }
3718 } 3717 }
3719 3718
3719 LayoutUnit old_logical_top = child.LogicalTop();
3720 if (child.NeedsLayout()) { 3720 if (child.NeedsLayout()) {
3721 if (is_paginated) { 3721 if (is_paginated) {
3722 // Before we can lay out the float, we need to estimate a position for 3722 // Before we can lay out the float, we need to estimate a position for
3723 // it. In order to do that, we first need to know its block start margin. 3723 // it. In order to do that, we first need to know its block start margin.
3724 child.ComputeAndSetBlockDirectionMargins(this); 3724 child.ComputeAndSetBlockDirectionMargins(this);
3725 LayoutUnit margin_before = MarginBeforeForChild(child); 3725 LayoutUnit margin_before = MarginBeforeForChild(child);
3726 3726
3727 // We have found the highest possible position for the float, so we'll 3727 // We have found the highest possible position for the float, so we'll
3728 // lay out right there. Later on, we may be pushed further down by 3728 // lay out right there. Later on, we may be pushed further down by
3729 // adjacent floats which we don't fit beside, or pushed by fragmentation 3729 // adjacent floats which we don't fit beside, or pushed by fragmentation
(...skipping 29 matching lines...) Expand all
3759 SetLogicalTopForChild(child, logical_top_margin_edge + margin_before); 3759 SetLogicalTopForChild(child, logical_top_margin_edge + margin_before);
3760 3760
3761 SubtreeLayoutScope layout_scope(child); 3761 SubtreeLayoutScope layout_scope(child);
3762 3762
3763 // A new position may mean that we need to insert, move or remove breaks 3763 // A new position may mean that we need to insert, move or remove breaks
3764 // inside the float. We may also need to lay out if we just ceased to be 3764 // inside the float. We may also need to lay out if we just ceased to be
3765 // fragmented, in order to remove pagination struts inside the child. 3765 // fragmented, in order to remove pagination struts inside the child.
3766 MarkChildForPaginationRelayoutIfNeeded(child, layout_scope); 3766 MarkChildForPaginationRelayoutIfNeeded(child, layout_scope);
3767 child.LayoutIfNeeded(); 3767 child.LayoutIfNeeded();
3768 3768
3769 // If negative margin pushes the child completely out of its old position
3770 // mark for layout siblings that may have it in its float lists.
3771 if (child.LogicalBottom() <= old_logical_top) {
3772 LayoutObject* next = child.NextSibling();
3773 if (next && next->IsLayoutBlockFlow()) {
3774 LayoutBlockFlow* nextBlock = ToLayoutBlockFlow(next);
3775 if (!nextBlock->AvoidsFloats() || nextBlock->ShrinkToAvoidFloats())
3776 nextBlock->MarkAllDescendantsWithFloatsForLayout();
3777 }
3778 }
3779
3769 if (is_paginated) { 3780 if (is_paginated) {
3770 PaginatedContentWasLaidOut(child.LogicalBottom()); 3781 PaginatedContentWasLaidOut(child.LogicalBottom());
3771 3782
3772 // We may have to insert a break before the float. 3783 // We may have to insert a break before the float.
3773 LayoutUnit new_logical_top_margin_edge = 3784 LayoutUnit new_logical_top_margin_edge =
3774 AdjustFloatLogicalTopForPagination(child, logical_top_margin_edge); 3785 AdjustFloatLogicalTopForPagination(child, logical_top_margin_edge);
3775 if (logical_top_margin_edge != new_logical_top_margin_edge) { 3786 if (logical_top_margin_edge != new_logical_top_margin_edge) {
3776 // We had already found a location for the float, but a soft 3787 // We had already found a location for the float, but a soft
3777 // fragmentainer break then made us push it further down. This may affect 3788 // fragmentainer break then made us push it further down. This may affect
3778 // the inline position of the float (since we may no longer be beside the 3789 // the inline position of the float (since we may no longer be beside the
(...skipping 878 matching lines...) Expand 10 before | Expand all | Expand 10 after
4657 return LayoutBlock::InvalidatePaint(paint_invalidation_state); 4668 return LayoutBlock::InvalidatePaint(paint_invalidation_state);
4658 } 4669 }
4659 4670
4660 void LayoutBlockFlow::InvalidateDisplayItemClients( 4671 void LayoutBlockFlow::InvalidateDisplayItemClients(
4661 PaintInvalidationReason invalidation_reason) const { 4672 PaintInvalidationReason invalidation_reason) const {
4662 BlockFlowPaintInvalidator(*this).InvalidateDisplayItemClients( 4673 BlockFlowPaintInvalidator(*this).InvalidateDisplayItemClients(
4663 invalidation_reason); 4674 invalidation_reason);
4664 } 4675 }
4665 4676
4666 } // namespace blink 4677 } // namespace blink
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698