// 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.

#ifndef THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_JS_BASED_EVENT_LISTENER_H_
#define THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_JS_BASED_EVENT_LISTENER_H_

#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/dom/events/event_listener.h"
#include "v8/include/v8.h"

namespace blink {

class DOMWrapperWorld;
class Event;
class EventTarget;
class SourceLocation;

// |JSBasedEventListener| is the base class for JS-based event listeners,
// i.e. EventListener and EventHandler in the standards.
// This provides the essential APIs of JS-based event listeners and also
// implements the common features.
class CORE_EXPORT JSBasedEventListener : public EventListener {
 public:
  static const JSBasedEventListener* Cast(const EventListener* listener) {
    return listener && listener->IsJSBased()
               ? static_cast<const JSBasedEventListener*>(listener)
               : nullptr;
  }

  static JSBasedEventListener* Cast(EventListener* listener) {
    return const_cast<JSBasedEventListener*>(
        Cast(const_cast<const EventListener*>(listener)));
  }

  // TODO(bindings): consider to remove this (and use GetListenerObject()
  // instead) because this method is used in mostly only generated classes.
  static v8::Local<v8::Value> GetListenerOrNull(v8::Isolate* isolate,
                                                EventTarget* event_target,
                                                EventListener* listener) {
    if (auto* v8_listener = Cast(listener))
      return v8_listener->GetListenerObject(*event_target);
    return v8::Null(isolate);
  }

  ~JSBasedEventListener() override;

  // blink::EventListener overrides:
  bool BelongsToTheCurrentWorld(ExecutionContext*) const final;
  // Implements step 2. of "inner invoke".
  // See: https://dom.spec.whatwg.org/#concept-event-listener-inner-invoke
  void Invoke(ExecutionContext*, Event*) final;

  // |GetListenerObject()| and |GetEffectiveFunction()| may cause JS in the
  // content attribute to get compiled, potentially unsuccessfully.
  //
  // Implements "get the current value of the event handler".
  // https://html.spec.whatwg.org/multipage/webappapis.html#getting-the-current-value-of-the-event-handler
  // Returns v8::Null with firing error event instead of throwing an exception
  // on failing to compile the uncompiled script body in eventHandler's value.
  // Also, this can return empty because of crbug.com/881688 .
  virtual v8::Local<v8::Value> GetListenerObject(EventTarget&) = 0;

  // Returns v8::Function that handles invoked event or v8::Undefined without
  // throwing any exception.
  virtual v8::Local<v8::Value> GetEffectiveFunction(EventTarget&) = 0;

  // Only DevTools is allowed to use this method.
  DOMWrapperWorld& GetWorldForInspector() const { return GetWorld(); }

  virtual std::unique_ptr<SourceLocation> GetSourceLocation(EventTarget&);

 protected:
  explicit JSBasedEventListener(ListenerType);
  virtual v8::Isolate* GetIsolate() const = 0;
  // Returns the ScriptState of the relevant realm of the callback object.
  // Must be used only when it's sure that the callback object is the same
  // origin-domain.
  virtual ScriptState* GetScriptState() const = 0;
  // Returns the ScriptState of the relevant realm of the callback object iff
  // the callback is the same origin-domain. Otherwise, reports the error and
  // returns nullptr.
  virtual ScriptState* GetScriptStateOrReportError(
      const char* operation) const = 0;
  virtual DOMWrapperWorld& GetWorld() const = 0;

 private:
  // Performs "call a user object's operation", required in "inner-invoke".
  // "The event handler processing algorithm" corresponds to this in the case of
  // EventHandler.
  // This may throw an exception on invoking the listener.
  // See step 2-10:
  // https://dom.spec.whatwg.org/#concept-event-listener-inner-invoke
  virtual void InvokeInternal(EventTarget&,
                              Event&,
                              v8::Local<v8::Value> js_event) = 0;
};

}  // namespace blink

#endif  // THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_JS_BASED_EVENT_LISTENER_H_
