From fe4467756ff01d79f3e90b3986e80cf0dec6da96 Mon Sep 17 00:00:00 2001 From: Matt Godbolt Date: Sat, 14 Jan 2017 21:52:08 -0600 Subject: [PATCH] Pop up an alert if URL parsing fails. FIxes #223 --- app.js | 1 - static/alert.js | 41 +++++++++++++++++++++++++++++++++++++++++ static/explorer.css | 6 ++++++ static/index.html | 19 +++++++++++++++++++ static/main.js | 14 +++++++++++++- static/url.js | 13 ++++++++----- 6 files changed, 87 insertions(+), 7 deletions(-) create mode 100644 static/alert.js diff --git a/app.js b/app.js index 3404f614..a70ce300 100755 --- a/app.js +++ b/app.js @@ -455,7 +455,6 @@ function embeddedHandler(req, res, next) { res.end(); } - findCompilers() .then(function (compilers) { var prevCompilers; diff --git a/static/alert.js b/static/alert.js new file mode 100644 index 00000000..c18aadae --- /dev/null +++ b/static/alert.js @@ -0,0 +1,41 @@ +// Copyright (c) 2012-2017, Matt Godbolt +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +define(function (require) { + var $ = require('jquery'); + + function Alert() { + this.modal = $('#alert'); + this.title = this.modal.find('.modal-title'); + this.body = this.modal.find('.modal-body'); + } + + Alert.prototype.alert = function (title, body) { + this.title.html(title); + this.body.html(body); + this.modal.modal(); + }; + return Alert; +}); \ No newline at end of file diff --git a/static/explorer.css b/static/explorer.css index 0e76984f..4f24a673 100644 --- a/static/explorer.css +++ b/static/explorer.css @@ -213,4 +213,10 @@ pre.content { .compile-time { font-size: x-small; font-style: italic; +} + +.url-parse-info { + font-size: small; + margin-top: 1em; + font-style: italic; } \ No newline at end of file diff --git a/static/index.html b/static/index.html index 66372782..2eb68f66 100644 --- a/static/index.html +++ b/static/index.html @@ -243,5 +243,24 @@ int square(int num) { + + diff --git a/static/main.js b/static/main.js index f95c5a82..32be49c2 100644 --- a/static/main.js +++ b/static/main.js @@ -64,6 +64,7 @@ define(function (require) { var clipboard = require('clipboard'); var Hub = require('hub'); var Raven = require('raven-js'); + var Alert = require('alert'); function start() { analytics.initialise(); @@ -71,6 +72,7 @@ define(function (require) { var options = require('options'); $('.language-name').text(options.language); + var alert = new Alert(); var safeLang = options.language.toLowerCase().replace(/[^a-z_]+/g, ''); var defaultSrc = $('.template .lang.' + safeLang).text().trim(); @@ -87,7 +89,17 @@ define(function (require) { var config; if (!options.embedded) { - config = url.deserialiseState(window.location.hash.substr(1)); + var serializedState = window.location.hash.substr(1); + if (serializedState) { + try { + config = url.deserialiseState(serializedState); + } catch (exception) { + alert.alert("Unable to parse URL", + "
Compiler Explorer was unable to parse the URL hash. " + + "Please check it and try again.
" + + "
" + exception + "
"); + } + } if (config) { // replace anything in the default config with that from the hash config = _.extend(defaultConfig, config); diff --git a/static/url.js b/static/url.js index 1c0bdda5..967ea402 100644 --- a/static/url.js +++ b/static/url.js @@ -34,7 +34,7 @@ define(function (require) { function convertOldState(state) { var sc = state.compilers[0]; - if (!sc) return false; + if (!sc) throw new Error("Unable to determine compiler from old state"); var content = []; var source; if (sc.sourcez) { @@ -68,7 +68,7 @@ define(function (require) { state = GoldenLayout.unminifyConfig(state); break; default: - return false; + throw new Error("Invalid version '" + state.version + "'"); } return state; } @@ -83,21 +83,24 @@ define(function (require) { function deserialiseState(stateText) { var state; + var exception; try { state = unrisonify(stateText); if (state && state.z) { state = unrisonify(lzstring.decompressFromBase64(state.z)); } - } catch (ignored) { + } catch (ex) { + exception = ex; } - if (!state) { try { state = $.parseJSON(decodeURIComponent(stateText)); - } catch (ignored) { + } catch (ex) { + if (!exception) exception = ex; } } + if (!state && exception) throw exception; return loadState(state); }