www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit 52a08215869588e01c73bc03f7f01408df943e9f
parent c5415d371837776f3429ec6378f30de687496e41
Author: Georges Dupéron <jahvascriptmaniac+github@free.fr>
Date:   Thu, 28 Apr 2011 16:12:06 +0200

Ajout de try/catch autour de chaque fonction, pour tenter de récupérer toutes les erreurs.

Diffstat:
Mcode/serveur/php/ressources/my-extensions.js | 32+++++++++++++++++++++++++++++++-
Mcode/serveur/php/ressources/pticlic.js | 109++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------
2 files changed, 122 insertions(+), 19 deletions(-)

diff --git a/code/serveur/php/ressources/my-extensions.js b/code/serveur/php/ressources/my-extensions.js @@ -1,8 +1,11 @@ Number.prototype.clip = function(min, max, floor) { + try { return Math.min(Math.max(floor ? Math.floor(this) : this, min), max); + } catch(e) {alert("Error Number.prototype.clip");alert(e);} }; function dichotomy(start, isBigger) { + try { var i = 0, min = 0, max, half; for (max = start || 1; ++i < 10 && !isBigger(max); max *= 2); @@ -12,26 +15,34 @@ function dichotomy(start, isBigger) { } while (half > 1 && isBigger(half)) { --half; } return half; + } catch(e) {alert("Error dichotomy");alert(e);} } $.fn.maxWidth = function() { + try { max = 0; this.each(function(i,e){ max = Math.max(max, $(e).width()); }); return max; + } catch(e) {alert("Error $.fn.maxWidth");alert(e);} } $.fn.maxHeight = function() { + try { max = 0; this.each(function(i,e){ max = Math.max(max, $(e).height()); }); return max; + } catch(e) {alert("Error $.fn.maxHeight");alert(e);} } $.fn.sumHeight = function() { + try { sum = 0; this.each(function(i,e){ sum += $(e).height(); }); return sum; + } catch(e) {alert("Error sumHeight");alert(e);} } $.fn.fitFont = function(w, h, minFont, maxFont) { + try { var oldpos = this.css("position"); this.css({ position: "absolute", @@ -41,18 +52,22 @@ $.fn.fitFont = function(w, h, minFont, maxFont) { var that = this; this.css("font-size", dichotomy(parseInt(this.css("font-size"), 10), function(x) { + try { that.css("fontSize", x); fubar = wrappers; return (wrappers.maxHeight() > h || wrappers.maxWidth() > w); + } catch(e) {alert("Error anonymous in $.fn.fitFont");alert(e);} }).clip(minFont || 0, maxFont || Infinity)); // Restore stuff this.css("position", oldpos); //wrappers.children().unwrap(); return this; + } catch(e) {alert("Error $.fn.fitFont");alert(e);} } $.fn.fitIn = function(e, t, r, b, l) { + try { e = $(e); if (isNaN(+t)) t = 0; if (isNaN(+r)) r = t; @@ -66,9 +81,11 @@ $.fn.fitIn = function(e, t, r, b, l) { l *= w; this.fitFont(w - r - l, h - t - b, 20).center(e.center()); return this; + } catch(e) {alert("Error $.fn.fitIn");alert(e);} } function queueize(method) { + try { return function() { var $this = this; return this.queue(function(next) { @@ -76,16 +93,20 @@ function queueize(method) { next(); }); }; + } catch(e) {alert("Error queueize");alert(e);} } $.fn.qAddClass = queueize("addClass"); $.fn.qRemoveClass = queueize("removeClass"); $.fn.wh = function(w, h) { + try { return this.width(w).height(h); + } catch(e) {alert("Error $.fn.wh");alert(e);} } $.fn.relativePos = function(xAnchor, yAnchor, to, justCss) { + try { if (to) this.css("position", "absolute"); var deltaX = this.outerWidth() * xAnchor; var deltaY = this.outerHeight() * yAnchor; @@ -102,6 +123,7 @@ $.fn.relativePos = function(xAnchor, yAnchor, to, justCss) { pos.top += deltaY; return pos; } + } catch(e) {alert("Error $.fn.relativePos");alert(e);} }; $.each({ @@ -115,11 +137,19 @@ $.each({ west: {x:0, y:0.5}, northWest: {x:0, y:0}, }, function(i,e) { + try { var x = e.x; var y = e.y; - $.fn[i] = function(to, justCss) { return this.relativePos(x, y, to, justCss); }; + $.fn[i] = function(to, justCss) { + try { + return this.relativePos(x, y, to, justCss); + } catch(e) {alert("Error auto-generated $.fn." + i);alert(e);} + }; + } catch(e) {alert("Error top-level anonymous in my-extensions");alert(e);} }); $.fn.clickOnce = function(fn) { + try { this.unbind("click",fn).click(fn); + } catch(e) {alert("Error $.fn.clickOnce");alert(e);} }; \ No newline at end of file diff --git a/code/serveur/php/ressources/pticlic.js b/code/serveur/php/ressources/pticlic.js @@ -1,23 +1,29 @@ -if (typeof(console) == 'undefined') - console = {log: function() {}}; - // ==== URL persistante function State(init) { + try { $.extend(this, init || {}); if (!this.screen) this.screen = 'frontpage'; + } catch(e) {alert("Error State");alert(e);} }; State.prototype.commit = function() { + try { location.hash="#"+encodeURI($.JSON.encode(this)); return this; + } catch(e) {alert("Error State.prototype.commit");alert(e);} }; State.prototype.get = function(key) { + try { return this[key]; + } catch(e) {alert("Error State.prototype.get");alert(e);} }; State.prototype.set = function(key, value) { + try { this[key] = value; return this; + } catch(e) {alert("Error State.prototype.set");alert(e);} }; State.prototype.validate = function () { + try { state = this; UI().setScreen(this.screen); if (oldScreen != this.screen) { @@ -26,6 +32,7 @@ State.prototype.validate = function () { } if (window[this.screen] && window[this.screen].enter) window[this.screen].enter(); return this; + } catch(e) {alert("Error State.prototype.validate");alert(e);} }; var runstate = {}; @@ -33,12 +40,15 @@ var state; var oldScreen = ''; var ui = {}; function hashchange() { + try { var stateJSON = decodeURI(location.hash.substring(location.hash.indexOf("#") + 1)); state = new State($.parseJSON(stateJSON)).validate(); + } catch(e) {alert("Error hashchange");alert(e);} } // ==== JavaScript Style général function jss() { + try { var w = $(window).width(); var h = $(window).height(); var iconSize; @@ -62,10 +72,11 @@ function jss() { $("#"+state.screen+".screen").show(); if (window[state.screen] && window[state.screen].jss) window[state.screen].jss(w, h, iconSize); + } catch(e) {alert("Error jss");alert(e);} } - // ==== Interface Android function UI () { + try { if (typeof(PtiClicAndroid) != "undefined") { return PtiClicAndroid; } else { @@ -73,39 +84,46 @@ function UI () { isAndroid: function() { return false; }, setPreference: function() {}, getPreference: function() {return "";}, - show: function(title, text) {},// { if (typeof console != 'undefined') console.log(title, text);}, - dismiss: function() {},// {if (typeof console != 'undefined') console.log('dismiss');}, + show: function(title, text) {}, + dismiss: function() {}, exit: function() {}, log: function() {}, setScreen: function() {} }; } + } catch(e) {alert("Error UI");alert(e);} } // ==== Code métier général $(function() { + try { $(window).resize(jss); $(window).hashchange(hashchange); hashchange(); + } catch(e) {alert("Error main function");alert(e);} }); function ajaxError(x) { - UI().dismiss(); - var msg = "Erreur fatale. Merci de nous envoyer ce message : "; - msg += x.status+" - "+x.statusText+"\n"+x.responseText.substring(0,20)+((x.responseText == '') ? '': '…'); - if (UI().isAndroid) - true; - else - alert(msg); - UI().exit(); + try { + UI().dismiss(); + var msg = "Erreur fatale. Merci de nous envoyer ce message : "; + msg += x.status+" - "+x.statusText+"\n"+x.responseText.substring(0,20)+((x.responseText == '') ? '': '…'); + alert(msg); + UI().exit(); + } catch(e) {alert("Error ajaxError");alert(e);} } // ==== Code métier pour la frontpage frontpage = {}; frontpage.jss = function(w, h, iconSize) { + try { var fp = $("#frontpage.screen"); - var $fp = function() { return fp.find.apply(fp,arguments); }; + var $fp = function() { + try { + return fp.find.apply(fp,arguments); + } catch(e) {alert("Error anonymous in frontpage.jss");alert(e);} + }; var nbIcons = $fp(".icon").size(); var nbRows = Math.ceil(nbIcons / 2) var ww = w - 2 * iconSize; @@ -132,6 +150,7 @@ frontpage.jss = function(w, h, iconSize) { $fp(".frontpage-button > div").css('display', 'block'); $fp(".frontpage-button").each(function(i,e){ + try { e=$(e); var currentRow = Math.floor(i/2); var currentColumn = i % 2; @@ -142,27 +161,38 @@ frontpage.jss = function(w, h, iconSize) { } else { e.northWest({left:w/2+ww*0.05,top:iconOffset}); } + } catch(e) {alert("Error anonymous in frontpage.jss");alert(e);} }); + } catch(e) {alert("Error frontpage.jss");alert(e);} }; frontpage.enter = function () { + try { if (location.hash != '') state.commit(); $("#frontpage .frontpage-button.game").clickOnce(frontpage.click.game); jss(); UI().dismiss(); + } catch(e) {alert("Error frontpage.enter");alert(e);} }; frontpage.click = {}; frontpage.click.game = function(){ + try { state.set('screen', 'game').validate(); + } catch(e) {alert("Error frontpage.click.game");alert(e);} }; // ==== Code métier pour le jeu game = {}; game.jss = function(w, h, iconSize) { + try { var g = $("#game.screen"); - var $g = function() { return g.find.apply(g,arguments); }; + var $g = function() { + try { + return g.find.apply(g,arguments); + } catch(e) {alert("Error anonymous in game.jss");alert(e);} + }; var mch = h/8, mnh = h*0.075; $g("#mc-caption-block") @@ -203,17 +233,21 @@ game.jss = function(w, h, iconSize) { $g(".relations") .south(g.south()); + } catch(e) {alert("Error game.jss");alert(e);} }; game.enter = function () { + try { if (!state.game) { var notAlreadyFetching = !runstate.gameFetched; runstate.gameFetched = function(data) { + try { state.game = data; state.currentWordNb = 0; state.game.answers = []; state.commit(); game.buildUi(); + } catch(e) {alert("Error anonymous 1 in game.enter");alert(e);} }; if (notAlreadyFetching) { UI().show("PtiClic", "Récupération de la partie"); @@ -222,26 +256,33 @@ game.enter = function () { passwd:"bar", nonce:Math.random() }, function(data) { + try { var fn = runstate.gameFetched; runstate.gameFetched = false; fn(data); + } catch(e) {alert("Error anonymous 2 in game.enter");alert(e);} }).error(ajaxError); } } else { game.buildUi(); } jss(); + } catch(e) {alert("Error game.enter");alert(e);} }; game.leave = function () { + try { $("#game .relations").empty(); $('#game #mn-caption').stop().clearQueue(); if (runstate.gameFetched) runstate.gameFetched = function() {}; + } catch(e) {alert("Error game.leave");alert(e);} }; game.buildUi = function () { + try { $("#game .relations").empty(); $.each(state.game.relations, function(i, relation) { + try { $('#templates .relationBox') .clone() .data("rid", relation.id) @@ -255,18 +296,23 @@ game.buildUi = function () { game.nextWord({left:e.pageX, top:e.pageY}, this); }) .appendTo("#game .relations"); + } catch(e) {alert("Error anonymous in game.buildUi");alert(e);} }); game.updateText(); + } catch(e) {alert("Error game.buildUi");alert(e);} } game.updateText = function() { + try { $("#game .mn").text(state.game.cloud[state.currentWordNb].name); $("#game .mc").text(state.game.center.name); jss(); UI().dismiss(); + } catch(e) {alert("Error game.updateText");alert(e);} } game.animateNext = function (click, button) { + try { var duration = 700; var mn = $("#game #mn-caption"); @@ -281,7 +327,11 @@ game.animateNext = function (click, button) { .appendTo("body") // Append to body so we can animate the offset (instead of top/left). .offset(mn.offset()) .animate({left:click.left, top:click.top, fontSize: 0}, duration) - .queue(function() { $(this).remove(); }); + .queue(function() { + try { + $(this).remove(); + } catch(e) {alert("Error anonymous 1 in game.animateNext");alert(e);} + }); game.updateText(); var fs = mn.css("fontSize"); @@ -289,10 +339,16 @@ game.animateNext = function (click, button) { (mn) .css("fontSize", 0) - .animate({fontSize: fs}, {duration:duration, step:function(){mn.center(mncbCenter);}}); + .animate({fontSize: fs}, {duration:duration, step:function(){ + try { + mn.center(mncbCenter); + } catch(e) {alert("Error anonymous 2 in game.animateNext");alert(e);} + }}); + } catch(e) {alert("Error game.animateNext");alert(e);} } game.nextWord = function(click, button) { + try { state.game.answers[state.currentWordNb++] = $(button).data("rid"); if (state.currentWordNb < state.game.cloud.length) { game.animateNext(click, button); @@ -300,20 +356,25 @@ game.nextWord = function(click, button) { } else { state.set('screen','score').validate(); } + } catch(e) {alert("Error game.nextWord");alert(e);} } // ==== Code métier pour les scores score = {}; score.jss = function(w, h, iconSize) { + try { $(".screen") .css('text-align', 'center'); + } catch(e) {alert("Error score.jss");alert(e);} }; score.enter = function () { + try { if (!state.hasScore) { var notAlreadyFetching = !runstate.scoreFetched; runstate.scoreFetched = function(data) { + try { for (var i = 0; i < data.scores.length; ++i) { state.game.cloud[i].score = data.scores[i]; } @@ -322,6 +383,7 @@ score.enter = function () { state.hasScore = true; state.commit(); score.ui(); + } catch(e) {alert("Error anonymous 1 in score.enter");alert(e);} }; if (notAlreadyFetching) { UI().show("PtiClic", "Calcul de votre score"); @@ -334,24 +396,31 @@ score.enter = function () { answers: state.game.answers, nonce: Math.random() }, function(data){ + try { var fn = runstate.scoreFetched; runstate.scoreFetched = false; fn(data); + } catch(e) {alert("Error anonymous 2 in score.enter");alert(e);} }).error(ajaxError); } } else { score.ui(); } jss(); + } catch(e) {alert("Error score.enter");alert(e);} } score.leave = function () { + try { if (runstate.scoreFetched) runstate.scoreFetched = function() {}; + } catch(e) {alert("Error score.leave");alert(e);} }; score.ui = function () { + try { $("#score .scores").empty(); $.each(state.game.cloud, function(i,e) { + try { var percentScore = (e.score - state.game.minScore) / (state.game.maxScore - state.game.minScore); u = $("#templates .scoreLine"); ee = e; @@ -365,10 +434,14 @@ score.ui = function () { .css("color","rgb("+(255 - 255*percentScore).clip(0,255)+","+(191*percentScore).clip(0,255,true)+",0)") .end() .appendTo("#score .scores"); + } catch(e) {alert("Error anonymous 1 in score.ui");alert(e);} }); $("#score #jaivu").clickOnce(function() { + try { state = new State().validate(); + } catch(e) {alert("Error anonymous 2 in score.ui");alert(e);} }); jss(); UI().dismiss(); + } catch(e) {alert("Error score.ui");alert(e);} }