Class JavaScriptEngine

java.lang.Object
org.htmlunit.javascript.JavaScriptEngine
All Implemented Interfaces:
AbstractJavaScriptEngine<org.htmlunit.corejs.javascript.Script>

public class JavaScriptEngine extends Object implements AbstractJavaScriptEngine<org.htmlunit.corejs.javascript.Script>
A wrapper for the Rhino JavaScript engine that provides browser specific features.

Like all classes in this package, this class is not intended for direct use and may change without notice.

See Also:
  • Field Details

    • LOG

      private static final org.apache.commons.logging.Log LOG
    • emptyArgs

      public static final Object[] emptyArgs
      ScriptRuntime.emptyArgs.
    • Undefined

      public static final Object Undefined
      org.htmlunit.corejs.javascript.Undefined.instance.
    • webClient_

      private WebClient webClient_
    • contextFactory_

      private HtmlUnitContextFactory contextFactory_
    • jsConfig_

      private JavaScriptConfiguration jsConfig_
    • javaScriptRunning_

      private transient ThreadLocal<Boolean> javaScriptRunning_
    • postponedActions_

      private transient ThreadLocal<List<PostponedAction>> postponedActions_
    • holdPostponedActions_

      private transient boolean holdPostponedActions_
    • shutdownPending_

      private transient boolean shutdownPending_
    • javaScriptExecutor_

      private transient JavaScriptExecutor javaScriptExecutor_
      The JavaScriptExecutor corresponding to all windows of this Web client
    • KEY_STARTING_SCOPE

      public static final String KEY_STARTING_SCOPE
      Key used to place the scope in which the execution of some JavaScript code started as thread local attribute in current context.

      This is needed to resolve some relative locations relatively to the page in which the script is executed and not to the page which location is changed.

      See Also:
    • KEY_STARTING_PAGE

      public static final String KEY_STARTING_PAGE
      Key used to place the HtmlPage for which the JavaScript code is executed as thread local attribute in current context.
      See Also:
  • Constructor Details

    • JavaScriptEngine

      public JavaScriptEngine(WebClient webClient)
      Creates an instance for the specified WebClient.
      Parameters:
      webClient - the client that will own this engine
  • Method Details

    • getWebClient

      private WebClient getWebClient()
      Returns the web client that this engine is associated with.
      Returns:
      the web client
    • getContextFactory

      public HtmlUnitContextFactory getContextFactory()
      Specified by:
      getContextFactory in interface AbstractJavaScriptEngine<org.htmlunit.corejs.javascript.Script>
      Returns:
      this JavaScript engine's HtmlUnitContextFactory
    • initialize

      public void initialize(WebWindow webWindow, Page page)
      Performs initialization for the given webWindow.
      Specified by:
      initialize in interface AbstractJavaScriptEngine<org.htmlunit.corejs.javascript.Script>
      Parameters:
      webWindow - the web window to initialize for
      page - the page that will become the enclosing page
    • getJavaScriptExecutor

      public JavaScriptExecutor getJavaScriptExecutor()
      Returns the JavaScriptExecutor.
      Returns:
      the JavaScriptExecutor or null if javascript is disabled or no executor was required so far.
    • init

      private void init(WebWindow webWindow, Page page, org.htmlunit.corejs.javascript.Context context) throws Exception
      Initializes all the JS stuff for the window.
      Parameters:
      webWindow - the web window
      context - the current context
      Throws:
      Exception - if something goes wrong
    • additionalCtor

      private static void additionalCtor(Window window, Map<String,org.htmlunit.corejs.javascript.Scriptable> prototypesPerJSName, Method ctorMethod, String prop, String clazzName) throws Exception
      Throws:
      Exception
    • configureRhino

      public static void configureRhino(WebClient webClient, BrowserVersion browserVersion, HtmlUnitScriptable scriptable)
      INTERNAL API - SUBJECT TO CHANGE AT ANY TIME - USE AT YOUR OWN RISK.
      Parameters:
      webClient - the WebClient
      browserVersion - the BrowserVersion
      scriptable - the window or the DedicatedWorkerGlobalScope
    • applyPolyfills

      public static void applyPolyfills(WebClient webClient, BrowserVersion browserVersion, org.htmlunit.corejs.javascript.Context context, HtmlUnitScriptable scriptable) throws IOException
      INTERNAL API - SUBJECT TO CHANGE AT ANY TIME - USE AT YOUR OWN RISK.
      Parameters:
      webClient - the WebClient
      browserVersion - the BrowserVersion
      context - the current context
      scriptable - the window or the DedicatedWorkerGlobalScope
      Throws:
      IOException - in case of problems
    • defineConstructor

      private static void defineConstructor(Window window, org.htmlunit.corejs.javascript.Scriptable prototype, org.htmlunit.corejs.javascript.ScriptableObject constructor)
    • deleteProperties

      private static void deleteProperties(org.htmlunit.corejs.javascript.Scriptable scope, String... propertiesToDelete)
      Deletes the properties with the provided names.
      Parameters:
      scope - the scope from which properties have to be removed
      propertiesToDelete - the list of property names
    • removePrototypeProperties

      private static void removePrototypeProperties(org.htmlunit.corejs.javascript.Scriptable scope, String className, String... properties)
      Removes prototype properties.
      Parameters:
      scope - the scope
      className - the class for which properties should be removed
      properties - the properties to remove
    • configureClass

      public static HtmlUnitScriptable configureClass(ClassConfiguration config, org.htmlunit.corejs.javascript.Scriptable window, BrowserVersion browserVersion) throws InstantiationException, IllegalAccessException
      Configures the specified class for access via JavaScript.
      Parameters:
      config - the configuration settings for the class to be configured
      window - the scope within which to configure the class
      browserVersion - the browser version
      Returns:
      the created prototype
      Throws:
      InstantiationException - if the new class cannot be instantiated
      IllegalAccessException - if we don't have access to create the new instance
    • configureConstantsStaticPropertiesAndStaticFunctions

      private static void configureConstantsStaticPropertiesAndStaticFunctions(ClassConfiguration config, org.htmlunit.corejs.javascript.ScriptableObject scriptable)
      Configures constants, static properties and static functions on the object.
      Parameters:
      config - the configuration for the object
      scriptable - the object to configure
    • configureConstantsPropertiesAndFunctions

      private static void configureConstantsPropertiesAndFunctions(ClassConfiguration config, org.htmlunit.corejs.javascript.ScriptableObject scriptable)
      Configures constants, properties and functions on the object.
      Parameters:
      config - the configuration for the object
      scriptable - the object to configure
    • configureFunctions

      private static void configureFunctions(ClassConfiguration config, org.htmlunit.corejs.javascript.ScriptableObject scriptable)
    • configureConstants

      private static void configureConstants(ClassConfiguration config, org.htmlunit.corejs.javascript.ScriptableObject scriptable)
    • configureProperties

      private static void configureProperties(ClassConfiguration config, org.htmlunit.corejs.javascript.ScriptableObject scriptable)
    • configureStaticProperties

      private static void configureStaticProperties(ClassConfiguration config, org.htmlunit.corejs.javascript.ScriptableObject scriptable)
    • configureStaticFunctions

      private static void configureStaticFunctions(ClassConfiguration config, org.htmlunit.corejs.javascript.ScriptableObject scriptable)
    • configureSymbolConstants

      private static void configureSymbolConstants(ClassConfiguration config, org.htmlunit.corejs.javascript.ScriptableObject scriptable)
    • configureSymbols

      private static void configureSymbols(ClassConfiguration config, org.htmlunit.corejs.javascript.ScriptableObject scriptable)
    • registerWindowAndMaybeStartEventLoop

      public void registerWindowAndMaybeStartEventLoop(WebWindow webWindow)
      Register WebWindow with the JavaScriptExecutor.
      Specified by:
      registerWindowAndMaybeStartEventLoop in interface AbstractJavaScriptEngine<org.htmlunit.corejs.javascript.Script>
      Parameters:
      webWindow - the WebWindow to be registered.
    • prepareShutdown

      public void prepareShutdown()
      Disable starting of new js threads.
      Specified by:
      prepareShutdown in interface AbstractJavaScriptEngine<org.htmlunit.corejs.javascript.Script>
    • shutdown

      public void shutdown()
      Shutdown the JavaScriptEngine.
      Specified by:
      shutdown in interface AbstractJavaScriptEngine<org.htmlunit.corejs.javascript.Script>
    • compile

      public org.htmlunit.corejs.javascript.Script compile(HtmlPage owningPage, org.htmlunit.corejs.javascript.Scriptable scope, String sourceCode, String sourceName, int startLine)
      Compiles the specified JavaScript code in the context of a given scope.
      Specified by:
      compile in interface AbstractJavaScriptEngine<org.htmlunit.corejs.javascript.Script>
      Parameters:
      owningPage - the page from which the code started
      scope - the scope in which to execute the javascript code
      sourceCode - the JavaScript code to execute
      sourceName - the name that will be displayed on error conditions
      startLine - the line at which the script source starts
      Returns:
      the result of executing the specified code
    • compile

      @Deprecated public org.htmlunit.corejs.javascript.Script compile(HtmlPage owningPage, String sourceCode, String sourceName, int startLine)
      Deprecated.
      Compiles the specified JavaScript code in the context of a given HTML page.
      Specified by:
      compile in interface AbstractJavaScriptEngine<org.htmlunit.corejs.javascript.Script>
      Parameters:
      owningPage - the page that the code will execute within
      sourceCode - the JavaScript code to execute
      sourceName - the name that will be displayed on error conditions
      startLine - the line at which the script source starts
      Returns:
      the result of executing the specified code
    • callSecured

      public final <T> T callSecured(org.htmlunit.corejs.javascript.ContextAction<T> action, HtmlPage page)
      Forwards this to the HtmlUnitContextFactory but with checking shutdown handling.
      Type Parameters:
      T - return type of the action
      Parameters:
      action - the contextAction
      page - the page
      Returns:
      the result of the call
    • execute

      public Object execute(HtmlPage page, org.htmlunit.corejs.javascript.Scriptable scope, String sourceCode, String sourceName, int startLine)
      Executes the specified JavaScript code in the context of a given page.
      Specified by:
      execute in interface AbstractJavaScriptEngine<org.htmlunit.corejs.javascript.Script>
      Parameters:
      page - the page that the code will execute within
      scope - the scope in which to execute
      sourceCode - the JavaScript code to execute
      sourceName - the name that will be displayed on error conditions
      startLine - the line at which the script source starts
      Returns:
      the result of executing the specified code
    • execute

      @Deprecated public Object execute(HtmlPage page, String sourceCode, String sourceName, int startLine)
      Deprecated.
      Executes the specified JavaScript code in the context of a given page.
      Specified by:
      execute in interface AbstractJavaScriptEngine<org.htmlunit.corejs.javascript.Script>
      Parameters:
      page - the page that the code will execute within
      sourceCode - the JavaScript code to execute
      sourceName - the name that will be displayed on error conditions
      startLine - the line at which the script source starts
      Returns:
      the result of executing the specified code
    • execute

      public Object execute(HtmlPage page, org.htmlunit.corejs.javascript.Scriptable scope, org.htmlunit.corejs.javascript.Script script)
      Executes the specified JavaScript code in the context of a given page.
      Specified by:
      execute in interface AbstractJavaScriptEngine<org.htmlunit.corejs.javascript.Script>
      Parameters:
      page - the page that the code will execute within
      scope - the scope in which to execute
      script - the script to execute
      Returns:
      the result of executing the specified code
    • execute

      @Deprecated public Object execute(HtmlPage page, org.htmlunit.corejs.javascript.Script script)
      Deprecated.
      Executes the specified JavaScript code in the context of a given page.
      Specified by:
      execute in interface AbstractJavaScriptEngine<org.htmlunit.corejs.javascript.Script>
      Parameters:
      page - the page that the code will execute within
      script - the script to execute
      Returns:
      the result of executing the specified code
    • callFunction

      public Object callFunction(HtmlPage page, org.htmlunit.corejs.javascript.Function javaScriptFunction, org.htmlunit.corejs.javascript.Scriptable thisObject, Object[] args, DomNode node)
      Calls a JavaScript function and return the result.
      Parameters:
      page - the page
      javaScriptFunction - the function to call
      thisObject - the this object for class method calls
      args - the list of arguments to pass to the function
      node - the HTML element that will act as the context
      Returns:
      the result of the function call
    • callFunction

      public Object callFunction(HtmlPage page, org.htmlunit.corejs.javascript.Function function, org.htmlunit.corejs.javascript.Scriptable scope, org.htmlunit.corejs.javascript.Scriptable thisObject, Object[] args)
      Calls the given function taking care of synchronization issues.
      Parameters:
      page - the interactive page that caused this script to executed
      function - the JavaScript function to execute
      scope - the execution scope
      thisObject - the 'this' object
      args - the function's arguments
      Returns:
      the function result
    • getScope

      private static org.htmlunit.corejs.javascript.Scriptable getScope(HtmlPage page, DomNode node)
    • isScriptRunning

      public boolean isScriptRunning()
      Indicates if JavaScript is running in current thread.

      This allows code to know if there own evaluation is has been triggered by some JS code.

      Specified by:
      isScriptRunning in interface AbstractJavaScriptEngine<org.htmlunit.corejs.javascript.Script>
      Returns:
      true if JavaScript is running
    • doProcessPostponedActions

      void doProcessPostponedActions()
    • addPostponedAction

      public void addPostponedAction(PostponedAction action)
      Adds an action that should be executed first when the script currently being executed has finished.
      Specified by:
      addPostponedAction in interface AbstractJavaScriptEngine<org.htmlunit.corejs.javascript.Script>
      Parameters:
      action - the action
    • handleJavaScriptException

      protected void handleJavaScriptException(ScriptException scriptException, boolean triggerOnError)
      Handles an exception that occurred during execution of JavaScript code.
      Parameters:
      scriptException - the exception
      triggerOnError - if true, this triggers the onerror handler
    • handleJavaScriptTimeoutError

      protected void handleJavaScriptTimeoutError(HtmlPage page, TimeoutError e)
      Handles an exception that occurred during execution of JavaScript code.
      Parameters:
      page - the page in which the script causing this exception was executed
      e - the timeout error that was thrown from the script engine
    • holdPosponedActions

      public void holdPosponedActions()
      INTERNAL API - SUBJECT TO CHANGE AT ANY TIME - USE AT YOUR OWN RISK.
      Indicates that no postponed action should be executed.
      Specified by:
      holdPosponedActions in interface AbstractJavaScriptEngine<org.htmlunit.corejs.javascript.Script>
    • processPostponedActions

      public void processPostponedActions()
      INTERNAL API - SUBJECT TO CHANGE AT ANY TIME - USE AT YOUR OWN RISK.
      Process postponed actions, if any.
      Specified by:
      processPostponedActions in interface AbstractJavaScriptEngine<org.htmlunit.corejs.javascript.Script>
    • readObject

      private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
      Re-initializes transient fields when an object of this type is deserialized.
      Throws:
      IOException
      ClassNotFoundException
    • initTransientFields

      private void initTransientFields()
    • getJavaScriptClass

      public Class<? extends HtmlUnitScriptable> getJavaScriptClass(Class<?> c)
      Gets the class of the JavaScript object for the node class.
      Parameters:
      c - the node class DomNode or some subclass.
      Returns:
      null if none found
    • getJavaScriptConfiguration

      public JavaScriptConfiguration getJavaScriptConfiguration()
      Gets the associated configuration.
      Specified by:
      getJavaScriptConfiguration in interface AbstractJavaScriptEngine<org.htmlunit.corejs.javascript.Script>
      Returns:
      the configuration
    • getJavaScriptTimeout

      public long getJavaScriptTimeout()
      Returns the javascript timeout.
      Specified by:
      getJavaScriptTimeout in interface AbstractJavaScriptEngine<org.htmlunit.corejs.javascript.Script>
      Returns:
      the javascript timeout
    • setJavaScriptTimeout

      public void setJavaScriptTimeout(long timeout)
      Sets the javascript timeout.
      Specified by:
      setJavaScriptTimeout in interface AbstractJavaScriptEngine<org.htmlunit.corejs.javascript.Script>
      Parameters:
      timeout - the timeout
    • toNumber

      public static double toNumber(Object value)
      Convert the value to a JavaScript Number value.
      Parameters:
      value - a JavaScript value
      Returns:
      the corresponding double value converted using the ECMA rules
    • toString

      public static String toString(Object value)
      Convert the value to a JavaScript String value.
      Parameters:
      value - a JavaScript value
      Returns:
      the corresponding String value converted using the ECMA rules
    • toBoolean

      public static boolean toBoolean(Object value)
      Convert the value to a JavaScript boolean value.
      Parameters:
      value - a JavaScript value
      Returns:
      the corresponding boolean value converted using the ECMA rules
    • throwAsScriptRuntimeEx

      public static RuntimeException throwAsScriptRuntimeEx(Throwable e)
      Rethrow the exception wrapping it as the script runtime exception.
      Parameters:
      e - the exception to rethrow
      Returns:
      RuntimeException as dummy the method always throws
    • reportRuntimeError

      public static RuntimeException reportRuntimeError(String message)
      Report a runtime error using the error reporter for the current thread.
      Parameters:
      message - the error message to report
      Returns:
      RuntimeException as dummy the method always throws
    • typeError

      public static org.htmlunit.corejs.javascript.EcmaError typeError(String message)
      Report a runtime error using the error reporter for the current thread.
      Parameters:
      message - the error message to report
      Returns:
      EcmaError
    • rangeError

      public static org.htmlunit.corejs.javascript.EcmaError rangeError(String message)
      Report a runtime error using the error reporter for the current thread.
      Parameters:
      message - the error message to report
      Returns:
      EcmaError
    • constructError

      public static org.htmlunit.corejs.javascript.EcmaError constructError(String error, String message)
      Parameters:
      error - the error
      message - the message
      Returns:
      a new EcmaError
    • asJavaScriptException

      public static org.htmlunit.corejs.javascript.RhinoException asJavaScriptException(Window window, DOMException exception)
      INTERNAL API - SUBJECT TO CHANGE AT ANY TIME - USE AT YOUR OWN RISK.
      Encapsulates the given DOMException into a Rhino-compatible exception.
      Parameters:
      window - the window to be used as parent scope
      exception - the exception to encapsulate
      Returns:
      the created exception
    • newArray

      public static org.htmlunit.corejs.javascript.Scriptable newArray(org.htmlunit.corejs.javascript.Scriptable scope, int length)
      Create an array with a specified initial length.
      Parameters:
      scope - the scope to create the object in
      length - the initial length (JavaScript arrays may have additional properties added dynamically).
      Returns:
      the new array object
    • newArrayIteratorTypeKeys

      public static org.htmlunit.corejs.javascript.Scriptable newArrayIteratorTypeKeys(org.htmlunit.corejs.javascript.Scriptable scope, org.htmlunit.corejs.javascript.Scriptable arrayLike)
      INTERNAL API - SUBJECT TO CHANGE AT ANY TIME - USE AT YOUR OWN RISK.
      Create a new ArrayIterator of type NativeArrayIterator.ARRAY_ITERATOR_TYPE.KEYS
      Parameters:
      scope - the scope to create the object in
      arrayLike - the backend
      Returns:
      the new NativeArrayIterator
    • newArrayIteratorTypeValues

      public static org.htmlunit.corejs.javascript.Scriptable newArrayIteratorTypeValues(org.htmlunit.corejs.javascript.Scriptable scope, org.htmlunit.corejs.javascript.Scriptable arrayLike)
      INTERNAL API - SUBJECT TO CHANGE AT ANY TIME - USE AT YOUR OWN RISK.
      Create a new ArrayIterator of type NativeArrayIterator.ARRAY_ITERATOR_TYPE.VALUES
      Parameters:
      scope - the scope to create the object in
      arrayLike - the backend
      Returns:
      the new NativeArrayIterator
    • newArrayIteratorTypeEntries

      public static org.htmlunit.corejs.javascript.Scriptable newArrayIteratorTypeEntries(org.htmlunit.corejs.javascript.Scriptable scope, org.htmlunit.corejs.javascript.Scriptable arrayLike)
      INTERNAL API - SUBJECT TO CHANGE AT ANY TIME - USE AT YOUR OWN RISK.
      Create a new ArrayIterator of type NativeArrayIterator.ARRAY_ITERATOR_TYPE.ENTRIES
      Parameters:
      scope - the scope to create the object in
      arrayLike - the backend
      Returns:
      the new NativeArrayIterator
    • newArray

      public static org.htmlunit.corejs.javascript.Scriptable newArray(org.htmlunit.corejs.javascript.Scriptable scope, Object[] elements)
      Create an array with a specified initial length.
      Parameters:
      scope - the scope to create the object in
      elements - the initial elements. Each object in this array must be an acceptable JavaScript type and type of array should be exactly Object[], not SomeObjectSubclass[].
      Returns:
      the new array object
    • toInt32

      public static int toInt32(Object o)
      Parameters:
      o - the object to convert
      Returns:
      int value
    • toInteger

      public static double toInteger(Object o)
      Parameters:
      o - the object to convert
      Returns:
      double value
    • toInteger

      public static double toInteger(Object[] args, int index)
      Parameters:
      args - an array
      index - the index in the array
      Returns:
      double value
    • isUndefined

      public static boolean isUndefined(Object obj)
      Parameters:
      obj - the value to check
      Returns:
      whether obj is undefined
    • isNaN

      public static boolean isNaN(Object obj)
      Parameters:
      obj - the value to check
      Returns:
      whether obj is NAN
    • uncompressJavaScript

      public static String uncompressJavaScript(String scriptSource, String scriptName)
      Tries to uncompress the JavaScript code in the provided response.
      Parameters:
      scriptSource - the souce
      scriptName - the name
      Returns:
      the uncompressed JavaScript code
    • evaluateProxyAutoConfig

      public static String evaluateProxyAutoConfig(BrowserVersion browserVersion, String content, URL url)
      Evaluates the FindProxyForURL method of the specified content.
      Parameters:
      browserVersion - the browser version to use
      content - the JavaScript content
      url - the URL to be retrieved
      Returns:
      semicolon-separated result