diff options
Diffstat (limited to 'Source/WebKit2/WebProcess/Plugins/PluginView.h')
-rw-r--r-- | Source/WebKit2/WebProcess/Plugins/PluginView.h | 216 |
1 files changed, 116 insertions, 100 deletions
diff --git a/Source/WebKit2/WebProcess/Plugins/PluginView.h b/Source/WebKit2/WebProcess/Plugins/PluginView.h index 556745aed..6fb61486c 100644 --- a/Source/WebKit2/WebProcess/Plugins/PluginView.h +++ b/Source/WebKit2/WebProcess/Plugins/PluginView.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010, 2012 Apple Inc. All rights reserved. + * Copyright (C) 2010, 2012, 2015 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -31,35 +31,42 @@ #include "Plugin.h" #include "PluginController.h" #include "WebFrame.h" +#include <WebCore/ActivityState.h> #include <WebCore/FindOptions.h> #include <WebCore/Image.h> #include <WebCore/MediaCanStartListener.h> +#include <WebCore/MediaProducer.h> #include <WebCore/PluginViewBase.h> #include <WebCore/ResourceError.h> #include <WebCore/ResourceResponse.h> #include <WebCore/Timer.h> -#include <WebCore/ViewState.h> +#include <memory> #include <wtf/Deque.h> #include <wtf/RunLoop.h> // FIXME: Eventually this should move to WebCore. +#if PLATFORM(COCOA) +OBJC_CLASS NSDictionary; +OBJC_CLASS PDFSelection; +#endif + namespace WebCore { class Frame; class HTMLPlugInElement; +class MachSendRight; class MouseEvent; -class RenderBoxModelObject; } namespace WebKit { class WebEvent; -class PluginView : public WebCore::PluginViewBase, public PluginController, private WebCore::MediaCanStartListener, private WebFrame::LoadListener { +class PluginView : public WebCore::PluginViewBase, public PluginController, private WebCore::MediaCanStartListener, private WebFrame::LoadListener, private WebCore::MediaProducer { public: - static PassRefPtr<PluginView> create(PassRefPtr<WebCore::HTMLPlugInElement>, PassRefPtr<Plugin>, const Plugin::Parameters&); + static Ref<PluginView> create(WebCore::HTMLPlugInElement&, Ref<Plugin>&&, const Plugin::Parameters&); - void recreateAndInitialize(PassRefPtr<Plugin>); + void recreateAndInitialize(Ref<Plugin>&&); WebCore::Frame* frame() const; @@ -70,11 +77,10 @@ public: void manualLoadDidFinishLoading(); void manualLoadDidFail(const WebCore::ResourceError&); - void viewStateDidChange(WebCore::ViewState::Flags changed); + void activityStateDidChange(WebCore::ActivityState::Flags changed); void setLayerHostingMode(LayerHostingMode); -#if PLATFORM(MAC) - void platformViewStateDidChange(WebCore::ViewState::Flags changed); +#if PLATFORM(COCOA) void setDeviceScaleFactor(float); void windowAndViewFramesChanged(const WebCore::FloatRect& windowFrameInScreenCoordinates, const WebCore::FloatRect& viewFrameInWindowCoordinates); bool sendComplexTextInput(uint64_t pluginComplexTextInputIdentifier, const String& textInput); @@ -84,15 +90,16 @@ public: WebCore::HTMLPlugInElement* pluginElement() const { return m_pluginElement.get(); } const Plugin::Parameters& initialParameters() const { return m_parameters; } + Plugin* plugin() const { return m_plugin.get(); } - // FIXME: Remove this; nobody should have to know about the plug-in view's renderer except the plug-in view itself. - WebCore::RenderBoxModelObject* renderer() const; - void setPageScaleFactor(double scaleFactor, WebCore::IntPoint origin); double pageScaleFactor() const; bool handlesPageScaleFactor() const; + bool requiresUnifiedScaleFactor() const; void pageScaleFactorDidChange(); + void topContentInsetDidChange(); + void webPageDestroyed(); bool handleEditingCommand(const String& commandName, const String& argument); @@ -105,11 +112,13 @@ public: bool shouldAllowScripting(); - PassRefPtr<WebCore::SharedBuffer> liveResourceData() const; + RefPtr<WebCore::SharedBuffer> liveResourceData() const; bool performDictionaryLookupAtLocation(const WebCore::FloatPoint&); + String getSelectionForWordAtPoint(const WebCore::FloatPoint&) const; + bool existingSelectionContainsPoint(const WebCore::FloatPoint&) const; private: - PluginView(PassRefPtr<WebCore::HTMLPlugInElement>, PassRefPtr<Plugin>, const Plugin::Parameters& parameters); + PluginView(WebCore::HTMLPlugInElement&, Ref<Plugin>&&, const Plugin::Parameters&); virtual ~PluginView(); void initializePlugin(); @@ -136,106 +145,114 @@ private: void redeliverManualStream(); - void pluginSnapshotTimerFired(WebCore::DeferrableOneShotTimer<PluginView>&); + void pluginSnapshotTimerFired(); void pluginDidReceiveUserInteraction(); bool shouldCreateTransientPaintingSnapshot() const; // WebCore::PluginViewBase -#if PLATFORM(MAC) - virtual PlatformLayer* platformLayer() const; +#if PLATFORM(COCOA) + PlatformLayer* platformLayer() const override; #endif - virtual JSC::JSObject* scriptObject(JSC::JSGlobalObject*); - virtual void storageBlockingStateChanged(); - virtual void privateBrowsingStateChanged(bool); - virtual bool getFormValue(String&); - virtual bool scroll(WebCore::ScrollDirection, WebCore::ScrollGranularity); - virtual WebCore::Scrollbar* horizontalScrollbar(); - virtual WebCore::Scrollbar* verticalScrollbar(); - virtual bool wantsWheelEvents(); - virtual bool shouldAlwaysAutoStart() const override; - virtual void beginSnapshottingRunningPlugin() override; - virtual bool shouldAllowNavigationFromDrags() const override; - virtual bool shouldNotAddLayer() const override; + JSC::JSObject* scriptObject(JSC::JSGlobalObject*) override; + void storageBlockingStateChanged() override; + void privateBrowsingStateChanged(bool) override; + bool getFormValue(String&) override; + bool scroll(WebCore::ScrollDirection, WebCore::ScrollGranularity) override; + WebCore::Scrollbar* horizontalScrollbar() override; + WebCore::Scrollbar* verticalScrollbar() override; + bool wantsWheelEvents() override; + bool shouldAlwaysAutoStart() const override; + void beginSnapshottingRunningPlugin() override; + bool shouldAllowNavigationFromDrags() const override; + bool shouldNotAddLayer() const override; + void willDetatchRenderer() override; // WebCore::Widget - virtual void setFrameRect(const WebCore::IntRect&); - virtual void paint(WebCore::GraphicsContext*, const WebCore::IntRect&); - virtual void invalidateRect(const WebCore::IntRect&); - virtual void setFocus(bool); - virtual void frameRectsChanged(); - virtual void setParent(WebCore::ScrollView*); - virtual void handleEvent(WebCore::Event*); - virtual void notifyWidget(WebCore::WidgetNotification); - virtual void show(); - virtual void hide(); - virtual void setParentVisible(bool); - virtual bool transformsAffectFrameRect(); - virtual void clipRectChanged() override; + void setFrameRect(const WebCore::IntRect&) override; + void paint(WebCore::GraphicsContext&, const WebCore::IntRect&, WebCore::Widget::SecurityOriginPaintPolicy) override; + void invalidateRect(const WebCore::IntRect&) override; + void setFocus(bool) override; + void frameRectsChanged() override; + void setParent(WebCore::ScrollView*) override; + void handleEvent(WebCore::Event*) override; + void notifyWidget(WebCore::WidgetNotification) override; + void show() override; + void hide() override; + void setParentVisible(bool) override; + bool transformsAffectFrameRect() override; + void clipRectChanged() override; // WebCore::MediaCanStartListener - virtual void mediaCanStart(); + void mediaCanStart(WebCore::Document&) override; + + // WebCore::MediaProducer + MediaProducer::MediaStateFlags mediaState() const override { return m_pluginIsPlayingAudio ? MediaProducer::IsPlayingAudio : MediaProducer::IsNotPlaying; } + void pageMutedStateDidChange() override; // PluginController - virtual bool isPluginVisible(); - virtual void invalidate(const WebCore::IntRect&); - virtual String userAgent(); - virtual void loadURL(uint64_t requestID, const String& method, const String& urlString, const String& target, - const WebCore::HTTPHeaderMap& headerFields, const Vector<uint8_t>& httpBody, bool allowPopups); - virtual void cancelStreamLoad(uint64_t streamID); - virtual void cancelManualStreamLoad(); + void invalidate(const WebCore::IntRect&) override; + String userAgent() override; + void loadURL(uint64_t requestID, const String& method, const String& urlString, const String& target, const WebCore::HTTPHeaderMap& headerFields, const Vector<uint8_t>& httpBody, bool allowPopups) override; + void cancelStreamLoad(uint64_t streamID) override; + void continueStreamLoad(uint64_t streamID) override; + void cancelManualStreamLoad() override; #if ENABLE(NETSCAPE_PLUGIN_API) - virtual NPObject* windowScriptNPObject(); - virtual NPObject* pluginElementNPObject(); - virtual bool evaluate(NPObject*, const String&scriptString, NPVariant* result, bool allowPopups); + NPObject* windowScriptNPObject() override; + NPObject* pluginElementNPObject() override; + bool evaluate(NPObject*, const String& scriptString, NPVariant* result, bool allowPopups) override; + void setPluginIsPlayingAudio(bool) override; + bool isMuted() const override; #endif - virtual void setStatusbarText(const String&); - virtual bool isAcceleratedCompositingEnabled(); - virtual void pluginProcessCrashed(); - virtual void willSendEventToPlugin(); -#if PLATFORM(MAC) - virtual void pluginFocusOrWindowFocusChanged(bool pluginHasFocusAndWindowHasFocus); - virtual void setComplexTextInputState(PluginComplexTextInputState); - virtual mach_port_t compositingRenderServerPort(); - virtual void openPluginPreferencePane() override; + void setStatusbarText(const String&) override; + bool isAcceleratedCompositingEnabled() override; + void pluginProcessCrashed() override; +#if PLATFORM(COCOA) + void pluginFocusOrWindowFocusChanged(bool pluginHasFocusAndWindowHasFocus) override; + void setComplexTextInputState(PluginComplexTextInputState) override; + const WebCore::MachSendRight& compositingRenderServerPort() override; #endif - virtual float contentsScaleFactor(); - virtual String proxiesForURL(const String&); - virtual String cookiesForURL(const String&); - virtual void setCookiesForURL(const String& urlString, const String& cookieString); - virtual bool getAuthenticationInfo(const WebCore::ProtectionSpace&, String& username, String& password); - virtual bool isPrivateBrowsingEnabled(); - virtual bool asynchronousPluginInitializationEnabled() const; - virtual bool asynchronousPluginInitializationEnabledForAllPlugins() const; - virtual bool artificialPluginInitializationDelayEnabled() const; - virtual void protectPluginFromDestruction(); - virtual void unprotectPluginFromDestruction(); + float contentsScaleFactor() override; + String proxiesForURL(const String&) override; + String cookiesForURL(const String&) override; + void setCookiesForURL(const String& urlString, const String& cookieString) override; + bool getAuthenticationInfo(const WebCore::ProtectionSpace&, String& username, String& password) override; + bool isPrivateBrowsingEnabled() override; + bool asynchronousPluginInitializationEnabled() const override; + bool asynchronousPluginInitializationEnabledForAllPlugins() const override; + bool artificialPluginInitializationDelayEnabled() const override; + void protectPluginFromDestruction() override; + void unprotectPluginFromDestruction() override; #if PLUGIN_ARCHITECTURE(X11) - virtual uint64_t createPluginContainer(); - virtual void windowedPluginGeometryDidChange(const WebCore::IntRect& frameRect, const WebCore::IntRect& clipRect, uint64_t windowID); - virtual void windowedPluginVisibilityDidChange(bool isVisible, uint64_t windowID); + uint64_t createPluginContainer() override; + void windowedPluginGeometryDidChange(const WebCore::IntRect& frameRect, const WebCore::IntRect& clipRect, uint64_t windowID) override; + void windowedPluginVisibilityDidChange(bool isVisible, uint64_t windowID) override; #endif - virtual void didInitializePlugin(); - virtual void didFailToInitializePlugin(); + void didInitializePlugin() override; + void didFailToInitializePlugin() override; void destroyPluginAndReset(); // WebFrame::LoadListener - virtual void didFinishLoad(WebFrame*); - virtual void didFailLoad(WebFrame*, bool wasCancelled); + void didFinishLoad(WebFrame*) override; + void didFailLoad(WebFrame*, bool wasCancelled) override; - OwnPtr<WebEvent> createWebEvent(WebCore::MouseEvent*) const; + std::unique_ptr<WebEvent> createWebEvent(WebCore::MouseEvent*) const; RefPtr<WebCore::HTMLPlugInElement> m_pluginElement; RefPtr<Plugin> m_plugin; WebPage* m_webPage; Plugin::Parameters m_parameters; - - bool m_isInitialized; - bool m_isWaitingForSynchronousInitialization; - bool m_isWaitingUntilMediaCanStart; - bool m_isBeingDestroyed; - bool m_pluginProcessHasCrashed; + + bool m_isInitialized { false }; + bool m_isWaitingForSynchronousInitialization { false }; + bool m_isWaitingUntilMediaCanStart { false }; + bool m_isBeingDestroyed { false }; + bool m_pluginProcessHasCrashed { false }; + +#if ENABLE(PRIMARY_SNAPSHOTTED_PLUGIN_HEURISTIC) + bool m_didPlugInStartOffScreen { false }; +#endif // Pending URLRequests that the plug-in has made. Deque<RefPtr<URLRequest>> m_pendingURLRequests; @@ -250,31 +267,30 @@ private: #if ENABLE(NETSCAPE_PLUGIN_API) // A map of all related NPObjects for this plug-in view. - NPRuntimeObjectMap m_npRuntimeObjectMap; + NPRuntimeObjectMap m_npRuntimeObjectMap { this }; #endif // The manual stream state. This is used so we can deliver a manual stream to a plug-in // when it is initialized. - enum ManualStreamState { - StreamStateInitial, - StreamStateHasReceivedResponse, - StreamStateFinished, - StreamStateFailed - }; - ManualStreamState m_manualStreamState; + enum class ManualStreamState { Initial, HasReceivedResponse, Finished, Failed }; + ManualStreamState m_manualStreamState { ManualStreamState::Initial }; WebCore::ResourceResponse m_manualStreamResponse; WebCore::ResourceError m_manualStreamError; RefPtr<WebCore::SharedBuffer> m_manualStreamData; - + // This snapshot is used to avoid side effects should the plugin run JS during painting. RefPtr<ShareableBitmap> m_transientPaintingSnapshot; // This timer is used when plugin snapshotting is enabled, to capture a plugin placeholder. - WebCore::DeferrableOneShotTimer<PluginView> m_pluginSnapshotTimer; - unsigned m_countSnapshotRetries; - bool m_didReceiveUserInteraction; + WebCore::DeferrableOneShotTimer m_pluginSnapshotTimer; +#if ENABLE(PRIMARY_SNAPSHOTTED_PLUGIN_HEURISTIC) || PLATFORM(COCOA) + unsigned m_countSnapshotRetries { 0 }; +#endif + bool m_didReceiveUserInteraction { false }; + + double m_pageScaleFactor { 1 }; - double m_pageScaleFactor; + bool m_pluginIsPlayingAudio { false }; }; } // namespace WebKit |