OSDN Git Service

Version 0.6.146, fix XHR.send, add RegExp free encodeURIComponent, fix X.Object.deepCopy.
authoritozyun <itozyun@user.sourceforge.jp>
Mon, 11 May 2015 01:36:23 +0000 (10:36 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Mon, 11 May 2015 01:36:23 +0000 (10:36 +0900)
0.6.x/js/01_core/00_builtin.js
0.6.x/js/01_core/04_XObject.js
0.6.x/js/01_core/05_XString.js
0.6.x/js/06_net/00_XNet.js
0.6.x/js/06_net/01_XNetXHR.js

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