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