| Index: third_party/WebKit/Source/core/frame/FrameView.cpp | 
| diff --git a/third_party/WebKit/Source/core/frame/FrameView.cpp b/third_party/WebKit/Source/core/frame/FrameView.cpp | 
| index 3cf3699fb85abee836666befe7a2a69c98a19460..ab7926294619e29e030a62e3cbfd928f8846001b 100644 | 
| --- a/third_party/WebKit/Source/core/frame/FrameView.cpp | 
| +++ b/third_party/WebKit/Source/core/frame/FrameView.cpp | 
| @@ -3530,89 +3530,97 @@ void FrameView::DisableAutoSizeMode() { | 
| auto_size_info_.Clear(); | 
| } | 
|  | 
| -void FrameView::ForceLayoutForPagination(const FloatSize& page_size, | 
| -                                         const FloatSize& original_page_size, | 
| -                                         float maximum_shrink_factor) { | 
| -  // Dumping externalRepresentation(m_frame->layoutObject()).ascii() is a good | 
| +bool FrameView::ForceLayoutForPaginationHelper( | 
| +    const FloatSize& page_size, | 
| +    const FloatSize& original_page_size, | 
| +    float maximum_shrink_factor) { | 
| +  // Dumping ExternalRepresentation(m_frame->LayoutObject()).Ascii() is a good | 
| // trick to see the state of things before and after the layout | 
| -  if (LayoutView* layout_view = this->GetLayoutView()) { | 
| -    float page_logical_width = layout_view->Style()->IsHorizontalWritingMode() | 
| -                                   ? page_size.Width() | 
| -                                   : page_size.Height(); | 
| -    float page_logical_height = layout_view->Style()->IsHorizontalWritingMode() | 
| -                                    ? page_size.Height() | 
| -                                    : page_size.Width(); | 
| - | 
| -    LayoutUnit floored_page_logical_width = | 
| -        static_cast<LayoutUnit>(page_logical_width); | 
| -    LayoutUnit floored_page_logical_height = | 
| -        static_cast<LayoutUnit>(page_logical_height); | 
| -    layout_view->SetLogicalWidth(floored_page_logical_width); | 
| -    layout_view->SetPageLogicalHeight(floored_page_logical_height); | 
| -    layout_view->SetNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation( | 
| -        LayoutInvalidationReason::kPrintingChanged); | 
| -    UpdateLayout(); | 
| +  LayoutView* layout_view = GetLayoutView(); | 
| +  if (!layout_view) | 
| +    return false; | 
|  | 
| -    // If we don't fit in the given page width, we'll lay out again. If we don't | 
| -    // fit in the page width when shrunk, we will lay out at maximum shrink and | 
| -    // clip extra content. | 
| -    // FIXME: We are assuming a shrink-to-fit printing implementation.  A | 
| -    // cropping implementation should not do this! | 
| -    bool horizontal_writing_mode = | 
| -        layout_view->Style()->IsHorizontalWritingMode(); | 
| -    const LayoutRect& document_rect = LayoutRect(layout_view->DocumentRect()); | 
| -    LayoutUnit doc_logical_width = horizontal_writing_mode | 
| -                                       ? document_rect.Width() | 
| -                                       : document_rect.Height(); | 
| -    if (doc_logical_width > page_logical_width) { | 
| -      FloatSize expected_page_size( | 
| -          std::min<float>(document_rect.Width().ToFloat(), | 
| -                          page_size.Width() * maximum_shrink_factor), | 
| -          std::min<float>(document_rect.Height().ToFloat(), | 
| -                          page_size.Height() * maximum_shrink_factor)); | 
| -      FloatSize max_page_size = frame_->ResizePageRectsKeepingRatio( | 
| -          FloatSize(original_page_size.Width(), original_page_size.Height()), | 
| -          expected_page_size); | 
| -      page_logical_width = horizontal_writing_mode ? max_page_size.Width() | 
| -                                                   : max_page_size.Height(); | 
| -      page_logical_height = horizontal_writing_mode ? max_page_size.Height() | 
| -                                                    : max_page_size.Width(); | 
| - | 
| -      floored_page_logical_width = static_cast<LayoutUnit>(page_logical_width); | 
| -      floored_page_logical_height = | 
| -          static_cast<LayoutUnit>(page_logical_height); | 
| -      layout_view->SetLogicalWidth(floored_page_logical_width); | 
| -      layout_view->SetPageLogicalHeight(floored_page_logical_height); | 
| -      layout_view->SetNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation( | 
| -          LayoutInvalidationReason::kPrintingChanged); | 
| -      UpdateLayout(); | 
| +  bool horizontal_writing_mode = | 
| +      layout_view->Style()->IsHorizontalWritingMode(); | 
| +  float page_logical_width = | 
| +      horizontal_writing_mode ? page_size.Width() : page_size.Height(); | 
| +  float page_logical_height = | 
| +      horizontal_writing_mode ? page_size.Height() : page_size.Width(); | 
| + | 
| +  LayoutUnit floored_page_logical_width = | 
| +      static_cast<LayoutUnit>(page_logical_width); | 
| +  LayoutUnit floored_page_logical_height = | 
| +      static_cast<LayoutUnit>(page_logical_height); | 
| +  layout_view->SetLogicalWidth(floored_page_logical_width); | 
| +  layout_view->SetPageLogicalHeight(floored_page_logical_height); | 
| +  layout_view->SetNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation( | 
| +      LayoutInvalidationReason::kPrintingChanged); | 
| +  UpdateLayout(); | 
| + | 
| +  // If we don't fit in the given page width, we'll lay out again. If we don't | 
| +  // fit in the page width when shrunk, we will lay out at maximum shrink and | 
| +  // clip extra content. | 
| +  // FIXME: We are assuming a shrink-to-fit printing implementation.  A | 
| +  // cropping implementation should not do this! | 
| +  const LayoutRect& document_rect = LayoutRect(layout_view->DocumentRect()); | 
| +  LayoutUnit doc_logical_width = | 
| +      horizontal_writing_mode ? document_rect.Width() : document_rect.Height(); | 
| +  if (doc_logical_width <= page_logical_width) | 
| +    return false; | 
|  | 
| -      const LayoutRect& updated_document_rect = | 
| -          LayoutRect(layout_view->DocumentRect()); | 
| -      LayoutUnit doc_logical_height = horizontal_writing_mode | 
| -                                          ? updated_document_rect.Height() | 
| -                                          : updated_document_rect.Width(); | 
| -      LayoutUnit doc_logical_top = horizontal_writing_mode | 
| -                                       ? updated_document_rect.Y() | 
| -                                       : updated_document_rect.X(); | 
| -      LayoutUnit doc_logical_right = horizontal_writing_mode | 
| -                                         ? updated_document_rect.MaxX() | 
| -                                         : updated_document_rect.MaxY(); | 
| -      LayoutUnit clipped_logical_left; | 
| -      if (!layout_view->Style()->IsLeftToRightDirection()) | 
| -        clipped_logical_left = | 
| -            LayoutUnit(doc_logical_right - page_logical_width); | 
| -      LayoutRect overflow(clipped_logical_left, doc_logical_top, | 
| -                          LayoutUnit(page_logical_width), doc_logical_height); | 
| - | 
| -      if (!horizontal_writing_mode) | 
| -        overflow = overflow.TransposedRect(); | 
| -      AdjustViewSizeAndLayout(); | 
| -      // This is how we clip in case we overflow again. | 
| -      layout_view->ClearLayoutOverflow(); | 
| -      layout_view->AddLayoutOverflow(overflow); | 
| -      return; | 
| -    } | 
| +  FloatSize expected_page_size( | 
| +      std::min<float>(document_rect.Width().ToFloat(), | 
| +                      page_size.Width() * maximum_shrink_factor), | 
| +      std::min<float>(document_rect.Height().ToFloat(), | 
| +                      page_size.Height() * maximum_shrink_factor)); | 
| +  FloatSize max_page_size = frame_->ResizePageRectsKeepingRatio( | 
| +      FloatSize(original_page_size.Width(), original_page_size.Height()), | 
| +      expected_page_size); | 
| +  page_logical_width = | 
| +      horizontal_writing_mode ? max_page_size.Width() : max_page_size.Height(); | 
| +  page_logical_height = | 
| +      horizontal_writing_mode ? max_page_size.Height() : max_page_size.Width(); | 
| + | 
| +  floored_page_logical_width = static_cast<LayoutUnit>(page_logical_width); | 
| +  floored_page_logical_height = static_cast<LayoutUnit>(page_logical_height); | 
| +  layout_view->SetLogicalWidth(floored_page_logical_width); | 
| +  layout_view->SetPageLogicalHeight(floored_page_logical_height); | 
| +  layout_view->SetNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation( | 
| +      LayoutInvalidationReason::kPrintingChanged); | 
| +  UpdateLayout(); | 
| + | 
| +  const LayoutRect& updated_document_rect = | 
| +      LayoutRect(layout_view->DocumentRect()); | 
| +  LayoutUnit doc_logical_height = horizontal_writing_mode | 
| +                                      ? updated_document_rect.Height() | 
| +                                      : updated_document_rect.Width(); | 
| +  LayoutUnit doc_logical_top = horizontal_writing_mode | 
| +                                   ? updated_document_rect.Y() | 
| +                                   : updated_document_rect.X(); | 
| +  LayoutUnit doc_logical_right = horizontal_writing_mode | 
| +                                     ? updated_document_rect.MaxX() | 
| +                                     : updated_document_rect.MaxY(); | 
| +  LayoutUnit clipped_logical_left; | 
| +  if (!layout_view->Style()->IsLeftToRightDirection()) | 
| +    clipped_logical_left = LayoutUnit(doc_logical_right - page_logical_width); | 
| +  LayoutRect overflow(clipped_logical_left, doc_logical_top, | 
| +                      LayoutUnit(page_logical_width), doc_logical_height); | 
| + | 
| +  if (!horizontal_writing_mode) | 
| +    overflow = overflow.TransposedRect(); | 
| +  AdjustViewSizeAndLayout(); | 
| +  // This is how we clip in case we overflow again. | 
| +  layout_view->ClearLayoutOverflow(); | 
| +  layout_view->AddLayoutOverflow(overflow); | 
| +  return true; | 
| +} | 
| + | 
| +void FrameView::ForceLayoutForPagination(const FloatSize& page_size, | 
| +                                         const FloatSize& original_page_size, | 
| +                                         float maximum_shrink_factor) { | 
| +  if (ForceLayoutForPaginationHelper(page_size, original_page_size, | 
| +                                     maximum_shrink_factor)) { | 
| +    return; | 
| } | 
|  | 
| if (TextAutosizer* text_autosizer = frame_->GetDocument()->GetTextAutosizer()) | 
|  |