v8::Local<v8::Value> V8EventListener::callListenerFunction( ScriptState* scriptState, v8::Local<v8::Value> jsEvent, Event* event) { ASSERT(!jsEvent.IsEmpty()); v8::Local<v8::Function> handlerFunction = getListenerFunction(scriptState); v8::Local<v8::Object> receiver = getReceiverObject(scriptState, event); if (handlerFunction.IsEmpty() || receiver.IsEmpty()) return v8::Local<v8::Value>(); if (!scriptState->getExecutionContext()->isDocument()) return v8::Local<v8::Value>(); LocalFrame* frame = toDocument(scriptState->getExecutionContext())->frame(); if (!frame) return v8::Local<v8::Value>(); // TODO(jochen): Consider moving this check into canExecuteScripts. // http://crbug.com/608641 if (scriptState->world().isMainWorld() && !frame->script().canExecuteScripts(AboutToExecuteScript)) return v8::Local<v8::Value>(); v8::Local<v8::Value> parameters[1] = {jsEvent}; v8::Local<v8::Value> result; if (!V8ScriptRunner::callFunction(handlerFunction, frame->document(), receiver, WTF_ARRAY_LENGTH(parameters), parameters, scriptState->isolate()) .ToLocal(&result)) return v8::Local<v8::Value>(); return result; }
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); InspectorInstrumentation::didCallFunction(cookie); return result; }
v8::Local<v8::Value> V8WorkerGlobalScopeEventListener::callListenerFunction(ExecutionContext* 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>(); InspectorInstrumentationCookie cookie; if (InspectorInstrumentation::timelineAgentEnabled(context)) { String resourceName("undefined"); int lineNumber = 1; v8::Handle<v8::Function> originalFunction = getBoundFunction(handlerFunction); v8::ScriptOrigin origin = originalFunction->GetScriptOrigin(); if (!origin.ResourceName().IsEmpty()) { V8TRYCATCH_FOR_V8STRINGRESOURCE_RETURN(V8StringResource<>, stringResourceName, origin.ResourceName(), v8::Local<v8::Value>()); resourceName = stringResourceName; lineNumber = originalFunction->GetScriptLineNumber() + 1; } cookie = InspectorInstrumentation::willCallFunction(context, resourceName, lineNumber); } v8::Isolate* isolate = toIsolate(context); v8::Handle<v8::Value> parameters[1] = { jsEvent }; v8::Local<v8::Value> result = V8ScriptRunner::callFunction(handlerFunction, context, receiver, WTF_ARRAY_LENGTH(parameters), parameters, isolate); InspectorInstrumentation::didCallFunction(cookie); return result; }
v8::Local<v8::Value> V8WorkerGlobalScopeEventListener::callListenerFunction(v8::Handle<v8::Value> jsEvent, Event* event) { v8::Local<v8::Function> handlerFunction = getListenerFunction(scriptState()->executionContext()); v8::Local<v8::Object> receiver = getReceiverObject(event); if (handlerFunction.IsEmpty() || receiver.IsEmpty()) return v8::Local<v8::Value>(); TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "FunctionCall", "data", devToolsTraceEventData(scriptState()->executionContext(), handlerFunction, isolate())); TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline.stack"), "CallStack", "stack", InspectorCallStackEvent::currentCallStack()); // FIXME(361045): remove InspectorInstrumentation calls once DevTools Timeline migrates to tracing. InspectorInstrumentationCookie cookie; if (InspectorInstrumentation::timelineAgentEnabled(scriptState()->executionContext())) { int scriptId = 0; String resourceName; int lineNumber = 1; GetDevToolsFunctionInfo(handlerFunction, isolate(), scriptId, resourceName, lineNumber); cookie = InspectorInstrumentation::willCallFunction(scriptState()->executionContext(), scriptId, resourceName, lineNumber); } v8::Handle<v8::Value> parameters[1] = { jsEvent }; v8::Local<v8::Value> result = V8ScriptRunner::callFunction(handlerFunction, scriptState()->executionContext(), receiver, WTF_ARRAY_LENGTH(parameters), parameters, isolate()); InspectorInstrumentation::didCallFunction(cookie); TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "UpdateCounters", "data", InspectorUpdateCountersEvent::data()); return result; }
v8::Local<v8::Value> V8WorkerContextEventListener::callListenerFunction(v8::Handle<v8::Value> jsEvent, Event* event) { v8::Local<v8::Function> handlerFunction = getListenerFunction(); v8::Local<v8::Object> receiver = getReceiverObject(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); m_proxy->trackEvent(event); return result; }
v8::Local<v8::Value> V8EventListener::callListenerFunction(ScriptExecutionContext* context, v8::Handle<v8::Value> jsEvent, Event* event) { v8::Local<v8::Function> handlerFunction = getListenerFunction(context); v8::Local<v8::Object> receiver = getReceiverObject(event); if (handlerFunction.IsEmpty() || receiver.IsEmpty()) return v8::Local<v8::Value>(); v8::Handle<v8::Value> parameters[1] = { jsEvent }; if (V8Proxy* proxy = V8Proxy::retrieve(context)) return proxy->callFunction(handlerFunction, receiver, 1, parameters); return v8::Local<v8::Value>(); }
v8::Local<v8::Value> V8EventListener::callListenerFunction(v8::Handle<v8::Value> jsEvent, Event* event) { v8::Local<v8::Function> handlerFunction = getListenerFunction(scriptState()->executionContext()); v8::Local<v8::Object> receiver = getReceiverObject(event); if (handlerFunction.IsEmpty() || receiver.IsEmpty()) return v8::Local<v8::Value>(); if (!scriptState()->executionContext()->isDocument()) return v8::Local<v8::Value>(); LocalFrame* frame = toDocument(scriptState()->executionContext())->frame(); if (!frame) return v8::Local<v8::Value>(); v8::Handle<v8::Value> parameters[1] = { jsEvent }; return frame->script().callFunction(handlerFunction, receiver, WTF_ARRAY_LENGTH(parameters), parameters); }
v8::Local<v8::Value> V8EventListener::callListenerFunction(ScriptExecutionContext* context, v8::Handle<v8::Value> jsEvent, Event* event) { v8::Local<v8::Function> handlerFunction = getListenerFunction(context); v8::Local<v8::Object> receiver = getReceiverObject(event); if (handlerFunction.IsEmpty() || receiver.IsEmpty()) return v8::Local<v8::Value>(); v8::Handle<v8::Value> parameters[1] = { jsEvent }; if (V8Proxy* proxy = V8Proxy::retrieve(context)) { Frame* frame = static_cast<Document*>(context)->frame(); if (frame->script()->canExecuteScripts(AboutToExecuteScript)) return proxy->callFunction(handlerFunction, receiver, 1, parameters); } return v8::Local<v8::Value>(); }
v8::Local<v8::Value> V8WorkerGlobalScopeEventListener::callListenerFunction(ScriptState* scriptState, v8::Local<v8::Value> jsEvent, Event* event) { ASSERT(!jsEvent.IsEmpty()); v8::Local<v8::Function> handlerFunction = getListenerFunction(scriptState); v8::Local<v8::Object> receiver = getReceiverObject(scriptState, event); if (handlerFunction.IsEmpty() || receiver.IsEmpty()) return v8::Local<v8::Value>(); v8::Local<v8::Value> parameters[1] = { jsEvent }; v8::MaybeLocal<v8::Value> maybeResult = V8ScriptRunner::callFunction(handlerFunction, scriptState->executionContext(), receiver, WTF_ARRAY_LENGTH(parameters), parameters, isolate()); TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "UpdateCounters", TRACE_EVENT_SCOPE_THREAD, "data", InspectorUpdateCountersEvent::data()); v8::Local<v8::Value> result; if (!maybeResult.ToLocal(&result)) return v8::Local<v8::Value>(); return result; }