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