JSDOMGlobalObject.cpp [plain text]
#include "config.h"
#include "JSDOMGlobalObject.h"
#include "Document.h"
#include "JSDOMWindow.h"
#include "JSEventListener.h"
#include "JSWorkerContext.h"
#include "WorkerContext.h"
using namespace JSC;
namespace WebCore {
JSDOMGlobalObject::JSDOMGlobalObjectData::JSDOMGlobalObjectData()
: evt(0)
{
}
JSDOMGlobalObject::JSDOMGlobalObject(PassRefPtr<Structure> structure, JSDOMGlobalObject::JSDOMGlobalObjectData* data, JSObject* thisValue)
: JSGlobalObject(structure, data, thisValue)
{
}
JSDOMGlobalObject::~JSDOMGlobalObject()
{
ProtectedListenersMap::iterator i1 = d()->jsProtectedEventListeners.begin();
ProtectedListenersMap::iterator e1 = d()->jsProtectedEventListeners.end();
for (; i1 != e1; ++i1)
i1->second->clearGlobalObject();
i1 = d()->jsProtectedInlineEventListeners.begin();
e1 = d()->jsProtectedInlineEventListeners.end();
for (; i1 != e1; ++i1)
i1->second->clearGlobalObject();
JSListenersMap::iterator i2 = d()->jsEventListeners.begin();
JSListenersMap::iterator e2 = d()->jsEventListeners.end();
for (; i2 != e2; ++i2)
i2->second->clearGlobalObject();
i2 = d()->jsInlineEventListeners.begin();
e2 = d()->jsInlineEventListeners.end();
for (; i2 != e2; ++i2)
i2->second->clearGlobalObject();
}
void JSDOMGlobalObject::mark()
{
Base::mark();
JSDOMStructureMap::iterator end = structures().end();
for (JSDOMStructureMap::iterator it = structures().begin(); it != end; ++it)
it->second->mark();
JSDOMConstructorMap::iterator end2 = constructors().end();
for (JSDOMConstructorMap::iterator it2 = constructors().begin(); it2 != end2; ++it2) {
if (!it2->second->marked())
it2->second->mark();
}
}
JSProtectedEventListener* JSDOMGlobalObject::findJSProtectedEventListener(JSValuePtr val, bool isInline)
{
if (!val.isObject())
return 0;
JSObject* object = asObject(val);
ProtectedListenersMap& listeners = isInline ? d()->jsProtectedInlineEventListeners : d()->jsProtectedEventListeners;
return listeners.get(object);
}
PassRefPtr<JSProtectedEventListener> JSDOMGlobalObject::findOrCreateJSProtectedEventListener(JSValuePtr val, bool isInline)
{
if (JSProtectedEventListener* listener = findJSProtectedEventListener(val, isInline))
return listener;
if (!val.isObject())
return 0;
return JSProtectedEventListener::create(asObject(val), this, isInline).get();
}
JSEventListener* JSDOMGlobalObject::findJSEventListener(JSValuePtr val, bool isInline)
{
if (!val.isObject())
return 0;
JSListenersMap& listeners = isInline ? d()->jsInlineEventListeners : d()->jsEventListeners;
return listeners.get(asObject(val));
}
PassRefPtr<JSEventListener> JSDOMGlobalObject::findOrCreateJSEventListener(JSValuePtr val, bool isInline)
{
if (JSEventListener* listener = findJSEventListener(val, isInline))
return listener;
if (!val.isObject())
return 0;
return JSEventListener::create(asObject(val), this, isInline).get();
}
JSDOMGlobalObject::ProtectedListenersMap& JSDOMGlobalObject::jsProtectedEventListeners()
{
return d()->jsProtectedEventListeners;
}
JSDOMGlobalObject::ProtectedListenersMap& JSDOMGlobalObject::jsProtectedInlineEventListeners()
{
return d()->jsProtectedInlineEventListeners;
}
JSDOMGlobalObject::JSListenersMap& JSDOMGlobalObject::jsEventListeners()
{
return d()->jsEventListeners;
}
JSDOMGlobalObject::JSListenersMap& JSDOMGlobalObject::jsInlineEventListeners()
{
return d()->jsInlineEventListeners;
}
void JSDOMGlobalObject::setCurrentEvent(Event* evt)
{
d()->evt = evt;
}
Event* JSDOMGlobalObject::currentEvent()
{
return d()->evt;
}
JSDOMGlobalObject* toJSDOMGlobalObject(ScriptExecutionContext* scriptExecutionContext)
{
if (scriptExecutionContext->isDocument())
return toJSDOMWindow(static_cast<Document*>(scriptExecutionContext)->frame());
#if ENABLE(WORKERS)
if (scriptExecutionContext->isWorkerContext())
return static_cast<WorkerContext*>(scriptExecutionContext)->script()->workerContextWrapper();
#endif
ASSERT_NOT_REACHED();
return 0;
}
}