diff --git a/weasyprint/layout/blocks.py b/weasyprint/layout/blocks.py index 69d9864a8..53ec0ad74 100644 --- a/weasyprint/layout/blocks.py +++ b/weasyprint/layout/blocks.py @@ -289,6 +289,20 @@ def block_container_layout(context, box, max_position_y, skip_stack, new_child.index = index new_children.append(new_child) else: + + for previous_child in reversed(new_children): + if previous_child.is_in_normal_flow(): + last_in_flow_child = previous_child + break + if new_children and block_level_page_break( + last_in_flow_child, + child + ) == 'avoid': + result = find_earlier_page_break( + new_children, absolute_boxes, fixed_boxes) + if result: + new_children, resume_at = result + break resume_at = (index, None) break continue diff --git a/weasyprint/tests/test_layout.py b/weasyprint/tests/test_layout.py index 26d97d934..533a627c4 100644 --- a/weasyprint/tests/test_layout.py +++ b/weasyprint/tests/test_layout.py @@ -4583,6 +4583,112 @@ def test_floats_page_breaks(): for images in page_images] assert positions_y == [[10, 40], [10, 40], [10]] + # last float does not fit, pushed to next page + pages = parse(''' + +
+ + + + ''') + + assert len(pages) == 2 + page_divs = [] + for page in pages: + divs = [div for div in page.descendants() if div.element_tag == 'div'] + assert all([div.element_tag == 'div' for div in divs]) + page_divs.append(divs) + del divs + + positions_y = [[div.position_y for div in divs] for divs in page_divs] + assert positions_y == [[10, 70], [10]] + + # last float does not fit, pushed to next page + # center div must not + pages = parse(''' + + + + + + ''') + + assert len(pages) == 2 + page_divs = [] + for page in pages: + divs = [div for div in page.descendants() if div.element_tag == 'div'] + assert all([div.element_tag == 'div' for div in divs]) + page_divs.append(divs) + del divs + + positions_y = [[div.position_y for div in divs] for divs in page_divs] + assert positions_y == [[10], [10, 30]] + + # center div must be the last element, + # but float won't fit and will get pushed anyway + pages = parse(''' + + + + + + ''') + + assert len(pages) == 3 + page_divs = [] + for page in pages: + divs = [div for div in page.descendants() if div.element_tag == 'div'] + assert all([div.element_tag == 'div' for div in divs]) + page_divs.append(divs) + del divs + + positions_y = [[div.position_y for div in divs] for divs in page_divs] + assert positions_y == [[10], [10], [10]] + @assert_no_logs def test_font_stretch():