summaryrefslogtreecommitdiff
path: root/Source/WebKit2/PluginProcess/PluginProcess.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebKit2/PluginProcess/PluginProcess.cpp')
-rw-r--r--Source/WebKit2/PluginProcess/PluginProcess.cpp94
1 files changed, 50 insertions, 44 deletions
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&)
{
}