diff options
Diffstat (limited to 'Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.cpp')
-rw-r--r-- | Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.cpp | 80 |
1 files changed, 77 insertions, 3 deletions
diff --git a/Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.cpp b/Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.cpp index 4b3b3c0..c63d500 100644 --- a/Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.cpp +++ b/Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.cpp @@ -34,9 +34,20 @@ #include "PluginProcessMessages.h" #include "RunLoop.h" #include "WebCoreArgumentCoders.h" +#include "WebPluginSiteDataManager.h" #include "WebProcessProxy.h" namespace WebKit { + +#if PLATFORM(MAC) +static bool pluginNeedsExecutableHeap(const PluginInfoStore::Plugin& pluginInfo) +{ + if (pluginInfo.bundleIdentifier == "com.apple.QuickTime Plugin.plugin") + return false; + + return true; +} +#endif PassOwnPtr<PluginProcessProxy> PluginProcessProxy::create(PluginProcessManager* PluginProcessManager, const PluginInfoStore::Plugin& pluginInfo) { @@ -52,9 +63,7 @@ PluginProcessProxy::PluginProcessProxy(PluginProcessManager* PluginProcessManage launchOptions.processType = ProcessLauncher::PluginProcess; #if PLATFORM(MAC) launchOptions.architecture = pluginInfo.pluginArchitecture; - - // FIXME: This shouldn't be true for all plug-ins. - launchOptions.executableHeap = true; + launchOptions.executableHeap = pluginNeedsExecutableHeap(pluginInfo); #endif m_processLauncher = ProcessLauncher::create(this, launchOptions); @@ -80,6 +89,39 @@ void PluginProcessProxy::createWebProcessConnection(WebProcessProxy* webProcessP m_connection->send(Messages::PluginProcess::CreateWebProcessConnection(), 0, CoreIPC::DispatchMessageEvenWhenWaitingForSyncReply); } +void PluginProcessProxy::getSitesWithData(WebPluginSiteDataManager* webPluginSiteDataManager, uint64_t callbackID) +{ + ASSERT(!m_pendingGetSitesReplies.contains(callbackID)); + m_pendingGetSitesReplies.set(callbackID, webPluginSiteDataManager); + + if (m_processLauncher->isLaunching()) { + m_pendingGetSitesRequests.append(callbackID); + return; + } + + // Ask the plug-in process for the sites with data. + m_connection->send(Messages::PluginProcess::GetSitesWithData(callbackID), 0); +} + +void PluginProcessProxy::clearSiteData(WebPluginSiteDataManager* webPluginSiteDataManager, const Vector<String>& sites, uint64_t flags, uint64_t maxAgeInSeconds, uint64_t callbackID) +{ + ASSERT(!m_pendingClearSiteDataReplies.contains(callbackID)); + m_pendingClearSiteDataReplies.set(callbackID, webPluginSiteDataManager); + + if (m_processLauncher->isLaunching()) { + ClearSiteDataRequest request; + request.sites = sites; + request.flags = flags; + request.maxAgeInSeconds = maxAgeInSeconds; + request.callbackID = callbackID; + m_pendingClearSiteDataRequests.append(request); + return; + } + + // Ask the plug-in process to clear the site data. + m_connection->send(Messages::PluginProcess::ClearSiteData(sites, flags, maxAgeInSeconds, callbackID), 0); +} + void PluginProcessProxy::pluginProcessCrashedOrFailedToLaunch() { // The plug-in process must have crashed or exited, send any pending sync replies we might have. @@ -93,6 +135,12 @@ void PluginProcessProxy::pluginProcessCrashedOrFailedToLaunch() replyWebProcessProxy->connection()->sendSyncReply(reply); } + while (!m_pendingGetSitesReplies.isEmpty()) + didGetSitesWithData(Vector<String>(), m_pendingGetSitesReplies.begin()->first); + + while (!m_pendingClearSiteDataReplies.isEmpty()) + didClearSiteData(m_pendingClearSiteDataReplies.begin()->first); + // Tell the plug-in process manager to forget about this plug-in process proxy. m_pluginProcessManager->removePluginProcessProxy(this); delete this; @@ -134,6 +182,16 @@ void PluginProcessProxy::didFinishLaunching(ProcessLauncher*, CoreIPC::Connectio m_connection->send(Messages::PluginProcess::InitializePluginProcess(parameters), 0); // Send all our pending requests. + for (size_t i = 0; i < m_pendingGetSitesRequests.size(); ++i) + m_connection->send(Messages::PluginProcess::GetSitesWithData(m_pendingGetSitesRequests[i]), 0); + m_pendingGetSitesRequests.clear(); + + for (size_t i = 0; i < m_pendingClearSiteDataRequests.size(); ++i) { + const ClearSiteDataRequest& request = m_pendingClearSiteDataRequests[i]; + m_connection->send(Messages::PluginProcess::ClearSiteData(request.sites, request.flags, request.maxAgeInSeconds, request.callbackID), 0); + } + m_pendingClearSiteDataRequests.clear(); + for (unsigned i = 0; i < m_numPendingConnectionRequests; ++i) m_connection->send(Messages::PluginProcess::CreateWebProcessConnection(), 0); @@ -154,6 +212,22 @@ void PluginProcessProxy::didCreateWebProcessConnection(const CoreIPC::MachPort& replyWebProcessProxy->connection()->sendSyncReply(reply); } +void PluginProcessProxy::didGetSitesWithData(const Vector<String>& sites, uint64_t callbackID) +{ + RefPtr<WebPluginSiteDataManager> webPluginSiteDataManager = m_pendingGetSitesReplies.take(callbackID); + ASSERT(webPluginSiteDataManager); + + webPluginSiteDataManager->didGetSitesWithDataForSinglePlugin(sites, callbackID); +} + +void PluginProcessProxy::didClearSiteData(uint64_t callbackID) +{ + RefPtr<WebPluginSiteDataManager> webPluginSiteDataManager = m_pendingClearSiteDataReplies.take(callbackID); + ASSERT(webPluginSiteDataManager); + + webPluginSiteDataManager->didClearSiteDataForSinglePlugin(callbackID); +} + } // namespace WebKit #endif // ENABLE(PLUGIN_PROCESS) |