Javascript in foreground tabs should not wait synchronously for plug-ins to load
[WebKit-https.git] / Source / WebKit2 / WebProcess / Plugins / PDF / BuiltInPDFView.h
1 /*
2  * Copyright (C) 2011, 2012 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     // In-process PDFViews don't support asynchronous initialization.
54     virtual bool isBeingAsynchronouslyInitialized() const { return false; }
55
56 private:
57     explicit BuiltInPDFView(WebFrame*);
58
59     // Regular plug-ins don't need access to view, but we add scrollbars to embedding FrameView for proper event handling.
60     PluginView* pluginView();
61     const PluginView* pluginView() const;
62
63     void updateScrollbars();
64     PassRefPtr<WebCore::Scrollbar> createScrollbar(WebCore::ScrollbarOrientation);
65     void destroyScrollbar(WebCore::ScrollbarOrientation);
66     void addArchiveResource();
67     void pdfDocumentDidLoad();
68     void calculateSizes();
69     void paintBackground(WebCore::GraphicsContext*, const WebCore::IntRect& dirtyRect);
70     void paintContent(WebCore::GraphicsContext*, const WebCore::IntRect& dirtyRect);
71     void paintControls(WebCore::GraphicsContext*, const WebCore::IntRect& dirtyRect);
72
73     // Plug-in methods
74     virtual bool initialize(const Parameters&);
75     virtual void destroy();
76     virtual void paint(WebCore::GraphicsContext*, const WebCore::IntRect& dirtyRectInWindowCoordinates);
77     virtual void updateControlTints(WebCore::GraphicsContext*);
78     virtual PassRefPtr<ShareableBitmap> snapshot();
79 #if PLATFORM(MAC)
80     virtual PlatformLayer* pluginLayer();
81 #endif
82     virtual bool isTransparent();
83     virtual bool wantsWheelEvents() OVERRIDE;
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     virtual void setLayerHostingMode(LayerHostingMode) OVERRIDE;
113 #endif
114
115     virtual void privateBrowsingStateChanged(bool);
116     virtual bool getFormValue(String& formValue);
117     virtual bool handleScroll(WebCore::ScrollDirection, WebCore::ScrollGranularity);
118     virtual WebCore::Scrollbar* horizontalScrollbar();
119     virtual WebCore::Scrollbar* verticalScrollbar();
120
121     virtual RetainPtr<PDFDocument> pdfDocumentForPrinting() const OVERRIDE { return m_pdfDocument; }
122
123     // ScrollableArea methods.
124     virtual WebCore::IntRect scrollCornerRect() const OVERRIDE;
125     virtual WebCore::ScrollableArea* enclosingScrollableArea() const OVERRIDE;
126     virtual WebCore::IntRect scrollableAreaBoundingBox() const OVERRIDE;
127     virtual void setScrollOffset(const WebCore::IntPoint&) OVERRIDE;
128     virtual int scrollSize(WebCore::ScrollbarOrientation) const OVERRIDE;
129     virtual bool isActive() const OVERRIDE;
130     virtual void invalidateScrollbarRect(WebCore::Scrollbar*, const WebCore::IntRect&) OVERRIDE;
131     virtual void invalidateScrollCornerRect(const WebCore::IntRect&) OVERRIDE;
132     virtual bool isScrollCornerVisible() const OVERRIDE;
133     virtual int scrollPosition(WebCore::Scrollbar*) const OVERRIDE;
134     virtual WebCore::IntPoint scrollPosition() const OVERRIDE;
135     virtual WebCore::IntPoint minimumScrollPosition() const OVERRIDE;
136     virtual WebCore::IntPoint maximumScrollPosition() const OVERRIDE;
137     virtual int visibleHeight() const OVERRIDE;
138     virtual int visibleWidth() const OVERRIDE;
139     virtual WebCore::IntSize contentsSize() const OVERRIDE;
140     virtual WebCore::Scrollbar* horizontalScrollbar() const OVERRIDE { return m_horizontalScrollbar.get(); }
141     virtual WebCore::Scrollbar* verticalScrollbar() const OVERRIDE { return m_verticalScrollbar.get(); }
142     virtual bool isOnActivePage() const OVERRIDE;
143     virtual bool shouldSuspendScrollAnimations() const OVERRIDE { return false; } // If we return true, ScrollAnimatorMac will keep cycling a timer forever, waiting for a good time to animate.
144     virtual void scrollbarStyleChanged(int newStyle, bool forceUpdate) OVERRIDE;
145     // FIXME: Implement the other conversion functions; this one is enough to get scrollbar hit testing working.
146     virtual WebCore::IntPoint convertFromContainingViewToScrollbar(const WebCore::Scrollbar*, const WebCore::IntPoint& parentPoint) const OVERRIDE;
147
148     JSObjectRef makeJSPDFDoc(JSContextRef);
149     static JSValueRef jsPDFDocPrint(JSContextRef, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception);
150
151     WebCore::IntSize m_pluginSize;
152
153     WebCore::KURL m_sourceURL;
154
155     String m_suggestedFilename;
156     RetainPtr<CFMutableDataRef> m_dataBuffer;
157
158     RetainPtr<PDFDocument> m_pdfDocument;
159     Vector<WebCore::IntRect> m_pageBoxes;
160     WebCore::IntSize m_pdfDocumentSize; // All pages, including gaps.
161
162     RefPtr<WebCore::Scrollbar> m_horizontalScrollbar;
163     RefPtr<WebCore::Scrollbar> m_verticalScrollbar;
164
165     WebFrame* m_frame;
166
167     WebCore::IntSize m_scrollOffset;
168 };
169
170 } // namespace WebKit
171
172 #endif // BuiltInPDFView_h