Chromium Code Reviews| 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 93a42bb40dca6076bc944a1ef652c21933171a5a..e22aff294f003c1e7b72fb7137f19b354251c9f7 100644 |
| --- a/third_party/WebKit/Source/core/frame/FrameView.cpp |
| +++ b/third_party/WebKit/Source/core/frame/FrameView.cpp |
| @@ -90,6 +90,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" |
| @@ -234,6 +235,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 +2888,15 @@ 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(); |
| + } |
| +} |
| + |
| // TODO(leviw): We don't assert lifecycle information from documents in child |
| // PluginViews. |
| void FrameView::updateLifecyclePhasesInternal( |
| @@ -2918,6 +2929,24 @@ void FrameView::updateLifecyclePhasesInternal( |
| return; |
| } |
| + if (RuntimeEnabledFeatures::printBrowserEnabled()) { |
| + if (!m_frame->document()->printing()) { |
|
pdr.
2017/02/08 04:28:05
Can you split this logic out into a helper? I thin
gozzard
2017/02/08 05:40:20
Done.
|
| + if (!m_printContext) |
| + m_printContext = new PrintContext(m_frame); |
| + if (m_frame->settings()) |
| + m_frame->settings()->setShouldPrintBackgrounds(true); |
| + int pageWidth = 595, pageHeight = 842; // A4 Portrait |
|
pdr.
2017/02/08 04:28:05
Nit: can you break these into constants?
Maybe "co
gozzard
2017/02/08 05:40:20
Done.
|
| + FloatRect pageRect(0, 0, pageWidth, pageHeight); |
| + m_printContext->begin(pageRect.width(), pageRect.height()); |
| + float height; |
|
pdr.
2017/02/08 04:28:05
Do we need to do this print context and page rect
gozzard
2017/02/08 05:40:20
m_printContext->begin() indirectly sets m_frame->d
|
| + m_printContext->computePageRects(pageRect, 0, 0, 1.0, height); |
| + dispatchEventsForPrintingOnAllFrames(); |
| + } |
| + } else if (m_printContext) { |
| + m_printContext->end(); |
| + m_printContext.clear(); |
| + } |
| + |
| updateStyleAndLayoutIfNeededRecursive(); |
| DCHECK(lifecycle().state() >= DocumentLifecycle::LayoutClean); |
| @@ -2990,7 +3019,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()) |
| @@ -3082,6 +3112,8 @@ void FrameView::paintTree() { |
| if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) { |
| if (layoutView()->layer()->needsRepaint()) { |
| GraphicsContext graphicsContext(*m_paintController); |
| + if (RuntimeEnabledFeatures::printBrowserEnabled()) |
|
pdr.
2017/02/08 04:28:05
WDYT about implementing this for both spv2 (as you
gozzard
2017/02/08 05:40:20
I had a look into this and found that it would req
|
| + graphicsContext.setPrinting(true); |
| paint(graphicsContext, CullRect(LayoutRect::infiniteIntRect())); |
| m_paintController->commitNewDisplayItems(LayoutSize()); |
| notifyPaint(*m_paintController); |