Skip to content

Commit c520114

Browse files
committed
Use 'sandbox' for Chrome App
1 parent 63ae9a9 commit c520114

File tree

4 files changed

+113
-2
lines changed

4 files changed

+113
-2
lines changed

js/sandbox-rollup.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
sandbox.id = 'rollup';
2+
sandbox.wrap('Espruino.Core.Utils.getURL', url => new Promise((resolve, reject) => {
3+
Espruino.Core.Utils.getURL(url, data => data ? resolve(data) : reject(undefined));
4+
}));
5+
sandbox.wrap('Espruino.callProcessor', (processor, data) => new Promise((resolve, reject) => {
6+
Espruino.callProcessor(processor, data, result => result ? resolve(result) : reject(undefined));
7+
}));
8+
9+
var rollupWindow = document.getElementById('rollup').contentWindow;
10+
window.rollupTools = {
11+
loadModulesRollup: code => sandbox.invoke(rollupWindow, 'rollupTools.loadModulesRollup', code),
12+
minifyCodeTerser: code => sandbox.invoke(rollupWindow, 'rollupTools.minifyCodeTerser', code),
13+
};

js/sandbox.js

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
function sandboxInvoke(win, fnName, args) {
2+
return new Promise((resolve, reject) => {
3+
var message = {
4+
id: `${sandbox.id}${sandbox.invokeId++}`,
5+
command: 'invoke',
6+
context: JSON.stringify({
7+
Config: Espruino.Config,
8+
Core_Env: {
9+
board: Espruino.Core.Env.getBoardData(),
10+
data: Espruino.Core.Env.getData()
11+
}
12+
}),
13+
fnName,
14+
args
15+
};
16+
17+
const setupListener = id => {
18+
const listener = (event) => {
19+
var data = event.data;
20+
if (data.id !== id) return;
21+
22+
window.removeEventListener('message', listener);
23+
24+
var command = data.command;
25+
switch(command) {
26+
case 'resolve':
27+
resolve(JSON.parse(data.result));
28+
break;
29+
case 'reject':
30+
reject(JSON.parse(data.result));
31+
break;
32+
}
33+
};
34+
35+
window.addEventListener('message', listener);
36+
};
37+
38+
console.log('sandbox:msg', message.id, message.command, message.fnName, message);
39+
40+
setupListener(message.id);
41+
win.postMessage(message, '*');
42+
});
43+
}
44+
45+
46+
function sandboxWrapListener(event) {
47+
// 'null' is when originated from the sandboxed iframe
48+
var origin = event.origin == 'null' ? '*' : event.origin;
49+
var data = event.data;
50+
var command = data.command;
51+
52+
switch(command) {
53+
case 'invoke':
54+
sandbox.context = JSON.parse(data.context);
55+
sandbox.callerWindow = event.source;
56+
57+
var postReply = (command, result) => {
58+
var message = {
59+
id: data.id,
60+
command,
61+
result: JSON.stringify(result)
62+
};
63+
64+
console.log('sandbox:rpl', message.id, message.command, message);
65+
sandbox.callerWindow.postMessage(message, origin);
66+
};
67+
68+
sandbox.wrapped[data.fnName](...data.args)
69+
.then(result => postReply('resolve', result))
70+
.catch(error => postReply('reject', error.toString()));
71+
}
72+
}
73+
74+
window.addEventListener('message', sandboxWrapListener);
75+
76+
77+
var sandbox = {
78+
id: 'sandbox',
79+
invokeId: 0,
80+
81+
wrapped: {},
82+
callerWindow: window,
83+
84+
wrap(fnName, fn) {
85+
this.wrapped[fnName] = fn;
86+
return sandbox;
87+
},
88+
invoke(win, fnName, ...args) {
89+
return sandboxInvoke(win, fnName, args);
90+
}
91+
};

main.html

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,12 @@ <h5 class="title-bar__title">Espruino Web IDE</h5>
8888
</div>
8989

9090
</div>
91+
92+
<iframe id="rollup" src="sandbox.html"></iframe>
93+
94+
<script src="js/sandbox.js"></script>
95+
<script src="js/sandbox-rollup.js"></script>
96+
9197
<script src="js/libs/jquery-1.11.0.js"></script>
9298
<script src="js/libs/jquery-ui-1.10.1.custom.js"></script>
9399
<script src="js/libs/jquery.treeview.js"></script>
@@ -193,8 +199,6 @@ <h5 class="title-bar__title">Espruino Web IDE</h5>
193199
<script src="EspruinoTools/libs/esprima/esprima.js"></script> <!-- needed for minify -->
194200
<script src="EspruinoTools/libs/esprima/esmangle.js"></script> <!-- needed for minify -->
195201
<script src="EspruinoTools/libs/esprima/escodegen.js"></script> <!-- needed for minify -->
196-
<script src="EspruinoTools/libs/rollup/espruino-rollup.browser.js"></script> <!-- needed for rollup/terser -->
197-
<script src="EspruinoTools/libs/rollup/index.js"></script> <!-- needed for rollup/terser -->
198202
<script src="EspruinoTools/plugins/minify.js"></script>
199203

200204
<script src="EspruinoTools/plugins/saveOnSend.js"></script> <!-- This should come after minify -->

manifest.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@
2222
"http://*/",
2323
"https://*/"
2424
],
25+
"sandbox": {
26+
"pages": ["sandbox.html"]
27+
},
2528
"sockets": { "tcp" : { "connect": "*" } },
2629
"manifest_version": 2,
2730
"url_handlers": {

0 commit comments

Comments
 (0)