Skip to content

Commit 8cfdc43

Browse files
committed
Add 'Aw, snap?' message
1 parent f971493 commit 8cfdc43

File tree

6 files changed

+165
-37
lines changed

6 files changed

+165
-37
lines changed

packages/app/src/sandbox/compile.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ import loadDependencies from './npm';
2525
import { consumeCache, saveCache, deleteAPICache } from './eval/cache';
2626
import getDefinition from '../../../common/templates/index';
2727

28+
import { showRunOnClick } from './status-screen/run-on-click';
29+
2830
let initializedResizeListener = false;
2931
let manager: ?Manager = null;
3032
let actionsEnabled = false;
@@ -304,6 +306,18 @@ async function compile({
304306
type: 'start',
305307
});
306308

309+
try {
310+
if (localStorage.getItem('running')) {
311+
localStorage.removeItem('running');
312+
showRunOnClick();
313+
return;
314+
}
315+
316+
localStorage.setItem('running', 'true');
317+
} catch (e) {
318+
/* no */
319+
}
320+
307321
const startTime = Date.now();
308322
try {
309323
inject();
@@ -588,6 +602,12 @@ async function compile({
588602
dispatch({ type: 'status', status: 'idle' });
589603
dispatch({ type: 'done' });
590604

605+
try {
606+
localStorage.removeItem('running');
607+
} catch (e) {
608+
/* no */
609+
}
610+
591611
if (typeof window.__puppeteer__ === 'function') {
592612
window.__puppeteer__('done');
593613
}

packages/app/src/sandbox/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ import registerServiceWorker from 'common/registerServiceWorker';
77
import requirePolyfills from 'common/load-dynamic-polyfills';
88
import { getModulePath } from 'common/sandbox/modules';
99
import { generateFileFromSandbox } from 'common/templates/configuration/package-json';
10+
import { Encode } from 'console-feed';
1011

1112
import setupHistoryListeners from './url-listeners';
1213
import compile, { getCurrentManager } from './compile';
1314
import setupConsole from './console';
14-
import { Encode } from 'console-feed';
1515

1616
const host = process.env.CODESANDBOX_HOST;
1717
const debug = _debug('cs:sandbox');

packages/app/src/sandbox/status-screen/index.js

Lines changed: 13 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// This is the loading screen
33
import loadingHtml from '!raw-loader!./loading-screen.html';
44

5+
import { createOverlay, resetOverlay } from './overlay-manager';
6+
57
type LoadingScreen = {
68
type: 'loading',
79
text: string,
@@ -24,53 +26,28 @@ function changeText(text: string) {
2426
}
2527
}
2628

27-
function createOverlay() {
28-
return new Promise(resolve => {
29-
const iframe = document.createElement('iframe');
30-
31-
iframe.setAttribute(
32-
'style',
33-
`position: fixed; top: 0; left: 0; width: 100%; height: 100%; border: none; z-index: 214748366;`
34-
);
35-
36-
iframe.onload = () => {
37-
iframe.contentDocument.body.innerHTML = loadingHtml;
38-
iframeReference = iframe;
39-
40-
if (currentScreen) {
41-
changeText(currentScreen.text);
42-
}
43-
resolve();
44-
};
45-
46-
document.body.appendChild(iframe);
47-
});
48-
}
49-
5029
export function resetScreen() {
5130
currentScreen = null;
52-
try {
53-
window.document.body.removeChild(iframeReference);
54-
iframeReference = null;
55-
} catch (e) {
56-
/* nothing */
57-
}
31+
iframeReference = null;
32+
resetOverlay();
5833
}
5934

6035
export default function setScreen(screen: Screen) {
61-
if (!iframeReference && !currentScreen) {
36+
if (!iframeReference) {
6237
if (!firstLoaded) {
6338
// Give the illusion of faster loading by showing the loader screen later
64-
firstLoaded = setTimeout(() => {
39+
firstLoaded = setTimeout(async () => {
40+
if (!iframeReference && currentScreen) {
41+
iframeReference = await createOverlay(loadingHtml);
42+
}
43+
6544
if (currentScreen) {
66-
createOverlay();
45+
changeText(currentScreen.text);
6746
}
6847
}, 600);
69-
} else {
70-
createOverlay(screen.text);
7148
}
72-
} else if (screen.type === 'loading') {
73-
changeText(screen.text);
49+
} else if (currentScreen) {
50+
changeText(currentScreen.text);
7451
}
7552

7653
currentScreen = screen;
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
let iframeReference = null;
2+
3+
export function resetOverlay() {
4+
try {
5+
window.document.body.removeChild(iframeReference);
6+
iframeReference = null;
7+
} catch (e) {
8+
/* nothing */
9+
}
10+
}
11+
12+
function createIframe() {
13+
return new Promise(resolve => {
14+
if (iframeReference) {
15+
resolve(iframeReference);
16+
}
17+
18+
const iframe = document.createElement('iframe');
19+
20+
iframe.setAttribute(
21+
'style',
22+
`position: fixed; top: 0; left: 0; width: 100%; height: 100%; border: none; z-index: 214748366;`
23+
);
24+
iframe.setAttribute('id', 'frame');
25+
26+
iframeReference = iframe;
27+
28+
document.body.appendChild(iframe);
29+
30+
if (iframe.contentDocument) {
31+
resolve(iframe);
32+
} else {
33+
document.getElementById('frame').addEventListener('load', () => {
34+
resolve(iframe);
35+
});
36+
}
37+
});
38+
}
39+
40+
export function createOverlay(html: string) {
41+
return new Promise(async resolve => {
42+
const iframe = await createIframe();
43+
44+
const isMounted = !!document.getElementById('frame');
45+
if (!isMounted) {
46+
document.body.appendChild(iframe);
47+
}
48+
49+
iframe.contentDocument.body.innerHTML = html;
50+
51+
resolve(iframe);
52+
});
53+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
<style>
2+
body {
3+
font-family: 'Roboto', sans-serif;
4+
background-color: #FFD399;
5+
6+
cursor: pointer;
7+
}
8+
9+
10+
.container {
11+
display: -webkit-box;
12+
display: -ms-flexbox;
13+
display: flex;
14+
-webkit-box-pack: center;
15+
-ms-flex-pack: center;
16+
justify-content: center;
17+
-webkit-box-align: center;
18+
-ms-flex-align: center;
19+
align-items: center;
20+
-webkit-box-orient: horizontal;
21+
-webkit-box-direction: normal;
22+
-ms-flex-direction: column;
23+
flex-direction: column;
24+
margin: 0 auto;
25+
26+
width: 100vw;
27+
height: 100vh;
28+
}
29+
30+
.text {
31+
padding: 1rem;
32+
color: #f27777;
33+
font-size: 1.25rem;
34+
max-width: 600px;
35+
line-height: 1.4;
36+
font-weight: 600;
37+
text-align: center;
38+
}
39+
</style>
40+
41+
<div id="loading-screen" class="container">
42+
<svg width="149" height="167" viewBox="0 0 447 500" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
43+
<!-- Generator: Sketch 50 (54983) - http://www.bohemiancoding.com/sketch -->
44+
<desc>Created with Sketch.</desc>
45+
<defs></defs>
46+
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
47+
<g id="Custom-Preset" transform="translate(-27.000000, 0.000000)">
48+
<g id="play" transform="translate(27.000000, 0.000000)">
49+
<polygon id="Path" fill="#6BAFDD" points="48.0363353 348.667139 223.440448 446.191204 398.963665 348.315773 398.963665 153.345936 223.526065 54.9352672 48.0363353 153.810752"></polygon>
50+
<path d="M0,376.74889 L0,125.911037 L223.473937,0 L447,125.385604 L447,376.35757 L223.474645,501 L0,376.74889 Z M48.0363353,348.667139 L223.440448,446.191204 L398.963665,348.315773 L398.963665,153.345936 L223.526065,54.9352672 L48.0363353,153.810752 L48.0363353,348.667139 Z"
51+
id="Shape" fill="#FFFFFF" fill-rule="nonzero"></path>
52+
<rect id="Rectangle" fill="#FFFFFF" x="130" y="170" width="60" height="161" rx="8"></rect>
53+
<rect id="Rectangle-Copy" fill="#FFFFFF" x="258" y="170" width="60" height="161" rx="8"></rect>
54+
</g>
55+
</g>
56+
</g>
57+
</svg>
58+
59+
<div class="text">
60+
<h1>Aw, Snap?</h1>
61+
<div>We noticed that the sandbox didn't complete its last run. This could be because of some code that crashed the browser.
62+
We paused execution so you can check the code.</div>
63+
64+
<h2>Click to continue execution</h2>
65+
</div>
66+
</div>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { createOverlay, resetOverlay } from './overlay-manager';
2+
import html from '!raw-loader!./run-on-click-screen.html';
3+
4+
export function showRunOnClick() {
5+
return new Promise(async resolve => {
6+
const iframe = await createOverlay(html);
7+
8+
iframe.contentDocument.body.addEventListener('click', () => {
9+
document.location.reload();
10+
});
11+
});
12+
}

0 commit comments

Comments
 (0)