From: itozyun Date: Tue, 2 Feb 2016 07:53:51 +0000 (+0900) Subject: Version 0.6.209, bug fixes X.Net.* & X.URL. X-Git-Url: http://git.osdn.jp/view?p=pettanr%2FclientJs.git;a=commitdiff_plain;h=2bea17ee282c2cf4ce0de6685db3ade602f6e60f Version 0.6.209, bug fixes X.Net.* & X.URL. --- diff --git a/0.6.x/js/01_core/02_XUA.js b/0.6.x/js/01_core/02_XUA.js index f614472..73e7105 100644 --- a/0.6.x/js/01_core/02_XUA.js +++ b/0.6.x/js/01_core/02_XUA.js @@ -310,6 +310,16 @@ var X_UA = X[ 'UA' ] = {}, */ X_UA[ 'OperaTablet' ] = true; + // Android Opera12.10 UserAgent:Desktop + // この場合 android version 不明... + if( !X_UA[ 'OperaMini' ] && !X_UA[ 'OperaTablet' ] && !X_UA[ 'OperaMobile' ] && sys === 'Android' ){ + if( screen.width * screen.height < 320000 ){ + X_UA[ 'OperaMobile' ] = true; + } else { + X_UA[ 'OperaTablet' ] = true; + }; + }; + if( 0 < dua.indexOf( 'Nintendo Wii' ) ) /** * @alias X.UA.Wii diff --git a/0.6.x/js/01_core/09_XURL.js b/0.6.x/js/01_core/09_XURL.js index 0eaccab..1be41ad 100644 --- a/0.6.x/js/01_core/09_XURL.js +++ b/0.6.x/js/01_core/09_XURL.js @@ -4,6 +4,7 @@ // ------------------------------------------------------------------------- // var X_URL_BASE_URL = ( function( parts ){ var last = 1 < parts.length && parts[ parts.length - 1 ]; + if( last !== false && ( last === '' || //末尾が/で終わるとき last.indexOf( '.' ) !== -1 ) ){ //末尾がファイル名で終わる時 --parts.length; @@ -11,6 +12,8 @@ var X_URL_BASE_URL = ( function( parts ){ return parts.join( '/' ); })( X_URL_cleanup( location.href ).split( '/' ) ), + X_URL_HOST = location.protocol + '//' + location.hostname, + X_URL_IS_FILE = location.protocol === 'file:', X_URL_IS_LOCAL = X_URL_IS_FILE || location.hostname === 'localhost' || location.hostname === '127.0.0.1', @@ -109,7 +112,7 @@ function X_URL_toAbsolutePath( path ){ */ function X_URL_isSameDomain( path ){ path = X_URL_cleanup( X_URL_toAbsolutePath( path ) ); - return path === X_URL_BASE_URL || path.indexOf( X_URL_BASE_URL + '/' ) === 0; + return path === X_URL_HOST || path.indexOf( X_URL_HOST + '/' ) === 0; }; /** * 同一プロトコルか? diff --git a/0.6.x/js/02_dom/10_XNodeAnime.js b/0.6.x/js/02_dom/10_XNodeAnime.js index 580d6da..765dec7 100644 --- a/0.6.x/js/02_dom/10_XNodeAnime.js +++ b/0.6.x/js/02_dom/10_XNodeAnime.js @@ -11,7 +11,10 @@ var X_NodeAnime_QUEUE = [], /* Opera mobile で translateZ(0) が有効だと XY が 0 0 になる */ /* GPUレイヤーにいる間に要素のコンテンツを変更をすると transitionend が動かなくなるっぽい Mac safari と firefox */ - X_NodeAnime_translateZ = X_Node_CSS_VENDER_PREFIX[ 'perspective' ] && !X_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] ? ' translateZ(0)' : '', + X_NodeAnime_translateZ = X_Node_CSS_VENDER_PREFIX[ 'perspective' ] && + !X_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] //&& + /* ハードウェアによると思うが IE11 と Win8.1 で画面(塗)が乱れる */ + /* !( ( X_UA[ 'IE' ] === 11 || X_UA[ 'IEHost' ] === 11 ) && X_UA[ 'Windows' ] === 8.1 ) */ ? ' translateZ(0)' : '', /* * phase: diff --git a/0.6.x/js/06_net/00_XNet.js b/0.6.x/js/06_net/00_XNet.js index 469669d..7d5b26f 100644 --- a/0.6.x/js/06_net/00_XNet.js +++ b/0.6.x/js/06_net/00_XNet.js @@ -242,13 +242,13 @@ function X_NET_proxyDispatch( e ){ this[ 'unlisten' ]( X_EVENT_COMPLETE, X_NET_proxyDispatch ) [ 'dispatch' ]( X_EVENT_COMPLETE ); }; - X_NET_shiftQueue(); + X_NET_shiftQueue( true ); X_Pair_release( this ); X_NET_completePhase = 0; } else if( this === X_NET_currentQueue ){ X_NET_currentWrapper.cancel(); - X_NET_shiftQueue(); + X_NET_shiftQueue( true ); flag = true; } else if( ( i = X_NET_QUEUE_LIST.indexOf( this ) ) !== -1 ){ @@ -289,11 +289,12 @@ function X_NET_proxyDispatch( e ){ }; }; -function X_NET_shiftQueue(){ - var auth, authSettings; +// TODO _busy は X.Net で触る. +function X_NET_shiftQueue( currentKilled ){ + var q, auth, authSettings; if( X_NET_currentQueue ){ - if( X_NET_currentWrapper._busy ) return; + if( !currentKilled ) return; X_NET_currentWrapper [ 'unlisten' ]( [ X_EVENT_PROGRESS, X_EVENT_SUCCESS, X_EVENT_ERROR ], X_NET_currentQueue, X_NET_proxyDispatch ) @@ -307,7 +308,7 @@ function X_NET_shiftQueue(){ if( !X_NET_QUEUE_LIST.length ) return; - X_NET_currentQueue = X_NET_QUEUE_LIST.shift(); + X_NET_currentQueue = q = X_NET_QUEUE_LIST.shift(); X_NET_currentData = X_Pair_get( X_NET_currentQueue ); switch( X_NET_currentData.netType ){ @@ -335,12 +336,17 @@ function X_NET_shiftQueue(){ case 1 : case 2 : if( !( auth[ 'dispatch' ]( X_EVENT_NEED_AUTH ) & X_CALLBACK_PREVENT_DEFAULT ) ){ - authSettings.lazyRequests = authSettings.lazyRequests || []; - authSettings.lazyRequests.indexOf( X_NET_currentQueue ) === -1 && authSettings.lazyRequests.push( X_NET_currentQueue ); + // event 内で kill されていないことを確認 + if( X_NET_currentQueue === q ){ + authSettings.lazyRequests = authSettings.lazyRequests || []; + authSettings.lazyRequests.indexOf( q ) === -1 && authSettings.lazyRequests.push( q ); + X_NET_currentQueue = null; + X_NET_shiftQueue(); + }; + } else { + X_NET_currentQueue === q && q[ 'kill' ](); }; - X_NET_currentQueue = null; - X_NET_shiftQueue(); - break; + return; case 3 : // refresh token X_NET_QUEUE_LIST.push( X_NET_currentQueue ); X_NET_currentQueue = null; diff --git a/0.6.x/js/06_net/01_XNetXHR.js b/0.6.x/js/06_net/01_XNetXHR.js index 4875e7e..2d5f3b7 100644 --- a/0.6.x/js/06_net/01_XNetXHR.js +++ b/0.6.x/js/06_net/01_XNetXHR.js @@ -475,15 +475,15 @@ if( X_XHR_w3c || X_XHR_msXML ){ switch( X_XHR._dataType ){ case '' : case 'text' : - data = raw[ 'responseText' ]; + data = X_Script_try( X_Object_find, [ raw, 'responseText' ] ); break; case 'json' : case 'moz-json' : - data = raw[ 'response' ] || raw[ 'responseText' ]; + data = X_Script_try( X_Object_find, [ raw, 'response' ] ) || X_Script_try( X_Object_find, [ raw, 'responseText' ] ); // eval() を使っているけど JSON の無いブラウザは XDomain な XHR はできないのでよしとする。 // XDomain な XHR の際は Flash 等で代替し、その中に Json parser も組み込む。 // http://d.hatena.ne.jp/sshi/20060904/p1 - if( !X_Type_isObject( data ) ) data = X_JSON_parseTrustableString( data ); + if( X_Type_isString( data ) ) data = X_JSON_parseTrustableString( data ); break; case 'document' : case 'xml' : @@ -499,6 +499,9 @@ if( X_XHR_w3c || X_XHR_msXML ){ data = raw[ 'response' ] || raw[ 'responseText' ]; // とりあえず break; }; + }; + + if( data ){ X_XHR[ 'asyncDispatch' ]( 32, { type : X_EVENT_SUCCESS, status : status || 200, response : data, 'headers' : headers || null } ); } else { X_XHR[ 'asyncDispatch' ]( 32, { type : X_EVENT_ERROR, status : status || 400, 'headers' : headers || null } ); diff --git a/0.6.x/js/06_net/04_XNetImage.js b/0.6.x/js/06_net/04_XNetImage.js index 92044e1..3bcc3b8 100644 --- a/0.6.x/js/06_net/04_XNetImage.js +++ b/0.6.x/js/06_net/04_XNetImage.js @@ -6,10 +6,12 @@ * AUTHOR: uupaa.js@gmail.com * */ -var X_ImgLoader_hasImage = !!window[ 'Image' ], - X_ImgLoader_image = X_ImgLoader_hasImage && new Image(), +var X_ImgLoader_image = window[ 'Image' ] && new Image(), // IE では厳密には HTMLImageElement ではなく、appendChild してもサイズが取れず、removeChild に失敗する - X_ImgLoader_isElement = !( X_UA[ 'IE' ] < 9 ) && X_Type_isHTMLElement( X_ImgLoader_image ); + X_ImgLoader_isElement = !( X_UA[ 'IE' ] < 9 ) && X_Type_isHTMLElement( X_ImgLoader_image ), + // http://uupaa.hatenablog.com/entry/2013/12/17/171809 + // お手軽に画像の読み込みをハンドリングする、今どきな方法 + X_ImgLoader_0forError = !X_UA[ 'IE' ] || X_UA[ 'IE' ] === 11; /* * TODO @@ -23,16 +25,15 @@ X_TEMP.X_ImgLoader_init = function(){ X_TEMP.X_ImgLoader_params ); - X_ImgLoader[ 'listen' ]( [ 'load', 'error' /*, 'abort'*/, X_EVENT_KILL_INSTANCE ], X_ImgLoader_handleEvent ); + X_ImgLoader[ 'listen' ]( [ 'load', 'error' /*, 'abort'*/ ], X_ImgLoader_handleEvent ); delete X_TEMP.X_ImgLoader_init; - delete X_TEMP.X_ImgLoader_params; + delete X_TEMP.X_ImgLoader_params; return X_ImgLoader; }; X_TEMP.X_ImgLoader_params = { - _busy : false, tick : 0, timerID : 0, finish : false, @@ -41,7 +42,6 @@ X_TEMP.X_ImgLoader_params = { timeout : 0, load : function( data ){ - this._busy = true; this.abspath = X_URL_toAbsolutePath( data[ 'url' ] ); this.delay = data[ 'delay' ] || 100; this.timeout = data[ 'timeout' ] || 5000; @@ -60,7 +60,6 @@ X_TEMP.X_ImgLoader_params = { // abort がある? raw && raw.abort && raw.abort(); // this[ '_rawObject' ].src = ''; - this._busy = false; this.finish = true; }, @@ -68,12 +67,12 @@ X_TEMP.X_ImgLoader_params = { console.log( 'X.Net.Image:reset ' + this.abspath + ' timerID:' + this.timerID ); this.timerID && X_Timer_remove( this.timerID ); + this.timerID = 0; + //X_ImgLoader_isElement ? this[ '_rawObject' ].removeAttribute( 'src' ) : ( this[ '_rawObject' ].src = '' ); this[ '_rawObject' ].src = ''; - this.timerID = 0; - this._busy = false; - this.finished = false; - this.abspath = ''; + this.finish = false; + this.abspath = ''; } }; @@ -81,8 +80,8 @@ function X_ImgLoader_detect(){ var raw = this[ '_rawObject' ]; if( this.finish ) return; + if( raw && raw.complete ){ - this._busy = false; this.finish = true; console.log( 'X.Net.Image:detect ' + raw.width ); if( raw.width ) return; @@ -90,7 +89,6 @@ function X_ImgLoader_detect(){ this.timerID = this[ 'asyncDispatch' ]( X_EVENT_ERROR ); } else if( this.timeout < ( this.tick += this.delay ) ){ - this._busy = false; this.finish = true; X_Timer_remove( this.timerID ); this.timerID = this[ 'asyncDispatch' ]( { type : X_EVENT_ERROR, 'timeout' : true } ); @@ -98,15 +96,18 @@ function X_ImgLoader_detect(){ }; function X_ImgLoader_handleEvent( e ){ - var size; + var raw = this[ '_rawObject' ], size; + // IE11 reset() 時にここに入ってくる... + if( !this.abspath ) return; console.log( 'X.Net.Image:handleEvent ' + e.type ); switch( e.type ){ case 'error' : //case 'abort' : // TODO ?? + // ie11(10,9 開発モード)で mineType 不正の場合、画像取得に成功してもエラーイベントが起こるのを無視する。 + if( X_ImgLoader_0forError && raw.width ) return; if( this.finish ) return; - this._busy = false; this.finish = true; this.timerID && X_Timer_remove( this.timerID ); this.timerID = this[ 'asyncDispatch' ]( /*e.type === 'error' ?*/ X_EVENT_ERROR /*: X_EVENT_CANCELED*/ ); @@ -115,10 +116,9 @@ function X_ImgLoader_handleEvent( e ){ case 'load' : // if( finish === true ) return; // これがあると firefox3.6 で駄目、、、 // if( timer ) return; // これがあると safari3.2 で駄目、、、 - this._busy = false; this.finish = true; this.timerID && X_Timer_remove( this.timerID ); - if( X_UA[ 'Opera' ] && !this[ '_rawObject' ].complete ){ + if( X_UA[ 'Opera' ] && !raw.complete ){ this.timerID = this[ 'asyncDispatch' ]( X_EVENT_ERROR ); return; }; @@ -133,10 +133,6 @@ function X_ImgLoader_handleEvent( e ){ // time , this[ '_rawObject' ].fileSize } ); break; - - case X_EVENT_KILL_INSTANCE : - this.reset(); - break; }; }; diff --git a/0.6.x/js/06_net/10_XOAuth2.js b/0.6.x/js/06_net/10_XOAuth2.js index b37a6f9..e1f923e 100644 --- a/0.6.x/js/06_net/10_XOAuth2.js +++ b/0.6.x/js/06_net/10_XOAuth2.js @@ -6,7 +6,7 @@ var X_OAUTH2_authWindow, /** * イベント *
- *
X.Event.NEED_AUTH
window を popup して認可を行う必要あり。ポインターイベント内で oauth2.requestAuth() を呼ぶ。 + *
X.Event.NEED_AUTH
window を popup して認可を行う必要あり。ポインターイベント内で oauth2.requestAuth() を呼ぶ。このイベントをキャンセルすると *
X.Event.CANCELED
認可 window が閉じられた。([x]等でウインドウが閉じられた、oauth2.cancelAuth() が呼ばれた) *
X.Event.SUCCESS
認可 window でユーザーが認可し、続いてコードの認可が済んだ。 *
X.Event.ERROR
コードの認可のエラー、リフレッシュトークンのエラー、ネットワークエラー