From bcbc459d2ccb54a0b12dda9b20185017a625f137 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli <thomas@roundcube.net> Date: Fri, 31 Jul 2015 16:02:10 -0400 Subject: [PATCH] Fix regex quoting --- program/js/common.js | 103 ++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 81 insertions(+), 22 deletions(-) diff --git a/program/js/common.js b/program/js/common.js index ff5f9b9..fa0f446 100644 --- a/program/js/common.js +++ b/program/js/common.js @@ -31,7 +31,6 @@ var SHIFT_KEY = 2; var CONTROL_SHIFT_KEY = 3; - /** * Default browser check class * @constructor @@ -40,8 +39,6 @@ { var n = navigator; - this.ver = parseFloat(n.appVersion); - this.appver = n.appVersion; this.agent = n.userAgent; this.agent_lc = n.userAgent.toLowerCase(); this.name = n.appName; @@ -65,19 +62,20 @@ this.ie = (document.all && !window.opera) || (this.win && this.agent_lc.indexOf('trident/') > 0); if (this.ie) { - this.ie7 = this.appver.indexOf('MSIE 7') > 0; - this.ie8 = this.appver.indexOf('MSIE 8') > 0; - this.ie9 = this.appver.indexOf('MSIE 9') > 0; + this.ie7 = n.appVersion.indexOf('MSIE 7') > 0; + this.ie8 = n.appVersion.indexOf('MSIE 8') > 0; + this.ie9 = n.appVersion.indexOf('MSIE 9') > 0; } else if (window.opera) { - this.opera = true; + this.opera = true; // Opera < 15 this.vendver = opera.version(); } else { this.chrome = this.agent_lc.indexOf('chrome') > 0; - this.safari = !this.chrome && (this.webkit || this.agent_lc.indexOf('safari') > 0); + this.opera = this.webkit && this.agent.indexOf(' OPR/') > 0; // Opera >= 15 + this.safari = !this.chrome && !this.opera && (this.webkit || this.agent_lc.indexOf('safari') > 0); this.konq = this.agent_lc.indexOf('konqueror') > 0; - this.mz = this.dom && !this.chrome && !this.safari && !this.konq && this.agent.indexOf('Mozilla') >= 0; + this.mz = this.dom && !this.chrome && !this.safari && !this.konq && !this.opera && this.agent.indexOf('Mozilla') >= 0; this.iphone = this.safari && (this.agent_lc.indexOf('iphone') > 0 || this.agent_lc.indexOf('ipod') > 0); this.ipad = this.safari && this.agent_lc.indexOf('ipad') > 0; } @@ -104,7 +102,7 @@ this.xmlhttp_test = function() { var activeX_test = new Function("try{var o=new ActiveXObject('Microsoft.XMLHTTP');return true;}catch(err){return false;}"); - this.xmlhttp = (window.XMLHttpRequest || (window.ActiveXObject && activeX_test())); + this.xmlhttp = window.XMLHttpRequest || (('ActiveXObject' in window) && activeX_test()); return this.xmlhttp; }; @@ -224,7 +222,7 @@ p.element = document; if (!p.object._rc_events) - p.object._rc_events = []; + p.object._rc_events = {}; var key = p.event + '*' + p.method; if (!p.object._rc_events[key]) @@ -279,6 +277,28 @@ e.cancelBubble = true; return false; +}, + +/** + * Determine whether the given event was trigered from keyboard + */ +is_keyboard: function(e) +{ + return e && ( + (e.pointerType !== undefined && e.pointerType !== 'mouse') || // IE 11+ + (e.mozInputSource && e.mozInputSource == e.MOZ_SOURCE_KEYBOARD) || // Firefox + (e.offsetX === 0 && e.offsetY === 0) || // Opera + (!e.pageX && (e.pageY || 0) <= 0 && !e.clientX && (e.clientY || 0) <= 0) || // others + (bw.ie && rcube_event._last_keyboard_event && rcube_event._last_keyboard_event.target == e.target) // hack for IE <= 10 + ); +}, + +/** + * Accept event if triggered from keyboard action (e.g. <Enter>) + */ +keyboard_only: function(e) +{ + return rcube_event.is_keyboard(e) ? true : rcube_event.cancel(e); }, touchevent: function(e) @@ -428,7 +448,7 @@ ], icann_addr = 'mailtest\\x40('+icann_domains.join('|')+')', word = '('+atom+'|'+quoted_string+')', - delim = '[,;\s\n]', + delim = '[,;\\s\\n]', local_part = word+'(\\x2e'+word+')*', addr_spec = '(('+local_part+'\\x40'+domain+')|('+icann_addr+'))', reg1 = inline ? new RegExp('(^|<|'+delim+')'+addr_spec+'($|>|'+delim+')', 'i') : new RegExp('^'+addr_spec+'$', 'i'); @@ -472,21 +492,25 @@ function rcube_find_object(id, d) { var n, f, obj, e; - if(!d) d = document; - if(d.getElementsByName && (e = d.getElementsByName(id))) + if (!d) d = document; + + if (d.getElementById) + if (obj = d.getElementById(id)) + return obj; + + if (!obj && d.getElementsByName && (e = d.getElementsByName(id))) obj = e[0]; - if(!obj && d.getElementById) - obj = d.getElementById(id); - if(!obj && d.all) + + if (!obj && d.all) obj = d.all[id]; - if(!obj && d.images.length) + if (!obj && d.images.length) obj = d.images[id]; if (!obj && d.forms.length) { for (f=0; f<d.forms.length; f++) { - if(d.forms[f].name == id) + if (d.forms[f].name == id) obj = d.forms[f]; else if(d.forms[f].elements[id]) obj = d.forms[f].elements[id]; @@ -494,7 +518,8 @@ } if (!obj && d.layers) { - if (d.layers[id]) obj = d.layers[id]; + if (d.layers[id]) + obj = d.layers[id]; for (n=0; !obj && n<d.layers.length; n++) obj = rcube_find_object(id, d.layers[n].document); } @@ -508,8 +533,8 @@ var mouse = rcube_event.get_mouse_pos(ev), pos = $(obj).offset(); - return ((mouse.x >= pos.left) && (mouse.x < (pos.left + obj.offsetWidth)) && - (mouse.y >= pos.top) && (mouse.y < (pos.top + obj.offsetHeight))); + return (mouse.x >= pos.left) && (mouse.x < (pos.left + obj.offsetWidth)) && + (mouse.y >= pos.top) && (mouse.y < (pos.top + obj.offsetHeight)); }; @@ -521,6 +546,7 @@ (path ? "; path=" + path : "") + (domain ? "; domain=" + domain : "") + (secure ? "; secure" : ""); + document.cookie = curCookie; }; @@ -587,6 +613,11 @@ }; } +// array utility function +jQuery.last = function(arr) { + return arr && arr.length ? arr[arr.length-1] : undefined; +} + // jQuery plugin to emulate HTML5 placeholder attributes on input elements jQuery.fn.placeholder = function(text) { return this.each(function() { @@ -623,6 +654,34 @@ }); }; +// function to parse query string into an object +rcube_parse_query = function(query) +{ + if (!query) + return {}; + + var params = {}, e, k, v, + re = /([^&=]+)=?([^&]*)/g, + decodeRE = /\+/g, // Regex for replacing addition symbol with a space + decode = function (str) { return decodeURIComponent(str.replace(decodeRE, ' ')); }; + + query = query.replace(/\?/, ''); + + while (e = re.exec(query)) { + k = decode(e[1]); + v = decode(e[2]); + + if (k.substring(k.length - 2) === '[]') { + k = k.substring(0, k.length - 2); + (params[k] || (params[k] = [])).push(v); + } + else + params[k] = v; + } + + return params; +}; + // This code was written by Tyler Akins and has been placed in the // public domain. It would be nice if you left this header intact. -- Gitblit v1.9.1