<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta name="copyright" content="Copyright (c) 2007, 2019 EclipseSource. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page."/>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
  <title>Browser Widget</title>
  <link rel="stylesheet" href="../../../PRODUCT_PLUGIN/book.css" type="text/css"/>
</head>
<body>

  <h1>Embedding Web-Components</h1>

  <h2>Browser Widget Overview</h2>

  <p>
    Using the SWT/RWT
    <em><a href="../reference/api/org/eclipse/swt/browser/Browser.html">Browser</a></em>
    widget, it is possible to embed HTML pages, simple JavaScript
    Applications, Flash-Objects, Java-Applets or any other web component seamlessly into your
    RAP (or SWT) application.
  </p>

  <p>
    In RAP, any HTML document (including JavaScript) placed in a <em>Browser</em> widget
    will end up in an <em>iframe</em> element. You can call JavaScript from Java by using
    <em><a href="../reference/api/org/eclipse/swt/browser/Browser.html#evaluate-java.lang.String-">evaluate</a></em>,
    and vice versa using the
    <code>BrowserFunction</code>
    <em><a href="../reference/api/org/eclipse/swt/browser/BrowserFunction.html">BrowserFunction</a></em>
    class.
    It's recommended
    to always use <em>evaluate</em> instead of
    <em><a href="../reference/api/org/eclipse/swt/browser/Browser.html#execute-java.lang.String-">execute</a></em>,
    since it throws an exception if the JavaScript execution fails.
    Before you can use <em>evaluate</em>, you must wait until the document is fully loaded,
    using either a
    <em><a href="../reference/api/org/eclipse/swt/browser/Browser.html#addProgressListener-org.eclipse.swt.browser.ProgressListener-">ProgressListener</a></em>
    or a <em>BrowserFunction</em>.
  </p>

  <h2 id="notes" >RAP-specific notes</h2>
  <h3 id="alt">Alternatives</h3>
  <p>
    The Browser-Widget is suitable for embedding complete HTML documents and very simple web apps.
    When you only want to display a few lines of rich/formatted text, use the more lightweight
    <a href="markup.html#markup">markup</a> feature instead. Also, keep in mind that each call
    to a <em>BrowserFunction</em> or to <em>evaluate</em> creates an HTTP request.
    To reduce the resulting traffic you can try combining subsequent call, but if you want to embed
    a web app/object that requires a lot of client-server communication, consider using
    the more efficient
    <a href="custom-widget.html#native">RAP Remote API</a>.
    <b>Note</b>, however, that
    both, markup and the JavaScript Remote API, are features of the RAP <a href="client.html">web client</a>,
    and are not available in SWT or on other clients.
    If SWT-Support is a requirement, use the <em>Brower</em> widget in any case.
  </p>

  <h3 id="security">Browser security restrictions</h3>
  <p>
    Since the browser widget is based on the HTML <em>iframe</em> element,
    all security restrictions regarding cross-frame-scripting apply. This means for
    <em>execute</em>, <em>evaluate</em> and <em>BrowserFunction</em> to work,
    the document loaded in the browser widget has to come from the
    same domain and port that the RAP application is loaded from. This is automatically given
    if the
    <em><a href="../reference/api/org/eclipse/swt/browser/Browser.html#setText-java.lang.String-">setText</a></em>
    method is used, or the file is registered as a <a href="#resources">static resource</a>.
    <br/>
  </p>

  <h3 id="resources">Resources</h3>
  <p>
    It's important to decide how your resources (HTML, JavaScript, CSS and image files) are
    provided to the browser widget. If you use only a moderate amount of HTML with inlined
    JavaScript and/or CSS (and <i>no images</i>), or your non-HTML resources can be loaded from
    a different HTTP-server, it will suffice to use the
    <em><a href="../reference/api/org/eclipse/swt/browser/Browser.html#setText-java.lang.String-">setText</a></em>
    method of the browser
    widget. This code would then also run in an SWT application. However, when using
    <em>setText</em>, the client browser can not cache the loaded document, so each new instance has
    to load and parse it again.
    A good example of a custom widget using this strategy is the
    <em>Browser</em>-based <a href="https://github.com/eclipsesource/rap-gmap">
    Google Maps widget</a>. It runs in SWT and in RAP.
    When a not all resources can be inlined in the HTML file (like images), and they are to be
    provided by the RAP application itself, it is necessary to register them as
    <a href="resources.html">static resources</a>.
  </p>

  <h3>Limitations in JEE Mode</h3>
  <p>
      When using the
      <a href="application-setup.html#compat">JEE compatibility</a>
      <a href="../reference/api/org/eclipse/rap/rwt/application/Application.OperationMode.html">OperationMode</a>
      (the default for non-workbench based applications), then
      the <em>executeScript</em> and <em>evaluate</em> methods will not block program
      execution.
      Like with dialogs, a RAP-only method
      <em><a href="../reference/api/org/eclipse/swt/browser/Browser.html#evaluate-java.lang.String-org.eclipse.rap.rwt.widgets.BrowserCallback-">evaluate(String, BrowserCallback)</a></em>,
      is available, which lets you register a callback to receive the results of the <em>evaluate</em>
      call. However, this pattern makes implementing a traditional "getter" impossible.
      In <a href="application-setup.html#compat">SWT compatibility</a> mode you can write:
    </p>
    <pre  class="lang-java">
public String getText() {
  // assuming the web app is already fully loaded and initialized:
  return ( String )browser.evaluate( "return myWidget.getData();" );
}</pre>
  <p>
    In JEE compatibility mode you would have to write
    something like this:
  </p>
   <pre class="lang-java">
public void getText( final MyCallback callback ) {
  browser.evaluate( "return myWidget.getData();", new BrowserCallback() {
    public void evaluationSucceeded( Object result ) {
      callback.handleGetText( ( String )result );
    }
    public void evaluationFailed( Exception exception ) {
      throw new RuntimeException( exception );
    }
  } );
}</pre>
  <p>
    If you are writing a custom widget that is supposed to feature getter that need to obtain their
    value using <em>evaluate</em>, either use the SWT compatibility mode, or consider
    another type of <a href="custom-widget.html">custom widget</a>.
  </p>

</body>
</html>
