#include "config.h" #include "JSEventEmitter.h" #include "EventEmitter.h" #include "JSDOMWrapperCache.h" #include "JSEventListener.h" namespace WebCore { using namespace JSC; JSValue toJSNewlyCreated(JSGlobalObject*, JSDOMGlobalObject* globalObject, Ref&& value) { return createWrapper(globalObject, WTFMove(value)); } EventEmitter* JSEventEmitter::toWrapped(VM& vm, JSValue value) { if (value.inherits()) return &jsCast(asObject(value))->wrapped(); return nullptr; } std::unique_ptr jsEventEmitterCast(VM& vm, JSC::JSGlobalObject* lexicalGlobalObject, JSValue thisValue) { if (auto* target = jsDynamicCast(thisValue)) return makeUnique(target->wrapped(), *target); if (auto* object = jsDynamicCast(thisValue)) { // need to create a EventEmitter for Object. // use `mapPrivateName` as it is not occupied. auto emitterTag = WebCore::clientData(vm)->builtinNames().mapPrivateName(); JSC::JSValue value = object->getDirect(vm, emitterTag); if (!value) { Zig::GlobalObject* globalObject = reinterpret_cast(lexicalGlobalObject); value = WebCore::toJSNewlyCreated(lexicalGlobalObject, globalObject, EventEmitter::create(*globalObject->scriptExecutionContext())); object->putDirect(vm, emitterTag, value); } auto* target = jsCast(value); return makeUnique(target->wrapped(), *target); } return nullptr; } template void JSEventEmitter::visitAdditionalChildren(Visitor& visitor) { wrapped().eventListenerMap().visitJSEventListeners(visitor); } DEFINE_VISIT_ADDITIONAL_CHILDREN(JSEventEmitter); } // namespace WebCore