Reviewed by Anders Carlsson and Darin Adler.
authorap@apple.com <ap@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 18 Jan 2011 00:27:12 +0000 (00:27 +0000)
committerap@apple.com <ap@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 18 Jan 2011 00:27:12 +0000 (00:27 +0000)
        https://bugs.webkit.org/show_bug.cgi?id=52595
        Make basic printing work in WebKit2

        * Shared/WebPreferencesStore.h:
        * UIProcess/API/C/WKPreferences.cpp:
        (WKPreferencesSetShouldPrintBackgrounds):
        (WKPreferencesGetShouldPrintBackgrounds):
        * UIProcess/API/C/WKPreferences.h:
        Implement a preference for printing backgrounds.

        * Shared/PrintInfo.cpp: Added.
        (WebKit::PrintInfo::encode):
        (WebKit::PrintInfo::decode):
        * Shared/PrintInfo.h: Added.
        * Shared/mac/PrintInfoMac.mm: Added.
        (WebKit::PrintInfo::PrintInfo):
        A new class for passing page setup information down to the web process.

        * WebKit2.xcodeproj/project.pbxproj:
        * GNUmakefile.am:
        * WebKit2.pro:
        * win/WebKit2.vcproj:
        Added PrintInfo.

        * Scripts/webkit2/messages.py: Added PrintInfo.h to a list of structs.

        * UIProcess/API/mac/WKView.mm:
        (WKViewData): Cache page count and geometry.
        (WebFrameWrapper): Added a wrapper class for adding a WebFrameProxy to an NSDictionary.
        (-[WKView drawRect:]): Added logging.
        (setFrameBeingPrinted): Store a frame into NSPrintOperation's NSPrintInfo, so that all
        methods invoked for this operation would know what's being printed.
        (frameBeingPrinted): Retrieve this data.
        (-[WKView printOperationWithPrintInfo:forFrame:]): Create a print operation that's appropriate
        for the frame.
        (-[WKView knowsPageRange:]): Ask the web process.
        (-[WKView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:]):
        Take over printing, because I couldn't make drawRect: work correctly with WebKit custom fit
        to page implementation.
        (-[WKView _provideTotalScaleFactorForPrintOperation:]): Help AppKit clip correctly.
        (-[WKView rectForPage:]): Return a pre-calculated rect.

        * UIProcess/WebPageProxy.h: Added m_isInPrintingMode to track whether the web page is in
        printing mode. The UI process controls that.

        * UIProcess/WebPageProxy.cpp:
        (WebKit::WebPageProxy::WebPageProxy): Initialize m_isInPrintingMode.
        (WebKit::WebPageProxy::beginPrinting): Change printing mode in web process if the value changes.
        (WebKit::WebPageProxy::endPrinting): Ditto.
        (WebKit::WebPageProxy::computePagesForPrinting): Ask the web process about output page geometry.
        (WebKit::WebPageProxy::drawRectToPDF): Ask the web process about printed page data.

        * WebProcess/WebPage/WebPage.cpp:
        (WebKit::WebPage::close): Delete m_printContext while there is still a Frame pointer.
        (WebKit::WebPage::updatePreferences): Pass through ShouldPrintBackgrounds.
        (WebKit::WebPage::beginPrinting): Switch into printing mode (or update parameters if we're
        already in printing mode).
        (WebKit::WebPage::endPrinting): Delete m_printContext, implicitly calling end().
        (WebKit::WebPage::computePagesForPrinting): Make sure that we're in printing mode, and
        copmute page rects.
        (WebKit::WebPage::drawRectToPDF): Added a CG specific function to create a PDF document out
        of a page rect. It should really work for onscreen content, but we only need it for printing.

        * WebProcess/WebPage/WebPage.h:

        * WebProcess/WebPage/WebPage.messages.in: Added BeginPrinting, EndPrinting,
        ComputePagesForPrinting and DrawRectToPDF.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@75979 268f45cc-cd09-0410-ab3c-d52691b4dbfc

18 files changed:
Source/WebKit2/ChangeLog
Source/WebKit2/GNUmakefile.am
Source/WebKit2/Scripts/webkit2/messages.py
Source/WebKit2/Shared/PrintInfo.cpp [new file with mode: 0644]
Source/WebKit2/Shared/PrintInfo.h [new file with mode: 0644]
Source/WebKit2/Shared/WebPreferencesStore.h
Source/WebKit2/Shared/mac/PrintInfoMac.mm [new file with mode: 0644]
Source/WebKit2/UIProcess/API/C/WKPreferences.cpp
Source/WebKit2/UIProcess/API/C/WKPreferences.h
Source/WebKit2/UIProcess/API/mac/WKView.mm
Source/WebKit2/UIProcess/WebPageProxy.cpp
Source/WebKit2/UIProcess/WebPageProxy.h
Source/WebKit2/WebKit2.pro
Source/WebKit2/WebKit2.xcodeproj/project.pbxproj
Source/WebKit2/WebProcess/WebPage/WebPage.cpp
Source/WebKit2/WebProcess/WebPage/WebPage.h
Source/WebKit2/WebProcess/WebPage/WebPage.messages.in
Source/WebKit2/win/WebKit2.vcproj

index c836cfa..eb21be7 100644 (file)
@@ -1,3 +1,75 @@
+2011-01-17  Alexey Proskuryakov  <ap@apple.com>
+
+        Reviewed by Anders Carlsson and Darin Adler.
+
+        https://bugs.webkit.org/show_bug.cgi?id=52595
+        Make basic printing work in WebKit2
+
+        * Shared/WebPreferencesStore.h:
+        * UIProcess/API/C/WKPreferences.cpp:
+        (WKPreferencesSetShouldPrintBackgrounds):
+        (WKPreferencesGetShouldPrintBackgrounds):
+        * UIProcess/API/C/WKPreferences.h:
+        Implement a preference for printing backgrounds.
+
+        * Shared/PrintInfo.cpp: Added.
+        (WebKit::PrintInfo::encode):
+        (WebKit::PrintInfo::decode):
+        * Shared/PrintInfo.h: Added.
+        * Shared/mac/PrintInfoMac.mm: Added.
+        (WebKit::PrintInfo::PrintInfo):
+        A new class for passing page setup information down to the web process.
+
+        * WebKit2.xcodeproj/project.pbxproj:
+        * GNUmakefile.am:
+        * WebKit2.pro:
+        * win/WebKit2.vcproj:
+        Added PrintInfo.
+
+        * Scripts/webkit2/messages.py: Added PrintInfo.h to a list of structs.
+
+        * UIProcess/API/mac/WKView.mm:
+        (WKViewData): Cache page count and geometry.
+        (WebFrameWrapper): Added a wrapper class for adding a WebFrameProxy to an NSDictionary.
+        (-[WKView drawRect:]): Added logging.
+        (setFrameBeingPrinted): Store a frame into NSPrintOperation's NSPrintInfo, so that all 
+        methods invoked for this operation would know what's being printed.
+        (frameBeingPrinted): Retrieve this data.
+        (-[WKView printOperationWithPrintInfo:forFrame:]): Create a print operation that's appropriate
+        for the frame.
+        (-[WKView knowsPageRange:]): Ask the web process.
+        (-[WKView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:]):
+        Take over printing, because I couldn't make drawRect: work correctly with WebKit custom fit
+        to page implementation.
+        (-[WKView _provideTotalScaleFactorForPrintOperation:]): Help AppKit clip correctly.
+        (-[WKView rectForPage:]): Return a pre-calculated rect.
+
+        * UIProcess/WebPageProxy.h: Added m_isInPrintingMode to track whether the web page is in
+        printing mode. The UI process controls that.
+
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::WebPageProxy): Initialize m_isInPrintingMode.
+        (WebKit::WebPageProxy::beginPrinting): Change printing mode in web process if the value changes.
+        (WebKit::WebPageProxy::endPrinting): Ditto.
+        (WebKit::WebPageProxy::computePagesForPrinting): Ask the web process about output page geometry.
+        (WebKit::WebPageProxy::drawRectToPDF): Ask the web process about printed page data.
+
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::close): Delete m_printContext while there is still a Frame pointer.
+        (WebKit::WebPage::updatePreferences): Pass through ShouldPrintBackgrounds.
+        (WebKit::WebPage::beginPrinting): Switch into printing mode (or update parameters if we're
+        already in printing mode).
+        (WebKit::WebPage::endPrinting): Delete m_printContext, implicitly calling end().
+        (WebKit::WebPage::computePagesForPrinting): Make sure that we're in printing mode, and
+        copmute page rects.
+        (WebKit::WebPage::drawRectToPDF): Added a CG specific function to create a PDF document out
+        of a page rect. It should really work for onscreen content, but we only need it for printing.
+
+        * WebProcess/WebPage/WebPage.h:
+
+        * WebProcess/WebPage/WebPage.messages.in: Added BeginPrinting, EndPrinting,
+        ComputePagesForPrinting and DrawRectToPDF.
+
 2011-01-17  Tony Gentilcore  <tonyg@chromium.org>
 
         Reviewed by Alexey Proskuryakov.
index ddc4d12..be64c8e 100644 (file)
@@ -184,6 +184,8 @@ libWebKit2_la_SOURCES = \
        Source/WebKit2/Shared/OriginAndDatabases.h \
        Source/WebKit2/Shared/PlatformPopupMenuData.cpp \
        Source/WebKit2/Shared/PlatformPopupMenuData.h \
+       Source/WebKit2/Shared/PrintInfo.cpp \
+       Source/WebKit2/Shared/PrintInfo.h \
        Source/WebKit2/Shared/Plugins/Netscape/NetscapePluginModule.cpp \
        Source/WebKit2/Shared/Plugins/Netscape/NetscapePluginModule.h \
        Source/WebKit2/Shared/Plugins/Netscape/x11/NetscapePluginModuleX11.cpp \
index 6b6431e..8fc0eaa 100644 (file)
@@ -252,6 +252,7 @@ def struct_or_class(namespace, type):
         'WebCore::CompositionUnderline',
         'WebCore::KeypressCommand',
         'WebCore::PluginInfo',
+        'WebCore::PrintInfo',
         'WebCore::ViewportArguments',
         'WebCore::WindowFeatures',
         'WebKit::DrawingAreaInfo',
diff --git a/Source/WebKit2/Shared/PrintInfo.cpp b/Source/WebKit2/Shared/PrintInfo.cpp
new file mode 100644 (file)
index 0000000..6c27a73
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2011 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "PrintInfo.h"
+
+#include "ArgumentDecoder.h"
+#include "ArgumentEncoder.h"
+#include "Arguments.h"
+
+namespace WebKit {
+
+PrintInfo::PrintInfo()
+    : pageSetupScaleFactor(0)
+    , availablePaperWidth(0)
+    , availablePaperHeight(0)
+{
+}
+
+void PrintInfo::encode(CoreIPC::ArgumentEncoder* encoder) const
+{
+    encoder->encode(CoreIPC::In(pageSetupScaleFactor, availablePaperWidth, availablePaperHeight));
+}
+
+bool PrintInfo::decode(CoreIPC::ArgumentDecoder* decoder, PrintInfo& info)
+{
+    return decoder->decode(CoreIPC::Out(info.pageSetupScaleFactor, info.availablePaperWidth, info.availablePaperHeight));
+}
+
+}
diff --git a/Source/WebKit2/Shared/PrintInfo.h b/Source/WebKit2/Shared/PrintInfo.h
new file mode 100644 (file)
index 0000000..d6ccd4a
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2011 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef PrintInfo_h
+#define PrintInfo_h
+
+#include <wtf/Platform.h>
+
+#ifdef __OBJC__
+@class NSPrintInfo;
+#else
+class NSPrintInfo;
+#endif
+
+namespace CoreIPC {
+    class ArgumentDecoder;
+    class ArgumentEncoder;
+}
+
+namespace WebKit {
+
+struct PrintInfo {
+    PrintInfo();
+    explicit PrintInfo(NSPrintInfo *);
+
+    float pageSetupScaleFactor;
+    float availablePaperWidth;
+    float availablePaperHeight;
+
+    void encode(CoreIPC::ArgumentEncoder*) const;
+    static bool decode(CoreIPC::ArgumentDecoder*, PrintInfo&);
+};
+
+}
+
+#endif
index 28a6f48..e8cf244 100644 (file)
@@ -64,6 +64,7 @@ namespace WebKit {
     macro(AuthorAndUserStylesEnabled, authorAndUserStylesEnabled, Bool, bool, true) \
     macro(PaginateDuringLayoutEnabled, paginateDuringLayoutEnabled, Bool, bool, false) \
     macro(DOMPasteAllowed, domPasteAllowed, Bool, bool, false) \
+    macro(ShouldPrintBackgrounds, shouldPrintBackgrounds, Bool, bool, false) \
     \
 
 #define FOR_EACH_WEBKIT_DOUBLE_PREFERENCE(macro) \
diff --git a/Source/WebKit2/Shared/mac/PrintInfoMac.mm b/Source/WebKit2/Shared/mac/PrintInfoMac.mm
new file mode 100644 (file)
index 0000000..78cf9df
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2011 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "PrintInfo.h"
+
+namespace WebKit {
+
+PrintInfo::PrintInfo(NSPrintInfo *printInfo)
+    : pageSetupScaleFactor([[[printInfo dictionary] objectForKey:NSPrintScalingFactor] floatValue])
+    , availablePaperWidth([printInfo paperSize].width - [printInfo leftMargin] - [printInfo rightMargin])
+    , availablePaperHeight([printInfo paperSize].height - [printInfo topMargin] - [printInfo bottomMargin])
+{
+    ASSERT(printInfo);
+}
+
+}
index 598e4e9..379859c 100644 (file)
@@ -390,6 +390,16 @@ bool WKPreferencesGetAuthorAndUserStylesEnabled(WKPreferencesRef preferencesRef)
     return toImpl(preferencesRef)->authorAndUserStylesEnabled();
 }
 
+void WKPreferencesSetShouldPrintBackgrounds(WKPreferencesRef preferencesRef, bool flag)
+{
+    toImpl(preferencesRef)->setShouldPrintBackgrounds(flag);
+}
+
+bool WKPreferencesGetShouldPrintBackgrounds(WKPreferencesRef preferencesRef)
+{
+    return toImpl(preferencesRef)->shouldPrintBackgrounds();
+}
+
 void WKPreferencesSetWebArchiveDebugModeEnabled(WKPreferencesRef preferencesRef, bool enabled)
 {
     toImpl(preferencesRef)->setWebArchiveDebugModeEnabled(enabled);
index 29dda64..8116575 100644 (file)
@@ -142,6 +142,10 @@ WK_EXPORT bool WKPreferencesGetDNSPrefetchingEnabled(WKPreferencesRef preference
 WK_EXPORT void WKPreferencesSetAuthorAndUserStylesEnabled(WKPreferencesRef preferences, bool enabled);
 WK_EXPORT bool WKPreferencesGetAuthorAndUserStylesEnabled(WKPreferencesRef preferences);
 
+// Defaults to false.
+WK_EXPORT void WKPreferencesSetShouldPrintBackgrounds(WKPreferencesRef preferences, bool shouldPrintBackgrounds);
+WK_EXPORT bool WKPreferencesGetShouldPrintBackgrounds(WKPreferencesRef preferences);
+
 #ifdef __cplusplus
 }
 #endif
index f52645c..6eccc6e 100644 (file)
@@ -35,6 +35,7 @@
 #import "NativeWebKeyboardEvent.h"
 #import "PDFViewController.h"
 #import "PageClientImpl.h"
+#import "PrintInfo.h"
 #import "RunLoop.h"
 #import "TextChecker.h"
 #import "TextCheckerState.h"
 - (void)speakString:(NSString *)string;
 @end
 
+@interface NSView (Details)
+- (void)_recursiveDisplayRectIfNeededIgnoringOpacity:(NSRect)rect isVisibleRect:(BOOL)isVisibleRect rectIsVisibleRectForView:(NSView *)visibleView topView:(BOOL)topView;
+@end
+
 @interface NSWindow (Details)
 - (NSRect)_growBoxRect;
 - (BOOL)_updateGrowBoxForWindowFrameChange;
@@ -125,6 +130,9 @@ typedef HashMap<String, ValidationVector> ValidationMap;
     unsigned _selectionStart;
     unsigned _selectionEnd;
 
+    Vector<IntRect> _printingPageRects;
+    double _totalScaleFactorForPrinting;
+
     bool _inBecomeFirstResponder;
     bool _inResignFirstResponder;
 }
@@ -133,6 +141,36 @@ typedef HashMap<String, ValidationVector> ValidationMap;
 @implementation WKViewData
 @end
 
+@interface WebFrameWrapper : NSObject {
+@public
+    RefPtr<WebFrameProxy> _frame;
+}
+
+- (id)initWithFrameProxy:(WebFrameProxy*)frame;
+- (WebFrameProxy*)webFrame;
+@end
+
+@implementation WebFrameWrapper
+
+- (id)initWithFrameProxy:(WebFrameProxy*)frame
+{
+    self = [super init];
+    if (!self)
+        return nil;
+
+    _frame = frame;
+    return self;
+}
+
+- (WebFrameProxy*)webFrame
+{
+    return _frame.get();
+}
+
+@end
+
+NSString * const PrintedFrameKey = @"WebKitPrintedFrameKey";
+
 @interface NSObject (NSTextInputContextDetails)
 - (BOOL)wantsToHandleMouseEvents;
 - (BOOL)handleMouseEvent:(NSEvent *)event;
@@ -1192,6 +1230,7 @@ static void extractUnderlines(NSAttributedString *string, Vector<CompositionUnde
 
 - (void)drawRect:(NSRect)rect
 {
+    LOG(View, "drawRect: x:%g, y:%g, width:%g, height:%g", rect.origin.x, rect.origin.y, rect.size.width, rect.size.height);
     if (useNewDrawingArea()) {
         if (DrawingAreaProxyImpl* drawingArea = static_cast<DrawingAreaProxyImpl*>(_data->_page->drawingArea())) {
             CGContextRef context = static_cast<CGContextRef>([[NSGraphicsContext currentContext] graphicsPort]);
@@ -1282,14 +1321,31 @@ static void extractUnderlines(NSAttributedString *string, Vector<CompositionUnde
     return (NSInteger)self;
 }
 
+static void setFrameBeingPrinted(NSPrintOperation *printOperation, WebFrameProxy* frame)
+{
+    RetainPtr<WebFrameWrapper> frameWrapper(AdoptNS, [[WebFrameWrapper alloc] initWithFrameProxy:frame]);
+    [[[printOperation printInfo] dictionary] setObject:frameWrapper.get() forKey:PrintedFrameKey];
+}
+
+static WebFrameProxy* frameBeingPrinted()
+{
+    return [[[[[NSPrintOperation currentOperation] printInfo] dictionary] objectForKey:PrintedFrameKey] webFrame];
+}
+
 - (NSPrintOperation *)printOperationWithPrintInfo:(NSPrintInfo *)printInfo forFrame:(WKFrameRef)frameRef
 {
+    LOG(View, "Creating an NSPrintOperation for frame '%s'", toImpl(frameRef)->url().utf8().data());
+    NSPrintOperation *printOperation;
+
     // Only the top frame can currently contain a PDF view.
     if (_data->_pdfViewController) {
         ASSERT(toImpl(frameRef)->isMainFrame());
-        return _data->_pdfViewController->makePrintOperation(printInfo);
-    }
-    return [NSPrintOperation printOperationWithView:self printInfo:printInfo];
+        printOperation = _data->_pdfViewController->makePrintOperation(printInfo);
+    } else
+        printOperation = [NSPrintOperation printOperationWithView:self printInfo:printInfo];
+
+    setFrameBeingPrinted(printOperation, toImpl(frameRef));
+    return printOperation;
 }
 
 - (BOOL)canChangeFrameLayout:(WKFrameRef)frameRef
@@ -1298,6 +1354,91 @@ static void extractUnderlines(NSAttributedString *string, Vector<CompositionUnde
     return !toImpl(frameRef)->isMainFrame() || !_data->_pdfViewController;
 }
 
+// Return the number of pages available for printing
+- (BOOL)knowsPageRange:(NSRangePointer)range
+{
+    LOG(View, "knowsPageRange:");
+    WebFrameProxy* frame = frameBeingPrinted();
+    ASSERT(frame);
+
+    if (frame->isMainFrame() && _data->_pdfViewController)
+        return [super knowsPageRange:range];
+
+    _data->_page->computePagesForPrinting(frame, PrintInfo([[NSPrintOperation currentOperation] printInfo]), _data->_printingPageRects, _data->_totalScaleFactorForPrinting);
+
+    *range = NSMakeRange(1, _data->_printingPageRects.size());
+    return YES;
+}
+
+// Take over printing. AppKit applies incorrect clipping, and doesn't print pages beyond the first one.
+- (void)_recursiveDisplayRectIfNeededIgnoringOpacity:(NSRect)rect isVisibleRect:(BOOL)isVisibleRect rectIsVisibleRectForView:(NSView *)visibleView topView:(BOOL)topView
+{
+    if ([NSGraphicsContext currentContextDrawingToScreen]) {
+        // FIXME: 
+        _data->_page->endPrinting();
+        [super _recursiveDisplayRectIfNeededIgnoringOpacity:rect isVisibleRect:isVisibleRect rectIsVisibleRectForView:visibleView topView:topView];
+        return;
+    }
+
+    LOG(View, "Printing rect x:%g, y:%g, width:%g, height:%g", rect.origin.x, rect.origin.y, rect.size.width, rect.size.height);
+
+    ASSERT(self == visibleView);
+    ASSERT(frameBeingPrinted());
+
+    WebFrameProxy* frame = frameBeingPrinted();
+    ASSERT(frame);
+
+    _data->_page->beginPrinting(frame, PrintInfo([[NSPrintOperation currentOperation] printInfo]));
+
+    // FIXME: This is optimized for print preview. Get the whole document at once when actually printing.
+    Vector<uint8_t> pdfData;
+    _data->_page->drawRectToPDF(frame, IntRect(rect), pdfData);
+
+    RetainPtr<CGDataProviderRef> pdfDataProvider(AdoptCF, CGDataProviderCreateWithData(0, pdfData.data(), pdfData.size(), 0));
+    RetainPtr<CGPDFDocumentRef> pdfDocument(AdoptCF, CGPDFDocumentCreateWithProvider(pdfDataProvider.get()));
+    if (!pdfDocument) {
+        LOG_ERROR("Couldn't create a PDF document with data passed for printing");
+        return;
+    }
+
+    CGPDFPageRef pdfPage = CGPDFDocumentGetPage(pdfDocument.get(), 1);
+    if (!pdfPage) {
+        LOG_ERROR("Printing data doesn't have page 1");
+        return;
+    }
+
+    NSGraphicsContext *nsGraphicsContext = [NSGraphicsContext currentContext];
+    CGContextRef context = static_cast<CGContextRef>([nsGraphicsContext graphicsPort]);
+
+    CGContextSaveGState(context);
+    // Flip the destination.
+    CGContextScaleCTM(context, 1, -1);
+    CGContextTranslateCTM(context, 0, -rect.size.height);
+    CGContextDrawPDFPage(context, pdfPage);
+    CGContextRestoreGState(context);
+}
+
+// FIXME 3491344: This is an AppKit-internal method that we need to override in order
+// to get our shrink-to-fit to work with a custom pagination scheme. We can do this better
+// if AppKit makes it SPI/API.
+- (CGFloat)_provideTotalScaleFactorForPrintOperation:(NSPrintOperation *)printOperation 
+{
+    return _data->_totalScaleFactorForPrinting;
+}
+
+// Return the drawing rectangle for a particular page number
+- (NSRect)rectForPage:(NSInteger)page
+{
+    WebFrameProxy* frame = frameBeingPrinted();
+    ASSERT(frame);
+
+    if (frame->isMainFrame() && _data->_pdfViewController)
+        return [super rectForPage:page];
+
+    LOG(View, "rectForPage:%d -> x %d, y %d, width %d, height %d\n", (int)page, _data->_printingPageRects[page - 1].x(), _data->_printingPageRects[page - 1].y(), _data->_printingPageRects[page - 1].width(), _data->_printingPageRects[page - 1].height());
+    return _data->_printingPageRects[page - 1];
+}
+
 @end
 
 @implementation WKView (Internal)
index 650bd57..f433fbd 100644 (file)
@@ -33,6 +33,7 @@
 #include "MessageID.h"
 #include "NativeWebKeyboardEvent.h"
 #include "PageClient.h"
+#include "PrintInfo.h"
 #include "SessionState.h"
 #include "StringPairVector.h"
 #include "TextChecker.h"
@@ -111,6 +112,7 @@ WebPageProxy::WebPageProxy(PageClient* pageClient, WebContext* context, WebPageG
     , m_useFixedLayout(false)
     , m_isValid(true)
     , m_isClosed(false)
+    , m_isInPrintingMode(false)
     , m_inDecidePolicyForMIMEType(false)
     , m_syncMimeTypePolicyActionIsValid(false)
     , m_syncMimeTypePolicyAction(PolicyUse)
@@ -2330,4 +2332,36 @@ void WebPageProxy::backForwardRemovedItem(uint64_t itemID)
     process()->send(Messages::WebPage::DidRemoveBackForwardItem(itemID), m_pageID);
 }
 
+void WebPageProxy::beginPrinting(WebFrameProxy* frame, const PrintInfo& printInfo)
+{
+    if (m_isInPrintingMode)
+        return;
+
+    m_isInPrintingMode = true;
+    process()->send(Messages::WebPage::BeginPrinting(frame->frameID(), printInfo), m_pageID);
+}
+
+void WebPageProxy::endPrinting()
+{
+    if (!m_isInPrintingMode)
+        return;
+
+    m_isInPrintingMode = false;
+    process()->send(Messages::WebPage::EndPrinting(), m_pageID);
+}
+
+void WebPageProxy::computePagesForPrinting(WebFrameProxy* frame, const PrintInfo& printInfo, Vector<WebCore::IntRect>& resultPageRects, double& resultTotalScaleFactorForPrinting)
+{
+    // Layout for printing can take a long time, but we need to have the answer.
+    process()->sendSync(Messages::WebPage::ComputePagesForPrinting(frame->frameID(), printInfo), Messages::WebPage::ComputePagesForPrinting::Reply(resultPageRects, resultTotalScaleFactorForPrinting), m_pageID);
+}
+
+#if PLATFORM(MAC)
+void WebPageProxy::drawRectToPDF(WebFrameProxy* frame, const IntRect& rect, Vector<uint8_t>& pdfData)
+{
+    // Printing can take a long time, but we need to have the answer.
+    process()->sendSync(Messages::WebPage::DrawRectToPDF(frame->frameID(), rect), Messages::WebPage::DrawRectToPDF::Reply(pdfData), m_pageID);
+}
+#endif
+
 } // namespace WebKit
index 74678ca..4a9e478 100644 (file)
@@ -101,6 +101,7 @@ class WebProcessProxy;
 class WebURLRequest;
 class WebWheelEvent;
 struct PlatformPopupMenuData;
+struct PrintInfo;
 struct WebPageCreationParameters;
 struct WebPopupItem;
 
@@ -341,6 +342,13 @@ public:
     void setSmartInsertDeleteEnabled(bool);
 #endif
 
+    void beginPrinting(WebFrameProxy*, const PrintInfo&);
+    void endPrinting();
+    void computePagesForPrinting(WebFrameProxy*, const PrintInfo&, Vector<WebCore::IntRect>& resultPageRects, double& resultTotalScaleFactorForPrinting);
+#if PLATFORM(MAC)
+    void drawRectToPDF(WebFrameProxy*, const WebCore::IntRect&, Vector<uint8_t>& pdfData);
+#endif
+
 private:
     WebPageProxy(PageClient*, WebContext*, WebPageGroup*, uint64_t pageID);
 
@@ -580,6 +588,8 @@ private:
     // Whether WebPageProxy::close() has been called on this page.
     bool m_isClosed;
 
+    bool m_isInPrintingMode;
+
     bool m_inDecidePolicyForMIMEType;
     bool m_syncMimeTypePolicyActionIsValid;
     WebCore::PolicyAction m_syncMimeTypePolicyAction;
index 2c8d331..f4e007b 100644 (file)
@@ -266,6 +266,7 @@ HEADERS += \
     Shared/NotImplemented.h \
     Shared/OriginAndDatabases.h \
     Shared/PlatformPopupMenuData.h \
+    Shared/PrintInfo.h \
     Shared/SameDocumentNavigationType.h \
     Shared/SessionState.h \
     Shared/StringPairVector.h \
@@ -492,6 +493,7 @@ SOURCES += \
     Shared/MutableDictionary.cpp \
     Shared/OriginAndDatabases.cpp \
     Shared/PlatformPopupMenuData.cpp \
+    Shared/PrintInfo.cpp \
     Shared/SessionState.cpp \
     Shared/VisitedLinkTable.cpp \
     Shared/WebBackForwardListItem.cpp \
index 80cb9f3..20143f5 100644 (file)
                D3B9484711FF4B6500032B39 /* WebPopupMenu.h in Headers */ = {isa = PBXBuildFile; fileRef = D3B9484311FF4B6500032B39 /* WebPopupMenu.h */; };
                D3B9484811FF4B6500032B39 /* WebSearchPopupMenu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D3B9484411FF4B6500032B39 /* WebSearchPopupMenu.cpp */; };
                D3B9484911FF4B6500032B39 /* WebSearchPopupMenu.h in Headers */ = {isa = PBXBuildFile; fileRef = D3B9484511FF4B6500032B39 /* WebSearchPopupMenu.h */; };
+               E18C92F412DB9E7100CF2AEB /* PrintInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E18C92F312DB9E7100CF2AEB /* PrintInfo.cpp */; };
+               E18C92F512DB9E7A00CF2AEB /* PrintInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E18C92F312DB9E7100CF2AEB /* PrintInfo.cpp */; };
+               E18C92F612DB9E9400CF2AEB /* PrintInfoMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = E1CC1B8F12D7EADF00625838 /* PrintInfoMac.mm */; };
+               E1CC1B9012D7EADF00625838 /* PrintInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = E1CC1B8E12D7EADF00625838 /* PrintInfo.h */; };
+               E1CC1B9112D7EADF00625838 /* PrintInfoMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = E1CC1B8F12D7EADF00625838 /* PrintInfoMac.mm */; };
                E1EE53E311F8CFC000CCBEE4 /* InjectedBundlePageEditorClient.h in Headers */ = {isa = PBXBuildFile; fileRef = E1EE53DC11F8CF9F00CCBEE4 /* InjectedBundlePageEditorClient.h */; };
                E1EE53E711F8CFFB00CCBEE4 /* InjectedBundlePageEditorClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E1EE53E611F8CFFB00CCBEE4 /* InjectedBundlePageEditorClient.cpp */; };
                ED82A7F2128C6FAF004477B3 /* WKBundlePageOverlay.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A22F0FF1289FCD90085E74F /* WKBundlePageOverlay.h */; settings = {ATTRIBUTES = (Public, ); }; };
                D3B9484311FF4B6500032B39 /* WebPopupMenu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebPopupMenu.h; sourceTree = "<group>"; };
                D3B9484411FF4B6500032B39 /* WebSearchPopupMenu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebSearchPopupMenu.cpp; sourceTree = "<group>"; };
                D3B9484511FF4B6500032B39 /* WebSearchPopupMenu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebSearchPopupMenu.h; sourceTree = "<group>"; };
+               E18C92F312DB9E7100CF2AEB /* PrintInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PrintInfo.cpp; sourceTree = "<group>"; };
+               E1CC1B8E12D7EADF00625838 /* PrintInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PrintInfo.h; sourceTree = "<group>"; };
+               E1CC1B8F12D7EADF00625838 /* PrintInfoMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PrintInfoMac.mm; sourceTree = "<group>"; };
                E1EE53DC11F8CF9F00CCBEE4 /* InjectedBundlePageEditorClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InjectedBundlePageEditorClient.h; sourceTree = "<group>"; };
                E1EE53E611F8CFFB00CCBEE4 /* InjectedBundlePageEditorClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InjectedBundlePageEditorClient.cpp; sourceTree = "<group>"; };
                F6113E24126CE1820057D0A7 /* WebUserContentURLPattern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebUserContentURLPattern.h; sourceTree = "<group>"; };
                                BCCF672C12C7EDF7008F9C35 /* OriginAndDatabases.h */,
                                BCC43AB8127B95DC00317F16 /* PlatformPopupMenuData.cpp */,
                                BCC43AB9127B95DC00317F16 /* PlatformPopupMenuData.h */,
+                               E18C92F312DB9E7100CF2AEB /* PrintInfo.cpp */,
+                               E1CC1B8E12D7EADF00625838 /* PrintInfo.h */,
                                BC2D021612AC41CB00E732A3 /* SameDocumentNavigationType.h */,
                                1AAB4A8C1296F0A20023952F /* SandboxExtension.h */,
                                1AA41AB412C02EC4002BE67B /* SelectionState.h */,
                                C02BFF1D1251502E009CCBEA /* NativeWebKeyboardEventMac.mm */,
                                BCF505E61243047B005955AE /* PlatformCertificateInfo.mm */,
                                BCF505E51243047B005955AE /* PlatformCertificateInfo.h */,
+                               E1CC1B8F12D7EADF00625838 /* PrintInfoMac.mm */,
                                BC9E95D211449B0300870E71 /* UpdateChunk.cpp */,
                                BC9E95D111449B0300870E71 /* UpdateChunk.h */,
                                BCE23262122C6CF300D5C35A /* WebCoreArgumentCodersMac.mm */,
                                BC1BE1F212D54DBD0004A228 /* WebGeolocationProvider.h in Headers */,
                                1A2C307112D555450063DAA2 /* ContextMenuState.h in Headers */,
                                518D2CCB12D51DFB003BB93B /* SessionState.h in Headers */,
+                               E1CC1B9012D7EADF00625838 /* PrintInfo.h in Headers */,
                                BC54CACB12D64291005C67B0 /* WebGeolocationManagerProxy.h in Headers */,
                                BC54CC1212D674EE005C67B0 /* WKGeolocationManager.h in Headers */,
                                BC0E5FE512D697160012A72A /* WebGeolocationManager.h in Headers */,
                                1A6FA31111E3921E00DB1371 /* MainMac.cpp in Sources */,
                                1A1FA285127A13BC0050E709 /* NPObjectProxy.cpp in Sources */,
                                1A1FA35D127A45BF0050E709 /* NPObjectMessageReceiver.cpp in Sources */,
+                               E18C92F512DB9E7A00CF2AEB /* PrintInfo.cpp in Sources */,
+                               E18C92F612DB9E9400CF2AEB /* PrintInfoMac.mm in Sources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                                BC1BE1E112D54A410004A228 /* WebGeolocationClient.cpp in Sources */,
                                BC1BE1F312D54DBD0004A228 /* WebGeolocationProvider.cpp in Sources */,
                                518D2CCA12D51DFB003BB93B /* SessionState.cpp in Sources */,
+                               E1CC1B9112D7EADF00625838 /* PrintInfoMac.mm in Sources */,
+                               E18C92F412DB9E7100CF2AEB /* PrintInfo.cpp in Sources */,
                                BC54CACC12D64291005C67B0 /* WebGeolocationManagerProxy.cpp in Sources */,
                                BC54CC1312D674EE005C67B0 /* WKGeolocationManager.cpp in Sources */,
                                BC0E5FE612D697160012A72A /* WebGeolocationManager.cpp in Sources */,
index 97ee909..2259387 100644 (file)
@@ -36,6 +36,7 @@
 #include "PageOverlay.h"
 #include "PluginProxy.h"
 #include "PluginView.h"
+#include "PrintInfo.h"
 #include "SessionState.h"
 #include "ShareableBitmap.h"
 #include "WebBackForwardList.h"
 #include <WebCore/KeyboardEvent.h>
 #include <WebCore/Page.h>
 #include <WebCore/PlatformKeyboardEvent.h>
+#include <WebCore/PrintContext.h>
 #include <WebCore/RenderTreeAsText.h>
+#include <WebCore/RenderLayer.h>
+#include <WebCore/RenderView.h>
 #include <WebCore/ReplaceSelectionCommand.h>
 #include <WebCore/ResourceRequest.h>
 #include <WebCore/Settings.h>
@@ -362,6 +366,8 @@ void WebPage::close()
 
     m_sandboxExtensionTracker.invalidate();
 
+    m_printContext = nullptr;
+
     m_mainFrame->coreFrame()->loader()->detachFromParent();
     m_page.clear();
 
@@ -1188,6 +1194,7 @@ void WebPage::updatePreferences(const WebPreferencesStore& store)
     settings->setAuthorAndUserStylesEnabled(store.getBoolValueForKey(WebPreferencesKey::authorAndUserStylesEnabledKey()));
     settings->setPaginateDuringLayoutEnabled(store.getBoolValueForKey(WebPreferencesKey::paginateDuringLayoutEnabledKey()));
     settings->setDOMPasteAllowed(store.getBoolValueForKey(WebPreferencesKey::domPasteAllowedKey()));
+    settings->setShouldPrintBackgrounds(store.getBoolValueForKey(WebPreferencesKey::shouldPrintBackgroundsKey()));
 
     settings->setMinimumFontSize(store.getUInt32ValueForKey(WebPreferencesKey::minimumFontSizeKey()));
     settings->setMinimumLogicalFontSize(store.getUInt32ValueForKey(WebPreferencesKey::minimumLogicalFontSizeKey()));
@@ -1672,4 +1679,79 @@ void WebPage::stopSpeaking()
 
 #endif
 
+void WebPage::beginPrinting(uint64_t frameID, const PrintInfo& printInfo)
+{
+    WebFrame* frame = WebProcess::shared().webFrame(frameID);
+    if (!frame)
+        return;
+
+    Frame* coreFrame = frame->coreFrame();
+    if (!coreFrame)
+        return;
+
+    if (!m_printContext)
+        m_printContext = adoptPtr(new PrintContext(coreFrame));
+
+    m_printContext->begin(printInfo.availablePaperWidth, printInfo.availablePaperHeight);
+}
+
+void WebPage::endPrinting()
+{
+    m_printContext = nullptr;
+}
+
+void WebPage::computePagesForPrinting(uint64_t frameID, const PrintInfo& printInfo, Vector<IntRect>& resultPageRects, double& resultTotalScaleFactorForPrinting)
+{
+    beginPrinting(frameID, printInfo);
+
+    WebFrame* frame = WebProcess::shared().webFrame(frameID);
+    if (!frame)
+        return;
+
+    float fullPageHeight;
+    m_printContext->computePageRects(FloatRect(0, 0, printInfo.availablePaperWidth, printInfo.availablePaperHeight), 0, 0, printInfo.pageSetupScaleFactor, fullPageHeight, true);
+
+    resultTotalScaleFactorForPrinting = m_printContext->computeAutomaticScaleFactor(printInfo.availablePaperWidth) * printInfo.pageSetupScaleFactor;
+    resultPageRects = m_printContext->pageRects();
+
+    // If we're asked to print, we should actually print at least a blank page.
+    if (resultPageRects.isEmpty())
+        resultPageRects.append(IntRect(0, 0, 1, 1));
+}
+
+#if PLATFORM(MAC)
+// FIXME: Find a better place for Mac specific code.
+void WebPage::drawRectToPDF(uint64_t frameID, const WebCore::IntRect& rect, Vector<uint8_t>& pdfData)
+{
+    WebFrame* frame = WebProcess::shared().webFrame(frameID);
+    if (!frame)
+        return;
+
+    Frame* coreFrame = frame->coreFrame();
+    if (!coreFrame)
+        return;
+
+    ASSERT(coreFrame->document()->printing());
+
+    RetainPtr<CFMutableDataRef> pdfPageData(AdoptCF, CFDataCreateMutable(0, 0));
+
+    // FIXME: Use CGDataConsumerCreate with callbacks to avoid copying the data.
+    RetainPtr<CGDataConsumerRef> pdfDataConsumer(AdoptCF, CGDataConsumerCreateWithCFData(pdfPageData.get()));
+
+    CGRect mediaBox = CGRectMake(0, 0, frame->size().width(), frame->size().height());
+    RetainPtr<CGContextRef> context(AdoptCF, CGPDFContextCreate(pdfDataConsumer.get(), &mediaBox, 0));
+    CFDictionaryRef pageInfo = CFDictionaryCreateMutable(0, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
+    CGPDFContextBeginPage(context.get(), pageInfo);
+
+    GraphicsContext ctx(context.get());
+    m_printContext->spoolRect(ctx, rect);
+
+    CGPDFContextEndPage(context.get());
+    CGPDFContextClose(context.get());
+
+    pdfData.resize(CFDataGetLength(pdfPageData.get()));
+    CFDataGetBytes(pdfPageData.get(), CFRangeMake(0, pdfData.size()), pdfData.data());
+}
+#endif
+
 } // namespace WebKit
index 21ca442..7649ab6 100644 (file)
@@ -72,6 +72,7 @@ namespace WebCore {
     class GraphicsContext;
     class KeyboardEvent;
     class Page;
+    class PrintContext;
     class ResourceRequest;
     class SharedBuffer;
 }
@@ -95,7 +96,7 @@ class WebOpenPanelResultListener;
 class WebPageGroupProxy;
 class WebPopupMenu;
 class WebWheelEvent;
-
+struct PrintInfo;
 struct WebPageCreationParameters;
 struct WebPreferencesStore;
 
@@ -300,6 +301,13 @@ public:
     void replaceSelectionWithText(WebCore::Frame*, const String&);
     void performDragControllerAction(uint64_t action, WebCore::IntPoint clientPosition, WebCore::IntPoint globalPosition, uint64_t draggingSourceOperationMask, const WTF::String& dragStorageName, uint32_t flags);
 
+    void beginPrinting(uint64_t frameID, const PrintInfo&);
+    void endPrinting();
+    void computePagesForPrinting(uint64_t frameID, const PrintInfo&, Vector<WebCore::IntRect>& resultPageRects, double& resultTotalScaleFactorForPrinting);
+#if PLATFORM(MAC)
+    void drawRectToPDF(uint64_t frameID, const WebCore::IntRect&, Vector<uint8_t>& pdfData);
+#endif
+
     bool mainFrameHasCustomRepresentation() const;
 
 private:
@@ -480,6 +488,8 @@ private:
     RefPtr<WebOpenPanelResultListener> m_activeOpenPanelResultListener;
     GeolocationPermissionRequestManager m_geolocationPermissionRequestManager;
 
+    OwnPtr<WebCore::PrintContext> m_printContext;
+
     SandboxExtensionTracker m_sandboxExtensionTracker;
     uint64_t m_pageID;
 };
index 3a2e394..bd6bf1a 100644 (file)
@@ -128,6 +128,14 @@ messages -> WebPage {
 
     SetWindowResizerSize(WebCore::IntSize intersectsView)
 
+    # Printing.
+    BeginPrinting(uint64_t frameID, WebKit::PrintInfo printInfo);
+    EndPrinting();
+    ComputePagesForPrinting(uint64_t frameID, WebKit::PrintInfo printInfo) -> (Vector<WebCore::IntRect> pageRects, double totalScaleFactorForPrinting)
+#if PLATFORM(MAC)
+    DrawRectToPDF(uint64_t frameID, WebCore::IntRect rect) -> (Vector<uint8_t> pdfData)
+#endif
+
     // FIXME: This a dummy message, to avoid breaking the build for platforms that don't require
     // any synchronous messages, and should be removed when <rdar://problem/8775115> is fixed.
     Dummy() -> (bool dummyReturn)
index 2c548c3..0742c6e 100755 (executable)
                                >
                        </File>
                        <File
+                               RelativePath="..\Shared\PrintInfo.cpp"
+                               >
+                       </File>
+                       <File
+                               RelativePath="..\Shared\PrintInfo.h"
+                               >
+                       </File>
+                       <File
                                RelativePath="..\Shared\SameDocumentNavigationType.h"
                                >
                        </File>