-
Notifications
You must be signed in to change notification settings - Fork 3.4k
Running html files with emrun
When you target the web with emscripten via the -o out.html
directive to emcc, emscripten will generate one or more outfiles with suffixes .html, .js, and .data
. Not all web browsers can run the .html file via a file://
URL by double-clicking the html file because of default browser CORS rules (in Chrome, Opera and IE), but you need to deploy the files to a web server first. To solve this, you can use the emrun
command line tool to run your page in a locally launched web server.
emrun
enables the following uses:
- Launch your html page in a web browser from command line, behaving as if it was a native executable.
- Capture application stdout and stderr streams during the run, and print them to terminal or log to file.
- Pass command-line arguments to the application and read them from
GET
parameters in the launched URL, orargc
andargv
in main. - Detect when application quits via a call to C function
exit(returncode);
and pass that return code to terminal. - Use a custom browser to run, or even run a browser on an Android device connected to the local computer via adb.
To summarize, emrun
is the tool to use for all kinds of command-line automation needs, for example when integrating your unit tests to run in an emscripten environment in your project build farm.
Using emrun
is simple. Here is how:
-
Rebuild your emscripten application and add the
--emrun
linker flag. This flag injects a piece of code in the generatedModule
that is needed to enable the stdout, stderr and exit() capture to work. If you skip this step, you can still run any .html file withemrun
, but then the capture will just not work. -
Open a terminal, navigate to the build output directory, and run
emrun page.html
. This will spawn a new web server to host the page and launch your default system browser to visit that page.emrun
will block until the page callsexit(returncode);
, after which it will quit back to shell with the provided process exit code.
That's all!
emrun
provides the --browser <filename-or-browser-alias>
command line option that allows specifying which browser to run. If that flag is not specified, the default system browser is launched. If the parameter to --browser
points to an existing file, then that file is spawned as the browser process to run. Additionally, to simplify setup, one can pass predefined alias names of known browsers to --browser
to launch a specific browser. To enumerate the list of detected browser aliases on your system, run the --list_browsers
command, like follows:
> emrun --list_browsers
emrun has automatically found the following browsers in the default install locations on the system:
- firefox: Mozilla Firefox 26.0.0.5087
- firefox_beta: Mozilla Firefox 26.0.0.5077
- firefox_aurora: Mozilla Firefox Aurora 28.0.0.5098
- firefox_nightly: Mozilla Firefox Nightly 29.0.0.5098
- chrome: Google Chrome 31.0.1650.63
- chrome_canary: Google Chrome 34.0.1752.0
- iexplore: Microsoft Internet Explorer 11.0.9600.16384
- opera: Opera 18.0.1284.63
You can pass the --browser <id> option to launch with the given browser above.
Even if your browser was not detected, you can use --browser /path/to/browser/executable
to launch with that browser.
For your browser to be detected, it should be installed in a default install location on the system (%ProgramFiles%
on Windows and /Applications/
on OSX) or by adding it to the PATH
for current user.
Then for example to run Firefox Nightly, you would launch emrun --browser firefox_nightly page.html
.
If you just want to launch a web server, similar to how python -m SimpleHTTPServer
operates, you can pass the --no_browser
command line flag, in which case emrun
will not spawn a browser at all, but simply runs a web server.
emrun
spawns its own web server to host the target html file. You should note the following security implications:
- The web server is a generic file server that by default serves all files in the directory where the .html file resides, and all directories under that directory tree.
- The web server will be visible to other computers on the same network.
The following command line flags control how emrun
spawns the web server:
-
--no_server
: Does not launch a web server at all. The target file is run viafile://
protocol, if possible. -
--serve_after_close
: Does not quitemrun
after the user was detected to close the web browser, but keeps serving. Use this flag for example when you want to visit the page multiple times or with different browsers during the same run. -
--serve_after_exit
: Does not quitemrun
after the page finishes with a call toexit(returncode);
, but keeps serving. -
--serve_root <path>
: Chooses a custom directory to use as the root directory for the spawned web server. By default, the directory where the .html file resides in is used. -
--port <number>
: Chooses the TCP port where the web server listens to. The default port is6931
. -
--silence_timeout <seconds>
: If the application does not print anything to stdout or stderr in this many seconds, the page/browser is assumed to be hung, andemrun
will quit. Disabled by default. -
--timeout <seconds>
: If the whole page run lasts longer than this many seconds, the page/browser is assumed to be hung, andemrun
will quit. Disabled by default. -
--timeout_returncode <code>
: Specifies the process return code thatemrun
quits with if a page run timeout occurs. By default99999
.
The following command line flags affect messaging to logs:
-
--verbose
: Prints detailed information aboutemrun
internal steps, for debugging purposes. -
--log_stdout <filename>
: Instead of printing to terminal, writes all stdout messages from the application to the given file. -
--lot_stderr <filename>
: Same as above, but for the stderr stream. -
--system_info
: Before launching, prints detailed information about the current system. Useful for automated runs to capture hardware information to logs. -
--browser_info
: Before launching, prints information about which browser is about to be launched. -
--log_html
: If specified, application output is reformatted as html markup friendly. -
--no_emrun_detect
: Hides the friendly reminder message that warns if target .html file is detected to not have been built with--emrun
.
Especially when automating operation for build servers, it is important to be able to clean up properly after each run. The following command line flags enable this:
-
--kill_start
: If specified, all instances of the target browser process are terminated before starting the run. Pass this flag if you want to force that no old (hung) instances of the target browser processes could exist at the time of the launch that could interfere with the run. By default disabled. -
--kill_exit
: If specified, all instances of the target browser process are terminated whenemrun
quits. Pass this flag to force that browser pages are not left around running when the run is over. By default disabled.
It is important to understand that these operations can cause data loss, since these actions cause processes to be forcibly terminated. Do not pass these flags when running a browser that could have multiple tabs or windows open that you do other work in, since they will all be wiped out. You were warned.
It is also possible to use emrun
to automate web browser runs on Android. For that to work, you need
- An Android phone connected to the local system via USB and its developer mode enabled. No need to root the phone.
- The
adb
tool installed to the system and present inPATH
environment variable. - Check that adb is working by calling
adb devices
to see that your device is listed. - Install any browser apk to the device that you want to be able to run.
To run on Android, add the --android
command line flag, and use the --browser <id>
command line flag to explicitly choose the browser to run. Omitting --browser
(to launch a default Android browser) is not supported. The following browser ids have been tested to work: firefox, firefox_beta, firefox_aurora, firefox_nightly, chrome, chrome_beta, opera
. The following browser ids are also supported, but have known issues:
-
opera_mini
: The browser launches, but for some reason it times out when trying to load any page. -
dolphin
: Works, but does not support WebGL.
Otherwise, emrun
works as usual, and the other command line flags can be combined.