diff options
Diffstat (limited to 'Source/WebKit2/PluginProcess/PluginProcess.cpp')
-rw-r--r-- | Source/WebKit2/PluginProcess/PluginProcess.cpp | 94 |
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&) { } |