Class ScriptableObject

java.lang.Object
org.mozilla.javascript.ScriptableObject
All Implemented Interfaces:
Serializable, ConstProperties, DebuggableObject, Scriptable, SymbolScriptable
Direct Known Subclasses:
BindingsObject, IdScriptableObject, JavaConstructorObject, JavaFunctionObject, JavaObjectWrapper, NativeArrayBuffer, NativeArrayBufferView, NativeJavaPackage, NativeJSON, NativePromise, NativeSymbol

public abstract class ScriptableObject extends Object implements Scriptable, SymbolScriptable, Serializable, DebuggableObject, ConstProperties
This is the default implementation of the Scriptable interface. This class provides convenient default behavior that makes it easier to define host objects.

Various properties and methods of JavaScript objects can be conveniently defined using methods of ScriptableObject.

Classes extending ScriptableObject must define the getClassName method.

Author:
Norris Boyd
See Also:
  • Field Details

  • Constructor Details

    • ScriptableObject

      public ScriptableObject()
    • ScriptableObject

      public ScriptableObject(Scriptable scope, Scriptable prototype)
  • Method Details

    • buildDataDescriptor

      protected static ScriptableObject buildDataDescriptor(Scriptable scope, Object value, int attributes)
    • setCommonDescriptorProperties

      protected void setCommonDescriptorProperties(int attributes, boolean defineWritable)
    • getTypeOf

      public String getTypeOf()
      Gets the value that will be returned by calling the typeof operator on this object.
      Returns:
      default is "object" unless avoidObjectDetection() is true in which case it returns "undefined"
    • getClassName

      public abstract String getClassName()
      Return the name of the class.

      This is typically the same name as the constructor. Classes extending ScriptableObject must implement this abstract method.

      Specified by:
      getClassName in interface Scriptable
    • has

      public boolean has(String name, Scriptable start)
      Returns true if the named property is defined.
      Specified by:
      has in interface Scriptable
      Parameters:
      name - the name of the property
      start - the object in which the lookup began
      Returns:
      true if and only if the property was found in the object
      See Also:
    • has

      public boolean has(int index, Scriptable start)
      Returns true if the property index is defined.
      Specified by:
      has in interface Scriptable
      Parameters:
      index - the numeric index for the property
      start - the object in which the lookup began
      Returns:
      true if and only if the property was found in the object
      See Also:
    • has

      public boolean has(Symbol key, Scriptable start)
      A version of "has" that supports symbols.
      Specified by:
      has in interface SymbolScriptable
    • get

      public Object get(String name, Scriptable start)
      Returns the value of the named property or NOT_FOUND.

      If the property was created using defineProperty, the appropriate getter method is called.

      Specified by:
      get in interface Scriptable
      Parameters:
      name - the name of the property
      start - the object in which the lookup began
      Returns:
      the value of the property (may be null), or NOT_FOUND
      See Also:
    • get

      public Object get(int index, Scriptable start)
      Returns the value of the indexed property or NOT_FOUND.
      Specified by:
      get in interface Scriptable
      Parameters:
      index - the numeric index for the property
      start - the object in which the lookup began
      Returns:
      the value of the property (may be null), or NOT_FOUND
      See Also:
    • get

      public Object get(Symbol key, Scriptable start)
      Another version of Get that supports Symbol keyed properties.
      Specified by:
      get in interface SymbolScriptable
    • put

      public void put(String name, Scriptable start, Object value)
      Sets the value of the named property, creating it if need be.

      If the property was created using defineProperty, the appropriate setter method is called.

      If the property's attributes include READONLY, no action is taken. This method will actually set the property in the start object.

      Specified by:
      put in interface Scriptable
      Parameters:
      name - the name of the property
      start - the object whose property is being set
      value - value to set the property to
      See Also:
    • put

      public void put(int index, Scriptable start, Object value)
      Sets the value of the indexed property, creating it if need be.
      Specified by:
      put in interface Scriptable
      Parameters:
      index - the numeric index for the property
      start - the object whose property is being set
      value - value to set the property to
      See Also:
    • put

      public void put(Symbol key, Scriptable start, Object value)
      Implementation of put required by SymbolScriptable objects.
      Specified by:
      put in interface SymbolScriptable
    • delete

      public void delete(String name)
      Removes a named property from the object.

      If the property is not found, or it has the PERMANENT attribute, no action is taken.

      Specified by:
      delete in interface Scriptable
      Parameters:
      name - the name of the property
      See Also:
    • delete

      public void delete(int index)
      Removes the indexed property from the object.

      If the property is not found, or it has the PERMANENT attribute, no action is taken.

      Specified by:
      delete in interface Scriptable
      Parameters:
      index - the numeric index for the property
      See Also:
    • delete

      public void delete(Symbol key)
      Removes an object like the others, but using a Symbol as the key.
      Specified by:
      delete in interface SymbolScriptable
    • putConst

      public void putConst(String name, Scriptable start, Object value)
      Sets the value of the named const property, creating it if need be.

      If the property was created using defineProperty, the appropriate setter method is called.

      If the property's attributes include READONLY, no action is taken. This method will actually set the property in the start object.

      Specified by:
      putConst in interface ConstProperties
      Parameters:
      name - the name of the property
      start - the object whose property is being set
      value - value to set the property to
      See Also:
    • defineConst

      public void defineConst(String name, Scriptable start)
      Description copied from interface: ConstProperties
      Reserves a definition spot for a const. This will set up a definition of the const property, but set its value to undefined. The semantics of the start parameter is the same as for putConst.
      Specified by:
      defineConst in interface ConstProperties
      Parameters:
      name - The name of the property.
      start - The object whose property is being reserved.
    • isConst

      public boolean isConst(String name)
      Returns true if the named property is defined as a const on this object.
      Specified by:
      isConst in interface ConstProperties
      Parameters:
      name -
      Returns:
      true if the named property is defined as a const, false otherwise.
    • getAttributes

      @Deprecated public final int getAttributes(String name, Scriptable start)
      Deprecated.
      Use getAttributes(String name). The engine always ignored the start argument.
    • getAttributes

      @Deprecated public final int getAttributes(int index, Scriptable start)
      Deprecated.
      Use getAttributes(int index). The engine always ignored the start argument.
    • setAttributes

      @Deprecated public final void setAttributes(String name, Scriptable start, int attributes)
      Deprecated.
      Use setAttributes(String name, int attributes). The engine always ignored the start argument.
    • setAttributes

      @Deprecated public void setAttributes(int index, Scriptable start, int attributes)
      Deprecated.
      Use setAttributes(int index, int attributes). The engine always ignored the start argument.
    • getAttributes

      public int getAttributes(String name)
      Get the attributes of a named property.

      The property is specified by name as defined for has.

      Parameters:
      name - the identifier for the property
      Returns:
      the bitset of attributes
      Throws:
      EvaluatorException - if the named property is not found
      See Also:
    • getAttributes

      public int getAttributes(int index)
      Get the attributes of an indexed property.
      Parameters:
      index - the numeric index for the property
      Returns:
      the bitset of attributes
      Throws:
      EvaluatorException - if the named property is not found is not found
      See Also:
    • getAttributes

      public int getAttributes(Symbol sym)
    • setAttributes

      public void setAttributes(String name, int attributes)
      Set the attributes of a named property.

      The property is specified by name as defined for has.

      The possible attributes are READONLY, DONTENUM, and PERMANENT. Combinations of attributes are expressed by the bitwise OR of attributes. EMPTY is the state of no attributes set. Any unused bits are reserved for future use.

      Parameters:
      name - the name of the property
      attributes - the bitset of attributes
      Throws:
      EvaluatorException - if the named property is not found
      See Also:
    • setAttributes

      public void setAttributes(int index, int attributes)
      Set the attributes of an indexed property.
      Parameters:
      index - the numeric index for the property
      attributes - the bitset of attributes
      Throws:
      EvaluatorException - if the named property is not found
      See Also:
    • setAttributes

      public void setAttributes(Symbol key, int attributes)
      Set attributes of a Symbol-keyed property.
    • setGetterOrSetter

      public void setGetterOrSetter(String name, int index, Callable getterOrSetter, boolean isSetter)
      Implement the legacy "__defineGetter__" and "__defineSetter__" methods.
    • getGetterOrSetter

      public Object getGetterOrSetter(String name, int index, Scriptable scope, boolean isSetter)
      Get the getter or setter for a given property. Used by __lookupGetter__ and __lookupSetter__.
      Parameters:
      name - Name of the object. If nonnull, index must be 0.
      index - Index of the object. If nonzero, name must be null.
      scope - the current scope.
      isSetter - If true, return the setter, otherwise return the getter.
      Returns:
      Undefined.instance if the property does not exist. Otherwise returns either the getter or the setter for the property, depending on the value of isSetter (may be undefined if unset).
      Throws:
      IllegalArgumentException - if both name and index are nonnull and nonzero respectively.
    • getGetterOrSetter

      @Deprecated public Object getGetterOrSetter(String name, int index, boolean isSetter)
      Deprecated.
      since 1.7.14. Use the form with the scope to ensure consistent function prototype handling in all cases.
      Get the getter or setter for a given property. Used by __lookupGetter__ and __lookupSetter__.
      Parameters:
      name - Name of the object. If nonnull, index must be 0.
      index - Index of the object. If nonzero, name must be null.
      isSetter - If true, return the setter, otherwise return the getter.
      Returns:
      Null if the property does not exist. Otherwise returns either the getter or the setter for the property, depending on the value of isSetter (may be undefined if unset).
      Throws:
      IllegalArgumentException - if both name and index are nonnull and nonzero respectively.
    • isGetterOrSetter

      protected boolean isGetterOrSetter(String name, int index, boolean setter)
      Returns whether a property is a getter or a setter
      Parameters:
      name - property name
      index - property index
      setter - true to check for a setter, false for a getter
      Returns:
      whether the property is a getter or a setter
    • setExternalArrayData

      public void setExternalArrayData(ExternalArrayData array)
      Attach the specified object to this object, and delegate all indexed property lookups to it. In other words, if the object has 3 elements, then an attempt to look up or modify "[0]", "[1]", or "[2]" will be delegated to this object. Additional indexed properties outside the range specified, and additional non-indexed properties, may still be added. The object specified must implement the ExternalArrayData interface.
      Parameters:
      array - the List to use for delegated property access. Set this to null to revert back to regular property access.
      Since:
      1.7.6
    • getExternalArrayData

      public ExternalArrayData getExternalArrayData()
      Return the array that was previously set by the call to "setExternalArrayData".
      Returns:
      the array, or null if it was never set
      Since:
      1.7.6
    • getExternalArrayLength

      public Object getExternalArrayLength()
      This is a function used by setExternalArrayData to dynamically get the "length" property value.
    • getPrototype

      public Scriptable getPrototype()
      Returns the prototype of the object.
      Specified by:
      getPrototype in interface Scriptable
      Returns:
      the prototype
    • setPrototype

      public void setPrototype(Scriptable m)
      Sets the prototype of the object.
      Specified by:
      setPrototype in interface Scriptable
      Parameters:
      m - the prototype to set
    • getParentScope

      public Scriptable getParentScope()
      Returns the parent (enclosing) scope of the object.
      Specified by:
      getParentScope in interface Scriptable
      Returns:
      the parent scope
    • setParentScope

      public void setParentScope(Scriptable m)
      Sets the parent (enclosing) scope of the object.
      Specified by:
      setParentScope in interface Scriptable
      Parameters:
      m - the parent scope to set
    • getIds

      public Object[] getIds()
      Returns an array of ids for the properties of the object.

      Any properties with the attribute DONTENUM are not listed.

      Specified by:
      getIds in interface Scriptable
      Returns:
      an array of java.lang.Objects with an entry for every listed property. Properties accessed via an integer index will have a corresponding Integer entry in the returned array. Properties accessed by a String will have a String entry in the returned array.
    • getAllIds

      public Object[] getAllIds()
      Returns an array of ids of all non-Symbol properties of the object.

      All non-Symbol properties, even those with attribute DONTENUM, are listed.

      Specified by:
      getAllIds in interface DebuggableObject
      Returns:
      an array of java.lang.Objects with an entry for every non-Symbol property. Properties accessed via an integer index will have a corresponding Integer entry in the returned array. Properties accessed by a String will have a String entry in the returned array.
    • getDefaultValue

      public Object getDefaultValue(Class<?> typeHint)
      Implements the [[DefaultValue]] internal method.

      Note that the toPrimitive conversion is a no-op for every type other than Object, for which [[DefaultValue]] is called. See ECMA 9.1.

      A hint of null means "no hint".

      Specified by:
      getDefaultValue in interface Scriptable
      Parameters:
      typeHint - the type hint
      Returns:
      the default value for the object

      See ECMA 8.6.2.6.

    • getDefaultValue

      public static Object getDefaultValue(Scriptable object, Class<?> typeHint)
    • hasInstance

      public boolean hasInstance(Scriptable instance)
      Implements the instanceof operator.

      This operator has been proposed to ECMA.

      Specified by:
      hasInstance in interface Scriptable
      Parameters:
      instance - The value that appeared on the LHS of the instanceof operator
      Returns:
      true if "this" appears in value's prototype chain
    • avoidObjectDetection

      public boolean avoidObjectDetection()
      Emulate the SpiderMonkey (and Firefox) feature of allowing custom objects to avoid detection by normal "object detection" code patterns. This is used to implement document.all. See https://bugzilla.mozilla.org/show_bug.cgi?id=412247. This is an analog to JOF_DETECTING from SpiderMonkey; see https://bugzilla.mozilla.org/show_bug.cgi?id=248549. Other than this special case, embeddings should return false.
      Returns:
      true if this object should avoid object detection
      Since:
      1.7R1
    • equivalentValues

      protected Object equivalentValues(Object value)
      Custom == operator. Must return Scriptable.NOT_FOUND if this object does not have custom equality operator for the given value, Boolean.TRUE if this object is equivalent to value, Boolean.FALSE if this object is not equivalent to value.

      The default implementation returns Boolean.TRUE if this == value or Scriptable.NOT_FOUND otherwise. It indicates that by default custom equality is available only if value is this in which case true is returned.

    • defineClass

      public static <T extends Scriptable> void defineClass(Scriptable scope, Class<T> clazz) throws IllegalAccessException, InstantiationException, InvocationTargetException
      Defines JavaScript objects from a Java class that implements Scriptable.

      If the given class has a method

       static void init(Context cx, Scriptable scope, boolean sealed);
       
      or its compatibility form
       static void init(Scriptable scope);
       
      then it is invoked and no further initialization is done.

      However, if no such a method is found, then the class's constructors and methods are used to initialize a class in the following manner.

      First, the zero-parameter constructor of the class is called to create the prototype. If no such constructor exists, a EvaluatorException is thrown.

      Next, all methods are scanned for special prefixes that indicate that they have special meaning for defining JavaScript objects. These special prefixes are

      • jsFunction_ for a JavaScript function
      • jsStaticFunction_ for a JavaScript function that is a property of the constructor
      • jsGet_ for a getter of a JavaScript property
      • jsSet_ for a setter of a JavaScript property
      • jsConstructor for a JavaScript function that is the constructor

      If the method's name begins with "jsFunction_", a JavaScript function is created with a name formed from the rest of the Java method name following "jsFunction_". So a Java method named "jsFunction_foo" will define a JavaScript method "foo". Calling this JavaScript function will cause the Java method to be called. The parameters of the method must be of number and types as defined by the FunctionObject class. The JavaScript function is then added as a property of the prototype.

      If the method's name begins with "jsStaticFunction_", it is handled similarly except that the resulting JavaScript function is added as a property of the constructor object. The Java method must be static.

      If the method's name begins with "jsGet_" or "jsSet_", the method is considered to define a property. Accesses to the defined property will result in calls to these getter and setter methods. If no setter is defined, the property is defined as READONLY.

      If the method's name is "jsConstructor", the method is considered to define the body of the constructor. Only one method of this name may be defined. You may use the varargs forms for constructors documented in FunctionObject(String, Member, Scriptable)

      If no method is found that can serve as constructor, a Java constructor will be selected to serve as the JavaScript constructor in the following manner. If the class has only one Java constructor, that constructor is used to define the JavaScript constructor. If the the class has two constructors, one must be the zero-argument constructor (otherwise an EvaluatorException would have already been thrown when the prototype was to be created). In this case the Java constructor with one or more parameters will be used to define the JavaScript constructor. If the class has three or more constructors, an EvaluatorException will be thrown.

      Finally, if there is a method

       static void finishInit(Scriptable scope, FunctionObject constructor,
                              Scriptable prototype)
       
      it will be called to finish any initialization. The scope argument will be passed, along with the newly created constructor and the newly created prototype.

      Parameters:
      scope - The scope in which to define the constructor.
      clazz - The Java class to use to define the JavaScript objects and properties.
      Throws:
      IllegalAccessException - if access is not available to a reflected class member
      InstantiationException - if unable to instantiate the named class
      InvocationTargetException - if an exception is thrown during execution of methods of the named class
      See Also:
    • defineClass

      public static <T extends Scriptable> void defineClass(Scriptable scope, Class<T> clazz, boolean sealed) throws IllegalAccessException, InstantiationException, InvocationTargetException
      Defines JavaScript objects from a Java class, optionally allowing sealing.

      Similar to defineClass(Scriptable scope, Class clazz) except that sealing is allowed. An object that is sealed cannot have properties added or removed. Note that sealing is not allowed in the current ECMA/ISO language specification, but is likely for the next version.

      Parameters:
      scope - The scope in which to define the constructor.
      clazz - The Java class to use to define the JavaScript objects and properties. The class must implement Scriptable.
      sealed - Whether or not to create sealed standard objects that cannot be modified.
      Throws:
      IllegalAccessException - if access is not available to a reflected class member
      InstantiationException - if unable to instantiate the named class
      InvocationTargetException - if an exception is thrown during execution of methods of the named class
      Since:
      1.4R3
    • defineClass

      public static <T extends Scriptable> String defineClass(Scriptable scope, Class<T> clazz, boolean sealed, boolean mapInheritance) throws IllegalAccessException, InstantiationException, InvocationTargetException
      Defines JavaScript objects from a Java class, optionally allowing sealing and mapping of Java inheritance to JavaScript prototype-based inheritance.

      Similar to defineClass(Scriptable scope, Class clazz) except that sealing and inheritance mapping are allowed. An object that is sealed cannot have properties added or removed. Note that sealing is not allowed in the current ECMA/ISO language specification, but is likely for the next version.

      Parameters:
      scope - The scope in which to define the constructor.
      clazz - The Java class to use to define the JavaScript objects and properties. The class must implement Scriptable.
      sealed - Whether or not to create sealed standard objects that cannot be modified.
      mapInheritance - Whether or not to map Java inheritance to JavaScript prototype-based inheritance.
      Returns:
      the class name for the prototype of the specified class
      Throws:
      IllegalAccessException - if access is not available to a reflected class member
      InstantiationException - if unable to instantiate the named class
      InvocationTargetException - if an exception is thrown during execution of methods of the named class
      Since:
      1.6R2
    • defineProperty

      public void defineProperty(String propertyName, Object value, int attributes)
      Define a JavaScript property.

      Creates the property with an initial value and sets its attributes.

      Parameters:
      propertyName - the name of the property to define.
      value - the initial value of the property
      attributes - the attributes of the JavaScript property
      See Also:
    • defineProperty

      public void defineProperty(Symbol key, Object value, int attributes)
      A version of defineProperty that uses a Symbol key.
      Parameters:
      key - symbol of the property to define.
      value - the initial value of the property
      attributes - the attributes of the JavaScript property
    • defineProperty

      public static void defineProperty(Scriptable destination, String propertyName, Object value, int attributes)
      Utility method to add properties to arbitrary Scriptable object. If destination is instance of ScriptableObject, calls defineProperty there, otherwise calls put in destination ignoring attributes
      Parameters:
      destination - ScriptableObject to define the property on
      propertyName - the name of the property to define.
      value - the initial value of the property
      attributes - the attributes of the JavaScript property
    • defineProperty

      public void defineProperty(Scriptable scope, String name, int length, Callable target, int attributes, int propertyAttributes)
      Utility method to add lambda properties to arbitrary Scriptable object.
      Parameters:
      scope - ScriptableObject to define the property on
      name - the name of the property to define.
      length - the arity of the function
      target - an object that implements the function in Java. Since Callable is a single-function interface this will typically be implemented as a lambda.
      attributes - the attributes of the JavaScript property
      propertyAttributes - Sets the attributes of the "name", "length", and "arity" properties of the internal LambdaFunction, which differ for many * native objects.
    • defineConstProperty

      public static void defineConstProperty(Scriptable destination, String propertyName)
      Utility method to add properties to arbitrary Scriptable object. If destination is instance of ScriptableObject, calls defineProperty there, otherwise calls put in destination ignoring attributes
      Parameters:
      destination - ScriptableObject to define the property on
      propertyName - the name of the property to define.
    • defineProperty

      public void defineProperty(String propertyName, Class<?> clazz, int attributes)
      Define a JavaScript property with getter and setter side effects.

      If the setter is not found, the attribute READONLY is added to the given attributes.

      The getter must be a method with zero parameters, and the setter, if found, must be a method with one parameter.

      Parameters:
      propertyName - the name of the property to define. This name also affects the name of the setter and getter to search for. If the propertyId is "foo", then clazz will be searched for "getFoo" and "setFoo" methods.
      clazz - the Java class to search for the getter and setter
      attributes - the attributes of the JavaScript property
      See Also:
    • defineProperty

      public void defineProperty(String propertyName, Object delegateTo, Method getter, Method setter, int attributes)
      Define a JavaScript property.

      Use this method only if you wish to define getters and setters for a given property in a ScriptableObject. To create a property without special getter or setter side effects, use defineProperty(String,int).

      If setter is null, the attribute READONLY is added to the given attributes.

      Several forms of getters or setters are allowed. In all cases the type of the value parameter can be any one of the following types: Object, String, boolean, Scriptable, byte, short, int, long, float, or double. The runtime will perform appropriate conversions based upon the type of the parameter (see description in FunctionObject). The first forms are nonstatic methods of the class referred to by 'this':

       Object getFoo();
      
       void setFoo(SomeType value);
       
      Next are static methods that may be of any class; the object whose property is being accessed is passed in as an extra argument:
       static Object getFoo(Scriptable obj);
      
       static void setFoo(Scriptable obj, SomeType value);
       
      Finally, it is possible to delegate to another object entirely using the delegateTo parameter. In this case the methods are nonstatic methods of the class delegated to, and the object whose property is being accessed is passed in as an extra argument:
       Object getFoo(Scriptable obj);
      
       void setFoo(Scriptable obj, SomeType value);
       
      Parameters:
      propertyName - the name of the property to define.
      delegateTo - an object to call the getter and setter methods on, or null, depending on the form used above.
      getter - the method to invoke to get the value of the property
      setter - the method to invoke to set the value of the property
      attributes - the attributes of the JavaScript property
    • defineOwnProperties

      public void defineOwnProperties(Context cx, ScriptableObject props)
      Defines one or more properties on this object.
      Parameters:
      cx - the current Context
      props - a map of property ids to property descriptors
    • defineOwnProperty

      public void defineOwnProperty(Context cx, Object id, ScriptableObject desc)
      Defines a property on an object.
      Parameters:
      cx - the current Context
      id - the name/index of the property
      desc - the new property descriptor, as described in 8.6.1
    • defineOwnProperty

      protected void defineOwnProperty(Context cx, Object id, ScriptableObject desc, boolean checkValid)
      Defines a property on an object.

      Based on [[DefineOwnProperty]] from 8.12.10 of the spec.

      Parameters:
      cx - the current Context
      id - the name/index of the property
      desc - the new property descriptor, as described in 8.6.1
      checkValid - whether to perform validity checks
    • defineProperty

      public void defineProperty(String name, Supplier<Object> getter, Consumer<Object> setter, int attributes)
      Define a property on this object that is implemented using lambda functions. If a property with the same name already exists, then it will be replaced. This property will appear to the JavaScript user exactly like any other property -- unlike Function properties and those based on reflection, the property descriptor will only reflect the value as defined by this function.
      Parameters:
      name - the name of the function
      getter - a function that returns the value of the property. If null, then the previous version of the value will be returned.
      setter - a function that sets the value of the property. If null, then the value will be set directly and may not be retrieved by the getter.
      attributes - the attributes to set on the property
    • defineProperty

      public void defineProperty(Context cx, String name, Function<Scriptable,Object> getter, BiConsumer<Scriptable,Object> setter, int attributes)
      Define a property on this object that is implemented using lambda functions accepting Scriptable `this` object as first parameter. Unlike with `defineProperty(String name, Supplier getter, Consumer setter, int attributes)` where getter and setter need to have access to target object instance, this allows for defining properties on LambdaConstructor prototype providing getter and setter logic with java instance methods. If a property with the same name already exists, then it will be replaced. This property will appear to the JavaScript user exactly like descriptor with a getter and setter, just as if they had been defined in JavaScript using Object.defineOwnProperty.
      Parameters:
      name - the name of the property
      getter - a function that given Scriptable `this` returns the value of the property. If null, throws typeError
      setter - a function that Scriptable `this` and a value sets the value of the property, by calling appropriate method on `this`. If null, then the value will be set directly and may not be retrieved by the getter.
      attributes - the attributes to set on the property
    • checkPropertyDefinition

      protected void checkPropertyDefinition(ScriptableObject desc)
    • checkPropertyChange

      protected void checkPropertyChange(Object id, ScriptableObject current, ScriptableObject desc)
    • isTrue

      protected static boolean isTrue(Object value)
    • isFalse

      protected static boolean isFalse(Object value)
    • sameValue

      protected boolean sameValue(Object newValue, Object currentValue)
      Implements SameValue as described in ES5 9.12, additionally checking if new value is defined.
      Parameters:
      newValue - the new value
      currentValue - the current value
      Returns:
      true if values are the same as defined by ES5 9.12
    • applyDescriptorToAttributeBitset

      protected int applyDescriptorToAttributeBitset(int attributes, ScriptableObject desc)
    • isDataDescriptor

      protected static boolean isDataDescriptor(ScriptableObject desc)
      Implements IsDataDescriptor as described in ES5 8.10.2
      Parameters:
      desc - a property descriptor
      Returns:
      true if this is a data descriptor.
    • isAccessorDescriptor

      protected static boolean isAccessorDescriptor(ScriptableObject desc)
      Implements IsAccessorDescriptor as described in ES5 8.10.1
      Parameters:
      desc - a property descriptor
      Returns:
      true if this is an accessor descriptor.
    • isGenericDescriptor

      protected boolean isGenericDescriptor(ScriptableObject desc)
      Implements IsGenericDescriptor as described in ES5 8.10.3
      Parameters:
      desc - a property descriptor
      Returns:
      true if this is a generic descriptor.
    • ensureScriptable

      protected static Scriptable ensureScriptable(Object arg)
    • ensureSymbolScriptable

      protected static SymbolScriptable ensureSymbolScriptable(Object arg)
    • ensureScriptableObject

      protected static ScriptableObject ensureScriptableObject(Object arg)
    • defineFunctionProperties

      public void defineFunctionProperties(String[] names, Class<?> clazz, int attributes)
      Search for names in a class, adding the resulting methods as properties.

      Uses reflection to find the methods of the given names. Then FunctionObjects are constructed from the methods found, and are added to this object as properties with the given names.

      Parameters:
      names - the names of the Methods to add as function properties
      clazz - the class to search for the Methods
      attributes - the attributes of the new properties
      See Also:
    • getObjectPrototype

      public static Scriptable getObjectPrototype(Scriptable scope)
      Get the Object.prototype property. See ECMA 15.2.4.
      Parameters:
      scope - an object in the scope chain
    • getFunctionPrototype

      public static Scriptable getFunctionPrototype(Scriptable scope)
      Get the Function.prototype property. See ECMA 15.3.4.
      Parameters:
      scope - an object in the scope chain
    • getGeneratorFunctionPrototype

      public static Scriptable getGeneratorFunctionPrototype(Scriptable scope)
    • getArrayPrototype

      public static Scriptable getArrayPrototype(Scriptable scope)
    • getClassPrototype

      public static Scriptable getClassPrototype(Scriptable scope, String className)
      Get the prototype for the named class.

      For example, getClassPrototype(s, "Date") will first walk up the parent chain to find the outermost scope, then will search that scope for the Date constructor, and then will return Date.prototype. If any of the lookups fail, or the prototype is not a JavaScript object, then null will be returned.

      Parameters:
      scope - an object in the scope chain
      className - the name of the constructor
      Returns:
      the prototype for the named class, or null if it cannot be found.
    • getTopLevelScope

      public static Scriptable getTopLevelScope(Scriptable obj)
      Get the global scope.

      Walks the parent scope chain to find an object with a null parent scope (the global object).

      Parameters:
      obj - a JavaScript object
      Returns:
      the corresponding global scope
    • isExtensible

      public boolean isExtensible()
    • preventExtensions

      public void preventExtensions()
    • sealObject

      public void sealObject()
      Seal this object.

      It is an error to add properties to or delete properties from a sealed object. It is possible to change the value of an existing property. Once an object is sealed it may not be unsealed.

      Since:
      1.4R3
    • isSealed

      public final boolean isSealed()
      Return true if this object is sealed.
      Returns:
      true if sealed, false otherwise.
      Since:
      1.4R3
      See Also:
    • getProperty

      public static Object getProperty(Scriptable obj, String name)
      Gets a named property from an object or any object in its prototype chain.

      Searches the prototype chain for a property named name.

      Parameters:
      obj - a JavaScript object
      name - a property name
      Returns:
      the value of a property with name name found in obj or any object in its prototype chain, or Scriptable.NOT_FOUND if not found
      Since:
      1.5R2
    • getProperty

      public static Object getProperty(Scriptable obj, Symbol key)
      This is a version of getProperty that works with Symbols.
    • getTypedProperty

      public static <T> T getTypedProperty(Scriptable s, int index, Class<T> type)
      Gets an indexed property from an object or any object in its prototype chain and coerces it to the requested Java type.

      Searches the prototype chain for a property with integral index index. Note that if you wish to look for properties with numerical but non-integral indicies, you should use getProperty(Scriptable,String) with the string value of the index.

      Parameters:
      s - a JavaScript object
      index - an integral index
      type - the required Java type of the result
      Returns:
      the value of a property with name name found in obj or any object in its prototype chain, or null if not found. Note that it does not return Scriptable.NOT_FOUND as it can ordinarily not be converted to most of the types.
      Since:
      1.7R3
    • getProperty

      public static Object getProperty(Scriptable obj, int index)
      Gets an indexed property from an object or any object in its prototype chain.

      Searches the prototype chain for a property with integral index index. Note that if you wish to look for properties with numerical but non-integral indicies, you should use getProperty(Scriptable,String) with the string value of the index.

      Parameters:
      obj - a JavaScript object
      index - an integral index
      Returns:
      the value of a property with index index found in obj or any object in its prototype chain, or Scriptable.NOT_FOUND if not found
      Since:
      1.5R2
    • getTypedProperty

      public static <T> T getTypedProperty(Scriptable s, String name, Class<T> type)
      Gets a named property from an object or any object in its prototype chain and coerces it to the requested Java type.

      Searches the prototype chain for a property named name.

      Parameters:
      s - a JavaScript object
      name - a property name
      type - the required Java type of the result
      Returns:
      the value of a property with name name found in obj or any object in its prototype chain, or null if not found. Note that it does not return Scriptable.NOT_FOUND as it can ordinarily not be converted to most of the types.
      Since:
      1.7R3
    • hasProperty

      public static boolean hasProperty(Scriptable obj, String name)
      Returns whether a named property is defined in an object or any object in its prototype chain.

      Searches the prototype chain for a property named name.

      Parameters:
      obj - a JavaScript object
      name - a property name
      Returns:
      the true if property was found
      Since:
      1.5R2
    • redefineProperty

      public static void redefineProperty(Scriptable obj, String name, boolean isConst)
      If hasProperty(obj, name) would return true, then if the property that was found is compatible with the new property, this method just returns. If the property is not compatible, then an exception is thrown.

      A property redefinition is incompatible if the first definition was a const declaration or if this one is. They are compatible only if neither was const.

    • hasProperty

      public static boolean hasProperty(Scriptable obj, int index)
      Returns whether an indexed property is defined in an object or any object in its prototype chain.

      Searches the prototype chain for a property with index index.

      Parameters:
      obj - a JavaScript object
      index - a property index
      Returns:
      the true if property was found
      Since:
      1.5R2
    • hasProperty

      public static boolean hasProperty(Scriptable obj, Symbol key)
      A version of hasProperty for properties with Symbol keys.
    • putProperty

      public static void putProperty(Scriptable obj, String name, Object value)
      Puts a named property in an object or in an object in its prototype chain.

      Searches for the named property in the prototype chain. If it is found, the value of the property in obj is changed through a call to Scriptable.put(String, Scriptable, Object) on the prototype passing obj as the start argument. This allows the prototype to veto the property setting in case the prototype defines the property with [[ReadOnly]] attribute. If the property is not found, it is added in obj.

      Parameters:
      obj - a JavaScript object
      name - a property name
      value - any JavaScript value accepted by Scriptable.put
      Since:
      1.5R2
    • putProperty

      public static void putProperty(Scriptable obj, Symbol key, Object value)
      This is a version of putProperty for Symbol keys.
    • putConstProperty

      public static void putConstProperty(Scriptable obj, String name, Object value)
      Puts a named property in an object or in an object in its prototype chain.

      Searches for the named property in the prototype chain. If it is found, the value of the property in obj is changed through a call to Scriptable.put(String, Scriptable, Object) on the prototype passing obj as the start argument. This allows the prototype to veto the property setting in case the prototype defines the property with [[ReadOnly]] attribute. If the property is not found, it is added in obj.

      Parameters:
      obj - a JavaScript object
      name - a property name
      value - any JavaScript value accepted by Scriptable.put
      Since:
      1.5R2
    • putProperty

      public static void putProperty(Scriptable obj, int index, Object value)
      Puts an indexed property in an object or in an object in its prototype chain.

      Searches for the indexed property in the prototype chain. If it is found, the value of the property in obj is changed through a call to Scriptable.put(int, Scriptable, Object) on the prototype passing obj as the start argument. This allows the prototype to veto the property setting in case the prototype defines the property with [[ReadOnly]] attribute. If the property is not found, it is added in obj.

      Parameters:
      obj - a JavaScript object
      index - a property index
      value - any JavaScript value accepted by Scriptable.put
      Since:
      1.5R2
    • deleteProperty

      public static boolean deleteProperty(Scriptable obj, String name)
      Removes the property from an object or its prototype chain.

      Searches for a property with name in obj or its prototype chain. If it is found, the object's delete method is called.

      Parameters:
      obj - a JavaScript object
      name - a property name
      Returns:
      true if the property doesn't exist or was successfully removed
      Since:
      1.5R2
    • deleteProperty

      public static boolean deleteProperty(Scriptable obj, int index)
      Removes the property from an object or its prototype chain.

      Searches for a property with index in obj or its prototype chain. If it is found, the object's delete method is called.

      Parameters:
      obj - a JavaScript object
      index - a property index
      Returns:
      true if the property doesn't exist or was successfully removed
      Since:
      1.5R2
    • getPropertyIds

      public static Object[] getPropertyIds(Scriptable obj)
      Returns an array of all ids from an object and its prototypes.

      Parameters:
      obj - a JavaScript object
      Returns:
      an array of all ids from all object in the prototype chain. If a given id occurs multiple times in the prototype chain, it will occur only once in this list.
      Since:
      1.5R2
    • callMethod

      public static Object callMethod(Scriptable obj, String methodName, Object[] args)
      Call a method of an object.
      Parameters:
      obj - the JavaScript object
      methodName - the name of the function property
      args - the arguments for the call
      See Also:
    • callMethod

      public static Object callMethod(Context cx, Scriptable obj, String methodName, Object[] args)
      Call a method of an object.
      Parameters:
      cx - the Context object associated with the current thread.
      obj - the JavaScript object
      methodName - the name of the function property
      args - the arguments for the call
    • getAssociatedValue

      public final Object getAssociatedValue(Object key)
      Get arbitrary application-specific value associated with this object.
      Parameters:
      key - key object to select particular value.
      See Also:
    • getTopScopeValue

      public static Object getTopScopeValue(Scriptable scope, Object key)
      Get arbitrary application-specific value associated with the top scope of the given scope. The method first calls getTopLevelScope(Scriptable scope) and then searches the prototype chain of the top scope for the first object containing the associated value with the given key.
      Parameters:
      scope - the starting scope.
      key - key object to select particular value.
      See Also:
    • associateValue

      public final Object associateValue(Object key, Object value)
      Associate arbitrary application-specific value with this object. Value can only be associated with the given object and key only once. The method ignores any subsequent attempts to change the already associated value.

      The associated values are not serialized.

      Parameters:
      key - key object to select particular value.
      value - the value to associate
      Returns:
      the passed value if the method is called first time for the given key or old value for any subsequent calls.
      See Also:
    • getOwnPropertyDescriptor

      protected ScriptableObject getOwnPropertyDescriptor(Context cx, Object id)
    • querySlot

      protected Slot querySlot(Context cx, Object id)
    • size

      public int size()
    • isEmpty

      public boolean isEmpty()
    • get

      public Object get(Object key)