APIContentWorld.cpp [plain text]
#include "config.h"
#include "APIContentWorld.h"
#include "ContentWorldShared.h"
#include "WebUserContentControllerProxy.h"
#include <wtf/HashMap.h>
#include <wtf/text/StringHash.h>
namespace API {
static HashMap<WTF::String, ContentWorld*>& sharedWorldNameMap()
{
static NeverDestroyed<HashMap<WTF::String, ContentWorld*>> sharedMap;
return sharedMap;
}
static HashMap<WebKit::ContentWorldIdentifier, ContentWorld*>& sharedWorldIdentifierMap()
{
static NeverDestroyed<HashMap<WebKit::ContentWorldIdentifier, ContentWorld*>> sharedMap;
return sharedMap;
}
ContentWorld* ContentWorld::worldForIdentifier(WebKit::ContentWorldIdentifier identifer)
{
return sharedWorldIdentifierMap().get(identifer);
}
ContentWorld::ContentWorld(const WTF::String& name)
: m_name(name)
{
static std::once_flag once;
std::call_once(once, [] {
auto identifier = WebKit::ContentWorldIdentifier::generate();
ASSERT_UNUSED(identifier, identifier.toUInt64() >= WebKit::pageContentWorldIdentifier().toUInt64());
});
m_identifier = WebKit::ContentWorldIdentifier::generate();
auto addResult = sharedWorldIdentifierMap().add(m_identifier, this);
ASSERT_UNUSED(addResult, addResult.isNewEntry);
}
ContentWorld::ContentWorld(WebKit::ContentWorldIdentifier identifier)
: m_identifier(identifier)
{
ASSERT(m_identifier == WebKit::pageContentWorldIdentifier());
}
Ref<ContentWorld> ContentWorld::sharedWorldWithName(const WTF::String& name)
{
auto result = sharedWorldNameMap().add(name, nullptr);
if (result.isNewEntry) {
result.iterator->value = new ContentWorld(name);
return adoptRef(*result.iterator->value);
}
return makeRef(*result.iterator->value);
}
ContentWorld& ContentWorld::pageContentWorld()
{
static NeverDestroyed<RefPtr<ContentWorld>> world(adoptRef(new ContentWorld(WebKit::pageContentWorldIdentifier())));
return *world.get();
}
ContentWorld& ContentWorld::defaultClientWorld()
{
static NeverDestroyed<RefPtr<ContentWorld>> world(adoptRef(new ContentWorld(WTF::String { })));
return *world.get();
}
ContentWorld::~ContentWorld()
{
ASSERT(m_identifier != WebKit::pageContentWorldIdentifier());
auto result = sharedWorldIdentifierMap().take(m_identifier);
ASSERT_UNUSED(result, result == this || m_identifier == WebKit::pageContentWorldIdentifier());
if (!name().isNull()) {
auto taken = sharedWorldNameMap().take(name());
ASSERT_UNUSED(taken, taken == this);
}
for (auto proxy : m_associatedContentControllerProxies)
proxy->contentWorldDestroyed(*this);
}
void ContentWorld::addAssociatedUserContentControllerProxy(WebKit::WebUserContentControllerProxy& proxy)
{
auto addResult = m_associatedContentControllerProxies.add(&proxy);
ASSERT_UNUSED(addResult, addResult.isNewEntry);
}
void ContentWorld::userContentControllerProxyDestroyed(WebKit::WebUserContentControllerProxy& proxy)
{
bool removed = m_associatedContentControllerProxies.remove(&proxy);
ASSERT_UNUSED(removed, removed);
}
}