summaryrefslogtreecommitdiff
path: root/Source/WebKit2/PluginProcess
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebKit2/PluginProcess
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/WebKit2/PluginProcess')
-rw-r--r--Source/WebKit2/PluginProcess/EntryPoint/unix/PluginProcessMain.cpp33
-rw-r--r--Source/WebKit2/PluginProcess/PluginControllerProxy.cpp113
-rw-r--r--Source/WebKit2/PluginProcess/PluginControllerProxy.h92
-rw-r--r--Source/WebKit2/PluginProcess/PluginControllerProxy.messages.in25
-rw-r--r--Source/WebKit2/PluginProcess/PluginCreationParameters.cpp16
-rw-r--r--Source/WebKit2/PluginProcess/PluginCreationParameters.h13
-rw-r--r--Source/WebKit2/PluginProcess/PluginProcess.cpp94
-rw-r--r--Source/WebKit2/PluginProcess/PluginProcess.h55
-rw-r--r--Source/WebKit2/PluginProcess/PluginProcess.messages.in9
-rw-r--r--Source/WebKit2/PluginProcess/WebProcessConnection.cpp58
-rw-r--r--Source/WebKit2/PluginProcess/WebProcessConnection.h18
-rw-r--r--Source/WebKit2/PluginProcess/WebProcessConnection.messages.in6
-rw-r--r--Source/WebKit2/PluginProcess/unix/PluginControllerProxyUnix.cpp4
-rw-r--r--Source/WebKit2/PluginProcess/unix/PluginProcessMainUnix.cpp109
-rw-r--r--Source/WebKit2/PluginProcess/unix/PluginProcessMainUnix.h10
-rw-r--r--Source/WebKit2/PluginProcess/unix/PluginProcessUnix.cpp2
16 files changed, 367 insertions, 290 deletions
diff --git a/Source/WebKit2/PluginProcess/EntryPoint/unix/PluginProcessMain.cpp b/Source/WebKit2/PluginProcess/EntryPoint/unix/PluginProcessMain.cpp
new file mode 100644
index 000000000..3df509057
--- /dev/null
+++ b/Source/WebKit2/PluginProcess/EntryPoint/unix/PluginProcessMain.cpp
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2014 Igalia S.L.
+ *
+ * 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. AND ITS CONTRIBUTORS ``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 ITS 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.
+ */
+
+#include "PluginProcessMainUnix.h"
+
+using namespace WebKit;
+
+int main(int argc, char** argv)
+{
+ return PluginProcessMainUnix(argc, argv);
+}
diff --git a/Source/WebKit2/PluginProcess/PluginControllerProxy.cpp b/Source/WebKit2/PluginProcess/PluginControllerProxy.cpp
index 467b3952a..da9db224e 100644
--- a/Source/WebKit2/PluginProcess/PluginControllerProxy.cpp
+++ b/Source/WebKit2/PluginProcess/PluginControllerProxy.cpp
@@ -41,12 +41,13 @@
#include "WebCoreArgumentCoders.h"
#include "WebProcessConnection.h"
#include <WebCore/GraphicsContext.h>
+#include <WebCore/HTTPHeaderMap.h>
#include <WebCore/IdentifierRep.h>
#include <WebCore/NotImplemented.h>
-#include <wtf/TemporaryChange.h>
+#include <wtf/SetForScope.h>
#include <wtf/text/WTFString.h>
-#if PLATFORM(MAC)
+#if PLATFORM(COCOA)
#include "LayerHostingContext.h"
#endif
@@ -59,21 +60,23 @@ PluginControllerProxy::PluginControllerProxy(WebProcessConnection* connection, c
, m_pluginInstanceID(creationParameters.pluginInstanceID)
, m_userAgent(creationParameters.userAgent)
, m_isPrivateBrowsingEnabled(creationParameters.isPrivateBrowsingEnabled)
-#if USE(ACCELERATED_COMPOSITING)
+ , m_isMuted(creationParameters.isMuted)
, m_isAcceleratedCompositingEnabled(creationParameters.isAcceleratedCompositingEnabled)
-#endif
, m_isInitializing(false)
+ , m_isVisible(false)
+ , m_isWindowVisible(false)
, m_paintTimer(RunLoop::main(), this, &PluginControllerProxy::paint)
, m_pluginDestructionProtectCount(0)
, m_pluginDestroyTimer(RunLoop::main(), this, &PluginControllerProxy::destroy)
, m_waitingForDidUpdate(false)
, m_pluginCanceledManualStreamLoad(false)
-#if PLATFORM(MAC)
+#if PLATFORM(COCOA)
, m_isComplexTextInputEnabled(false)
#endif
, m_contentsScaleFactor(creationParameters.contentsScaleFactor)
, m_windowNPObject(0)
, m_pluginElementNPObject(0)
+ , m_visiblityActivity("Plugin is visible.")
{
}
@@ -94,9 +97,9 @@ void PluginControllerProxy::setInitializationReply(PassRefPtr<Messages::WebProce
m_initializationReply = reply;
}
-PassRefPtr<Messages::WebProcessConnection::CreatePlugin::DelayedReply> PluginControllerProxy::takeInitializationReply()
+RefPtr<Messages::WebProcessConnection::CreatePlugin::DelayedReply> PluginControllerProxy::takeInitializationReply()
{
- return m_initializationReply.release();
+ return m_initializationReply;
}
bool PluginControllerProxy::initialize(const PluginCreationParameters& creationParameters)
@@ -104,9 +107,9 @@ bool PluginControllerProxy::initialize(const PluginCreationParameters& creationP
ASSERT(!m_plugin);
ASSERT(!m_isInitializing);
- m_isInitializing = true; // Cannot use TemporaryChange here, because this object can be deleted before the function returns.
+ m_isInitializing = true; // Cannot use SetForScope here, because this object can be deleted before the function returns.
- m_plugin = NetscapePlugin::create(PluginProcess::shared().netscapePluginModule());
+ m_plugin = NetscapePlugin::create(PluginProcess::singleton().netscapePluginModule());
if (!m_plugin) {
// This will delete the plug-in controller proxy object.
m_connection->removePluginControllerProxy(this, 0);
@@ -123,7 +126,7 @@ bool PluginControllerProxy::initialize(const PluginCreationParameters& creationP
// used as an identifier so it's OK to just get a weak reference.
Plugin* plugin = m_plugin.get();
- m_plugin = 0;
+ m_plugin = nullptr;
// This will delete the plug-in controller proxy object.
m_connection->removePluginControllerProxy(this, plugin);
@@ -153,7 +156,7 @@ void PluginControllerProxy::destroy()
Plugin* plugin = m_plugin.get();
m_plugin->destroyPlugin();
- m_plugin = 0;
+ m_plugin = nullptr;
platformDestroy();
@@ -182,16 +185,16 @@ void PluginControllerProxy::paint()
// Create a graphics context.
auto graphicsContext = m_backingStore->createGraphicsContext();
-#if PLATFORM(MAC)
+#if PLATFORM(COCOA)
// FIXME: We should really call applyDeviceScaleFactor instead of scale, but that ends up calling into WKSI
// which we currently don't have initiated in the plug-in process.
- graphicsContext->scale(FloatSize(m_contentsScaleFactor, m_contentsScaleFactor));
+ graphicsContext->scale(m_contentsScaleFactor);
#endif
if (m_plugin->isTransparent())
graphicsContext->clearRect(dirtyRect);
- m_plugin->paint(graphicsContext.get(), dirtyRect);
+ m_plugin->paint(*graphicsContext, dirtyRect);
m_connection->connection()->send(Messages::PluginProxy::Update(dirtyRect), m_pluginInstanceID);
}
@@ -217,13 +220,6 @@ void PluginControllerProxy::startPaintTimer()
m_waitingForDidUpdate = true;
}
-bool PluginControllerProxy::isPluginVisible()
-{
- // FIXME: Implement this.
- notImplemented();
- return false;
-}
-
void PluginControllerProxy::invalidate(const IntRect& rect)
{
IntRect dirtyRect = rect;
@@ -245,6 +241,11 @@ void PluginControllerProxy::loadURL(uint64_t requestID, const String& method, co
m_connection->connection()->send(Messages::PluginProxy::LoadURL(requestID, method, urlString, target, headerFields, httpBody, allowPopups), m_pluginInstanceID);
}
+void PluginControllerProxy::continueStreamLoad(uint64_t streamID)
+{
+ m_connection->connection()->send(Messages::PluginProxy::ContinueStreamLoad(streamID), m_pluginInstanceID);
+}
+
void PluginControllerProxy::cancelStreamLoad(uint64_t streamID)
{
m_connection->connection()->send(Messages::PluginProxy::CancelStreamLoad(streamID), m_pluginInstanceID);
@@ -308,6 +309,11 @@ bool PluginControllerProxy::evaluate(NPObject* npObject, const String& scriptStr
return true;
}
+void PluginControllerProxy::setPluginIsPlayingAudio(bool pluginIsPlayingAudio)
+{
+ m_connection->connection()->send(Messages::PluginProxy::SetPluginIsPlayingAudio(pluginIsPlayingAudio), m_pluginInstanceID);
+}
+
void PluginControllerProxy::setStatusbarText(const String& statusbarText)
{
m_connection->connection()->send(Messages::PluginProxy::SetStatusbarText(statusbarText), m_pluginInstanceID);
@@ -324,12 +330,6 @@ void PluginControllerProxy::pluginProcessCrashed()
ASSERT_NOT_REACHED();
}
-void PluginControllerProxy::willSendEventToPlugin()
-{
- // This is only used when running plugins in the web process.
- ASSERT_NOT_REACHED();
-}
-
void PluginControllerProxy::didInitializePlugin()
{
// This should only be called on the plugin in the web process.
@@ -431,8 +431,36 @@ void PluginControllerProxy::geometryDidChange(const IntSize& pluginSize, const I
void PluginControllerProxy::visibilityDidChange(bool isVisible)
{
+ m_isVisible = isVisible;
+
ASSERT(m_plugin);
m_plugin->visibilityDidChange(isVisible);
+
+ updateVisibilityActivity();
+}
+
+void PluginControllerProxy::windowFocusChanged(bool hasFocus)
+{
+ ASSERT(m_plugin);
+ m_plugin->windowFocusChanged(hasFocus);
+}
+
+void PluginControllerProxy::windowVisibilityChanged(bool isVisible)
+{
+ m_isWindowVisible = isVisible;
+
+ ASSERT(m_plugin);
+ m_plugin->windowVisibilityChanged(isVisible);
+
+ updateVisibilityActivity();
+}
+
+void PluginControllerProxy::updateVisibilityActivity()
+{
+ if (m_isVisible && m_isWindowVisible)
+ m_visiblityActivity.start();
+ else
+ m_visiblityActivity.stop();
}
void PluginControllerProxy::didEvaluateJavaScript(uint64_t requestID, const String& result)
@@ -440,6 +468,11 @@ void PluginControllerProxy::didEvaluateJavaScript(uint64_t requestID, const Stri
m_plugin->didEvaluateJavaScript(requestID, result);
}
+void PluginControllerProxy::streamWillSendRequest(uint64_t streamID, const String& requestURLString, const String& redirectResponseURLString, uint32_t redirectResponseStatusCode)
+{
+ m_plugin->streamWillSendRequest(streamID, URL(ParsedURLString, requestURLString), URL(ParsedURLString, redirectResponseURLString), redirectResponseStatusCode);
+}
+
void PluginControllerProxy::streamDidReceiveResponse(uint64_t streamID, const String& responseURLString, uint32_t streamLength, uint32_t lastModifiedTime, const String& mimeType, const String& headers)
{
m_plugin->streamDidReceiveResponse(streamID, URL(ParsedURLString, responseURLString), streamLength, lastModifiedTime, mimeType, headers, String());
@@ -491,17 +524,9 @@ void PluginControllerProxy::manualStreamDidFail(bool wasCancelled)
m_plugin->manualStreamDidFail(wasCancelled);
}
-
-void PluginControllerProxy::handleMouseEvent(const WebMouseEvent& mouseEvent, PassRefPtr<Messages::PluginControllerProxy::HandleMouseEvent::DelayedReply> reply)
-{
- // Always let the web process think that we've handled this mouse event, even before passing it along to the plug-in.
- // This is a workaround for
- // <rdar://problem/9299901> UI process thinks the page is unresponsive when a plug-in is showing a context menu.
- // The web process sends a synchronous HandleMouseEvent message and the plug-in process spawns a nested
- // run loop when showing the context menu, so eventually the unresponsiveness timer kicks in in the UI process.
- // FIXME: We should come up with a better way to do this.
- reply->send(true);
+void PluginControllerProxy::handleMouseEvent(const WebMouseEvent& mouseEvent)
+{
m_plugin->handleMouseEvent(mouseEvent);
}
@@ -540,6 +565,11 @@ void PluginControllerProxy::handlesPageScaleFactor(bool& isHandled)
isHandled = m_plugin->handlesPageScaleFactor();
}
+void PluginControllerProxy::requiresUnifiedScaleFactor(bool& required)
+{
+ required = m_plugin->requiresUnifiedScaleFactor();
+}
+
void PluginControllerProxy::paintEntirePlugin()
{
if (m_pluginSize.isEmpty())
@@ -602,6 +632,15 @@ void PluginControllerProxy::privateBrowsingStateChanged(bool isPrivateBrowsingEn
m_plugin->privateBrowsingStateChanged(isPrivateBrowsingEnabled);
}
+void PluginControllerProxy::mutedStateChanged(bool isMuted)
+{
+ if (m_isMuted == isMuted)
+ return;
+
+ m_isMuted = isMuted;
+ m_plugin->mutedStateChanged(isMuted);
+}
+
void PluginControllerProxy::getFormValue(bool& returnValue, String& formValue)
{
returnValue = m_plugin->getFormValue(formValue);
diff --git a/Source/WebKit2/PluginProcess/PluginControllerProxy.h b/Source/WebKit2/PluginProcess/PluginControllerProxy.h
index d048d03aa..764d097dd 100644
--- a/Source/WebKit2/PluginProcess/PluginControllerProxy.h
+++ b/Source/WebKit2/PluginProcess/PluginControllerProxy.h
@@ -35,6 +35,7 @@
#include "ShareableBitmap.h"
#include "WebProcessConnectionMessages.h"
#include <WebCore/SecurityOrigin.h>
+#include <WebCore/UserActivity.h>
#include <wtf/Noncopyable.h>
#include <wtf/RunLoop.h>
@@ -61,12 +62,12 @@ public:
bool initialize(const PluginCreationParameters&);
void destroy();
- void didReceivePluginControllerProxyMessage(IPC::Connection*, IPC::MessageDecoder&);
- void didReceiveSyncPluginControllerProxyMessage(IPC::Connection*, IPC::MessageDecoder&, std::unique_ptr<IPC::MessageEncoder>&);
+ void didReceivePluginControllerProxyMessage(IPC::Connection&, IPC::Decoder&);
+ void didReceiveSyncPluginControllerProxyMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&);
bool wantsWheelEvents() const;
-#if PLATFORM(MAC)
+#if PLATFORM(COCOA)
uint32_t remoteLayerClientID() const;
#endif
@@ -75,48 +76,48 @@ public:
bool isInitializing() const { return m_isInitializing; }
void setInitializationReply(PassRefPtr<Messages::WebProcessConnection::CreatePlugin::DelayedReply>);
- PassRefPtr<Messages::WebProcessConnection::CreatePlugin::DelayedReply> takeInitializationReply();
+ RefPtr<Messages::WebProcessConnection::CreatePlugin::DelayedReply> takeInitializationReply();
private:
void startPaintTimer();
void paint();
// 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();
- virtual NPObject* windowScriptNPObject();
- virtual NPObject* pluginElementNPObject();
- virtual bool evaluate(NPObject*, const String& scriptString, NPVariant* result, bool allowPopups);
- virtual void setStatusbarText(const String&);
- virtual bool isAcceleratedCompositingEnabled();
- virtual void pluginProcessCrashed();
- virtual void willSendEventToPlugin();
- virtual void didInitializePlugin() override;
- virtual void didFailToInitializePlugin() override;
-
-#if PLATFORM(MAC)
- virtual void pluginFocusOrWindowFocusChanged(bool) override;
- virtual void setComplexTextInputState(PluginComplexTextInputState) override;
- virtual mach_port_t compositingRenderServerPort() override;
- virtual void openPluginPreferencePane() override;
+ 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 continueStreamLoad(uint64_t streamID) override;
+ void cancelStreamLoad(uint64_t streamID) override;
+ void cancelManualStreamLoad() override;
+ NPObject* windowScriptNPObject() override;
+ NPObject* pluginElementNPObject() override;
+ bool evaluate(NPObject*, const String& scriptString, NPVariant* result, bool allowPopups) override;
+ void setPluginIsPlayingAudio(bool) override;
+ void setStatusbarText(const String&) override;
+ bool isAcceleratedCompositingEnabled() override;
+ void pluginProcessCrashed() override;
+ void didInitializePlugin() override;
+ void didFailToInitializePlugin() override;
+
+#if PLATFORM(COCOA)
+ void pluginFocusOrWindowFocusChanged(bool) 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 isPrivateBrowsingEnabled();
- virtual bool getAuthenticationInfo(const WebCore::ProtectionSpace&, String& username, String& password);
- 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 isPrivateBrowsingEnabled() override;
+ bool isMuted() const override { return m_isMuted; }
+ bool getAuthenticationInfo(const WebCore::ProtectionSpace&, String& username, String& password) 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
// Message handlers.
@@ -125,6 +126,7 @@ private:
void geometryDidChange(const WebCore::IntSize& pluginSize, const WebCore::IntRect& clipRect, const WebCore::AffineTransform& pluginToRootViewTransform, float contentsScaleFactor, const ShareableBitmap::Handle& backingStoreHandle);
void visibilityDidChange(bool isVisible);
void didEvaluateJavaScript(uint64_t requestID, const String& result);
+ void streamWillSendRequest(uint64_t streamID, const String& requestURLString, const String& redirectResponseURLString, uint32_t redirectResponseStatusCode);
void streamDidReceiveResponse(uint64_t streamID, const String& responseURLString, uint32_t streamLength, uint32_t lastModifiedTime, const String& mimeType, const String& headers);
void streamDidReceiveData(uint64_t streamID, const IPC::DataReference& data);
void streamDidFinishLoading(uint64_t streamID);
@@ -133,7 +135,7 @@ private:
void manualStreamDidReceiveData(const IPC::DataReference& data);
void manualStreamDidFinishLoading();
void manualStreamDidFail(bool wasCancelled);
- void handleMouseEvent(const WebMouseEvent&, PassRefPtr<Messages::PluginControllerProxy::HandleMouseEvent::DelayedReply>);
+ void handleMouseEvent(const WebMouseEvent&);
void handleWheelEvent(const WebWheelEvent&, bool& handled);
void handleMouseEnterEvent(const WebMouseEvent&, bool& handled);
void handleMouseLeaveEvent(const WebMouseEvent&, bool& handled);
@@ -141,6 +143,7 @@ private:
void handleEditingCommand(const String&, const String&, bool&);
void isEditingCommandEnabled(const String&, bool&);
void handlesPageScaleFactor(bool&);
+ void requiresUnifiedScaleFactor(bool&);
void paintEntirePlugin();
void supportsSnapshotting(bool&);
void snapshot(ShareableBitmap::Handle& backingStoreHandle);
@@ -148,10 +151,12 @@ private:
void didUpdate();
void getPluginScriptableNPObject(uint64_t& pluginScriptableNPObjectID);
-#if PLATFORM(MAC)
void windowFocusChanged(bool);
- void windowAndViewFramesChanged(const WebCore::IntRect& windowFrameInScreenCoordinates, const WebCore::IntRect& viewFrameInWindowCoordinates);
void windowVisibilityChanged(bool);
+ void updateVisibilityActivity();
+
+#if PLATFORM(COCOA)
+ void windowAndViewFramesChanged(const WebCore::IntRect& windowFrameInScreenCoordinates, const WebCore::IntRect& viewFrameInWindowCoordinates);
void sendComplexTextInput(const String& textInput);
void setLayerHostingMode(uint32_t);
@@ -160,6 +165,7 @@ private:
void storageBlockingStateChanged(bool);
void privateBrowsingStateChanged(bool);
+ void mutedStateChanged(bool);
void getFormValue(bool& returnValue, String& formValue);
void platformInitialize(const PluginCreationParameters&);
@@ -172,8 +178,11 @@ private:
String m_userAgent;
bool m_storageBlockingEnabled;
bool m_isPrivateBrowsingEnabled;
+ bool m_isMuted;
bool m_isAcceleratedCompositingEnabled;
bool m_isInitializing;
+ bool m_isVisible;
+ bool m_isWindowVisible;
RefPtr<Messages::WebProcessConnection::CreatePlugin::DelayedReply> m_initializationReply;
@@ -201,7 +210,7 @@ private:
// Whether the plug-in has canceled the manual stream load.
bool m_pluginCanceledManualStreamLoad;
-#if PLATFORM(MAC)
+#if PLATFORM(COCOA)
// Whether complex text input is enabled for this plug-in.
bool m_isComplexTextInputEnabled;
@@ -220,6 +229,9 @@ private:
// The plug-in element NPObject.
NPObject* m_pluginElementNPObject;
+
+ // Hold an activity when the plugin is visible to prevent throttling.
+ UserActivity m_visiblityActivity;
};
} // namespace WebKit
diff --git a/Source/WebKit2/PluginProcess/PluginControllerProxy.messages.in b/Source/WebKit2/PluginProcess/PluginControllerProxy.messages.in
index 0c61c813a..18e8c80b6 100644
--- a/Source/WebKit2/PluginProcess/PluginControllerProxy.messages.in
+++ b/Source/WebKit2/PluginProcess/PluginControllerProxy.messages.in
@@ -38,6 +38,9 @@ messages -> PluginControllerProxy LegacyReceiver {
# Sent when JavaScript that the plug-in asked to be evaluated has been evaluated.
DidEvaluateJavaScript(uint64_t requestID, String result)
+ # Sent when the plug-in receives will send a request for a stream.
+ StreamWillSendRequest(uint64_t streamID, String requestURLString, String redirectResponseURLString, uint32_t redirectResponseStatusCode)
+
# Sent when the plug-in receives a response for a stream.
StreamDidReceiveResponse(uint64_t streamID, String responseURLString, uint32_t streamLength, uint32_t lastModifiedTime, String mimeType, String headers)
@@ -63,7 +66,7 @@ messages -> PluginControllerProxy LegacyReceiver {
ManualStreamDidFail(bool wasCancelled)
# Sent when a mouse event (that isn't a mouse enter/leave event or a wheel event) should be processed.
- HandleMouseEvent(WebKit::WebMouseEvent mouseEvent) -> (bool handled) Delayed
+ HandleMouseEvent(WebKit::WebMouseEvent mouseEvent)
# Sent when a mouse wheel event should be processed.
HandleWheelEvent(WebKit::WebWheelEvent wheelEvent) -> (bool handled)
@@ -86,6 +89,9 @@ messages -> PluginControllerProxy LegacyReceiver {
# Return whether or not a plugin wants to handle page scale factor itself.
HandlesPageScaleFactor() -> (bool enabled);
+ # Return whether or not a plugin wants page scale, page zoom, and text zoom all to affect page scale.
+ RequiresUnifiedScaleFactor() -> (bool required);
+
# Sent when the plug-in focus changes.
SetFocus(bool isFocused)
@@ -98,19 +104,19 @@ messages -> PluginControllerProxy LegacyReceiver {
# Get a reference to the plug-in's scriptable NPObject.
GetPluginScriptableNPObject() -> (uint64_t pluginScriptableNPObjectID)
-#if PLATFORM(MAC)
- # Send the complex text input to the plug-in.
- SendComplexTextInput(String textInput)
-
# Sent when the containing NSWindow's focus changes
WindowFocusChanged(bool hasFocus)
- # Sent when the containing NSWindow or NSView frame changes
- WindowAndViewFramesChanged(WebCore::IntRect windowFrameInScreenCoordinates, WebCore::IntRect viewFrameInWindowCoordinates)
-
# Sent when the containing NSWindow's visibility changes
WindowVisibilityChanged(bool isVisible)
+#if PLATFORM(COCOA)
+ # Send the complex text input to the plug-in.
+ SendComplexTextInput(String textInput)
+
+ # Sent when the containing NSWindow or NSView frame changes
+ WindowAndViewFramesChanged(WebCore::IntRect windowFrameInScreenCoordinates, WebCore::IntRect viewFrameInWindowCoordinates)
+
# Sent when the containing window's layer hosting mode changes
SetLayerHostingMode(uint32_t layerHostingMode)
#endif
@@ -129,6 +135,9 @@ messages -> PluginControllerProxy LegacyReceiver {
# Gets the string representating the form value of the plug-in
GetFormValue() -> (bool returnValue, String formValue)
+
+ # Sent when the browser wants to mute or unmute the plugin.
+ MutedStateChanged(bool muted)
}
#endif
diff --git a/Source/WebKit2/PluginProcess/PluginCreationParameters.cpp b/Source/WebKit2/PluginProcess/PluginCreationParameters.cpp
index 3d2492f96..ec27eed74 100644
--- a/Source/WebKit2/PluginProcess/PluginCreationParameters.cpp
+++ b/Source/WebKit2/PluginProcess/PluginCreationParameters.cpp
@@ -37,15 +37,14 @@ PluginCreationParameters::PluginCreationParameters()
, windowNPObjectID(0)
, contentsScaleFactor(1)
, isPrivateBrowsingEnabled(false)
+ , isMuted(false)
, asynchronousCreationIncomplete(false)
, artificialPluginInitializationDelayEnabled(false)
-#if USE(ACCELERATED_COMPOSITING)
, isAcceleratedCompositingEnabled(false)
-#endif
{
}
-void PluginCreationParameters::encode(IPC::ArgumentEncoder& encoder) const
+void PluginCreationParameters::encode(IPC::Encoder& encoder) const
{
encoder << pluginInstanceID;
encoder << windowNPObjectID;
@@ -53,15 +52,13 @@ void PluginCreationParameters::encode(IPC::ArgumentEncoder& encoder) const
encoder << userAgent;
encoder << contentsScaleFactor;
encoder << isPrivateBrowsingEnabled;
+ encoder << isMuted;
encoder << asynchronousCreationIncomplete;
encoder << artificialPluginInitializationDelayEnabled;
-
-#if USE(ACCELERATED_COMPOSITING)
encoder << isAcceleratedCompositingEnabled;
-#endif
}
-bool PluginCreationParameters::decode(IPC::ArgumentDecoder& decoder, PluginCreationParameters& result)
+bool PluginCreationParameters::decode(IPC::Decoder& decoder, PluginCreationParameters& result)
{
if (!decoder.decode(result.pluginInstanceID) || !result.pluginInstanceID)
return false;
@@ -81,16 +78,17 @@ bool PluginCreationParameters::decode(IPC::ArgumentDecoder& decoder, PluginCreat
if (!decoder.decode(result.isPrivateBrowsingEnabled))
return false;
+ if (!decoder.decode(result.isMuted))
+ return false;
+
if (!decoder.decode(result.asynchronousCreationIncomplete))
return false;
if (!decoder.decode(result.artificialPluginInitializationDelayEnabled))
return false;
-#if USE(ACCELERATED_COMPOSITING)
if (!decoder.decode(result.isAcceleratedCompositingEnabled))
return false;
-#endif
return true;
}
diff --git a/Source/WebKit2/PluginProcess/PluginCreationParameters.h b/Source/WebKit2/PluginProcess/PluginCreationParameters.h
index 389f755cb..c3751682c 100644
--- a/Source/WebKit2/PluginProcess/PluginCreationParameters.h
+++ b/Source/WebKit2/PluginProcess/PluginCreationParameters.h
@@ -31,8 +31,8 @@
#include "Plugin.h"
namespace IPC {
- class ArgumentDecoder;
- class ArgumentEncoder;
+class Decoder;
+class Encoder;
}
namespace WebKit {
@@ -40,8 +40,8 @@ namespace WebKit {
struct PluginCreationParameters {
PluginCreationParameters();
- void encode(IPC::ArgumentEncoder&) const;
- static bool decode(IPC::ArgumentDecoder&, PluginCreationParameters&);
+ void encode(IPC::Encoder&) const;
+ static bool decode(IPC::Decoder&, PluginCreationParameters&);
// The unique ID of this plug-in instance.
uint64_t pluginInstanceID;
@@ -60,6 +60,9 @@ struct PluginCreationParameters {
// Whether private browsing is enabled at the time of instantiation.
bool isPrivateBrowsingEnabled;
+
+ // Whether the plugin should be muted.
+ bool isMuted;
// If requesting synchronous initialization, whether this plugin had previously been requested asynchronously
bool asynchronousCreationIncomplete;
@@ -67,10 +70,8 @@ struct PluginCreationParameters {
// Simulated initialization delay test asynchronous plugin initialization
bool artificialPluginInitializationDelayEnabled;
-#if USE(ACCELERATED_COMPOSITING)
// Whether accelerated compositing is enabled.
bool isAcceleratedCompositingEnabled;
-#endif
};
} // namespace WebKit
diff --git a/Source/WebKit2/PluginProcess/PluginProcess.cpp b/Source/WebKit2/PluginProcess/PluginProcess.cpp
index 37bcd783b..aea6d8873 100644
--- a/Source/WebKit2/PluginProcess/PluginProcess.cpp
+++ b/Source/WebKit2/PluginProcess/PluginProcess.cpp
@@ -48,7 +48,7 @@ using namespace WebCore;
namespace WebKit {
-PluginProcess& PluginProcess::shared()
+PluginProcess& PluginProcess::singleton()
{
static NeverDestroyed<PluginProcess> pluginProcess;
return pluginProcess;
@@ -57,9 +57,7 @@ PluginProcess& PluginProcess::shared()
PluginProcess::PluginProcess()
: m_supportsAsynchronousPluginInitialization(false)
, m_minimumLifetimeTimer(RunLoop::main(), this, &PluginProcess::minimumLifetimeTimerFired)
-#if PLATFORM(MAC)
- , m_compositingRenderServerPort(MACH_PORT_NULL)
-#endif
+ , m_connectionActivity("PluginProcess connection activity.")
{
NetscapePlugin::setSetExceptionFunction(WebProcessConnection::setGlobalException);
}
@@ -68,20 +66,10 @@ PluginProcess::~PluginProcess()
{
}
-void PluginProcess::lowMemoryHandler(bool critical)
-{
- UNUSED_PARAM(critical);
- if (shared().shouldTerminate())
- shared().terminate();
-}
-
void PluginProcess::initializeProcess(const ChildProcessInitializationParameters& parameters)
{
m_pluginPath = parameters.extraInitializationData.get("plugin-path");
platformInitializeProcess(parameters);
-
- memoryPressureHandler().setLowMemoryHandler(lowMemoryHandler);
- memoryPressureHandler().install();
}
void PluginProcess::removeWebProcessConnection(WebProcessConnection* webProcessConnection)
@@ -121,56 +109,64 @@ bool PluginProcess::shouldTerminate()
return m_webProcessConnections.isEmpty();
}
-void PluginProcess::didReceiveMessage(IPC::Connection* connection, IPC::MessageDecoder& decoder)
+void PluginProcess::didReceiveMessage(IPC::Connection& connection, IPC::Decoder& decoder)
{
didReceivePluginProcessMessage(connection, decoder);
}
-void PluginProcess::didClose(IPC::Connection*)
+void PluginProcess::didClose(IPC::Connection&)
{
- // The UI process has crashed, just go ahead and quit.
+ // The UI process has crashed, just quit.
// FIXME: If the plug-in is spinning in the main loop, we'll never get this message.
stopRunLoop();
}
-void PluginProcess::didReceiveInvalidMessage(IPC::Connection*, IPC::StringReference, IPC::StringReference)
-{
-}
-
-void PluginProcess::initializePluginProcess(const PluginProcessCreationParameters& parameters)
+void PluginProcess::initializePluginProcess(PluginProcessCreationParameters&& parameters)
{
ASSERT(!m_pluginModule);
+ auto& memoryPressureHandler = MemoryPressureHandler::singleton();
+#if OS(LINUX)
+ if (parameters.memoryPressureMonitorHandle.fileDescriptor() != -1)
+ memoryPressureHandler.setMemoryPressureMonitorHandle(parameters.memoryPressureMonitorHandle.releaseFileDescriptor());
+#endif
+ memoryPressureHandler.setLowMemoryHandler([this] (Critical, Synchronous) {
+ if (shouldTerminate())
+ terminate();
+ });
+ memoryPressureHandler.install();
+
m_supportsAsynchronousPluginInitialization = parameters.supportsAsynchronousPluginInitialization;
setMinimumLifetime(parameters.minimumLifetime);
setTerminationTimeout(parameters.terminationTimeout);
- platformInitializePluginProcess(parameters);
+ platformInitializePluginProcess(WTFMove(parameters));
}
void PluginProcess::createWebProcessConnection()
{
bool didHaveAnyWebProcessConnections = !m_webProcessConnections.isEmpty();
-#if PLATFORM(MAC)
+#if USE(UNIX_DOMAIN_SOCKETS)
+ IPC::Connection::SocketPair socketPair = IPC::Connection::createPlatformConnection();
+
+ auto connection = WebProcessConnection::create(socketPair.server);
+ m_webProcessConnections.append(WTFMove(connection));
+
+ IPC::Attachment clientSocket(socketPair.client);
+ parentProcessConnection()->send(Messages::PluginProcessProxy::DidCreateWebProcessConnection(clientSocket, m_supportsAsynchronousPluginInitialization), 0);
+#elif OS(DARWIN)
// Create the listening port.
mach_port_t listeningPort;
mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &listeningPort);
// Create a listening connection.
- RefPtr<WebProcessConnection> connection = WebProcessConnection::create(IPC::Connection::Identifier(listeningPort));
- m_webProcessConnections.append(connection.release());
+ auto connection = WebProcessConnection::create(IPC::Connection::Identifier(listeningPort));
+
+ m_webProcessConnections.append(WTFMove(connection));
IPC::Attachment clientPort(listeningPort, MACH_MSG_TYPE_MAKE_SEND);
parentProcessConnection()->send(Messages::PluginProcessProxy::DidCreateWebProcessConnection(clientPort, m_supportsAsynchronousPluginInitialization), 0);
-#elif USE(UNIX_DOMAIN_SOCKETS)
- IPC::Connection::SocketPair socketPair = IPC::Connection::createPlatformConnection();
-
- RefPtr<WebProcessConnection> connection = WebProcessConnection::create(socketPair.server);
- m_webProcessConnections.append(connection.release());
-
- IPC::Attachment clientSocket(socketPair.client);
- parentProcessConnection()->send(Messages::PluginProcessProxy::DidCreateWebProcessConnection(clientSocket, m_supportsAsynchronousPluginInitialization), 0);
#else
notImplemented();
#endif
@@ -195,19 +191,29 @@ void PluginProcess::getSitesWithData(uint64_t callbackID)
parentProcessConnection()->send(Messages::PluginProcessProxy::DidGetSitesWithData(sites, callbackID), 0);
}
-void PluginProcess::clearSiteData(const Vector<String>& sites, uint64_t flags, uint64_t maxAgeInSeconds, uint64_t callbackID)
+void PluginProcess::deleteWebsiteData(std::chrono::system_clock::time_point modifiedSince, uint64_t callbackID)
{
- if (NetscapePluginModule* module = netscapePluginModule()) {
- if (sites.isEmpty()) {
- // Clear everything.
- module->clearSiteData(String(), flags, maxAgeInSeconds);
- } else {
- for (size_t i = 0; i < sites.size(); ++i)
- module->clearSiteData(sites[i], flags, maxAgeInSeconds);
+ if (auto* module = netscapePluginModule()) {
+ auto currentTime = std::chrono::system_clock::now();
+
+ if (currentTime > modifiedSince) {
+ uint64_t maximumAge = std::chrono::duration_cast<std::chrono::seconds>(currentTime - modifiedSince).count();
+
+ module->clearSiteData(String(), NP_CLEAR_ALL, maximumAge);
}
}
- parentProcessConnection()->send(Messages::PluginProcessProxy::DidClearSiteData(callbackID), 0);
+ parentProcessConnection()->send(Messages::PluginProcessProxy::DidDeleteWebsiteData(callbackID), 0);
+}
+
+void PluginProcess::deleteWebsiteDataForHostNames(const Vector<String>& hostNames, uint64_t callbackID)
+{
+ if (auto* module = netscapePluginModule()) {
+ for (auto& hostName : hostNames)
+ module->clearSiteData(hostName, NP_CLEAR_ALL, std::numeric_limits<uint64_t>::max());
+ }
+
+ parentProcessConnection()->send(Messages::PluginProcessProxy::DidDeleteWebsiteDataForHostNames(callbackID), 0);
}
void PluginProcess::setMinimumLifetime(double lifetime)
@@ -225,7 +231,7 @@ void PluginProcess::minimumLifetimeTimerFired()
enableTermination();
}
-#if !PLATFORM(MAC)
+#if !PLATFORM(COCOA)
void PluginProcess::initializeProcessName(const ChildProcessInitializationParameters&)
{
}
diff --git a/Source/WebKit2/PluginProcess/PluginProcess.h b/Source/WebKit2/PluginProcess/PluginProcess.h
index a87a38824..92c677752 100644
--- a/Source/WebKit2/PluginProcess/PluginProcess.h
+++ b/Source/WebKit2/PluginProcess/PluginProcess.h
@@ -29,21 +29,27 @@
#if ENABLE(NETSCAPE_PLUGIN_API)
#include "ChildProcess.h"
+#include <WebCore/CountedUserActivity.h>
#include <wtf/Forward.h>
#include <wtf/NeverDestroyed.h>
#include <wtf/text/WTFString.h>
+#if PLATFORM(COCOA)
+#include <WebCore/MachSendRight.h>
+#endif
+
namespace WebKit {
class NetscapePluginModule;
class WebProcessConnection;
struct PluginProcessCreationParameters;
-class PluginProcess : public ChildProcess {
+class PluginProcess : public ChildProcess
+{
WTF_MAKE_NONCOPYABLE(PluginProcess);
friend class NeverDestroyed<PluginProcess>;
public:
- static PluginProcess& shared();
+ static PluginProcess& singleton();
void removeWebProcessConnection(WebProcessConnection*);
@@ -51,13 +57,11 @@ public:
const String& pluginPath() const { return m_pluginPath; }
-#if PLATFORM(MAC)
+#if PLATFORM(COCOA)
void setModalWindowIsShowing(bool);
void setFullscreenWindowIsShowing(bool);
-#if USE(ACCELERATED_COMPOSITING)
- mach_port_t compositingRenderServerPort() const { return m_compositingRenderServerPort; }
-#endif
+ const WebCore::MachSendRight& compositingRenderServerPort() const { return m_compositingRenderServerPort; }
bool launchProcess(const String& launchPath, const Vector<String>& arguments);
bool launchApplicationAtURL(const String& urlString, const Vector<String>& arguments);
@@ -65,34 +69,37 @@ public:
bool openFile(const String& urlString);
#endif
+ CountedUserActivity& connectionActivity() { return m_connectionActivity; }
+
private:
PluginProcess();
~PluginProcess();
// ChildProcess
- virtual void initializeProcess(const ChildProcessInitializationParameters&) override;
- virtual void initializeProcessName(const ChildProcessInitializationParameters&) override;
- virtual void initializeSandbox(const ChildProcessInitializationParameters&, SandboxInitializationParameters&) override;
- virtual bool shouldTerminate() override;
+ void initializeProcess(const ChildProcessInitializationParameters&) override;
+ void initializeProcessName(const ChildProcessInitializationParameters&) override;
+ void initializeSandbox(const ChildProcessInitializationParameters&, SandboxInitializationParameters&) override;
+ bool shouldTerminate() override;
void platformInitializeProcess(const ChildProcessInitializationParameters&);
-#if PLATFORM(MAC)
- virtual void stopRunLoop() override;
+#if USE(APPKIT)
+ void stopRunLoop() override;
#endif
// IPC::Connection::Client
- virtual void didReceiveMessage(IPC::Connection*, IPC::MessageDecoder&) override;
- virtual void didClose(IPC::Connection*) override;
- virtual void didReceiveInvalidMessage(IPC::Connection*, IPC::StringReference messageReceiverName, IPC::StringReference messageName) override;
+ void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
+ void didClose(IPC::Connection&) override;
// Message handlers.
- void didReceivePluginProcessMessage(IPC::Connection*, IPC::MessageDecoder&);
- void initializePluginProcess(const PluginProcessCreationParameters&);
+ void didReceivePluginProcessMessage(IPC::Connection&, IPC::Decoder&);
+ void initializePluginProcess(PluginProcessCreationParameters&&);
void createWebProcessConnection();
+
void getSitesWithData(uint64_t callbackID);
- void clearSiteData(const Vector<String>& sites, uint64_t flags, uint64_t maxAgeInSeconds, uint64_t callbackID);
+ void deleteWebsiteData(std::chrono::system_clock::time_point modifiedSince, uint64_t callbackID);
+ void deleteWebsiteDataForHostNames(const Vector<String>& hostNames, uint64_t callbackID);
- void platformInitializePluginProcess(const PluginProcessCreationParameters&);
+ void platformInitializePluginProcess(PluginProcessCreationParameters&&);
void setMinimumLifetime(double);
void minimumLifetimeTimerFired();
@@ -102,7 +109,7 @@ private:
// The plug-in path.
String m_pluginPath;
-#if PLATFORM(MAC)
+#if PLATFORM(COCOA)
String m_pluginBundleIdentifier;
#endif
@@ -113,12 +120,14 @@ private:
RunLoop::Timer<PluginProcess> m_minimumLifetimeTimer;
-#if USE(ACCELERATED_COMPOSITING) && PLATFORM(MAC)
+#if PLATFORM(COCOA)
// The Mach port used for accelerated compositing.
- mach_port_t m_compositingRenderServerPort;
+ WebCore::MachSendRight m_compositingRenderServerPort;
+
+ String m_nsurlCacheDirectory;
#endif
- static void lowMemoryHandler(bool critical);
+ CountedUserActivity m_connectionActivity;
};
} // namespace WebKit
diff --git a/Source/WebKit2/PluginProcess/PluginProcess.messages.in b/Source/WebKit2/PluginProcess/PluginProcess.messages.in
index 60a598205..070e9400c 100644
--- a/Source/WebKit2/PluginProcess/PluginProcess.messages.in
+++ b/Source/WebKit2/PluginProcess/PluginProcess.messages.in
@@ -24,7 +24,7 @@
messages -> PluginProcess LegacyReceiver {
# Initializes the plug-in process.
- InitializePluginProcess(WebKit::PluginProcessCreationParameters processCreationParameters)
+ InitializePluginProcess(struct WebKit::PluginProcessCreationParameters processCreationParameters)
# Creates a web process connection. When the connection has been created,
# The plug-in process sends back a DidCreateWebProcessConnection message with
@@ -35,12 +35,11 @@ messages -> PluginProcess LegacyReceiver {
# DidGetSitesWithData message with the sites.
GetSitesWithData(uint64_t callbackID)
- # Asks the plug-in to clear data for the given sites. The plug-in process sends back
- # a DidClearSiteData message when done.
- ClearSiteData(Vector<String> sites, uint64_t flags, uint64_t maxAgeInSeconds, uint64_t callbackID)
+ DeleteWebsiteData(std::chrono::system_clock::time_point modifiedSince, uint64_t callbackID)
+ DeleteWebsiteDataForHostNames(Vector<String> hostNames, uint64_t callbackID)
-#if PLATFORM(MAC)
SetProcessSuppressionEnabled(bool flag)
+#if PLATFORM(COCOA)
SetQOS(int latencyQOS, int throughputQOS)
#endif
}
diff --git a/Source/WebKit2/PluginProcess/WebProcessConnection.cpp b/Source/WebKit2/PluginProcess/WebProcessConnection.cpp
index 5011089d6..54a8ee65e 100644
--- a/Source/WebKit2/PluginProcess/WebProcessConnection.cpp
+++ b/Source/WebKit2/PluginProcess/WebProcessConnection.cpp
@@ -30,7 +30,6 @@
#include "ActivityAssertion.h"
#include "ArgumentCoders.h"
-#include "ConnectionStack.h"
#include "NPObjectMessageReceiverMessages.h"
#include "NPRemoteObjectMap.h"
#include "PluginControllerProxy.h"
@@ -40,15 +39,17 @@
#include "PluginProxyMessages.h"
#include "WebProcessConnectionMessages.h"
#include <unistd.h>
-#include <wtf/RunLoop.h>
+#include <wtf/SetForScope.h>
using namespace WebCore;
namespace WebKit {
-PassRefPtr<WebProcessConnection> WebProcessConnection::create(IPC::Connection::Identifier connectionIdentifier)
+static IPC::Connection* currentConnection;
+
+RefPtr<WebProcessConnection> WebProcessConnection::create(IPC::Connection::Identifier connectionIdentifier)
{
- return adoptRef(new WebProcessConnection(connectionIdentifier));
+ return adoptRef(*new WebProcessConnection(connectionIdentifier));
}
WebProcessConnection::~WebProcessConnection()
@@ -60,7 +61,7 @@ WebProcessConnection::~WebProcessConnection()
WebProcessConnection::WebProcessConnection(IPC::Connection::Identifier connectionIdentifier)
{
- m_connection = IPC::Connection::createServerConnection(connectionIdentifier, this, RunLoop::main());
+ m_connection = IPC::Connection::createServerConnection(connectionIdentifier, *this);
m_npRemoteObjectMap = NPRemoteObjectMap::create(m_connection.get());
m_connection->setOnlySendMessagesAsDispatchWhenWaitingForSyncReplyWhenProcessingSuchAMessage(true);
@@ -72,7 +73,7 @@ void WebProcessConnection::addPluginControllerProxy(std::unique_ptr<PluginContro
uint64_t pluginInstanceID = pluginController->pluginInstanceID();
ASSERT(!m_pluginControllers.contains(pluginInstanceID));
- m_pluginControllers.set(pluginInstanceID, std::move(pluginController));
+ m_pluginControllers.set(pluginInstanceID, WTFMove(pluginController));
}
void WebProcessConnection::destroyPluginControllerProxy(PluginControllerProxy* pluginController)
@@ -84,10 +85,11 @@ void WebProcessConnection::destroyPluginControllerProxy(PluginControllerProxy* p
void WebProcessConnection::removePluginControllerProxy(PluginControllerProxy* pluginController, Plugin* plugin)
{
+ unsigned pluginInstanceID = pluginController->pluginInstanceID();
{
- ASSERT(m_pluginControllers.contains(pluginController->pluginInstanceID()));
+ ASSERT(m_pluginControllers.contains(pluginInstanceID));
- std::unique_ptr<PluginControllerProxy> pluginControllerUniquePtr = m_pluginControllers.take(pluginController->pluginInstanceID());
+ std::unique_ptr<PluginControllerProxy> pluginControllerUniquePtr = m_pluginControllers.take(pluginInstanceID);
ASSERT(pluginControllerUniquePtr.get() == pluginController);
}
@@ -105,21 +107,20 @@ void WebProcessConnection::removePluginControllerProxy(PluginControllerProxy* pl
m_connection = nullptr;
// This will cause us to be deleted.
- PluginProcess::shared().removeWebProcessConnection(this);
+ PluginProcess::singleton().removeWebProcessConnection(this);
}
void WebProcessConnection::setGlobalException(const String& exceptionString)
{
- IPC::Connection* connection = ConnectionStack::shared().current();
- if (!connection)
+ if (!currentConnection)
return;
- connection->sendSync(Messages::PluginProcessConnection::SetException(exceptionString), Messages::PluginProcessConnection::SetException::Reply(), 0);
+ currentConnection->sendSync(Messages::PluginProcessConnection::SetException(exceptionString), Messages::PluginProcessConnection::SetException::Reply(), 0);
}
-void WebProcessConnection::didReceiveMessage(IPC::Connection* connection, IPC::MessageDecoder& decoder)
+void WebProcessConnection::didReceiveMessage(IPC::Connection& connection, IPC::Decoder& decoder)
{
- ConnectionStack::CurrentConnectionPusher currentConnection(ConnectionStack::shared(), connection);
+ SetForScope<IPC::Connection*> currentConnectionChange(currentConnection, &connection);
if (decoder.messageReceiverName() == Messages::WebProcessConnection::messageReceiverName()) {
didReceiveWebProcessConnectionMessage(connection, decoder);
@@ -139,12 +140,9 @@ void WebProcessConnection::didReceiveMessage(IPC::Connection* connection, IPC::M
pluginControllerProxy->didReceivePluginControllerProxyMessage(connection, decoder);
}
-void WebProcessConnection::didReceiveSyncMessage(IPC::Connection* connection, IPC::MessageDecoder& decoder, std::unique_ptr<IPC::MessageEncoder>& replyEncoder)
+void WebProcessConnection::didReceiveSyncMessage(IPC::Connection& connection, IPC::Decoder& decoder, std::unique_ptr<IPC::Encoder>& replyEncoder)
{
- // Force all timers to run at full speed when processing a synchronous message
- ActivityAssertion activityAssertion(PluginProcess::shared());
-
- ConnectionStack::CurrentConnectionPusher currentConnection(ConnectionStack::shared(), connection);
+ SetForScope<IPC::Connection*> currentConnectionChange(currentConnection, &connection);
uint64_t destinationID = decoder.destinationID();
@@ -166,7 +164,7 @@ void WebProcessConnection::didReceiveSyncMessage(IPC::Connection* connection, IP
pluginControllerProxy->didReceiveSyncPluginControllerProxyMessage(connection, decoder, replyEncoder);
}
-void WebProcessConnection::didClose(IPC::Connection*)
+void WebProcessConnection::didClose(IPC::Connection&)
{
// The web process crashed. Destroy all the plug-in controllers. Destroying the last plug-in controller
// will cause the web process connection itself to be destroyed.
@@ -178,10 +176,14 @@ void WebProcessConnection::didClose(IPC::Connection*)
destroyPluginControllerProxy(pluginControllers[i]);
}
-void WebProcessConnection::destroyPlugin(uint64_t pluginInstanceID, bool asynchronousCreationIncomplete)
+void WebProcessConnection::destroyPlugin(uint64_t pluginInstanceID, bool asynchronousCreationIncomplete, PassRefPtr<Messages::WebProcessConnection::DestroyPlugin::DelayedReply> reply)
{
+ // We return immediately from this synchronous IPC. We want to make sure the plugin destruction is just about to start so audio playback
+ // will finish soon after returning. However we don't want to wait for destruction to complete fully as that may take a while.
+ reply->send();
+
// Ensure we don't clamp any timers during destruction
- ActivityAssertion activityAssertion(PluginProcess::shared());
+ ActivityAssertion activityAssertion(PluginProcess::singleton().connectionActivity());
PluginControllerProxy* pluginControllerProxy = m_pluginControllers.get(pluginInstanceID);
@@ -198,7 +200,7 @@ void WebProcessConnection::destroyPlugin(uint64_t pluginInstanceID, bool asynchr
destroyPluginControllerProxy(pluginControllerProxy);
}
-void WebProcessConnection::didReceiveInvalidMessage(IPC::Connection*, IPC::StringReference, IPC::StringReference)
+void WebProcessConnection::didReceiveInvalidMessage(IPC::Connection&, IPC::StringReference, IPC::StringReference)
{
// FIXME: Implement.
}
@@ -211,7 +213,7 @@ void WebProcessConnection::createPluginInternal(const PluginCreationParameters&
// Make sure to add the proxy to the map before initializing it, since the plug-in might call out to the web process from
// its NPP_New function. This will hand over ownership of the proxy to the web process connection.
- addPluginControllerProxy(std::move(pluginControllerProxy));
+ addPluginControllerProxy(WTFMove(pluginControllerProxy));
// Now try to initialize the plug-in.
result = pluginControllerProxyPtr->initialize(creationParameters);
@@ -220,7 +222,7 @@ void WebProcessConnection::createPluginInternal(const PluginCreationParameters&
return;
wantsWheelEvents = pluginControllerProxyPtr->wantsWheelEvents();
-#if PLATFORM(MAC)
+#if PLATFORM(COCOA)
remoteLayerClientID = pluginControllerProxyPtr->remoteLayerClientID();
#else
UNUSED_PARAM(remoteLayerClientID);
@@ -230,7 +232,7 @@ void WebProcessConnection::createPluginInternal(const PluginCreationParameters&
void WebProcessConnection::createPlugin(const PluginCreationParameters& creationParameters, PassRefPtr<Messages::WebProcessConnection::CreatePlugin::DelayedReply> reply)
{
// Ensure we don't clamp any timers during initialization
- ActivityAssertion activityAssertion(PluginProcess::shared());
+ ActivityAssertion activityAssertion(PluginProcess::singleton().connectionActivity());
PluginControllerProxy* pluginControllerProxy = m_pluginControllers.get(creationParameters.pluginInstanceID);
@@ -243,7 +245,7 @@ void WebProcessConnection::createPlugin(const PluginCreationParameters& creation
}
// If its initialization is complete then we need to respond to this message with the correct information about its creation.
-#if PLATFORM(MAC)
+#if PLATFORM(COCOA)
reply->send(true, pluginControllerProxy->wantsWheelEvents(), pluginControllerProxy->remoteLayerClientID());
#else
reply->send(true, pluginControllerProxy->wantsWheelEvents(), 0);
@@ -319,7 +321,7 @@ void WebProcessConnection::createPluginAsynchronously(const PluginCreationParame
m_connection->sendSync(Messages::PluginProxy::DidCreatePlugin(wantsWheelEvents, remoteLayerClientID), Messages::PluginProxy::DidCreatePlugin::Reply(), creationParameters.pluginInstanceID);
}
-
+
} // namespace WebKit
#endif // ENABLE(NETSCAPE_PLUGIN_API)
diff --git a/Source/WebKit2/PluginProcess/WebProcessConnection.h b/Source/WebKit2/PluginProcess/WebProcessConnection.h
index f7b92c6e4..3f7c90379 100644
--- a/Source/WebKit2/PluginProcess/WebProcessConnection.h
+++ b/Source/WebKit2/PluginProcess/WebProcessConnection.h
@@ -44,7 +44,7 @@ struct PluginCreationParameters;
class WebProcessConnection : public RefCounted<WebProcessConnection>, IPC::Connection::Client {
public:
- static PassRefPtr<WebProcessConnection> create(IPC::Connection::Identifier);
+ static RefPtr<WebProcessConnection> create(IPC::Connection::Identifier);
virtual ~WebProcessConnection();
IPC::Connection* connection() const { return m_connection.get(); }
@@ -53,7 +53,7 @@ public:
void removePluginControllerProxy(PluginControllerProxy*, Plugin*);
static void setGlobalException(const String&);
-
+
private:
WebProcessConnection(IPC::Connection::Identifier);
@@ -62,17 +62,17 @@ private:
void destroyPluginControllerProxy(PluginControllerProxy*);
// IPC::Connection::Client
- virtual void didReceiveMessage(IPC::Connection*, IPC::MessageDecoder&) override;
- virtual void didReceiveSyncMessage(IPC::Connection*, IPC::MessageDecoder&, std::unique_ptr<IPC::MessageEncoder>&) override;
- virtual void didClose(IPC::Connection*);
- virtual void didReceiveInvalidMessage(IPC::Connection*, IPC::StringReference messageReceiverName, IPC::StringReference messageName);
+ void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
+ void didReceiveSyncMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&) override;
+ void didClose(IPC::Connection&) override;
+ void didReceiveInvalidMessage(IPC::Connection&, IPC::StringReference messageReceiverName, IPC::StringReference messageName) override;
// Message handlers.
- void didReceiveWebProcessConnectionMessage(IPC::Connection*, IPC::MessageDecoder&);
- void didReceiveSyncWebProcessConnectionMessage(IPC::Connection*, IPC::MessageDecoder&, std::unique_ptr<IPC::MessageEncoder>&);
+ void didReceiveWebProcessConnectionMessage(IPC::Connection&, IPC::Decoder&);
+ void didReceiveSyncWebProcessConnectionMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&);
void createPlugin(const PluginCreationParameters&, PassRefPtr<Messages::WebProcessConnection::CreatePlugin::DelayedReply>);
void createPluginAsynchronously(const PluginCreationParameters&);
- void destroyPlugin(uint64_t pluginInstanceID, bool asynchronousCreationIncomplete);
+ void destroyPlugin(uint64_t pluginInstanceID, bool asynchronousCreationIncomplete, PassRefPtr<Messages::WebProcessConnection::DestroyPlugin::DelayedReply>);
void createPluginInternal(const PluginCreationParameters&, bool& result, bool& wantsWheelEvents, uint32_t& remoteLayerClientID);
diff --git a/Source/WebKit2/PluginProcess/WebProcessConnection.messages.in b/Source/WebKit2/PluginProcess/WebProcessConnection.messages.in
index 985b2a596..ece24e844 100644
--- a/Source/WebKit2/PluginProcess/WebProcessConnection.messages.in
+++ b/Source/WebKit2/PluginProcess/WebProcessConnection.messages.in
@@ -24,13 +24,13 @@
messages -> WebProcessConnection LegacyReceiver {
# Creates a plug-in instance using the given creation parameters.
- CreatePlugin(WebKit::PluginCreationParameters pluginCreationParameters) -> (bool creationResult, bool wantsWheelEvents, uint32_t remoteLayerClientID) Delayed
+ CreatePlugin(struct WebKit::PluginCreationParameters pluginCreationParameters) -> (bool creationResult, bool wantsWheelEvents, uint32_t remoteLayerClientID) Delayed
# Creates a plug-in instance asynchronously using the given creation parameters.
- CreatePluginAsynchronously(WebKit::PluginCreationParameters pluginCreationParameters)
+ CreatePluginAsynchronously(struct WebKit::PluginCreationParameters pluginCreationParameters)
# Destroys the plug-in instance with the given instance ID.
- DestroyPlugin(uint64_t pluginInstanceID, bool asynchronousCreationIncomplete) -> ()
+ DestroyPlugin(uint64_t pluginInstanceID, bool asynchronousCreationIncomplete) -> () Delayed
}
#endif
diff --git a/Source/WebKit2/PluginProcess/unix/PluginControllerProxyUnix.cpp b/Source/WebKit2/PluginProcess/unix/PluginControllerProxyUnix.cpp
index cbcc1d730..f567a66b1 100644
--- a/Source/WebKit2/PluginProcess/unix/PluginControllerProxyUnix.cpp
+++ b/Source/WebKit2/PluginProcess/unix/PluginControllerProxyUnix.cpp
@@ -26,7 +26,7 @@
#include "config.h"
#include "PluginControllerProxy.h"
-#if ENABLE(PLUGIN_PROCESS)
+#if ENABLE(NETSCAPE_PLUGIN_API)
#include <WebCore/NotImplemented.h>
@@ -51,4 +51,4 @@ void PluginControllerProxy::platformGeometryDidChange()
} // namespace WebKit
-#endif // ENABLE(PLUGIN_PROCESS)
+#endif // ENABLE(NETSCAPE_PLUGIN_API)
diff --git a/Source/WebKit2/PluginProcess/unix/PluginProcessMainUnix.cpp b/Source/WebKit2/PluginProcess/unix/PluginProcessMainUnix.cpp
index 6a4c26ef2..02a816b27 100644
--- a/Source/WebKit2/PluginProcess/unix/PluginProcessMainUnix.cpp
+++ b/Source/WebKit2/PluginProcess/unix/PluginProcessMainUnix.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011 Igalia S.L.
+ * Copyright (C) 2011, 2014 Igalia S.L.
* Copyright (C) 2011 Apple Inc.
* Copyright (C) 2012 Samsung Electronics
*
@@ -30,96 +30,67 @@
#if ENABLE(PLUGIN_PROCESS)
+#include "ChildProcessMain.h"
#include "Logging.h"
#include "NetscapePlugin.h"
#include "PluginProcess.h"
-#include "WebKit2Initialize.h"
-#include <libgen.h>
-#include <wtf/RunLoop.h>
+#include <WebCore/FileSystem.h>
+#include <stdlib.h>
+
#if PLATFORM(GTK)
#include <gtk/gtk.h>
-#if PLATFORM(X11) && defined(GDK_WINDOWING_X11)
-#include <gdk/gdkx.h>
-#endif
-#elif PLATFORM(EFL) && HAVE_ECORE_X
-#include <Ecore_X.h>
#endif
-using namespace WebCore;
+#if defined(XP_UNIX)
+#include <WebCore/PlatformDisplayX11.h>
+#include <WebCore/XErrorTrapper.h>
+#endif
namespace WebKit {
-#ifdef XP_UNIX
-
-#if !LOG_DISABLED
-static const char xErrorString[] = "The program '%s' received an X Window System error.\n"
- "This probably reflects a bug in a browser plugin.\n"
- "The error was '%s'.\n"
- " (Details: serial %ld error_code %d request_code %d minor_code %d)\n";
-#endif /* !LOG_DISABLED */
-
-static char* programName = 0;
-
-static int webkitXError(Display* xdisplay, XErrorEvent* error)
-{
- char errorMessage[64];
- XGetErrorText(xdisplay, error->error_code, errorMessage, 63);
-
- LOG(Plugins, xErrorString,
- programName, errorMessage,
- error->serial, error->error_code,
- error->request_code, error->minor_code);
-
- return 0;
-}
-#endif
-
-WK_EXPORT int PluginProcessMainUnix(int argc, char* argv[])
-{
-#if PLUGIN_ARCHITECTURE(X11)
- bool scanPlugin = !strcmp(argv[1], "-scanPlugin");
-#endif
- ASSERT_UNUSED(argc, argc == 3);
+#if defined(XP_UNIX)
+static std::unique_ptr<WebCore::XErrorTrapper> xErrorTrapper;
+#endif // XP_UNIX
+class PluginProcessMain final: public ChildProcessMainBase {
+public:
+ bool platformInitialize() override
+ {
#if PLATFORM(GTK)
- gtk_init(&argc, &argv);
-#elif PLATFORM(EFL)
-#ifdef HAVE_ECORE_X
- if (!ecore_x_init(0))
-#endif
- return 1;
+ gtk_init(nullptr, nullptr);
#endif
- InitializeWebKit2();
+ return true;
+ }
+
+ bool parseCommandLine(int argc, char** argv) override
+ {
+ ASSERT(argc == 3);
+ if (argc != 3)
+ return false;
+ if (!strcmp(argv[1], "-scanPlugin"))
#if PLUGIN_ARCHITECTURE(X11)
- if (scanPlugin) {
- String pluginPath(argv[2]);
- if (!NetscapePluginModule::scanPlugin(pluginPath))
- return EXIT_FAILURE;
- return EXIT_SUCCESS;
- }
+ exit(NetscapePluginModule::scanPlugin(argv[2]) ? EXIT_SUCCESS : EXIT_FAILURE);
+#else
+ exit(EXIT_FAILURE);
#endif
- // Plugins can produce X errors that are handled by the GDK X error handler, which
- // exits the process. Since we don't want to crash due to plugin bugs, we install a
- // custom error handler to show a warning when a X error happens without aborting.
#if defined(XP_UNIX)
- programName = basename(argv[0]);
- XSetErrorHandler(webkitXError);
+ if (WebCore::PlatformDisplay::sharedDisplay().type() == WebCore::PlatformDisplay::Type::X11) {
+ auto* display = downcast<WebCore::PlatformDisplayX11>(WebCore::PlatformDisplay::sharedDisplay()).native();
+ xErrorTrapper = std::make_unique<WebCore::XErrorTrapper>(display, WebCore::XErrorTrapper::Policy::Warn);
+ }
#endif
- int socket = atoi(argv[1]);
-
- WebKit::ChildProcessInitializationParameters parameters;
- parameters.connectionIdentifier = socket;
- parameters.extraInitializationData.add("plugin-path", argv[2]);
-
- WebKit::PluginProcess::shared().initialize(parameters);
-
- RunLoop::run();
+ m_parameters.extraInitializationData.add("plugin-path", argv[2]);
+ return ChildProcessMainBase::parseCommandLine(argc, argv);
+ }
+};
- return 0;
+int PluginProcessMainUnix(int argc, char** argv)
+{
+ return ChildProcessMain<PluginProcess, PluginProcessMain>(argc, argv);
}
} // namespace WebKit
diff --git a/Source/WebKit2/PluginProcess/unix/PluginProcessMainUnix.h b/Source/WebKit2/PluginProcess/unix/PluginProcessMainUnix.h
index 540c596aa..f79c1d26c 100644
--- a/Source/WebKit2/PluginProcess/unix/PluginProcessMainUnix.h
+++ b/Source/WebKit2/PluginProcess/unix/PluginProcessMainUnix.h
@@ -27,16 +27,14 @@
#ifndef PluginProcessMainUnix_h
#define PluginProcessMainUnix_h
-#include <WebKit2/WKBase.h>
+#include <WebKit/WKBase.h>
namespace WebKit {
-#ifdef __cplusplus
extern "C" {
-WK_EXPORT int PluginProcessMainUnix(int argc, char* argv[]);
-} // extern "C"
-#endif // __cplusplus
+WK_EXPORT int PluginProcessMainUnix(int argc, char** argv);
+}
} // namespace WebKit
-#endif // PluginProcessMain_h
+#endif // PluginProcessMainUnix_h
diff --git a/Source/WebKit2/PluginProcess/unix/PluginProcessUnix.cpp b/Source/WebKit2/PluginProcess/unix/PluginProcessUnix.cpp
index 43eb8848b..c6eb49df4 100644
--- a/Source/WebKit2/PluginProcess/unix/PluginProcessUnix.cpp
+++ b/Source/WebKit2/PluginProcess/unix/PluginProcessUnix.cpp
@@ -37,7 +37,7 @@ void PluginProcess::platformInitializeProcess(const ChildProcessInitializationPa
{
}
-void PluginProcess::platformInitializePluginProcess(const PluginProcessCreationParameters&)
+void PluginProcess::platformInitializePluginProcess(PluginProcessCreationParameters&&)
{
notImplemented();
}