Diff
Modified: trunk/Source/WebKit2/ChangeLog (142338 => 142339)
--- trunk/Source/WebKit2/ChangeLog 2013-02-09 02:20:48 UTC (rev 142338)
+++ trunk/Source/WebKit2/ChangeLog 2013-02-09 02:34:13 UTC (rev 142339)
@@ -1,3 +1,34 @@
+2013-02-08 Anders Carlsson <[email protected]>
+
+ Move plug-in enumeration back to the main thread
+ https://bugs.webkit.org/show_bug.cgi?id=109337
+ <rdar://problem/12015046>
+
+ Reviewed by Andreas Kling.
+
+ Plug-in enumeration was moved to a separate work queue to improve responsiveness, but
+ doing so lead to crashes when WebKit1 would enumerate plug-ins on the main thread at the same time.
+ Bug <rdar://problem/13185819> tracks fixing the responsiveness issue by spawning a plug-in process
+ and have it do the enumeration.
+
+ * Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm:
+ (WebKit::getPluginInfoFromCarbonResources):
+ * UIProcess/WebProcessProxy.cpp:
+ (WebKit::WebProcessProxy::connectionWillOpen):
+ (WebKit::WebProcessProxy::connectionWillClose):
+ (WebKit::WebProcessProxy::getPlugins):
+ * UIProcess/WebProcessProxy.h:
+ (WebCore):
+ (WebProcessProxy):
+ * UIProcess/WebProcessProxy.messages.in:
+ * WebProcess/WebCoreSupport/WebPlatformStrategies.cpp:
+ (WebKit):
+ (WebKit::WebPlatformStrategies::populatePluginCache):
+ * WebProcess/WebProcess.cpp:
+ * WebProcess/WebProcess.h:
+ (WebProcess):
+ * WebProcess/WebProcess.messages.in:
+
2013-02-08 Dean Jackson <[email protected]>
Snapshotted plug-in should use shadow root
Modified: trunk/Source/WebKit2/Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm (142338 => 142339)
--- trunk/Source/WebKit2/Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm 2013-02-09 02:20:48 UTC (rev 142338)
+++ trunk/Source/WebKit2/Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm 2013-02-09 02:34:13 UTC (rev 142339)
@@ -296,7 +296,7 @@
static const ResID MIMEDescriptionStringNumber = 127;
static const ResID MIMEListStringStringNumber = 128;
-static bool getPluginInfoFromCarbonResourcesOnMainThread(CFBundleRef bundle, PluginModuleInfo& plugin)
+static bool getPluginInfoFromCarbonResources(CFBundleRef bundle, PluginModuleInfo& plugin)
{
ASSERT(isMainThread());
@@ -352,18 +352,6 @@
return true;
}
-static bool getPluginInfoFromCarbonResources(CFBundleRef bundle, PluginModuleInfo& plugin)
-{
- if (isMainThread())
- return getPluginInfoFromCarbonResourcesOnMainThread(bundle, const_cast<PluginModuleInfo&>(plugin));
-
- __block bool gotPluginInfo = false;
- dispatch_sync(dispatch_get_main_queue(), ^{
- gotPluginInfo = getPluginInfoFromCarbonResourcesOnMainThread(bundle, const_cast<PluginModuleInfo&>(plugin));
- });
- return gotPluginInfo;
-}
-
bool NetscapePluginModule::getPluginInfo(const String& pluginPath, PluginModuleInfo& plugin)
{
RetainPtr<CFURLRef> bundleURL = adoptCF(CFURLCreateWithFileSystemPath(kCFAllocatorDefault, pluginPath.createCFString().get(), kCFURLPOSIXPathStyle, false));
Modified: trunk/Source/WebKit2/UIProcess/WebProcessProxy.cpp (142338 => 142339)
--- trunk/Source/WebKit2/UIProcess/WebProcessProxy.cpp 2013-02-09 02:20:48 UTC (rev 142338)
+++ trunk/Source/WebKit2/UIProcess/WebProcessProxy.cpp 2013-02-09 02:34:13 UTC (rev 142339)
@@ -88,14 +88,6 @@
return pageMap;
}
-#if ENABLE(NETSCAPE_PLUGIN_API)
-static WorkQueue* pluginWorkQueue()
-{
- static WorkQueue* pluginWorkQueue = WorkQueue::create("com.apple.WebKit.PluginQueue").leakRef();
- return pluginWorkQueue;
-}
-#endif // ENABLE(NETSCAPE_PLUGIN_API)
-
PassRefPtr<WebProcessProxy> WebProcessProxy::create(PassRefPtr<WebContext> context)
{
return adoptRef(new WebProcessProxy(context));
@@ -132,7 +124,6 @@
ASSERT(this->connection() == connection);
m_context->processWillOpenConnection(this);
- connection->addQueueClient(this);
}
void WebProcessProxy::connectionWillClose(CoreIPC::Connection* connection)
@@ -140,7 +131,6 @@
ASSERT(this->connection() == connection);
m_context->processWillCloseConnection(this);
- connection->removeQueueClient(this);
}
void WebProcessProxy::disconnect()
@@ -308,49 +298,15 @@
}
#if ENABLE(NETSCAPE_PLUGIN_API)
-void WebProcessProxy::sendDidGetPlugins(uint64_t requestID, PassOwnPtr<Vector<PluginInfo> > pluginInfos)
+void WebProcessProxy::getPlugins(bool refresh, Vector<PluginInfo>& plugins)
{
- ASSERT(isMainThread());
-
- OwnPtr<Vector<PluginInfo> > plugins(pluginInfos);
-
-#if PLATFORM(MAC)
- // Add built-in PDF last, so that it's not used when a real plug-in is installed.
- // NOTE: This has to be done on the main thread as it calls localizedString().
- if (!m_context->omitPDFSupport()) {
-#if ENABLE(PDFKIT_PLUGIN)
- plugins->append(PDFPlugin::pluginInfo());
-#endif
- plugins->append(SimplePDFPlugin::pluginInfo());
- }
-#endif
-
- send(Messages::WebProcess::DidGetPlugins(requestID, *plugins), 0);
-}
-
-void WebProcessProxy::handleGetPlugins(uint64_t requestID, bool refresh)
-{
if (refresh)
m_context->pluginInfoStore().refresh();
- OwnPtr<Vector<PluginInfo> > pluginInfos = adoptPtr(new Vector<PluginInfo>);
-
- {
- Vector<PluginModuleInfo> plugins = m_context->pluginInfoStore().plugins();
- for (size_t i = 0; i < plugins.size(); ++i)
- pluginInfos->append(plugins[i].info);
- }
-
- // NOTE: We have to pass the PluginInfo vector to the secondary thread via a pointer as otherwise
- // we'd end up with a deref() race on all the WTF::Strings it contains.
- RunLoop::main()->dispatch(bind(&WebProcessProxy::sendDidGetPlugins, this, requestID, pluginInfos.release()));
+ Vector<PluginModuleInfo> pluginModules = m_context->pluginInfoStore().plugins();
+ for (size_t i = 0; i < pluginModules.size(); ++i)
+ plugins.append(pluginModules[i].info);
}
-
-void WebProcessProxy::getPlugins(CoreIPC::Connection*, uint64_t requestID, bool refresh)
-{
- pluginWorkQueue()->dispatch(bind(&WebProcessProxy::handleGetPlugins, this, requestID, refresh));
-}
-
#endif // ENABLE(NETSCAPE_PLUGIN_API)
#if ENABLE(PLUGIN_PROCESS)
@@ -420,18 +376,6 @@
// FIXME: Add unhandled message logging.
}
-void WebProcessProxy::didReceiveMessageOnConnectionWorkQueue(CoreIPC::Connection* connection, OwnPtr<CoreIPC::MessageDecoder>& decoder)
-{
- if (decoder->messageReceiverName() == Messages::WebProcessProxy::messageReceiverName()) {
- didReceiveWebProcessProxyMessageOnConnectionWorkQueue(connection, decoder);
- return;
- }
-}
-
-void WebProcessProxy::didCloseOnConnectionWorkQueue(CoreIPC::Connection*)
-{
-}
-
void WebProcessProxy::didClose(CoreIPC::Connection*)
{
// Protect ourselves, as the call to disconnect() below may otherwise cause us
Modified: trunk/Source/WebKit2/UIProcess/WebProcessProxy.h (142338 => 142339)
--- trunk/Source/WebKit2/UIProcess/WebProcessProxy.h 2013-02-09 02:20:48 UTC (rev 142338)
+++ trunk/Source/WebKit2/UIProcess/WebProcessProxy.h 2013-02-09 02:34:13 UTC (rev 142339)
@@ -46,7 +46,8 @@
#endif
namespace WebCore {
- class KURL;
+class KURL;
+struct PluginInfo;
};
namespace WebKit {
@@ -57,7 +58,7 @@
class WebPageGroup;
struct WebNavigationDataStore;
-class WebProcessProxy : public ThreadSafeRefCounted<WebProcessProxy>, public ChildProcessProxy, ResponsivenessTimer::Client, CoreIPC::Connection::QueueClient {
+class WebProcessProxy : public ThreadSafeRefCounted<WebProcessProxy>, public ChildProcessProxy, ResponsivenessTimer::Client {
public:
typedef HashMap<uint64_t, RefPtr<WebBackForwardListItem> > WebBackForwardListItemMap;
typedef HashMap<uint64_t, RefPtr<WebFrameProxy> > WebFrameProxyMap;
@@ -135,9 +136,7 @@
// Plugins
#if ENABLE(NETSCAPE_PLUGIN_API)
- void getPlugins(CoreIPC::Connection*, uint64_t requestID, bool refresh);
- void handleGetPlugins(uint64_t requestID, bool refresh);
- void sendDidGetPlugins(uint64_t requestID, PassOwnPtr<Vector<WebCore::PluginInfo> >);
+ void getPlugins(bool refresh, Vector<WebCore::PluginInfo>& plugins);
#endif // ENABLE(NETSCAPE_PLUGIN_API)
#if ENABLE(PLUGIN_PROCESS)
void getPluginProcessConnection(const String& pluginPath, uint32_t processType, PassRefPtr<Messages::WebProcessProxy::GetPluginProcessConnection::DelayedReply>);
@@ -159,10 +158,6 @@
virtual void didClose(CoreIPC::Connection*) OVERRIDE;
virtual void didReceiveInvalidMessage(CoreIPC::Connection*, CoreIPC::StringReference messageReceiverName, CoreIPC::StringReference messageName) OVERRIDE;
- // CoreIPC::Connection::QueueClient
- virtual void didReceiveMessageOnConnectionWorkQueue(CoreIPC::Connection*, OwnPtr<CoreIPC::MessageDecoder>&) OVERRIDE;
- virtual void didCloseOnConnectionWorkQueue(CoreIPC::Connection*) OVERRIDE;
-
// ResponsivenessTimer::Client
void didBecomeUnresponsive(ResponsivenessTimer*) OVERRIDE;
void interactionOccurredWhileUnresponsive(ResponsivenessTimer*) OVERRIDE;
@@ -180,7 +175,6 @@
// Implemented in generated WebProcessProxyMessageReceiver.cpp
void didReceiveWebProcessProxyMessage(CoreIPC::Connection*, CoreIPC::MessageDecoder&);
void didReceiveSyncWebProcessProxyMessage(CoreIPC::Connection*, CoreIPC::MessageDecoder&, OwnPtr<CoreIPC::MessageEncoder>&);
- void didReceiveWebProcessProxyMessageOnConnectionWorkQueue(CoreIPC::Connection*, OwnPtr<CoreIPC::MessageDecoder>&);
ResponsivenessTimer m_responsivenessTimer;
Modified: trunk/Source/WebKit2/UIProcess/WebProcessProxy.messages.in (142338 => 142339)
--- trunk/Source/WebKit2/UIProcess/WebProcessProxy.messages.in 2013-02-09 02:20:48 UTC (rev 142338)
+++ trunk/Source/WebKit2/UIProcess/WebProcessProxy.messages.in 2013-02-09 02:34:13 UTC (rev 142339)
@@ -35,7 +35,7 @@
# Plugin messages.
#if ENABLE(NETSCAPE_PLUGIN_API)
- GetPlugins(uint64_t requestID, bool refresh) DispatchOnConnectionQueue
+ GetPlugins(bool refresh) -> (Vector<WebCore::PluginInfo> plugins)
#endif // ENABLE(NETSCAPE_PLUGIN_API)
#if ENABLE(PLUGIN_PROCESS)
GetPluginProcessConnection(WTF::String pluginPath, uint32_t processType) -> (CoreIPC::Attachment connectionHandle, bool supportsAsynchronousInitialization) Delayed
Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebPlatformStrategies.cpp (142338 => 142339)
--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebPlatformStrategies.cpp 2013-02-09 02:20:48 UTC (rev 142338)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebPlatformStrategies.cpp 2013-02-09 02:34:13 UTC (rev 142339)
@@ -271,23 +271,6 @@
}
#if ENABLE(NETSCAPE_PLUGIN_API)
-static BlockingResponseMap<Vector<WebCore::PluginInfo> >& responseMap()
-{
- AtomicallyInitializedStatic(BlockingResponseMap<Vector<WebCore::PluginInfo> >&, responseMap = *new BlockingResponseMap<Vector<WebCore::PluginInfo> >);
- return responseMap;
-}
-
-void handleDidGetPlugins(uint64_t requestID, const Vector<WebCore::PluginInfo>& plugins)
-{
- responseMap().didReceiveResponse(requestID, adoptPtr(new Vector<WebCore::PluginInfo>(plugins)));
-}
-
-static uint64_t generateRequestID()
-{
- static int uniqueID;
- return atomicIncrement(&uniqueID);
-}
-
void WebPlatformStrategies::populatePluginCache()
{
if (m_pluginCacheIsPopulated)
@@ -296,11 +279,9 @@
ASSERT(m_cachedPlugins.isEmpty());
// FIXME: Should we do something in case of error here?
- uint64_t requestID = generateRequestID();
- WebProcess::shared().connection()->send(Messages::WebProcessProxy::GetPlugins(requestID, m_shouldRefreshPlugins), 0);
+ if (!WebProcess::shared().connection()->sendSync(Messages::WebProcessProxy::GetPlugins(m_shouldRefreshPlugins), Messages::WebProcessProxy::GetPlugins::Reply(m_cachedPlugins), 0))
+ return;
- m_cachedPlugins = *responseMap().waitForResponse(requestID);
-
m_shouldRefreshPlugins = false;
m_pluginCacheIsPopulated = true;
}
Modified: trunk/Source/WebKit2/WebProcess/WebProcess.cpp (142338 => 142339)
--- trunk/Source/WebKit2/WebProcess/WebProcess.cpp 2013-02-09 02:20:48 UTC (rev 142338)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.cpp 2013-02-09 02:34:13 UTC (rev 142339)
@@ -1050,16 +1050,6 @@
}
}
-#if ENABLE(NETSCAPE_PLUGIN_API)
-void WebProcess::didGetPlugins(CoreIPC::Connection*, uint64_t requestID, const Vector<WebCore::PluginInfo>& plugins)
-{
-#if USE(PLATFORM_STRATEGIES)
- // Pass this to WebPlatformStrategies.cpp.
- handleDidGetPlugins(requestID, plugins);
-#endif
-}
-#endif // ENABLE(PLUGIN_PROCESS)
-
#if !PLATFORM(MAC)
void WebProcess::initializeProcessName(const ChildProcessInitializationParameters&)
{
Modified: trunk/Source/WebKit2/WebProcess/WebProcess.h (142338 => 142339)
--- trunk/Source/WebKit2/WebProcess/WebProcess.h 2013-02-09 02:20:48 UTC (rev 142338)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.h 2013-02-09 02:34:13 UTC (rev 142339)
@@ -279,10 +279,6 @@
void didReceiveWebProcessMessage(CoreIPC::Connection*, CoreIPC::MessageDecoder&);
void didReceiveWebProcessMessageOnConnectionWorkQueue(CoreIPC::Connection*, OwnPtr<CoreIPC::MessageDecoder>&);
-#if ENABLE(NETSCAPE_PLUGIN_API)
- void didGetPlugins(CoreIPC::Connection*, uint64_t requestID, const Vector<WebCore::PluginInfo>&);
-#endif
-
RefPtr<WebConnectionToUIProcess> m_webConnection;
HashMap<uint64_t, RefPtr<WebPage> > m_pageMap;
Modified: trunk/Source/WebKit2/WebProcess/WebProcess.messages.in (142338 => 142339)
--- trunk/Source/WebKit2/WebProcess/WebProcess.messages.in 2013-02-09 02:20:48 UTC (rev 142338)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.messages.in 2013-02-09 02:34:13 UTC (rev 142339)
@@ -56,9 +56,6 @@
DestroyPrivateBrowsingSession()
# Plug-ins.
-#if ENABLE(NETSCAPE_PLUGIN_API)
- DidGetPlugins(uint64_t requestID, Vector<WebCore::PluginInfo> plugins) DispatchOnConnectionQueue
-#endif
#if ENABLE(NETSCAPE_PLUGIN_API) && !ENABLE(PLUGIN_PROCESS)
GetSitesWithPluginData(Vector<WTF::String> pluginPaths, uint64_t callbackID)
ClearPluginSiteData(Vector<WTF::String> pluginPaths, Vector<WTF::String> sites, uint64_t flags, uint64_t maxAgeInSeconds, uint64_t callbackID)