*/\r
X_UA[ 'OperaTablet' ] = true;\r
\r
+ // Android Opera12.10 UserAgent:Desktop\r
+ // この場合 android version 不明...\r
+ if( !X_UA[ 'OperaMini' ] && !X_UA[ 'OperaTablet' ] && !X_UA[ 'OperaMobile' ] && sys === 'Android' ){\r
+ if( screen.width * screen.height < 320000 ){\r
+ X_UA[ 'OperaMobile' ] = true;\r
+ } else {\r
+ X_UA[ 'OperaTablet' ] = true;\r
+ };\r
+ };\r
+ \r
if( 0 < dua.indexOf( 'Nintendo Wii' ) )\r
/**\r
* @alias X.UA.Wii\r
// ------------------------------------------------------------------------- //\r
var X_URL_BASE_URL = ( function( parts ){\r
var last = 1 < parts.length && parts[ parts.length - 1 ];\r
+ \r
if( last !== false && ( last === '' || //末尾が/で終わるとき\r
last.indexOf( '.' ) !== -1 ) ){ //末尾がファイル名で終わる時\r
--parts.length;\r
return parts.join( '/' );\r
})( X_URL_cleanup( location.href ).split( '/' ) ),\r
\r
+ X_URL_HOST = location.protocol + '//' + location.hostname,\r
+ \r
X_URL_IS_FILE = location.protocol === 'file:',\r
\r
X_URL_IS_LOCAL = X_URL_IS_FILE || location.hostname === 'localhost' || location.hostname === '127.0.0.1',\r
*/\r
function X_URL_isSameDomain( path ){\r
path = X_URL_cleanup( X_URL_toAbsolutePath( path ) );\r
- return path === X_URL_BASE_URL || path.indexOf( X_URL_BASE_URL + '/' ) === 0;\r
+ return path === X_URL_HOST || path.indexOf( X_URL_HOST + '/' ) === 0;\r
};\r
/**\r
* 同一プロトコルか?\r
\r
/* Opera mobile で translateZ(0) が有効だと XY が 0 0 になる */\r
/* GPUレイヤーにいる間に要素のコンテンツを変更をすると transitionend が動かなくなるっぽい Mac safari と firefox */\r
- X_NodeAnime_translateZ = X_Node_CSS_VENDER_PREFIX[ 'perspective' ] && !X_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] ? ' translateZ(0)' : '',\r
+ X_NodeAnime_translateZ = X_Node_CSS_VENDER_PREFIX[ 'perspective' ] &&\r
+ !X_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] //&&\r
+ /* ハードウェアによると思うが IE11 と Win8.1 で画面(塗)が乱れる */\r
+ /* !( ( X_UA[ 'IE' ] === 11 || X_UA[ 'IEHost' ] === 11 ) && X_UA[ 'Windows' ] === 8.1 ) */ ? ' translateZ(0)' : '',\r
\r
/*\r
* phase:\r
this[ 'unlisten' ]( X_EVENT_COMPLETE, X_NET_proxyDispatch )\r
[ 'dispatch' ]( X_EVENT_COMPLETE );\r
};\r
- X_NET_shiftQueue();\r
+ X_NET_shiftQueue( true );\r
X_Pair_release( this );\r
X_NET_completePhase = 0;\r
} else\r
if( this === X_NET_currentQueue ){\r
X_NET_currentWrapper.cancel();\r
- X_NET_shiftQueue();\r
+ X_NET_shiftQueue( true );\r
flag = true;\r
} else\r
if( ( i = X_NET_QUEUE_LIST.indexOf( this ) ) !== -1 ){\r
};\r
};\r
\r
-function X_NET_shiftQueue(){\r
- var auth, authSettings;\r
+// TODO _busy は X.Net で触る.\r
+function X_NET_shiftQueue( currentKilled ){\r
+ var q, auth, authSettings;\r
\r
if( X_NET_currentQueue ){\r
- if( X_NET_currentWrapper._busy ) return;\r
+ if( !currentKilled ) return;\r
\r
X_NET_currentWrapper\r
[ 'unlisten' ]( [ X_EVENT_PROGRESS, X_EVENT_SUCCESS, X_EVENT_ERROR ], X_NET_currentQueue, X_NET_proxyDispatch )\r
if( !X_NET_QUEUE_LIST.length ) return;\r
\r
\r
- X_NET_currentQueue = X_NET_QUEUE_LIST.shift();\r
+ X_NET_currentQueue = q = X_NET_QUEUE_LIST.shift();\r
X_NET_currentData = X_Pair_get( X_NET_currentQueue );\r
\r
switch( X_NET_currentData.netType ){\r
case 1 :\r
case 2 :\r
if( !( auth[ 'dispatch' ]( X_EVENT_NEED_AUTH ) & X_CALLBACK_PREVENT_DEFAULT ) ){\r
- authSettings.lazyRequests = authSettings.lazyRequests || [];\r
- authSettings.lazyRequests.indexOf( X_NET_currentQueue ) === -1 && authSettings.lazyRequests.push( X_NET_currentQueue );\r
+ // event 内で kill されていないことを確認\r
+ if( X_NET_currentQueue === q ){\r
+ authSettings.lazyRequests = authSettings.lazyRequests || [];\r
+ authSettings.lazyRequests.indexOf( q ) === -1 && authSettings.lazyRequests.push( q );\r
+ X_NET_currentQueue = null;\r
+ X_NET_shiftQueue(); \r
+ };\r
+ } else {\r
+ X_NET_currentQueue === q && q[ 'kill' ]();\r
};\r
- X_NET_currentQueue = null;\r
- X_NET_shiftQueue();\r
- break;\r
+ return;\r
case 3 : // refresh token\r
X_NET_QUEUE_LIST.push( X_NET_currentQueue );\r
X_NET_currentQueue = null;\r
switch( X_XHR._dataType ){\r
case '' :\r
case 'text' :\r
- data = raw[ 'responseText' ];\r
+ data = X_Script_try( X_Object_find, [ raw, 'responseText' ] );\r
break;\r
case 'json' :\r
case 'moz-json' :\r
- data = raw[ 'response' ] || raw[ 'responseText' ];\r
+ data = X_Script_try( X_Object_find, [ raw, 'response' ] ) || X_Script_try( X_Object_find, [ raw, 'responseText' ] );\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 = X_JSON_parseTrustableString( data );\r
+ if( X_Type_isString( data ) ) data = X_JSON_parseTrustableString( data );\r
break;\r
case 'document' :\r
case 'xml' :\r
data = raw[ 'response' ] || raw[ 'responseText' ]; // とりあえず\r
break;\r
};\r
+ };\r
+ \r
+ if( data ){\r
X_XHR[ 'asyncDispatch' ]( 32, { type : X_EVENT_SUCCESS, status : status || 200, response : data, 'headers' : headers || null } );\r
} else {\r
X_XHR[ 'asyncDispatch' ]( 32, { type : X_EVENT_ERROR, status : status || 400, 'headers' : headers || null } );\r
* AUTHOR: uupaa.js@gmail.com\r
* \r
*/\r
-var X_ImgLoader_hasImage = !!window[ 'Image' ],\r
- X_ImgLoader_image = X_ImgLoader_hasImage && new Image(),\r
+var X_ImgLoader_image = window[ 'Image' ] && new Image(),\r
// IE では厳密には HTMLImageElement ではなく、appendChild してもサイズが取れず、removeChild に失敗する\r
- X_ImgLoader_isElement = !( X_UA[ 'IE' ] < 9 ) && X_Type_isHTMLElement( X_ImgLoader_image );\r
+ X_ImgLoader_isElement = !( X_UA[ 'IE' ] < 9 ) && X_Type_isHTMLElement( X_ImgLoader_image ),\r
+ // http://uupaa.hatenablog.com/entry/2013/12/17/171809\r
+ // お手軽に画像の読み込みをハンドリングする、今どきな方法\r
+ X_ImgLoader_0forError = !X_UA[ 'IE' ] || X_UA[ 'IE' ] === 11;\r
\r
/*\r
* TODO\r
X_TEMP.X_ImgLoader_params\r
);\r
\r
- X_ImgLoader[ 'listen' ]( [ 'load', 'error' /*, 'abort'*/, X_EVENT_KILL_INSTANCE ], X_ImgLoader_handleEvent );\r
+ X_ImgLoader[ 'listen' ]( [ 'load', 'error' /*, 'abort'*/ ], X_ImgLoader_handleEvent );\r
\r
delete X_TEMP.X_ImgLoader_init;\r
- delete X_TEMP.X_ImgLoader_params; \r
+ delete X_TEMP.X_ImgLoader_params;\r
\r
return X_ImgLoader;\r
};\r
\r
X_TEMP.X_ImgLoader_params = {\r
- _busy : false,\r
tick : 0,\r
timerID : 0,\r
finish : false,\r
timeout : 0,\r
\r
load : function( data ){\r
- this._busy = true;\r
this.abspath = X_URL_toAbsolutePath( data[ 'url' ] );\r
this.delay = data[ 'delay' ] || 100;\r
this.timeout = data[ 'timeout' ] || 5000;\r
// abort がある?\r
raw && raw.abort && raw.abort();\r
// this[ '_rawObject' ].src = '';\r
- this._busy = false;\r
this.finish = true;\r
},\r
\r
console.log( 'X.Net.Image:reset ' + this.abspath + ' timerID:' + this.timerID );\r
\r
this.timerID && X_Timer_remove( this.timerID );\r
+ this.timerID = 0;\r
+ \r
//X_ImgLoader_isElement ? this[ '_rawObject' ].removeAttribute( 'src' ) : ( this[ '_rawObject' ].src = '' );\r
this[ '_rawObject' ].src = '';\r
- this.timerID = 0;\r
- this._busy = false;\r
- this.finished = false;\r
- this.abspath = '';\r
+ this.finish = false;\r
+ this.abspath = '';\r
}\r
};\r
\r
var raw = this[ '_rawObject' ];\r
\r
if( this.finish ) return;\r
+ \r
if( raw && raw.complete ){\r
- this._busy = false;\r
this.finish = true;\r
console.log( 'X.Net.Image:detect ' + raw.width );\r
if( raw.width ) return;\r
this.timerID = this[ 'asyncDispatch' ]( X_EVENT_ERROR );\r
} else\r
if( this.timeout < ( this.tick += this.delay ) ){\r
- this._busy = false;\r
this.finish = true;\r
X_Timer_remove( this.timerID );\r
this.timerID = this[ 'asyncDispatch' ]( { type : X_EVENT_ERROR, 'timeout' : true } );\r
};\r
\r
function X_ImgLoader_handleEvent( e ){\r
- var size;\r
+ var raw = this[ '_rawObject' ], size;\r
\r
+ // IE11 reset() 時にここに入ってくる...\r
+ if( !this.abspath ) return;\r
console.log( 'X.Net.Image:handleEvent ' + e.type );\r
\r
switch( e.type ){\r
case 'error' :\r
//case 'abort' : // TODO ??\r
+ // ie11(10,9 開発モード)で mineType 不正の場合、画像取得に成功してもエラーイベントが起こるのを無視する。\r
+ if( X_ImgLoader_0forError && raw.width ) return;\r
if( this.finish ) return;\r
- this._busy = false;\r
this.finish = true;\r
this.timerID && X_Timer_remove( this.timerID );\r
this.timerID = this[ 'asyncDispatch' ]( /*e.type === 'error' ?*/ X_EVENT_ERROR /*: X_EVENT_CANCELED*/ );\r
case 'load' :\r
// if( finish === true ) return; // これがあると firefox3.6 で駄目、、、\r
// if( timer ) return; // これがあると safari3.2 で駄目、、、\r
- this._busy = false;\r
this.finish = true;\r
this.timerID && X_Timer_remove( this.timerID );\r
- if( X_UA[ 'Opera' ] && !this[ '_rawObject' ].complete ){\r
+ if( X_UA[ 'Opera' ] && !raw.complete ){\r
this.timerID = this[ 'asyncDispatch' ]( X_EVENT_ERROR );\r
return;\r
};\r
// time , this[ '_rawObject' ].fileSize\r
} );\r
break;\r
-\r
- case X_EVENT_KILL_INSTANCE :\r
- this.reset();\r
- break;\r
};\r
};\r
\r
/**
* イベント
* <dl>
- * <dt>X.Event.NEED_AUTH<dd>window を popup して認可を行う必要あり。ポインターイベント内で oauth2.requestAuth() を呼ぶ。
+ * <dt>X.Event.NEED_AUTH<dd>window を popup して認可を行う必要あり。ポインターイベント内で oauth2.requestAuth() を呼ぶ。このイベントをキャンセルすると
* <dt>X.Event.CANCELED<dd>認可 window が閉じられた。([x]等でウインドウが閉じられた、oauth2.cancelAuth() が呼ばれた)
* <dt>X.Event.SUCCESS<dd>認可 window でユーザーが認可し、続いてコードの認可が済んだ。
* <dt>X.Event.ERROR<dd>コードの認可のエラー、リフレッシュトークンのエラー、ネットワークエラー