1c49c6032fd4d509a8250091e1bd50077e681605
[WebKit-https.git] / Source / WebKit2 / WebProcess / Plugins / Netscape / NetscapePlugin.h
1 /*
2  * Copyright (C) 2010 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 NetscapePlugin_h
27 #define NetscapePlugin_h
28
29 #if ENABLE(NETSCAPE_PLUGIN_API)
30
31 #include "NetscapePluginModule.h"
32 #include "Plugin.h"
33 #include <WebCore/AffineTransform.h>
34 #include <WebCore/GraphicsLayer.h>
35 #include <WebCore/IntRect.h>
36 #include <WebCore/RunLoop.h>
37 #include <wtf/HashMap.h>
38 #include <wtf/text/CString.h>
39 #include <wtf/text/StringHash.h>
40
41 namespace WebCore {
42     class HTTPHeaderMap;
43     class ProtectionSpace;
44 }
45
46 namespace WebKit {
47
48 class NetscapePluginStream;
49     
50 class NetscapePlugin : public Plugin {
51 public:
52     static PassRefPtr<NetscapePlugin> create(PassRefPtr<NetscapePluginModule> pluginModule);
53     virtual ~NetscapePlugin();
54
55     static PassRefPtr<NetscapePlugin> fromNPP(NPP);
56
57 #if PLATFORM(MAC)
58     NPError setDrawingModel(NPDrawingModel);
59     NPError setEventModel(NPEventModel);
60     NPBool convertPoint(double sourceX, double sourceY, NPCoordinateSpace sourceSpace, double& destX, double& destY, NPCoordinateSpace destSpace);
61     NPError popUpContextMenu(NPMenu*);
62
63     void setPluginReturnsNonretainedLayer(bool pluginReturnsNonretainedLayer) { m_pluginReturnsNonretainedLayer = pluginReturnsNonretainedLayer; }
64     void setPluginWantsLegacyCocoaTextInput(bool pluginWantsLegacyCocoaTextInput) { m_pluginWantsLegacyCocoaTextInput = pluginWantsLegacyCocoaTextInput; }
65
66     bool hasHandledAKeyDownEvent() const { return m_hasHandledAKeyDownEvent; }
67
68     mach_port_t compositingRenderServerPort();
69
70     // Computes an affine transform from the given coordinate space to the screen coordinate space.
71     bool getScreenTransform(NPCoordinateSpace sourceSpace, WebCore::AffineTransform&);
72
73 #ifndef NP_NO_CARBON
74     WindowRef windowRef() const;
75     bool isWindowActive() const { return m_windowHasFocus; }
76     void updateFakeWindowBounds();
77
78     static NetscapePlugin* netscapePluginFromWindow(WindowRef);
79     static unsigned buttonState();
80 #endif
81
82 #elif PLATFORM(WIN)
83     HWND containingWindow();
84 #endif
85
86     PluginQuirks quirks() const { return m_pluginModule->pluginQuirks(); }
87
88     void invalidate(const NPRect*);
89     static const char* userAgent(NPP);
90     void loadURL(const String& method, const String& urlString, const String& target, const WebCore::HTTPHeaderMap& headerFields,
91                  const Vector<uint8_t>& httpBody, bool sendNotification, void* notificationData);
92     NPError destroyStream(NPStream*, NPReason);
93     void setIsWindowed(bool);
94     void setIsTransparent(bool);
95     void setStatusbarText(const String&);
96     static void setException(const String&);
97     bool evaluate(NPObject*, const String&scriptString, NPVariant* result);
98     bool isPrivateBrowsingEnabled();
99
100     static void setSetExceptionFunction(void (*)(const String&));
101
102     // These return retained objects.
103     NPObject* windowScriptNPObject();
104     NPObject* pluginElementNPObject();
105
106     void cancelStreamLoad(NetscapePluginStream*);
107     void removePluginStream(NetscapePluginStream*);
108
109     bool isAcceleratedCompositingEnabled();
110
111     void pushPopupsEnabledState(bool enabled);
112     void popPopupsEnabledState();
113
114     void pluginThreadAsyncCall(void (*function)(void*), void* userData);
115
116     // Called on the plug-in run loop (which is currently the main thread run loop).
117     void handlePluginThreadAsyncCall(void (*function)(void*), void* userData);
118
119     unsigned scheduleTimer(unsigned interval, bool repeat, void (*timerFunc)(NPP, unsigned timerID));
120     void unscheduleTimer(unsigned timerID);
121
122     double contentsScaleFactor();
123     String proxiesForURL(const String& urlString);
124     String cookiesForURL(const String& urlString);
125     void setCookiesForURL(const String& urlString, const String& cookieString);
126     bool getAuthenticationInfo(const WebCore::ProtectionSpace&, String& username, String& password);
127
128     // Member functions for calling into the plug-in.
129     NPError NPP_New(NPMIMEType pluginType, uint16_t mode, int16_t argc, char* argn[], char* argv[], NPSavedData*);
130     NPError NPP_Destroy(NPSavedData**);
131     NPError NPP_SetWindow(NPWindow*);
132     NPError NPP_NewStream(NPMIMEType, NPStream*, NPBool seekable, uint16_t* stype);
133     NPError NPP_DestroyStream(NPStream*, NPReason);
134     void NPP_StreamAsFile(NPStream*, const char* filename);
135     int32_t NPP_WriteReady(NPStream*);
136     int32_t NPP_Write(NPStream*, int32_t offset, int32_t len, void* buffer);
137     int16_t NPP_HandleEvent(void* event);
138     void NPP_URLNotify(const char* url, NPReason, void* notifyData);
139     NPError NPP_GetValue(NPPVariable, void *value);
140     NPError NPP_SetValue(NPNVariable, void *value);
141
142 private:
143     NetscapePlugin(PassRefPtr<NetscapePluginModule> pluginModule);
144
145     void callSetWindow();
146     bool shouldLoadSrcURL();
147     NetscapePluginStream* streamFromID(uint64_t streamID);
148     void stopAllStreams();
149     bool allowPopups() const;
150
151     const char* userAgent();
152
153     bool platformPostInitialize();
154     void platformDestroy();
155     bool platformInvalidate(const WebCore::IntRect&);
156     void platformGeometryDidChange();
157     void platformVisibilityDidChange();
158     void platformPaint(WebCore::GraphicsContext*, const WebCore::IntRect& dirtyRect, bool isSnapshot = false);
159
160     bool platformHandleMouseEvent(const WebMouseEvent&);
161     bool platformHandleWheelEvent(const WebWheelEvent&);
162     bool platformHandleMouseEnterEvent(const WebMouseEvent&);
163     bool platformHandleMouseLeaveEvent(const WebMouseEvent&);
164     bool platformHandleKeyboardEvent(const WebKeyboardEvent&);
165     void platformSetFocus(bool);
166
167     static bool wantsPluginRelativeNPWindowCoordinates();
168
169     // Plugin
170     virtual bool initialize(const Parameters&);
171     virtual void destroy();
172     virtual void paint(WebCore::GraphicsContext*, const WebCore::IntRect& dirtyRect);
173     virtual PassRefPtr<ShareableBitmap> snapshot();
174 #if PLATFORM(MAC)
175     virtual PlatformLayer* pluginLayer();
176 #endif
177     virtual bool isTransparent();
178     virtual bool wantsWheelEvents() OVERRIDE;
179     virtual void geometryDidChange(const WebCore::IntSize& pluginSize, const WebCore::IntRect& clipRect, const WebCore::AffineTransform& pluginToRootViewTransform);
180     virtual void visibilityDidChange();
181     virtual void frameDidFinishLoading(uint64_t requestID);
182     virtual void frameDidFail(uint64_t requestID, bool wasCancelled);
183     virtual void didEvaluateJavaScript(uint64_t requestID, const String& result);
184     virtual void streamDidReceiveResponse(uint64_t streamID, const WebCore::KURL& responseURL, uint32_t streamLength, 
185                                           uint32_t lastModifiedTime, const String& mimeType, const String& headers, const String& suggestedFileName);
186     virtual void streamDidReceiveData(uint64_t streamID, const char* bytes, int length);
187     virtual void streamDidFinishLoading(uint64_t streamID);
188     virtual void streamDidFail(uint64_t streamID, bool wasCancelled);
189     virtual void manualStreamDidReceiveResponse(const WebCore::KURL& responseURL, uint32_t streamLength, 
190                                                 uint32_t lastModifiedTime, const String& mimeType, const String& headers, const String& suggestedFileName);
191     virtual void manualStreamDidReceiveData(const char* bytes, int length);
192     virtual void manualStreamDidFinishLoading();
193     virtual void manualStreamDidFail(bool wasCancelled);
194     
195     virtual bool handleMouseEvent(const WebMouseEvent&);
196     virtual bool handleWheelEvent(const WebWheelEvent&);
197     virtual bool handleMouseEnterEvent(const WebMouseEvent&);
198     virtual bool handleMouseLeaveEvent(const WebMouseEvent&);
199     virtual bool handleContextMenuEvent(const WebMouseEvent&);
200     virtual bool handleKeyboardEvent(const WebKeyboardEvent&);
201     virtual void setFocus(bool);
202     virtual NPObject* pluginScriptableNPObject();
203
204 #if PLATFORM(MAC)
205     virtual void windowFocusChanged(bool);
206     virtual void windowAndViewFramesChanged(const WebCore::IntRect& windowFrameInScreenCoordinates, const WebCore::IntRect& viewFrameInWindowCoordinates);
207     virtual void windowVisibilityChanged(bool);
208
209     virtual uint64_t pluginComplexTextInputIdentifier() const;
210     virtual void sendComplexTextInput(const String& textInput);
211     virtual void setLayerHostingMode(LayerHostingMode) OVERRIDE;
212
213     void pluginFocusOrWindowFocusChanged();
214     void setComplexTextInputEnabled(bool);
215
216     void updatePluginLayer();
217 #endif
218
219     virtual void contentsScaleFactorChanged(float);
220     virtual void privateBrowsingStateChanged(bool);
221     virtual bool getFormValue(String& formValue);
222     virtual bool handleScroll(WebCore::ScrollDirection, WebCore::ScrollGranularity);
223     virtual WebCore::Scrollbar* horizontalScrollbar();
224     virtual WebCore::Scrollbar* verticalScrollbar();
225
226     bool supportsSnapshotting() const;
227
228     // Convert the given point from plug-in coordinates to root view coordinates.
229     WebCore::IntPoint convertToRootView(const WebCore::IntPoint&) const;
230
231     // Convert the given point from root view coordinates to plug-in coordinates. Returns false if the point can't be
232     // converted (if the transformation matrix isn't invertible).
233     bool convertFromRootView(const WebCore::IntPoint& pointInRootViewCoordinates, WebCore::IntPoint& pointInPluginCoordinates);
234
235 #if PLUGIN_ARCHITECTURE(WIN)
236     static BOOL WINAPI hookedTrackPopupMenu(HMENU, UINT uFlags, int x, int y, int nReserved, HWND, const RECT*);
237     void scheduleWindowedGeometryUpdate();
238 #endif
239
240 #if PLUGIN_ARCHITECTURE(X11)
241     bool platformPostInitializeWindowed(bool needsXEmbed, uint64_t windowID);
242     bool platformPostInitializeWindowless();
243 #endif
244
245     uint64_t m_nextRequestID;
246
247     typedef HashMap<uint64_t, std::pair<String, void*> > PendingURLNotifyMap;
248     PendingURLNotifyMap m_pendingURLNotifications;
249
250     typedef HashMap<uint64_t, RefPtr<NetscapePluginStream> > StreamsMap;
251     StreamsMap m_streams;
252
253     RefPtr<NetscapePluginModule> m_pluginModule;
254     NPP_t m_npp;
255     NPWindow m_npWindow;
256
257     WebCore::IntSize m_pluginSize;
258
259     // The clip rect in plug-in coordinates.
260     WebCore::IntRect m_clipRect;
261
262     // A transform that can be used to convert from root view coordinates to plug-in coordinates.
263     WebCore::AffineTransform m_pluginToRootViewTransform;
264
265     // FIXME: Get rid of these.
266     WebCore::IntRect m_frameRectInWindowCoordinates;
267
268     CString m_userAgent;
269
270     bool m_isStarted;
271     bool m_isWindowed;
272     bool m_isTransparent;
273     bool m_inNPPNew;
274     bool m_shouldUseManualLoader;
275     bool m_hasCalledSetWindow;
276
277     RefPtr<NetscapePluginStream> m_manualStream;
278     Vector<bool, 8> m_popupEnabledStates;
279
280     class Timer {
281         WTF_MAKE_NONCOPYABLE(Timer);
282
283     public:
284         typedef void (*TimerFunc)(NPP, uint32_t timerID);
285
286         static PassOwnPtr<Timer> create(NetscapePlugin*, unsigned timerID, unsigned interval, bool repeat, TimerFunc);
287         ~Timer();
288
289         void start();
290         void stop();
291
292     private:
293         Timer(NetscapePlugin*, unsigned timerID, unsigned interval, bool repeat, TimerFunc);
294
295         void timerFired();
296
297         // This is a weak pointer since Timer objects are destroyed before the NetscapePlugin object itself is destroyed.
298         NetscapePlugin* m_netscapePlugin;
299
300         unsigned m_timerID;
301         unsigned m_interval;
302         bool m_repeat;
303         TimerFunc m_timerFunc;
304
305         WebCore::RunLoop::Timer<Timer> m_timer;
306     };
307     typedef HashMap<unsigned, Timer*> TimerMap;
308     TimerMap m_timers;
309     unsigned m_nextTimerID;
310
311 #if PLUGIN_ARCHITECTURE(MAC)
312     NPDrawingModel m_drawingModel;
313     NPEventModel m_eventModel;
314
315     RetainPtr<PlatformLayer> m_pluginLayer;
316     bool m_pluginReturnsNonretainedLayer;
317     LayerHostingMode m_layerHostingMode;
318
319     NPCocoaEvent* m_currentMouseEvent;
320
321     bool m_pluginHasFocus;
322     bool m_windowHasFocus;
323
324     // Whether the plug-in wants to use the legacy Cocoa text input handling that
325     // existed in WebKit1, or the updated Cocoa text input handling specified on
326     // https://wiki.mozilla.org/NPAPI:CocoaEventModel#Text_Input
327     bool m_pluginWantsLegacyCocoaTextInput;
328
329     // Whether complex text input is enabled.
330     bool m_isComplexTextInputEnabled;
331
332     // Whether the plug-in has handled a keydown event. This is used to determine
333     // if we can tell the plug-in that we support the updated Cocoa text input specification.
334     bool m_hasHandledAKeyDownEvent;
335
336     // The number of NPCocoaEventKeyUp events that  should be ignored.
337     unsigned m_ignoreNextKeyUpEventCounter;
338
339     WebCore::IntRect m_windowFrameInScreenCoordinates;
340     WebCore::IntRect m_viewFrameInWindowCoordinates;
341
342 #ifndef NP_NO_CARBON
343     void nullEventTimerFired();
344
345     // FIXME: It's a bit wasteful to have one null event timer per plug-in.
346     // We should investigate having one per window.
347     WebCore::RunLoop::Timer<NetscapePlugin> m_nullEventTimer;
348     NP_CGContext m_npCGContext;
349 #endif
350 #elif PLUGIN_ARCHITECTURE(WIN)
351     HWND m_window;
352     HWND m_contextMenuOwnerWindow;
353 #elif PLUGIN_ARCHITECTURE(X11)
354     Pixmap m_drawable;
355     Display* m_pluginDisplay;
356 #if PLATFORM(GTK)
357     GtkWidget* m_platformPluginWidget;
358 #endif
359
360 public: // Need to call it in the NPN_GetValue browser callback.
361     static Display* x11HostDisplay();
362 #endif
363 };
364
365 } // namespace WebKit
366
367 #endif // ENABLE(NETSCAPE_PLUGIN_API)
368
369 #endif // NetscapePlugin_h