summaryrefslogtreecommitdiff
path: root/Source/WebKit2/WebProcess/Plugins/PluginView.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebKit2/WebProcess/Plugins/PluginView.h')
-rw-r--r--Source/WebKit2/WebProcess/Plugins/PluginView.h216
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