// Copyright 2016 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_SCRIPT_MOZJS_45_PROXY_HANDLER_H_
#define COBALT_SCRIPT_MOZJS_45_PROXY_HANDLER_H_

#include <string>

#include "base/compiler_specific.h"
#include "base/logging.h"
#include "third_party/mozjs-45/js/public/Proxy.h"
#include "third_party/mozjs-45/js/src/jsapi.h"
#include "third_party/mozjs-45/js/src/proxy/Proxy.h"

namespace cobalt {
namespace script {
namespace mozjs {

// SpiderMonkey has a concept of a Proxy object which is associated with another
// arbitrary object and a js::BaseProxyHandler interface. The handler interface
// provides a number of traps for providing custom implementations of
// fundamental ECMAScript operations such as getPropertyDescriptor.
//
// The implementation of each trap in the js::DirectProxyHandler class simply
// forwards each trap to the target object.
//
// In defining a JSClass a number of function pointers can be set that will
// be called when getting, setting, deleting, etc. a property, but these do not
// map well onto the Web IDL spec for implementing interfaces that support named
// and indexed properties.
//
// See third_party/mozjs-45/js/public/Proxy.h for more details.
//
// ProxyHandler provides custom traps for getPropertyDescriptor, delete_, and
// enumerate to implement interfaces that support named and indexed properties.
class ProxyHandler : public js::DirectProxyHandler {
 public:
  typedef bool (*IsSupportedIndexFunction)(JSContext*, JS::HandleObject,
                                           uint32_t);
  typedef bool (*IsSupportedNameFunction)(JSContext*, JS::HandleObject,
                                          const std::string&);
  typedef void (*EnumerateSupportedIndexesFunction)(JSContext*,
                                                    JS::HandleObject,
                                                    JS::AutoIdVector*);
  typedef void (*EnumerateSupportedNamesFunction)(JSContext*, JS::HandleObject,
                                                  JS::AutoIdVector*);
  typedef bool (*IndexedDeleteFunction)(JSContext*, JS::HandleObject, uint32_t);
  typedef bool (*NamedDeleteFunction)(JSContext*, JS::HandleObject,
                                      const std::string&);

  // Hooks for interfaces that support indexed properties.
  struct IndexedPropertyHooks {
    IsSupportedIndexFunction is_supported;
    EnumerateSupportedIndexesFunction enumerate_supported;
    JSGetterOp getter;
    JSSetterOp setter;
    IndexedDeleteFunction deleter;
  };

  // Hooks for interfaces that support named properties.
  struct NamedPropertyHooks {
    IsSupportedNameFunction is_supported;
    EnumerateSupportedNamesFunction enumerate_supported;
    JSGetterOp getter;
    JSSetterOp setter;
    NamedDeleteFunction deleter;
  };

  static JSObject* NewProxy(JSContext* context, ProxyHandler* handler,
                            JSObject* object, JSObject* prototype);

  // Construct a new ProxyHandler with the provided hooks.
  ProxyHandler(const IndexedPropertyHooks& indexed_hooks,
               const NamedPropertyHooks& named_hooks);

  // Overridden standard internal methods.
  bool getOwnPropertyDescriptor(
      JSContext* context, JS::HandleObject proxy, JS::HandleId id,
      JS::MutableHandle<JSPropertyDescriptor> descriptor) const override;

  bool defineProperty(JSContext* context, JS::HandleObject proxy,
                      JS::HandleId id,
                      js::Handle<JSPropertyDescriptor> descriptor,
                      JS::ObjectOpResult& result  // NOLINT[runtime/references]
                      ) const override;           // NOLINT[whitespace/parens]
  bool ownPropertyKeys(JSContext* context, JS::HandleObject proxy,
                       JS::AutoIdVector& properties)
      const override;  // NOLINT[runtime/references]
  bool delete_(JSContext* context, JS::HandleObject proxy, JS::HandleId id,
               JS::ObjectOpResult& result)  // NOLINT(runtime/references)
      const override;

  // Standard methods that were overridden in DirectProxyHandler. These are
  // implemented in terms of the standard internal methods in BaseProxyHandler
  // so ensure that we use those, so we don't have to override all of these.
  // TODO: Consider overriding some of these as performance optimizations if
  // necessary.
  bool enumerate(JSContext* context, JS::HandleObject proxy,
                 JS::MutableHandleObject objp) const override {
    return js::BaseProxyHandler::enumerate(context, proxy, objp);
  }

  bool has(JSContext* context, JS::HandleObject proxy, JS::HandleId id,
           bool* bp) const override {
    return js::BaseProxyHandler::has(context, proxy, id, bp);
  }

  bool get(JSContext* context, JS::HandleObject proxy, JS::HandleValue receiver,
           JS::HandleId id, JS::MutableHandleValue vp) const override {
    return js::BaseProxyHandler::get(context, proxy, receiver, id, vp);
  }

  bool set(JSContext* context, JS::HandleObject proxy, JS::HandleId id,
           JS::HandleValue v, JS::HandleValue receiver,
           JS::ObjectOpResult& result)  // NOLINT(runtime/references)
      const override {
    return js::BaseProxyHandler::set(context, proxy, id, v, receiver, result);
  }

  // SpiderMonkey extensions that should also be implemented in terms of the
  // standard methods, as described above.
  bool getPropertyDescriptor(
      JSContext* context, JS::HandleObject proxy, JS::HandleId id,
      JS::MutableHandle<JSPropertyDescriptor> descriptor) const override {
    return js::BaseProxyHandler::getPropertyDescriptor(context, proxy, id,
                                                       descriptor);
  }
  bool hasOwn(JSContext* context, JS::HandleObject proxy, JS::HandleId id,
              bool* bp) const override {
    return js::BaseProxyHandler::hasOwn(context, proxy, id, bp);
  }
  bool getOwnEnumerablePropertyKeys(
      JSContext* context, JS::HandleObject proxy,
      JS::AutoIdVector& props) const override {  // NOLINT[runtime/references]
    return js::BaseProxyHandler::getOwnEnumerablePropertyKeys(context, proxy,
                                                              props);
  }

  bool has_custom_property() const { return has_custom_property_; }

 private:
  // https://heycam.github.io/webidl/#LegacyPlatformObjectGetOwnProperty
  // This is used to support named and indexed properties.
  // Returns false on failure.
  bool LegacyPlatformObjectGetOwnPropertyDescriptor(
      JSContext* context, JS::HandleObject proxy, JS::HandleId id,
      JS::MutableHandle<JSPropertyDescriptor> descriptor) const;

  bool supports_named_properties() const {
    return named_property_hooks_.getter != NULL;
  }

  bool supports_indexed_properties() const {
    return indexed_property_hooks_.getter != NULL;
  }

  bool IsSupportedIndex(JSContext* context, JS::HandleObject object,
                        uint32_t index) const {
    DCHECK(indexed_property_hooks_.is_supported);
    return indexed_property_hooks_.is_supported(context, object, index);
  }

  bool IsSupportedName(JSContext* context, JS::HandleObject object,
                       const std::string& name) const {
    DCHECK(named_property_hooks_.is_supported);
    return named_property_hooks_.is_supported(context, object, name);
  }

  bool IsArrayIndexPropertyName(JSContext* context,
                                JS::HandleValue property_value,
                                uint32_t* out_index) const;

  bool IsNamedPropertyVisible(JSContext* context, JS::HandleObject object,
                              const std::string& property_name) const;

  IndexedPropertyHooks indexed_property_hooks_;
  NamedPropertyHooks named_property_hooks_;
  // Set to true if this object may have a custom property set on it.
  bool has_custom_property_;
};

}  // namespace mozjs
}  // namespace script
}  // namespace cobalt

#endif  // COBALT_SCRIPT_MOZJS_45_PROXY_HANDLER_H_
