OSDN Git Service

Version 0.6.150, fix X.Net.
authoritozyun <itozyun@user.sourceforge.jp>
Tue, 19 May 2015 21:45:41 +0000 (06:45 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Tue, 19 May 2015 21:45:41 +0000 (06:45 +0900)
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
0.6.x/js/06_net/02_XNetJSONP.js
0.6.x/js/06_net/05_XXHRGadget.js
0.6.x/js/06_net/10_XOAuth2.js

index c2dd44f..b77d19f 100644 (file)
@@ -174,3 +174,10 @@ function X_String_serialize_buildParams( list, prefix, obj, traditional ) {
                X_String_serialize_addParam( list, prefix, obj );\r
        };\r
 };\r
+\r
+/*\r
+ * 信頼できる文字列だけに対して json 文字列のパースを行います\r
+ */\r
+function X_String_parseTrustedJsonString( jsonString ){\r
+       return window.JSON ? JSON.parse( jsonString ) : eval( '(' + jsonString + ')' );\r
+};\r
index a97d45e..7d6393c 100644 (file)
@@ -135,18 +135,20 @@ X[ 'Net' ] = X_EventDispatcher[ 'inherits' ](
                                        return;\r
                                };\r
                                \r
+                               opt = X_Object_deepCopy( opt );\r
+                               opt.netType   = type;\r
+                               opt[ 'url'  ] = url;                            \r
+                               \r
                                if( type === X_NET_TYPE_XHR ){\r
                                        opt[ 'method' ] = opt[ 'method' ] || ( opt[ 'postdata' ] ? 'POST' : 'GET' );\r
                                        \r
                                        // XDomain 不可 -> Flash, Gears, Silverlight, canUseGadget なら gadget に切替?\r
                                        // PUT DELETE UPDATE 不可 -> Flash, Gears, Silverlight, canUseGadget なら gadget に切替?\r
+                                       // xプロトコル な binary のロード -> gadget 内で proxyURL による XHR\r
                                        //  or X_EVENT_ERROR\r
                                        \r
-                               };                              \r
-                               \r
-                               opt = X_Object_deepCopy( opt );\r
-                               opt.netType   = type;\r
-                               opt[ 'url'  ] = url;\r
+                                       opt[ 'dataType' ] = opt[ 'dataType' ] || X_URL_getEXT( url );\r
+                               };\r
                                \r
                                X_Pair_create( this, opt );\r
                                \r
@@ -216,7 +218,7 @@ function X_NET_proxyDispatch( e ){
                        if( flag ){ // flag が立つ場合、これは中断\r
                                this[ 'dispatch' ]( X_EVENT_CANCELED );\r
                                this[ 'dispatch' ]( { type : X_EVENT_COMPLETE, 'lastEventType' : X_EVENT_CANCELED } );\r
-                               X_Pair_release( this );                         \r
+                               X_Pair_release( this );\r
                        };\r
                        break;                  \r
                case X_EVENT_PROGRESS :\r
@@ -225,8 +227,7 @@ function X_NET_proxyDispatch( e ){
                \r
                case X_EVENT_ERROR :\r
                        if( e.status === 401 ){\r
-                               auth = X_Pair_get( this )[ 'auth' ];\r
-                               if( auth ){\r
+                               if( auth = X_Pair_get( this )[ 'auth' ] ){\r
                                        X_Pair_get( auth ).onAuthError( auth );\r
                                };\r
                        };\r
@@ -270,7 +271,16 @@ function X_NET_shiftQueue(){
                        \r
                        // TODO (xProtocol | method) & canUse -> gadget.io.makeRequset, flash\r
                        // force 'gadget', 'flash'\r
-                       X_NET_currentWrapper = X_NET_XHRWrapper || X_TEMP.X_Net_XHR_init();\r
+                       switch( X_NET_currentData[ 'test' ] ){\r
+                               case 'gadget' :\r
+                                       X_NET_currentWrapper = X_NET_GIMRWrapper || X_TEMP.X_Net_GIMR_init();\r
+                                       break;\r
+                               case 'flash'  :\r
+                                       break;\r
+                               default :\r
+                                       X_NET_currentWrapper = X_NET_XHRWrapper || X_TEMP.X_Net_XHR_init();\r
+                       };\r
+                       \r
                        \r
                        // OAuth2\r
                        if( auth = X_NET_currentData[ 'auth' ] ){\r
index 843b5dc..8d16cfa 100644 (file)
@@ -45,6 +45,7 @@ var // Opera7.6+, Safari1.2+, khtml3.?+, Gecko0.9.7+
        // 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_cors        = X_Net_XHR_w3c && X_Net_XHR_w3c.withCredentials !== undefined,\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
@@ -106,7 +107,7 @@ X[ 'XHR' ] = {
        'UPLOAD_PROGRESS' : X_Net_XHR_upload,\r
 \r
        // or gadget proxy or flash\r
-       'CORS'            : X_Net_XHR_xdr || ( X_Net_XHR_w3c && X_Net_XHR_w3c.withCredentials !== undefined )\r
+       'CORS'            : X_Net_XHR_xdr || X_Net_XHR_cors\r
 };\r
 \r
 if( X_Net_XHR_msXMLVer ) X[ 'XHR' ][ 'MSXML_VERSION' ] = X_Net_XHR_msXMLVer;\r
@@ -151,13 +152,16 @@ X_TEMP.X_Net_XHR_init = function(){
                                        init,\r
                                        tmp;\r
 \r
-                               this._dataType = obj[ 'dataType' ] || X_URL_getEXT( url );\r
+                               this._dataType = obj[ 'dataType' ];\r
                                \r
                                if( !raw || xDomain !== this._isXDR || ( X_Net_XHR_createMSXML && isFile !== this._isMsXML ) ){\r
                                        raw && this[ 'unlisten' ]( [ 'load', 'readystatechange', 'progress', 'error', 'timeout' ] );\r
                                        init = true;\r
                                        this[ '_rawObject' ] = raw = xDomain ?\r
-                                                                                                       X_Net_XHR_createXDR() :\r
+                                                                                                       ( X_Net_XHR_cors ?\r
+                                                                                                               X_Net_XHR_createW3C() :\r
+                                                                                                               X_Net_XHR_createXDR()\r
+                                                                                                       ) :\r
                                                                                                 isFile ?\r
                                                                                                        ( X_Net_XHR_createMSXML ?\r
                                                                                                                ( X_Net_XHR_msXML = X_Net_XHR_msXML || X_Net_XHR_createMSXML() ):\r
@@ -182,7 +186,7 @@ X_TEMP.X_Net_XHR_init = function(){
                                                        raw.responseType = 'text';\r
                                                        break;\r
                                                case 'json' :\r
-                                               case 'moz-json' :\r
+                                               case 'moz-json' : // firefox9-\r
                                                        raw.responseType = X_UA[ 'Gecko' ] ? this._dataType : ''; // Iron 37 でエラー\r
                                                        break;\r
                                                case 'document' :\r
@@ -260,6 +264,7 @@ X_TEMP.X_Net_XHR_init = function(){
                                        \r
                                        for( p in headers ){\r
                                                if( X_EMPTY_OBJECT[ p ] ) continue;\r
+                                               console.log( headers[ p ] );\r
                                                headers[ p ] !== undefined && raw.setRequestHeader( p, headers[ p ] + '' ); // Opera8.01+, MSXML3+\r
                                        };\r
                                };\r
@@ -430,7 +435,7 @@ X_TEMP.X_Net_XHR_init = function(){
                                                                        // eval() を使っているけど JSON の無いブラウザは XDomain な XHR はできないのでよしとする。\r
                                                                        // XDomain な XHR の際は Flash 等で代替し、その中に Json parser も組み込む。\r
                                                                        // http://d.hatena.ne.jp/sshi/20060904/p1\r
-                                                                       if( !X_Type_isObject( data ) ) data = window.JSON ? JSON.parse( data ) : eval( '(' + data + ')' );\r
+                                                                       if( !X_Type_isObject( data ) ) data = X_String_parseTrustedJsonString( data );\r
                                                                        break;\r
                                                                case 'document' :\r
                                                                case 'xml' :\r
index 618cb6c..43732b4 100644 (file)
@@ -32,7 +32,7 @@ X[ 'Net' ][ 'JSONP' ] = {
                        X_NET_JSONPWrapper
                                [ 'asyncDispatch' ]( {
                                        type : jsonString ? X_EVENT_SUCCESS : X_EVENT_ERROR,
-                                       data : window.JSON ? JSON.parse( jsonString ) : eval( '(' + jsonString + ')' )
+                                       data : X_String_parseTrustedJsonString( jsonString )
                                } );
                        
                        X_Net_JSONP_errorTimerID && X_Timer_remove( X_Net_JSONP_errorTimerID );
index 61cb641..0a04809 100644 (file)
@@ -44,7 +44,7 @@ var X_NET_GIMR_canUse         = 5.5 <= X_UA[ 'IE' ] || !X_UA[ 'IE' ],
 \r
 function X_NET_GIMR_detectImageOverIframe(){\r
        var raw = X_NET_GIMR_gadgetIframe[ '_rawObject' ],\r
-               iwin, ret;\r
+               iwin, ret, error, data = null;\r
        \r
        if( raw ){\r
                iwin = raw.contentWindow || ( raw.contentDocument && raw.contentDocument.parentWindow ) || window.frames[ X_NET_GIMR_iframeName ];\r
@@ -66,16 +66,28 @@ function X_NET_GIMR_detectImageOverIframe(){
                                                break;\r
 \r
                                        case 2 : // _waiting_ 通信結果待ち\r
-                                               ret = decodeURIComponent( ret.substr( 1 ) );\r
-                                               ret = window.JSON ? JSON.parse( ret ) : eval( '(' + ret + ')' );\r
+                                               ret = X_String_parseTrustedJsonString( decodeURIComponent( ret.substr( 1 ) ) );\r
+                                               \r
+                                               error = ret[ 'errors' ] && ret[ 'errors' ].length;\r
+                                               \r
+                                               switch( !error && X_NET_GIMR_requestOriginal[ 'dataType' ] ){\r
+                                                       case 'json' :\r
+                                                               data = X_String_parseTrustedJsonString( ret[ 'json' ] || ret[ 'text' ] || '' );\r
+                                                               break;\r
+                                               };\r
+                                               \r
+                                               console.dir( data || ret );\r
                                                \r
                                                X_NET_GIMRWrapper._busy = false;\r
                                                \r
                                                X_NET_GIMRWrapper\r
-                                                       [ 'asyncDispatch' ]( {\r
-                                                               type : ret[ 'errors' ] && ret[ 'errors' ].length ? X_EVENT_ERROR : X_EVENT_SUCCESS,\r
-                                                               data : ret\r
-                                                       } );\r
+                                                       [ 'asyncDispatch' ]({\r
+                                                               type      : error ? X_EVENT_ERROR : X_EVENT_SUCCESS,\r
+                                                               state     : ret[ 'rc' ] || ( error ? 400 : 200 ),\r
+                                                               data      : data,\r
+                                                               'headers' : ret[ 'headers' ],\r
+                                                               'message' : error && ret[ 'errors' ].join( '\n' )\r
+                                                       });\r
                                                iwin.location.href = X_NET_GIMR_GADGET_URL + '#_recived_';\r
                                                X_NET_GIMR_timerID = X_NET_GIMR_phase = 0;\r
                                                X_NET_GIMR_lastHashString = '';\r
@@ -102,6 +114,10 @@ function X_NET_GIMR_toJSONString( obj ){
 };\r
 \r
 \r
+X_TEMP.X_Net_GIMR_init = function(){\r
+       \r
+delete X_TEMP.X_Net_GIMR_init;\r
+\r
 // TODO extend NinjaIframe\r
 X_NET_GIMRWrapper = X_Class_override(\r
        X_EventDispatcher(),\r
@@ -112,7 +128,7 @@ X_NET_GIMRWrapper = X_Class_override(
                _onloadCount  : 0,\r
                \r
                load : function( obj ){\r
-                       var k;\r
+                       var k, v;\r
                        //createURL\r
                        if( !X_NET_GIMR_gadgetIframe ){\r
                                X_NET_GIMR_gadgetIframe = X_Node_systemNode\r
@@ -131,12 +147,13 @@ X_NET_GIMRWrapper = X_Class_override(
                        \r
                        X_NET_GIMR_timerID = X.Timer.add( 100, 0, X_NET_GIMR_detectImageOverIframe );\r
                        \r
-                       X_NET_GIMR_requestOriginal = X_Object_deepCopy( v );\r
+                       X_NET_GIMR_requestOriginal = X_Object_deepCopy( obj );\r
                        \r
                        X_NET_GIMR_requestOptions = {\r
                                'CONTENT_TYPE'     : 'TEXT',\r
                                'GET_FULL_HEADERS' : true,\r
-                               'REFRESH_INTERVAL' : 0\r
+                               'REFRESH_INTERVAL' : 0,\r
+                               'url'              : obj[ 'url' ]\r
                        };\r
                        \r
                        for( k in obj ){\r
@@ -149,10 +166,23 @@ X_NET_GIMRWrapper = X_Class_override(
                                                        X_NET_GIMR_requestOptions[ 'METHOD' ] = v;\r
                                                        break;                                  \r
                                                case 'dataType' :\r
-                                                       X_NET_GIMR_requestOptions[ 'CONTENT_TYPE' ] = v;\r
+                                                       // TEXT 以外は無視される?\r
+                                                       switch( v = ( '' + v ).toUpperCase() ){\r
+                                                               case 'TEXT' :\r
+                                                               case 'JSON' :\r
+                                                                       X_NET_GIMR_requestOptions[ 'CONTENT_TYPE' ] = v;\r
+                                                                       break;\r
+                                                               case 'DOM'  :\r
+                                                               case 'HTML' :\r
+                                                               case 'HTM'  :\r
+                                                               case 'XML'  :\r
+                                                                       X_NET_GIMR_requestOptions[ 'CONTENT_TYPE' ] = 'DOM';\r
+                                                                       break;\r
+                                                               //case 'FEED' :\r
+                                                       };              \r
                                                        break;\r
                                                case 'headers' :\r
-                                                       X_NET_GIMR_requestOptions[ 'HEADERS' ] = X_Object_clone( v );\r
+                                                       X_NET_GIMR_requestOptions[ 'HEADERS' ] = X_NET_GIMR_requestOriginal[ v ];\r
                                                        break;\r
                                                case 'cashe' :\r
                                                        X_NET_GIMR_requestOptions[ 'REFRESH_INTERVAL' ] = 3600;\r
@@ -174,3 +204,8 @@ X_NET_GIMRWrapper = X_Class_override(
                }\r
        }\r
 );\r
+\r
+return X_NET_GIMRWrapper;\r
+\r
+};\r
+\r
index f11bb13..e43d508 100644 (file)
@@ -40,6 +40,8 @@ X[ 'OAuth2' ] = X_EventDispatcher[ 'inherits' ](
                                
                                obj.onAuthError   = X_NET_OAUTH2_onXHR401Error;
                                obj.updateRequest = X_NET_OAUTH2_updateRequest;
+                               
+                               // TODO kill の cancel
                        },
 
                        'authState' : function(){
@@ -58,10 +60,10 @@ X[ 'OAuth2' ] = X_EventDispatcher[ 'inherits' ](
                                X_NET_OAUTH2_authorizationWindow = window.open(
                                        pair[ 'authorizeEndpoint' ] + '?' + X_URL_objToParam(
                                                {
-                                                       response_type : 'code',
-                                                       client_id     : pair[ 'clientID' ],
-                                                       redirect_uri  : tpair[ 'redirectURI' ],
-                                                       scope         : ( pair[ 'scopes' ] || []).join(' ')
+                                                       'response_type' : 'code',
+                                                       'client_id'     : pair[ 'clientID' ],
+                                                       'redirect_uri'  : tpair[ 'redirectURI' ],
+                                                       'scope'         : ( pair[ 'scopes' ] || []).join(' ')
                                                }
                                        ), 'oauthauthorize',
                                        'width=' + pair[ 'authorizeWindowWidth' ]
@@ -250,7 +252,7 @@ function X_NET_OAUTH2_onXHR401Error( oauth2 ){
        if ((( bearerParams && bearerParams.indexOf( ' error="invalid_token"' ) !== -1 ) || !headersExposed) && _getRefreshToken( oauth2 ) ) {
                _removeAccessToken( oauth2 ); // It doesn't work any more.
                pair.oauth2State = 2;
-               oauth2.refreshToken();
+               oauth2[ 'refreshToken' ]();
        } else
        if (!headersExposed && !_getRefreshToken( oauth2 )) {
                pair.oauth2State = 0;