[chromium] Separate IOSurface layer type from texture layers
[WebKit.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 HTMLPlugInElement;
49 class IntRect;
50 class KeyboardEvent;
51 class LayerChromium;
52 class MouseEvent;
53 class ResourceError;
54 class ResourceResponse;
55 class WheelEvent;
56
57 #if ENABLE(GESTURE_EVENTS)
58 class PlatformGestureEvent;
59 #endif
60 }
61
62 namespace WebKit {
63
64 class ScrollbarGroup;
65 class WebPlugin;
66 class WebPluginLoadObserver;
67
68 class WebPluginContainerImpl : public WebCore::PluginViewBase, public WebPluginContainer {
69 public:
70     static PassRefPtr<WebPluginContainerImpl> create(WebCore::HTMLPlugInElement* element, WebPlugin* webPlugin)
71     {
72         return adoptRef(new WebPluginContainerImpl(element, webPlugin));
73     }
74
75     // PluginViewBase methods
76     virtual bool getFormValue(String&);
77
78     // Widget methods
79     virtual void setFrameRect(const WebCore::IntRect&);
80     virtual void paint(WebCore::GraphicsContext*, const WebCore::IntRect&);
81     virtual void invalidateRect(const WebCore::IntRect&);
82     virtual void setFocus(bool);
83     virtual void show();
84     virtual void hide();
85     virtual void handleEvent(WebCore::Event*);
86     virtual void frameRectsChanged();
87     virtual void setParentVisible(bool);
88     virtual void setParent(WebCore::ScrollView*);
89     virtual void widgetPositionsUpdated();
90     virtual bool isPluginContainer() const { return true; }
91
92     // WebPluginContainer methods
93     virtual WebElement element();
94     virtual void invalidate();
95     virtual void invalidateRect(const WebRect&);
96     virtual void scrollRect(int dx, int dy, const WebRect&);
97     virtual void reportGeometry();
98     virtual void setBackingTextureId(unsigned);
99     virtual void setBackingIOSurfaceId(int width,
100                                        int height,
101                                        uint32_t ioSurfaceId);
102     virtual void commitBackingTexture();
103     virtual void clearScriptObjects();
104     virtual NPObject* scriptableObjectForElement();
105     virtual WebString executeScriptURL(const WebURL&, bool popupsAllowed);
106     virtual void loadFrameRequest(const WebURLRequest&, const WebString& target, bool notifyNeeded, void* notifyData);
107     virtual void zoomLevelChanged(double zoomLevel);    
108     virtual void setOpaque(bool);
109     virtual bool isRectTopmost(const WebRect&);
110
111     // This cannot be null.
112     WebPlugin* plugin() { return m_webPlugin; }
113     void setPlugin(WebPlugin* plugin) { m_webPlugin = plugin; }
114
115     // Printing interface. The plugin can support custom printing
116     // (which means it controls the layout, number of pages etc).
117     // Whether the plugin supports its own paginated print. The other print
118     // interface methods are called only if this method returns true.
119     bool supportsPaginatedPrint() const;
120     // If the plugin content should not be scaled to the printable area of
121     // the page, then this method should return true.
122     bool isPrintScalingDisabled() const;
123     // Sets up printing at the given print rect and printer DPI. printableArea
124     // is in points (a point is 1/72 of an inch).Returns the number of pages to
125     // be printed at these settings.
126     int printBegin(const WebCore::IntRect& printableArea, int printerDPI) const;
127     // Prints the page specified by pageNumber (0-based index) into the supplied canvas.
128     bool printPage(int pageNumber, WebCore::GraphicsContext* gc);
129     // Ends the print operation.
130     void printEnd();
131
132     // Copy the selected text.
133     void copy();
134
135     // Resource load events for the plugin's source data:
136     void didReceiveResponse(const WebCore::ResourceResponse&);
137     void didReceiveData(const char *data, int dataLength);
138     void didFinishLoading();
139     void didFailLoading(const WebCore::ResourceError&);
140
141     NPObject* scriptableObject();
142
143     void willDestroyPluginLoadObserver(WebPluginLoadObserver*);
144
145 #if USE(ACCELERATED_COMPOSITING)
146     virtual WebCore::LayerChromium* platformLayer() const;
147 #endif
148
149     ScrollbarGroup* scrollbarGroup();
150
151     void willStartLiveResize();
152     void willEndLiveResize();
153
154     bool paintCustomOverhangArea(WebCore::GraphicsContext*, const WebCore::IntRect&, const WebCore::IntRect&, const WebCore::IntRect&);
155
156 private:
157     WebPluginContainerImpl(WebCore::HTMLPlugInElement* element, WebPlugin* webPlugin);
158     ~WebPluginContainerImpl();
159
160     void handleMouseEvent(WebCore::MouseEvent*);
161     void handleWheelEvent(WebCore::WheelEvent*);
162     void handleKeyboardEvent(WebCore::KeyboardEvent*);
163
164     void calculateGeometry(const WebCore::IntRect& frameRect,
165                            WebCore::IntRect& windowRect,
166                            WebCore::IntRect& clipRect,
167                            Vector<WebCore::IntRect>& cutOutRects);
168     WebCore::IntRect windowClipRect() const;
169     void windowCutOutRects(const WebCore::IntRect& frameRect,
170                            Vector<WebCore::IntRect>& cutOutRects);
171
172     WebCore::HTMLPlugInElement* m_element;
173     WebPlugin* m_webPlugin;
174     Vector<WebPluginLoadObserver*> m_pluginLoadObservers;
175
176 #if USE(ACCELERATED_COMPOSITING)
177     // A composited plugin will either have no composited layer, a texture layer, or an IOSurface layer.
178     // It will never have both a texture and IOSurface output.
179     unsigned m_textureId;
180     WebExternalTextureLayer m_textureLayer;
181
182     unsigned m_ioSurfaceId;
183     WebIOSurfaceLayer m_ioSurfaceLayer;
184 #endif
185
186     // The associated scrollbar group object, created lazily. Used for Pepper
187     // scrollbars.
188     OwnPtr<ScrollbarGroup> m_scrollbarGroup;
189 };
190
191 } // namespace WebKit
192
193 #endif