OSDN Git Service

Version 0.6.147, fix X.UA & X.URL & X.EventDispatcher & X.XHR.
authoritozyun <itozyun@user.sourceforge.jp>
Tue, 12 May 2015 12:03:44 +0000 (21:03 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Tue, 12 May 2015 12:03:44 +0000 (21:03 +0900)
0.6.x/js/01_core/02_XUA.js
0.6.x/js/01_core/06_XURL.js
0.6.x/js/01_core/13_XEventDispatcher.js
0.6.x/js/03_plugin/00_XPlugin.js
0.6.x/js/06_net/00_XNet.js
0.6.x/js/06_net/01_XNetXHR.js

index ad17ef2..eda4818 100644 (file)
@@ -282,19 +282,20 @@ var X_UA = X[ 'UA' ] = {},
                 * @type {number}\r
                 */\r
                X_UA[ 'Trident' ]  = parseFloat(dav.split('Trident/')[1]) || 0;\r
-               /**\r
-                * documentモードを考慮したIEのバージョン\r
-                * @alias X.UA.IE\r
-                * @type {number}\r
-                */\r
-               X_UA[ 'IE' ]   = v = document.documentMode || X_UA[ '_IE' ];\r
+               \r
                tridentToVer       = X_UA[ 'Trident' ] ? ( X_UA[ 'Trident' ] + 4 | 0 ) : X_UA[ '_IE' ];\r
                /**\r
                 * IE10 以上の互換モードを使用している場合、そのバージョン\r
                 * @alias X.UA.IECompat\r
                 * @type {number}\r
                 */\r
-               if( v = tridentToVer !== X_UA[ '_IE' ] && tridentToVer ) X_UA[ 'IECompat' ] = v;\r
+               if( tridentToVer !== X_UA[ '_IE' ] ) X_UA[ 'IECompat' ] = tridentToVer;\r
+               /**\r
+                * documentモードを考慮したIEのバージョン\r
+                * @alias X.UA.IE\r
+                * @type {number}\r
+                */\r
+               X_UA[ 'IE' ]   = v = document.documentMode || tridentToVer;\r
                /**\r
                 * @alias X.UA.IE4\r
                 * @type {boolean}\r
@@ -361,7 +362,7 @@ var X_UA = X[ 'UA' ] = {},
                 */\r
                if( dua.toLowerCase().indexOf( 'windows phone' ) !== -1 || 0 < dav.indexOf( 'ZuneWP' ) ) X_UA[ 'WinPhone' ] = true; // ZuneWP は IEM のデスクトップモードで登場する\r
                \r
-               console.log( '>> IE : ' + v + ' ActiveX : ' + X_UA[ 'ActiveX' ] );\r
+               console.log( '>> IE : ' + v + ' ActiveX : ' + X_UA[ 'ActiveX' ] + ' IEHost : ' + X_UA[ 'IECompat' ] );\r
                // TODO XBox360, XBox1, Modern or Desktop, Standalone\r
                return;\r
        };\r
index 7d395f4..daa6a8e 100644 (file)
@@ -39,6 +39,10 @@ X[ 'URL' ] = {
        \r
        'isSameDomain'   : X_URL_isSameDomain,\r
        \r
+       'isSameProtocol' : X_URL_isSameProtocol,\r
+       \r
+       'isLocal'        : X_URL_isLocal,\r
+       \r
        'cleanup'        : X_URL_cleanup,\r
        \r
        'getEXT'         : X_URL_getEXT\r
@@ -81,6 +85,14 @@ function X_URL_isSameDomain( path ){
        return path === X_URL_BASE_URL || path.indexOf( X_URL_BASE_URL + '/' ) === 0;\r
 };\r
 \r
+function X_URL_isSameProtocol( path ){\r
+       return X_URL_toAbsolutePath( path ).indexOf( location.protocol ) === 0;\r
+};\r
+\r
+function X_URL_isLocal( path ){\r
+       return X_URL_toAbsolutePath( path ).indexOf( 'file:' ) === 0;\r
+};\r
+\r
 function X_URL_cleanup( path ){\r
        return path.split( '?' )[ 0 ].split( '#' )[ 0 ];\r
 };\r
index 0b83d8d..612268f 100644 (file)
@@ -192,7 +192,7 @@ var X_EventDispatcher = X[ 'EventDispatcher' ] =
                                \r
                                if( opt_type === undefined ) return !!listeners;\r
                                if( !listeners || !( list = listeners[ opt_type ] ) ) return false;\r
-                               if( opt_arg1 === undefined ) return true;\r
+                               if( opt_arg1 === undefined ) return X_EventDispatcher_needsIndex ? 0 : true;\r
                                \r
                                if( opt_arg1.kind ){\r
                                        cbHash = opt_arg1;\r
@@ -494,7 +494,7 @@ function X_EventDispatcher_unlisten( opt_type, opt_arg1, opt_arg2, opt_arg3 ){
                                empty = false;\r
                                break;\r
                        };\r
-                       if( raw && !X_String_isNumberString( opt_type ) ){ // 数字イベントの除外\r
+                       if( raw && !X_String_isNumberString( '' + opt_type ) ){ // 数字イベントの除外\r
                                X_EventDispatcher_removeEvent( this, opt_type, raw, list, !empty );\r
                        };\r
                        if( empty ) delete this[ '_listeners' ];\r
@@ -592,6 +592,7 @@ var X_EventDispatcher_actualAddEvent =
                                        break;                          \r
                                \r
                                case X_EventDispatcher_EVENT_TARGET_XHR :\r
+                                       console.log( 'XHR addEvent ' + type );\r
                                        // ie8- の XHR は window.event が更新されないため, eventType 毎に callback を指定する\r
                                        raw[ 'on' + type ] = X_Callback_create( that, X_EventDispatcher_dispatch, [ type ] );\r
                                        break;\r
@@ -710,6 +711,7 @@ var X_EventDispatcher_actualRemoveEvent =
                                        X_Callback_correct( raw[ 'on' + type ] );\r
                                        raw[ 'on' + type ] = X_emptyFunction;\r
                                        raw[ 'on' + type ] = '';\r
+                                       console.log( 'XHR rmEvent ' + type );\r
                                        break;\r
 \r
                                default :\r
index a6e6512..be90379 100644 (file)
@@ -38,7 +38,7 @@ var X_Pulgin_FLASH_VERSION =
        X_Pulgin_SILVER_LIGHT_VERSION = 
                !X_UA[ 'IE' ] && navigator.plugins[ 'Silverlight Plug-In' ] ?
                        parseFloat( navigator.plugins[ 'Silverlight Plug-In' ].version ) :
-               X_UA[ 'ActiveX' ] && 6 <= X_UA[ 'IE' ] && !X_UA[ 'IECompat' ] ? (function(){
+               X_UA[ 'ActiveX' ] && 6 <= X_UA[ 'IE' ] /* && !X_UA[ 'IECompat' ] */ ? (function(){
                            return eval( 'var a,i=0;try{a=new ActiveXObject("AgControl.AgControl");for(i=5;i;--i)if(a.IsVersionSupported(i+".0"))break;}catch(e){i=0}i' );
                        })() :
                        0,
index bafbeef..709f177 100644 (file)
@@ -230,10 +230,12 @@ function X_NET_shiftQueue(){
        \r
        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
+                       // TODO xProtocol, method -> gadget.io.makeRequset, flash\r
+                       \r
+                       X_NET_currentWrapper = X_NET_XHRWrapper || X_TEMP.X_Net_XHR_init();\r
+                       \r
+                       // OAuth2\r
                        if( auth = X_NET_currentData[ 'auth' ] ){\r
                                authSettings = X_Pair_get( auth );\r
                                switch( auth.state() ){\r
index cd4d0e6..9b5d7df 100644 (file)
@@ -31,31 +31,42 @@ basic 認証のかかったhtml を表示して、そのjsが xhr をすると A
 Android1.6- の XHR で 401 エラーが返った場合は、iframe に xml を表示させてその内容を取ればサーバ側の対応無しでいけるかも?\r
  */\r
 var // Opera7.6+, Safari1.2+, khtml3.?+, Gecko0.9.7+\r
-       // ie7 ではローカルリソースには ActiveX の XHR を使う\r
-       X_Net_XHR_W3C      = ( !X_UA[ 'IE7' ] || !X_URL_IS_LOCAL ) && window[ 'XMLHttpRequest' ] && new XMLHttpRequest(),\r
-       X_Net_XHR_progress = X_Net_XHR_W3C && X_Net_XHR_W3C.onprogress !== undefined,\r
-       X_Net_XHR_upload   = X_Net_XHR_W3C && !!X_Net_XHR_W3C.upload,\r
+       // ie7&8 ではローカルリソースには ActiveX の XHR を使う\r
+       X_Net_XHR_createW3C   = window[ 'XMLHttpRequest' ] && function(){ return X_Net_XHR_w3c || ( X_Net_XHR_w3c = new XMLHttpRequest() ); },\r
+       X_Net_XHR_w3c         = X_Net_XHR_createW3C && X_Net_XHR_createW3C(),\r
+       X_Net_XHR_progress    = X_Net_XHR_w3c && X_Net_XHR_w3c.onprogress !== undefined,\r
+       X_Net_XHR_upload      = X_Net_XHR_w3c && !!X_Net_XHR_w3c.upload,\r
        \r
-       X_Net_XHR_X_DOMAIN = window[ 'XDomainRequest' ] && new XDomainRequest(),\r
-       X_Net_XHR_VERSION  = 0,\r
-       X_Net_XHR_ACTIVE_X = !X_UA[ 'IE4' ] && X_UA[ 'IE' ] < 8 && X_UA[ 'ActiveX' ] && ( new Function( [\r
-               'var x=".XMLHTTP",',\r
-                       'm="MSXML2"+x,',\r
-                       'n=[m+".6.0",m+".3.0",m+".5.0",m+".4.0",m,"Microsoft"+x],',\r
-                       'v=[6,3,5,4,2,1],',\r
-                       'i=-1;',\r
-               'for(;i<5;){',\r
-                       'try{',\r
-                               'return[v[++i],new ActiveXObject(n[i])]',\r
-                       '}catch(e){}',\r
-               '}'\r
-       ].join( '' ) ) )(),\r
+       X_Net_XHR_createXDR   = window[ 'XDomainRequest' ] && function(){ return X_Net_XHR_xdr || ( X_Net_XHR_xdr = new XDomainRequest() ); },\r
+       X_Net_XHR_xdr         = X_Net_XHR_createXDR && X_Net_XHR_createXDR(),\r
+\r
+       X_Net_XHR_createMSXML = X_UA[ 'ActiveX' ] && ( X_UA[ 'IE5x' ] || X_UA[ 'IE6' ] || ( X_URL_IS_LOCAL && X_UA[ 'IE' ] ) ) &&\r
+               ( new Function( 'f', [\r
+                       'var x=".XMLHTTP",',\r
+                               'm="MSXML2"+x,',\r
+                               'n=[m+".6.0",m+".3.0",m+".5.0",m+".4.0",m,"Microsoft"+x],',\r
+                               'v=[6,3,5,4,2,1],',\r
+                               'a=ActiveXObject,',\r
+                               'i=-1;',\r
+                       'for(;i<5;){',\r
+                               'try{',\r
+                                       'return f?[v[++i],new a(n[i])]:new a(n[i])',\r
+                               '}catch(e){}',\r
+                       '}'\r
+               ].join( '' ) ) ),\r
+\r
+       X_Net_XHR_VERSION     = 0,      \r
+       X_Net_XHR_msXML       = X_Net_XHR_createMSXML && X_Net_XHR_createMSXML( true ),\r
+       \r
+       X_Net_XHR_unReuseAlways = /* !X_UA[ 'IECompat' ] && */ X_UA[ 'IE' ] < 9,\r
        \r
        X_Net_XHR_init;\r
 \r
-if( X_Net_XHR_ACTIVE_X ){\r
-       X_Net_XHR_VERSION  = X_Net_XHR_ACTIVE_X[ 0 ];\r
-       X_Net_XHR_ACTIVE_X = X_Net_XHR_ACTIVE_X[ 1 ];\r
+if( X_Net_XHR_msXML ){\r
+       X_Net_XHR_VERSION  = X_Net_XHR_msXML[ 0 ];\r
+       X_Net_XHR_msXML    = X_Net_XHR_msXML[ 1 ];\r
+} else {\r
+       X_Net_XHR_createMSXML = null;\r
 };\r
 \r
 X[ 'Net' ][ 'XHR' ] = {\r
@@ -72,15 +83,15 @@ X[ 'Net' ][ 'XHR' ] = {
  * https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\r
  * Progress Events     Chrome7, firefox3.5, ie10, opera12, Safari?, Chrome for Android 0.16\r
  */\r
-       'PROGRESS'    : X_Net_XHR_progress, //\r
+       'PROGRESS'    : X_Net_XHR_progress,\r
 \r
        'UL_PROGRESS' : X_Net_XHR_upload,\r
 \r
        // or gadget proxy\r
-       'CORS'        : X_Net_XHR_X_DOMAIN || ( X_Net_XHR_W3C && X_Net_XHR_W3C.withCredentials !== undefined )\r
+       'CORS'        : X_Net_XHR_xdr || ( X_Net_XHR_w3c && X_Net_XHR_w3c.withCredentials !== undefined )\r
 };\r
 \r
-if( X_Net_XHR_W3C || X_Net_XHR_ACTIVE_X ){\r
+if( X_Net_XHR_w3c || X_Net_XHR_msXML ){\r
 \r
 X_TEMP.X_Net_XHR_init = function(){\r
        \r
@@ -91,53 +102,77 @@ X_TEMP.X_Net_XHR_init = function(){
                {\r
                        \r
                        '_rawType'   : X_EventDispatcher_EVENT_TARGET_XHR,\r
-                       '_rawObject' : X_Net_XHR_W3C || X_Net_XHR_ACTIVE_X,\r
-                       \r
-                       _isXDR     : false, // for ie8\r
+                       // '_rawObject' : X_Net_XHR_w3c || X_Net_XHR_msXML,\r
                        \r
-                       _method    : '',\r
-                       _dataType   : '',\r
-                       _busy      : false,\r
-                       _canceled  : false,\r
-                       _error     : false,\r
-                       _percent   : 0,\r
-                       _timerID   : 0,\r
+                       _isXDR       : false,\r
+                       _isMsXML     : false,\r
                        \r
-                       _auth      : null,\r
+                       _method      : '',\r
+                       _dataType    : '',\r
+                       _busy        : false,\r
+                       _canceled    : false,\r
+                       _error       : false,\r
+                       _percent     : 0,\r
+                       _timerID     : 0,\r
                        \r
                        load : function( obj ){\r
                                var raw      = this[ '_rawObject' ],\r
                                        method   = obj[ 'method' ],\r
                                        url      = obj[ 'url' ],\r
-                                       async    = obj[ 'async' ],\r
+                                       async    = obj[ 'async' ] !== false,\r
                                        username = obj[ 'username' ],\r
                                        password = obj[ 'password' ],\r
                                        headers  = obj[ 'headers' ] || {},\r
                                        postdata = obj[ 'postdata' ] || '',\r
                                        timeout  = obj[ 'timeout' ] || 20000,\r
+                                       xDomain  = !X_URL_isSameDomain( url ),\r
+                                       isFile   = X_URL_isLocal( url ),\r
                                        tmp;\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' ] = raw = X_Net_XHR_W3C || X_Net_XHR_ACTIVE_X;\r
-                                                       X_EventDispatcher_toggleAllEvents( this, true );\r
-                                                       this._isXDR = false;\r
-                                               };\r
+                               if( !raw || xDomain !== this._isXDR || ( X_Net_XHR_createMSXML && isFile !== this._isMsXML ) ){\r
+                                       \r
+                                       this[ 'unlisten' ]( [ 'load', 'readystatechange', 'progress', 'error', 'timeout' ] );\r
+                                       \r
+                                       this[ '_rawObject' ] = raw = xDomain ?\r
+                                                                                                       X_Net_XHR_createXDR() :\r
+                                                                                                isFile ?\r
+                                                                                                       ( X_Net_XHR_createMSXML ?\r
+                                                                                                               ( X_Net_XHR_msXML = X_Net_XHR_msXML || X_Net_XHR_createMSXML() ):\r
+                                                                                                               X_Net_XHR_createW3C()\r
+                                                                                                        ) :\r
+                                                                                                X_Net_XHR_createW3C ?\r
+                                                                                                       X_Net_XHR_createW3C() :\r
+                                                                                                       ( X_Net_XHR_msXML = X_Net_XHR_msXML || X_Net_XHR_createMSXML() );\r
+\r
+                                       // raw === XDR これは error になるのでフラグに控える\r
+                                       this._isXDR   = X_Net_XHR_createXDR && xDomain;\r
+                                       this._isMsXML = !X_Net_XHR_createW3C || ( isFile && X_Net_XHR_createMSXML );\r
+\r
+                                       if( this._isMsXML ){\r
+                                               this[ 'listen' ]( 'readystatechange' ); // TODO ie7 ActiveX の場合、error は不可 toggleAllEvent のあたり\r
+                                       } else\r
+                                       if( X_UA[ 'IE8' ] ){\r
+                                               this[ 'listen' ]( [ 'readystatechange', 'error', 'timeout' ] );\r
+                                       } else\r
+                                       if( X_UA[ 'IE7' ] ){\r
+                                               this[ 'listen' ]( [ 'readystatechange', 'error' ] );\r
+                                       } else\r
+                                       if( X_Net_XHR_progress ){\r
+                                               this[ 'listen' ]( [ 'load', 'progress', 'error', 'timeout' ] ); //, 'abort'\r
                                        } else {\r
-                                               if( !this._isXDR ){\r
-                                                       X_EventDispatcher_toggleAllEvents( this, false );\r
-                                                       this[ '_rawObject' ] = raw = X_Net_XHR_X_DOMAIN;\r
-                                                       X_EventDispatcher_toggleAllEvents( this, true );\r
-                                                       this._isXDR = true;                                     \r
-                                               };\r
+                                               this[ 'listen' ]( [ 'load', 'readystatechange', 'error', 'timeout' ] ); //, 'abort'\r
+                                       };\r
+                               \r
+                                       X_EventDispatcher_toggleAllEvents( this, true );\r
+                               \r
+                                       if( X_Net_XHR_upload ){\r
+                                               raw.upload.addEventListener( 'progress', this.onUploadProgress );\r
                                        };\r
                                };\r
                                \r
-                               raw.open( method, url, true, username, password );\r
+                               raw.open( method, url, async, username, password );\r
                                \r
                                if( raw.responseType !== undefined ){\r
                                        switch( this._dataType ){\r
@@ -166,7 +201,7 @@ X_TEMP.X_Net_XHR_init = function(){
                                };\r
                                \r
                                // http://www.quirksmode.org/blog/archives/2005/09/xmlhttp_notes_r_1.html\r
-                               if( !X_Net_XHR_ACTIVE_X && X_Type_isFunction( raw.overrideMimeType ) ){\r
+                               if( !this._isMsXML && raw.overrideMimeType ){\r
                                        switch( X_URL_getEXT( url ) ){\r
                                                case 'html' :\r
                                                case 'xml' :\r
@@ -196,24 +231,30 @@ X_TEMP.X_Net_XHR_init = function(){
                                                        tmp = 'audio/webm';\r
                                                        break;\r
                                        };\r
-                                       if( obj[ 'mimeType' ] || tmp ) raw.overrideMimeType( obj[ 'mimeType' ] || tmp );\r
-                                       console.log( this._dataType );\r
-                                       console.log( obj[ 'mimeType' ] || tmp );\r
+                                       if( tmp = obj[ 'mimeType' ] || tmp ) raw.overrideMimeType( tmp );\r
                                };\r
 \r
-                               if( /* !X_Net_XHR_ACTIVE_X && !this._isXDR && */ X_Type_isFunction( raw.setRequestHeader ) ){\r
+                               if( !this._isMsXML && !this._isXDR && raw.setRequestHeader ){\r
                                        \r
                                        // http://nakigao.sitemix.jp/blog/?p=2040\r
                                        // json 取得時に SafariでHTTP/412のエラー。但し相手が audio の場合、この指定があるとロードに失敗する。 iOS8.2, iOS7.1 では遭遇せず\r
                                        if( this._dataType === 'json' ){\r
-                                               console.log( 'If-Modified-Since : ' + this._dataType );\r
                                                headers[ 'If-Modified-Since' ] = ( new Date ).toUTCString();\r
                                        };\r
                                        \r
+                                       // http://boscono.hatenablog.com/entry/2013/12/23/152851\r
+                                       if ( !xDomain && !headers[ 'X-Requested-With' ] ) {\r
+                                               headers[ 'X-Requested-With' ] = 'XMLHttpRequest';\r
+                                       };\r
+                                       \r
+                                       if( method === 'POST' ){\r
+                                               headers[ 'Content-Type' ] = 'application/x-www-form-urlencoded';\r
+                                       };\r
+                                       \r
                                        for( p in headers ){\r
                                                if( X_EMPTY_OBJECT[ p ] ) continue;\r
-                                               raw.setRequestHeader( p, headers[ p ] ); // Opera8.01+, MSXML3+\r
-                                       };              \r
+                                               headers[ p ] !== undefined && raw.setRequestHeader( p, headers[ p ] + '' ); // Opera8.01+, MSXML3+\r
+                                       };\r
                                };\r
                                \r
                                if( raw.timeout !== undefined ){\r
@@ -226,6 +267,10 @@ X_TEMP.X_Net_XHR_init = function(){
                                this._busy = true;\r
 \r
                                raw.send( X_Type_isString( postdata ) ? postdata : X_String_serialize( postdata ) );\r
+\r
+                               if( !async || raw.readyState === 4 ){ // raw.readyState へのアクセスで ie7 実機でerror\r
+                                       this[ 'asyncDispatch' ]( this[ 'listening' ]( 'load' ) ? 'load' : 'readystatechange' );\r
+                               };\r
                        },\r
                        \r
                        cancel : function(){\r
@@ -244,28 +289,40 @@ X_TEMP.X_Net_XHR_init = function(){
                                // Opera 10.10、Safari 4.1 では、同一オリジン制限に違反した XMLHttpRequest オブジェクトは再度 open() しても未送信状態に戻りません。\r
                                \r
                                // Timeout した Gecko の xhr.response に触るとエラー??\r
-                               if( X_UA[ 'Opera' ] || X_UA[ 'Webkit' ]  || X_UA[ 'Gecko' ] ){\r
-                                       if( this._error ){\r
-                                               \r
-                                               if( X_Net_XHR_upload ){\r
-                                                       this[ '_rawObject' ].upload.removeEventListener( 'progress', X_NET_XHRWrapper.onUploadProgress );\r
-                                               };\r
-                                                                                       \r
+                               if( this._error && ( X_UA[ 'Opera' ] || X_UA[ 'Webkit' ]  || X_UA[ 'Gecko' ] ) ){\r
+                                       if( X_Net_XHR_upload ){\r
+                                               X_Net_XHR_w3c.upload.removeEventListener( 'progress', this.onUploadProgress );\r
+                                       };\r
+                                                                               \r
+                                       X_EventDispatcher_toggleAllEvents( this, false );\r
+                                       this[ '_rawObject' ] = X_Net_XHR_w3c = null;\r
+                                       //X_EventDispatcher_toggleAllEvents( this, true );\r
+\r
+                               } else {\r
+                                       // XMLHttpRequest の使い方\r
+                                       // http://webos-goodies.jp/archives/50548720.html\r
+                                       // XMLHttpRequest オブジェクトを再利用する際も、 abort メソッドを呼び出す必要があるようです。\r
+                                       this[ '_rawObject' ].abort && this[ '_rawObject' ].abort();                                             \r
+                                       \r
+                                       if( X_Net_XHR_unReuseAlways ){\r
+                                               // ie7 は xhr object を再利用できない。但し send のあとに alert を挟むと動いた、、、\r
+                                               // ie7モード(IE11) では再利用可能、、、\r
                                                X_EventDispatcher_toggleAllEvents( this, false );\r
-                                               this[ '_rawObject' ] = new XMLHttpRequest();\r
-                                               X_EventDispatcher_toggleAllEvents( this, true );\r
+                                               this[ '_rawObject' ] = null;\r
                                                \r
-                                               if( X_Net_XHR_upload ){\r
-                                                       this[ '_rawObject' ].upload.addEventListener( 'progress', X_NET_XHRWrapper.onUploadProgress );\r
+                                               if( this._isXDR ){\r
+                                                       X_Net_XHR_xdr   = null;\r
+                                               } else\r
+                                               if( this._isMsXML ){\r
+                                                       X_Net_XHR_msXML = null;\r
+                                               } else {\r
+                                                       X_Net_XHR_w3c   = null;\r
                                                };\r
+                                               delete this._isXDR;\r
+                                               delete this._isMsXML;\r
                                        };\r
                                };\r
 \r
-                               // XMLHttpRequest の使い方\r
-                               // http://webos-goodies.jp/archives/50548720.html\r
-                               // XMLHttpRequest オブジェクトを再利用する際も、 abort メソッドを呼び出す必要があるようです。\r
-                               this[ '_rawObject' ].abort && this[ '_rawObject' ].abort();\r
-\r
                                this._method   = this._dataType = '';\r
                                this._canceled = this._busy = this._error = false;\r
                                this._timerID && X_Timer_remove( this._timerID );\r
@@ -332,7 +389,7 @@ X_TEMP.X_Net_XHR_init = function(){
                                                        ( status < 100 ) ||\r
                                            ( 200 <= status && status < 400 ) ||\r
                                            //status === 304 ||\r
-                                           status === 1223 ||\r
+                                           ( status === 1223 && ( status = 204 ) ) ||\r
                                            ( X_UA[ 'Webkit' ]  && status === undefined ) // safari: /webkit/.test(userAgent)\r
                                                ){\r
                                                        /*\r
@@ -400,7 +457,7 @@ X_TEMP.X_Net_XHR_init = function(){
                                var raw  = this[ '_rawObject' ],\r
                                        live = !X_NET_XHRWrapper._canceled || !this._busy;\r
 \r
-                               if( raw.readyState < 3 ){\r
+                               if( live || raw.readyState < 3 ){\r
                                        this._busy = false;\r
                                        live && this[ 'asyncDispatch' ]( X_EVENT_TIMEOUT );\r
                                };\r
@@ -411,34 +468,12 @@ X_TEMP.X_Net_XHR_init = function(){
                                var raw  = X_NET_XHRWrapper[ '_rawObject' ].upload,\r
                                        live = !X_NET_XHRWrapper._canceled,\r
                                        states, data;\r
+                               live && X_NET_XHRWrapper[ 'asyncDispatch' ]( { type : X_EVENT_PROGRESS, 'percent' : X_NET_XHRWrapper._percent, 'uploadPercent' : ( e.loaded / e.total ) } );\r
                        }\r
                },\r
                true\r
        );\r
        // 同期リクエストでなければならない場合, unload, beforeunload時\r
-\r
-       if( X_UA[ 'IE8' ] ){\r
-               X_NET_XHRWrapper[ 'listen' ]( [ 'readystatechange', 'error', 'timeout' ] ); //, 'abort'\r
-       } else\r
-       if( X_UA[ 'IE7' ] ){\r
-               if( X_URL_IS_LOCAL ){\r
-                       X_NET_XHRWrapper[ 'listen' ]( 'readystatechange' ); // ie7 ActiveX の場合、error は不可\r
-               } else {\r
-                       X_NET_XHRWrapper[ 'listen' ]( [ 'readystatechange', 'error' ] );\r
-               };\r
-       } else\r
-       if( X_Net_XHR_ACTIVE_X ){ // win ie5-6\r
-               X_NET_XHRWrapper[ 'listen' ]( 'readystatechange' );\r
-       } else \r
-       if( X_Net_XHR_progress ){\r
-               X_NET_XHRWrapper[ 'listen' ]( [ 'load', 'progress', 'error', 'timeout' ] ); //, 'abort'\r
-       } else {\r
-               X_NET_XHRWrapper[ 'listen' ]( [ 'load', 'readystatechange', 'error', 'timeout' ] ); //, 'abort'\r
-       };\r
-       \r
-       if( X_Net_XHR_upload ){\r
-               X_NET_XHRWrapper[ '_rawObject' ].upload.addEventListener( 'progress', X_NET_XHRWrapper.onUploadProgress );\r
-       };\r
        \r
        return X_NET_XHRWrapper;\r
 };\r