| 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 94b9738bcba2e46c73347ca92297c95115a7e7f8..62fef414a6f1da0f9bd3973152b15031c08db376 100644
|
| --- a/third_party/WebKit/Source/core/frame/FrameView.cpp
|
| +++ b/third_party/WebKit/Source/core/frame/FrameView.cpp
|
| @@ -92,6 +92,7 @@
|
| #include "core/page/FocusController.h"
|
| #include "core/page/FrameTree.h"
|
| #include "core/page/Page.h"
|
| +#include "core/page/PrintContext.h"
|
| #include "core/page/scrolling/RootScrollerUtil.h"
|
| #include "core/page/scrolling/ScrollingCoordinator.h"
|
| #include "core/page/scrolling/TopDocumentRootScrollerController.h"
|
| @@ -147,6 +148,10 @@
|
|
|
| namespace blink {
|
|
|
| +// A4 Portrait dimensions in pixels
|
| +const int kA4PortraitPageWidth = 595;
|
| +const int kA4PortraitPageHeight = 842;
|
| +
|
| using namespace HTMLNames;
|
|
|
| // The maximum number of updateWidgets iterations that should be done before
|
| @@ -236,6 +241,7 @@ DEFINE_TRACE(FrameView) {
|
| visitor->trace(m_scrollAnchor);
|
| visitor->trace(m_anchoringAdjustmentQueue);
|
| visitor->trace(m_scrollbarManager);
|
| + visitor->trace(m_printContext);
|
| Widget::trace(visitor);
|
| ScrollableArea::trace(visitor);
|
| }
|
| @@ -2886,6 +2892,36 @@ void FrameView::notifyResizeObservers() {
|
| DCHECK(!layoutView()->needsLayout());
|
| }
|
|
|
| +void FrameView::dispatchEventsForPrintingOnAllFrames() {
|
| + DCHECK(m_frame->isMainFrame());
|
| + for (Frame* currentFrame = m_frame; currentFrame;
|
| + currentFrame = currentFrame->tree().traverseNext(m_frame)) {
|
| + if (currentFrame->isLocalFrame())
|
| + toLocalFrame(currentFrame)->document()->dispatchEventsForPrinting();
|
| + }
|
| +}
|
| +
|
| +void FrameView::setupPrintContext() {
|
| + if (m_frame->document()->printing())
|
| + return;
|
| + if (!m_printContext)
|
| + m_printContext = new PrintContext(m_frame);
|
| + if (m_frame->settings())
|
| + m_frame->settings()->setShouldPrintBackgrounds(true);
|
| + FloatRect pageRect(0, 0, kA4PortraitPageWidth, kA4PortraitPageHeight);
|
| + m_printContext->begin(pageRect.width(), pageRect.height());
|
| + float height;
|
| + m_printContext->computePageRects(pageRect, 0, 0, 1.0, height);
|
| + dispatchEventsForPrintingOnAllFrames();
|
| +}
|
| +
|
| +void FrameView::clearPrintContext() {
|
| + if (!m_printContext)
|
| + return;
|
| + m_printContext->end();
|
| + m_printContext.clear();
|
| +}
|
| +
|
| // TODO(leviw): We don't assert lifecycle information from documents in child
|
| // PluginViews.
|
| void FrameView::updateLifecyclePhasesInternal(
|
| @@ -2918,6 +2954,11 @@ void FrameView::updateLifecyclePhasesInternal(
|
| return;
|
| }
|
|
|
| + if (RuntimeEnabledFeatures::printBrowserEnabled())
|
| + setupPrintContext();
|
| + else
|
| + clearPrintContext();
|
| +
|
| updateStyleAndLayoutIfNeededRecursive();
|
| DCHECK(lifecycle().state() >= DocumentLifecycle::LayoutClean);
|
|
|
| @@ -2990,7 +3031,8 @@ void FrameView::updateLifecyclePhasesInternal(
|
| DocumentAnimations::updateAnimations(layoutView()->document());
|
|
|
| if (targetState == DocumentLifecycle::PaintClean) {
|
| - if (!m_frame->document()->printing())
|
| + if (!m_frame->document()->printing() ||
|
| + RuntimeEnabledFeatures::printBrowserEnabled())
|
| paintTree();
|
|
|
| if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
|
| @@ -3083,6 +3125,8 @@ void FrameView::paintTree() {
|
| if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
|
| if (layoutView()->layer()->needsRepaint()) {
|
| GraphicsContext graphicsContext(*m_paintController);
|
| + if (RuntimeEnabledFeatures::printBrowserEnabled())
|
| + graphicsContext.setPrinting(true);
|
| paint(graphicsContext, CullRect(LayoutRect::infiniteIntRect()));
|
| m_paintController->commitNewDisplayItems(LayoutSize());
|
| notifyPaint(*m_paintController);
|
|
|