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
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
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
\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
\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
// 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
'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
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
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
\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
// 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
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 );
\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
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
};\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
_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
\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
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
}\r
}\r
);\r
+\r
+return X_NET_GIMRWrapper;\r
+\r
+};\r
+\r
obj.onAuthError = X_NET_OAUTH2_onXHR401Error;
obj.updateRequest = X_NET_OAUTH2_updateRequest;
+
+ // TODO kill の cancel
},
'authState' : function(){
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' ]
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;