void V8EventTarget::addEventListenerMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& info) { ExceptionState exceptionState(ExceptionState::ExecutionContext, "addEventListener", "EventTarget", info.Holder(), info.GetIsolate()); if (UNLIKELY(info.Length() < 2)) { setMinimumArityTypeError(exceptionState, 2, info.Length()); exceptionState.throwIfNeeded(); return; } EventTarget* impl = V8EventTarget::toImpl(info.Holder()); if (!BindingSecurity::shouldAllowAccessTo(info.GetIsolate(), callingDOMWindow(info.GetIsolate()), impl, exceptionState)) { exceptionState.throwIfNeeded(); return; } V8StringResource<> type; RefPtrWillBeRawPtr<EventListener> listener; EventListenerOptionsOrBoolean options; { type = info[0]; if (!type.prepare()) return; listener = V8EventListenerList::getEventListener(ScriptState::current(info.GetIsolate()), info[1], false, ListenerFindOrCreate); // TODO(dtapuska): This custom binding code can be eliminated once // EventListenerOptions runtime enabled feature is removed. // http://crbug.com/545163 if (UNLIKELY(info.Length() <= 2) || isUndefinedOrNull(info[2])) { addEventListenerMethodPrologueCustom(info, impl); impl->addEventListener(type, listener); addEventListenerMethodEpilogueCustom(info, impl); return; } V8EventListenerOptionsOrBoolean::toImpl(info.GetIsolate(), info[2], options, UnionTypeConversionMode::NotNullable, exceptionState); if (exceptionState.throwIfNeeded()) return; } addEventListenerMethodPrologueCustom(info, impl); impl->addEventListener(type, listener, options); addEventListenerMethodEpilogueCustom(info, impl); }
static v8::Handle<v8::Value> v8addEventListener( const v8::Arguments& arguments ){ if( arguments.Length() > 2 ){ v8::Local<v8::External> external = v8::Local<v8::External>::Cast( arguments.This()->GetInternalField(0) ); EventTarget* object = static_cast<EventTarget*>( external->Value() ); v8::Local<v8::String> typeStr = v8::Local<v8::String>::Cast(arguments[0]); v8::String::AsciiValue type(typeStr); v8::Local<v8::Function> cb = v8::Local<v8::Function>::Cast(arguments[1]); v8::Persistent<v8::Function> handler = v8::Persistent<v8::Function>::New(cb); object->addEventListener( *type, handler, false ); } return v8::Undefined(); }
JSValue* jsEventTargetAddEventListener(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args) { Node* eventNode = 0; EventTarget* eventTarget = 0; if (!retrieveEventTargetAndCorrespondingNode(exec, thisValue, eventNode, eventTarget)) return throwError(exec, TypeError); Frame* frame = eventNode->document()->frame(); if (!frame) return jsUndefined(); if (RefPtr<JSEventListener> listener = toJSDOMWindow(frame)->findOrCreateJSEventListener(exec, args.at(exec, 1))) eventTarget->addEventListener(args.at(exec, 0)->toString(exec), listener.release(), args.at(exec, 2)->toBoolean(exec)); return jsUndefined(); }