Index: experimental/webtry/js/run.js |
diff --git a/experimental/webtry/js/run.js b/experimental/webtry/js/run.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..165aae328ab1eb9384538323c7761b2f57dd7dfa |
--- /dev/null |
+++ b/experimental/webtry/js/run.js |
@@ -0,0 +1,90 @@ |
+/** |
+ * Common JS that talks XHR back to the server and runs the code and receives |
+ * the results. |
+ */ |
+ |
+/** |
+ * All the functionality is wrapped up in this anonymous closure, but we need |
+ * to be told if we are on the workspace page or a normal try page, so the |
+ * workspaceName is passed into the closure, it must be set in the global |
+ * namespace. If workspaceName is the empty string then we know we aren't |
+ * running on a workspace page. |
+ */ |
+(function(workspaceName) { |
+ var run = document.getElementById('run'); |
+ var code = document.getElementById('code'); |
+ var output = document.getElementById('output'); |
+ var img = document.getElementById('img'); |
+ var tryHistory = document.getElementById('tryHistory'); |
+ var parser = new DOMParser(); |
+ |
+ |
+ function beginWait() { |
+ document.body.classList.add('waiting'); |
+ run.disabled = true; |
+ } |
+ |
+ |
+ function endWait() { |
+ document.body.classList.remove('waiting'); |
+ run.disabled = false; |
+ } |
+ |
+ |
+ /** |
+ * Callback for when the XHR returns after attempting to run the code. |
+ * @param e The callback event. |
+ */ |
+ function codeComplete(e) { |
+ // The response is JSON of the form: |
+ // { |
+ // "message": "you had an error...", |
+ // "img": "<base64 encoded image but only on success>" |
+ // } |
+ // |
+ // The img is optional and only appears if there is a valid |
+ // image to display. |
+ endWait(); |
+ console.log(e.target.response); |
+ body = JSON.parse(e.target.response); |
+ output.innerText = body.message; |
+ if (body.hasOwnProperty('img')) { |
+ img.src = 'data:image/png;base64,' + body.img; |
+ } else { |
+ img.src = ''; |
+ } |
+ // Add the image to the history if we are on a workspace page. |
+ if (tryHistory) { |
+ var newHistoryStr = '<div class=tries>' + |
+ '<a href="/c/' + body.hash + '">' + |
+ ' <img width=64 height=64 src="/i/' + body.hash + '.png">' + |
+ '</a></div>'; |
+ |
+ var newHistory = parser.parseFromString(newHistoryStr, "text/html"); |
+ tryHistory.insertBefore(newHistory.body.firstChild, tryHistory.firstChild); |
+ } |
+ } |
+ |
+ |
+ /** |
+ * Callback where there's an XHR error. |
+ * @param e The callback event. |
+ */ |
+ function codeError(e) { |
+ endWait(); |
+ alert('Something bad happened: ' + e); |
+ } |
+ |
+ |
+ function onSubmitCode() { |
+ beginWait(); |
+ var req = new XMLHttpRequest(); |
+ req.addEventListener('load', codeComplete); |
+ req.addEventListener('error', codeError); |
+ req.overrideMimeType('application/json'); |
+ req.open('POST', '/', true); |
+ req.setRequestHeader('content-type', 'application/json'); |
+ req.send(JSON.stringify({"code": code.value, "name": workspaceName})); |
+ } |
+ run.addEventListener('click', onSubmitCode); |
+})(workspaceName); |