Don't use (Details) when exposing SPI
[WebKit-https.git] / Source / WebKit2 / UIProcess / _WKWebViewPrintFormatter.mm
1 /*
2  * Copyright (C) 2014 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #import "config.h"
27 #import "_WKWebViewPrintFormatter.h"
28
29 #if PLATFORM(IOS)
30
31 #import "PrintInfo.h"
32 #import "WKWebViewInternal.h"
33 #import <wtf/RetainPtr.h>
34
35 @interface UIPrintFormatter ()
36 - (CGRect)_pageContentRect:(BOOL)firstPage;
37 - (void)_recalcIfNecessary;
38 @end
39
40 @interface _WKWebViewPrintFormatter ()
41 @property (nonatomic, readonly) WKWebView *webView;
42 @end
43
44 @implementation _WKWebViewPrintFormatter {
45     double _totalScaleFactor;
46     WebKit::PrintInfo _printInfo;
47 }
48
49 - (void)dealloc
50 {
51     [self.webView _endPrinting];
52     [super dealloc];
53 }
54
55 - (WKWebView *)webView
56 {
57     ASSERT([self.view isKindOfClass:[WKWebView class]]);
58     return static_cast<WKWebView *>(self.view);
59 }
60
61 - (NSInteger)_recalcPageCount
62 {
63     ASSERT([self respondsToSelector:@selector(_pageContentRect:)]);
64
65     CGRect firstRect = [self _pageContentRect:YES];
66     CGRect nextRect = [self _pageContentRect:NO];
67     if (CGRectIsEmpty(firstRect) || CGRectIsEmpty(nextRect))
68         return 0;
69
70     // The first page can have a smaller content rect than subsequent pages if a top content inset is specified. Since
71     // WebKit requires a uniform content rect for each page during layout, use the first page rect for all pages if it's
72     // smaller. This is what UIWebView's print formatter does.
73     ASSERT(firstRect.size.width == nextRect.size.width);
74     ASSERT(firstRect.origin.y >= nextRect.origin.y);
75     _printInfo.pageSetupScaleFactor = 1;
76     _printInfo.availablePaperWidth = nextRect.size.width;
77     _printInfo.availablePaperHeight = nextRect.size.height - (firstRect.origin.y - nextRect.origin.y);
78
79     return [self.webView _computePageCountAndStartDrawingToPDFForFrame:_frameToPrint printInfo:_printInfo firstPage:self.startPage computedTotalScaleFactor:_totalScaleFactor];
80 }
81
82 - (CGRect)rectForPageAtIndex:(NSInteger)pageIndex
83 {
84     ASSERT([self respondsToSelector:@selector(_recalcIfNecessary)]);
85     [self _recalcIfNecessary];
86     return [self _pageContentRect:pageIndex == self.startPage];
87 }
88
89 - (void)drawInRect:(CGRect)rect forPageAtIndex:(NSInteger)pageIndex
90 {
91     // CGPDFDocuments use 1-based page indexing.
92     CGPDFPageRef pdfPage = CGPDFDocumentGetPage(self.webView._printedDocument, pageIndex - self.startPage + 1);
93
94     CGContextRef context = UIGraphicsGetCurrentContext();
95     CGContextSaveGState(context);
96
97     CGContextTranslateCTM(context, rect.origin.x, rect.origin.y);
98     CGContextScaleCTM(context, _totalScaleFactor, -_totalScaleFactor);
99     CGContextTranslateCTM(context, 0, -CGPDFPageGetBoxRect(pdfPage, kCGPDFMediaBox).size.height);
100     CGContextDrawPDFPage(context, pdfPage);
101
102     CGContextRestoreGState(context);
103 }
104
105 @end
106
107 #endif // PLATFORM(IOS)