From: itozyun Date: Mon, 11 May 2015 01:36:23 +0000 (+0900) Subject: Version 0.6.146, fix XHR.send, add RegExp free encodeURIComponent, fix X.Object.deepCopy. X-Git-Url: http://git.osdn.jp/view?p=pettanr%2FclientJs.git;a=commitdiff_plain;h=b072c0d95a33cb58007a5d2f50a5a9b4bd1f9341 Version 0.6.146, fix XHR.send, add RegExp free encodeURIComponent, fix X.Object.deepCopy. --- diff --git a/0.6.x/js/01_core/00_builtin.js b/0.6.x/js/01_core/00_builtin.js index b5cb1cb..8af9798 100644 --- a/0.6.x/js/01_core/00_builtin.js +++ b/0.6.x/js/01_core/00_builtin.js @@ -140,79 +140,94 @@ Array.prototype.indexOf || (Array.prototype.indexOf = function( searchElement, f */ /* - * Window + * original: * by https://web.archive.org/web/20100413085309/http://nurucom-archives.hp.infoseek.co.jp/digital/trans-uri.html */ +var _builtin_skipEncodeURI = (function(){ + var encodeURIComponentTarget = '!\'()*-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~', + encodeURITarget = '#$&+,-/:;=?@', + obj = {}, i; + for( i = encodeURIComponentTarget.length; i; ){ + obj[ encodeURIComponentTarget.charCodeAt( --i ) ] = 2; + }; + for( i = encodeURITarget.length; i; ){ + obj[ encodeURITarget.charCodeAt( --i ) ] = 1; + }; + return obj; +})(); -/* - * // -// TransURI (UTF-8): transURI.js (Ver.041211) -// -// Copyright (C) http://nurucom-archives.hp.infoseek.co.jp/digital/ -// +// /[^!#$&-;=?-Z_a-z~]/g +window.encodeURI || (window.encodeURI = function( x ){ return _builtin_encodeURI( x, 0 ); }); +// /[^!'-*.0-9A-Z_a-z~-]/g +window.encodeURIComponent || (window.encodeURIComponent = function( x ){ return _builtin_encodeURI( x, 1 ); }); -EncodeURI=function(str){ - return str.replace(/[^!#$&-;=?-Z_a-z~]/g,function(s){ - var c=s.charCodeAt(0); - return (c<16?"%0"+c.toString(16):c<128?"%"+c.toString(16):c<2048?"%"+(c>>6|192).toString(16)+"%"+(c&63|128).toString(16):"%"+(c>>12|224).toString(16)+"%"+(c>>6&63|128).toString(16)+"%"+(c&63|128).toString(16)).toUpperCase() - }) +function _builtin_encodeURI( x, kind ){ + var result = [], + skip = _builtin_skipEncodeURI, + p = '%', + i = 0, l, chr, c; + + x += ''; + + for( l = x.length; i < l; ++i ){ + if( !( kind < skip[ c = x.charCodeAt( i ) ] ) ){ + chr = ( + c < 16 ? '%0' + c.toString(16) : + c < 128 ? p + c.toString(16) : + c < 2048 ? p + (c >> 6 | 192).toString(16) + p + (c & 63 | 128).toString(16) : + p + (c >> 12 | 224).toString(16) + p + (c >> 6 & 63 | 128).toString(16) + p + (c & 63 | 128).toString(16) + ).toUpperCase(); + } else { + chr = x.charAt( i ); + }; + result[ i ] = chr; + }; + + return result.join( '' ); }; -EncodeURIComponent=function(str){ - return str.replace(/[^!'-*.0-9A-Z_a-z~-]/g,function(s){ - var c=s.charCodeAt(0); - return (c<16?'%0'+c.toString(16):c<128?'%'+c.toString(16):c<2048?'%'+(c>>6|192).toString(16)+'%'+(c&63|128).toString(16):'%'+(c>>12|224).toString(16)+'%'+(c>>6&63|128).toString(16)+'%'+(c&63|128).toString(16)).toUpperCase() - }) -}; -DecodeURI=function(str){ - return str.replace(/%(E(0%[AB]|[1-CEF]%[89AB]|D%[89])[0-9A-F]|C[2-9A-F]|D[0-9A-F])%[89AB][0-9A-F]|%[0-7][0-9A-F]/ig,function(s){ - var c=parseInt(s.substring(1),16); - return String.fromCharCode(c<128?c:c<224?(c&31)<<6|parseInt(s.substring(4),16)&63:((c&15)<<6|parseInt(s.substring(4),16)&63)<<6|parseInt(s.substring(7),16)&63) - }) +function _builtin_decodeURI( x ){ + var result = [], + toInt = parseInt, + toChrCode = String.fromCharCode, + n = -1, i = 0, l, chr, decode, code, memory; + + x += ''; + + for( l = x.length; i < l; ++i ){ + if( decode ){ + code = toInt( x.substr( i, 2 ), 16 ); + ++i; + if( 127 < code ){ + if( 223 < code ){ + memory = ( code & 15 ) << 12; + code = toInt( x.substr( i + 2, 2 ), 16 ) & 63; // 00%00%00 + i += 3; + memory += code << 6; + } else { + memory = ( code & 63 ) << 6; + }; + code = toInt( x.substr( i + 2, 2 ), 16 ) & 63; + i += 3; + code += memory; + }; + // if( code !== code ) error + //console.log( code ); + result[ ++n ] = toChrCode( code ); + decode = false; + } else { + chr = x.charAt( i ); + if( !( decode = chr === '%' ) ){ + result[ ++n ] = chr; + }; + }; + }; + return result.join( '' ); }; - */ - -/* 正規表現が使われているため、まだ投入しない itozyun*/ -window.encodeURI || (window.encodeURI = function (x) { - return ("" + x).replace(/[^!#$&-;=?-Z_a-z~]/g, function (s) { - var c = s.charCodeAt(0), p = "%"; - return ( - c < 16 ? "%0" + c.toString(16) : - c < 128 ? p + c.toString(16) : - c < 2048 ? p + (c >> 6 | 192).toString(16) + p + (c & 63 | 128).toString(16) : - p + (c >> 12 | 224).toString(16) + p + (c >> 6 & 63 | 128).toString(16) + p + (c & 63 | 128).toString(16) - ).toUpperCase(); - }); -}); - -window.encodeURIComponent || (window.encodeURIComponent = function (x) { - return ("" + x).replace(/[^!'-*.0-9A-Z_a-z~-]/g, function (s) { - var c = s.charCodeAt(0), p = "%"; - return ( - c < 16 ? "%0" + c.toString(16) : - c < 128 ? p + c.toString(16) : - c < 2048 ? p + (c >> 6 | 192).toString(16) + p + (c & 63 | 128).toString(16) : - p + (c >> 12 | 224).toString(16) + p + (c >> 6 & 63 | 128).toString(16) + p + (c & 63 | 128).toString(16) - ).toUpperCase(); - }); -}); - -// 手抜き -window.decodeURI || (window.decodeURI = function (x) { - return ("" + x).replace(/%(E(0%[AB]|[1-CEF]%[89AB]|D%[89])[0-9A-F]|C[2-9A-F]|D[0-9A-F])%[89AB][0-9A-F]|%[0-7][0-9A-F]/ig, function (s) { - var c = parseInt(s.substring(1), 16); - return String.fromCharCode( - c < 128 ? c : - c < 224 ? (c & 31) << 6 | parseInt(s.substring(4), 16) & 63 : - ((c & 15) << 6 | parseInt(s.substring(4), 16) & 63) << 6 | parseInt(s.substring(7), 16) & 63 - ); - }); -}); - - -//window.decodeURIComponent || (window.decodeURIComponent = window.decodeURI); +window.decodeURI || (window.decodeURI = _builtin_decodeURI); +window.decodeURIComponent || (window.decodeURIComponent = window.decodeURI); /* diff --git a/0.6.x/js/01_core/04_XObject.js b/0.6.x/js/01_core/04_XObject.js index 1dcde48..01a0447 100644 --- a/0.6.x/js/01_core/04_XObject.js +++ b/0.6.x/js/01_core/04_XObject.js @@ -117,7 +117,7 @@ function X_Object_deepCopy_( src, objSrc, objCopy, n ) { }; for( k in src ){ //if( X_EMPTY_OBJECT[ k ] ) continue; - ret[ k ] = clone( src[ k ], objSrc, objCopy, n ); + ret[ k ] = X_Object_deepCopy_( src[ k ], objSrc, objCopy, n ); }; return ret; }; diff --git a/0.6.x/js/01_core/05_XString.js b/0.6.x/js/01_core/05_XString.js index a3ff287..c2dd44f 100644 --- a/0.6.x/js/01_core/05_XString.js +++ b/0.6.x/js/01_core/05_XString.js @@ -24,7 +24,9 @@ X[ 'String' ] = { 'toChrReferance' : X_String_toChrReferance, - 'isNumberString' : X_String_isNumberString + 'isNumberString' : X_String_isNumberString, + + 'serialize' : X_String_serialize }; // ------------------------------------------------------------------------- // @@ -108,3 +110,67 @@ function X_String_isNumberString( v ){ return '' + n === v || '' + n === '0' + v; }; +// https://github.com/jquery/jquery/blob/master/src/serialize.js +function X_String_serialize( a, traditional ) { + var prefix, + list = []; + + // If an array was passed in, assume that it is an array of form elements. + if ( X_Type_isArray( a ) && false ) { + // Serialize the form elements + //jQuery.each( a, function() { + // X_String_serialize_addParam( list, this.name, this.value ); + //}); + + } else { + // If traditional, encode the 'old' way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + X_String_serialize_buildParams( list, prefix, a[ prefix ], traditional ); + } + } + + // Return the resulting serialization + return list.join( '&' ).split( '%20' ).join( '+' ); +}; + +function X_String_serialize_addParam( list, key, value ){ + // If value is a function, invoke it and return its value + value = X_Type_isFunction( value ) ? value() : ( value == null ? '' : value ); + list[ list.length ] = encodeURIComponent( key ) + '=' + encodeURIComponent( value ); +}; + +function X_String_serialize_buildParams( list, prefix, obj, traditional ) { + var name; + + if ( X_Type_isArray( obj ) ) { + // Serialize array item. + for( i = 0, l = obj.length; i < l; ++i ){ + v = obj[ i ]; + if ( traditional || prefix === '[]' ) { + // Treat each array item as a scalar. + X_String_serialize_addParam( list, prefix, v ); + + } else { + // Item is non-scalar (array or object), encode its numeric index. + X_String_serialize_buildParams( + list, + prefix + '[' + ( X_Type_isObject( v ) ? i : '' ) + ']', + v, + traditional + ); + }; + }; + + } else + if ( !traditional && X_Type_isObject( obj ) ) { + // Serialize object item. + for ( name in obj ) { + X_String_serialize_buildParams( list, prefix + '[' + name + ']', obj[ name ], traditional ); + }; + + } else { + // Serialize scalar item. + X_String_serialize_addParam( list, prefix, obj ); + }; +}; diff --git a/0.6.x/js/06_net/00_XNet.js b/0.6.x/js/06_net/00_XNet.js index 0257822..bafbeef 100644 --- a/0.6.x/js/06_net/00_XNet.js +++ b/0.6.x/js/06_net/00_XNet.js @@ -74,7 +74,7 @@ X[ 'Net' ] = X_EventDispatcher[ 'inherits' ]( alert( 'X.Net args error' ); return; }; - + url = opt[ 'url' ]; }; if( !X_Type_isString( url ) ){ @@ -107,7 +107,7 @@ X[ 'Net' ] = X_EventDispatcher[ 'inherits' ]( }; - opt = X_Object_clone( opt ); + opt = X_Object_deepCopy( opt ); opt.netType = type; opt[ 'url' ] = url; @@ -156,7 +156,7 @@ var X_NET_TYPE_XHR = 1, X_NET_completePhase; function X_NET_proxyDispatch( e ){ - var i, flag; + var i, flag, auth; switch( e.type ){ case X_EVENT_BEFORE_KILL_INSTANCE : @@ -185,8 +185,16 @@ function X_NET_proxyDispatch( e ){ case X_EVENT_PROGRESS : this[ 'dispatch' ]( e ); break; - case X_EVENT_SUCCESS : + case X_EVENT_ERROR : + if( e.status === 401 ){ + auth = X_Pair_get( this )[ 'auth' ]; + if( auth ){ + X_Pair_get( auth ).onAuthError( auth ); + }; + }; + + case X_EVENT_SUCCESS : case X_EVENT_TIMEOUT : X_NET_completePhase = true; this @@ -205,6 +213,7 @@ function X_NET_proxyDispatch( e ){ }; function X_NET_shiftQueue(){ + var auth, authSettings; if( X_NET_currentQueue ){ if( X_NET_currentWrapper._busy ) return; @@ -222,6 +231,28 @@ function X_NET_shiftQueue(){ switch( X_NET_currentData.netType ){ case X_NET_TYPE_XHR : X_NET_currentWrapper = X_NET_XHRWrapper || X_TEMP.X_Net_XHR_init(); + // TODO OAuth2 + // oauth2.authState() -> NEED_AUTH -> COMPLETE, refresh 中なら後回し。 + + if( auth = X_NET_currentData[ 'auth' ] ){ + authSettings = X_Pair_get( auth ); + switch( auth.state() ){ + case 0 : + case 1 : + if( !( auth[ 'dispatch' ]( X_EVENT_NEED_AUTH ) & X_Callback_PREVENT_DEFAULT ) ){ + authSettings.lazyReq = X_NET_currentQueue; + }; + X_NET_currentQueue = null; + X_NET_shiftQueue(); + break; + case 2 : // refresh token + X_NET_QUEUE_LIST.push( X_NET_currentQueue ); + X_NET_currentQueue = null; + X_NET_shiftQueue(); + return; + }; + authSettings.updateRequest( auth, X_NET_currentData ); + }; break; case X_NET_TYPE_JSONP : X_NET_currentWrapper = X_NET_JSONPWrapper || X_TEMP.X_NET_JSONP_init(); diff --git a/0.6.x/js/06_net/01_XNetXHR.js b/0.6.x/js/06_net/01_XNetXHR.js index 000ba11..cd4d0e6 100644 --- a/0.6.x/js/06_net/01_XNetXHR.js +++ b/0.6.x/js/06_net/01_XNetXHR.js @@ -103,6 +103,8 @@ X_TEMP.X_Net_XHR_init = function(){ _percent : 0, _timerID : 0, + _auth : null, + load : function( obj ){ var raw = this[ '_rawObject' ], method = obj[ 'method' ], @@ -111,26 +113,26 @@ X_TEMP.X_Net_XHR_init = function(){ username = obj[ 'username' ], password = obj[ 'password' ], headers = obj[ 'headers' ] || {}, - postdata = obj[ 'postdata' ], + postdata = obj[ 'postdata' ] || '', timeout = obj[ 'timeout' ] || 20000, tmp; - + this._dataType = obj[ 'dataType' ] || X_URL_getEXT( url ); if( X_Net_XHR_X_DOMAIN ){ if( X_URL_isSameDomain( url ) ){ // isXDomain if( this._isXDR ){ X_EventDispatcher_toggleAllEvents( this, false ); - this[ '_rawObject' ] = X_Net_XHR_W3C || X_Net_XHR_ACTIVE_X; + this[ '_rawObject' ] = raw = X_Net_XHR_W3C || X_Net_XHR_ACTIVE_X; X_EventDispatcher_toggleAllEvents( this, true ); - this._isXDR = false; + this._isXDR = false; }; } else { if( !this._isXDR ){ X_EventDispatcher_toggleAllEvents( this, false ); - this[ '_rawObject' ] = X_Net_XHR_X_DOMAIN; + this[ '_rawObject' ] = raw = X_Net_XHR_X_DOMAIN; X_EventDispatcher_toggleAllEvents( this, true ); - this._isXDR = true; + this._isXDR = true; }; }; }; @@ -199,7 +201,7 @@ X_TEMP.X_Net_XHR_init = function(){ console.log( obj[ 'mimeType' ] || tmp ); }; - if( !X_Net_XHR_ACTIVE_X && X_Type_isFunction( raw.setRequestHeader ) ){ + if( /* !X_Net_XHR_ACTIVE_X && !this._isXDR && */ X_Type_isFunction( raw.setRequestHeader ) ){ // http://nakigao.sitemix.jp/blog/?p=2040 // json 取得時に SafariでHTTP/412のエラー。但し相手が audio の場合、この指定があるとロードに失敗する。 iOS8.2, iOS7.1 では遭遇せず @@ -222,9 +224,8 @@ X_TEMP.X_Net_XHR_init = function(){ // send 前にフラグを立てる,回線が早いと raw.send() 内で onload -> _busy = false ののち、 _busy = true するため。 this._busy = true; - - // TODO toString - raw.send( postdata || '' ); + + raw.send( X_Type_isString( postdata ) ? postdata : X_String_serialize( postdata ) ); }, cancel : function(){ @@ -367,8 +368,9 @@ X_TEMP.X_Net_XHR_init = function(){ }; this[ 'asyncDispatch' ]( 32, { type : X_EVENT_SUCCESS, status : status || 200, data : data } ); - } else { - live && this[ 'asyncDispatch' ]( 32, { type : X_EVENT_ERROR, status : raw.status || 0, 'percent' : 100 } ); + } else + if( live ){ + this[ 'asyncDispatch' ]( 32, { type : X_EVENT_ERROR, status : raw.status || 0, 'percent' : 100 } ); }; break;