From e715ff678a081df9413ee06917853c93315e9a04 Mon Sep 17 00:00:00 2001 From: Alan Knowles Date: Thu, 17 Mar 2011 07:31:12 +0000 Subject: [PATCH] Fix encoding of urls (unicode safe)- introduces new Roo.encodeURIComponent --- Roo.js | 60 ++++++++++++++++++++++++++++++++++++-- Roo/lib/Ajax.js | 10 +++---- roojs-all.js | 7 +++-- roojs-core-debug.js | 70 +++++++++++++++++++++++++++++++++++++++------ roojs-core.js | 7 +++-- roojs-debug.js | 70 +++++++++++++++++++++++++++++++++++++++------ 6 files changed, 194 insertions(+), 30 deletions(-) diff --git a/Roo.js b/Roo.js index 7df38d2bec..98658cf90e 100644 --- a/Roo.js +++ b/Roo.js @@ -336,16 +336,16 @@ Roo.factory(conf, Roo.data); } var buf = []; for(var key in o){ - var ov = o[key], k = encodeURIComponent(key); + var ov = o[key], k = Roo.encodeURIComponent(key); var type = typeof ov; if(type == 'undefined'){ buf.push(k, "=&"); }else if(type != "function" && type != "object"){ - buf.push(k, "=", encodeURIComponent(ov), "&"); + buf.push(k, "=", Roo.encodeURIComponent(ov), "&"); }else if(ov instanceof Array){ if (ov.length) { for(var i = 0, len = ov.length; i < len; i++) { - buf.push(k, "=", encodeURIComponent(ov[i] === undefined ? '' : ov[i]), "&"); + buf.push(k, "=", Roo.encodeURIComponent(ov[i] === undefined ? '' : ov[i]), "&"); } } else { buf.push(k, "=&"); @@ -354,6 +354,60 @@ Roo.factory(conf, Roo.data); } buf.pop(); return buf.join(""); + }, + /** + * Safe version of encodeURIComponent + * @param {String} data + * @return {String} + */ + + encodeURIComponent : function (data) + { + try { + return encodeURIComponent(data); + } catch(e) {} // should be an uri encode error. + + if (data == '' || data == null){ + return ''; + } + // http://stackoverflow.com/questions/2596483/unicode-and-uri-encoding-decoding-and-escaping-in-javascript + function nibble_to_hex(nibble){ + var chars = '0123456789ABCDEF'; + return chars.charAt(nibble); + } + data = data.toString(); + var buffer = ''; + for(var i=0; i 0x10000){ + // 4 bytes + bs[0] = 0xF0 | ((c & 0x1C0000) >>> 18); + bs[1] = 0x80 | ((c & 0x3F000) >>> 12); + bs[2] = 0x80 | ((c & 0xFC0) >>> 6); + bs[3] = 0x80 | (c & 0x3F); + }else if (c > 0x800){ + // 3 bytes + bs[0] = 0xE0 | ((c & 0xF000) >>> 12); + bs[1] = 0x80 | ((c & 0xFC0) >>> 6); + bs[2] = 0x80 | (c & 0x3F); + }else if (c > 0x80){ + // 2 bytes + bs[0] = 0xC0 | ((c & 0x7C0) >>> 6); + bs[1] = 0x80 | (c & 0x3F); + }else{ + // 1 byte + bs[0] = c; + } + for(var j=0; j>> 4) + + nibble_to_hex(b &0x0F); + buffer += '%'+hex; + } + } + return buffer; + }, /** diff --git a/Roo/lib/Ajax.js b/Roo/lib/Ajax.js index c7a6f9f408..4196565cb5 100644 --- a/Roo/lib/Ajax.js +++ b/Roo/lib/Ajax.js @@ -50,10 +50,10 @@ for (var j = 0; j < el.options.length; j++) { if (el.options[j].selected) { if (Roo.isIE) { - data += encodeURIComponent(name) + '=' + encodeURIComponent(el.options[j].attributes['value'].specified ? el.options[j].value : el.options[j].text) + '&'; + data += Roo.encodeURIComponent(name) + '=' + Roo.encodeURIComponent(el.options[j].attributes['value'].specified ? el.options[j].value : el.options[j].text) + '&'; } else { - data += encodeURIComponent(name) + '=' + encodeURIComponent(el.options[j].hasAttribute('value') ? el.options[j].value : el.options[j].text) + '&'; + data += Roo.encodeURIComponent(name) + '=' + Roo.encodeURIComponent(el.options[j].hasAttribute('value') ? el.options[j].value : el.options[j].text) + '&'; } } } @@ -61,7 +61,7 @@ case 'radio': case 'checkbox': if (el.checked) { - data += encodeURIComponent(name) + '=' + encodeURIComponent(val) + '&'; + data += Roo.encodeURIComponent(name) + '=' + Roo.encodeURIComponent(val) + '&'; } break; case 'file': @@ -75,12 +75,12 @@ break; case 'submit': if(hasSubmit == false) { - data += encodeURIComponent(name) + '=' + encodeURIComponent(val) + '&'; + data += Roo.encodeURIComponent(name) + '=' + Roo.encodeURIComponent(val) + '&'; hasSubmit = true; } break; default: - data += encodeURIComponent(name) + '=' + encodeURIComponent(val) + '&'; + data += Roo.encodeURIComponent(name) + '=' + Roo.encodeURIComponent(val) + '&'; break; } } diff --git a/roojs-all.js b/roojs-all.js index 42c65ad373..4a6f1a8c16 100644 --- a/roojs-all.js +++ b/roojs-all.js @@ -5,8 +5,9 @@ M=null;},id:function(el,M){M=M||"roo-gen";el=Roo.getDom(el);var id=M+(++A);retur sb.override=function(o){Roo.override(sb,o);};N.override=io;Roo.override(sb,M);return sb;};}(),override:function(M,N){if(N){var p=M.prototype;for(var O in N){p[O]=N[O];}}},namespace:function(){var a=arguments,o=null,i,j,d,rt;for(i=0;i0x10000){bs[0]=0xF0|((c&0x1C0000)>>>18);bs[1]=0x80|((c&0x3F000)>>>12);bs[2]=0x80|((c&0xFC0)>>>6);bs[3]=0x80|(c&0x3F);}else if(c>0x800){bs[0]=0xE0|((c&0xF000)>>>12);bs[1]=0x80|((c&0xFC0)>>>6);bs[2]=0x80|(c&0x3F);}else if(c>0x80){bs[0]=0xC0|((c&0x7C0)>>>6);bs[1]=0x80|(c&0x3F);}else {bs[0]=c;}for(var j=0;j>>4)+nibble_to_hex(b&0x0F);N+='%'+O;}}return N;},urlDecode:function(M,N){if(!M||!M.length){return {};}var O={};var P=M.split('&');var Q,R,S;for(var i=0,T=P.length;i 0x10000){ + // 4 bytes + bs[0] = 0xF0 | ((c & 0x1C0000) >>> 18); + bs[1] = 0x80 | ((c & 0x3F000) >>> 12); + bs[2] = 0x80 | ((c & 0xFC0) >>> 6); + bs[3] = 0x80 | (c & 0x3F); + }else if (c > 0x800){ + // 3 bytes + bs[0] = 0xE0 | ((c & 0xF000) >>> 12); + bs[1] = 0x80 | ((c & 0xFC0) >>> 6); + bs[2] = 0x80 | (c & 0x3F); + }else if (c > 0x80){ + // 2 bytes + bs[0] = 0xC0 | ((c & 0x7C0) >>> 6); + bs[1] = 0x80 | (c & 0x3F); + }else{ + // 1 byte + bs[0] = c; + } + for(var j=0; j>> 4) + + nibble_to_hex(b &0x0F); + buffer += '%'+hex; + } + } + return buffer; + }, /** @@ -2432,10 +2486,10 @@ Roo.lib.Event = function() { for (var j = 0; j < el.options.length; j++) { if (el.options[j].selected) { if (Roo.isIE) { - data += encodeURIComponent(name) + '=' + encodeURIComponent(el.options[j].attributes['value'].specified ? el.options[j].value : el.options[j].text) + '&'; + data += Roo.encodeURIComponent(name) + '=' + Roo.encodeURIComponent(el.options[j].attributes['value'].specified ? el.options[j].value : el.options[j].text) + '&'; } else { - data += encodeURIComponent(name) + '=' + encodeURIComponent(el.options[j].hasAttribute('value') ? el.options[j].value : el.options[j].text) + '&'; + data += Roo.encodeURIComponent(name) + '=' + Roo.encodeURIComponent(el.options[j].hasAttribute('value') ? el.options[j].value : el.options[j].text) + '&'; } } } @@ -2443,7 +2497,7 @@ Roo.lib.Event = function() { case 'radio': case 'checkbox': if (el.checked) { - data += encodeURIComponent(name) + '=' + encodeURIComponent(val) + '&'; + data += Roo.encodeURIComponent(name) + '=' + Roo.encodeURIComponent(val) + '&'; } break; case 'file': @@ -2457,12 +2511,12 @@ Roo.lib.Event = function() { break; case 'submit': if(hasSubmit == false) { - data += encodeURIComponent(name) + '=' + encodeURIComponent(val) + '&'; + data += Roo.encodeURIComponent(name) + '=' + Roo.encodeURIComponent(val) + '&'; hasSubmit = true; } break; default: - data += encodeURIComponent(name) + '=' + encodeURIComponent(val) + '&'; + data += Roo.encodeURIComponent(name) + '=' + Roo.encodeURIComponent(val) + '&'; break; } } diff --git a/roojs-core.js b/roojs-core.js index e9859a0aed..0a3ad6eaf9 100644 --- a/roojs-core.js +++ b/roojs-core.js @@ -5,8 +5,9 @@ M=null;},id:function(el,M){M=M||"roo-gen";el=Roo.getDom(el);var id=M+(++A);retur sb.override=function(o){Roo.override(sb,o);};N.override=io;Roo.override(sb,M);return sb;};}(),override:function(M,N){if(N){var p=M.prototype;for(var O in N){p[O]=N[O];}}},namespace:function(){var a=arguments,o=null,i,j,d,rt;for(i=0;i0x10000){bs[0]=0xF0|((c&0x1C0000)>>>18);bs[1]=0x80|((c&0x3F000)>>>12);bs[2]=0x80|((c&0xFC0)>>>6);bs[3]=0x80|(c&0x3F);}else if(c>0x800){bs[0]=0xE0|((c&0xF000)>>>12);bs[1]=0x80|((c&0xFC0)>>>6);bs[2]=0x80|(c&0x3F);}else if(c>0x80){bs[0]=0xC0|((c&0x7C0)>>>6);bs[1]=0x80|(c&0x3F);}else {bs[0]=c;}for(var j=0;j>>4)+nibble_to_hex(b&0x0F);N+='%'+O;}}return N;},urlDecode:function(M,N){if(!M||!M.length){return {};}var O={};var P=M.split('&');var Q,R,S;for(var i=0,T=P.length;i 0x10000){ + // 4 bytes + bs[0] = 0xF0 | ((c & 0x1C0000) >>> 18); + bs[1] = 0x80 | ((c & 0x3F000) >>> 12); + bs[2] = 0x80 | ((c & 0xFC0) >>> 6); + bs[3] = 0x80 | (c & 0x3F); + }else if (c > 0x800){ + // 3 bytes + bs[0] = 0xE0 | ((c & 0xF000) >>> 12); + bs[1] = 0x80 | ((c & 0xFC0) >>> 6); + bs[2] = 0x80 | (c & 0x3F); + }else if (c > 0x80){ + // 2 bytes + bs[0] = 0xC0 | ((c & 0x7C0) >>> 6); + bs[1] = 0x80 | (c & 0x3F); + }else{ + // 1 byte + bs[0] = c; + } + for(var j=0; j>> 4) + + nibble_to_hex(b &0x0F); + buffer += '%'+hex; + } + } + return buffer; + }, /** @@ -2432,10 +2486,10 @@ Roo.lib.Event = function() { for (var j = 0; j < el.options.length; j++) { if (el.options[j].selected) { if (Roo.isIE) { - data += encodeURIComponent(name) + '=' + encodeURIComponent(el.options[j].attributes['value'].specified ? el.options[j].value : el.options[j].text) + '&'; + data += Roo.encodeURIComponent(name) + '=' + Roo.encodeURIComponent(el.options[j].attributes['value'].specified ? el.options[j].value : el.options[j].text) + '&'; } else { - data += encodeURIComponent(name) + '=' + encodeURIComponent(el.options[j].hasAttribute('value') ? el.options[j].value : el.options[j].text) + '&'; + data += Roo.encodeURIComponent(name) + '=' + Roo.encodeURIComponent(el.options[j].hasAttribute('value') ? el.options[j].value : el.options[j].text) + '&'; } } } @@ -2443,7 +2497,7 @@ Roo.lib.Event = function() { case 'radio': case 'checkbox': if (el.checked) { - data += encodeURIComponent(name) + '=' + encodeURIComponent(val) + '&'; + data += Roo.encodeURIComponent(name) + '=' + Roo.encodeURIComponent(val) + '&'; } break; case 'file': @@ -2457,12 +2511,12 @@ Roo.lib.Event = function() { break; case 'submit': if(hasSubmit == false) { - data += encodeURIComponent(name) + '=' + encodeURIComponent(val) + '&'; + data += Roo.encodeURIComponent(name) + '=' + Roo.encodeURIComponent(val) + '&'; hasSubmit = true; } break; default: - data += encodeURIComponent(name) + '=' + encodeURIComponent(val) + '&'; + data += Roo.encodeURIComponent(name) + '=' + Roo.encodeURIComponent(val) + '&'; break; } } -- 2.39.2