Title: [142339] trunk/Source/WebKit2
Revision
142339
Author
[email protected]
Date
2013-02-08 18:34:13 -0800 (Fri, 08 Feb 2013)

Log Message

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:

Modified Paths

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)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to