// 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_EVENT_HANDLER_FOR_CONTENT_ATTRIBUTE_H_
#define THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_JS_EVENT_HANDLER_FOR_CONTENT_ATTRIBUTE_H_

#include "third_party/blink/renderer/bindings/core/v8/js_event_handler.h"
#include "third_party/blink/renderer/platform/wtf/text/text_position.h"

namespace blink {

// |JSEventHandlerForContentAttribute| supports lazy compilation for content
// attribute. This performs in the same way as |JSEventHandler| after it gets
// compiled.
class JSEventHandlerForContentAttribute final : public JSEventHandler {
 public:
  static JSEventHandlerForContentAttribute* Create(
      const AtomicString& function_name,
      const String& code,
      const String& source_url,
      const TextPosition& position,
      v8::Isolate* isolate,
      DOMWrapperWorld& world,
      HandlerType type = HandlerType::kEventHandler) {
    return new JSEventHandlerForContentAttribute(
        isolate, world, function_name, code, source_url, position, type);
  }

  // blink::EventListener overrides:
  bool IsEventHandlerForContentAttribute() const override { return true; }

  // blink::JSBasedEventListener overrides:
  v8::Local<v8::Value> GetListenerObject(EventTarget&) override;
  std::unique_ptr<SourceLocation> GetSourceLocation(EventTarget&) override;

  const String& Code() const override { return code_; }

 protected:
  // blink::JSBasedEventListener override:
  v8::Isolate* GetIsolate() const override { return isolate_; }
  ScriptState* GetScriptState() const override {
    DCHECK(HasCompiledHandler());
    return JSEventHandler::GetScriptState();
  }
  DOMWrapperWorld& GetWorld() const override { return *world_; }

 private:
  JSEventHandlerForContentAttribute(v8::Isolate* isolate,
                                    DOMWrapperWorld& world,
                                    const AtomicString& function_name,
                                    const String& code,
                                    const String& source_url,
                                    const TextPosition& position,
                                    HandlerType type)
      : JSEventHandler(type),
        did_compile_(false),
        function_name_(function_name),
        code_(code),
        source_url_(source_url),
        position_(position),
        isolate_(isolate),
        world_(&world) {}

  // Implements Step 3. of "get the current value of the event handler".
  // The compiled v8::Function is returned and |JSEventHandler::event_handler_|
  // gets initialized with it if lazy compilation succeeds.
  // Otherwise, v8::Null is returned.
  // https://html.spec.whatwg.org/multipage/webappapis.html#getting-the-current-value-of-the-event-handler
  v8::Local<v8::Value> GetCompiledHandler(EventTarget&);

  // Lazy compilation for content attribute should be tried only once, but we
  // cannot see whether it had never tried to compile or it has already failed
  // when |HasCompiledHandler()| returns false. |did_compile_| is used for
  // checking that.
  bool did_compile_;
  const AtomicString function_name_;
  String code_;
  String source_url_;
  TextPosition position_;
  v8::Isolate* isolate_;
  scoped_refptr<DOMWrapperWorld> world_;
};

}  // namespace blink

#endif  // THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_JS_EVENT_HANDLER_FOR_CONTENT_ATTRIBUTE_H_
