'netVersion' : 0,\r
\r
'Constructor' : function( urlOrObject, opt_options ){\r
- var v, opt, url, type;\r
+ var v, opt, url, type, auth;\r
\r
if( X_Type_isObject( opt = urlOrObject ) ){\r
if( v = opt[ 'xhr' ] ){\r
return;\r
};\r
\r
+ if( auth = opt[ 'auth' ] ){\r
+ delete opt[ 'auth' ];\r
+ };\r
opt = X_Object_deepCopy( opt );\r
+ if( auth ){\r
+ opt[ 'auth' ] = auth; // auth は deep copy されるとまずい\r
+ };\r
opt.netType = type;\r
opt[ 'url' ] = url; \r
\r
switch( X_NET_currentData.netType ){\r
case X_NET_TYPE_XHR :\r
\r
- // TODO (xProtocol | method) & canUse -> gadget.io.makeRequset, flash\r
+ // TODO (xProtocol | method='update' | !cors) & canUse -> gadget.io.makeRequset, flash\r
// force 'gadget', 'flash'\r
switch( X_NET_currentData[ 'test' ] ){\r
case 'gadget' :\r
break;\r
case 'flash' :\r
break;\r
+ \r
default :\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
+ switch( auth[ 'state' ]() ){\r
case 0 :\r
case 1 :\r
+ case 2 :\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
+ case 3 : // refresh token\r
X_NET_QUEUE_LIST.push( X_NET_currentQueue );\r
X_NET_currentQueue = null;\r
X_NET_shiftQueue();\r
case X_NET_TYPE_IMAGE :\r
X_NET_currentWrapper = X_NET_ImageWrapper || X_TEMP.X_NET_Image_init();\r
break;\r
- case 5 :\r
- X_NET_currentWrapper = X_NET_GIMRWrapper;\r
- break;\r
};\r
\r
X_NET_currentWrapper[ 'listen' ]( [ X_EVENT_PROGRESS, X_EVENT_SUCCESS, X_EVENT_ERROR, X_EVENT_TIMEOUT ], X_NET_currentQueue, X_NET_proxyDispatch );\r
\r
X_NET_GIMR_phase = 0,\r
\r
- X_NET_GIMR_lastHashString;\r
+ X_NET_GIMR_lastHashString,\r
+ \r
+ X_NET_GIMR_isReceiveBatches, X_NET_GIMR_receivedString;\r
\r
\r
function X_NET_GIMR_detectImageOverIframe(){\r
var raw = X_NET_GIMR_gadgetIframe[ '_rawObject' ],\r
- iwin, ret, error, data = null;\r
+ iwin, ret, n, error, data = null;\r
\r
if( raw ){\r
iwin = raw.contentWindow || ( raw.contentDocument && raw.contentDocument.parentWindow ) || window.frames[ X_NET_GIMR_iframeName ];\r
ret = X_NET_GIMR_detection( iwin.frames );\r
if( ret && ret !== X_NET_GIMR_lastHashString ){\r
X_NET_GIMR_lastHashString = ret;\r
- console.log( ret );\r
+ //console.log( ret.length );\r
+ //console.log( '' + ret );\r
\r
switch( X_NET_GIMR_phase ){\r
case 0 : // init\r
break;\r
\r
case 2 : // _waiting_ 通信結果待ち\r
- ret = X_String_parseTrustedJsonString( decodeURIComponent( ret.substr( 1 ) ) );\r
+ // 分割受信モードか?\r
+ ret = ret.substr( 1 );\r
+ n = parseInt( ret );\r
+ \r
+ if( X_NET_GIMR_isReceiveBatches ){\r
+ X_NET_GIMR_receivedString += ret;\r
+ if( --X_NET_GIMR_isReceiveBatches ){\r
+ iwin.location.href = X_NET_GIMR_GADGET_URL + '#_recived_' + X_NET_GIMR_isReceiveBatches;\r
+ return;\r
+ };\r
+ } else\r
+ if( 1 < n ){\r
+ X_NET_GIMR_receivedString = ret.substr( ( n + ':' ).length );\r
+ X_NET_GIMR_isReceiveBatches = --n;\r
+ iwin.location.href = X_NET_GIMR_GADGET_URL + '#_recived_' + X_NET_GIMR_isReceiveBatches;\r
+ // TODO speedup\r
+ X_NET_GIMR_timerID = X_Timer_add( 16, 0, X_NET_GIMR_detectImageOverIframe );\r
+ return X_Callback_UN_LISTEN;\r
+ } else {\r
+ X_NET_GIMR_receivedString = ret;\r
+ };\r
+\r
+ var zero = String.fromCharCode( 0 );\r
+ console.log( _builtin_decodeURI( X_NET_GIMR_receivedString ).split( zero + '002' ).join( '--' ).split( zero + 'E0F' ).join( '--' ) );\r
+ ret = X_String_parseTrustedJsonString( _builtin_decodeURI( X_NET_GIMR_receivedString ).split( zero + '002' ).join( '。' ).split( zero + 'F0E' ).join( '.' ) );\r
+ \r
+ X_NET_GIMR_receivedString = '';\r
\r
error = ret[ 'errors' ] && ret[ 'errors' ].length;\r
\r
X_NET_GIMRWrapper\r
[ 'asyncDispatch' ]({\r
type : error ? X_EVENT_ERROR : X_EVENT_SUCCESS,\r
- state : ret[ 'rc' ] || ( error ? 400 : 200 ),\r
+ state : ret[ 'rc' ] || ( error ? ret[ 'code' ] || 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
+ \r
X_NET_GIMR_timerID = X_NET_GIMR_phase = 0;\r
- X_NET_GIMR_lastHashString = '';\r
+ X_NET_GIMR_lastHashString = ''; \r
+ iwin.location.href = X_NET_GIMR_GADGET_URL + '#_recived_';\r
\r
return X_Callback_UN_LISTEN;\r
};\r
} );\r
};\r
\r
- X_NET_GIMR_timerID = X.Timer.add( 100, 0, X_NET_GIMR_detectImageOverIframe );\r
+ X_NET_GIMR_timerID = X_Timer_add( 333, 0, X_NET_GIMR_detectImageOverIframe );\r
\r
X_NET_GIMR_requestOriginal = X_Object_deepCopy( obj );\r
+ \r
+ console.dir( obj );\r
\r
X_NET_GIMR_requestOptions = {\r
'CONTENT_TYPE' : 'TEXT',\r
};\r
\r
for( k in obj ){\r
- if( v = obj[ k ] ){\r
+ if( v = '' + obj[ k ] ){\r
switch( k ){\r
case 'postdata' :\r
X_NET_GIMR_requestOptions[ 'POST_DATA' ] = v;\r
break; \r
case 'dataType' :\r
// TEXT 以外は無視される?\r
- switch( v = ( '' + v ).toUpperCase() ){\r
+ switch( v = v.toUpperCase() ){\r
case 'TEXT' :\r
case 'JSON' :\r
X_NET_GIMR_requestOptions[ 'CONTENT_TYPE' ] = v;\r
}; \r
break;\r
case 'headers' :\r
- X_NET_GIMR_requestOptions[ 'HEADERS' ] = X_NET_GIMR_requestOriginal[ v ];\r
+ X_NET_GIMR_requestOptions[ 'HEADERS' ] = X_NET_GIMR_requestOriginal[ k ];\r
break;\r
case 'cashe' :\r
X_NET_GIMR_requestOptions[ 'REFRESH_INTERVAL' ] = 3600;\r
* <dl>
* <dt>0 : <dd>disconnected
* <dt>1 : <dd>now authentication ...
- * <dt>+ : <dd>authorization_code
- * <dt>2 : <dd>refresh_token
- * <dt>3 : <dd>hasAccessToken
+ * <dt>2 : <dd>authorization_code
+ * <dt>3 : <dd>refresh_token
+ * <dt>4 : <dd>hasAccessToken
* </dl>
*/
X[ 'OAuth2' ] = X_EventDispatcher[ 'inherits' ](
/** @lends OAuth2.prototype */
{
'Constructor' : function( obj ){
+ obj = X_Object_clone( obj );
- X_Pair_create( this, obj = X_Object_clone( obj ) );
+ X_Pair_create( this, obj );
if( _getAccessToken( this ) ){
- obj.oauth2State = 3;
+ obj.oauth2State = 4;
+ this[ 'asyncDispatch' ]( X_EVENT_SUCCESS );
} else {
this[ 'asyncDispatch' ]( X_EVENT_NEED_AUTH );
}
// TODO kill の cancel
},
- 'authState' : function(){
+ 'state' : function(){
return X_Pair_get( this ).oauth2State || 0;
},
{
'response_type' : 'code',
'client_id' : pair[ 'clientID' ],
- 'redirect_uri' : tpair[ 'redirectURI' ],
+ 'redirect_uri' : pair[ 'redirectURI' ],
'scope' : ( pair[ 'scopes' ] || []).join(' ')
}
), 'oauthauthorize',
},
'cancelAuth' : function(){
- pair = X_Pair_get( this );
+ var pair = X_Pair_get( this );
if( pair.net ){
pair.net[ 'kill' ]();
delete pair.net;
};
- X_NET_OAUTH2_authorizationWindow && X_NET_OAUTH2_authorizationWindow.close();
+ // http://kojikoji75.hatenablog.com/entry/2013/12/15/223839
+ X_NET_OAUTH2_authorizationWindow && X_NET_OAUTH2_authorizationWindow.open( 'about:blank','_self' ).close();
X_NET_OAUTH2_authorizationWindow = null;
X_NET_OAUTH2_authorizationTimerID && X_Timer_remove( X_NET_OAUTH2_authorizationTimerID );
},
'refreshToken' : function(){
- /*
+ /* TODO 自動リフレッシュ
* var expires_at = this._getAccessTokenExpiry();
if (expires_at && Date.now() + millis > expires_at)
this._refreshAccessToken({replay: false});
if( pair.net ) return;
- pair.oauth2State = 2;
+ pair.oauth2State = 3;
pair.net = X.Net( {
'xhr' : pair[ 'tokenEndpoint' ],
'refresh_token' : _getRefreshToken( this )
}),
'dataType' : 'json',
- 'headers' : {
- 'Accept' : 'application/json',
- 'Content-Type' : 'application/x-www-form-urlencoded'
- }
+ 'headers' : {
+ 'Accept' : 'application/json',
+ 'Content-Type' : 'application/x-www-form-urlencoded'
+ },
+ 'test' : 'gadget'
} ).listenOnce( [ X_EVENT_SUCCESS, X_EVENT_ERROR ], this, X_Net_OAuth2_responceHandler );
this[ 'asyncDispatch' ]( { type : X_EVENT_PROGRESS, message : 'Start to refresh token.' } );
);
function X_Net_OAuth2_detectAuthPopup(){
- var closed, search, pair;
+ var closed, search, pair = X_Pair_get( this );
- if( window.frames[ 'oauthauthorize' ] !== X_NET_OAUTH2_authorizationWindow || X_NET_OAUTH2_authorizationWindow.closed ){
+ if( X_NET_OAUTH2_authorizationWindow.closed ){
pair.oauth2State = 0;
closed = true;
+
this[ 'asyncDispatch' ]( X_EVENT_CANCELED );
} else
if( search = X_NET_OAUTH2_detection( X_NET_OAUTH2_authorizationWindow ) ){
X_Net_OAuth2_authorizationCode( this, pair );
+ pair.oauth2State = 2;
this[ 'asyncDispatch' ]( { type : X_EVENT_PROGRESS, message : 'Get code success, then authorization code.' } );
};
'redirect_uri' : pair[ 'redirectURI' ]
}),
'dataType' : 'json',
- 'headers' : {
+ 'headers' : {
'Accept' : 'application/json',
'Content-Type' : 'application/x-www-form-urlencoded'
- }
+ },
+ 'test' : 'gadget'
} ).listenOnce( [ X_EVENT_SUCCESS, X_EVENT_ERROR ], oauth2, X_Net_OAuth2_responceHandler );
};
function X_Net_OAuth2_responceHandler( e ){
var data = e.data,
pair = X_Pair_get( this ),
- isRefresh = pair.oauth2State === 2;
+ isRefresh = pair.oauth2State === 3;
delete pair.net;
_removeAccessTokenExpiry( this );
};
- pair.oauth2State = 3;
+ pair.oauth2State = 4;
this[ 'asyncDispatch' ]( { type : X_EVENT_SUCCESS, message : isRefresh ? 'Refresh access token success.' : 'Get new access token success.' } );
break;
this[ 'asyncDispatch' ]( { type : X_EVENT_ERROR, message : 'network-error' } );
} else {
pair.oauth2State = 0;
- _setAuthMechanism( 'param' );
+ _setAuthMechanism( this, 'param' );
this[ 'asyncDispatch' ]( { type : X_EVENT_PROGRESS, message : 'Refresh access token failed. retry header -> param. ' } );
// retry
X_Net_OAuth2_authorizationCode( this, pair );
if( _getAuthMechanism( oauth2 ) !== 'param' ){
xhr = X_NET_currentWrapper[ '_rawObject' ];
bearerParams = xhr.getResponseHeader( 'WWW-Authenticate' );
- headersExposed = !X_Net_XHR_X_DOMAIN || !!xhr.getAllResponseHeaders(); // this is a hack for Firefox and IE
+ headersExposed = !X_Net_XHR_createXDR || !!xhr.getAllResponseHeaders(); // this is a hack for Firefox and IE
};
// http://d.hatena.ne.jp/ritou/20110402/1301679908
} else
if ((( bearerParams && bearerParams.indexOf( ' error="invalid_token"' ) !== -1 ) || !headersExposed) && _getRefreshToken( oauth2 ) ) {
_removeAccessToken( oauth2 ); // It doesn't work any more.
- pair.oauth2State = 2;
+ pair.oauth2State = 3;
oauth2[ 'refreshToken' ]();
} else
if (!headersExposed && !_getRefreshToken( oauth2 )) {
url = request[ 'url' ],
headers;
- if( token && mechanism === 'param'){
+ if( token && mechanism === 'param' ){
request[ 'url' ] = url + ((url.indexOf('?') !== -1) ? '&' : '?') + 'bearer_token=' + encodeURIComponent( token );
};
if( token && ( !mechanism || mechanism === 'header' ) ){
- request[ 'headers' ] || ( headers = request[ 'headers' ] = {} );
+ headers = request[ 'headers' ] || ( request[ 'headers' ] = {} );
headers[ 'Authorization' ] = 'Bearer ' + token;
};
};
function _getRefreshToken( that){ return updateLocalStorage( '', that, 'refreshToken' ); }
function _getAccessTokenExpiry( that ){ return updateLocalStorage( '', that, 'tokenExpiry' ); }
function _getAuthMechanism( that ){
+ // TODO use gadget | flash ...
// IE's XDomainRequest doesn't support sending headers, so don't try.
- return X_Net_XHR_X_DOMAIN ? 'param' : updateLocalStorage( '', that, 'AuthMechanism' );
+ return X_Net_XHR_createXDR ? 'param' : updateLocalStorage( '', that, 'AuthMechanism' );
}
function _setAccessToken( that, value ){ updateLocalStorage( '+', that, 'accessToken' , value); }
function _setRefreshToken( that, value ){ updateLocalStorage( '+', that, 'refreshToken', value); }
function _removeAuthMechanism( that ){ updateLocalStorage( '-', that, 'AuthMechanism' ); }
function updateLocalStorage( cmd, that, name, value ){
- var action = cmd === '+' ? 'setItem' : '-' ? 'removeItem' : 'getItem',
+ var action = cmd === '+' ? 'setItem' : cmd === '-' ? 'removeItem' : 'getItem',
pair;
if( window.localStorage ){