diff options
Diffstat (limited to 'Source/WebCore/html/PublicURLManager.cpp')
-rw-r--r-- | Source/WebCore/html/PublicURLManager.cpp | 54 |
1 files changed, 40 insertions, 14 deletions
diff --git a/Source/WebCore/html/PublicURLManager.cpp b/Source/WebCore/html/PublicURLManager.cpp index 2bf7d70cf..20504b9b6 100644 --- a/Source/WebCore/html/PublicURLManager.cpp +++ b/Source/WebCore/html/PublicURLManager.cpp @@ -26,43 +26,69 @@ #include "config.h" #include "PublicURLManager.h" - -#if ENABLE(BLOB) - #include "URL.h" #include "URLRegistry.h" #include <wtf/text/StringHash.h> namespace WebCore { -void PublicURLManager::registerURL(SecurityOrigin* origin, const URL& url, URLRegistrable* registrable) +std::unique_ptr<PublicURLManager> PublicURLManager::create(ScriptExecutionContext* context) +{ + auto publicURLManager = std::make_unique<PublicURLManager>(context); + publicURLManager->suspendIfNeeded(); + return publicURLManager; +} + +PublicURLManager::PublicURLManager(ScriptExecutionContext* context) + : ActiveDOMObject(context) + , m_isStopped(false) +{ +} + +void PublicURLManager::registerURL(SecurityOrigin* origin, const URL& url, URLRegistrable& registrable) { - RegistryURLMap::iterator found = m_registryToURL.add(®istrable->registry(), URLSet()).iterator; + if (m_isStopped) + return; + + RegistryURLMap::iterator found = m_registryToURL.add(®istrable.registry(), URLSet()).iterator; found->key->registerURL(origin, url, registrable); found->value.add(url.string()); } void PublicURLManager::revoke(const URL& url) { - for (RegistryURLMap::iterator i = m_registryToURL.begin(); i != m_registryToURL.end(); ++i) { - if (i->value.contains(url.string())) { - i->key->unregisterURL(url); - i->value.remove(url.string()); + for (auto& registry : m_registryToURL) { + if (registry.value.contains(url.string())) { + registry.key->unregisterURL(url); + registry.value.remove(url.string()); break; } } } -void PublicURLManager::contextDestroyed() +void PublicURLManager::stop() { - for (RegistryURLMap::iterator i = m_registryToURL.begin(); i != m_registryToURL.end(); ++i) { - for (URLSet::iterator j = i->value.begin(); j != i->value.end(); ++j) - i->key->unregisterURL(URL(ParsedURLString, *j)); + if (m_isStopped) + return; + + m_isStopped = true; + for (auto& registry : m_registryToURL) { + for (auto& url : registry.value) + registry.key->unregisterURL(URL(ParsedURLString, url)); } m_registryToURL.clear(); } +bool PublicURLManager::canSuspendForDocumentSuspension() const +{ + // Suspending an PublicURLManager is safe as it does not cause any JS to be executed. + return true; +} + +const char* PublicURLManager::activeDOMObjectName() const +{ + return "PublicURLManager"; } -#endif // ENABLE(BLOB) +} // namespace WebCore |