v8::Handle<v8::Value> SetTimeoutOrInterval(const v8::Arguments& args, bool singleShot) { WorkerContext* workerContext = V8DOMWrapper::convertDOMWrapperToNative<WorkerContext>(args.Holder()); int argumentCount = args.Length(); if (argumentCount < 1) return v8::Undefined(); v8::Handle<v8::Value> function = args[0]; int32_t timeout = argumentCount >= 2 ? args[1]->Int32Value() : 0; int timerId; v8::Handle<v8::Context> v8Context = workerContext->script()->proxy()->context(); if (function->IsString()) { WebCore::String stringFunction = toWebCoreString(function); timerId = DOMTimer::install(workerContext, new ScheduledAction(v8Context, stringFunction, workerContext->url()), timeout, singleShot); } else if (function->IsFunction()) { size_t paramCount = argumentCount >= 2 ? argumentCount - 2 : 0; v8::Local<v8::Value>* params = 0; if (paramCount > 0) { params = new v8::Local<v8::Value>[paramCount]; for (size_t i = 0; i < paramCount; ++i) params[i] = args[i+2]; } // ScheduledAction takes ownership of actual params and releases them in its destructor. ScheduledAction* action = new ScheduledAction(v8Context, v8::Handle<v8::Function>::Cast(function), paramCount, params); delete [] params; timerId = DOMTimer::install(workerContext, action, timeout, singleShot); } else return v8::Undefined(); return v8::Integer::New(timerId); }
WorkerContextExecutionProxy* WorkerContextExecutionProxy::retrieve() { // Happens on frame destruction, check otherwise GetCurrent() will crash. if (!v8::Context::InContext()) return 0; v8::Handle<v8::Context> context = v8::Context::GetCurrent(); v8::Handle<v8::Object> global = context->Global(); global = V8DOMWrapper::lookupDOMWrapper(V8WorkerContext::GetTemplate(), global); // Return 0 if the current executing context is not the worker context. if (global.IsEmpty()) return 0; WorkerContext* workerContext = V8WorkerContext::toNative(global); return workerContext->script()->proxy(); }
WorkerScriptController* WorkerScriptController::controllerForContext() { // Happens on frame destruction, check otherwise GetCurrent() will crash. if (!v8::Context::InContext()) return 0; v8::Handle<v8::Context> context = v8::Context::GetCurrent(); v8::Handle<v8::Object> global = context->Global(); global = global->FindInstanceInPrototypeChain(V8WorkerContext::GetTemplate()); // Return 0 if the current executing context is not the worker context. if (global.IsEmpty()) return 0; WorkerContext* workerContext = V8WorkerContext::toNative(global); return workerContext->script(); }
v8::Handle<v8::Value> SetTimeoutOrInterval(const v8::Arguments& args, bool singleShot) { WorkerContext* workerContext = V8WorkerContext::toNative(args.Holder()); int argumentCount = args.Length(); if (argumentCount < 1) return v8::Undefined(); v8::Handle<v8::Value> function = args[0]; int32_t timeout = argumentCount >= 2 ? args[1]->Int32Value() : 0; int timerId; WorkerContextExecutionProxy* proxy = workerContext->script()->proxy(); if (!proxy) return v8::Undefined(); v8::Handle<v8::Context> v8Context = proxy->context(); if (function->IsString()) { if (ContentSecurityPolicy* policy = workerContext->contentSecurityPolicy()) { if (!policy->allowEval()) return v8Integer(0, args.GetIsolate()); } WTF::String stringFunction = toWebCoreString(function); timerId = DOMTimer::install(workerContext, adoptPtr(new ScheduledAction(v8Context, stringFunction, workerContext->url())), timeout, singleShot); } else if (function->IsFunction()) { size_t paramCount = argumentCount >= 2 ? argumentCount - 2 : 0; v8::Local<v8::Value>* params = 0; if (paramCount > 0) { params = new v8::Local<v8::Value>[paramCount]; for (size_t i = 0; i < paramCount; ++i) params[i] = args[i+2]; } // ScheduledAction takes ownership of actual params and releases them in its destructor. OwnPtr<ScheduledAction> action = adoptPtr(new ScheduledAction(v8Context, v8::Handle<v8::Function>::Cast(function), paramCount, params)); // FIXME: We should use a OwnArrayPtr for params. delete [] params; timerId = DOMTimer::install(workerContext, action.release(), timeout, singleShot); } else return v8::Undefined(); return v8Integer(timerId, args.GetIsolate()); }
static WorkerContextExecutionProxy* workerProxy(ScriptExecutionContext* context) { ASSERT(context->isWorkerContext()); WorkerContext* workerContext = static_cast<WorkerContext*>(context); return workerContext->script()->proxy(); }