Changeset 247243 in webkit
- Timestamp:
- Jul 8, 2019 5:53:26 PM (5 years ago)
- Location:
- trunk/Source
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WTF/ChangeLog
r247225 r247243 1 2019-07-08 Chris Dumez <cdumez@apple.com> 2 3 Use WeakHashSet for WebUserContentControllerProxy::m_processes 4 https://bugs.webkit.org/show_bug.cgi?id=199591 5 <rdar://problem/52798721> 6 7 Reviewed by Youenn Fablet. 8 9 Update WeakHashSet::add() to return an AddResult type, similarly to our other containers. 10 11 * wtf/WeakHashSet.h: 12 (WTF::WeakHashSet::add): 13 1 14 2019-07-08 Christopher Reid <chris.reid@sony.com> 2 15 -
trunk/Source/WTF/wtf/WeakHashSet.h
r245972 r247243 45 45 public: 46 46 typedef HashSet<Ref<WeakPtrImpl>> WeakPtrImplSet; 47 typedef typename WeakPtrImplSet::AddResult AddResult; 47 48 48 49 class WeakHashSetConstIterator : public std::iterator<std::forward_iterator_tag, T, std::ptrdiff_t, const T*, const T&> { … … 97 98 98 99 template <typename U> 99 voidadd(const U& value)100 AddResult add(const U& value) 100 101 { 101 m_set.add(*makeWeakPtr<T>(const_cast<U&>(value)).m_impl);102 return m_set.add(*makeWeakPtr<T>(const_cast<U&>(value)).m_impl); 102 103 } 103 104 -
trunk/Source/WebKit/ChangeLog
r247233 r247243 1 2019-07-08 Chris Dumez <cdumez@apple.com> 2 3 Use WeakHashSet for WebUserContentControllerProxy::m_processes 4 https://bugs.webkit.org/show_bug.cgi?id=199591 5 <rdar://problem/52798721> 6 7 Reviewed by Youenn Fablet. 8 9 Use WeakHashSet for WebUserContentControllerProxy::m_processses for safety. In theory, a WebProcessProxy could 10 stay in the map if we failed to call WebProcessProxy::shutDown() before destroying it. 11 12 * UIProcess/UserContent/WebUserContentControllerProxy.cpp: 13 (WebKit::WebUserContentControllerProxy::~WebUserContentControllerProxy): 14 (WebKit::WebUserContentControllerProxy::addProcess): 15 (WebKit::WebUserContentControllerProxy::removeProcess): 16 (WebKit::WebUserContentControllerProxy::addUserContentWorldUse): 17 (WebKit::WebUserContentControllerProxy::removeUserContentWorldUses): 18 (WebKit::WebUserContentControllerProxy::addUserScript): 19 (WebKit::WebUserContentControllerProxy::removeUserScript): 20 (WebKit::WebUserContentControllerProxy::removeAllUserScripts): 21 (WebKit::WebUserContentControllerProxy::addUserStyleSheet): 22 (WebKit::WebUserContentControllerProxy::removeUserStyleSheet): 23 (WebKit::WebUserContentControllerProxy::removeAllUserStyleSheets): 24 (WebKit::WebUserContentControllerProxy::addUserScriptMessageHandler): 25 (WebKit::WebUserContentControllerProxy::removeUserMessageHandlerForName): 26 (WebKit::WebUserContentControllerProxy::removeAllUserMessageHandlers): 27 (WebKit::WebUserContentControllerProxy::addContentRuleList): 28 (WebKit::WebUserContentControllerProxy::removeContentRuleList): 29 (WebKit::WebUserContentControllerProxy::removeAllContentRuleLists): 30 * UIProcess/UserContent/WebUserContentControllerProxy.h: 31 (WebKit::WebUserContentControllerProxy::addNetworkProcess): 32 (WebKit::WebUserContentControllerProxy::removeNetworkProcess): 33 1 34 2019-07-08 Daniel Bates <dabates@apple.com> 2 35 -
trunk/Source/WebKit/UIProcess/UserContent/WebUserContentControllerProxy.cpp
r245796 r247243 75 75 { 76 76 webUserContentControllerProxies().remove(m_identifier); 77 for (auto *process : m_processes) {78 process ->removeMessageReceiver(Messages::WebUserContentControllerProxy::messageReceiverName(), identifier());79 process ->didDestroyWebUserContentControllerProxy(*this);77 for (auto& process : m_processes) { 78 process.removeMessageReceiver(Messages::WebUserContentControllerProxy::messageReceiverName(), identifier()); 79 process.didDestroyWebUserContentControllerProxy(*this); 80 80 } 81 81 #if ENABLE(CONTENT_EXTENSIONS) 82 for (auto *process : m_networkProcesses)83 process ->didDestroyWebUserContentControllerProxy(*this);82 for (auto& process : m_networkProcesses) 83 process.didDestroyWebUserContentControllerProxy(*this); 84 84 #endif 85 85 } … … 87 87 void WebUserContentControllerProxy::addProcess(WebProcessProxy& webProcessProxy, WebPageCreationParameters& parameters) 88 88 { 89 if (m_processes.add(&webProcessProxy).isNewEntry) 89 ASSERT(!m_processes.hasNullReferences()); 90 91 if (m_processes.add(webProcessProxy).isNewEntry) 90 92 webProcessProxy.addMessageReceiver(Messages::WebUserContentControllerProxy::messageReceiverName(), identifier(), *this); 91 93 … … 115 117 void WebUserContentControllerProxy::removeProcess(WebProcessProxy& webProcessProxy) 116 118 { 117 ASSERT(m_processes.contains(&webProcessProxy)); 118 119 m_processes.remove(&webProcessProxy); 119 ASSERT(m_processes.contains(webProcessProxy)); 120 ASSERT(!m_processes.hasNullReferences()); 121 122 m_processes.remove(webProcessProxy); 120 123 webProcessProxy.removeMessageReceiver(Messages::WebUserContentControllerProxy::messageReceiverName(), identifier()); 121 124 } … … 128 131 auto addResult = m_userContentWorlds.add(&world); 129 132 if (addResult.isNewEntry) { 130 for ( WebProcessProxy*process : m_processes)131 process ->send(Messages::WebUserContentController::AddUserContentWorlds({ std::make_pair(world.identifier(), world.name()) }), identifier());133 for (auto& process : m_processes) 134 process.send(Messages::WebUserContentController::AddUserContentWorlds({ std::make_pair(world.identifier(), world.name()) }), identifier()); 132 135 } 133 136 } … … 152 155 { 153 156 if (shouldSendRemoveUserContentWorldsMessage(world, numberOfUsesToRemove)) { 154 for ( WebProcessProxy*process : m_processes)155 process ->send(Messages::WebUserContentController::RemoveUserContentWorlds({ world.identifier() }), identifier());157 for (auto& process : m_processes) 158 process.send(Messages::WebUserContentController::RemoveUserContentWorlds({ world.identifier() }), identifier()); 156 159 } 157 160 } … … 165 168 } 166 169 167 for ( WebProcessProxy*process : m_processes)168 process ->send(Messages::WebUserContentController::RemoveUserContentWorlds(worldsToRemove), identifier());170 for (auto& process : m_processes) 171 process.send(Messages::WebUserContentController::RemoveUserContentWorlds(worldsToRemove), identifier()); 169 172 } 170 173 … … 177 180 m_userScripts->elements().append(&userScript); 178 181 179 for ( WebProcessProxy*process : m_processes)180 process ->send(Messages::WebUserContentController::AddUserScripts({ { userScript.identifier(), world->identifier(), userScript.userScript() } }, immediately), identifier());182 for (auto& process : m_processes) 183 process.send(Messages::WebUserContentController::AddUserScripts({ { userScript.identifier(), world->identifier(), userScript.userScript() } }, immediately), identifier()); 181 184 } 182 185 … … 185 188 Ref<API::UserContentWorld> world = userScript.userContentWorld(); 186 189 187 for ( WebProcessProxy*process : m_processes)188 process ->send(Messages::WebUserContentController::RemoveUserScript(world->identifier(), userScript.identifier()), identifier());190 for (auto& process : m_processes) 191 process.send(Messages::WebUserContentController::RemoveUserScript(world->identifier(), userScript.identifier()), identifier()); 189 192 190 193 m_userScripts->elements().removeAll(&userScript); … … 195 198 void WebUserContentControllerProxy::removeAllUserScripts(API::UserContentWorld& world) 196 199 { 197 for ( WebProcessProxy*process : m_processes)198 process ->send(Messages::WebUserContentController::RemoveAllUserScripts({ world.identifier() }), identifier());200 for (auto& process : m_processes) 201 process.send(Messages::WebUserContentController::RemoveAllUserScripts({ world.identifier() }), identifier()); 199 202 200 203 unsigned userScriptsRemoved = m_userScripts->removeAllOfTypeMatching<API::UserScript>([&](const auto& userScript) { … … 216 219 worldIdentifiers.uncheckedAppend(worldCountPair.key->identifier()); 217 220 218 for ( WebProcessProxy*process : m_processes)219 process ->send(Messages::WebUserContentController::RemoveAllUserScripts(worldIdentifiers), identifier());221 for (auto& process : m_processes) 222 process.send(Messages::WebUserContentController::RemoveAllUserScripts(worldIdentifiers), identifier()); 220 223 221 224 m_userScripts->elements().clear(); … … 232 235 m_userStyleSheets->elements().append(&userStyleSheet); 233 236 234 for ( WebProcessProxy*process : m_processes)235 process ->send(Messages::WebUserContentController::AddUserStyleSheets({ { userStyleSheet.identifier(), world->identifier(), userStyleSheet.userStyleSheet() } }), identifier());237 for (auto& process : m_processes) 238 process.send(Messages::WebUserContentController::AddUserStyleSheets({ { userStyleSheet.identifier(), world->identifier(), userStyleSheet.userStyleSheet() } }), identifier()); 236 239 } 237 240 … … 240 243 Ref<API::UserContentWorld> world = userStyleSheet.userContentWorld(); 241 244 242 for ( WebProcessProxy*process : m_processes)243 process ->send(Messages::WebUserContentController::RemoveUserStyleSheet(world->identifier(), userStyleSheet.identifier()), identifier());245 for (auto& process : m_processes) 246 process.send(Messages::WebUserContentController::RemoveUserStyleSheet(world->identifier(), userStyleSheet.identifier()), identifier()); 244 247 245 248 m_userStyleSheets->elements().removeAll(&userStyleSheet); … … 250 253 void WebUserContentControllerProxy::removeAllUserStyleSheets(API::UserContentWorld& world) 251 254 { 252 for ( WebProcessProxy*process : m_processes)253 process ->send(Messages::WebUserContentController::RemoveAllUserStyleSheets({ world.identifier() }), identifier());255 for (auto& process : m_processes) 256 process.send(Messages::WebUserContentController::RemoveAllUserStyleSheets({ world.identifier() }), identifier()); 254 257 255 258 unsigned userStyleSheetsRemoved = m_userStyleSheets->removeAllOfTypeMatching<API::UserStyleSheet>([&](const auto& userStyleSheet) { … … 271 274 worldIdentifiers.uncheckedAppend(worldCountPair.key->identifier()); 272 275 273 for ( WebProcessProxy*process : m_processes)274 process ->send(Messages::WebUserContentController::RemoveAllUserStyleSheets(worldIdentifiers), identifier());276 for (auto& process : m_processes) 277 process.send(Messages::WebUserContentController::RemoveAllUserStyleSheets(worldIdentifiers), identifier()); 275 278 276 279 m_userStyleSheets->elements().clear(); … … 292 295 m_scriptMessageHandlers.add(handler.identifier(), &handler); 293 296 294 for ( WebProcessProxy*process : m_processes)295 process ->send(Messages::WebUserContentController::AddUserScriptMessageHandlers({ { handler.identifier(), world->identifier(), handler.name() } }), identifier());297 for (auto& process : m_processes) 298 process.send(Messages::WebUserContentController::AddUserScriptMessageHandlers({ { handler.identifier(), world->identifier(), handler.name() } }), identifier()); 296 299 297 300 return true; … … 302 305 for (auto it = m_scriptMessageHandlers.begin(), end = m_scriptMessageHandlers.end(); it != end; ++it) { 303 306 if (it->value->name() == name && &it->value->userContentWorld() == &world) { 304 for ( WebProcessProxy*process : m_processes)305 process ->send(Messages::WebUserContentController::RemoveUserScriptMessageHandler(world.identifier(), it->value->identifier()), identifier());307 for (auto& process : m_processes) 308 process.send(Messages::WebUserContentController::RemoveUserScriptMessageHandler(world.identifier(), it->value->identifier()), identifier()); 306 309 307 310 m_scriptMessageHandlers.remove(it); … … 315 318 void WebUserContentControllerProxy::removeAllUserMessageHandlers(API::UserContentWorld& world) 316 319 { 317 for ( WebProcessProxy*process : m_processes)318 process ->send(Messages::WebUserContentController::RemoveAllUserScriptMessageHandlers({ world.identifier() }), identifier());320 for (auto& process : m_processes) 321 process.send(Messages::WebUserContentController::RemoveAllUserScriptMessageHandlers({ world.identifier() }), identifier()); 319 322 320 323 unsigned numberRemoved = 0; … … 353 356 auto pair = std::make_pair(contentRuleList.name(), contentRuleList.compiledRuleList().data()); 354 357 355 for (auto *process : m_processes)356 process ->send(Messages::WebUserContentController::AddContentRuleLists({ pair }), identifier());357 358 for (auto *process : m_networkProcesses)359 process ->send(Messages::NetworkContentRuleListManager::AddContentRuleLists { identifier(), { pair } }, 0);358 for (auto& process : m_processes) 359 process.send(Messages::WebUserContentController::AddContentRuleLists({ pair }), identifier()); 360 361 for (auto& process : m_networkProcesses) 362 process.send(Messages::NetworkContentRuleListManager::AddContentRuleLists { identifier(), { pair } }, 0); 360 363 } 361 364 … … 364 367 m_contentRuleLists.remove(name); 365 368 366 for (auto *process : m_processes)367 process ->send(Messages::WebUserContentController::RemoveContentRuleList(name), identifier());368 369 for (auto *process : m_networkProcesses)370 process ->send(Messages::NetworkContentRuleListManager::RemoveContentRuleList { identifier(), name }, 0);369 for (auto& process : m_processes) 370 process.send(Messages::WebUserContentController::RemoveContentRuleList(name), identifier()); 371 372 for (auto& process : m_networkProcesses) 373 process.send(Messages::NetworkContentRuleListManager::RemoveContentRuleList { identifier(), name }, 0); 371 374 } 372 375 … … 375 378 m_contentRuleLists.clear(); 376 379 377 for (auto *process : m_processes)378 process ->send(Messages::WebUserContentController::RemoveAllContentRuleLists(), identifier());379 380 for (auto *process : m_networkProcesses)381 process ->send(Messages::NetworkContentRuleListManager::RemoveAllContentRuleLists { identifier() }, 0);380 for (auto& process : m_processes) 381 process.send(Messages::WebUserContentController::RemoveAllContentRuleLists(), identifier()); 382 383 for (auto& process : m_networkProcesses) 384 process.send(Messages::NetworkContentRuleListManager::RemoveAllContentRuleLists { identifier() }, 0); 382 385 } 383 386 #endif -
trunk/Source/WebKit/UIProcess/UserContent/WebUserContentControllerProxy.h
r245796 r247243 28 28 #include "APIObject.h" 29 29 #include "MessageReceiver.h" 30 #include "NetworkProcessProxy.h" 30 31 #include "UserContentControllerIdentifier.h" 31 32 #include <WebCore/PageIdentifier.h> … … 33 34 #include <wtf/HashCountedSet.h> 34 35 #include <wtf/HashMap.h> 35 #include <wtf/HashSet.h>36 36 #include <wtf/Ref.h> 37 37 #include <wtf/RefCounted.h> 38 #include <wtf/WeakHashSet.h> 38 39 #include <wtf/text/StringHash.h> 39 40 … … 97 98 98 99 #if ENABLE(CONTENT_EXTENSIONS) 99 void addNetworkProcess(NetworkProcessProxy& proxy) { m_networkProcesses.add( &proxy); }100 void removeNetworkProcess(NetworkProcessProxy& proxy) { m_networkProcesses.remove( &proxy); }100 void addNetworkProcess(NetworkProcessProxy& proxy) { m_networkProcesses.add(proxy); } 101 void removeNetworkProcess(NetworkProcessProxy& proxy) { m_networkProcesses.remove(proxy); } 101 102 102 103 void addContentRuleList(API::ContentRuleList&); … … 120 121 121 122 UserContentControllerIdentifier m_identifier; 122 HashSet<WebProcessProxy*> m_processes;123 WeakHashSet<WebProcessProxy> m_processes; 123 124 Ref<API::Array> m_userScripts; 124 125 Ref<API::Array> m_userStyleSheets; … … 127 128 128 129 #if ENABLE(CONTENT_EXTENSIONS) 129 HashSet<NetworkProcessProxy*> m_networkProcesses;130 WeakHashSet<NetworkProcessProxy> m_networkProcesses; 130 131 HashMap<String, RefPtr<API::ContentRuleList>> m_contentRuleLists; 131 132 #endif
Note: See TracChangeset
for help on using the changeset viewer.