// 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_PLATFORM_BINDINGS_CALLBACK_METHOD_RETRIEVER_H_
#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_BINDINGS_CALLBACK_METHOD_RETRIEVER_H_

#include "third_party/blink/renderer/platform/bindings/callback_function_base.h"
#include "third_party/blink/renderer/platform/heap/handle.h"
#include "v8/include/v8.h"

namespace blink {

class CallbackFunctionBase;
class ExceptionState;

// Helper class to run step 10 of custom element definition, which part of the
// algorithm is expected to be defined in Web IDL so that other standards can
// apply the same algorithm.
//
// https://html.spec.whatwg.org/C/custom-elements.html#element-definition
// step 10. Run the following substeps while catching any exceptions: ...
class PLATFORM_EXPORT CallbackMethodRetriever {
  STACK_ALLOCATED();

 public:
  explicit CallbackMethodRetriever(CallbackFunctionBase* constructor);

  // Get the prototype object from the callback function. Must be invoked prior
  // to GetMethod or GetStaticMethod.
  v8::Local<v8::Object> GetPrototypeObject(ExceptionState&);

  // Returns a function extracted from the prototype chain, or undefined.
  // Throws if the property is neither of function nor undefined.
  v8::Local<v8::Value> GetMethodOrUndefined(const StringView& method_name,
                                            ExceptionState& exception_state) {
    return GetFunctionOrUndefined(prototype_object_, method_name,
                                  exception_state);
  }

  // Returns a function extracted from the callback function, or undefined.
  // Throws if the property is neither of function nor undefined.
  v8::Local<v8::Value> GetStaticMethodOrUndefined(
      const StringView& method_name,
      ExceptionState& exception_state) {
    return GetFunctionOrUndefined(constructor_->CallbackObject(), method_name,
                                  exception_state);
  }

 private:
  // Gets |property| from |object|. Throws an exception if the property is
  // neither of function nor undefined.
  v8::Local<v8::Value> GetFunctionOrUndefined(v8::Local<v8::Object> object,
                                              const StringView& property,
                                              ExceptionState&);

  Member<CallbackFunctionBase> constructor_;
  v8::Isolate* isolate_;
  v8::Local<v8::Context> current_context_;
  v8::Local<v8::Object> prototype_object_;

  DISALLOW_COPY_AND_ASSIGN(CallbackMethodRetriever);
};

}  // namespace blink

#endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_BINDINGS_CALLBACK_METHOD_RETRIEVER_H_
