void V8WorkerContextEventListener::handleEvent(ScriptExecutionContext* context, Event* event) { if (!context) return; // The callback function on XMLHttpRequest can clear the event listener and destroys 'this' object. Keep a local reference to it. // See issue 889829. RefPtr<V8AbstractEventListener> protect(this); v8::HandleScope handleScope; WorkerContextExecutionProxy* proxy = workerProxy(context); if (!proxy) return; v8::Handle<v8::Context> v8Context = proxy->context(); if (v8Context.IsEmpty()) return; // Enter the V8 context in which to perform the event handling. v8::Context::Scope scope(v8Context); // Get the V8 wrapper for the event object. v8::Handle<v8::Value> jsEvent = toV8(event); invokeEventHandler(context, event, jsEvent); }
v8::Local<v8::Value> V8WorkerContextEventListener::callListenerFunction(ScriptExecutionContext* context, v8::Handle<v8::Value> jsEvent, Event* event) { V8GCController::checkMemoryUsage(); v8::Local<v8::Function> handlerFunction = getListenerFunction(context); v8::Local<v8::Object> receiver = getReceiverObject(context, event); if (handlerFunction.IsEmpty() || receiver.IsEmpty()) return v8::Local<v8::Value>(); InspectorInstrumentationCookie cookie; if (InspectorInstrumentation::timelineAgentEnabled(context)) { String resourceName("undefined"); int lineNumber = 1; v8::ScriptOrigin origin = handlerFunction->GetScriptOrigin(); if (!origin.ResourceName().IsEmpty()) { resourceName = toWebCoreString(origin.ResourceName()); lineNumber = handlerFunction->GetScriptLineNumber() + 1; } cookie = InspectorInstrumentation::willCallFunction(context, resourceName, lineNumber); } v8::Handle<v8::Value> parameters[1] = { jsEvent }; V8RecursionScope recursionScope(context); v8::Local<v8::Value> result = handlerFunction->Call(receiver, 1, parameters); if (WorkerContextExecutionProxy* proxy = workerProxy(context)) proxy->trackEvent(event); InspectorInstrumentation::didCallFunction(cookie); return result; }
v8::Local<v8::Value> V8WorkerContextEventListener::callListenerFunction(ScriptExecutionContext* context, v8::Handle<v8::Value> jsEvent, Event* event) { v8::Local<v8::Function> handlerFunction = getListenerFunction(context); v8::Local<v8::Object> receiver = getReceiverObject(context, event); if (handlerFunction.IsEmpty() || receiver.IsEmpty()) return v8::Local<v8::Value>(); v8::Handle<v8::Value> parameters[1] = { jsEvent }; v8::Local<v8::Value> result = handlerFunction->Call(receiver, 1, parameters); if (WorkerContextExecutionProxy* proxy = workerProxy(context)) proxy->trackEvent(event); return result; }