diff options
Diffstat (limited to 'WebCore/bindings/js/JSWorkerContextCustom.cpp')
-rw-r--r-- | WebCore/bindings/js/JSWorkerContextCustom.cpp | 76 |
1 files changed, 67 insertions, 9 deletions
diff --git a/WebCore/bindings/js/JSWorkerContextCustom.cpp b/WebCore/bindings/js/JSWorkerContextCustom.cpp index 3a6dca0..a28cb75 100644 --- a/WebCore/bindings/js/JSWorkerContextCustom.cpp +++ b/WebCore/bindings/js/JSWorkerContextCustom.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008 Apple Inc. All Rights Reserved. + * Copyright (C) 2008, 2009 Apple Inc. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -31,7 +31,9 @@ #include "JSDOMBinding.h" #include "JSEventListener.h" +#include "ScheduledAction.h" #include "WorkerContext.h" +#include <interpreter/Interpreter.h> using namespace JSC; @@ -51,17 +53,14 @@ void JSWorkerContext::mark() markActiveObjectsForContext(*globalData(), scriptExecutionContext()); - if (JSUnprotectedEventListener* listener = static_cast<JSUnprotectedEventListener*>(impl()->onmessage())) - listener->mark(); + markIfNotNull(impl()->onmessage()); typedef WorkerContext::EventListenersMap EventListenersMap; typedef WorkerContext::ListenerVector ListenerVector; EventListenersMap& eventListeners = impl()->eventListeners(); for (EventListenersMap::iterator mapIter = eventListeners.begin(); mapIter != eventListeners.end(); ++mapIter) { - for (ListenerVector::iterator vecIter = mapIter->second.begin(); vecIter != mapIter->second.end(); ++vecIter) { - JSUnprotectedEventListener* listener = static_cast<JSUnprotectedEventListener*>(vecIter->get()); - listener->mark(); - } + for (ListenerVector::iterator vecIter = mapIter->second.begin(); vecIter != mapIter->second.end(); ++vecIter) + (*vecIter)->mark(); } } @@ -75,9 +74,32 @@ void JSWorkerContext::setSelf(ExecState* exec, JSValuePtr value) putDirect(Identifier(exec, "self"), value); } +JSValuePtr JSWorkerContext::importScripts(ExecState* exec, const ArgList& args) +{ + if (!args.size()) + return jsUndefined(); + + Vector<String> urls; + for (unsigned i = 0; i < args.size(); i++) { + urls.append(args.at(exec, i).toString(exec)); + if (exec->hadException()) + return jsUndefined(); + } + ExceptionCode ec = 0; + int signedLineNumber; + intptr_t sourceID; + UString sourceURL; + JSValuePtr function; + exec->interpreter()->retrieveLastCaller(exec, signedLineNumber, sourceID, sourceURL, function); + + impl()->importScripts(urls, sourceURL, signedLineNumber >= 0 ? signedLineNumber : 0, ec); + setDOMException(exec, ec); + return jsUndefined(); +} + JSValuePtr JSWorkerContext::addEventListener(ExecState* exec, const ArgList& args) { - RefPtr<JSUnprotectedEventListener> listener = findOrCreateJSUnprotectedEventListener(exec, args.at(exec, 1)); + RefPtr<JSEventListener> listener = findOrCreateJSEventListener(exec, args.at(exec, 1)); if (!listener) return jsUndefined(); impl()->addEventListener(args.at(exec, 0).toString(exec), listener.release(), args.at(exec, 2).toBoolean(exec)); @@ -86,13 +108,49 @@ JSValuePtr JSWorkerContext::addEventListener(ExecState* exec, const ArgList& arg JSValuePtr JSWorkerContext::removeEventListener(ExecState* exec, const ArgList& args) { - JSUnprotectedEventListener* listener = findJSUnprotectedEventListener(exec, args.at(exec, 1)); + JSEventListener* listener = findJSEventListener(exec, args.at(exec, 1)); if (!listener) return jsUndefined(); impl()->removeEventListener(args.at(exec, 0).toString(exec), listener, args.at(exec, 2).toBoolean(exec)); return jsUndefined(); } +static JSValuePtr setTimeoutOrInterval(ExecState* exec, WorkerContext* workerContext, const ArgList& args, bool singleShot) +{ + JSValuePtr v = args.at(exec, 0); + int delay = args.at(exec, 1).toInt32(exec); + if (v.isString()) + return jsNumber(exec, workerContext->installTimeout(new ScheduledAction(asString(v)->value()), delay, singleShot)); + CallData callData; + if (v.getCallData(callData) == CallTypeNone) + return jsUndefined(); + ArgList argsTail; + args.getSlice(2, argsTail); + return jsNumber(exec, workerContext->installTimeout(new ScheduledAction(exec, v, argsTail), delay, singleShot)); +} + +JSValuePtr JSWorkerContext::setTimeout(ExecState* exec, const ArgList& args) +{ + return setTimeoutOrInterval(exec, impl(), args, true); +} + +JSValuePtr JSWorkerContext::clearTimeout(ExecState* exec, const ArgList& args) +{ + impl()->removeTimeout(args.at(exec, 0).toInt32(exec)); + return jsUndefined(); +} + +JSValuePtr JSWorkerContext::setInterval(ExecState* exec, const ArgList& args) +{ + return setTimeoutOrInterval(exec, impl(), args, false); +} + +JSValuePtr JSWorkerContext::clearInterval(ExecState* exec, const ArgList& args) +{ + impl()->removeTimeout(args.at(exec, 0).toInt32(exec)); + return jsUndefined(); +} + } // namespace WebCore #endif // ENABLE(WORKERS) |