IDBSerializationContext.cpp [plain text]
#include "config.h"
#include "IDBSerializationContext.h"
#include "DOMWrapperWorld.h"
#include "WebCoreJSClientData.h"
#include <JavaScriptCore/JSObjectInlines.h>
#include <pal/SessionID.h>
#if ENABLE(INDEXED_DATABASE)
namespace WebCore {
namespace IDBServer {
static Lock serializationContextMapMutex;
static HashMap<PAL::SessionID, IDBSerializationContext*>& serializationContextMap()
{
static NeverDestroyed<HashMap<PAL::SessionID, IDBSerializationContext*>> map;
return map;
}
Ref<IDBSerializationContext> IDBSerializationContext::getOrCreateIDBSerializationContext(PAL::SessionID sessionID)
{
Locker<Lock> locker(serializationContextMapMutex);
auto[iter, isNewEntry] = serializationContextMap().add(sessionID, nullptr);
if (isNewEntry) {
Ref<IDBSerializationContext> protectedContext = adoptRef(*new IDBSerializationContext(sessionID));
iter->value = protectedContext.ptr();
return protectedContext;
}
return *iter->value;
}
IDBSerializationContext::~IDBSerializationContext()
{
Locker<Lock> locker(serializationContextMapMutex);
ASSERT(this == serializationContextMap().get(m_sessionID));
if (m_vm) {
JSC::JSLockHolder lock(*m_vm);
m_globalObject.clear();
m_vm = nullptr;
}
serializationContextMap().remove(m_sessionID);
}
void IDBSerializationContext::initializeVM()
{
if (m_vm)
return;
ASSERT(!m_globalObject);
m_vm = JSC::VM::create();
m_vm->heap.acquireAccess();
JSVMClientData::initNormalWorld(m_vm.get());
JSC::JSLockHolder locker(m_vm.get());
m_globalObject.set(*m_vm, JSIDBSerializationGlobalObject::create(*m_vm, JSIDBSerializationGlobalObject::createStructure(*m_vm, JSC::jsNull()), normalWorld(*m_vm)));
}
JSC::VM& IDBSerializationContext::vm()
{
initializeVM();
return *m_vm;
}
JSC::JSGlobalObject& IDBSerializationContext::execState()
{
initializeVM();
return *m_globalObject.get();
}
IDBSerializationContext::IDBSerializationContext(PAL::SessionID sessionID)
: m_sessionID(sessionID)
{
}
} }
#endif