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