Changeset 244202 in webkit
- Timestamp:
- Apr 11, 2019, 4:33:41 PM (7 years ago)
- Location:
- trunk
- Files:
-
- 6 added
- 20 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/printing/page-with-10mm-left-margin-expected.pdf (added)
-
LayoutTests/printing/page-with-10mm-left-margin-expected.txt (added)
-
LayoutTests/printing/page-with-10mm-left-margin.html (added)
-
LayoutTests/printing/page-with-zero-margin-expected.pdf (added)
-
LayoutTests/printing/page-with-zero-margin-expected.txt (added)
-
LayoutTests/printing/page-with-zero-margin.html (added)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/page/PrintContext.cpp (modified) (2 diffs)
-
Source/WebCore/page/PrintContext.h (modified) (2 diffs)
-
Source/WebCore/page/RuntimeEnabledFeatures.h (modified) (2 diffs)
-
Source/WebKit/ChangeLog (modified) (1 diff)
-
Source/WebKit/Shared/PrintInfo.cpp (modified) (2 diffs)
-
Source/WebKit/Shared/PrintInfo.h (modified) (2 diffs)
-
Source/WebKit/Shared/WebPreferences.yaml (modified) (1 diff)
-
Source/WebKit/Shared/gtk/PrintInfoGtk.cpp (modified) (1 diff)
-
Source/WebKit/Shared/mac/PrintInfoMac.mm (modified) (1 diff)
-
Source/WebKit/UIProcess/API/C/WKPage.cpp (modified) (1 diff)
-
Source/WebKit/UIProcess/GenericCallback.h (modified) (1 diff)
-
Source/WebKit/UIProcess/WebPageProxy.cpp (modified) (2 diffs)
-
Source/WebKit/UIProcess/WebPageProxy.h (modified) (1 diff)
-
Source/WebKit/UIProcess/WebPageProxy.messages.in (modified) (1 diff)
-
Source/WebKit/UIProcess/mac/WKPrintingView.mm (modified) (3 diffs)
-
Source/WebKit/WebProcess/WebPage/WebPage.cpp (modified) (3 diffs)
-
Source/WebKit/WebProcess/WebPage/WebPage.h (modified) (1 diff)
-
Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r244200 r244202 1 2019-04-11 Zalan Bujtas <zalan@apple.com> 2 3 Add @page margin support 4 https://bugs.webkit.org/show_bug.cgi?id=196680 5 <rdar://problem/45217707> 6 7 Reviewed by Tim Horton. 8 9 * printing/page-with-10mm-left-margin-expected.pdf: Added. 10 * printing/page-with-10mm-left-margin.html: Added. 11 * printing/page-with-zero-margin-expected.pdf: Added. 12 * printing/page-with-zero-margin.html: Added. 13 1 14 2019-04-09 Ryosuke Niwa <rniwa@webkit.org> 2 15 -
trunk/Source/WebCore/ChangeLog
r244201 r244202 1 2019-04-11 Zalan Bujtas <zalan@apple.com> 2 3 Add @page margin support 4 https://bugs.webkit.org/show_bug.cgi?id=196680 5 <rdar://problem/45217707> 6 7 Reviewed by Tim Horton. 8 9 This patch adds support for @page margin. This feature is currently behind a runtime flag and is off by default. 10 We resolve the @page margin values in the WebProcess (currently no pseudo class is supported) and transfer them to the UIProcess through computedPagesCallback. 11 UIProcess is responsible for applying these new values on the printer. We also re-compute the available width/height for the current printing context 12 in the WebProcess if needed (see PrintInfo for current printer margins). 13 14 Tests: printing/page-with-10mm-left-margin.html 15 printing/page-with-zero-margin.html 16 17 * page/PrintContext.cpp: 18 (WebCore::PrintContext::computedPageMargin): 19 (WebCore::PrintContext::computedPageSize): 20 * page/PrintContext.h: 21 * page/RuntimeEnabledFeatures.h: 22 (WebCore::RuntimeEnabledFeatures::pageAtRuleSupportEnabled const): 23 (WebCore::RuntimeEnabledFeatures::setPageAtRuleSupportEnabled): 24 1 25 2019-04-11 Dean Jackson <dino@apple.com> 2 26 -
trunk/Source/WebCore/page/PrintContext.cpp
r242713 r244202 26 26 #include "Frame.h" 27 27 #include "FrameView.h" 28 #include "LengthBox.h" 28 29 #include "RenderView.h" 30 #include "RuntimeEnabledFeatures.h" 29 31 #include "StyleInheritedData.h" 30 32 #include "StyleResolver.h" … … 77 79 78 80 computePageRectsWithPageSizeInternal(FloatSize(pageWidth / userScaleFactor, pageHeight / userScaleFactor), allowHorizontalTiling); 81 } 82 83 FloatBoxExtent PrintContext::computedPageMargin(FloatBoxExtent printMargin) 84 { 85 if (!frame() || !frame()->document()) 86 return printMargin; 87 if (!RuntimeEnabledFeatures::sharedFeatures().pageAtRuleSupportEnabled()) 88 return printMargin; 89 // FIXME Currently no pseudo class is supported. 90 auto style = frame()->document()->styleScope().resolver().styleForPage(0); 91 92 auto pixelToPointScaleFactor = 1 / CSSPrimitiveValue::conversionToCanonicalUnitsScaleFactor(CSSPrimitiveValue::CSS_PT); 93 return { style->marginTop().isAuto() ? printMargin.top() : style->marginTop().value() * pixelToPointScaleFactor, 94 style->marginRight().isAuto() ? printMargin.right() : style->marginRight().value() * pixelToPointScaleFactor, 95 style->marginBottom().isAuto() ? printMargin.bottom() : style->marginBottom().value() * pixelToPointScaleFactor, 96 style->marginLeft().isAuto() ? printMargin.left() : style->marginLeft().value() * pixelToPointScaleFactor }; 97 } 98 99 FloatSize PrintContext::computedPageSize(FloatSize pageSize, FloatBoxExtent printMargin) 100 { 101 auto computedMargin = computedPageMargin(printMargin); 102 if (computedMargin == printMargin) 103 return pageSize; 104 105 auto horizontalMarginDelta = (printMargin.left() - computedMargin.left()) + (printMargin.right() - computedMargin.right()); 106 auto verticalMarginDelta = (printMargin.top() - computedMargin.top()) + (printMargin.bottom() - computedMargin.bottom()); 107 return { pageSize.width() + horizontalMarginDelta, pageSize.height() + verticalMarginDelta }; 79 108 } 80 109 -
trunk/Source/WebCore/page/PrintContext.h
r241183 r244202 22 22 23 23 #include "FrameDestructionObserver.h" 24 #include "LengthBox.h" 24 25 #include <wtf/Forward.h> 25 26 #include <wtf/HashMap.h> … … 57 58 const IntRect& pageRect(size_t pageNumber) const { return m_pageRects[pageNumber]; } 58 59 const Vector<IntRect>& pageRects() const { return m_pageRects; } 60 WEBCORE_EXPORT FloatBoxExtent computedPageMargin(FloatBoxExtent printMargin); 61 WEBCORE_EXPORT FloatSize computedPageSize(FloatSize pageSize, FloatBoxExtent printMargin); 59 62 60 63 WEBCORE_EXPORT float computeAutomaticScaleFactor(const FloatSize& availablePaperSize); -
trunk/Source/WebCore/page/RuntimeEnabledFeatures.h
r243666 r244202 350 350 bool referrerPolicyAttributeEnabled() const { return m_referrerPolicyAttributeEnabled; } 351 351 void setReferrerPolicyAttributeEnabled(bool isEnabled) { m_referrerPolicyAttributeEnabled = isEnabled; } 352 353 bool pageAtRuleSupportEnabled() const { return m_pageAtRuleSupportEnabled; } 354 void setPageAtRuleSupportEnabled(bool isEnabled) { m_pageAtRuleSupportEnabled = isEnabled; } 352 355 353 356 WEBCORE_EXPORT static RuntimeEnabledFeatures& sharedFeatures(); … … 400 403 bool m_pointerEventsEnabled { true }; 401 404 bool m_webSQLEnabled { true }; 405 bool m_pageAtRuleSupportEnabled { false }; 402 406 403 407 #if ENABLE(LAYOUT_FORMATTING_CONTEXT) -
trunk/Source/WebKit/ChangeLog
r244201 r244202 1 2019-04-11 Zalan Bujtas <zalan@apple.com> 2 3 Add @page margin support 4 https://bugs.webkit.org/show_bug.cgi?id=196680 5 <rdar://problem/45217707> 6 7 Reviewed by Tim Horton. 8 9 * Shared/PrintInfo.cpp: 10 (WebKit::PrintInfo::encode const): 11 (WebKit::PrintInfo::decode): 12 * Shared/PrintInfo.h: 13 * Shared/WebPreferences.yaml: 14 * Shared/gtk/PrintInfoGtk.cpp: 15 (WebKit::PrintInfo::PrintInfo): 16 * Shared/mac/PrintInfoMac.mm: 17 (WebKit::PrintInfo::PrintInfo): 18 * UIProcess/API/C/WKPage.cpp: 19 (WKPageComputePagesForPrinting): 20 * UIProcess/API/C/WKPreferences.cpp: 21 (WKPreferencesSetPageAtRuleSupportEnabled): 22 (WKPreferencesGetPageAtRuleSupportEnabled): 23 * UIProcess/API/C/WKPreferencesRefPrivate.h: 24 * UIProcess/GenericCallback.h: 25 * UIProcess/WebPageProxy.cpp: 26 (WebKit::WebPageProxy::computedPagesCallback): 27 * UIProcess/WebPageProxy.h: 28 * UIProcess/WebPageProxy.messages.in: 29 * UIProcess/mac/WKPrintingView.mm: 30 (pageDidComputePageRects): 31 (-[WKPrintingView _askPageToComputePageRects]): 32 * WebProcess/WebPage/WebPage.cpp: 33 (WebKit::WebPage::beginPrinting): 34 (WebKit::WebPage::computePagesForPrinting): 35 (WebKit::WebPage::computePagesForPrintingImpl): 36 * WebProcess/WebPage/WebPage.h: 37 * WebProcess/WebPage/ios/WebPageIOS.mm: 38 (WebKit::WebPage::computePagesForPrintingAndDrawToPDF): 39 1 40 2019-04-11 Dean Jackson <dino@apple.com> 2 41 -
trunk/Source/WebKit/Shared/PrintInfo.cpp
r237266 r244202 41 41 encoder << availablePaperWidth; 42 42 encoder << availablePaperHeight; 43 encoder << margin; 43 44 44 45 #if PLATFORM(GTK) … … 61 62 if (!decoder.decode(info.availablePaperHeight)) 62 63 return false; 64 if (!decoder.decode(info.margin)) 65 return false; 63 66 64 67 #if PLATFORM(GTK) -
trunk/Source/WebKit/Shared/PrintInfo.h
r237266 r244202 36 36 class NSPrintInfo; 37 37 #endif 38 #include <WebCore/LengthBox.h> 38 39 39 40 namespace IPC { … … 57 58 #endif 58 59 60 // These values are in 'point' unit (and not CSS pixel). 59 61 float pageSetupScaleFactor { 0 }; 60 62 float availablePaperWidth { 0 }; 61 63 float availablePaperHeight { 0 }; 64 WebCore::FloatBoxExtent margin; 62 65 #if PLATFORM(IOS_FAMILY) 63 66 bool snapshotFirstPage { false }; -
trunk/Source/WebKit/Shared/WebPreferences.yaml
r244197 r244202 1632 1632 webcoreBinding: RuntimeEnabledFeatures 1633 1633 1634 PageAtRuleSupportEnabled: 1635 type: bool 1636 defaultValue: false 1637 humanReadableName: "@page CSS at-rule support" 1638 humanReadableDescription: "Enable @page support" 1639 category: experimental 1640 webcoreBinding: RuntimeEnabledFeatures 1641 1634 1642 ApplePayRemoteUIEnabled: 1635 1643 category: internal -
trunk/Source/WebKit/Shared/gtk/PrintInfoGtk.cpp
r159042 r244202 35 35 , availablePaperWidth(gtk_page_setup_get_paper_width(pageSetup, GTK_UNIT_POINTS) - gtk_page_setup_get_left_margin(pageSetup, GTK_UNIT_POINTS) - gtk_page_setup_get_right_margin(pageSetup, GTK_UNIT_POINTS)) 36 36 , availablePaperHeight(gtk_page_setup_get_paper_height(pageSetup, GTK_UNIT_POINTS) - gtk_page_setup_get_top_margin(pageSetup, GTK_UNIT_POINTS) - gtk_page_setup_get_bottom_margin(pageSetup, GTK_UNIT_POINTS)) 37 , margin(gtk_page_setup_get_top_margin(pageSetup, GTK_UNIT_POINTS), gtk_page_setup_get_right_margin(pageSetup, GTK_UNIT_POINTS), gtk_page_setup_get_bottom_margin(pageSetup, GTK_UNIT_POINTS), gtk_page_setup_get_left_margin(pageSetup, GTK_UNIT_POINTS)) 37 38 , printSettings(settings) 38 39 , pageSetup(pageSetup) -
trunk/Source/WebKit/Shared/mac/PrintInfoMac.mm
r164776 r244202 35 35 , availablePaperWidth([printInfo paperSize].width - [printInfo leftMargin] - [printInfo rightMargin]) 36 36 , availablePaperHeight([printInfo paperSize].height - [printInfo topMargin] - [printInfo bottomMargin]) 37 , margin([printInfo topMargin], [printInfo rightMargin], [printInfo bottomMargin], [printInfo leftMargin]) 37 38 { 38 39 ASSERT(printInfo); -
trunk/Source/WebKit/UIProcess/API/C/WKPage.cpp
r243762 r244202 2418 2418 void WKPageComputePagesForPrinting(WKPageRef page, WKFrameRef frame, WKPrintInfo printInfo, WKPageComputePagesForPrintingFunction callback, void* context) 2419 2419 { 2420 toImpl(page)->computePagesForPrinting(toImpl(frame), printInfoFromWKPrintInfo(printInfo), ComputedPagesCallback::create([context, callback](const Vector<WebCore::IntRect>& rects, double scaleFactor, WebKit::CallbackBase::Error error) {2420 toImpl(page)->computePagesForPrinting(toImpl(frame), printInfoFromWKPrintInfo(printInfo), ComputedPagesCallback::create([context, callback](const Vector<WebCore::IntRect>& rects, double scaleFactor, const WebCore::FloatBoxExtent& computedPageMargin, WebKit::CallbackBase::Error error) { 2421 2421 Vector<WKRect> wkRects(rects.size()); 2422 2422 for (size_t i = 0; i < rects.size(); ++i) -
trunk/Source/WebKit/UIProcess/GenericCallback.h
r239427 r244202 156 156 157 157 typedef GenericCallback<> VoidCallback; 158 typedef GenericCallback<const Vector<WebCore::IntRect>&, double > ComputedPagesCallback;158 typedef GenericCallback<const Vector<WebCore::IntRect>&, double, WebCore::FloatBoxExtent> ComputedPagesCallback; 159 159 typedef GenericCallback<const ShareableBitmap::Handle&> ImageCallback; 160 160 -
trunk/Source/WebKit/UIProcess/WebPageProxy.cpp
r244197 r244202 6418 6418 } 6419 6419 6420 void WebPageProxy::computedPagesCallback(const Vector<IntRect>& pageRects, double totalScaleFactorForPrinting, CallbackID callbackID)6420 void WebPageProxy::computedPagesCallback(const Vector<IntRect>& pageRects, double totalScaleFactorForPrinting, const FloatBoxExtent& computedPageMargin, CallbackID callbackID) 6421 6421 { 6422 6422 auto callback = m_callbacks.take<ComputedPagesCallback>(callbackID); … … 6426 6426 } 6427 6427 6428 callback->performCallbackWithReturnValue(pageRects, totalScaleFactorForPrinting );6428 callback->performCallbackWithReturnValue(pageRects, totalScaleFactorForPrinting, computedPageMargin); 6429 6429 } 6430 6430 -
trunk/Source/WebKit/UIProcess/WebPageProxy.h
r244197 r244202 1822 1822 void invalidateStringCallback(CallbackID); 1823 1823 void scriptValueCallback(const IPC::DataReference&, bool hadException, const WebCore::ExceptionDetails&, CallbackID); 1824 void computedPagesCallback(const Vector<WebCore::IntRect>&, double totalScaleFactorForPrinting, CallbackID);1824 void computedPagesCallback(const Vector<WebCore::IntRect>&, double totalScaleFactorForPrinting, const WebCore::FloatBoxExtent& computedPageMargin, CallbackID); 1825 1825 void validateCommandCallback(const String&, bool, int, CallbackID); 1826 1826 void unsignedCallback(uint64_t, CallbackID); -
trunk/Source/WebKit/UIProcess/WebPageProxy.messages.in
r244161 r244202 169 169 InvalidateStringCallback(WebKit::CallbackID callbackID) 170 170 ScriptValueCallback(IPC::DataReference resultData, bool hadException, struct WebCore::ExceptionDetails details, WebKit::CallbackID callbackID) 171 ComputedPagesCallback(Vector<WebCore::IntRect> pageRects, double totalScaleFactorForPrinting, Web Kit::CallbackID callbackID)171 ComputedPagesCallback(Vector<WebCore::IntRect> pageRects, double totalScaleFactorForPrinting, WebCore::RectEdges<float> computedPageMargin, WebKit::CallbackID callbackID) 172 172 ValidateCommandCallback(String command, bool isEnabled, int32_t state, WebKit::CallbackID callbackID) 173 173 EditingRangeCallback(struct WebKit::EditingRange range, WebKit::CallbackID callbackID) -
trunk/Source/WebKit/UIProcess/mac/WKPrintingView.mm
r240211 r244202 294 294 } 295 295 296 static void pageDidComputePageRects(const Vector<WebCore::IntRect>& pageRects, double totalScaleFactorForPrinting, IPCCallbackContext* context)296 static void pageDidComputePageRects(const Vector<WebCore::IntRect>& pageRects, double totalScaleFactorForPrinting, const WebCore::FloatBoxExtent& computedPageMargin, IPCCallbackContext* context) 297 297 { 298 298 ASSERT(RunLoop::isMain()); … … 324 324 LOG(Printing, "WKPrintingView setting frame size to x:%g y:%g width:%g height:%g", newFrameSize.origin.x, newFrameSize.origin.y, newFrameSize.size.width, newFrameSize.size.height); 325 325 [view setFrame:newFrameSize]; 326 // Set @page margin. 327 auto *printInfo = [view->_printOperation printInfo]; 328 [printInfo setTopMargin:computedPageMargin.top()]; 329 [printInfo setBottomMargin:computedPageMargin.bottom()]; 330 [printInfo setLeftMargin:computedPageMargin.left()]; 331 [printInfo setRightMargin:computedPageMargin.right()]; 326 332 327 333 if ([view _isPrintingPreview]) { … … 345 351 346 352 IPCCallbackContext* context = new IPCCallbackContext; 347 auto callback = WebKit::ComputedPagesCallback::create([context](const Vector<WebCore::IntRect>& pageRects, double totalScaleFactorForPrinting, WebKit::CallbackBase::Error) {353 auto callback = WebKit::ComputedPagesCallback::create([context](const Vector<WebCore::IntRect>& pageRects, double totalScaleFactorForPrinting, const WebCore::FloatBoxExtent& computedPageMargin, WebKit::CallbackBase::Error) { 348 354 std::unique_ptr<IPCCallbackContext> contextDeleter(context); 349 pageDidComputePageRects(pageRects, totalScaleFactorForPrinting, co ntext);355 pageDidComputePageRects(pageRects, totalScaleFactorForPrinting, computedPageMargin, context); 350 356 }); 351 357 _expectedComputedPagesCallback = callback->callbackID().toInteger(); -
trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp
r244182 r244202 4624 4624 freezeLayerTree(LayerTreeFreezeReason::Printing); 4625 4625 4626 m_printContext->begin(printInfo.availablePaperWidth, printInfo.availablePaperHeight); 4626 auto computedPageSize = m_printContext->computedPageSize(FloatSize(printInfo.availablePaperWidth, printInfo.availablePaperHeight), printInfo.margin); 4627 m_printContext->begin(computedPageSize.width(), computedPageSize.height()); 4627 4628 4628 4629 float fullPageHeight; 4629 m_printContext->computePageRects(FloatRect(0, 0, printInfo.availablePaperWidth, printInfo.availablePaperHeight), 0, 0, printInfo.pageSetupScaleFactor, fullPageHeight, true);4630 m_printContext->computePageRects(FloatRect(0, 0, computedPageSize.width(), computedPageSize.height()), 0, 0, printInfo.pageSetupScaleFactor, fullPageHeight, true); 4630 4631 4631 4632 #if PLATFORM(GTK) … … 4649 4650 Vector<IntRect> resultPageRects; 4650 4651 double resultTotalScaleFactorForPrinting = 1; 4651 computePagesForPrintingImpl(frameID, printInfo, resultPageRects, resultTotalScaleFactorForPrinting); 4652 send(Messages::WebPageProxy::ComputedPagesCallback(resultPageRects, resultTotalScaleFactorForPrinting, callbackID)); 4653 } 4654 4655 void WebPage::computePagesForPrintingImpl(uint64_t frameID, const PrintInfo& printInfo, Vector<WebCore::IntRect>& resultPageRects, double& resultTotalScaleFactorForPrinting) 4652 auto computedPageMargin = printInfo.margin; 4653 computePagesForPrintingImpl(frameID, printInfo, resultPageRects, resultTotalScaleFactorForPrinting, computedPageMargin); 4654 send(Messages::WebPageProxy::ComputedPagesCallback(resultPageRects, resultTotalScaleFactorForPrinting, computedPageMargin, callbackID)); 4655 } 4656 4657 void WebPage::computePagesForPrintingImpl(uint64_t frameID, const PrintInfo& printInfo, Vector<WebCore::IntRect>& resultPageRects, double& resultTotalScaleFactorForPrinting, FloatBoxExtent& computedPageMargin) 4656 4658 { 4657 4659 ASSERT(resultPageRects.isEmpty()); … … 4661 4663 if (m_printContext) { 4662 4664 resultPageRects = m_printContext->pageRects(); 4663 resultTotalScaleFactorForPrinting = m_printContext->computeAutomaticScaleFactor(FloatSize(printInfo.availablePaperWidth, printInfo.availablePaperHeight)) * printInfo.pageSetupScaleFactor; 4665 computedPageMargin = m_printContext->computedPageMargin(printInfo.margin); 4666 auto computedPageSize = m_printContext->computedPageSize(FloatSize(printInfo.availablePaperWidth, printInfo.availablePaperHeight), printInfo.margin); 4667 resultTotalScaleFactorForPrinting = m_printContext->computeAutomaticScaleFactor(computedPageSize) * printInfo.pageSetupScaleFactor; 4664 4668 } 4665 4669 #if PLATFORM(COCOA) -
trunk/Source/WebKit/WebProcess/WebPage/WebPage.h
r244182 r244202 855 855 void endPrinting(); 856 856 void computePagesForPrinting(uint64_t frameID, const PrintInfo&, CallbackID); 857 void computePagesForPrintingImpl(uint64_t frameID, const PrintInfo&, Vector<WebCore::IntRect>& pageRects, double& totalScaleFactor );857 void computePagesForPrintingImpl(uint64_t frameID, const PrintInfo&, Vector<WebCore::IntRect>& pageRects, double& totalScaleFactor, WebCore::FloatBoxExtent& computedMargin); 858 858 859 859 #if PLATFORM(COCOA) -
trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm
r244056 r244202 3282 3282 Vector<WebCore::IntRect> pageRects; 3283 3283 double totalScaleFactor; 3284 computePagesForPrintingImpl(frameID, printInfo, pageRects, totalScaleFactor); 3284 auto margin = printInfo.margin; 3285 computePagesForPrintingImpl(frameID, printInfo, pageRects, totalScaleFactor, margin); 3285 3286 3286 3287 ASSERT(pageRects.size() >= 1);
Note:
See TracChangeset
for help on using the changeset viewer.