Module javafx.web

Class WebEngine


  • public final class WebEngine
    extends Object
    WebEngine is a non-visual object capable of managing one Web page at a time. It loads Web pages, creates their document models, applies styles as necessary, and runs JavaScript on pages. It provides access to the document model of the current page, and enables two-way communication between a Java application and JavaScript code of the page.

    Loading Web Pages

    The WebEngine class provides two ways to load content into a WebEngine object:

    Loading always happens on a background thread. Methods that initiate loading return immediately after scheduling a background job. To track progress and/or cancel a job, use the Worker instance available from the getLoadWorker() method.

    The following example changes the stage title when loading completes successfully:

    
        import javafx.concurrent.Worker.State;
        final Stage stage;
        webEngine.getLoadWorker().stateProperty().addListener(
            new ChangeListener<State>() {
                public void changed(ObservableValue ov, State oldState, State newState) {
                    if (newState == State.SUCCEEDED) {
                        stage.setTitle(webEngine.getLocation());
                    }
                }
            });
        webEngine.load("http://javafx.com");
     

    User Interface Callbacks

    A number of user interface callbacks may be registered with a WebEngine object. These callbacks are invoked when a script running on the page requests a user interface operation to be performed, for example, opens a popup window or changes status text. A WebEngine object cannot handle such requests internally, so it passes the request to the corresponding callbacks. If no callback is defined for a specific operation, the request is silently ignored.

    The table below shows JavaScript user interface methods and properties with their corresponding WebEngine callbacks:

    JavaScript Callback Table
    JavaScript method/property WebEngine callback
    window.alert()onAlert
    window.confirm()confirmHandler
    window.open()createPopupHandler
    window.open() and
    window.close()
    onVisibilityChanged
    window.prompt()promptHandler
    Setting window.statusonStatusChanged
    Setting any of the following:
    window.innerWidth, window.innerHeight,
    window.outerWidth, window.outerHeight,
    window.screenX, window.screenY,
    window.screenLeft, window.screenTop
    onResized

    The following example shows a callback that resizes a browser window:

    
        Stage stage;
        webEngine.setOnResized(
            new EventHandler<WebEvent<Rectangle2D>>() {
                public void handle(WebEvent<Rectangle2D> ev) {
                    Rectangle2D r = ev.getData();
                    stage.setWidth(r.getWidth());
                    stage.setHeight(r.getHeight());
                }
            });
     

    Access to Document Model

    The WebEngine objects create and manage a Document Object Model (DOM) for their Web pages. The model can be accessed and modified using Java DOM Core classes. The getDocument() method provides access to the root of the model. Additionally DOM Event specification is supported to define event handlers in Java code.

    The following example attaches a Java event listener to an element of a Web page. Clicking on the element causes the application to exit:

    
        EventListener listener = new EventListener() {
            public void handleEvent(Event ev) {
                Platform.exit();
            }
        };
    
        Document doc = webEngine.getDocument();
        Element el = doc.getElementById("exit-app");
        ((EventTarget) el).addEventListener("click", listener, false);
     

    Evaluating JavaScript expressions

    It is possible to execute arbitrary JavaScript code in the context of the current page using the executeScript(java.lang.String) method. For example:

    
        webEngine.executeScript("history.back()");
     

    The execution result is returned to the caller, as described in the next section.

    Mapping JavaScript values to Java objects

    JavaScript values are represented using the obvious Java classes: null becomes Java null; a boolean becomes a java.lang.Boolean; and a string becomes a java.lang.String. A number can be java.lang.Double or a java.lang.Integer, depending. The undefined value maps to a specific unique String object whose value is "undefined".

    If the result is a JavaScript object, it is wrapped as an instance of the JSObject class. (As a special case, if the JavaScript object is a JavaRuntimeObject as discussed in the next section, then the original Java object is extracted instead.) The JSObject class is a proxy that provides access to methods and properties of its underlying JavaScript object. The most commonly used JSObject methods are getMember (to read a named property), setMember (to set or define a property), and call (to call a function-valued property).

    A DOM Node is mapped to an object that both extends JSObject and implements the appropriate DOM interfaces. To get a JSObject object for a Node just do a cast:

     JSObject jdoc = (JSObject) webEngine.getDocument();
     

    In some cases the context provides a specific Java type that guides the conversion. For example if setting a Java String field from a JavaScript expression, then the JavaScript value is converted to a string.

    Mapping Java objects to JavaScript values

    The arguments of the JSObject methods setMember and call pass Java objects to the JavaScript environment. This is roughly the inverse of the JavaScript-to-Java mapping described above: Java String, Number, or Boolean objects are converted to the obvious JavaScript values. A JSObject object is converted to the original wrapped JavaScript object. Otherwise a JavaRuntimeObject is created. This is a JavaScript object that acts as a proxy for the Java object, in that accessing properties of the JavaRuntimeObject causes the Java field or method with the same name to be accessed.

    Note that the Java objects bound using JSObject.setMember, JSObject.setSlot, and JSObject.call are implemented using weak references. This means that the Java object can be garbage collected, causing subsequent accesses to the JavaScript objects to have no effect.

    Calling back to Java from JavaScript

    The JSObject.setMember method is useful to enable upcalls from JavaScript into Java code, as illustrated by the following example. The Java code establishes a new JavaScript object named app. This object has one public member, the method exit.

    
    public class JavaApplication {
        public void exit() {
            Platform.exit();
        }
    }
    ...
    JavaApplication javaApp = new JavaApplication();
    JSObject window = (JSObject) webEngine.executeScript("window");
    window.setMember("app", javaApp);
     
    You can then refer to the object and the method from your HTML page:
    
        <a href="" onclick="app.exit()">Click here to exit application</a>
     

    When a user clicks the link the application is closed.

    Note that in the above example, the application holds a reference to the JavaApplication instance. This is required for the callback from JavaScript to execute the desired method.

    In the following example, the application does not hold a reference to the Java object:

    
     JSObject window = (JSObject) webEngine.executeScript("window");
     window.setMember("app", new JavaApplication());
     

    In this case, since the property value is a local object, "new JavaApplication()", the value may be garbage collected in next GC cycle.

    When a user clicks the link, it does not guarantee to execute the callback method exit.

    If there are multiple Java methods with the given name, then the engine selects one matching the number of parameters in the call. (Varargs are not handled.) An unspecified one is chosen if there are multiple ones with the correct number of parameters.

    You can pick a specific overloaded method by listing the parameter types in an "extended method name", which has the form "method_name(param_type1,...,param_typen)". Typically you'd write the JavaScript expression:

     receiver["method_name(param_type1,...,param_typeN)"](arg1,...,argN)
     

    The Java class and method must both be declared public.

    Deploying an Application as a Module

    If any Java class passed to JavaScript is in a named module, then it must be reflectively accessible to the javafx.web module. A class is reflectively accessible if the module opens the containing package to at least the javafx.web module. Otherwise, the method will not be called, and no error or warning will be produced.

    For example, if com.foo.MyClass is in the foo.app module, the module-info.java might look like this:

    module foo.app {
        opens com.foo to javafx.web;
    }

    Alternatively, a class is reflectively accessible if the module exports the containing package unconditionally.

    Threading

    WebEngine objects must be created and accessed solely from the JavaFX Application thread. This rule also applies to any DOM and JavaScript objects obtained from the WebEngine object.

    Since:
    JavaFX 2.0
    • Property Detail

      • location

        public final ReadOnlyStringProperty locationProperty
        URL of the current Web page. If the current page has no URL, the value is an empty String.
        See Also:
        getLocation()
      • title

        public final ReadOnlyStringProperty titleProperty
        Title of the current Web page. If the current page has no title, the value is null.
        See Also:
        getTitle()
      • userDataDirectory

        public final ObjectProperty<File> userDataDirectoryProperty
        Specifies the directory to be used by this WebEngine to store local user data.

        If the value of this property is not null, the WebEngine will attempt to store local user data in the respective directory. If the value of this property is null, the WebEngine will attempt to store local user data in an automatically selected system-dependent user- and application-specific directory.

        When a WebEngine is about to start loading a web page or executing a script for the first time, it checks whether it can actually use the directory specified by this property. If the check fails for some reason, the WebEngine invokes the WebEngine.onError event handler, if any, with a WebErrorEvent describing the reason. If the invoked event handler modifies the userDataDirectory property, the WebEngine retries with the new value as soon as the handler returns. If the handler does not modify the userDataDirectory property (which is the default), the WebEngine continues without local user data.

        Once the WebEngine has started loading a web page or executing a script, changes made to this property have no effect on where the WebEngine stores or will store local user data.

        Currently, the directory specified by this property is used only to store the data that backs the window.localStorage objects. In the future, more types of data can be added.

        Default value:
        null
        Since:
        JavaFX 8.0
        See Also:
        getUserDataDirectory(), setUserDataDirectory(File)
      • userAgent

        public final StringProperty userAgentProperty
        Specifies user agent ID string. This string is the value of the User-Agent HTTP header.
        Default value:
        system dependent
        Since:
        JavaFX 8.0
        See Also:
        getUserAgent(), setUserAgent(String)
      • createPopupHandler

        public final ObjectProperty<Callback<PopupFeatures,​WebEngine>> createPopupHandlerProperty
        JavaScript popup handler property. This handler is invoked when a script running on the Web page requests a popup to be created.

        To satisfy this request a handler may create a new WebEngine, attach a visibility handler and optionally a resize handler, and return the newly created engine. To block the popup, a handler should return null.

        By default, a popup handler is installed that opens popups in this WebEngine.

        See Also:
        getCreatePopupHandler(), setCreatePopupHandler(Callback)
    • Constructor Detail

      • WebEngine

        public WebEngine()
        Creates a new engine.
      • WebEngine

        public WebEngine​(String url)
        Creates a new engine and loads a Web page into it.
        Parameters:
        url - the URL of the web page to load
    • Method Detail

      • getLoadWorker

        public final Worker<Void> getLoadWorker()
        Returns a Worker object that can be used to track loading progress.
        Returns:
        the Worker object
      • getDocument

        public final Document getDocument()
        Gets the value of the property document.
        Property description:
        Document object for the current Web page. The value is null if the Web page failed to load.
      • getLocation

        public final String getLocation()
        Gets the value of the property location.
        Property description:
        URL of the current Web page. If the current page has no URL, the value is an empty String.
      • locationProperty

        public final ReadOnlyStringProperty locationProperty()
        URL of the current Web page. If the current page has no URL, the value is an empty String.
        See Also:
        getLocation()
      • getTitle

        public final String getTitle()
        Gets the value of the property title.
        Property description:
        Title of the current Web page. If the current page has no title, the value is null.
      • titleProperty

        public final ReadOnlyStringProperty titleProperty()
        Title of the current Web page. If the current page has no title, the value is null.
        See Also:
        getTitle()
      • setJavaScriptEnabled

        public final void setJavaScriptEnabled​(boolean value)
        Sets the value of the property javaScriptEnabled.
        Property description:
        Specifies whether JavaScript execution is enabled.
        Default value:
        true
        Since:
        JavaFX 2.2
      • isJavaScriptEnabled

        public final boolean isJavaScriptEnabled()
        Gets the value of the property javaScriptEnabled.
        Property description:
        Specifies whether JavaScript execution is enabled.
        Default value:
        true
        Since:
        JavaFX 2.2
      • setUserStyleSheetLocation

        public final void setUserStyleSheetLocation​(String value)
        Sets the value of the property userStyleSheetLocation.
        Property description:
        Location of the user stylesheet as a string URL.

        This should be a local URL, i.e. either 'data:', 'file:', or 'jar:'. Remote URLs are not allowed for security reasons.

        Default value:
        null
        Since:
        JavaFX 2.2
      • getUserStyleSheetLocation

        public final String getUserStyleSheetLocation()
        Gets the value of the property userStyleSheetLocation.
        Property description:
        Location of the user stylesheet as a string URL.

        This should be a local URL, i.e. either 'data:', 'file:', or 'jar:'. Remote URLs are not allowed for security reasons.

        Default value:
        null
        Since:
        JavaFX 2.2
      • userStyleSheetLocationProperty

        public final StringProperty userStyleSheetLocationProperty()
        Location of the user stylesheet as a string URL.

        This should be a local URL, i.e. either 'data:', 'file:', or 'jar:'. Remote URLs are not allowed for security reasons.

        Default value:
        null
        Since:
        JavaFX 2.2
        See Also:
        getUserStyleSheetLocation(), setUserStyleSheetLocation(String)
      • getUserDataDirectory

        public final File getUserDataDirectory()
        Gets the value of the property userDataDirectory.
        Property description:
        Specifies the directory to be used by this WebEngine to store local user data.

        If the value of this property is not null, the WebEngine will attempt to store local user data in the respective directory. If the value of this property is null, the WebEngine will attempt to store local user data in an automatically selected system-dependent user- and application-specific directory.

        When a WebEngine is about to start loading a web page or executing a script for the first time, it checks whether it can actually use the directory specified by this property. If the check fails for some reason, the WebEngine invokes the WebEngine.onError event handler, if any, with a WebErrorEvent describing the reason. If the invoked event handler modifies the userDataDirectory property, the WebEngine retries with the new value as soon as the handler returns. If the handler does not modify the userDataDirectory property (which is the default), the WebEngine continues without local user data.

        Once the WebEngine has started loading a web page or executing a script, changes made to this property have no effect on where the WebEngine stores or will store local user data.

        Currently, the directory specified by this property is used only to store the data that backs the window.localStorage objects. In the future, more types of data can be added.

        Default value:
        null
        Since:
        JavaFX 8.0
      • setUserDataDirectory

        public final void setUserDataDirectory​(File value)
        Sets the value of the property userDataDirectory.
        Property description:
        Specifies the directory to be used by this WebEngine to store local user data.

        If the value of this property is not null, the WebEngine will attempt to store local user data in the respective directory. If the value of this property is null, the WebEngine will attempt to store local user data in an automatically selected system-dependent user- and application-specific directory.

        When a WebEngine is about to start loading a web page or executing a script for the first time, it checks whether it can actually use the directory specified by this property. If the check fails for some reason, the WebEngine invokes the WebEngine.onError event handler, if any, with a WebErrorEvent describing the reason. If the invoked event handler modifies the userDataDirectory property, the WebEngine retries with the new value as soon as the handler returns. If the handler does not modify the userDataDirectory property (which is the default), the WebEngine continues without local user data.

        Once the WebEngine has started loading a web page or executing a script, changes made to this property have no effect on where the WebEngine stores or will store local user data.

        Currently, the directory specified by this property is used only to store the data that backs the window.localStorage objects. In the future, more types of data can be added.

        Default value:
        null
        Since:
        JavaFX 8.0
      • userDataDirectoryProperty

        public final ObjectProperty<File> userDataDirectoryProperty()
        Specifies the directory to be used by this WebEngine to store local user data.

        If the value of this property is not null, the WebEngine will attempt to store local user data in the respective directory. If the value of this property is null, the WebEngine will attempt to store local user data in an automatically selected system-dependent user- and application-specific directory.

        When a WebEngine is about to start loading a web page or executing a script for the first time, it checks whether it can actually use the directory specified by this property. If the check fails for some reason, the WebEngine invokes the WebEngine.onError event handler, if any, with a WebErrorEvent describing the reason. If the invoked event handler modifies the userDataDirectory property, the WebEngine retries with the new value as soon as the handler returns. If the handler does not modify the userDataDirectory property (which is the default), the WebEngine continues without local user data.

        Once the WebEngine has started loading a web page or executing a script, changes made to this property have no effect on where the WebEngine stores or will store local user data.

        Currently, the directory specified by this property is used only to store the data that backs the window.localStorage objects. In the future, more types of data can be added.

        Default value:
        null
        Since:
        JavaFX 8.0
        See Also:
        getUserDataDirectory(), setUserDataDirectory(File)
      • setUserAgent

        public final void setUserAgent​(String value)
        Sets the value of the property userAgent.
        Property description:
        Specifies user agent ID string. This string is the value of the User-Agent HTTP header.
        Default value:
        system dependent
        Since:
        JavaFX 8.0
      • getUserAgent

        public final String getUserAgent()
        Gets the value of the property userAgent.
        Property description:
        Specifies user agent ID string. This string is the value of the User-Agent HTTP header.
        Default value:
        system dependent
        Since:
        JavaFX 8.0
      • userAgentProperty

        public final StringProperty userAgentProperty()
        Specifies user agent ID string. This string is the value of the User-Agent HTTP header.
        Default value:
        system dependent
        Since:
        JavaFX 8.0
        See Also:
        getUserAgent(), setUserAgent(String)
      • getOnAlert

        public final EventHandler<WebEvent<String>> getOnAlert()
        Gets the value of the property onAlert.
        Property description:
        JavaScript alert handler property. This handler is invoked when a script running on the Web page calls the alert function.
      • setOnAlert

        public final void setOnAlert​(EventHandler<WebEvent<String>> handler)
        Sets the value of the property onAlert.
        Property description:
        JavaScript alert handler property. This handler is invoked when a script running on the Web page calls the alert function.
      • getOnStatusChanged

        public final EventHandler<WebEvent<String>> getOnStatusChanged()
        Gets the value of the property onStatusChanged.
        Property description:
        JavaScript status handler property. This handler is invoked when a script running on the Web page sets window.status property.
      • setOnStatusChanged

        public final void setOnStatusChanged​(EventHandler<WebEvent<String>> handler)
        Sets the value of the property onStatusChanged.
        Property description:
        JavaScript status handler property. This handler is invoked when a script running on the Web page sets window.status property.
      • getOnResized

        public final EventHandler<WebEvent<Rectangle2D>> getOnResized()
        Gets the value of the property onResized.
        Property description:
        JavaScript window resize handler property. This handler is invoked when a script running on the Web page moves or resizes the window object.
      • setOnResized

        public final void setOnResized​(EventHandler<WebEvent<Rectangle2D>> handler)
        Sets the value of the property onResized.
        Property description:
        JavaScript window resize handler property. This handler is invoked when a script running on the Web page moves or resizes the window object.
      • getOnVisibilityChanged

        public final EventHandler<WebEvent<Boolean>> getOnVisibilityChanged()
        Gets the value of the property onVisibilityChanged.
        Property description:
        JavaScript window visibility handler property. This handler is invoked when a script running on the Web page changes visibility of the window object.
      • setOnVisibilityChanged

        public final void setOnVisibilityChanged​(EventHandler<WebEvent<Boolean>> handler)
        Sets the value of the property onVisibilityChanged.
        Property description:
        JavaScript window visibility handler property. This handler is invoked when a script running on the Web page changes visibility of the window object.
      • getCreatePopupHandler

        public final Callback<PopupFeatures,​WebEngine> getCreatePopupHandler()
        Gets the value of the property createPopupHandler.
        Property description:
        JavaScript popup handler property. This handler is invoked when a script running on the Web page requests a popup to be created.

        To satisfy this request a handler may create a new WebEngine, attach a visibility handler and optionally a resize handler, and return the newly created engine. To block the popup, a handler should return null.

        By default, a popup handler is installed that opens popups in this WebEngine.

      • setCreatePopupHandler

        public final void setCreatePopupHandler​(Callback<PopupFeatures,​WebEngine> handler)
        Sets the value of the property createPopupHandler.
        Property description:
        JavaScript popup handler property. This handler is invoked when a script running on the Web page requests a popup to be created.

        To satisfy this request a handler may create a new WebEngine, attach a visibility handler and optionally a resize handler, and return the newly created engine. To block the popup, a handler should return null.

        By default, a popup handler is installed that opens popups in this WebEngine.

      • createPopupHandlerProperty

        public final ObjectProperty<Callback<PopupFeatures,​WebEngine>> createPopupHandlerProperty()
        JavaScript popup handler property. This handler is invoked when a script running on the Web page requests a popup to be created.

        To satisfy this request a handler may create a new WebEngine, attach a visibility handler and optionally a resize handler, and return the newly created engine. To block the popup, a handler should return null.

        By default, a popup handler is installed that opens popups in this WebEngine.

        See Also:
        getCreatePopupHandler(), setCreatePopupHandler(Callback)
      • getConfirmHandler

        public final Callback<String,​Boolean> getConfirmHandler()
        Gets the value of the property confirmHandler.
        Property description:
        JavaScript confirm handler property. This handler is invoked when a script running on the Web page calls the confirm function.

        An implementation may display a dialog box with Yes and No options, and return the user's choice.

      • setConfirmHandler

        public final void setConfirmHandler​(Callback<String,​Boolean> handler)
        Sets the value of the property confirmHandler.
        Property description:
        JavaScript confirm handler property. This handler is invoked when a script running on the Web page calls the confirm function.

        An implementation may display a dialog box with Yes and No options, and return the user's choice.

      • getPromptHandler

        public final Callback<PromptData,​String> getPromptHandler()
        Gets the value of the property promptHandler.
        Property description:
        JavaScript prompt handler property. This handler is invoked when a script running on the Web page calls the prompt function.

        An implementation may display a dialog box with an text field, and return the user's input.

      • setPromptHandler

        public final void setPromptHandler​(Callback<PromptData,​String> handler)
        Sets the value of the property promptHandler.
        Property description:
        JavaScript prompt handler property. This handler is invoked when a script running on the Web page calls the prompt function.

        An implementation may display a dialog box with an text field, and return the user's input.

      • getOnError

        public final EventHandler<WebErrorEvent> getOnError()
        Gets the value of the property onError.
        Property description:
        The event handler called when an error occurs.
        Default value:
        null
        Since:
        JavaFX 8.0
      • setOnError

        public final void setOnError​(EventHandler<WebErrorEvent> handler)
        Sets the value of the property onError.
        Property description:
        The event handler called when an error occurs.
        Default value:
        null
        Since:
        JavaFX 8.0
      • load

        public void load​(String url)
        Loads a Web page into this engine. This method starts asynchronous loading and returns immediately.
        Parameters:
        url - URL of the web page to load
      • loadContent

        public void loadContent​(String content)
        Loads the given HTML content directly. This method is useful when you have an HTML String composed in memory, or loaded from some system which cannot be reached via a URL (for example, the HTML text may have come from a database). As with load(String), this method is asynchronous.
        Parameters:
        content - the HTML content to load
      • loadContent

        public void loadContent​(String content,
                                String contentType)
        Loads the given content directly. This method is useful when you have content composed in memory, or loaded from some system which cannot be reached via a URL (for example, the SVG text may have come from a database). As with load(String), this method is asynchronous. This method also allows you to specify the content type of the string being loaded, and so may optionally support other types besides just HTML.
        Parameters:
        content - the HTML content to load
        contentType - the type of content to load
      • reload

        public void reload()
        Reloads the current page, whether loaded from URL or directly from a String in one of the loadContent methods.
      • getHistory

        public WebHistory getHistory()
        Returns the session history object.
        Returns:
        history object
        Since:
        JavaFX 2.2
      • executeScript

        public Object executeScript​(String script)
        Executes a script in the context of the current page.
        Parameters:
        script - the script
        Returns:
        execution result, converted to a Java object using the following rules:
        • JavaScript Int32 is converted to java.lang.Integer
        • Other JavaScript numbers to java.lang.Double
        • JavaScript string to java.lang.String
        • JavaScript boolean to java.lang.Boolean
        • JavaScript null to null
        • Most JavaScript objects get wrapped as netscape.javascript.JSObject
        • JavaScript JSNode objects get mapped to instances of netscape.javascript.JSObject, that also implement org.w3c.dom.Node
        • A special case is the JavaScript class JavaRuntimeObject which is used to wrap a Java object as a JavaScript value - in this case we just extract the original Java value.
      • print

        public void print​(PrinterJob job)
        Prints the current Web page using the given printer job.

        This method does not modify the state of the job, nor does it call PrinterJob.endJob(), so the job may be safely reused afterwards.

        Parameters:
        job - printer job used for printing
        Since:
        JavaFX 8.0