Browse Source

Pop up an alert if URL parsing fails.

FIxes #223
dev/git-series/gccdum
Matt Godbolt 6 years ago
parent
commit
fe4467756f
  1. 1
      app.js
  2. 41
      static/alert.js
  3. 6
      static/explorer.css
  4. 19
      static/index.html
  5. 14
      static/main.js
  6. 13
      static/url.js

1
app.js

@ -455,7 +455,6 @@ function embeddedHandler(req, res, next) {
res.end();
}
findCompilers()
.then(function (compilers) {
var prevCompilers;

41
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;
});

6
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;
}

19
static/index.html

@ -243,5 +243,24 @@ int square(int num) {
<!-- /.modal-dialog -->
</div>
<div class="modal fade gl_keep" id="alert">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title">Something alert worthy</h4>
</div>
<div class="modal-body">
</div>
<!-- model-body -->
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div>
</div>
<!-- /.modal-content -->
</div>
<!-- /.modal-dialog -->
</div>
</body>
</html>

14
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",
"<div>Compiler Explorer was unable to parse the URL hash. " +
"Please check it and try again.</div>" +
"<div class='url-parse-info'>" + exception + "</div>");
}
}
if (config) {
// replace anything in the default config with that from the hash
config = _.extend(defaultConfig, config);

13
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);
}

Loading…
Cancel
Save