Changeset 142339 in webkit
- Timestamp:
- Feb 8, 2013 6:34:13 PM (11 years ago)
- Location:
- trunk/Source/WebKit2
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit2/ChangeLog
r142333 r142339 1 2013-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 1 32 2013-02-08 Dean Jackson <dino@apple.com> 2 33 -
trunk/Source/WebKit2/Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm
r142314 r142339 297 297 static const ResID MIMEListStringStringNumber = 128; 298 298 299 static bool getPluginInfoFromCarbonResources OnMainThread(CFBundleRef bundle, PluginModuleInfo& plugin)299 static bool getPluginInfoFromCarbonResources(CFBundleRef bundle, PluginModuleInfo& plugin) 300 300 { 301 301 ASSERT(isMainThread()); … … 351 351 352 352 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;365 353 } 366 354 -
trunk/Source/WebKit2/UIProcess/WebProcessProxy.cpp
r142160 r142339 89 89 } 90 90 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 99 91 PassRefPtr<WebProcessProxy> WebProcessProxy::create(PassRefPtr<WebContext> context) 100 92 { … … 133 125 134 126 m_context->processWillOpenConnection(this); 135 connection->addQueueClient(this);136 127 } 137 128 … … 141 132 142 133 m_context->processWillCloseConnection(this); 143 connection->removeQueueClient(this);144 134 } 145 135 … … 309 299 310 300 #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) 301 void WebProcessProxy::getPlugins(bool refresh, Vector<PluginInfo>& plugins) 332 302 { 333 303 if (refresh) 334 304 m_context->pluginInfoStore().refresh(); 335 305 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 } 354 310 #endif // ENABLE(NETSCAPE_PLUGIN_API) 355 311 … … 419 375 420 376 // 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 {433 377 } 434 378 -
trunk/Source/WebKit2/UIProcess/WebProcessProxy.h
r142064 r142339 47 47 48 48 namespace WebCore { 49 class KURL; 49 class KURL; 50 struct PluginInfo; 50 51 }; 51 52 … … 58 59 struct WebNavigationDataStore; 59 60 60 class WebProcessProxy : public ThreadSafeRefCounted<WebProcessProxy>, public ChildProcessProxy, ResponsivenessTimer::Client , CoreIPC::Connection::QueueClient{61 class WebProcessProxy : public ThreadSafeRefCounted<WebProcessProxy>, public ChildProcessProxy, ResponsivenessTimer::Client { 61 62 public: 62 63 typedef HashMap<uint64_t, RefPtr<WebBackForwardListItem> > WebBackForwardListItemMap; … … 136 137 // Plugins 137 138 #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); 141 140 #endif // ENABLE(NETSCAPE_PLUGIN_API) 142 141 #if ENABLE(PLUGIN_PROCESS) … … 160 159 virtual void didReceiveInvalidMessage(CoreIPC::Connection*, CoreIPC::StringReference messageReceiverName, CoreIPC::StringReference messageName) OVERRIDE; 161 160 162 // CoreIPC::Connection::QueueClient163 virtual void didReceiveMessageOnConnectionWorkQueue(CoreIPC::Connection*, OwnPtr<CoreIPC::MessageDecoder>&) OVERRIDE;164 virtual void didCloseOnConnectionWorkQueue(CoreIPC::Connection*) OVERRIDE;165 166 161 // ResponsivenessTimer::Client 167 162 void didBecomeUnresponsive(ResponsivenessTimer*) OVERRIDE; … … 181 176 void didReceiveWebProcessProxyMessage(CoreIPC::Connection*, CoreIPC::MessageDecoder&); 182 177 void didReceiveSyncWebProcessProxyMessage(CoreIPC::Connection*, CoreIPC::MessageDecoder&, OwnPtr<CoreIPC::MessageEncoder>&); 183 void didReceiveWebProcessProxyMessageOnConnectionWorkQueue(CoreIPC::Connection*, OwnPtr<CoreIPC::MessageDecoder>&);184 178 185 179 ResponsivenessTimer m_responsivenessTimer; -
trunk/Source/WebKit2/UIProcess/WebProcessProxy.messages.in
r141486 r142339 36 36 # Plugin messages. 37 37 #if ENABLE(NETSCAPE_PLUGIN_API) 38 GetPlugins( uint64_t requestID, bool refresh) DispatchOnConnectionQueue38 GetPlugins(bool refresh) -> (Vector<WebCore::PluginInfo> plugins) 39 39 #endif // ENABLE(NETSCAPE_PLUGIN_API) 40 40 #if ENABLE(PLUGIN_PROCESS) -
trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebPlatformStrategies.cpp
r141981 r142339 272 272 273 273 #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 291 274 void WebPlatformStrategies::populatePluginCache() 292 275 { … … 297 280 298 281 // 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 304 285 m_shouldRefreshPlugins = false; 305 286 m_pluginCacheIsPopulated = true; -
trunk/Source/WebKit2/WebProcess/WebProcess.cpp
r142310 r142339 1051 1051 } 1052 1052 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 #endif1060 }1061 #endif // ENABLE(PLUGIN_PROCESS)1062 1063 1053 #if !PLATFORM(MAC) 1064 1054 void WebProcess::initializeProcessName(const ChildProcessInitializationParameters&) -
trunk/Source/WebKit2/WebProcess/WebProcess.h
r141820 r142339 280 280 void didReceiveWebProcessMessageOnConnectionWorkQueue(CoreIPC::Connection*, OwnPtr<CoreIPC::MessageDecoder>&); 281 281 282 #if ENABLE(NETSCAPE_PLUGIN_API)283 void didGetPlugins(CoreIPC::Connection*, uint64_t requestID, const Vector<WebCore::PluginInfo>&);284 #endif285 286 282 RefPtr<WebConnectionToUIProcess> m_webConnection; 287 283 -
trunk/Source/WebKit2/WebProcess/WebProcess.messages.in
r141448 r142339 57 57 58 58 # Plug-ins. 59 #if ENABLE(NETSCAPE_PLUGIN_API)60 DidGetPlugins(uint64_t requestID, Vector<WebCore::PluginInfo> plugins) DispatchOnConnectionQueue61 #endif62 59 #if ENABLE(NETSCAPE_PLUGIN_API) && !ENABLE(PLUGIN_PROCESS) 63 60 GetSitesWithPluginData(Vector<WTF::String> pluginPaths, uint64_t callbackID)
Note: See TracChangeset
for help on using the changeset viewer.