diff options
author | Konstantin Tokarev <annulen@yandex.ru> | 2016-08-25 19:20:41 +0300 |
---|---|---|
committer | Konstantin Tokarev <annulen@yandex.ru> | 2017-02-02 12:30:55 +0000 |
commit | 6882a04fb36642862b11efe514251d32070c3d65 (patch) | |
tree | b7959826000b061fd5ccc7512035c7478742f7b0 /Source/WebKit/win/Plugins/PluginView.h | |
parent | ab6df191029eeeb0b0f16f127d553265659f739e (diff) |
Imported QtWebKit TP3 (git b57bc6801f1876c3220d5a4bfea33d620d477443)
Change-Id: I3b1d8a2808782c9f34d50240000e20cb38d3680f
Reviewed-by: Konstantin Tokarev <annulen@yandex.ru>
Diffstat (limited to 'Source/WebKit/win/Plugins/PluginView.h')
-rw-r--r-- | Source/WebKit/win/Plugins/PluginView.h | 465 |
1 files changed, 465 insertions, 0 deletions
diff --git a/Source/WebKit/win/Plugins/PluginView.h b/Source/WebKit/win/Plugins/PluginView.h new file mode 100644 index 000000000..dfdae16f2 --- /dev/null +++ b/Source/WebKit/win/Plugins/PluginView.h @@ -0,0 +1,465 @@ +/* + * Copyright (C) 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. + * Copyright (C) 2008 Collabora Ltd. All rights reserved. + * Copyright (C) 2009 Girish Ramakrishnan <girish@forwardbias.in> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef PluginView_h +#define PluginView_h + +#include "FrameLoadRequest.h" +#include "IntRect.h" +#include "MediaCanStartListener.h" +#include "PluginViewBase.h" +#include "ResourceRequest.h" +#include "Timer.h" +#include <wtf/HashMap.h> +#include <wtf/HashSet.h> +#include <wtf/PassRefPtr.h> +#include <wtf/RefPtr.h> +#include <wtf/Vector.h> +#include <wtf/text/CString.h> + +#if ENABLE(NETSCAPE_PLUGIN_API) +#include "PluginStream.h" +#include "npruntime_internal.h" +#endif + +#if OS(WINDOWS) && (PLATFORM(GTK) || PLATFORM(QT)) +typedef struct HWND__* HWND; +typedef HWND PlatformPluginWidget; +#else +typedef PlatformWidget PlatformPluginWidget; +#endif +#if PLATFORM(QT) +#if USE(TEXTURE_MAPPER) +#include "TextureMapperPlatformLayer.h" +#endif + +#include <QImage> +QT_BEGIN_NAMESPACE +class QPainter; +QT_END_NAMESPACE +#endif +#if PLATFORM(GTK) +typedef struct _GtkSocket GtkSocket; +#endif + +#if PLATFORM(X11) +typedef unsigned long Window; +typedef struct _XDisplay Display; +#endif + +namespace JSC { + namespace Bindings { + class Instance; + } +} + +namespace WebCore { + class Frame; + class FrameView; + class Image; + class HTMLPlugInElement; + class KeyboardEvent; + class MouseEvent; + class URL; +#if OS(WINDOWS) && ENABLE(NETSCAPE_PLUGIN_API) + class PluginMessageThrottlerWin; +#endif + class PluginPackage; + class PluginRequest; + class PluginStream; + class ResourceError; + class ResourceResponse; + class WheelEvent; + + enum PluginStatus { + PluginStatusCanNotFindPlugin, + PluginStatusCanNotLoadPlugin, + PluginStatusLoadedSuccessfully + }; + + class PluginRequest { + WTF_MAKE_NONCOPYABLE(PluginRequest); WTF_MAKE_FAST_ALLOCATED; + public: + PluginRequest(const FrameLoadRequest& frameLoadRequest, bool sendNotification, void* notifyData, bool shouldAllowPopups) + : m_frameLoadRequest(frameLoadRequest) + , m_notifyData(notifyData) + , m_sendNotification(sendNotification) + , m_shouldAllowPopups(shouldAllowPopups) { } + public: + const FrameLoadRequest& frameLoadRequest() const { return m_frameLoadRequest; } + void* notifyData() const { return m_notifyData; } + bool sendNotification() const { return m_sendNotification; } + bool shouldAllowPopups() const { return m_shouldAllowPopups; } + private: + FrameLoadRequest m_frameLoadRequest; + void* m_notifyData; + bool m_sendNotification; + bool m_shouldAllowPopups; + }; + + class PluginManualLoader { + public: + virtual ~PluginManualLoader() {} + virtual void didReceiveResponse(const ResourceResponse&) = 0; + virtual void didReceiveData(const char*, int) = 0; + virtual void didFinishLoading() = 0; + virtual void didFail(const ResourceError&) = 0; + }; + + class PluginView : public PluginViewBase +#if ENABLE(NETSCAPE_PLUGIN_API) + , private PluginStreamClient +#endif + , public PluginManualLoader + , private MediaCanStartListener { + public: + static Ref<PluginView> create(Frame* parentFrame, const IntSize&, HTMLPlugInElement*, const URL&, const Vector<String>& paramNames, const Vector<String>& paramValues, const String& mimeType, bool loadManually); + virtual ~PluginView(); + + PluginPackage* plugin() const { return m_plugin.get(); } +#if ENABLE(NETSCAPE_PLUGIN_API) + NPP instance() const { return m_instance; } +#endif + + void setNPWindowRect(const IntRect&); + static PluginView* currentPluginView(); + +#if ENABLE(NETSCAPE_PLUGIN_API) + NPObject* npObject(); +#endif + virtual RefPtr<JSC::Bindings::Instance> bindingInstance() override; + + PluginStatus status() const { return m_status; } + +#if ENABLE(NETSCAPE_PLUGIN_API) + // NPN functions + NPError getURLNotify(const char* url, const char* target, void* notifyData); + NPError getURL(const char* url, const char* target); + NPError postURLNotify(const char* url, const char* target, uint32_t len, const char* but, NPBool file, void* notifyData); + NPError postURL(const char* url, const char* target, uint32_t len, const char* but, NPBool file); + NPError newStream(NPMIMEType type, const char* target, NPStream** stream); + int32_t write(NPStream* stream, int32_t len, void* buffer); + NPError destroyStream(NPStream* stream, NPReason reason); +#endif + const char* userAgent(); +#if ENABLE(NETSCAPE_PLUGIN_API) + static const char* userAgentStatic(); +#endif + void status(const char* message); + +#if ENABLE(NETSCAPE_PLUGIN_API) + NPError getValue(NPNVariable variable, void* value); + static NPError getValueStatic(NPNVariable variable, void* value); + NPError setValue(NPPVariable variable, void* value); + NPError getValueForURL(NPNURLVariable variable, const char* url, char** value, uint32_t* len); + NPError setValueForURL(NPNURLVariable variable, const char* url, const char* value, uint32_t len); + 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); + void invalidateRect(NPRect*); + void invalidateRegion(NPRegion); +#endif + void forceRedraw(); + void pushPopupsEnabledState(bool state); + void popPopupsEnabledState(); + + virtual void invalidateRect(const IntRect&); + + bool arePopupsAllowed() const; + + void setJavaScriptPaused(bool); + + void privateBrowsingStateChanged(bool); + + void disconnectStream(PluginStream*); + void streamDidFinishLoading(PluginStream* stream) { disconnectStream(stream); } + + // Widget functions + virtual void setFrameRect(const IntRect&); + virtual void frameRectsChanged(); + virtual void setFocus(bool); + virtual void show(); + virtual void hide(); + virtual void paint(GraphicsContext&, const IntRect&); + virtual void clipRectChanged() override; + + // This method is used by plugins on all platforms to obtain a clip rect that includes clips set by WebCore, + // e.g., in overflow:auto sections. The clip rects coordinates are in the containing window's coordinate space. + // This clip includes any clips that the widget itself sets up for its children. + IntRect windowClipRect() const; + + virtual void handleEvent(Event*); + virtual void setParent(ScrollView*); + virtual void setParentVisible(bool); + + virtual bool isPluginView() const override { return true; } + + Frame* parentFrame() const { return m_parentFrame.get(); } + + void focusPluginElement(); + + const String& pluginsPage() const { return m_pluginsPage; } + const String& mimeType() const { return m_mimeType; } + const URL& url() const { return m_url; } + +#if defined(XP_MACOSX) && ENABLE(NETSCAPE_PLUGIN_API) + bool popUpContextMenu(NPMenu*); +#endif + +#if OS(WINDOWS) && ENABLE(NETSCAPE_PLUGIN_API) + static LRESULT CALLBACK PluginViewWndProc(HWND, UINT, WPARAM, LPARAM); + LRESULT wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); + WNDPROC pluginWndProc() const { return m_pluginWndProc; } +#endif + + // Used for manual loading + void didReceiveResponse(const ResourceResponse&); + void didReceiveData(const char*, int); + void didFinishLoading(); + void didFail(const ResourceError&); + + static bool isCallingPlugin(); + + bool start(); + +#if ENABLE(NETSCAPE_PLUGIN_API) + static void keepAlive(NPP); +#endif + void keepAlive(); + +#if PLATFORM(X11) + static Display* getPluginDisplay(Frame*); + static Window getRootWindow(Frame* parentFrame); +#endif + +#if PLATFORM(QT) && ENABLE(NETSCAPE_PLUGIN_API) && defined(XP_UNIX) + // PluginViewQt (X11) needs a few workarounds when running under DRT + static void setIsRunningUnderDRT(bool flag) { s_isRunningUnderDRT = flag; } +#endif + + private: + PluginView(Frame* parentFrame, const IntSize&, PluginPackage*, HTMLPlugInElement*, const URL&, const Vector<String>& paramNames, const Vector<String>& paramValues, const String& mimeType, bool loadManually); + + void setParameters(const Vector<String>& paramNames, const Vector<String>& paramValues); + bool startOrAddToUnstartedList(); + void init(); + bool platformStart(); + void stop(); + void platformDestroy(); + static void setCurrentPluginView(PluginView*); +#if ENABLE(NETSCAPE_PLUGIN_API) + NPError load(const FrameLoadRequest&, bool sendNotification, void* notifyData); + NPError handlePost(const char* url, const char* target, uint32_t len, const char* buf, bool file, void* notifyData, bool sendNotification, bool allowHeaders); + NPError handlePostReadFile(Vector<char>& buffer, uint32_t len, const char* buf); +#endif + static void freeStringArray(char** stringArray, int length); + void setCallingPlugin(bool) const; + + void invalidateWindowlessPluginRect(const IntRect&); + + virtual void mediaCanStart(); + +#if OS(WINDOWS) && ENABLE(NETSCAPE_PLUGIN_API) + void paintWindowedPluginIntoContext(GraphicsContext&, const IntRect&); + static HDC WINAPI hookedBeginPaint(HWND, PAINTSTRUCT*); + static BOOL WINAPI hookedEndPaint(HWND, const PAINTSTRUCT*); +#endif + +#if ENABLE(NETSCAPE_PLUGIN_API) + static bool platformGetValueStatic(NPNVariable variable, void* value, NPError* result); + bool platformGetValue(NPNVariable variable, void* value, NPError* result); +#endif + + RefPtr<Frame> m_parentFrame; + RefPtr<PluginPackage> m_plugin; + HTMLPlugInElement* m_element; + bool m_isStarted; + URL m_url; + PluginStatus m_status; + Vector<IntRect> m_invalidRects; + + void performRequest(PluginRequest*); + void scheduleRequest(std::unique_ptr<PluginRequest>); + void requestTimerFired(); + void invalidateTimerFired(); + Timer m_requestTimer; + Timer m_invalidateTimer; + + void popPopupsStateTimerFired(); + Timer m_popPopupsStateTimer; + + void lifeSupportTimerFired(); + Timer m_lifeSupportTimer; + +#if ENABLE(NETSCAPE_PLUGIN_API) + bool dispatchNPEvent(NPEvent&); +#endif +#if defined(XP_MACOSX) && ENABLE(NETSCAPE_PLUGIN_API) + int16_t dispatchNPCocoaEvent(NPCocoaEvent&); + bool m_updatedCocoaTextInputRequested; + bool m_keyDownSent; + uint16_t m_disregardKeyUpCounter; +#endif + +#if defined(XP_MACOSX) + void handleWheelEvent(WheelEvent*); +#endif + void updatePluginWidget(); + void paintMissingPluginIcon(GraphicsContext&, const IntRect&); + + void handleKeyboardEvent(KeyboardEvent*); + void handleMouseEvent(MouseEvent*); +#if defined(XP_UNIX) && ENABLE(NETSCAPE_PLUGIN_API) + void handleFocusInEvent(); + void handleFocusOutEvent(); +#endif + +#if OS(WINDOWS) + void paintIntoTransformedContext(HDC); + PassRefPtr<Image> snapshot(); +#endif + + float deviceScaleFactor() const; + + int m_mode; + int m_paramCount; + char** m_paramNames; + char** m_paramValues; + String m_pluginsPage; + + String m_mimeType; + WTF::CString m_userAgent; + +#if ENABLE(NETSCAPE_PLUGIN_API) + NPP m_instance; + NPP_t m_instanceStruct; + NPWindow m_npWindow; +#endif + + Vector<bool, 4> m_popupStateStack; + + HashSet<RefPtr<PluginStream> > m_streams; + Vector<std::unique_ptr<PluginRequest>> m_requests; + + bool m_isWindowed; + bool m_isTransparent; + bool m_haveInitialized; + bool m_isWaitingToStart; + +#if defined(XP_UNIX) + bool m_needsXEmbed; +#endif + +#if OS(WINDOWS) && ENABLE(NETSCAPE_PLUGIN_API) + std::unique_ptr<PluginMessageThrottlerWin> m_messageThrottler; + WNDPROC m_pluginWndProc; + unsigned m_lastMessage; + bool m_isCallingPluginWndProc; + HDC m_wmPrintHDC; + bool m_haveUpdatedPluginWidget; +#endif + +#if PLATFORM(QT) && OS(WINDOWS) + // On Mac OSX and Qt/Windows the plugin does not have its own native widget, + // but is using the containing window as its reference for positioning/painting. + PlatformPluginWidget m_window; +public: + PlatformPluginWidget platformPluginWidget() const { return m_window; } + void setPlatformPluginWidget(PlatformPluginWidget widget) { m_window = widget; } +#else +public: + void setPlatformPluginWidget(PlatformPluginWidget widget) { setPlatformWidget(widget); } + PlatformPluginWidget platformPluginWidget() const { return platformWidget(); } +#endif + +private: + +#if defined(XP_UNIX) || PLATFORM(GTK) + void setNPWindowIfNeeded(); +#elif defined(XP_MACOSX) + NP_CGContext m_npCgContext; + CGContextRef m_contextRef; + + void setNPWindowIfNeeded(); +#endif + +#if defined(XP_UNIX) && ENABLE(NETSCAPE_PLUGIN_API) + bool m_hasPendingGeometryChange; + Pixmap m_drawable; + Visual* m_visual; + Colormap m_colormap; + Display* m_pluginDisplay; + + void initXEvent(XEvent* event); +#endif + +#if PLATFORM(QT) +#if defined(XP_UNIX) && ENABLE(NETSCAPE_PLUGIN_API) + static bool s_isRunningUnderDRT; + static void setXKeyEventSpecificFields(XEvent*, KeyboardEvent*); + void paintUsingXPixmap(QPainter* painter, const QRect &exposedRect); + QWebPageClient* platformPageClient() const; +#endif +#endif // PLATFORM(QT) + +#if PLATFORM(GTK) + static gboolean plugRemovedCallback(GtkSocket*, PluginView*); + static void plugAddedCallback(GtkSocket*, PluginView*); + void updateWidgetAllocationAndClip(); + bool m_plugAdded; + IntRect m_delayedAllocation; +#endif + + IntRect m_clipRect; // The clip rect to apply to a windowed plug-in + IntRect m_windowRect; // Our window rect. + + bool m_loadManually; + RefPtr<PluginStream> m_manualStream; + + bool m_isJavaScriptPaused; + + bool m_haveCalledSetWindow; + + static PluginView* s_currentPluginView; + }; + +inline PluginView* toPluginView(Widget* widget) +{ + ASSERT(!widget || widget->isPluginView()); + return static_cast<PluginView*>(widget); +} + +inline const PluginView* toPluginView(const Widget* widget) +{ + ASSERT(!widget || widget->isPluginView()); + return static_cast<const PluginView*>(widget); +} + +// This will catch anyone doing an unnecessary cast. +void toPluginView(const PluginView*); + +} // namespace WebCore + +#endif |