Source/WebCore: WebCore change for <rdar://problem/10463059> Cannot print USPS shippi...
[WebKit-https.git] / Source / WebKit2 / WebProcess / Plugins / PDF / BuiltInPDFView.h
1 /*
2  * Copyright (C) 2011 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 #ifndef BuiltInPDFView_h
27 #define BuiltInPDFView_h
28
29 #include "Plugin.h"
30 #include <WebCore/ScrollableArea.h>
31 #include <wtf/RetainPtr.h>
32
33 typedef const struct OpaqueJSContext* JSContextRef;
34 typedef struct OpaqueJSValue* JSObjectRef;
35 typedef const struct OpaqueJSValue* JSValueRef;
36
37 namespace WebCore {
38     struct PluginInfo;
39 }
40
41 namespace WebKit {
42
43 class PluginView;
44 class WebFrame;
45
46 class BuiltInPDFView : public Plugin, private WebCore::ScrollableArea {
47 public:
48     static PassRefPtr<BuiltInPDFView> create(WebFrame*);
49     ~BuiltInPDFView();
50
51     static WebCore::PluginInfo pluginInfo();
52
53 private:
54     explicit BuiltInPDFView(WebFrame*);
55
56     // Regular plug-ins don't need access to view, but we add scrollbars to embedding FrameView for proper event handling.
57     PluginView* pluginView();
58     const PluginView* pluginView() const;
59
60     void updateScrollbars();
61     void didAddHorizontalScrollbar(WebCore::Scrollbar*);
62     void willRemoveHorizontalScrollbar(WebCore::Scrollbar*);
63     void didAddVerticalScrollbar(WebCore::Scrollbar*);
64     void willRemoveVerticalScrollbar(WebCore::Scrollbar*);
65     PassRefPtr<WebCore::Scrollbar> createScrollbar(WebCore::ScrollbarOrientation);
66     void destroyScrollbar(WebCore::ScrollbarOrientation);
67     void addArchiveResource();
68     void pdfDocumentDidLoad();
69     void calculateSizes();
70     void paintBackground(WebCore::GraphicsContext*, const WebCore::IntRect& dirtyRect);
71     void paintContent(WebCore::GraphicsContext*, const WebCore::IntRect& dirtyRect);
72     void paintControls(WebCore::GraphicsContext*, const WebCore::IntRect& dirtyRect);
73
74     // Plug-in methods
75     virtual bool initialize(const Parameters&);
76     virtual void destroy();
77     virtual void paint(WebCore::GraphicsContext*, const WebCore::IntRect& dirtyRectInWindowCoordinates);
78     virtual void updateControlTints(WebCore::GraphicsContext*);
79     virtual PassRefPtr<ShareableBitmap> snapshot();
80 #if PLATFORM(MAC)
81     virtual PlatformLayer* pluginLayer();
82 #endif
83     virtual bool isTransparent();
84     virtual void geometryDidChange(const WebCore::IntSize& pluginSize, const WebCore::IntRect& clipRect, const WebCore::AffineTransform& pluginToRootViewTransform);
85     virtual void visibilityDidChange();
86     virtual void frameDidFinishLoading(uint64_t requestID);
87     virtual void frameDidFail(uint64_t requestID, bool wasCancelled);
88     virtual void didEvaluateJavaScript(uint64_t requestID, const String& result);
89     virtual void streamDidReceiveResponse(uint64_t streamID, const WebCore::KURL& responseURL, uint32_t streamLength, uint32_t lastModifiedTime, const String& mimeType, const String& headers, const String& suggestedFileName);
90     virtual void streamDidReceiveData(uint64_t streamID, const char* bytes, int length);
91     virtual void streamDidFinishLoading(uint64_t streamID);
92     virtual void streamDidFail(uint64_t streamID, bool wasCancelled);
93     virtual void manualStreamDidReceiveResponse(const WebCore::KURL& responseURL, uint32_t streamLength, uint32_t lastModifiedTime, const WTF::String& mimeType, const WTF::String& headers, const String& suggestedFileName);
94     virtual void manualStreamDidReceiveData(const char* bytes, int length);
95     virtual void manualStreamDidFinishLoading();
96     virtual void manualStreamDidFail(bool wasCancelled);
97     virtual bool handleMouseEvent(const WebMouseEvent&);
98     virtual bool handleWheelEvent(const WebWheelEvent&);
99     virtual bool handleMouseEnterEvent(const WebMouseEvent&);
100     virtual bool handleMouseLeaveEvent(const WebMouseEvent&);
101     virtual bool handleContextMenuEvent(const WebMouseEvent&);
102     virtual bool handleKeyboardEvent(const WebKeyboardEvent&);
103     virtual void setFocus(bool);
104     virtual NPObject* pluginScriptableNPObject();
105 #if PLATFORM(MAC)
106     virtual void windowFocusChanged(bool);
107     virtual void windowAndViewFramesChanged(const WebCore::IntRect& windowFrameInScreenCoordinates, const WebCore::IntRect& viewFrameInWindowCoordinates);
108     virtual void windowVisibilityChanged(bool);
109     virtual void contentsScaleFactorChanged(float);
110     virtual uint64_t pluginComplexTextInputIdentifier() const;
111     virtual void sendComplexTextInput(const String& textInput);
112 #endif
113
114     virtual void privateBrowsingStateChanged(bool);
115     virtual bool getFormValue(String& formValue);
116     virtual bool handleScroll(WebCore::ScrollDirection, WebCore::ScrollGranularity);
117     virtual WebCore::Scrollbar* horizontalScrollbar();
118     virtual WebCore::Scrollbar* verticalScrollbar();
119
120     virtual RetainPtr<CGPDFDocumentRef> pdfDocumentForPrinting() const OVERRIDE { return m_pdfDocument; }
121
122     // ScrollableArea methods.
123     virtual WebCore::IntRect scrollCornerRect() const;
124     virtual WebCore::ScrollableArea* enclosingScrollableArea() const;
125     virtual void setScrollOffset(const WebCore::IntPoint&);
126     virtual int scrollSize(WebCore::ScrollbarOrientation) const;
127     virtual bool isActive() const;
128     virtual void invalidateScrollbarRect(WebCore::Scrollbar*, const WebCore::IntRect&);
129     virtual void invalidateScrollCornerRect(const WebCore::IntRect&);
130     virtual bool isScrollCornerVisible() const;
131     virtual int scrollPosition(WebCore::Scrollbar*) const;
132     virtual WebCore::IntPoint scrollPosition() const;
133     virtual WebCore::IntPoint minimumScrollPosition() const;
134     virtual WebCore::IntPoint maximumScrollPosition() const;
135     virtual int visibleHeight() const;
136     virtual int visibleWidth() const;
137     virtual WebCore::IntSize contentsSize() const;
138     virtual WebCore::Scrollbar* horizontalScrollbar() const  { return m_horizontalScrollbar.get(); }
139     virtual WebCore::Scrollbar* verticalScrollbar() const { return m_verticalScrollbar.get(); }
140     virtual bool isOnActivePage() const;
141     virtual void disconnectFromPage() { m_frame = 0; }
142     virtual bool shouldSuspendScrollAnimations() const { return false; } // If we return true, ScrollAnimatorMac will keep cycling a timer forever, waiting for a good time to animate.
143     virtual void scrollbarStyleChanged(int newStyle, bool forceUpdate);
144     virtual void zoomAnimatorTransformChanged(float, float, float, ZoomAnimationState) { }
145
146     // FIXME: Implement the other conversion functions; this one is enough to get scrollbar hit testing working.
147     virtual WebCore::IntPoint convertFromContainingViewToScrollbar(const WebCore::Scrollbar*, const WebCore::IntPoint& parentPoint) const;
148
149     JSObjectRef makeJSPDFDoc(JSContextRef);
150     static JSValueRef jsPDFDocPrint(JSContextRef, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception);
151
152     WebCore::IntSize m_pluginSize;
153
154     WebCore::KURL m_sourceURL;
155
156     String m_suggestedFilename;
157     RetainPtr<CFMutableDataRef> m_dataBuffer;
158
159     RetainPtr<CGPDFDocumentRef> m_pdfDocument;
160     Vector<WebCore::IntRect> m_pageBoxes;
161     WebCore::IntSize m_pdfDocumentSize; // All pages, including gaps.
162
163     RefPtr<WebCore::Scrollbar> m_horizontalScrollbar;
164     RefPtr<WebCore::Scrollbar> m_verticalScrollbar;
165
166     WebFrame* m_frame;
167
168     WebCore::IntSize m_scrollOffset;
169 };
170
171 } // namespace WebKit
172
173 #endif // BuiltInPDFView_h