2 * Copyright (C) 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
3 * Copyright (C) 2008 Collabora Ltd. All rights reserved.
4 * Copyright (C) 2009 Girish Ramakrishnan <girish@forwardbias.in>
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
15 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
16 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
19 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 #include "FrameLoadRequest.h"
33 #include "MediaCanStartListener.h"
34 #include "PluginViewBase.h"
35 #include "ResourceRequest.h"
37 #include <wtf/HashMap.h>
38 #include <wtf/HashSet.h>
39 #include <wtf/OwnPtr.h>
40 #include <wtf/PassRefPtr.h>
41 #include <wtf/RefPtr.h>
42 #include <wtf/Vector.h>
43 #include <wtf/text/CString.h>
44 #if ENABLE(TOUCH_EVENTS) && PLATFORM(EFL) && ENABLE(TIZEN_PLUGIN_SNPEVENT)
46 #include "TouchEvent.h"
47 #include "TouchList.h"
49 #if ENABLE(NETSCAPE_PLUGIN_API)
50 #include "PluginStream.h"
51 #include "npruntime_internal.h"
54 #if OS(WINDOWS) && (PLATFORM(QT) || PLATFORM(WX))
55 typedef struct HWND__* HWND;
56 typedef HWND PlatformPluginWidget;
57 #elif ENABLE(TIZEN_SUPPORT_PLUGINS)
58 class X11EmbedContainer;
59 typedef X11EmbedContainer* PlatformPluginWidget;
61 typedef PlatformWidget PlatformPluginWidget;
62 #if defined(XP_MACOSX) && PLATFORM(QT)
67 #if USE(TEXTURE_MAPPER)
68 #include "TextureMapperPlatformLayer.h"
71 #include <QGraphicsItem>
77 #if PLATFORM(QT) && USE(ACCELERATED_COMPOSITING) && ENABLE(NETSCAPE_PLUGIN_API) && defined(XP_UNIX)
78 #ifndef WTF_USE_ACCELERATED_COMPOSITING_PLUGIN_LAYER
79 #define WTF_USE_ACCELERATED_COMPOSITING_PLUGIN_LAYER 1
83 typedef struct _GtkSocket GtkSocket;
86 #if ENABLE(TIZEN_ACCELERATED_COMPOSITING_PLUGIN_LAYER_EFL)
88 #include "ImageBuffer.h"
92 //mariusz.g@samsung.com
93 #if ENABLE(TIZEN_EVAS_OBJECT_PLUGIN) && PLATFORM(EFL)
104 #if ENABLE(TIZEN_EVAS_OBJECT_PLUGIN) && PLATFORM(EFL)
105 typedef struct _PluginStorage PluginStorage;
106 struct _PluginStorage {
107 Evas_Object *pluginCanvas;
108 Evas_Object *pluginClipper;
109 Evas_Object *parentWindow;
110 Evas_Object *webview;
121 #if OS(WINDOWS) && ENABLE(NETSCAPE_PLUGIN_API)
122 class PluginMessageThrottlerWin;
128 class ResourceResponse;
131 PluginStatusCanNotFindPlugin,
132 PluginStatusCanNotLoadPlugin,
133 PluginStatusLoadedSuccessfully
136 class PluginRequest {
137 WTF_MAKE_NONCOPYABLE(PluginRequest); WTF_MAKE_FAST_ALLOCATED;
139 PluginRequest(const FrameLoadRequest& frameLoadRequest, bool sendNotification, void* notifyData, bool shouldAllowPopups)
140 : m_frameLoadRequest(frameLoadRequest)
141 , m_notifyData(notifyData)
142 , m_sendNotification(sendNotification)
143 , m_shouldAllowPopups(shouldAllowPopups) { }
145 const FrameLoadRequest& frameLoadRequest() const { return m_frameLoadRequest; }
146 void* notifyData() const { return m_notifyData; }
147 bool sendNotification() const { return m_sendNotification; }
148 bool shouldAllowPopups() const { return m_shouldAllowPopups; }
150 FrameLoadRequest m_frameLoadRequest;
152 bool m_sendNotification;
153 bool m_shouldAllowPopups;
156 class PluginManualLoader {
158 virtual ~PluginManualLoader() {}
159 virtual void didReceiveResponse(const ResourceResponse&) = 0;
160 virtual void didReceiveData(const char*, int) = 0;
161 virtual void didFinishLoading() = 0;
162 virtual void didFail(const ResourceError&) = 0;
165 class PluginView : public PluginViewBase
166 #if ENABLE(NETSCAPE_PLUGIN_API)
167 , private PluginStreamClient
169 , public PluginManualLoader
170 , private MediaCanStartListener {
172 static PassRefPtr<PluginView> create(Frame* parentFrame, const IntSize&, Element*, const KURL&, const Vector<String>& paramNames, const Vector<String>& paramValues, const String& mimeType, bool loadManually);
173 virtual ~PluginView();
175 PluginPackage* plugin() const { return m_plugin.get(); }
176 #if ENABLE(NETSCAPE_PLUGIN_API)
177 NPP instance() const { return m_instance; }
180 void setNPWindowRect(const IntRect&);
181 static PluginView* currentPluginView();
183 #if ENABLE(NETSCAPE_PLUGIN_API)
184 NPObject* npObject();
187 PassRefPtr<JSC::Bindings::Instance> bindingInstance();
190 PluginStatus status() const { return m_status; }
192 #if ENABLE(NETSCAPE_PLUGIN_API)
194 NPError getURLNotify(const char* url, const char* target, void* notifyData);
195 NPError getURL(const char* url, const char* target);
196 NPError postURLNotify(const char* url, const char* target, uint32_t len, const char* but, NPBool file, void* notifyData);
197 NPError postURL(const char* url, const char* target, uint32_t len, const char* but, NPBool file);
198 NPError newStream(NPMIMEType type, const char* target, NPStream** stream);
199 int32_t write(NPStream* stream, int32_t len, void* buffer);
200 NPError destroyStream(NPStream* stream, NPReason reason);
202 const char* userAgent();
203 #if ENABLE(NETSCAPE_PLUGIN_API)
204 static const char* userAgentStatic();
206 void status(const char* message);
208 #if ENABLE(NETSCAPE_PLUGIN_API)
209 NPError getValue(NPNVariable variable, void* value);
210 static NPError getValueStatic(NPNVariable variable, void* value);
211 NPError setValue(NPPVariable variable, void* value);
212 NPError getValueForURL(NPNURLVariable variable, const char* url, char** value, uint32_t* len);
213 NPError setValueForURL(NPNURLVariable variable, const char* url, const char* value, uint32_t len);
214 NPError getAuthenticationInfo(const char* protocol, const char* host, int32_t port, const char* scheme, const char* realm, char** username, uint32_t* ulen, char** password, uint32_t* plen);
215 void invalidateRect(NPRect*);
216 void invalidateRegion(NPRegion);
219 void pushPopupsEnabledState(bool state);
220 void popPopupsEnabledState();
222 virtual void invalidateRect(const IntRect&);
224 bool arePopupsAllowed() const;
226 void setJavaScriptPaused(bool);
228 void privateBrowsingStateChanged(bool);
230 void disconnectStream(PluginStream*);
231 void streamDidFinishLoading(PluginStream* stream) { disconnectStream(stream); }
234 virtual void setFrameRect(const IntRect&);
235 virtual void frameRectsChanged();
236 virtual void setFocus(bool);
239 virtual void paint(GraphicsContext*, const IntRect&);
241 // This method is used by plugins on all platforms to obtain a clip rect that includes clips set by WebCore,
242 // e.g., in overflow:auto sections. The clip rects coordinates are in the containing window's coordinate space.
243 // This clip includes any clips that the widget itself sets up for its children.
244 IntRect windowClipRect() const;
246 virtual void handleEvent(Event*);
247 virtual void setParent(ScrollView*);
248 virtual void setParentVisible(bool);
250 virtual bool isPluginView() const { return true; }
252 Frame* parentFrame() const { return m_parentFrame.get(); }
254 void focusPluginElement();
256 const String& pluginsPage() const { return m_pluginsPage; }
257 const String& mimeType() const { return m_mimeType; }
258 const KURL& url() const { return m_url; }
260 #if OS(WINDOWS) && ENABLE(NETSCAPE_PLUGIN_API)
261 static LRESULT CALLBACK PluginViewWndProc(HWND, UINT, WPARAM, LPARAM);
262 LRESULT wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
263 WNDPROC pluginWndProc() const { return m_pluginWndProc; }
266 // Used for manual loading
267 void didReceiveResponse(const ResourceResponse&);
268 void didReceiveData(const char*, int);
269 void didFinishLoading();
270 void didFail(const ResourceError&);
272 static bool isCallingPlugin();
276 #if ENABLE(NETSCAPE_PLUGIN_API)
277 static void keepAlive(NPP);
281 #if USE(ACCELERATED_COMPOSITING)
282 #if USE(ACCELERATED_COMPOSITING_PLUGIN_LAYER)
283 virtual PlatformLayer* platformLayer() const;
284 bool shouldUseAcceleratedCompositing() const;
285 #elif ENABLE(TIZEN_ACCELERATED_COMPOSITING_PLUGIN_LAYER_EFL)
286 virtual PlatformLayer* platformLayer() const;
287 ImageBuffer* buffer() const;
289 virtual PlatformLayer* platformLayer() const { return 0; }
294 #if ENABLE(NETSCAPE_PLUGIN_API)
295 bool dispatchWheelEvent(NPEvent*);
297 bool isPluginStarted() const { return m_isStarted; }
298 #if ENABLE(TIZEN_SUPPORT_PLUGINS) && ENABLE(TIZEN_DONT_PAN_OVER_SOME_PLUGINS)
299 static bool isPluginHandlingEvents() { return s_isHandlingEvents; }
300 static void setPluginHandlingEvents(bool isHandling);
301 static PluginView* currentPluginHandlingEvents() { return s_currentPluginHandlingEvents; }
302 #endif // ENABLE(TIZEN_SUPPORT_PLUGINS) && ENABLE(TIZEN_DONT_PAN_OVER_SOME_PLUGINS)
303 #if ENABLE(TIZEN_EVAS_OBJECT_PLUGIN)
304 Evas_Object* getPluginCanvas() { return m_pluginEvasObject; }
305 Evas_Object* getPluginClipper() { return m_pluginEvasObjectClipper; }
307 #endif // PLATFORM(EFL)
310 PluginView(Frame* parentFrame, const IntSize&, PluginPackage*, Element*, const KURL&, const Vector<String>& paramNames, const Vector<String>& paramValues, const String& mimeType, bool loadManually);
312 void setParameters(const Vector<String>& paramNames, const Vector<String>& paramValues);
313 bool startOrAddToUnstartedList();
315 bool platformStart();
317 void platformDestroy();
318 static void setCurrentPluginView(PluginView*);
319 #if ENABLE(NETSCAPE_PLUGIN_API)
320 NPError load(const FrameLoadRequest&, bool sendNotification, void* notifyData);
321 NPError handlePost(const char* url, const char* target, uint32_t len, const char* buf, bool file, void* notifyData, bool sendNotification, bool allowHeaders);
322 NPError handlePostReadFile(Vector<char>& buffer, uint32_t len, const char* buf);
324 static void freeStringArray(char** stringArray, int length);
325 void setCallingPlugin(bool) const;
327 void invalidateWindowlessPluginRect(const IntRect&);
329 virtual void mediaCanStart();
331 #if OS(WINDOWS) && ENABLE(NETSCAPE_PLUGIN_API)
332 void paintWindowedPluginIntoContext(GraphicsContext*, const IntRect&);
333 static HDC WINAPI hookedBeginPaint(HWND, PAINTSTRUCT*);
334 static BOOL WINAPI hookedEndPaint(HWND, const PAINTSTRUCT*);
337 #if ENABLE(NETSCAPE_PLUGIN_API)
338 static bool platformGetValueStatic(NPNVariable variable, void* value, NPError* result);
339 bool platformGetValue(NPNVariable variable, void* value, NPError* result);
342 RefPtr<Frame> m_parentFrame;
343 RefPtr<PluginPackage> m_plugin;
348 PluginStatus m_status;
349 Vector<IntRect> m_invalidRects;
351 void performRequest(PluginRequest*);
352 void scheduleRequest(PluginRequest*);
353 void requestTimerFired(Timer<PluginView>*);
354 void invalidateTimerFired(Timer<PluginView>*);
355 Timer<PluginView> m_requestTimer;
356 Timer<PluginView> m_invalidateTimer;
358 void popPopupsStateTimerFired(Timer<PluginView>*);
359 Timer<PluginView> m_popPopupsStateTimer;
361 void lifeSupportTimerFired(Timer<PluginView>*);
362 Timer<PluginView> m_lifeSupportTimer;
365 #if ENABLE(NETSCAPE_PLUGIN_API)
366 #if !ENABLE(TIZEN_EVAS_OBJECT_PLUGIN)
367 bool dispatchNPEvent(NPEvent&);
369 public: bool dispatchNPEvent(NPEvent&);
371 #endif // !ENABLE(TIZEN_EVAS_OBJECT_PLUGIN)
372 #endif // ENABLE(NETSCAPE_PLUGIN_API)
374 void updatePluginWidget();
375 void paintMissingPluginIcon(GraphicsContext*, const IntRect&);
377 void handleKeyboardEvent(KeyboardEvent*);
378 void handleMouseEvent(MouseEvent*);
379 #if ENABLE(TOUCH_EVENTS) && PLATFORM(EFL) && ENABLE(TIZEN_PLUGIN_SNPEVENT)
380 void handleTouchEvent(TouchEvent*);
382 #if defined(XP_UNIX) && ENABLE(NETSCAPE_PLUGIN_API)
383 void handleFocusInEvent();
384 void handleFocusOutEvent();
388 void paintIntoTransformedContext(HDC);
389 PassRefPtr<Image> snapshot();
395 char** m_paramValues;
396 String m_pluginsPage;
399 WTF::CString m_userAgent;
401 #if ENABLE(NETSCAPE_PLUGIN_API)
403 NPP_t m_instanceStruct;
407 Vector<bool, 4> m_popupStateStack;
409 HashSet<RefPtr<PluginStream> > m_streams;
410 Vector<PluginRequest*> m_requests;
413 bool m_isTransparent;
414 bool m_haveInitialized;
415 bool m_isWaitingToStart;
421 //mariusz.g@samsung.com
422 #if ENABLE(TIZEN_EVAS_OBJECT_PLUGIN) && PLATFORM(EFL)
423 Evas_Object *m_pluginEvasObject;
424 Evas_Object *m_pluginEvasObjectClipper;
425 Evas_Object *m_pluginParentWindow;
426 Evas_Object *m_pluginWebview;
429 #if OS(WINDOWS) && ENABLE(NETSCAPE_PLUGIN_API)
430 OwnPtr<PluginMessageThrottlerWin> m_messageThrottler;
431 WNDPROC m_pluginWndProc;
432 unsigned m_lastMessage;
433 bool m_isCallingPluginWndProc;
435 bool m_haveUpdatedPluginWidget;
438 #if ENABLE(TIZEN_SUPPORT_PLUGINS) || ((PLATFORM(QT) || PLATFORM(WX)) && OS(WINDOWS)) || defined(XP_MACOSX)
439 // On Mac OSX and Qt/Windows the plugin does not have its own native widget,
440 // but is using the containing window as its reference for positioning/painting.
441 PlatformPluginWidget m_window;
443 PlatformPluginWidget platformPluginWidget() const { return m_window; }
444 void setPlatformPluginWidget(PlatformPluginWidget widget) { m_window = widget; }
447 void setPlatformPluginWidget(PlatformPluginWidget widget) { setPlatformWidget(widget); }
448 PlatformPluginWidget platformPluginWidget() const { return platformWidget(); }
453 #if defined(XP_UNIX) || PLATFORM(GTK)
454 void setNPWindowIfNeeded();
455 #elif defined(XP_MACOSX)
456 NP_CGContext m_npCgContext;
457 OwnPtr<Timer<PluginView> > m_nullEventTimer;
458 NPDrawingModel m_drawingModel;
459 NPEventModel m_eventModel;
460 CGContextRef m_contextRef;
461 WindowRef m_fakeWindow;
466 Point m_lastMousePos;
467 void setNPWindowIfNeeded();
468 void nullEventTimerFired(Timer<PluginView>*);
469 Point globalMousePosForPlugin() const;
470 Point mousePosForPlugin(MouseEvent* event = 0) const;
473 #if defined(XP_UNIX) && ENABLE(NETSCAPE_PLUGIN_API)
474 bool m_hasPendingGeometryChange;
478 Display* m_pluginDisplay;
480 void initXEvent(XEvent* event);
484 #if defined(XP_UNIX) && ENABLE(NETSCAPE_PLUGIN_API)
485 void paintUsingXPixmap(QPainter* painter, const QRect &exposedRect);
487 #if USE(ACCELERATED_COMPOSITING_PLUGIN_LAYER)
488 OwnPtr<PlatformLayer> m_platformLayer;
489 friend class PluginGraphicsLayerQt;
490 #endif // USE(ACCELERATED_COMPOSITING_PLUGIN_LAYER)
491 #endif // PLATFORM(QT)
494 static gboolean plugRemovedCallback(GtkSocket*, PluginView*);
495 static void plugAddedCallback(GtkSocket*, PluginView*);
496 void updateWidgetAllocationAndClip();
498 IntRect m_delayedAllocation;
501 #if ENABLE(TIZEN_ACCELERATED_COMPOSITING_PLUGIN_LAYER_EFL)
502 RefPtr<EflLayer> m_platformLayer;
504 mutable OwnPtr<ImageBuffer> m_imageBuffer;
507 IntRect m_clipRect; // The clip rect to apply to a windowed plug-in
508 IntRect m_windowRect; // Our window rect.
511 RefPtr<PluginStream> m_manualStream;
513 bool m_isJavaScriptPaused;
515 bool m_haveCalledSetWindow;
517 static PluginView* s_currentPluginView;
519 #if PLATFORM(EFL) && ENABLE(TIZEN_SUPPORT_PLUGINS) && ENABLE(TIZEN_DONT_PAN_OVER_SOME_PLUGINS)
520 static bool s_isHandlingEvents;
521 static PluginView* s_currentPluginHandlingEvents;
522 #if ENABLE(TIZEN_EVAS_OBJECT_PLUGIN)
523 bool m_lastEventWasHandled;
528 } // namespace WebCore