30
30
#include "JSWorkerContext.h"
32
32
#include "JSDOMBinding.h"
33
#include "JSDOMGlobalObject.h"
33
34
#include "JSEventListener.h"
35
#include "JSMessageChannelConstructor.h"
36
#include "JSMessagePort.h"
37
#include "JSWorkerLocation.h"
38
#include "JSWorkerNavigator.h"
39
#include "JSXMLHttpRequestConstructor.h"
40
#include "ScheduledAction.h"
34
41
#include "WorkerContext.h"
42
#include "WorkerLocation.h"
43
#include "WorkerNavigator.h"
44
#include <interpreter/Interpreter.h>
46
#if ENABLE(EVENTSOURCE)
47
#include "JSEventSourceConstructor.h"
36
50
using namespace JSC;
38
52
namespace WebCore {
40
bool JSWorkerContext::customGetOwnPropertySlot(JSC::ExecState* exec, const JSC::Identifier& propertyName, JSC::PropertySlot& slot)
54
void JSWorkerContext::markChildren(MarkStack& markStack)
56
Base::markChildren(markStack);
58
JSGlobalData& globalData = *this->globalData();
60
markActiveObjectsForContext(markStack, globalData, scriptExecutionContext());
62
markDOMObjectWrapper(markStack, globalData, impl()->optionalLocation());
63
markDOMObjectWrapper(markStack, globalData, impl()->optionalNavigator());
65
impl()->markEventListeners(markStack);
68
bool JSWorkerContext::getOwnPropertySlotDelegate(ExecState* exec, const Identifier& propertyName, PropertySlot& slot)
42
70
// Look for overrides before looking at any of our own properties.
43
71
if (JSGlobalObject::getOwnPropertySlot(exec, propertyName, slot))
48
void JSWorkerContext::mark()
52
markActiveObjectsForContext(*globalData(), scriptExecutionContext());
54
if (JSUnprotectedEventListener* listener = static_cast<JSUnprotectedEventListener*>(impl()->onmessage()))
57
typedef WorkerContext::EventListenersMap EventListenersMap;
58
typedef WorkerContext::ListenerVector ListenerVector;
59
EventListenersMap& eventListeners = impl()->eventListeners();
60
for (EventListenersMap::iterator mapIter = eventListeners.begin(); mapIter != eventListeners.end(); ++mapIter) {
61
for (ListenerVector::iterator vecIter = mapIter->second.begin(); vecIter != mapIter->second.end(); ++vecIter) {
62
JSUnprotectedEventListener* listener = static_cast<JSUnprotectedEventListener*>(vecIter->get());
76
bool JSWorkerContext::getOwnPropertyDescriptorDelegate(ExecState* exec, const Identifier& propertyName, PropertyDescriptor& descriptor)
78
// Look for overrides before looking at any of our own properties.
79
if (JSGlobalObject::getOwnPropertyDescriptor(exec, propertyName, descriptor))
84
#if ENABLE(EVENTSOURCE)
85
JSValue JSWorkerContext::eventSource(ExecState* exec) const
87
return getDOMConstructor<JSEventSourceConstructor>(exec, this);
91
JSValue JSWorkerContext::xmlHttpRequest(ExecState* exec) const
93
return getDOMConstructor<JSXMLHttpRequestConstructor>(exec, this);
96
JSValue JSWorkerContext::importScripts(ExecState* exec, const ArgList& args)
102
for (unsigned i = 0; i < args.size(); i++) {
103
urls.append(args.at(i).toString(exec));
104
if (exec->hadException())
105
return jsUndefined();
68
JSValuePtr JSWorkerContext::self(ExecState*) const
73
void JSWorkerContext::setSelf(ExecState* exec, JSValuePtr value)
75
putDirect(Identifier(exec, "self"), value);
78
JSValuePtr JSWorkerContext::addEventListener(ExecState* exec, const ArgList& args)
80
RefPtr<JSUnprotectedEventListener> listener = findOrCreateJSUnprotectedEventListener(exec, args.at(exec, 1));
83
impl()->addEventListener(args.at(exec, 0)->toString(exec), listener.release(), args.at(exec, 2)->toBoolean(exec));
87
JSValuePtr JSWorkerContext::removeEventListener(ExecState* exec, const ArgList& args)
89
JSUnprotectedEventListener* listener = findJSUnprotectedEventListener(exec, args.at(exec, 1));
92
impl()->removeEventListener(args.at(exec, 0)->toString(exec), listener, args.at(exec, 2)->toBoolean(exec));
107
ExceptionCode ec = 0;
108
int signedLineNumber;
112
exec->interpreter()->retrieveLastCaller(exec, signedLineNumber, sourceID, sourceURL, function);
114
impl()->importScripts(urls, sourceURL, signedLineNumber >= 0 ? signedLineNumber : 0, ec);
115
setDOMException(exec, ec);
116
return jsUndefined();
119
JSValue JSWorkerContext::addEventListener(ExecState* exec, const ArgList& args)
121
JSValue listener = args.at(1);
122
if (!listener.isObject())
123
return jsUndefined();
125
impl()->addEventListener(args.at(0).toString(exec), JSEventListener::create(asObject(listener), false), args.at(2).toBoolean(exec));
126
return jsUndefined();
129
JSValue JSWorkerContext::removeEventListener(ExecState* exec, const ArgList& args)
131
JSValue listener = args.at(1);
132
if (!listener.isObject())
133
return jsUndefined();
135
impl()->removeEventListener(args.at(0).toString(exec), JSEventListener::create(asObject(listener), false).get(), args.at(2).toBoolean(exec));
136
return jsUndefined();
139
JSValue JSWorkerContext::setTimeout(ExecState* exec, const ArgList& args)
141
ScheduledAction* action = ScheduledAction::create(exec, args);
142
if (exec->hadException())
143
return jsUndefined();
144
int delay = args.at(1).toInt32(exec);
145
return jsNumber(exec, impl()->setTimeout(action, delay));
148
JSValue JSWorkerContext::setInterval(ExecState* exec, const ArgList& args)
150
ScheduledAction* action = ScheduledAction::create(exec, args);
151
if (exec->hadException())
152
return jsUndefined();
153
int delay = args.at(1).toInt32(exec);
154
return jsNumber(exec, impl()->setInterval(action, delay));
158
#if ENABLE(CHANNEL_MESSAGING)
159
JSValue JSWorkerContext::messageChannel(ExecState* exec) const
161
return getDOMConstructor<JSMessageChannelConstructor>(exec, this);
96
165
} // namespace WebCore