Changeset 142339 in webkit


Ignore:
Timestamp:
Feb 8, 2013 6:34:13 PM (11 years ago)
Author:
andersca@apple.com
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:
Location:
trunk/Source/WebKit2
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r142333 r142339  
     12013-02-08  Anders Carlsson  <andersca@apple.com>
     2
     3        Move plug-in enumeration back to the main thread
     4        https://bugs.webkit.org/show_bug.cgi?id=109337
     5        <rdar://problem/12015046>
     6
     7        Reviewed by Andreas Kling.
     8
     9        Plug-in enumeration was moved to a separate work queue to improve responsiveness, but
     10        doing so lead to crashes when WebKit1 would enumerate plug-ins on the main thread at the same time.
     11        Bug <rdar://problem/13185819> tracks fixing the responsiveness issue by spawning a plug-in process
     12        and have it do the enumeration.
     13
     14        * Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm:
     15        (WebKit::getPluginInfoFromCarbonResources):
     16        * UIProcess/WebProcessProxy.cpp:
     17        (WebKit::WebProcessProxy::connectionWillOpen):
     18        (WebKit::WebProcessProxy::connectionWillClose):
     19        (WebKit::WebProcessProxy::getPlugins):
     20        * UIProcess/WebProcessProxy.h:
     21        (WebCore):
     22        (WebProcessProxy):
     23        * UIProcess/WebProcessProxy.messages.in:
     24        * WebProcess/WebCoreSupport/WebPlatformStrategies.cpp:
     25        (WebKit):
     26        (WebKit::WebPlatformStrategies::populatePluginCache):
     27        * WebProcess/WebProcess.cpp:
     28        * WebProcess/WebProcess.h:
     29        (WebProcess):
     30        * WebProcess/WebProcess.messages.in:
     31
    1322013-02-08  Dean Jackson  <dino@apple.com>
    233
  • trunk/Source/WebKit2/Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm

    r142314 r142339  
    297297static const ResID MIMEListStringStringNumber = 128;
    298298
    299 static bool getPluginInfoFromCarbonResourcesOnMainThread(CFBundleRef bundle, PluginModuleInfo& plugin)
     299static bool getPluginInfoFromCarbonResources(CFBundleRef bundle, PluginModuleInfo& plugin)
    300300{
    301301    ASSERT(isMainThread());
     
    351351
    352352    return true;
    353 }
    354 
    355 static bool getPluginInfoFromCarbonResources(CFBundleRef bundle, PluginModuleInfo& plugin)
    356 {
    357     if (isMainThread())
    358         return getPluginInfoFromCarbonResourcesOnMainThread(bundle, const_cast<PluginModuleInfo&>(plugin));
    359 
    360     __block bool gotPluginInfo = false;
    361     dispatch_sync(dispatch_get_main_queue(), ^{
    362         gotPluginInfo = getPluginInfoFromCarbonResourcesOnMainThread(bundle, const_cast<PluginModuleInfo&>(plugin));
    363     });
    364     return gotPluginInfo;
    365353}
    366354
  • trunk/Source/WebKit2/UIProcess/WebProcessProxy.cpp

    r142160 r142339  
    8989}
    9090
    91 #if ENABLE(NETSCAPE_PLUGIN_API)
    92 static WorkQueue* pluginWorkQueue()
    93 {
    94     static WorkQueue* pluginWorkQueue = WorkQueue::create("com.apple.WebKit.PluginQueue").leakRef();
    95     return pluginWorkQueue;
    96 }
    97 #endif // ENABLE(NETSCAPE_PLUGIN_API)
    98 
    9991PassRefPtr<WebProcessProxy> WebProcessProxy::create(PassRefPtr<WebContext> context)
    10092{
     
    133125
    134126    m_context->processWillOpenConnection(this);
    135     connection->addQueueClient(this);
    136127}
    137128
     
    141132
    142133    m_context->processWillCloseConnection(this);
    143     connection->removeQueueClient(this);
    144134}
    145135
     
    309299
    310300#if ENABLE(NETSCAPE_PLUGIN_API)
    311 void WebProcessProxy::sendDidGetPlugins(uint64_t requestID, PassOwnPtr<Vector<PluginInfo> > pluginInfos)
    312 {
    313     ASSERT(isMainThread());
    314 
    315     OwnPtr<Vector<PluginInfo> > plugins(pluginInfos);
    316 
    317 #if PLATFORM(MAC)
    318     // Add built-in PDF last, so that it's not used when a real plug-in is installed.
    319     // NOTE: This has to be done on the main thread as it calls localizedString().
    320     if (!m_context->omitPDFSupport()) {
    321 #if ENABLE(PDFKIT_PLUGIN)
    322         plugins->append(PDFPlugin::pluginInfo());
    323 #endif
    324         plugins->append(SimplePDFPlugin::pluginInfo());
    325     }
    326 #endif
    327 
    328     send(Messages::WebProcess::DidGetPlugins(requestID, *plugins), 0);
    329 }
    330 
    331 void WebProcessProxy::handleGetPlugins(uint64_t requestID, bool refresh)
     301void WebProcessProxy::getPlugins(bool refresh, Vector<PluginInfo>& plugins)
    332302{
    333303    if (refresh)
    334304        m_context->pluginInfoStore().refresh();
    335305
    336     OwnPtr<Vector<PluginInfo> > pluginInfos = adoptPtr(new Vector<PluginInfo>);
    337 
    338     {
    339         Vector<PluginModuleInfo> plugins = m_context->pluginInfoStore().plugins();
    340         for (size_t i = 0; i < plugins.size(); ++i)
    341             pluginInfos->append(plugins[i].info);
    342     }
    343 
    344     // NOTE: We have to pass the PluginInfo vector to the secondary thread via a pointer as otherwise
    345     //       we'd end up with a deref() race on all the WTF::Strings it contains.
    346     RunLoop::main()->dispatch(bind(&WebProcessProxy::sendDidGetPlugins, this, requestID, pluginInfos.release()));
    347 }
    348 
    349 void WebProcessProxy::getPlugins(CoreIPC::Connection*, uint64_t requestID, bool refresh)
    350 {
    351     pluginWorkQueue()->dispatch(bind(&WebProcessProxy::handleGetPlugins, this, requestID, refresh));
    352 }
    353 
     306    Vector<PluginModuleInfo> pluginModules = m_context->pluginInfoStore().plugins();
     307    for (size_t i = 0; i < pluginModules.size(); ++i)
     308        plugins.append(pluginModules[i].info);
     309}
    354310#endif // ENABLE(NETSCAPE_PLUGIN_API)
    355311
     
    419375
    420376    // FIXME: Add unhandled message logging.
    421 }
    422 
    423 void WebProcessProxy::didReceiveMessageOnConnectionWorkQueue(CoreIPC::Connection* connection, OwnPtr<CoreIPC::MessageDecoder>& decoder)
    424 {
    425     if (decoder->messageReceiverName() == Messages::WebProcessProxy::messageReceiverName()) {
    426         didReceiveWebProcessProxyMessageOnConnectionWorkQueue(connection, decoder);
    427         return;
    428     }
    429 }
    430 
    431 void WebProcessProxy::didCloseOnConnectionWorkQueue(CoreIPC::Connection*)
    432 {
    433377}
    434378
  • trunk/Source/WebKit2/UIProcess/WebProcessProxy.h

    r142064 r142339  
    4747
    4848namespace WebCore {
    49     class KURL;
     49class KURL;
     50struct PluginInfo;
    5051};
    5152
     
    5859struct WebNavigationDataStore;
    5960
    60 class WebProcessProxy : public ThreadSafeRefCounted<WebProcessProxy>, public ChildProcessProxy, ResponsivenessTimer::Client, CoreIPC::Connection::QueueClient {
     61class WebProcessProxy : public ThreadSafeRefCounted<WebProcessProxy>, public ChildProcessProxy, ResponsivenessTimer::Client {
    6162public:
    6263    typedef HashMap<uint64_t, RefPtr<WebBackForwardListItem> > WebBackForwardListItemMap;
     
    136137    // Plugins
    137138#if ENABLE(NETSCAPE_PLUGIN_API)
    138     void getPlugins(CoreIPC::Connection*, uint64_t requestID, bool refresh);
    139     void handleGetPlugins(uint64_t requestID, bool refresh);
    140     void sendDidGetPlugins(uint64_t requestID, PassOwnPtr<Vector<WebCore::PluginInfo> >);
     139    void getPlugins(bool refresh, Vector<WebCore::PluginInfo>& plugins);
    141140#endif // ENABLE(NETSCAPE_PLUGIN_API)
    142141#if ENABLE(PLUGIN_PROCESS)
     
    160159    virtual void didReceiveInvalidMessage(CoreIPC::Connection*, CoreIPC::StringReference messageReceiverName, CoreIPC::StringReference messageName) OVERRIDE;
    161160
    162     // CoreIPC::Connection::QueueClient
    163     virtual void didReceiveMessageOnConnectionWorkQueue(CoreIPC::Connection*, OwnPtr<CoreIPC::MessageDecoder>&) OVERRIDE;
    164     virtual void didCloseOnConnectionWorkQueue(CoreIPC::Connection*) OVERRIDE;
    165 
    166161    // ResponsivenessTimer::Client
    167162    void didBecomeUnresponsive(ResponsivenessTimer*) OVERRIDE;
     
    181176    void didReceiveWebProcessProxyMessage(CoreIPC::Connection*, CoreIPC::MessageDecoder&);
    182177    void didReceiveSyncWebProcessProxyMessage(CoreIPC::Connection*, CoreIPC::MessageDecoder&, OwnPtr<CoreIPC::MessageEncoder>&);
    183     void didReceiveWebProcessProxyMessageOnConnectionWorkQueue(CoreIPC::Connection*, OwnPtr<CoreIPC::MessageDecoder>&);
    184178
    185179    ResponsivenessTimer m_responsivenessTimer;
  • trunk/Source/WebKit2/UIProcess/WebProcessProxy.messages.in

    r141486 r142339  
    3636    # Plugin messages.
    3737#if ENABLE(NETSCAPE_PLUGIN_API)
    38     GetPlugins(uint64_t requestID, bool refresh) DispatchOnConnectionQueue
     38    GetPlugins(bool refresh) -> (Vector<WebCore::PluginInfo> plugins)
    3939#endif // ENABLE(NETSCAPE_PLUGIN_API)
    4040#if ENABLE(PLUGIN_PROCESS)
  • trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebPlatformStrategies.cpp

    r141981 r142339  
    272272
    273273#if ENABLE(NETSCAPE_PLUGIN_API)
    274 static BlockingResponseMap<Vector<WebCore::PluginInfo> >& responseMap()
    275 {
    276     AtomicallyInitializedStatic(BlockingResponseMap<Vector<WebCore::PluginInfo> >&, responseMap = *new BlockingResponseMap<Vector<WebCore::PluginInfo> >);
    277     return responseMap;
    278 }
    279 
    280 void handleDidGetPlugins(uint64_t requestID, const Vector<WebCore::PluginInfo>& plugins)
    281 {
    282     responseMap().didReceiveResponse(requestID, adoptPtr(new Vector<WebCore::PluginInfo>(plugins)));
    283 }
    284 
    285 static uint64_t generateRequestID()
    286 {
    287     static int uniqueID;
    288     return atomicIncrement(&uniqueID);
    289 }
    290 
    291274void WebPlatformStrategies::populatePluginCache()
    292275{
     
    297280   
    298281    // FIXME: Should we do something in case of error here?
    299     uint64_t requestID = generateRequestID();
    300     WebProcess::shared().connection()->send(Messages::WebProcessProxy::GetPlugins(requestID, m_shouldRefreshPlugins), 0);
    301 
    302     m_cachedPlugins = *responseMap().waitForResponse(requestID);
    303    
     282    if (!WebProcess::shared().connection()->sendSync(Messages::WebProcessProxy::GetPlugins(m_shouldRefreshPlugins), Messages::WebProcessProxy::GetPlugins::Reply(m_cachedPlugins), 0))
     283        return;
     284
    304285    m_shouldRefreshPlugins = false;
    305286    m_pluginCacheIsPopulated = true;
  • trunk/Source/WebKit2/WebProcess/WebProcess.cpp

    r142310 r142339  
    10511051}
    10521052
    1053 #if ENABLE(NETSCAPE_PLUGIN_API)
    1054 void WebProcess::didGetPlugins(CoreIPC::Connection*, uint64_t requestID, const Vector<WebCore::PluginInfo>& plugins)
    1055 {
    1056 #if USE(PLATFORM_STRATEGIES)
    1057     // Pass this to WebPlatformStrategies.cpp.
    1058     handleDidGetPlugins(requestID, plugins);
    1059 #endif
    1060 }
    1061 #endif // ENABLE(PLUGIN_PROCESS)
    1062 
    10631053#if !PLATFORM(MAC)
    10641054void WebProcess::initializeProcessName(const ChildProcessInitializationParameters&)
  • trunk/Source/WebKit2/WebProcess/WebProcess.h

    r141820 r142339  
    280280    void didReceiveWebProcessMessageOnConnectionWorkQueue(CoreIPC::Connection*, OwnPtr<CoreIPC::MessageDecoder>&);
    281281
    282 #if ENABLE(NETSCAPE_PLUGIN_API)
    283     void didGetPlugins(CoreIPC::Connection*, uint64_t requestID, const Vector<WebCore::PluginInfo>&);
    284 #endif
    285 
    286282    RefPtr<WebConnectionToUIProcess> m_webConnection;
    287283
  • trunk/Source/WebKit2/WebProcess/WebProcess.messages.in

    r141448 r142339  
    5757
    5858    # Plug-ins.
    59 #if ENABLE(NETSCAPE_PLUGIN_API)
    60     DidGetPlugins(uint64_t requestID, Vector<WebCore::PluginInfo> plugins) DispatchOnConnectionQueue
    61 #endif
    6259#if ENABLE(NETSCAPE_PLUGIN_API) && !ENABLE(PLUGIN_PROCESS)
    6360    GetSitesWithPluginData(Vector<WTF::String> pluginPaths, uint64_t callbackID)
Note: See TracChangeset for help on using the changeset viewer.