summaryrefslogtreecommitdiffstats
path: root/Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.cpp')
-rw-r--r--Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.cpp80
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)