リビジョン | 2bea17ee282c2cf4ce0de6685db3ade602f6e60f (tree) |
---|---|
日時 | 2016-02-02 16:53:51 |
作者 | itozyun <itozyun@user...> |
コミッター | itozyun |
Version 0.6.209, bug fixes X.Net.* & X.URL.
@@ -310,6 +310,16 @@ var X_UA = X[ 'UA' ] = {}, | ||
310 | 310 | */ |
311 | 311 | X_UA[ 'OperaTablet' ] = true; |
312 | 312 | |
313 | + // Android Opera12.10 UserAgent:Desktop | |
314 | + // この場合 android version 不明... | |
315 | + if( !X_UA[ 'OperaMini' ] && !X_UA[ 'OperaTablet' ] && !X_UA[ 'OperaMobile' ] && sys === 'Android' ){ | |
316 | + if( screen.width * screen.height < 320000 ){ | |
317 | + X_UA[ 'OperaMobile' ] = true; | |
318 | + } else { | |
319 | + X_UA[ 'OperaTablet' ] = true; | |
320 | + }; | |
321 | + }; | |
322 | + | |
313 | 323 | if( 0 < dua.indexOf( 'Nintendo Wii' ) ) |
314 | 324 | /** |
315 | 325 | * @alias X.UA.Wii |
@@ -4,6 +4,7 @@ | ||
4 | 4 | // ------------------------------------------------------------------------- // |
5 | 5 | var X_URL_BASE_URL = ( function( parts ){ |
6 | 6 | var last = 1 < parts.length && parts[ parts.length - 1 ]; |
7 | + | |
7 | 8 | if( last !== false && ( last === '' || //末尾が/で終わるとき |
8 | 9 | last.indexOf( '.' ) !== -1 ) ){ //末尾がファイル名で終わる時 |
9 | 10 | --parts.length; |
@@ -11,6 +12,8 @@ var X_URL_BASE_URL = ( function( parts ){ | ||
11 | 12 | return parts.join( '/' ); |
12 | 13 | })( X_URL_cleanup( location.href ).split( '/' ) ), |
13 | 14 | |
15 | + X_URL_HOST = location.protocol + '//' + location.hostname, | |
16 | + | |
14 | 17 | X_URL_IS_FILE = location.protocol === 'file:', |
15 | 18 | |
16 | 19 | 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 ){ | ||
109 | 112 | */ |
110 | 113 | function X_URL_isSameDomain( path ){ |
111 | 114 | path = X_URL_cleanup( X_URL_toAbsolutePath( path ) ); |
112 | - return path === X_URL_BASE_URL || path.indexOf( X_URL_BASE_URL + '/' ) === 0; | |
115 | + return path === X_URL_HOST || path.indexOf( X_URL_HOST + '/' ) === 0; | |
113 | 116 | }; |
114 | 117 | /** |
115 | 118 | * 同一プロトコルか? |
@@ -11,7 +11,10 @@ var X_NodeAnime_QUEUE = [], | ||
11 | 11 | |
12 | 12 | /* Opera mobile で translateZ(0) が有効だと XY が 0 0 になる */ |
13 | 13 | /* GPUレイヤーにいる間に要素のコンテンツを変更をすると transitionend が動かなくなるっぽい Mac safari と firefox */ |
14 | - X_NodeAnime_translateZ = X_Node_CSS_VENDER_PREFIX[ 'perspective' ] && !X_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] ? ' translateZ(0)' : '', | |
14 | + X_NodeAnime_translateZ = X_Node_CSS_VENDER_PREFIX[ 'perspective' ] && | |
15 | + !X_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] //&& | |
16 | + /* ハードウェアによると思うが IE11 と Win8.1 で画面(塗)が乱れる */ | |
17 | + /* !( ( X_UA[ 'IE' ] === 11 || X_UA[ 'IEHost' ] === 11 ) && X_UA[ 'Windows' ] === 8.1 ) */ ? ' translateZ(0)' : '', | |
15 | 18 | |
16 | 19 | /* |
17 | 20 | * phase: |
@@ -242,13 +242,13 @@ function X_NET_proxyDispatch( e ){ | ||
242 | 242 | this[ 'unlisten' ]( X_EVENT_COMPLETE, X_NET_proxyDispatch ) |
243 | 243 | [ 'dispatch' ]( X_EVENT_COMPLETE ); |
244 | 244 | }; |
245 | - X_NET_shiftQueue(); | |
245 | + X_NET_shiftQueue( true ); | |
246 | 246 | X_Pair_release( this ); |
247 | 247 | X_NET_completePhase = 0; |
248 | 248 | } else |
249 | 249 | if( this === X_NET_currentQueue ){ |
250 | 250 | X_NET_currentWrapper.cancel(); |
251 | - X_NET_shiftQueue(); | |
251 | + X_NET_shiftQueue( true ); | |
252 | 252 | flag = true; |
253 | 253 | } else |
254 | 254 | if( ( i = X_NET_QUEUE_LIST.indexOf( this ) ) !== -1 ){ |
@@ -289,11 +289,12 @@ function X_NET_proxyDispatch( e ){ | ||
289 | 289 | }; |
290 | 290 | }; |
291 | 291 | |
292 | -function X_NET_shiftQueue(){ | |
293 | - var auth, authSettings; | |
292 | +// TODO _busy は X.Net で触る. | |
293 | +function X_NET_shiftQueue( currentKilled ){ | |
294 | + var q, auth, authSettings; | |
294 | 295 | |
295 | 296 | if( X_NET_currentQueue ){ |
296 | - if( X_NET_currentWrapper._busy ) return; | |
297 | + if( !currentKilled ) return; | |
297 | 298 | |
298 | 299 | X_NET_currentWrapper |
299 | 300 | [ 'unlisten' ]( [ X_EVENT_PROGRESS, X_EVENT_SUCCESS, X_EVENT_ERROR ], X_NET_currentQueue, X_NET_proxyDispatch ) |
@@ -307,7 +308,7 @@ function X_NET_shiftQueue(){ | ||
307 | 308 | if( !X_NET_QUEUE_LIST.length ) return; |
308 | 309 | |
309 | 310 | |
310 | - X_NET_currentQueue = X_NET_QUEUE_LIST.shift(); | |
311 | + X_NET_currentQueue = q = X_NET_QUEUE_LIST.shift(); | |
311 | 312 | X_NET_currentData = X_Pair_get( X_NET_currentQueue ); |
312 | 313 | |
313 | 314 | switch( X_NET_currentData.netType ){ |
@@ -335,12 +336,17 @@ function X_NET_shiftQueue(){ | ||
335 | 336 | case 1 : |
336 | 337 | case 2 : |
337 | 338 | if( !( auth[ 'dispatch' ]( X_EVENT_NEED_AUTH ) & X_CALLBACK_PREVENT_DEFAULT ) ){ |
338 | - authSettings.lazyRequests = authSettings.lazyRequests || []; | |
339 | - authSettings.lazyRequests.indexOf( X_NET_currentQueue ) === -1 && authSettings.lazyRequests.push( X_NET_currentQueue ); | |
339 | + // event 内で kill されていないことを確認 | |
340 | + if( X_NET_currentQueue === q ){ | |
341 | + authSettings.lazyRequests = authSettings.lazyRequests || []; | |
342 | + authSettings.lazyRequests.indexOf( q ) === -1 && authSettings.lazyRequests.push( q ); | |
343 | + X_NET_currentQueue = null; | |
344 | + X_NET_shiftQueue(); | |
345 | + }; | |
346 | + } else { | |
347 | + X_NET_currentQueue === q && q[ 'kill' ](); | |
340 | 348 | }; |
341 | - X_NET_currentQueue = null; | |
342 | - X_NET_shiftQueue(); | |
343 | - break; | |
349 | + return; | |
344 | 350 | case 3 : // refresh token |
345 | 351 | X_NET_QUEUE_LIST.push( X_NET_currentQueue ); |
346 | 352 | X_NET_currentQueue = null; |
@@ -475,15 +475,15 @@ if( X_XHR_w3c || X_XHR_msXML ){ | ||
475 | 475 | switch( X_XHR._dataType ){ |
476 | 476 | case '' : |
477 | 477 | case 'text' : |
478 | - data = raw[ 'responseText' ]; | |
478 | + data = X_Script_try( X_Object_find, [ raw, 'responseText' ] ); | |
479 | 479 | break; |
480 | 480 | case 'json' : |
481 | 481 | case 'moz-json' : |
482 | - data = raw[ 'response' ] || raw[ 'responseText' ]; | |
482 | + data = X_Script_try( X_Object_find, [ raw, 'response' ] ) || X_Script_try( X_Object_find, [ raw, 'responseText' ] ); | |
483 | 483 | // eval() を使っているけど JSON の無いブラウザは XDomain な XHR はできないのでよしとする。 |
484 | 484 | // XDomain な XHR の際は Flash 等で代替し、その中に Json parser も組み込む。 |
485 | 485 | // http://d.hatena.ne.jp/sshi/20060904/p1 |
486 | - if( !X_Type_isObject( data ) ) data = X_JSON_parseTrustableString( data ); | |
486 | + if( X_Type_isString( data ) ) data = X_JSON_parseTrustableString( data ); | |
487 | 487 | break; |
488 | 488 | case 'document' : |
489 | 489 | case 'xml' : |
@@ -499,6 +499,9 @@ if( X_XHR_w3c || X_XHR_msXML ){ | ||
499 | 499 | data = raw[ 'response' ] || raw[ 'responseText' ]; // とりあえず |
500 | 500 | break; |
501 | 501 | }; |
502 | + }; | |
503 | + | |
504 | + if( data ){ | |
502 | 505 | X_XHR[ 'asyncDispatch' ]( 32, { type : X_EVENT_SUCCESS, status : status || 200, response : data, 'headers' : headers || null } ); |
503 | 506 | } else { |
504 | 507 | X_XHR[ 'asyncDispatch' ]( 32, { type : X_EVENT_ERROR, status : status || 400, 'headers' : headers || null } ); |
@@ -6,10 +6,12 @@ | ||
6 | 6 | * AUTHOR: uupaa.js@gmail.com |
7 | 7 | * |
8 | 8 | */ |
9 | -var X_ImgLoader_hasImage = !!window[ 'Image' ], | |
10 | - X_ImgLoader_image = X_ImgLoader_hasImage && new Image(), | |
9 | +var X_ImgLoader_image = window[ 'Image' ] && new Image(), | |
11 | 10 | // IE では厳密には HTMLImageElement ではなく、appendChild してもサイズが取れず、removeChild に失敗する |
12 | - X_ImgLoader_isElement = !( X_UA[ 'IE' ] < 9 ) && X_Type_isHTMLElement( X_ImgLoader_image ); | |
11 | + X_ImgLoader_isElement = !( X_UA[ 'IE' ] < 9 ) && X_Type_isHTMLElement( X_ImgLoader_image ), | |
12 | + // http://uupaa.hatenablog.com/entry/2013/12/17/171809 | |
13 | + // お手軽に画像の読み込みをハンドリングする、今どきな方法 | |
14 | + X_ImgLoader_0forError = !X_UA[ 'IE' ] || X_UA[ 'IE' ] === 11; | |
13 | 15 | |
14 | 16 | /* |
15 | 17 | * TODO |
@@ -23,16 +25,15 @@ X_TEMP.X_ImgLoader_init = function(){ | ||
23 | 25 | X_TEMP.X_ImgLoader_params |
24 | 26 | ); |
25 | 27 | |
26 | - X_ImgLoader[ 'listen' ]( [ 'load', 'error' /*, 'abort'*/, X_EVENT_KILL_INSTANCE ], X_ImgLoader_handleEvent ); | |
28 | + X_ImgLoader[ 'listen' ]( [ 'load', 'error' /*, 'abort'*/ ], X_ImgLoader_handleEvent ); | |
27 | 29 | |
28 | 30 | delete X_TEMP.X_ImgLoader_init; |
29 | - delete X_TEMP.X_ImgLoader_params; | |
31 | + delete X_TEMP.X_ImgLoader_params; | |
30 | 32 | |
31 | 33 | return X_ImgLoader; |
32 | 34 | }; |
33 | 35 | |
34 | 36 | X_TEMP.X_ImgLoader_params = { |
35 | - _busy : false, | |
36 | 37 | tick : 0, |
37 | 38 | timerID : 0, |
38 | 39 | finish : false, |
@@ -41,7 +42,6 @@ X_TEMP.X_ImgLoader_params = { | ||
41 | 42 | timeout : 0, |
42 | 43 | |
43 | 44 | load : function( data ){ |
44 | - this._busy = true; | |
45 | 45 | this.abspath = X_URL_toAbsolutePath( data[ 'url' ] ); |
46 | 46 | this.delay = data[ 'delay' ] || 100; |
47 | 47 | this.timeout = data[ 'timeout' ] || 5000; |
@@ -60,7 +60,6 @@ X_TEMP.X_ImgLoader_params = { | ||
60 | 60 | // abort がある? |
61 | 61 | raw && raw.abort && raw.abort(); |
62 | 62 | // this[ '_rawObject' ].src = ''; |
63 | - this._busy = false; | |
64 | 63 | this.finish = true; |
65 | 64 | }, |
66 | 65 |
@@ -68,12 +67,12 @@ X_TEMP.X_ImgLoader_params = { | ||
68 | 67 | console.log( 'X.Net.Image:reset ' + this.abspath + ' timerID:' + this.timerID ); |
69 | 68 | |
70 | 69 | this.timerID && X_Timer_remove( this.timerID ); |
70 | + this.timerID = 0; | |
71 | + | |
71 | 72 | //X_ImgLoader_isElement ? this[ '_rawObject' ].removeAttribute( 'src' ) : ( this[ '_rawObject' ].src = '' ); |
72 | 73 | this[ '_rawObject' ].src = ''; |
73 | - this.timerID = 0; | |
74 | - this._busy = false; | |
75 | - this.finished = false; | |
76 | - this.abspath = ''; | |
74 | + this.finish = false; | |
75 | + this.abspath = ''; | |
77 | 76 | } |
78 | 77 | }; |
79 | 78 |
@@ -81,8 +80,8 @@ function X_ImgLoader_detect(){ | ||
81 | 80 | var raw = this[ '_rawObject' ]; |
82 | 81 | |
83 | 82 | if( this.finish ) return; |
83 | + | |
84 | 84 | if( raw && raw.complete ){ |
85 | - this._busy = false; | |
86 | 85 | this.finish = true; |
87 | 86 | console.log( 'X.Net.Image:detect ' + raw.width ); |
88 | 87 | if( raw.width ) return; |
@@ -90,7 +89,6 @@ function X_ImgLoader_detect(){ | ||
90 | 89 | this.timerID = this[ 'asyncDispatch' ]( X_EVENT_ERROR ); |
91 | 90 | } else |
92 | 91 | if( this.timeout < ( this.tick += this.delay ) ){ |
93 | - this._busy = false; | |
94 | 92 | this.finish = true; |
95 | 93 | X_Timer_remove( this.timerID ); |
96 | 94 | this.timerID = this[ 'asyncDispatch' ]( { type : X_EVENT_ERROR, 'timeout' : true } ); |
@@ -98,15 +96,18 @@ function X_ImgLoader_detect(){ | ||
98 | 96 | }; |
99 | 97 | |
100 | 98 | function X_ImgLoader_handleEvent( e ){ |
101 | - var size; | |
99 | + var raw = this[ '_rawObject' ], size; | |
102 | 100 | |
101 | + // IE11 reset() 時にここに入ってくる... | |
102 | + if( !this.abspath ) return; | |
103 | 103 | console.log( 'X.Net.Image:handleEvent ' + e.type ); |
104 | 104 | |
105 | 105 | switch( e.type ){ |
106 | 106 | case 'error' : |
107 | 107 | //case 'abort' : // TODO ?? |
108 | + // ie11(10,9 開発モード)で mineType 不正の場合、画像取得に成功してもエラーイベントが起こるのを無視する。 | |
109 | + if( X_ImgLoader_0forError && raw.width ) return; | |
108 | 110 | if( this.finish ) return; |
109 | - this._busy = false; | |
110 | 111 | this.finish = true; |
111 | 112 | this.timerID && X_Timer_remove( this.timerID ); |
112 | 113 | this.timerID = this[ 'asyncDispatch' ]( /*e.type === 'error' ?*/ X_EVENT_ERROR /*: X_EVENT_CANCELED*/ ); |
@@ -115,10 +116,9 @@ function X_ImgLoader_handleEvent( e ){ | ||
115 | 116 | case 'load' : |
116 | 117 | // if( finish === true ) return; // これがあると firefox3.6 で駄目、、、 |
117 | 118 | // if( timer ) return; // これがあると safari3.2 で駄目、、、 |
118 | - this._busy = false; | |
119 | 119 | this.finish = true; |
120 | 120 | this.timerID && X_Timer_remove( this.timerID ); |
121 | - if( X_UA[ 'Opera' ] && !this[ '_rawObject' ].complete ){ | |
121 | + if( X_UA[ 'Opera' ] && !raw.complete ){ | |
122 | 122 | this.timerID = this[ 'asyncDispatch' ]( X_EVENT_ERROR ); |
123 | 123 | return; |
124 | 124 | }; |
@@ -133,10 +133,6 @@ function X_ImgLoader_handleEvent( e ){ | ||
133 | 133 | // time , this[ '_rawObject' ].fileSize |
134 | 134 | } ); |
135 | 135 | break; |
136 | - | |
137 | - case X_EVENT_KILL_INSTANCE : | |
138 | - this.reset(); | |
139 | - break; | |
140 | 136 | }; |
141 | 137 | }; |
142 | 138 |
@@ -6,7 +6,7 @@ var X_OAUTH2_authWindow, | ||
6 | 6 | /** |
7 | 7 | * イベント |
8 | 8 | * <dl> |
9 | - * <dt>X.Event.NEED_AUTH<dd>window を popup して認可を行う必要あり。ポインターイベント内で oauth2.requestAuth() を呼ぶ。 | |
9 | + * <dt>X.Event.NEED_AUTH<dd>window を popup して認可を行う必要あり。ポインターイベント内で oauth2.requestAuth() を呼ぶ。このイベントをキャンセルすると | |
10 | 10 | * <dt>X.Event.CANCELED<dd>認可 window が閉じられた。([x]等でウインドウが閉じられた、oauth2.cancelAuth() が呼ばれた) |
11 | 11 | * <dt>X.Event.SUCCESS<dd>認可 window でユーザーが認可し、続いてコードの認可が済んだ。 |
12 | 12 | * <dt>X.Event.ERROR<dd>コードの認可のエラー、リフレッシュトークンのエラー、ネットワークエラー |