-\r
-// ------------------------------------------------------------------------- //\r
-// ------------ local variables -------------------------------------------- //\r
-// ------------------------------------------------------------------------- //\r
-\r
var \r
X_Callback_LIVE_LIST = [],\r
\r
/** @const */\r
X_Callback_FUNC_ONLY = 3,\r
/** @const */\r
- X_Callback_THIS_FUNCNAME = 4,\r
-\r
- /** @const */\r
- X_Callback_NONE = 0,\r
- /** @const */\r
- X_Callback_UN_LISTEN = 1,\r
- /** @const */\r
- X_Callback_STOP_PROPAGATION = 2,\r
- /** @const */\r
- X_Callback_STOP_NOW = 4 | 2, // 同一階層のリスナーのキャンセル(上位へもキャンセル)\r
- /** @const */\r
- X_Callback_PREVENT_DEFAULT = 8, // 結果動作のキャンセル,\r
- /** @const */\r
- X_Callback_CAPTURE_POINTER = 16,\r
- /** @const */\r
- X_Callback_RELEASE_POINTER = 32,\r
- \r
- /** @const */\r
- X_Callback_SYS_CANCEL = 64 | 4 | 2;\r
-\r
-\r
-\r
-/*\r
- * handleEvent という関数のメンバーを持つオブジェクト\r
- * @typedef {{ handleEvent : function }}\r
- */\r
-var listener;\r
+ X_Callback_THIS_FUNCNAME = 4;\r
\r
/**\r
* <p>クロージャに関するポリシーと再利用可能クロージャについて次の記事をご覧ください。\r
* X_Callback_create() で再利用可能なクロージャの作成。次のパターンで呼び出します。<br>\r
* 最大で三つの引数を並べる一連のパターンは、 EventDispatcher.listen unlisten, listening や X.Timer.add, once でも使われますので、ここでよく目を通しておきます。\r
* \r
- * <table>\r
- * <tr><th>this コンテキスト+関数<td>X_Callback_create( thisObject, func )<td>func.call( thisObject );\r
- * <tr><th>this コンテキスト+関数+追加引数<td>X_Callback_create( thisObject, func, [ arg1, ...args ] )<td>func.apply( thisObject, [ arg1, ...args ] );\r
- * <tr><th>listener オブジェクト<td>X_Callback_create( listener )<td>listener.handleEvent(); コールバックに関数でなく handleEvent 関数をメンバに持つオブジェクトを渡すのは NN4 からある javascript のお約束です。\r
- * <tr><th>listener オブジェクト+追加引数<td>X_Callback_create( listener, [ arg1, ...args ] )<td>listener.handleEvent.apply( listener, [ arg1, ...args ] );\r
- * <tr><th>関数<td>X_Callback_create( func )<td>特別な操作は不要なので再利用可能クロージャは作られません。func をそのまま利用します。\r
- * <tr><th>関数+引数<td>X_Callback_create( func, [ arg1, ...args ] )<td>func.apply( ?, [ arg1, ...args ] );\r
- * </table>\r
- * \r
* <h5>再利用可能クロージャの破棄と再利用</h5>\r
* X_Callback_correct() によってクロージャは回収され再利用に備えます。<br>\r
* 実は、クロージャが束縛するのは、this コンテキストやコールバック関数といった、<strong>そのもの</strong>ではなく、それらを一定のルールで格納したハッシュです。<br>\r
name : undefined,\r
/**\r
* コールバックの this コンテキスト。 \r
- * @type {listener|object|undefined}\r
+ * @type {object|undefined}\r
*/\r
context : undefined,\r
/**\r
proxy : X_Callback_proxyCallback\r
};\r
\r
-/**\r
- * X.Timer と X.EventDispatcher からのコールバックの返り値を定義。\r
- * @namespace X.Callback\r
- */\r
-X[ 'Callback' ] = {\r
- /**\r
- * このコールバックでは返り値による操作は無い。\r
- * @alias X.Callback.NONE\r
- */\r
- 'NONE' : X_Callback_NONE,\r
- /**\r
- * X.Timer, X.EventDispatcher のコールバックでタイマーやイベントリスナの解除に使用。\r
- * @alias X.Callback.UN_LISTEN\r
- */\r
- 'UN_LISTEN' : X_Callback_UN_LISTEN,\r
- /**\r
- * 上位階層へのイベント伝播のキャンセル。DOM イベントのコールバックの戻り値に指定すると e.stopPropagation() が呼ばれる。\r
- * @alias X.Callback.STOP_PROPAGATION\r
- */\r
- 'STOP_PROPAGATION' : X_Callback_STOP_PROPAGATION,\r
- /**\r
- * 以降のイベントのディスパッチを中断する。STOP_PROPAGATION との違いは、次に控えているコールバックもキャンセルされる点。但し system によって追加されたイベントはキャンセルされない。\r
- * @alias X.Callback.STOP_NOW\r
- */\r
- 'STOP_NOW' : X_Callback_STOP_NOW,\r
- /**\r
- * DOM イベントのコールバックの戻り値に指定すると e.preventDefault() が呼ばれる。\r
- * またフレームワーク内で定義されたデフォルト動作の回避にも使用される。\r
- * @alias X.Callback.PREVENT_DEFAULT\r
- */\r
- 'PREVENT_DEFAULT' : X_Callback_PREVENT_DEFAULT,\r
- /**\r
- * X.UI の uinode でポインターイベントの戻り値に指定すると、以降のポインターベントを独占する。\r
- * @alias X.Callback.CAPTURE_POINTER\r
- */\r
- 'CAPTURE_POINTER' : X_Callback_CAPTURE_POINTER,\r
- /**\r
- * X.UI の uinode でポインターイベントの戻り値に指定すると、以降のポインターベントを独占を解除する。\r
- * @alias X.Callback.RELEASE_POINTER\r
- */\r
- 'RELEASE_POINTER' : X_Callback_RELEASE_POINTER\r
-};\r
-\r
// ------------------------------------------------------------------------- //\r
// --- implements ---------------------------------------------------------- //\r
// ------------------------------------------------------------------------- //\r
funcName = funcName || 'handleEvent';\r
temp = thisObj[ funcName ];\r
if( X_Type_isFunction( temp ) ){\r
- return args.length === 0 ? thisObj[ 'handleEvent' ]() :\r
- args.length === 1 ? thisObj[ 'handleEvent' ]( args[ 0 ] ) : temp.apply( thisObj, args );\r
+ return args.length === 0 ? thisObj[ funcName ]() :\r
+ args.length === 1 ? thisObj[ funcName ]( args[ 0 ] ) : temp.apply( thisObj, args );\r
};\r
break;\r
/*\r
};\r
function X_Callback_gc(){\r
X_Callback_POOL_LIST.length = 0; // ?\r
-};\r
-\r
-X_TEMP.onSystemReady.push( function( sys ){\r
- sys.monitor( X_Callback_monitor );\r
- sys.gc( X_Callback_gc );\r
-});\r
-\r
-\r
-console.log( 'X.Core.Callback' );\r
-\r
+};
\ No newline at end of file
--- /dev/null
+\r
+// ------------------------------------------------------------------------- //\r
+// ------------ local variables -------------------------------------------- //\r
+// ------------------------------------------------------------------------- //\r
+\r
+var /** @const */\r
+ X_Callback_NONE = 0,\r
+ /** @const */\r
+ X_Callback_UN_LISTEN = 1,\r
+ /** @const */\r
+ X_Callback_STOP_PROPAGATION = 2,\r
+ /** @const */\r
+ X_Callback_STOP_NOW = 4 | 2, // 同一階層のリスナーのキャンセル(上位へもキャンセル)\r
+ /** @const */\r
+ X_Callback_PREVENT_DEFAULT = 8, // 結果動作のキャンセル,\r
+ /** @const */\r
+ X_Callback_CAPTURE_POINTER = 16,\r
+ /** @const */\r
+ X_Callback_RELEASE_POINTER = 32,\r
+ \r
+ /** @const */\r
+ X_Callback_SYS_CANCEL = 64 | 4 | 2;\r
+\r
+/**\r
+ * X.Timer と X.EventDispatcher からのコールバックの返り値を定義。\r
+ * @namespace X.Callback\r
+ */\r
+X[ 'Callback' ] = {\r
+ /**\r
+ * このコールバックでは返り値による操作は無い。\r
+ * @alias X.Callback.NONE\r
+ */\r
+ 'NONE' : X_Callback_NONE,\r
+ /**\r
+ * X.Timer, X.EventDispatcher のコールバックでタイマーやイベントリスナの解除に使用。\r
+ * @alias X.Callback.UN_LISTEN\r
+ */\r
+ 'UN_LISTEN' : X_Callback_UN_LISTEN,\r
+ /**\r
+ * 上位階層へのイベント伝播のキャンセル。DOM イベントのコールバックの戻り値に指定すると e.stopPropagation() が呼ばれる。\r
+ * @alias X.Callback.STOP_PROPAGATION\r
+ */\r
+ 'STOP_PROPAGATION' : X_Callback_STOP_PROPAGATION,\r
+ /**\r
+ * 以降のイベントのディスパッチを中断する。STOP_PROPAGATION との違いは、次に控えているコールバックもキャンセルされる点。但し system によって追加されたイベントはキャンセルされない。\r
+ * @alias X.Callback.STOP_NOW\r
+ */\r
+ 'STOP_NOW' : X_Callback_STOP_NOW,\r
+ /**\r
+ * DOM イベントのコールバックの戻り値に指定すると e.preventDefault() が呼ばれる。\r
+ * またフレームワーク内で定義されたデフォルト動作の回避にも使用される。\r
+ * @alias X.Callback.PREVENT_DEFAULT\r
+ */\r
+ 'PREVENT_DEFAULT' : X_Callback_PREVENT_DEFAULT,\r
+ /**\r
+ * X.UI の uinode でポインターイベントの戻り値に指定すると、以降のポインターベントを独占する。\r
+ * @alias X.Callback.CAPTURE_POINTER\r
+ */\r
+ 'CAPTURE_POINTER' : X_Callback_CAPTURE_POINTER,\r
+ /**\r
+ * X.UI の uinode でポインターイベントの戻り値に指定すると、以降のポインターベントを独占を解除する。\r
+ * @alias X.Callback.RELEASE_POINTER\r
+ */\r
+ 'RELEASE_POINTER' : X_Callback_RELEASE_POINTER\r
+};\r
+\r
+X_TEMP.onSystemReady.push( function( sys ){\r
+ sys.monitor( X_Callback_monitor );\r
+ sys.gc( X_Callback_gc );\r
+});\r
+\r
+\r
+console.log( 'X.Core.Callback' );\r
+\r
X_Class_traits = null,\r
X_Class_useObjectCreate = false, // !!Object.create, http://jsperf.com/prototype-vs-object-create-perf\r
X_Class_use_proto_ = !X_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] && !!X_emptyFunction.prototype.__proto__,\r
- // Opera Mobile 12.10 Android11 IS01 でクラスのメンバが欠落する問題に遭遇。__proto__ を使わないと動作,,,\r
+ // Opera Mobile 12.10 Android11 IS01 でクラスのメンバが欠落する問題に遭遇。__proto__ を辞めると動作,,,\r
\r
X_Class_CommonMethods =\r
/** @lends __ClassBase__.prototype */\r
* \r
* @class __Listeners__\r
* @private\r
- * @abstract\r
*/\r
var X_Listeners_;\r
\r
X_LISTENERS_KILL_RESERVED = 4; // X.Event で、イベントIDを 5 から始めているので注意。\r
\r
\r
-\r
// ------------------------------------------------------------------------- //\r
// ------------ local variables -------------------------------------------- //\r
// ------------------------------------------------------------------------- //\r
// ------------------------------------------------------------------------- //\r
\r
/**\r
+ * <p>ぺったんR フレームワークの特徴であるイベントリスナの作法は次の記事で詳しく解説しています。\r
+ * <a href="http://outcloud.blogspot.jp/2015/06/eventdispatcher.html" target="_blank">ぺったんRフレームワークのコールバックのお作法</a>\r
+ * \r
* <ol>\r
* <li>as3 の EventDispatcher ライクなクラス。そのまま使ったり、継承したり。\r
* <li>_rawObject メンバがいる場合、addEventListener, attachEvent, on 等で生のブラウザオブジェクトにリスナを登録する。\r
* window, document, HTMLElement, Image, XHR, Silverlight などが _rawObject になる。\r
* <li>イベントディスパッチ中にリスナの追加が呼び出された場合、リスナはこれ以降のイベントから呼ばれます。同様にリスナの削除が呼ばれた場合、そのリスナが呼ばれることはありません。\r
* </ol>\r
- * \r
- * <blockquot>\r
- * <p><a href="https://developer.mozilla.org/ja/docs/Web/API/EventTarget.addEventListener" target="_blank">\r
- * MDN > 開発者向けのWeb技術 > Web API インターフェイス > EventTarget > EventTarget.addEventListener イベント発送中のリスナーの追加</a>\r
- * <p>EventListener がイベント処理中に EventTarget に追加された場合、それが現在のアクションによって実行されることはありませんが、浮上フェーズのように、後の段階のイベントフローで実行されるかもしれません。\r
- * </blockquot>\r
- * \r
- * <blockquot>\r
- * <p><a href="https://developer.mozilla.org/ja/docs/Web/API/EventTarget.removeEventListener" target="_blank">\r
- * MDN > 開発者向けのWeb技術 > Web API インターフェイス > EventTarget > EventTarget.removeEventListener 注記</a>\r
- * <p>イベントリスナーが イベントを処理中であるイベントターゲットから削除された場合、現在のアクションによってそのイベントリスナーが実行されることはありません。\r
- * <p>イベントリスナーは、決して削除された後に実行されることはありません。\r
- * <p>イベントターゲット上にある現在のどのイベントリスナーも指定していない引数付きの removeEventListener は、何の効果もありません。\r
- * </blockquot>\r
- *\r
* <p>listen, unlisten, dispatch という addEventListener, removeEventListener, dispatchEvent に対応する関数を持ちます。\r
* また listening という ActionScript3 の hasEventListener に相当する関数を持ちます。\r
* \r
* Arrayには、{kind:種類,context:コンテキスト(thisObject),func:コールバック関数,supplement:サプリメントする引数の配列} というハッシュ、または関数が蓄えられています。\r
* \r
* @private\r
- * @type {__X_EventDispatcher_Listeners__}\r
+ * @type {__Listeners__}\r
*/\r
'_listeners' : null,\r
\r
if( ( unlistens = listeners[ X_LISTENERS_UNLISTENS ] ) && ( unlistens = unlistens[ opt_type ] ) ){\r
for( i = unlistens.length; i; ){\r
f = unlistens[ --i ];\r
- if( f === cbHash || ( f.context === cbHash.context && f.func === cbHash.func && f.supplement === cbHash.supplement && f.lock === lock ) ) return false;\r
+ if( f === cbHash || ( f.context === cbHash.context && f.func === cbHash.func && f.name === cbHash.name && f.supplement === cbHash.supplement && f.lock === lock ) ) return false;\r
};\r
};\r
for( i = list.length; i; ){\r
f = list[ --i ];\r
- if( f === cbHash || ( f.context === cbHash.context && f.func === cbHash.func && f.supplement === cbHash.supplement && f.lock === lock ) ){\r
+ if( f === cbHash || ( f.context === cbHash.context && f.func === cbHash.func && f.name === cbHash.name && f.supplement === cbHash.supplement && f.lock === lock ) ){\r
// index を要求された場合、lock されていない、または unlock なら index を返す\r
return X_EventDispatcher_needsIndex ? i : true;\r
};\r
if( !listeners ) listeners = this[ '_listeners' ] = {};\r
list = listeners[ type ] || ( listeners[ type ] = [] );\r
\r
- add && X_EventDispatcher_addEvent( this, type, raw, list );\r
+ add && X_EventDispatcher_actualAddEvent( this, type, raw, list );\r
\r
f = X_Callback_classifyCallbackArgs( opt_arg1, opt_arg2, opt_arg3, this );\r
list[ list.length ] = f;\r
( listeners[ X_LISTENERS_UNLISTENS ][ opt_type ] = [ f ] );\r
} else {\r
delete f.once;\r
- list.splice( i, 1 );\r
- if( !list.length ){\r
- raw = this[ '_rawObject' ] || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this );\r
+ if( list.length !== 1 ){\r
+ list.splice( i, 1 );\r
+ } else {\r
+ list.length = 0;\r
+\r
delete listeners[ opt_type ];\r
- //empty = X_Object_isEmpty( listeners );\r
+\r
// TODO カウンター\r
empty = true;\r
for( k in listeners ){\r
empty = false;\r
break;\r
};\r
- if( raw && !X_String_isNumberString( '' + opt_type ) ){ // 数字イベントの除外\r
- X_EventDispatcher_removeEvent( this, opt_type, raw, list, !empty );\r
+\r
+ if( !X_String_isNumberString( '' + opt_type ) ){ // 数字イベントの除外\r
+ raw = this[ '_rawObject' ] || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this );\r
+ raw && X_EventDispatcher_actualRemoveEvent( this, opt_type, raw, list, !empty );\r
};\r
+ \r
if( empty ) delete this[ '_listeners' ];\r
};\r
};\r
};\r
};\r
\r
-function X_EventDispatcher_addEvent( that, type, raw, list ){\r
+function X_EventDispatcher_actualAddEvent( that, type, raw, list ){\r
var i, f;\r
X_EventDispatcher_lock || ( type = X_Event_Rename[ type ] || type );\r
\r
return this[ 'dispatch' ]( type );\r
};\r
\r
-function X_EventDispatcher_removeEvent( that, type, raw, list, skip ){\r
+function X_EventDispatcher_actualRemoveEvent( that, type, raw, list, skip ){\r
var i;\r
X_EventDispatcher_unlock || ( type = X_Event_Rename[ type ] || type );\r
\r
function X_EventDispatcher_toggleAllEvents( that, add ){\r
var list = that[ '_listeners' ],\r
raw = that[ '_rawObject' ] || X_UA_DOM.IE4 && X_Node__ie4getRawNode( that ),\r
- func = add ? X_EventDispatcher_addEvent : X_EventDispatcher_removeEvent,\r
+ func = add ? X_EventDispatcher_actualAddEvent : X_EventDispatcher_actualRemoveEvent,\r
type;\r
if( !list || !raw ) return;\r
for( type in list ){\r
function X_Node_Anime_detectAnimationLayers(){\r
var i = X_Node_ANIMATIONS.length,\r
l = i,\r
- j, xnode, parent, hasGPUChild, remove;\r
+ j, xnode, parent, _xnode, hasGPUChild, remove;\r
\r
for( ; i; ){\r
xnode = X_Node_ANIMATIONS[ --i ];\r
xDomain = !X_URL_isSameDomain( url ),\r
isFile = X_URL_isLocal( url ),\r
init,\r
- tmp;\r
+ tmp, p;\r
\r
this._dataType = obj[ 'dataType' ];\r
\r
*/\r
\r
function X_NET_XHR_parseResponseHeaders( headerStr ){\r
- var headers = {}, headerPairs, i = 0, l, headerPair, index, key, value;\r
+ var headers = {}, headerPairs, i = 0, l, headerPair, index, key, val;\r
\r
if( !headerStr ) return headers;\r
\r
name : X_NET_GIMR_iframeName,\r
id : X_NET_GIMR_iframeName,\r
src : X_NET_GIMR_GADGET_URL + '#' + encodeURIComponent(\r
- X_JSON_stringify( { 'img' : X_URL_toAbsolutePath( X_NET_GIMR_IMAGE_URL ), 'len' : 1000, 'itvl' : 200 } ) ),\r
+ X_JSON_stringify( {\r
+ 'img' : X_URL_toAbsolutePath( X_NET_GIMR_IMAGE_URL ),\r
+ // https://code.google.com/p/xssinterface/source/browse/trunk/js/xssinterface.js\r
+ 'len' : X_UA[ 'IE' ] ? 2000 : 6000,\r
+ 'itvl' : 333\r
+ } )\r
+ ),\r
scrolling : 'no',\r
allowtransparency : 'no', \r
frameborder : 0,\r
'tokenEndpoint' : 'https://accounts.google.com/o/oauth2/token',
'redirectURI' : X.URL.cleanup( document.location.href ), // 専用の軽量ページを用意してもよいが、現在のアドレスでも可能
'scopes' : [ 'https://www.googleapis.com/auth/blogger' ],
+ 'refreshMargin' : 300000,
'authorizeWindowWidth' : 500,
'authorizeWindowHeight' : 500
}).listen( [ X.Event.NEED_AUTH, X.Event.CANCELED, X.Event.SUCCESS, X.Event.ERROR, X.Event.PROGRESS ], updateOAuth2State );
obj.onAuthError = X_NET_OAUTH2_onXHR401Error;
obj.updateRequest = X_NET_OAUTH2_updateRequest;
- if( _getAccessToken( this ) && ( expires_at = _getAccessTokenExpiry( this ) ) ){
+ if( X_OAuth2_getAccessToken( this ) && ( expires_at = X_OAuth2_getAccessTokenExpiry( this ) ) ){
if( expires_at < X_Timer_now() + ( obj[ 'refreshMargin' ] || 300000 ) ){ // 寿命が5分を切った
this[ 'refreshToken' ]();
} else {
'client_id' : pair[ 'clientID' ],
'client_secret' : pair[ 'clientSecret' ],
'grant_type' : 'refresh_token',
- 'refresh_token' : _getRefreshToken( this )
+ 'refresh_token' : X_OAuth2_getRefreshToken( this )
}),
'dataType' : 'json',
'headers' : {
case X_EVENT_SUCCESS :
pair.refreshTimerID && X_Timer_remove( pair.refreshTimerID );
- if( _getRefreshToken( this ) ){
+ if( X_OAuth2_getRefreshToken( this ) ){
// 自動リフレッシュ
- pair.refreshTimerID = X_Timer_once( _getAccessTokenExpiry( this ) - X_Timer_now() - pair[ 'refreshMargin' ], this, this[ 'refreshToken' ] );
+ pair.refreshTimerID = X_Timer_once( X_OAuth2_getAccessTokenExpiry( this ) - X_Timer_now() - pair[ 'refreshMargin' ], this, this[ 'refreshToken' ] );
};
};
};
switch( e.type ){
case X_EVENT_SUCCESS :
if( isRefresh && data.error ){
- _removeRefreshToken( this );
+ X_OAuth2_removeRefreshToken( this );
pair.oauth2State = 0;
this[ 'asyncDispatch' ]( { type : X_EVENT_ERROR, message : 'Refresh access token error.' } );
this[ 'asyncDispatch' ]( X_EVENT_NEED_AUTH );
return;
};
- _setAccessToken( this, data[ 'access_token' ] || '' );
- _setRefreshToken( this, data[ 'refresh_token' ] || '' );
+ X_OAuth2_setAccessToken( this, data[ 'access_token' ] || '' );
+ X_OAuth2_setRefreshToken( this, data[ 'refresh_token' ] || '' );
if( data[ 'expires_in' ] ){
- _setAccessTokenExpiry( this, X_Timer_now() + data[ 'expires_in' ] * 1000 );
+ X_OAuth2_setAccessTokenExpiry( this, X_Timer_now() + data[ 'expires_in' ] * 1000 );
} else
- if( _getAccessTokenExpiry( this ) ){
- _removeAccessTokenExpiry( this );
+ if( X_OAuth2_getAccessTokenExpiry( this ) ){
+ X_OAuth2_removeAccessTokenExpiry( this );
};
pair.oauth2State = 4;
// other error, not auth
pair.oauth2State = 0;
this[ 'asyncDispatch' ]( { type : X_EVENT_ERROR, message : 'Refresh access token error.' } );
- _removeRefreshToken( this );
+ X_OAuth2_removeRefreshToken( this );
this[ 'asyncDispatch' ]( X_EVENT_NEED_AUTH );
} else
- if( _getAuthMechanism( this ) === 'param' ){
+ if( X_OAuth2_getAuthMechanism( this ) === 'param' ){
pair.oauth2State = 0;
this[ 'asyncDispatch' ]( { type : X_EVENT_ERROR, message : 'network-error' } );
} else {
pair.oauth2State = 0;
- _setAuthMechanism( this, 'param' );
+ X_OAuth2_setAuthMechanism( this, 'param' );
this[ 'asyncDispatch' ]( { type : X_EVENT_PROGRESS, message : 'Refresh access token failed. retry header -> param. ' } );
// retry
X_Net_OAuth2_authorizationCode( this, pair );
headers = e[ 'headers' ],
xhr, bearerParams, headersExposed = false;
- if( _getAuthMechanism( oauth2 ) !== 'param' ){
+ if( X_OAuth2_getAuthMechanism( oauth2 ) !== 'param' ){
xhr = X_NET_currentWrapper[ '_rawObject' ];
headersExposed = !X_Net_XHR_createXDR || !!headers; // this is a hack for Firefox and IE
bearerParams = headersExposed && ( headers[ 'WWW-Authenticate' ] || headers[ 'www-authenticate' ] );
pair.oauth2State = 0;
oauth2[ 'asyncDispatch' ]( X_EVENT_NEED_AUTH );
} else
- if ((( bearerParams && bearerParams.indexOf( 'invalid_token' ) !== -1 ) || !headersExposed) && _getRefreshToken( oauth2 ) ) {
- _removeAccessToken( oauth2 ); // It doesn't work any more.
+ if ((( bearerParams && bearerParams.indexOf( 'invalid_token' ) !== -1 ) || !headersExposed) && X_OAuth2_getRefreshToken( oauth2 ) ) {
+ X_OAuth2_removeAccessToken( oauth2 ); // It doesn't work any more.
pair.oauth2State = 3;
oauth2[ 'refreshToken' ]();
} else {
- //if (!headersExposed && !_getRefreshToken( oauth2 )) {
- _removeAccessToken( oauth2 ); // It doesn't work any more.
+ //if (!headersExposed && !X_OAuth2_getRefreshToken( oauth2 )) {
+ X_OAuth2_removeAccessToken( oauth2 ); // It doesn't work any more.
pair.oauth2State = 0;
oauth2[ 'asyncDispatch' ]( X_EVENT_NEED_AUTH );
};
};
function X_NET_OAUTH2_updateRequest( oauth2, request ){
- var token = _getAccessToken( oauth2 ),
- mechanism = _getAuthMechanism( oauth2 ),
+ var token = X_OAuth2_getAccessToken( oauth2 ),
+ mechanism = X_OAuth2_getAuthMechanism( oauth2 ),
url = request[ 'url' ],
headers;
};
};
-function _getAccessToken( that ){ return updateLocalStorage( '', that, 'accessToken' ); }
-function _getRefreshToken( that){ return updateLocalStorage( '', that, 'refreshToken' ); }
-function _getAccessTokenExpiry( that ){ return parseInt( updateLocalStorage( '', that, 'tokenExpiry' ) ) || 0; }
-function _getAuthMechanism( that ){
+function X_OAuth2_getAccessToken( that ){ return X_OAuth2_updateLocalStorage( '', that, 'accessToken' ); }
+function X_OAuth2_getRefreshToken( that){ return X_OAuth2_updateLocalStorage( '', that, 'refreshToken' ); }
+function X_OAuth2_getAccessTokenExpiry( that ){ return parseInt( X_OAuth2_updateLocalStorage( '', that, 'tokenExpiry' ) ) || 0; }
+function X_OAuth2_getAuthMechanism( that ){
// TODO use gadget | flash ...
// IE's XDomainRequest doesn't support sending headers, so don't try.
- return X_Net_XHR_createXDR ? 'param' : updateLocalStorage( '', that, 'AuthMechanism' );
+ return X_Net_XHR_createXDR ? 'param' : X_OAuth2_updateLocalStorage( '', that, 'AuthMechanism' );
}
-function _setAccessToken( that, value ){ updateLocalStorage( '+', that, 'accessToken' , value); }
-function _setRefreshToken( that, value ){ updateLocalStorage( '+', that, 'refreshToken', value); }
-function _setAccessTokenExpiry( that, value ){ updateLocalStorage( '+', that, 'tokenExpiry', value); }
-function _setAuthMechanism( that, value ){ updateLocalStorage( '+', that, 'AuthMechanism', value); }
+function X_OAuth2_setAccessToken( that, value ){ X_OAuth2_updateLocalStorage( '+', that, 'accessToken' , value); }
+function X_OAuth2_setRefreshToken( that, value ){ X_OAuth2_updateLocalStorage( '+', that, 'refreshToken', value); }
+function X_OAuth2_setAccessTokenExpiry( that, value ){ X_OAuth2_updateLocalStorage( '+', that, 'tokenExpiry', value); }
+function X_OAuth2_setAuthMechanism( that, value ){ X_OAuth2_updateLocalStorage( '+', that, 'AuthMechanism', value); }
-function _removeAccessToken( that ){ updateLocalStorage( '-', that, 'accessToken' ); }
-function _removeRefreshToken( that ){ updateLocalStorage( '-', that, 'refreshToken' ); }
-function _removeAccessTokenExpiry( that ){ updateLocalStorage( '-', that, 'tokenExpiry' ); }
-function _removeAuthMechanism( that ){ updateLocalStorage( '-', that, 'AuthMechanism' ); }
+function X_OAuth2_removeAccessToken( that ){ X_OAuth2_updateLocalStorage( '-', that, 'accessToken' ); }
+function X_OAuth2_removeRefreshToken( that ){ X_OAuth2_updateLocalStorage( '-', that, 'refreshToken' ); }
+function X_OAuth2_removeAccessTokenExpiry( that ){ X_OAuth2_updateLocalStorage( '-', that, 'tokenExpiry' ); }
+function X_OAuth2_removeAuthMechanism( that ){ X_OAuth2_updateLocalStorage( '-', that, 'AuthMechanism' ); }
-function updateLocalStorage( cmd, that, name, value ){
+function X_OAuth2_updateLocalStorage( cmd, that, name, value ){
var action = cmd === '+' ? 'setItem' : cmd === '-' ? 'removeItem' : 'getItem',
pair;
!( X_UA[ 'Gecko' ] && X_UA[ 'Android' ] ) &&
( window.AudioContext || window.webkitAudioContext ),
X_Audio_BUFFER_LIST = [],
- X_Audio_WebAudioWrapper;
+ X_Audio_WebAudioWrapper,
+ X_Audio_BufferLoader;
/*
* iPhone 4s 以下、iPad2以下、iPad mini 1以下, iPod touch 4G 以下は不可
this.setState( option );
- this[ 'listenOnce' ]( X_EVENT_KILL_INSTANCE, X_WebAudio_handleEvent );
+ this[ 'listenOnce' ]( X_EVENT_KILL_INSTANCE, this.onKill );
if( loader.buffer || loader.error ){
this._onLoadBufferComplete();
loader[ 'listenOnce' ]( X_EVENT_COMPLETE, this, this._onLoadBufferComplete );
};
},
+
+ onKill : function(){
+ this.loader[ 'unlisten' ]( X_EVENT_COMPLETE, this, this._onLoadBufferComplete )
+ .unregister( this );
+
+ delete this.buffer;
+
+ this.playing && this.actualPause();
+ this.source && this._sourceDispose();
+
+ this._onended && X_Callback_correct( this._onended );
+
+ this.gainNode && this.gainNode.disconnect();
+ },
_onLoadBufferComplete : function( e ){
var loader = this.loader,
buffer = loader.buffer;
}
);
- function X_WebAudio_handleEvent( e ){
- switch( e.type ){
-
- case X_EVENT_KILL_INSTANCE :
- this.loader[ 'unlisten' ]( X_EVENT_COMPLETE, this, this._onLoadBufferComplete )
- .unregister( this );
-
- delete this.buffer;
-
- this.playing && this.actualPause();
- this.source && this._sourceDispose();
-
- this._onended && X_Callback_correct( this._onended );
-
- this.gainNode && this.gainNode.disconnect();
- break;
- };
- };
-
/*
* http://qiita.com/sou/items/5688d4e7d3a37b4e2ff1
* L-01F 等の一部端末で Web Audio API の再生結果に特定条件下でノイズが混ざることがある。
\r
'js/01_core/03_XType.js',\r
'js/01_core/04_XObject.js',\r
- 'js/01_core/05_XString.js',\r
- 'js/01_core/06_XURL.js',\r
-\r
- 'js/01_core/09_XPair.js', \r
- 'js/01_core/10_XCallback.js',\r
- 'js/01_core/11_XClass.js',\r
- 'js/01_core/12_XEvent.js',\r
- 'js/01_core/13_XEventDispatcher.js', \r
- 'js/01_core/14_XTimer.js',\r
+ 'js/01_core/05_XArray.js',\r
+ 'js/01_core/06_XString.js',\r
+ 'js/01_core/08_XURL.js',\r
+ \r
+ 'js/01_core/10_XPair.js', \r
+ 'js/01_core/11_XClosure.js',\r
+ 'js/01_core/12_XCallback.js',\r
+ 'js/01_core/13_XClass.js',\r
+ 'js/01_core/14_XEvent.js',\r
+ 'js/01_core/15_XEventDispatcher.js',\r
+ 'js/01_core/16_XTimer.js',\r
\r
- 'js/01_core/15_XSystem.js',\r
- 'js/01_core/16_XViewPort.js', \r
- 'js/01_core/17_XLogger.js',\r
+ 'js/01_core/20_XSystem.js',\r
+ 'js/01_core/21_XViewPort.js', \r
+ 'js/01_core/22_XLogger.js',\r
\r
\r
'js/02_dom/00_XDoc.js',\r