blob: a4aca83a4cb5a5657533fc797b1dca99e7957195 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/bindings/core/v8/js_event_listener.h"
#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
#include "third_party/blink/renderer/core/dom/events/event.h"
#include "third_party/blink/renderer/core/dom/events/event_target.h"
namespace blink {
v8::Local<v8::Value> JSEventListener::GetEffectiveFunction(
EventTarget& target) {
v8::Isolate* isolate = GetIsolate();
v8::Local<v8::Value> v8_listener = GetListenerObject(target);
if (v8_listener.IsEmpty())
return v8::Undefined(isolate);
if (v8_listener->IsFunction())
return GetBoundFunction(v8_listener.As<v8::Function>());
if (v8_listener->IsObject()) {
// Do not propagate any exceptions.
v8::TryCatch try_catch(isolate);
v8::Local<v8::Value> property;
// Try the "handleEvent" method (EventListener interface).
// v8::Object::Get() may throw if "handleEvent" is an accessor and its
// getter throws.
if (v8_listener.As<v8::Object>()
->Get(isolate->GetCurrentContext(),
V8AtomicString(isolate, "handleEvent"))
.ToLocal(&property) &&
property->IsFunction()) {
return GetBoundFunction(property.As<v8::Function>());
}
}
return v8::Undefined(isolate);
}
// https://dom.spec.whatwg.org/#concept-event-listener-inner-invoke
void JSEventListener::CallListenerFunction(EventTarget&,
Event& event,
v8::Local<v8::Value> js_event) {
// Step 10: Call a listener with event's currentTarget as receiver and event
// and handle errors if thrown.
v8::Maybe<void> maybe_result =
event_listener_->handleEvent(event.currentTarget(), &event);
ALLOW_UNUSED_LOCAL(maybe_result);
}
void JSEventListener::Trace(blink::Visitor* visitor) {
visitor->Trace(event_listener_);
JSBasedEventListener::Trace(visitor);
}
} // namespace blink