changeset 3089:a169e79ba224

Merge branch 'master' into vnext
author Nicholas Jillings <n.g.r.jillings@se14.qmul.ac.uk>
date Fri, 12 Jan 2018 15:40:26 +0000
parents 2e8bf9499e92 (current diff) 7483f1bae6e1 (diff)
children 385bb2e03ab7 cb81b0e8d31a
files js/core.js
diffstat 2 files changed, 156 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/js/core.js	Tue Jan 09 16:27:50 2018 +0000
+++ b/js/core.js	Fri Jan 12 15:40:26 2018 +0000
@@ -3649,44 +3649,165 @@
         }
     };
 
+    this.SessionKey = (function (parent) {
+        var returnURL = "";
+        if (window.returnURL !== undefined) {
+            returnURL = String(window.returnURL);
+        }
+
+        function postUpdate() {
+            // Return a new promise.
+            var hold = document.createElement("div");
+            var clone = parent.root.cloneNode(true);
+            hold.appendChild(clone);
+            return new Promise(function (resolve, reject) {
+                // Do the usual XHR stuff
+                console.log("Requested save...");
+                var req = new XMLHttpRequest();
+                req.open("POST", returnURL + "php/save.php?key=" + sessionKey + "&saveFilenamePrefix=" + parent.filenamePrefix);
+                req.setRequestHeader('Content-Type', 'text/xml');
+
+                req.onload = function () {
+                    // This is called even on 404 etc
+                    // so check the status
+                    if (this.status >= 300) {
+                        console.log("WARNING - Could not update at this time");
+                    } else {
+                        var parser = new DOMParser();
+                        var xmlDoc = parser.parseFromString(req.responseText, "application/xml");
+                        var response = xmlDoc.getElementsByTagName('response')[0];
+                        if (response.getAttribute("state") == "OK") {
+                            var file = response.getElementsByTagName("file")[0];
+                            console.log("Intermediate save: OK, written " + file.getAttribute("bytes") + "B");
+                            resolve(true);
+                        } else {
+                            var message = response.getElementsByTagName("message");
+                            console.log("Intermediate save: Error! " + message.textContent);
+                            reject("Intermediate save: Error! " + message.textContent);
+                        }
+                    }
+                };
+
+                // Handle network errors
+                req.onerror = function () {
+                    reject(Error("Network Error"));
+                };
+
+                // Make the request
+                req.send([hold.innerHTML]);
+            });
+        };
+
+        function keyPromise() {
+            return new Promise(function (resolve, reject) {
+                var req = new XMLHttpRequest();
+                req.open("GET", returnURL + "php/requestKey.php?saveFilenamePrefix=" + parent.filenamePrefix, true);
+                req.onload = function () {
+                    // This is called even on 404 etc
+                    // so check the status
+                    if (req.status == 200) {
+                        // Resolve the promise with the response text
+                        resolve(req.response);
+                    } else {
+                        // Otherwise reject with the status text
+                        // which will hopefully be a meaningful error
+                        reject(Error(req.statusText));
+                    }
+                };
+
+                // Handle network errors
+                req.onerror = function () {
+                    reject(Error("Network Error"));
+                };
+
+                req.send();
+            })
+        }
+
+        var requestChains = null;
+        var sessionKey = null;
+        var object = {};
+
+        Object.defineProperties(object, {
+            "key": {
+                "get": function () {
+                    return sessionKey;
+                },
+                "set": function (a) {
+                    throw ("Cannot set read-only property")
+                }
+            },
+            "request": {
+                "value": new XMLHttpRequest()
+            },
+            "parent": {
+                "value": parent
+            },
+            "requestKey": {
+                "value": function () {
+                    requestChains = keyPromise().then(function (response) {
+                        function throwerror() {
+                            sessionKey = null;
+                            throw ("An unspecified error occured, no server key could be generated");
+                        }
+                        var parse = new DOMParser();
+                        var xml = parse.parseFromString(response, "text/xml");
+                        if (response.length === 0) {
+                            throwerror();
+                        }
+                        if (xml.getElementsByTagName("state").length > 0) {
+                            if (xml.getElementsByTagName("state")[0].textContent == "OK") {
+                                sessionKey = xml.getAllElementsByTagName("key")[0].textContent;
+                                parent.root.setAttribute("key", sessionKey);
+                                parent.root.setAttribute("state", "empty");
+                                return (true);
+                            } else if (xml.getElementsByTagName("state")[0].textContent == "ERROR") {
+                                sessionKey = null;
+                                console.error("Could not generate server key. Server responded with error message: \"" + xml.getElementsByTagName("message")[0].textContent + "\"");
+                                return (false);
+                            }
+                        } else {
+                            throwerror();
+                        }
+                        return (true);
+                    });
+                }
+            },
+            "update": {
+                "value": function () {
+                    if (this.key == null || requestChains === undefined) {
+                        throw ("Cannot save as key == null");
+                    }
+                    this.parent.root.setAttribute("state", "update");
+                    requestChains = requestChains.then(postUpdate);
+                }
+            },
+            "finish": {
+                "value": function () {
+                    if (this.key == null || requestChains === undefined) {
+                        throw ("Cannot save as key == null");
+                    }
+                    this.parent.finish();
+                    return requestChains.then(postUpdate()).then(function () {
+                        console.log("OK");
+                    }, function () {
+                        createProjectSave("local");
+                    })
+                }
+            }
+        });
+        return object;
+    })(this);
+    /*
     this.SessionKey = {
         key: null,
         request: new XMLHttpRequest(),
         parent: this,
         handleEvent: function () {
-            var parse = new DOMParser();
-            var xml = parse.parseFromString(this.request.response, "text/xml");
-            if (this.request.response.length === 0) {
-                console.error("An unspecified error occured, no server key could be generated");
-                return;
-            }
-            if (xml.getElementsByTagName("state").length > 0) {
-                if (xml.getElementsByTagName("state")[0].textContent == "OK") {
-                    this.key = xml.getAllElementsByTagName("key")[0].textContent;
-                    this.parent.root.setAttribute("key", this.key);
-                    this.parent.root.setAttribute("state", "empty");
-                    this.update();
-                    return;
-                } else if (xml.getElementsByTagName("state")[0].textContent == "ERROR") {
-                    this.key = null;
-                    console.error("Could not generate server key. Server responded with error message: \"" + xml.getElementsByTagName("message")[0].textContent + "\"");
-                    return;
-                }
-            }
-            this.key = null;
-            console.error("An unspecified error occured, no server key could be generated");
+
         },
         requestKey: function () {
-            // For new servers, request a new key from the server
-            var returnURL = "";
-            if (typeof specification.projectReturn == "string") {
-                if (specification.projectReturn.substr(0, 4) == "http") {
-                    returnURL = specification.projectReturn;
-                }
-            }
-            this.request.open("GET", returnURL + "php/requestKey.php?saveFilenamePrefix=" + this.parent.filenamePrefix, true);
-            this.request.addEventListener("load", this);
-            this.request.send();
+
         },
         update: function () {
             if (this.key === null) {
@@ -3769,7 +3890,7 @@
             });
         }
     };
-
+    */
     this.createTestPageStore = function (specification) {
         var store = new this.pageNode(this, specification);
         this.testPages.push(store);
--- a/php/save.php	Tue Jan 09 16:27:50 2018 +0000
+++ b/php/save.php	Fri Jan 12 15:40:26 2018 +0000
@@ -79,7 +79,7 @@
     $sn1 = findNodeByAttribute($n1, "location", "pre");
     $sn2 = findNodeByAttribute($n2, "location", "pre");
     if ($sn1 != 0) {
-        if ($sn2 != 0 && $sn2.getAttribute("state") != "complete") {
+        if ($sn2 != 0) {
             $saved_root->removeChild($sn2);
             $sn2 = 0;
         }
@@ -92,7 +92,7 @@
     $sn1 = findNodeByAttribute($n1, "location", "post");
     $sn2 = findNodeByAttribute($n2, "location", "post");
     if ($sn1 != 0) {
-        if ($sn2 != 0 && $sn2.getAttribute("state") != "complete") {
+        if ($sn2 != 0) {
             $saved_root->removeChild($sn2);
             $sn2 = 0;
         }
@@ -114,7 +114,7 @@
         $ref = $page->getAttribute("ref");
         if (!empty($ref)) {
             $pn2 = findNodeByAttribute($n2, "ref", $ref);
-            if ($pn2 != 0 && $pn2.getAttribute("state") != "complete") {
+            if ($pn2 != 0) {
                 $saved_root->removeChild($pn2);
                 $pn2 = 0;
             }