Browse Source

Update HTML5 platform docs

Leon Krause 6 years ago
parent
commit
4cb5df447b

+ 10 - 10
development/compiling/compiling_for_web.rst

@@ -10,7 +10,7 @@ Requirements
 
 
 To compile export templates for the Web, the following is required:
 To compile export templates for the Web, the following is required:
 
 
--  `Emscripten 1.37.9+ <http://kripken.github.io/emscripten-site>`__: If the version available
+-  `Emscripten 1.38.22+ <http://kripken.github.io/emscripten-site>`__: If the version available
    per package manager is not recent enough, the best alternative is to install
    per package manager is not recent enough, the best alternative is to install
    using the `Emscripten SDK <http://kripken.github.io/emscripten-site/docs/getting_started/downloads.html>`__
    using the `Emscripten SDK <http://kripken.github.io/emscripten-site/docs/getting_started/downloads.html>`__
 -  `Python 2.7+ or Python 3.5+ <https://www.python.org/>`__
 -  `Python 2.7+ or Python 3.5+ <https://www.python.org/>`__
@@ -29,6 +29,11 @@ written by the Emscripten SDK, e.g. when invoking ``emsdk activate latest``,
 or by your package manager. It's also created when starting Emscripten's
 or by your package manager. It's also created when starting Emscripten's
 ``emcc`` program if the file doesn't exist.
 ``emcc`` program if the file doesn't exist.
 
 
+.. Attention::
+ On Windows, make sure to escape backslashes of paths within the Emscripten
+ configuration file as double backslashes ``\\`` or use Unix-style paths with a
+ single forward slash ``/``.
+
 Open a terminal and navigate to the root directory of the engine source code.
 Open a terminal and navigate to the root directory of the engine source code.
 Then instruct SCons to build the JavaScript platform. Specify ``target`` as
 Then instruct SCons to build the JavaScript platform. Specify ``target`` as
 either ``release`` for a release build or ``release_debug`` for a debug build::
 either ``release`` for a release build or ``release_debug`` for a debug build::
@@ -66,18 +71,13 @@ asm.js, a highly optimizable subset of JavaScript, using Emscripten's
 tool called ``asm2wasm``. Emscripten automatically takes care of both
 tool called ``asm2wasm``. Emscripten automatically takes care of both
 processes, we simply run SCons.
 processes, we simply run SCons.
 
 
-The other method uses LLVM's WebAssembly backend. This backend is not yet
-available in release versions of LLVM, only in development builds built with
-``LLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly``.
-Compiling with this backend outputs files in LLVM's ``.s`` format, which is
-translated into actual WebAssembly using a tool called ``s2wasm``.
-Emscripten manages these processes as well, so we just invoke SCons.
+The other method uses LLVM's WebAssembly backend. This backend is available
+starting with LLVM 8 or in development builds.
+Emscripten manages this process as well, so we just invoke SCons.
 
 
 In order to choose one of the two methods, the ``LLVM_ROOT`` variable in the
 In order to choose one of the two methods, the ``LLVM_ROOT`` variable in the
 Emscripten configuration file is used. If it points to a directory containing
 Emscripten configuration file is used. If it points to a directory containing
 binaries of Emscripten's *fastcomp* fork of clang, ``asm2wasm`` is used.
 binaries of Emscripten's *fastcomp* fork of clang, ``asm2wasm`` is used.
 This is the default in a normal Emscripten installation. Otherwise,
 This is the default in a normal Emscripten installation. Otherwise,
 LLVM binaries built with the WebAssembly backend will be expected and
 LLVM binaries built with the WebAssembly backend will be expected and
-``s2wasm`` is used. On Windows, make sure to escape backslashes of paths within
-this file as double backslashes ``\\`` or use Unix-style paths with a single
-forward slash ``/``.
+the LLVM's WebAssembly backend is used.

+ 0 - 238
getting_started/workflow/export/customizing_html5_shell.rst

@@ -1,238 +0,0 @@
-.. _doc_customizing_html5_shell:
-
-Customizing the Web export HTML page
-====================================
-
-Rather than the default HTML page that comes with the export templates, it is
-also possible to use a custom HTML page. This allows drastic customization of
-the final web presentation and behavior. The path to the custom HTML page is
-specified in the export options as ``Html/Custom Html Shell``.
-
-The default HTML page is available in the Godot Engine repository at
-`/misc/dist/html/default.html <https://github.com/godotengine/godot/blob/master/misc/dist/html/default.html>`_.
-Some simple use-cases where customizing the default page is useful include:
-
- - Loading files from a different directory
- - Loading a ``.zip`` file instead of a ``.pck`` file as main pack
- - Loading engine files from a different directory than the main pack file
- - Loading some extra files before the engine starts, so they are available in
-   the file system later
- - Passing custom "command line" arguments, e.g. ``-s`` to start a MainLoop script
-
-Placeholder substitution
-------------------------
-
-When exporting the game, several placeholders in the HTML page are replaced
-with values depending on the export:
-
-+------------------------------+-----------------------------------------------+
-| Placeholder                  | substituted by                                |
-+==============================+===============================================+
-| ``$GODOT_BASENAME``          | Basename of exported files without suffixes,  |
-|                              | e.g. ``game`` when exporting ``game.html``    |
-+------------------------------+-----------------------------------------------+
-| ``$GODOT_DEBUG_ENABLED``     | ``true`` if debugging, ``false`` otherwise    |
-+------------------------------+-----------------------------------------------+
-| ``$GODOT_HEAD_INCLUDE``      | Custom string to include just before the end  |
-|                              | of the HTML ``<head>`` element                |
-+------------------------------+-----------------------------------------------+
-
-The HTML file must evaluate the JavaScript file ``$GODOT_BASENAME.js``. This
-file defines a global ``Engine`` object used to start the engine, :ref:`see
-below <doc_javascript_engine_object>` for details.
-
-The boot splash image is exported as ``$GODOT_BASENAME.png`` and can be used
-e.g. in ``<img />`` elements.
-
-``$GODOT_DEBUG_ENABLED`` can be useful to optionally display e.g. an output
-console or other debug tools.
-
-``$GODOT_HEAD_INCLUDE`` is replaced with the string specified by the export
-option ``Html/Head Include``.
-
-.. _doc_javascript_engine_object:
-
-The ``Engine`` object
----------------------
-
-The JavaScript global object ``Engine`` is defined by ``$GODOT_BASENAME.js``
-and serves as an interface to the engine start-up process.
-
-The object itself has only two methods, ``load()`` and ``unload()``.
-
-``Engine.load(basePath)``
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Loads the engine from the passed base path.
-
-Returns a promise that resolves once the engine is loaded.
-
-``Engine.unload()``
-~~~~~~~~~~~~~~~~~~~
-
-Unloads the module to free memory. This is called automatically once the
-module is instantiated unless explicitly disabled.
-
-``Engine.isWebGLAvailable(majorVersion = 1)``
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Returns ``true`` if the given major version of WebGL is available,
-``false`` otherwise. Defaults to ``1`` for WebGL 1.0.
-
-Starting an ``Engine`` instance
--------------------------------
-
-The more interesting interface is accessed by instantiating ``Engine`` using
-the ``new`` operator:
-
-.. code-block:: js
-
-    var engine = new Engine();
-
-This ``Engine`` instance, referred to as ``engine`` with a lower-case ``e``
-from here, is a startable instance of the engine, usually a game. To start such
-an instance, the global ``Engine`` object must be loaded, then the ``engine``
-instance must be initialized and started.
-
-``engine.init(basePath)``
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Initializes the instance. If the engine wasn't loaded yet, a base path
-must be passed from which the engine will be loaded.
-
-Returns a promise that resolves once the engine is loaded and initialized.
-It can then be started with ``engine.startGame()``
-
-``engine.preloadFile(file, path)``
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-This loads a file so it is available in the file system once the instance
-is started. This must be called **before** starting the instance.
-
-If ``file`` is a string, the file will be loaded from that URL. If ``file`` is
-an ``ArrayBuffer`` or a view on one, the buffer will used as the content of the
-file.
-
-If ``path`` is a string, it specifies the path by which the file will be
-available. This is mandatory if ``file`` is not a string.
-Otherwise, the path is derived from the URL of the loaded file.
-
-Returns a promise that resolves once the file is preloaded.
-
-``engine.start(arg1, arg2, …)``
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Starts the instance of the engine, handing the passed strings as arguments
-to the ``main()`` function. This allows great control over how the engine
-is used, but usually the other methods whose names start with ``engine.start``
-are simpler to use.
-
-Returns a promise that resolves once the engine started.
-
-``engine.startGame(mainPack)``
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Starts the game with the main pack loaded from the passed URL string and
-starts the engine with it.
-
-If the engine isn't loaded yet, the base path of the passed URL will be
-used to load the engine.
-
-Returns a promise that resolves once the game started.
-
-Configuring start-up behaviour
-------------------------------
-
-Beside starting the engine, other methods of the engine instance allow
-configuring the behavior:
-
-``engine.setUnloadAfterInit(enabled)``
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Sets whether the Engine will be unloaded automatically after the instance
-is initialized. This frees browser memory by unloading files that are no
-longer needed once the instance is initialized. However, if more instances of
-the engine will be started, the Engine will have to be loaded again.
-
-Defaults to ``true``.
-
-``engine.setCanvas(canvasElem)``
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-By default, the first canvas element on the page is used for rendering.
-By calling this method, another canvas can be specified.
-
-``engine.setCanvasResizedOnStart(enabled)``
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Sets whether the canvas will be resized to the width and height specified
-in the project settings on start. Defaults to ``true``.
-
-``engine.setLocale(locale)``
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-By default, the engine will try to guess the locale to use from the
-JavaScript environment. It is usually preferable to use a server-side
-user-specified locale, or at least use the locale requested in the HTTP
-``Accept-Language`` header. This method allows specifying such a custom locale
-string.
-
-``engine.setExecutableName(execName)``
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-By default, the base name of the loaded engine files is used for the
-executable name. This method allows specifying another name.
-
-Customizing the presentation
-----------------------------
-
-The following methods are used to implement the presentation:
-
-``engine.setProgressFunc(func)``
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-This method is used to display download progress. The passed callback
-function is called with two number arguments, the first argument specifies
-bytes loaded so far, the second argument specifies the total number of bytes
-to load.
-
-.. code-block:: js
-
-    function printProgress(current, total) {
-        console.log("Loaded " + current + " of " + total + " bytes");
-    }
-    engine.setProgressFunc(printProgress);
-
-If the total is 0, it couldn't be calculated. Possible reasons
-include:
-
- -  Files are delivered with server-side chunked compression
- -  Files are delivered with server-side compression on Chromium
- -  Not all file downloads have started yet (usually on servers without multi-threading)
-
-``engine.setStdoutFunc(func)``, ``engine.setStderrFunc(func)``
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-These methods allow implementing custom behavior for the ``stdout`` and
-``stderr`` streams. The functions passed in will be called with one string
-argument specifying the string to print.
-
-.. code-block:: js
-
-    function printStderr(text) {
-        console.warn("Error: " + text);
-    }
-    engine.setStderrFunc(printStderr);
-
-These methods should usually only be used in debug pages. The
-``$GODOT_DEBUG_ENABLED`` placeholder can be used to check for this.
-
-By default, ``console.log()`` and ``console.warn()`` are used respectively.
-
-Accessing the Emscripten ``Module``
------------------------------------
-
-If you know what you're doing, you can access the runtime environment
-(Emscripten's ``Module``) as ``engine.rtenv``. Check the official Emscripten
-documentation for information on how to use it:
-https://kripken.github.io/emscripten-site/docs/api_reference/module.html

+ 92 - 52
getting_started/workflow/export/exporting_for_web.rst

@@ -4,12 +4,40 @@ Exporting for the Web
 =====================
 =====================
 
 
 HTML5 export allows publishing games made in Godot Engine to the browser.
 HTML5 export allows publishing games made in Godot Engine to the browser.
-This requires support for the recent technologies `WebAssembly
-<https://webassembly.org/>`__ and `WebGL 2.0 <https://www.khronos.org/webgl/>`__
-in the user's browser. **Firefox** and **Chromium** (Chrome, Opera) are
-the most popular supported browsers, **Safari** and **Edge** do not work yet.
-On **iOS**, all browsers must be based on WebKit (i.e. Safari), so they will also
-not work.
+This requires support for `WebAssembly
+<https://webassembly.org/>`__ and `WebGL <https://www.khronos.org/webgl/>`__
+in the user's browser.
+
+.. Important::
+ Use the browser-integrated developer console, usually opened with :kbd:`F12`,
+ to view **debug information** like JavaScript, engine, and WebGL errors.
+
+.. Attention::
+ Many browsers, Chromium-based browsers specifically, will not load exported
+ projects when **opened locally** per ``file://`` protocol. To get around this,
+ use a local server.
+
+ .. Tip::
+  Python offers an easy method to start a local server. Use
+  ``python -m SimpleHTTPServer`` with Python 2 or ``python -m http.server`` with
+  Python 3 to serve the current working directory at ``http://localhost:8000``.
+
+WebGL 2
+-------
+
+Until the *OpenGL ES 3* renderer is removed from Godot in favor of *Vulkan*,
+HTML5 export uses *WebGL 2* when the *GLES3* option selected.
+
+.. Warning::
+ Usage of WebGL 2 is not recommended due to its expected removal from Godot
+ without replacement.
+
+WebGL 2 is not supported in all browsers. **Firefox** and
+**Chromium** (Chrome, Opera) are the most popular supported browsers,
+**Safari** and **Edge** do not work. On **iOS**, all browsers are based on
+WebKit (i.e. Safari), so they will also not work.
+
+Godot's WebGL 2 renderer has issues with 3D and is no longer maintained.
 
 
 Limitations
 Limitations
 -----------
 -----------
@@ -18,13 +46,6 @@ For security and privacy reasons, many features that work effortlessly on
 native platforms are more complicated on the web platform. Following is a list
 native platforms are more complicated on the web platform. Following is a list
 of limitations you should be aware of when porting a Godot game to the web.
 of limitations you should be aware of when porting a Godot game to the web.
 
 
-Exported ``.html`` file must not be reused
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-On export, several text placeholders are replaced in the **generated HTML
-file** specifically for the given export options. It must not be reused in
-further exports.
-
 Using cookies for data persistence
 Using cookies for data persistence
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
@@ -40,26 +61,51 @@ cases.
 Full screen and mouse capture
 Full screen and mouse capture
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
-Browsers do not allow arbitrarily **entering full screen** at any time. The same
-goes for **capturing the cursor**. Instead, these actions have to occur as a
-response to a JavaScript input event. In Godot, this is most easily done by
-entering full screen from within an input callback such as ``_input`` or
-``_unhandled_input``.
+Browsers do not allow arbitrarily **entering full screen**. The same goes for
+**capturing the cursor**. Instead, these actions have to occur as a response to
+a JavaScript input event. In Godot, this means entering full screen from within
+a pressed input event callback such as ``_input`` or ``_unhandled_input``.
+Querying the :ref:`class_Input` singleton is not sufficient, the relevant
+input event must currently be active.
+
+For the same reason, the full screen project setting doesn't work unless the
+engine is started from within a valid input event handler. This requires
+:ref:`customization of the HTML page <doc_customizing_html5_shell>`.
+
+Audio autoplay
+~~~~~~~~~~~~~~
 
 
-For the same reason, the full screen project setting is ignored.
+Chrome restricts how websites may play audio. It may be necessary for the
+player to click or tap or press a key to enable audio.
 
 
-HTTPClient
-~~~~~~~~~~
+.. seealso::
+ Google offers additional information about their `Web Audio autoplay policies <https://sites.google.com/a/chromium.org/dev/audio-video/autoplay>`__.
 
 
-The ``HTTPClient`` implementation for the HTML5 platform has several
-restrictions:
+:ref:`class_HTTPClient` and :ref:`class_HTTPRequest`
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The HTTP classes have several restrictions on the HTML5 platform:
 
 
  -  Accessing or changing the ``StreamPeer`` is not possible
  -  Accessing or changing the ``StreamPeer`` is not possible
- -  Blocking mode is not available
+ -  Threaded/Blocking mode is not available
  -  Cannot progress more than once per frame, so polling in a loop will freeze
  -  Cannot progress more than once per frame, so polling in a loop will freeze
  -  No chunked responses
  -  No chunked responses
  -  Host verification cannot be disabled
  -  Host verification cannot be disabled
- -  Subject to `same-origin policy <https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy>`_
+ -  Subject to `same-origin policy <https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy>`__
+
+Exported ``.html`` file must not be reused
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+On export, several text placeholders are replaced in the **generated HTML
+file** specifically for the given export options. It must not be reused in
+further exports.
+
+Boot splash is not displayed
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The default HTML page does not display the boot splash while loading. However,
+the image is exported as a PNG file, so :ref:`custom HTML pages <doc_customizing_html5_shell>`
+can display it.
 
 
 Unimplemented functionality
 Unimplemented functionality
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -68,23 +114,14 @@ The following functionality is currently unavailable on the HTML5 platform:
 
 
  -  Threads
  -  Threads
  -  GDNative
  -  GDNative
+ -  C#
  -  Clipboard synchronisation between engine and operating system
  -  Clipboard synchronisation between engine and operating system
- -  Networking other than ``HTTPClient``
-
-Check the `list of open HTML5 issues on Github <https://github.com/godotengine/godot/issues?q=is:open+is:issue+label:platform:html5>`_
-to see if functionality you're interested in has an issue yet. If not, open one
-to communicate your interest.
-
-Starting exported games from the local file system
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ -  Networking other than :ref:`class_HTTPClient` and :ref:`class_WebSocketClient`
 
 
-Many browsers, Chromium-based browsers specifically, will not load exported
-projects when **opened locally** per ``file://`` protocol. To get around this,
-use a local server.
-
-Python offers an easy method for this; using ``python -m SimpleHTTPServer``
-with Python 2 or ``python -m http.server`` with Python 3 will serve the current
-working directory on ``http://localhost:8000``.
+.. Tip::
+ Check the `list of open HTML5 issues on Github <https://github.com/godotengine/godot/issues?q=is:open+is:issue+label:platform:html5>`__
+ to see if functionality you're interested in has an issue yet. If not, open
+ one to communicate your interest.
 
 
 Serving the files
 Serving the files
 -----------------
 -----------------
@@ -97,8 +134,7 @@ The generated ``.html`` file can be used as ``DirectoryIndex`` in Apache
 servers and can be renamed to e.g. ``index.html`` at any time, its name is
 servers and can be renamed to e.g. ``index.html`` at any time, its name is
 never depended on by default.
 never depended on by default.
 
 
-The HTML page is designed to fit the game perfectly without cutting off
-parts of the canvas when the browser window is scaled to the game's dimensions.
+The HTML page draws the game at maximum size within the browser window.
 This way it can be inserted into an ``<iframe>`` with the game's size, as is
 This way it can be inserted into an ``<iframe>`` with the game's size, as is
 common on most web game hosting sites.
 common on most web game hosting sites.
 
 
@@ -111,8 +147,12 @@ the default HTML page, but is included for
 :ref:`custom HTML pages <doc_customizing_html5_shell>`.
 :ref:`custom HTML pages <doc_customizing_html5_shell>`.
 
 
 The ``.pck`` file is binary, usually delivered with the MIME-type
 The ``.pck`` file is binary, usually delivered with the MIME-type
-``application/octet-stream``. The ``.wasm`` file is delivered as
-``application/wasm``.
+:mimetype:`application/octet-stream`. The ``.wasm`` file is delivered as
+:mimetype:`application/wasm`.
+
+.. Caution::
+ Delivering the WebAssembly module (``.wasm``) with a MIME-type other than
+ :mimetype:`application/wasm` can prevent some start-up optimizations.
 
 
 Delivering the files with server-side compression is recommended especially for
 Delivering the files with server-side compression is recommended especially for
 the ``.pck`` and ``.wasm`` files, which are usually large in size.
 the ``.pck`` and ``.wasm`` files, which are usually large in size.
@@ -133,18 +173,12 @@ the default HTML page. See :ref:`doc_customizing_html5_shell`.
 HTML page. This allows to, for example, load webfonts and third-party
 HTML page. This allows to, for example, load webfonts and third-party
 JavaScript APIs, include CSS, or run JavaScript code.
 JavaScript APIs, include CSS, or run JavaScript code.
 
 
-Turning on **Export with Debug** when exporting will, in addition to enabling
-various debug features of the engine, display a debug output below the canvas
-when using the default HTML page, displaying JavaScript and engine errors.
-You can also use the browser-integrated developer console, usually opened with
-the F12 key, which often shows more information, including WebGL errors.
-
 .. _doc_javascript_eval:
 .. _doc_javascript_eval:
 
 
 Calling JavaScript from script
 Calling JavaScript from script
 ------------------------------
 ------------------------------
 
 
-In web builds, the ``JavaScript`` singleton is implemented. If offers a single
+In web builds, the ``JavaScript`` singleton is implemented. It offers a single
 method called ``eval`` that works similarly to the JavaScript function of the
 method called ``eval`` that works similarly to the JavaScript function of the
 same name. It takes a string as an argument and executes it as JavaScript code.
 same name. It takes a string as an argument and executes it as JavaScript code.
 This allows interacting with the browser in ways not possible with script
 This allows interacting with the browser in ways not possible with script
@@ -179,10 +213,16 @@ also return ``null``.  The availability of the singleton can be checked with the
 
 
     func my_func3():
     func my_func3():
         if OS.has_feature('JavaScript'):
         if OS.has_feature('JavaScript'):
-            JavaScript.eval("console.log('The JavaScript singleton is available')")
+            JavaScript.eval("""
+                console.log('The JavaScript singleton is available')
+            """)
         else:
         else:
             print("The JavaScript singleton is NOT available")
             print("The JavaScript singleton is NOT available")
 
 
+.. Tip::
+ GDScript's multi-line strings, surrounded by 3 quotes ``"""`` as in
+ ``my_func3()`` above, are useful to keep JavaScript code readable.
+
 The ``eval`` method also accepts a second, optional Boolean argument, which
 The ``eval`` method also accepts a second, optional Boolean argument, which
 specifies whether to execute the code in the global execution context,
 specifies whether to execute the code in the global execution context,
 defaulting to ``false`` to prevent polluting the global namespace::
 defaulting to ``false`` to prevent polluting the global namespace::

+ 0 - 1
getting_started/workflow/export/index.rst

@@ -14,6 +14,5 @@ Export
    exporting_for_uwp
    exporting_for_uwp
    exporting_for_android
    exporting_for_android
    exporting_for_web
    exporting_for_web
-   customizing_html5_shell
    one-click_deploy
    one-click_deploy
    changing_application_icon_for_windows
    changing_application_icon_for_windows

+ 355 - 0
tutorials/platform/customizing_html5_shell.rst

@@ -0,0 +1,355 @@
+.. _doc_customizing_html5_shell:
+
+Customizing the Web export HTML page
+====================================
+
+Rather than the default HTML page that comes with the export templates, it is
+also possible to use a custom HTML page. This allows drastic customization of
+the final web presentation and behavior. The path to the custom HTML page is
+specified in the export options as ``Html/Custom Html Shell``.
+
+The default HTML page is available in the Godot Engine repository at
+`/misc/dist/html/full-size.html <https://github.com/godotengine/godot/blob/master/misc/dist/html/full-size.html>`__.
+Some simple use-cases where customizing the default page is useful include:
+
+ - Loading files from a different directory
+ - Loading a ``.zip`` file instead of a ``.pck`` file as main pack
+ - Loading engine files from a different directory than the main pack file
+ - Adding a click-to-play button so games can be started in full-screen mode
+ - Loading some extra files before the engine starts, so they are available in
+   the file system later
+ - Passing custom "command line" arguments, e.g. ``-s`` to start a MainLoop script
+
+Another sample HTML page is avilable at `/misc/dist/html/fixed-size.html <https://github.com/godotengine/godot/blob/master/misc/dist/html/fixed-size.html>`__.
+This page uses a fixed size canvas with an output widget below. However, the
+F12 browser console should be preferred as it can display additional
+information, such as WebGL errors.
+
+Placeholder substitution
+------------------------
+
+When exporting the game, several placeholders in the HTML page are replaced
+with values depending on the export:
+
++------------------------------+-----------------------------------------------+
+| Placeholder                  | substituted by                                |
++==============================+===============================================+
+| ``$GODOT_BASENAME``          | Basename of exported files without suffixes,  |
+|                              | e.g. ``game`` when exporting ``game.html``    |
++------------------------------+-----------------------------------------------+
+| ``$GODOT_DEBUG_ENABLED``     | ``true`` if debugging, ``false`` otherwise    |
++------------------------------+-----------------------------------------------+
+| ``$GODOT_HEAD_INCLUDE``      | Custom string to include just before the end  |
+|                              | of the HTML ``<head>`` element                |
++------------------------------+-----------------------------------------------+
+
+The HTML file must evaluate the JavaScript file ``$GODOT_BASENAME.js``. This
+file defines a global ``Engine`` object used to start the engine, :ref:`see
+below <doc_javascript_engine_object>` for details.
+
+The boot splash image is exported as ``$GODOT_BASENAME.png`` and can be used
+e.g. in ``<img />`` elements.
+
+``$GODOT_DEBUG_ENABLED`` can be useful to optionally display e.g. an output
+console or other debug tools.
+
+``$GODOT_HEAD_INCLUDE`` is replaced with the string specified by the export
+option ``Html/Head Include``.
+
+.. _doc_javascript_engine_object:
+
+The ``Engine`` object
+---------------------
+
+The JavaScript global object ``Engine`` is defined by ``$GODOT_BASENAME.js``
+and serves as an interface to the engine start-up process.
+
+The API is based on and requires basic understanding of `Promises <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises>`__.
+
+The object itself has only the following methods:
+
+.. js:function:: Engine.load(basePath)
+
+    Load the engine from the passed base path.
+
+    :param string basePath: Base path of the engine to load.
+    :returns: Promise which resolves once the engine is loaded.
+
+.. js:function:: Engine.unload()
+
+    Unload the engine to free memory.
+
+    This is called automatically once the engine is started unless
+    explicitly disabled using :js:func:`engine.setUnloadAfterInit`.
+
+.. js:function:: Engine.isWebGLAvailable([majorVersion = 1])
+
+    Check whether WebGL is available.
+
+    :param number majorVersion:
+        The major WebGL version to check for. Defaults to 1 for *WebGL 1.0*.
+
+    :returns:
+        ``true`` if the given major version of WebGL is available, ``false``
+        otherwise.
+
+.. js:function:: Engine.setWebAssemblyFilenameExtension(extension)
+
+    When loading the engine, the filename extension of the WebAssembly module
+    is assumed to be ``wasm``. This function allows usage of an alternate
+    extension.
+
+    .. code-block:: js
+
+        Engine.setWebAssemblyFilenameExtension('dat');
+        // Load 'mygame.dat' as WebAssembly module.
+        Engine.load('mygame');
+
+    This is useful for outdated hosts that only accept uploads of files with
+    certain filename extensions.
+
+    :param string extension:
+        Filename extension without preceding dot.
+
+    .. Note::
+     Depending on the host, using an alternate filename extension can prevent
+     some start-up optimizations. This occurs when the file is delivered with a
+     MIME-type other than :mimetype:`application/wasm`.
+
+Starting an ``Engine`` instance
+-------------------------------
+
+:js:class:`Engine` also acts a class:
+
+.. js:class:: Engine
+
+    An instance of the engine that can be started, usually a game.
+
+Instantiate the class using the ``new`` operator:
+
+.. code-block:: js
+
+    var engine = new Engine();
+
+This yields an :js:class:`Engine` instance, referred to as ``engine`` with a
+lower-case ``e`` from here.
+
+To start such an instance, the global ``Engine`` object must be loaded,
+then the ``engine`` instance must be initialized and finally started.
+
+.. js:function:: engine.init([basePath])
+
+    Initialize the instance. The instance can then be started with one of the
+    ``start`` functions, usually :js:func:`engine.startGame`.
+
+    :param string basePath:
+        The base path to the engine, same as in :js:func:`Engine.load`.
+        Must be passed only if the engine hasn't been loaded yet.
+
+    :returns: Promise that resolves once the engine is loaded and initialized.
+
+.. js:function:: engine.preloadFile(file[, path])
+
+    Load a file so it is available in the file system once the instance runs. Must
+    be called **before** starting the instance.
+
+    :param file:
+        If type is string, the file will be loaded from that path.
+
+        If type is ``ArrayBuffer`` or a view on one, the buffer will used as
+        the content of the file.
+
+    :param string path:
+        Path by which the file will be available. Mandatory if ``file`` is not
+        a string. If not passed, the path is derived from the URL of the loaded
+        file.
+
+    :returns: Promise that resolves once the file is preloaded.
+
+.. js:function:: engine.start([arg1, arg2, …])
+
+    Starts the instance of the engine, using the passed strings as
+    command line arguments. This allows great control over how the engine is
+    started, but usually the other methods starting with ``engine.start`` are
+    simpler and should be used instead.
+
+    If the instance has not yet been initialized with :js:func:`engine.init`,
+    it will be.
+
+    The engine must be loaded beforehand.
+
+    Requires that the engine has been loaded, and that a canvas can be found on
+    the page.
+
+    :param string variadic: Command line arguments.
+
+    :returns: Promise that resolves once the engine started.
+
+.. js:function:: engine.startGame(mainPack)
+
+    Initializes the engine if not yet initialized and starts the game with the
+    main pack loaded from the passed URL.
+
+    If the engine isn't loaded yet, the base path of the passed URL will be
+    used to load the engine.
+
+    This function ignores overrides of filenames and their extensions to start
+    only the main pack passed as argument.
+
+    :param string mainPack:
+        Path to the main pack to start. Also used as base path to load the
+        engine if not loaded already.
+
+    :returns: Promise that resolves once the game started.
+
+Configuring start-up behaviour
+------------------------------
+
+Beside starting the engine, other methods of the engine instance allow
+configuring the behavior:
+
+.. js:function:: engine.setUnloadAfterInit(enabled)
+
+    Specify whether the Engine will be unloaded automatically after the
+    instance is initialized.
+
+    This frees browser memory by unloading files that are no longer needed once
+    the instance is initialized. However, if more instances of the engine will
+    be started, the Engine will have to be loaded again.
+
+    Enabled by default.
+
+    :param boolean enabled:
+        ``true`` if the engine shall be unloaded after initializing,
+        ``false`` otherwise.
+
+.. js:function:: engine.setCanvas(canvasElem)
+
+    Specify a canvas to use.
+
+    By default, the first canvas element on the page is used for rendering.
+
+    :param HTMLCanvasElement canvasElem: The canvas to use.
+
+.. js:function:: engine.setCanvasResizedOnStart(enabled)
+
+    Specifies whether the canvas will be resized to the width and height
+    specified in the project settings on start.
+
+    Enabled by default.
+
+    :param boolean enabled:
+        ``true`` if the canvas shall be resized on start, ``false`` otherwise.
+
+.. js:function:: engine.setLocale(locale)
+
+    By default, the engine will try to guess the locale to use from the
+    JavaScript environment. It is usually preferable to use a server-side
+    user-specified locale, or at least use the locale requested in the HTTP
+    ``Accept-Language`` header. This method allows specifying such a custom
+    locale string.
+
+    For example, with PHP:
+
+    .. code-block:: php
+
+        engine.setLocale(<?php echo Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']); ?>);
+
+    :param string locale:
+        Locale.
+
+    .. seealso:: List of :ref:`locales <doc_locales>`.
+
+.. js:function:: engine.setExecutableName(execName)
+
+    Specify the virtual filename of the executable.
+
+    A real executable file doesn't exist for the HTML5 platform. However,
+    a virtual filename is stored by the engine for compatibility with other
+    platforms.
+
+    By default, the base name of the loaded engine files is used.
+    This method allows specifying another name.
+
+    This affects the output of :ref:`OS.get_executable_path() <class_OS_method_get_executable_path>`
+    and the automatically started main pack, :file:`{ExecutableName}.pck`.
+
+    :param string execName: Executable name.
+
+Customizing the presentation
+----------------------------
+
+The following methods are used to implement the presentation:
+
+.. js:function:: engine.setProgressFunc(callback)
+
+    Set the callback for displaying download progress.
+
+    :param function callback:
+        Callback called once per frame with two number arguments:
+        bytes loaded so far, and total bytes to load.
+
+    .. code-block:: js
+
+        function printProgress(current, total) {
+            console.log("Loaded " + current + " of " + total + " bytes");
+        }
+        engine.setProgressFunc(printProgress);
+
+    If the total is 0, it couldn't be calculated. Possible reasons
+    include:
+
+     -  Files are delivered with server-side chunked compression
+     -  Files are delivered with server-side compression on Chromium
+     -  Not all file downloads have started yet (usually on servers without
+        multi-threading)
+
+    .. Note::
+     For ease of use, the callback is only called once per frame, so that usage
+     of ``requestAnimationFrame()`` is not necessary.
+
+.. js:function:: engine.setStdoutFunc(callback)
+
+    Specify the standard output stream callback.
+
+    :param function callback:
+        Callback function called with one argument, the string to print.
+
+    .. code-block:: js
+
+        function printStdout(text) {
+            console.log(text);
+        }
+        engine.setStdoutFunc(printStdout);
+
+    This method should usually only be used in debug pages. The
+    ``$GODOT_DEBUG_ENABLED`` placeholder can be used to check for this.
+
+    By default, ``console.log()`` is used.
+
+.. js:function:: engine.setStderrFunc(callback)
+
+    Specify the standard error stream callback.
+
+    :param function callback:
+        Callback function called with one argument, the string to print.
+
+    .. code-block:: js
+
+        function printStderr(text) {
+            console.warn("Error: " + text);
+        }
+        engine.setStderrFunc(printStderr);
+
+    This method should usually only be used in debug pages. The
+    ``$GODOT_DEBUG_ENABLED`` placeholder can be used to check for this.
+
+    By default, ``console.warn()`` is used.
+
+Accessing the Emscripten ``Module``
+-----------------------------------
+
+If you know what you're doing, you can access the runtime environment
+(Emscripten's ``Module``) as ``engine.rtenv``. Check the official Emscripten
+documentation for information on how to use it:
+https://kripken.github.io/emscripten-site/docs/api_reference/module.html

+ 1 - 0
tutorials/platform/index.rst

@@ -7,4 +7,5 @@ Platform-specific
 
 
    android_in_app_purchases
    android_in_app_purchases
    services_for_ios
    services_for_ios
+   customizing_html5_shell
    consoles
    consoles