074a0ccdcd03bb5256e3658072a81e9a5f83c886
[WebKit-https.git] / Source / WebKit / chromium / src / WebPluginContainerImpl.h
1 /*
2  * Copyright (C) 2009 Google 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 are
6  * met:
7  *
8  *     * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *     * Redistributions in binary form must reproduce the above
11  * copyright notice, this list of conditions and the following disclaimer
12  * in the documentation and/or other materials provided with the
13  * distribution.
14  *     * Neither the name of Google Inc. nor the names of its
15  * contributors may be used to endorse or promote products derived from
16  * this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30
31 #ifndef WebPluginContainerImpl_h
32 #define WebPluginContainerImpl_h
33
34 #include "PluginViewBase.h"
35 #include "WebPluginContainer.h"
36 #include "Widget.h"
37
38 #include <public/WebExternalTextureLayer.h>
39 #include <public/WebIOSurfaceLayer.h>
40 #include <wtf/OwnPtr.h>
41 #include <wtf/PassRefPtr.h>
42 #include <wtf/Vector.h>
43 #include <wtf/text/WTFString.h>
44
45 struct NPObject;
46
47 namespace WebCore {
48 class GestureEvent;
49 class HTMLPlugInElement;
50 class IntRect;
51 class KeyboardEvent;
52 class MouseEvent;
53 class ResourceError;
54 class ResourceResponse;
55 class TouchEvent;
56 class WheelEvent;
57
58 #if ENABLE(GESTURE_EVENTS)
59 class PlatformGestureEvent;
60 #endif
61 }
62
63 namespace WebKit {
64
65 struct WebPrintParams;
66
67 class ScrollbarGroup;
68 class WebPlugin;
69 class WebPluginLoadObserver;
70
71 class WebPluginContainerImpl : public WebCore::PluginViewBase, public WebPluginContainer {
72 public:
73     static PassRefPtr<WebPluginContainerImpl> create(WebCore::HTMLPlugInElement* element, WebPlugin* webPlugin)
74     {
75         return adoptRef(new WebPluginContainerImpl(element, webPlugin));
76     }
77
78     // PluginViewBase methods
79     virtual bool getFormValue(String&);
80     virtual bool supportsKeyboardFocus() const;
81
82     // Widget methods
83     virtual void setFrameRect(const WebCore::IntRect&);
84     virtual void paint(WebCore::GraphicsContext*, const WebCore::IntRect&);
85     virtual void invalidateRect(const WebCore::IntRect&);
86     virtual void setFocus(bool);
87     virtual void show();
88     virtual void hide();
89     virtual void handleEvent(WebCore::Event*);
90     virtual void frameRectsChanged();
91     virtual void setParentVisible(bool);
92     virtual void setParent(WebCore::ScrollView*);
93     virtual void widgetPositionsUpdated();
94     virtual bool isPluginContainer() const { return true; }
95
96     // WebPluginContainer methods
97     virtual WebElement element();
98     virtual void invalidate();
99     virtual void invalidateRect(const WebRect&);
100     virtual void scrollRect(int dx, int dy, const WebRect&);
101     virtual void reportGeometry();
102     virtual void setBackingTextureId(unsigned);
103     virtual void setBackingIOSurfaceId(int width,
104                                        int height,
105                                        uint32_t ioSurfaceId);
106     virtual void commitBackingTexture();
107     virtual void clearScriptObjects();
108     virtual NPObject* scriptableObjectForElement();
109     virtual WebString executeScriptURL(const WebURL&, bool popupsAllowed);
110     virtual void loadFrameRequest(const WebURLRequest&, const WebString& target, bool notifyNeeded, void* notifyData);
111     virtual void zoomLevelChanged(double zoomLevel);    
112     virtual void setOpaque(bool);
113     virtual bool isRectTopmost(const WebRect&);
114     virtual void setIsAcceptingTouchEvents(bool);
115
116     // This cannot be null.
117     WebPlugin* plugin() { return m_webPlugin; }
118     void setPlugin(WebPlugin*);
119
120     virtual float deviceScaleFactor();
121     virtual float pageScaleFactor();
122     virtual float pageZoomFactor();
123
124     // Printing interface. The plugin can support custom printing
125     // (which means it controls the layout, number of pages etc).
126     // Whether the plugin supports its own paginated print. The other print
127     // interface methods are called only if this method returns true.
128     bool supportsPaginatedPrint() const;
129     // If the plugin content should not be scaled to the printable area of
130     // the page, then this method should return true.
131     bool isPrintScalingDisabled() const;
132     // Sets up printing at the specified WebPrintParams. Returns the number of pages to be printed at these settings.
133     int printBegin(const WebPrintParams&) const;
134     // Prints the page specified by pageNumber (0-based index) into the supplied canvas.
135     bool printPage(int pageNumber, WebCore::GraphicsContext* gc);
136     // Ends the print operation.
137     void printEnd();
138
139     // Copy the selected text.
140     void copy();
141
142     // Resource load events for the plugin's source data:
143     void didReceiveResponse(const WebCore::ResourceResponse&);
144     void didReceiveData(const char *data, int dataLength);
145     void didFinishLoading();
146     void didFailLoading(const WebCore::ResourceError&);
147
148     NPObject* scriptableObject();
149
150     void willDestroyPluginLoadObserver(WebPluginLoadObserver*);
151
152 #if USE(ACCELERATED_COMPOSITING)
153     virtual WebLayer* platformLayer() const;
154 #endif
155
156     ScrollbarGroup* scrollbarGroup();
157
158     void willStartLiveResize();
159     void willEndLiveResize();
160
161     bool paintCustomOverhangArea(WebCore::GraphicsContext*, const WebCore::IntRect&, const WebCore::IntRect&, const WebCore::IntRect&);
162
163 private:
164     WebPluginContainerImpl(WebCore::HTMLPlugInElement* element, WebPlugin* webPlugin);
165     ~WebPluginContainerImpl();
166
167     void handleMouseEvent(WebCore::MouseEvent*);
168     void handleWheelEvent(WebCore::WheelEvent*);
169     void handleKeyboardEvent(WebCore::KeyboardEvent*);
170     void handleTouchEvent(WebCore::TouchEvent*);
171     void handleGestureEvent(WebCore::GestureEvent*);
172
173     void calculateGeometry(const WebCore::IntRect& frameRect,
174                            WebCore::IntRect& windowRect,
175                            WebCore::IntRect& clipRect,
176                            Vector<WebCore::IntRect>& cutOutRects);
177     WebCore::IntRect windowClipRect() const;
178     void windowCutOutRects(const WebCore::IntRect& frameRect,
179                            Vector<WebCore::IntRect>& cutOutRects);
180
181     WebCore::HTMLPlugInElement* m_element;
182     WebPlugin* m_webPlugin;
183     Vector<WebPluginLoadObserver*> m_pluginLoadObservers;
184
185 #if USE(ACCELERATED_COMPOSITING)
186     // A composited plugin will either have no composited layer, a texture layer, or an IOSurface layer.
187     // It will never have both a texture and IOSurface output.
188     unsigned m_textureId;
189     WebExternalTextureLayer m_textureLayer;
190
191     unsigned m_ioSurfaceId;
192     WebIOSurfaceLayer m_ioSurfaceLayer;
193 #endif
194
195     // The associated scrollbar group object, created lazily. Used for Pepper
196     // scrollbars.
197     OwnPtr<ScrollbarGroup> m_scrollbarGroup;
198
199     bool m_isAcceptingTouchEvents;
200 };
201
202 } // namespace WebKit
203
204 #endif