forked from emscripten-core/emscripten
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathemrun_postjs.js
95 lines (91 loc) · 3.61 KB
/
emrun_postjs.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/**
* @license
* Copyright 2013 The Emscripten Authors
* SPDX-License-Identifier: MIT
*
* This file gets implicatly injected as a `--post-js` file when
* emcc is run with `--emrun`
*/
if (typeof window == "object" && (typeof ENVIRONMENT_IS_PTHREAD == 'undefined' || !ENVIRONMENT_IS_PTHREAD)) {
var emrun_register_handlers = () => {
// When C code exit()s, we may still have remaining stdout and stderr
// messages in flight. In that case, we can't close the browser until all
// those XHRs have finished, so the following state variables track that all
// communication is done, after which we can close.
var emrun_num_post_messages_in_flight = 0;
var emrun_should_close_itself = false;
var postExit = (msg) => {
var http = new XMLHttpRequest();
// Don't do this immediately, this may race with the notification about
// the return code reaching the server. Send a *sync* xhr so that we know
// for sure that the server has gotten the return code before we continue.
http.open("POST", "stdio.html", false);
http.send(msg);
try {
// Try closing the current browser window, since it exit()ed itself.
// This can shut down the browser process and then emrun does not need
// to kill the whole browser process.
window.close();
} catch(e) {}
};
var post = (msg) => {
var http = new XMLHttpRequest();
++emrun_num_post_messages_in_flight;
http.onreadystatechange = () => {
if (http.readyState == 4 /*DONE*/) {
if (--emrun_num_post_messages_in_flight == 0 && emrun_should_close_itself) {
postExit('^exit^'+EXITSTATUS);
}
}
}
http.open("POST", "stdio.html", true);
http.send(msg);
};
// If the address contains localhost, or we are running the page from port
// 6931, we can assume we're running the test runner and should post stdout
// logs.
if (document.URL.search("localhost") != -1 || document.URL.search(":6931/") != -1) {
var emrun_http_sequence_number = 1;
var prevPrint = out;
var prevErr = err;
addOnExit(() => {
if (emrun_num_post_messages_in_flight == 0) {
postExit('^exit^'+EXITSTATUS);
} else {
emrun_should_close_itself = true;
}
});
out = (text) => {
post('^out^'+(emrun_http_sequence_number++)+'^'+encodeURIComponent(text));
prevPrint(text);
};
err = (text) => {
post('^err^'+(emrun_http_sequence_number++)+'^'+encodeURIComponent(text));
prevErr(text);
};
// Notify emrun web server that this browser has successfully launched the
// page. Note that we may need to wait for the server to be ready.
var tryToSendPageload = () => {
try {
post('^pageload^');
} catch (e) {
setTimeout(tryToSendPageload, 50);
}
};
tryToSendPageload();
}
};
// POSTs the given binary data represented as a (typed) array data back to the
// emrun-based web server.
// To use from C code, call e.g:
// EM_ASM({emrun_file_dump("file.dat", HEAPU8.subarray($0, $0 + $1));}, my_data_pointer, my_data_pointer_byte_length);
var emrun_file_dump = (filename, data) => {
var http = new XMLHttpRequest();
out('Dumping out file "' + filename + '" with ' + data.length + ' bytes of data.');
http.open("POST", "stdio.html?file=" + filename, true);
http.send(data); // XXX this does not work in workers, for some odd reason (issue #2681)
};
if (typeof Module != 'undefined' && typeof document != 'undefined') {
emrun_register_handlers();
}
}