tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

DeadObjectProxy.h (4236B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
      2 * vim: set ts=8 sts=2 et sw=2 tw=80:
      3 * This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this
      5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 #ifndef proxy_DeadObjectProxy_h
      8 #define proxy_DeadObjectProxy_h
      9 
     10 #include "js/Proxy.h"
     11 
     12 namespace js {
     13 
     14 class ProxyObject;
     15 
     16 enum DeadObjectProxyFlags {
     17  DeadObjectProxyIsCallable = 1 << 0,
     18  DeadObjectProxyIsConstructor = 1 << 1,
     19  DeadObjectProxyIsBackgroundFinalized = 1 << 2
     20 };
     21 
     22 class DeadObjectProxy : public NurseryAllocableProxyHandler {
     23 public:
     24  explicit constexpr DeadObjectProxy()
     25      : NurseryAllocableProxyHandler(&family) {}
     26 
     27  /* Standard internal methods. */
     28  virtual bool getOwnPropertyDescriptor(
     29      JSContext* cx, JS::HandleObject wrapper, JS::HandleId id,
     30      JS::MutableHandle<mozilla::Maybe<JS::PropertyDescriptor>> desc)
     31      const override;
     32  virtual bool defineProperty(JSContext* cx, JS::HandleObject wrapper,
     33                              JS::HandleId id,
     34                              JS::Handle<JS::PropertyDescriptor> desc,
     35                              JS::ObjectOpResult& result) const override;
     36  virtual bool ownPropertyKeys(JSContext* cx, JS::HandleObject wrapper,
     37                               JS::MutableHandleIdVector props) const override;
     38  virtual bool delete_(JSContext* cx, JS::HandleObject wrapper, JS::HandleId id,
     39                       JS::ObjectOpResult& result) const override;
     40  virtual bool getPrototype(JSContext* cx, JS::HandleObject proxy,
     41                            JS::MutableHandleObject protop) const override;
     42  virtual bool getPrototypeIfOrdinary(
     43      JSContext* cx, JS::HandleObject proxy, bool* isOrdinary,
     44      JS::MutableHandleObject protop) const override;
     45  virtual bool preventExtensions(JSContext* cx, JS::HandleObject proxy,
     46                                 JS::ObjectOpResult& result) const override;
     47  virtual bool isExtensible(JSContext* cx, JS::HandleObject proxy,
     48                            bool* extensible) const override;
     49  virtual bool call(JSContext* cx, JS::HandleObject proxy,
     50                    const JS::CallArgs& args) const override;
     51  virtual bool construct(JSContext* cx, JS::HandleObject proxy,
     52                         const JS::CallArgs& args) const override;
     53 
     54  /* SpiderMonkey extensions. */
     55  // BaseProxyHandler::enumerate will throw by calling ownKeys.
     56  virtual bool nativeCall(JSContext* cx, JS::IsAcceptableThis test,
     57                          JS::NativeImpl impl,
     58                          const JS::CallArgs& args) const override;
     59  virtual bool getBuiltinClass(JSContext* cx, JS::HandleObject proxy,
     60                               ESClass* cls) const override;
     61  virtual bool isArray(JSContext* cx, JS::HandleObject proxy,
     62                       JS::IsArrayAnswer* answer) const override;
     63  virtual const char* className(JSContext* cx,
     64                                JS::HandleObject proxy) const override;
     65  virtual JSString* fun_toString(JSContext* cx, JS::HandleObject proxy,
     66                                 bool isToSource) const override;
     67  virtual RegExpShared* regexp_toShared(JSContext* cx,
     68                                        JS::HandleObject proxy) const override;
     69 
     70  // Use the regular paths for private values
     71  virtual bool useProxyExpandoObjectForPrivateFields() const override {
     72    return false;
     73  }
     74 
     75  virtual bool isCallable(JSObject* obj) const override {
     76    return flags(obj) & DeadObjectProxyIsCallable;
     77  }
     78  virtual bool isConstructor(JSObject* obj) const override {
     79    return flags(obj) & DeadObjectProxyIsConstructor;
     80  }
     81 
     82  virtual bool finalizeInBackground(const JS::Value& priv) const override {
     83    return priv.toInt32() & DeadObjectProxyIsBackgroundFinalized;
     84  }
     85 
     86  static const DeadObjectProxy singleton;
     87  static const char family;
     88 
     89 private:
     90  static int32_t flags(JSObject* obj) { return GetProxyPrivate(obj).toInt32(); }
     91 };
     92 
     93 bool IsDeadProxyObject(const JSObject* obj);
     94 
     95 JS::Value DeadProxyTargetValue(JSObject* obj);
     96 
     97 JSObject* NewDeadProxyObject(JSContext* cx, JSObject* origObj = nullptr);
     98 
     99 } /* namespace js */
    100 
    101 #endif /* proxy_DeadObjectProxy_h */