OSDN Git Service

Version 0.6.139, fix Node.animate when no.
authoritozyun <itozyun@user.sourceforge.jp>
Fri, 17 Apr 2015 12:46:33 +0000 (21:46 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Fri, 17 Apr 2015 12:46:33 +0000 (21:46 +0900)
0.6.x/css/xui.css
0.6.x/js/01_core/10_XCallback.js
0.6.x/js/01_core/14_XTimer.js
0.6.x/js/01_core/16_XViewPort.js
0.6.x/js/02_dom/02_XNode.js
0.6.x/js/02_dom/10_XNodeAnime.js
0.6.x/js/06_net/01_XNetXHR.js
0.6.x/js/07_audio/01_XWebAudio.js
0.6.x/js/20_ui/15_ScrollBox.js
0.6.x/js/20_ui/20_PageRoot.js

index 36a29a0..5ec74e3 100644 (file)
@@ -7,7 +7,7 @@ html, body {
 }\r
 \r
 .PageRoot {\r
-       height             : 100%;\r
+       height   : 100%;\r
        position : relative;\r
 }\r
 \r
@@ -18,6 +18,7 @@ html, body {
        top                : 0;\r
        left               : 0;\r
        width              : 100%;\r
+       height             : auto;\r
        padding            : 0;\r
        margin             : 0;\r
 /* ブラウザのレイアウト機能による auto なサイズ指定は行わない */\r
@@ -100,6 +101,43 @@ html, body {
        visibility : hidden;\r
        /*z-index    : 99;*/\r
 }\r
+.hidden-iframe {\r
+       z-index     : -1;\r
+       visibility  : hidden;\r
+       overflow    : hidden;\r
+       border      : 0;\r
+       outline     : 0;\r
+       margin      : -10px 0 0 -10px;\r
+       padding     : 0;\r
+       min-width   : 0;\r
+       min-height  : 0;\r
+       width       : 10px;\r
+       height      : 10px;\r
+       max-width   : 10px;\r
+       max-height  : 10px;\r
+       top         : -20px;\r
+       left        : -20px;\r
+}\r
+\r
+/* Fix for WebAudio\r
+ * see http://qiita.com/sou/items/5688d4e7d3a37b4e2ff1\r
+--------------------------------------------------------------------------------------*/\r
+       #fps-slowdown-make-sound-noisy {\r
+               width: 0px;\r
+               height: 0px;\r
+               position: absolute;\r
+               -webkit-animation-name: anim-void;\r
+               -webkit-animation-duration: 1s;\r
+               -webkit-animation-iteration-count: infinite;\r
+       }\r
+       @-webkit-keyframes anim-void {\r
+               from {\r
+                       top: 0px;\r
+               }\r
+               to {\r
+                       top: 1px;\r
+               }\r
+       }\r
 \r
 /*  Scrollbox\r
 --------------------------------------------------------------------------------------*/\r
index f5ee5ef..a8dd6a3 100644 (file)
@@ -31,8 +31,12 @@ var /** @const */
        X_Callback_PREVENT_DEFAULT  =  8,  // 結果動作のキャンセル,\r
        /** @const */\r
        X_Callback_MONOPOLY         = 16,  // move event を独占する\r
+       \r
+       X_Callback_CAPTURE_POINTER  = 16,\r
+       X_Callback_RELEASE_POINTER  = 32,\r
+       \r
        /** @const */\r
-       X_Callback_SYS_CANCEL       = 32 | 4 | 2;\r
+       X_Callback_SYS_CANCEL       = 64 | 4 | 2;\r
 \r
 /*\r
  * handleEvent という関数のメンバーを持つオブジェクト\r
@@ -151,7 +155,11 @@ X[ 'Callback' ] = {
        /**\r
         * X.UI に於いて、ポインターイベントの戻り値に指定すると、以降のポインターベントを独占する。\r
         */\r
-       'MONOPOLY'         : X_Callback_MONOPOLY\r
+       'MONOPOLY'         : X_Callback_MONOPOLY,\r
+       \r
+       'CAPTURE_POINTER'  : X_Callback_CAPTURE_POINTER,\r
+       \r
+       'RELEASE_POINTER'  : X_Callback_RELEASE_POINTER\r
 };\r
 \r
 // ------------------------------------------------------------------------- //\r
index 41b4fcf..48b27a3 100644 (file)
@@ -95,14 +95,18 @@ var
                        var i = X_Timer_REQ_FRAME_LIST.length,\r
                                f;\r
                        i === 0 && ( X_Timer_requestID = X_Timer_REQ_ANIME_FRAME( X_Timer_onEnterFrame ) );\r
-                       f = X_Timer_REQ_FRAME_LIST[ i ] = X_Callback_classifyCallbackArgs( args1, args2, args3 );\r
+                       f = X_Callback_classifyCallbackArgs( args1, args2, args3 );\r
+                       if( !f.kind ) f = { func : f };\r
+                       X_Timer_REQ_FRAME_LIST[ i ] = f;\r
                        return f.uid = ++X_Timer_uid;\r
                }) :\r
                (function( args1, args2, args3 ){\r
                        var i = X_Timer_REQ_FRAME_LIST.length,\r
                                f;\r
                        i === 0 && ( X_Timer_requestID = X_Timer_add( 0, 1, X_Timer_onEnterFrame ) );\r
-                       f = X_Timer_REQ_FRAME_LIST[ i ] = X_Callback_classifyCallbackArgs( args1, args2, args3 );\r
+                       f = X_Callback_classifyCallbackArgs( args1, args2, args3 );\r
+                       if( !f.kind ) f = { func : f };\r
+                       X_Timer_REQ_FRAME_LIST[ i ] = f;\r
                        return f.uid = ++X_Timer_uid;\r
                }),\r
 \r
@@ -110,7 +114,9 @@ var
         * requestAnimationFrame を解除します。登録時に受け取ったタイマーIDを使用します。\r
         * @alias X.Timer.cancelFrame\r
         * @function\r
-        * @param {number} タイマーID\r
+        * @param {number|string} タイマーID, 数字文字の場合もある!\r
+        * @return {number} 0 が返る\r
+        * @example if( timerID ) timerID = X.Timer.cancelFrame( timerID );\r
         */\r
        X_Timer_cancelFrame = X_Timer_CANCEL_ANIME_FRAME ?\r
                (function( uid ){\r
@@ -118,8 +124,9 @@ var
                                l    = list.length,\r
                                i    = l,\r
                                f;\r
-                       // fire 中の cancel\r
+\r
                        if( X_Timer_busyOnFrame ){\r
+                               // fire 中の cancel\r
                                if( !X_Timer_removal ) X_Timer_removal = {};\r
                                X_Timer_removal[ uid ] = true;\r
                        } else {\r
@@ -127,20 +134,22 @@ var
                                        if( ( f = list[ --i ] ).uid < uid ) break;\r
                                        if( f.uid === uid ){\r
                                                list.splice( i, 1 );\r
-                                               // gecko では無い場合がある\r
+                                               // gecko では cancelRequestAnimationFrame が無い場合がある\r
                                                l === 1 && X_Timer_CANCEL_ANIME_FRAME && X_Timer_CANCEL_ANIME_FRAME( X_Timer_requestID );\r
                                                break;\r
                                        };\r
                                };                              \r
                        };\r
+                       return 0;\r
                }) :\r
                (function( uid ){\r
                        var list = X_Timer_REQ_FRAME_LIST,\r
                                l    = list.length,\r
                                i    = l,\r
                                f;\r
-                       // fire 中の cancel\r
+\r
                        if( X_Timer_busyOnFrame ){\r
+                               // fire 中の cancel\r
                                if( !X_Timer_removal ) X_Timer_removal = {};\r
                                X_Timer_removal[ uid ] = true;\r
                        } else {\r
@@ -153,6 +162,7 @@ var
                                        };\r
                                };\r
                        };\r
+                       return 0;\r
                });\r
 \r
 \r
@@ -200,7 +210,7 @@ X[ 'Timer' ] = {
         * @param {*} args2\r
         * @param {*} args3\r
         * @return {number} タイマーID。1 以上の数値。タイマーの解除に使用。\r
-        * @example X.Timer.add( 1000, 5, thisContext, onTimer );\r
+        * @example timerID = X.Timer.add( 1000, 5, thisContext, onTimer );\r
         */\r
        function X_Timer_add( time, opt_count, args1, args2, args3 ){\r
                var list = X_Timer_TICKET_LIST,\r
@@ -245,14 +255,17 @@ X[ 'Timer' ] = {
         * タイマーを解除します。登録時に受け取ったタイマーIDを使用します。\r
         * @alias X.Timer.remove\r
         * @param {number} タイマーID\r
+        * @return {number} 0 が返る\r
+        * @example if( timerID ) timerID = X.Timer.remove( timerID );\r
         */\r
        function X_Timer_remove( uid ){\r
                var list = X_Timer_TICKET_LIST,\r
                        i    = list.length,\r
                        l    = i,\r
                        f, q, eventDispatcher, lazy, listeners;\r
-               // fire 中の cancel\r
+               \r
                if( X_Timer_busyTimeout ){\r
+                       // fire 中の cancel\r
                        if( !X_Timer_removal ) X_Timer_removal = {};\r
                        X_Timer_removal[ uid ] = true;\r
                } else {\r
@@ -264,19 +277,7 @@ X[ 'Timer' ] = {
                                         * lazyDispatch 中の EventDispatcher の有無を調べる\r
                                         */\r
                                        if( X_EventDispatcher_LAZY_TIMERS[ uid ] ){\r
-                                               // eventDispatcher = X_EventDispatcher_LAZY_TIMERS[ uid ];\r
                                                delete X_EventDispatcher_LAZY_TIMERS[ uid ];\r
-                                               /*\r
-                                               listeners = eventDispatcher[ '_listeners' ];\r
-                                               if( listeners && !listeners[ X_Listeners_.DISPATCHING ] && listeners[ X_Listeners_.KILL_RESERVED ] ){\r
-                                                       for( uid in X_EventDispatcher_LAZY_TIMERS ){\r
-                                                               if( X_EventDispatcher_LAZY_TIMERS[ uid ] === eventDispatcher ){\r
-                                                                       lazy = true;\r
-                                                                       break;\r
-                                                               };\r
-                                                       };                                              \r
-                                                       !lazy && eventDispatcher[ 'kill' ]();\r
-                                               }; */\r
                                        };\r
                                        \r
                                        !X_Timer_skipUpdate && ( q.last <= X_Timer_waitTime || l === 1 ) && X_Timer_update();\r
@@ -284,6 +285,7 @@ X[ 'Timer' ] = {
                                };\r
                        };                              \r
                };\r
+               return 0;\r
        };\r
 \r
 if( X_UA[ 'IE4' ] || X_UA[ 'MacIE' ] ){\r
@@ -423,10 +425,10 @@ function X_Timer_onEnterFrame( time ){
        \r
        if( X_Timer_removal && X_Timer_removal[ q.uid ] ) continue;\r
        \r
-               if( q.k ){\r
+               if( q.kind ){\r
                        X_Callback_proxyCallback( q, args || ( args = [ time ] ) );\r
                } else {\r
-                       q( time );\r
+                       q.func( time );\r
                };\r
     };\r
 \r
index 0684d3f..a6eddb8 100644 (file)
@@ -12,8 +12,8 @@ var X_ViewPort_readyState,
        X_Dom_detectFontSize = !( X_UA[ 'IE' ] < 9 || X_UA[ 'iOS' ] ) && function(){
                        var size = X_Node_fontSizeNode[ '_rawObject' ].offsetHeight;
                        if( X_ViewPort_baseFontSize !== size ){
-                               X_ViewPort_baseFontSize && X_ViewPort[ 'asyncDispatch' ]( X_EVENT_BASE_FONT_RESIZED );
                                X_ViewPort_baseFontSize = size;
+                               X_ViewPort_baseFontSize && X_ViewPort[ 'asyncDispatch' ]( X_EVENT_BASE_FONT_RESIZED );
                        };
        },
 
index c0bb170..b432339 100644 (file)
@@ -1195,9 +1195,7 @@ function X_Node_text( text ){
 function X_Node_call( name /*, opt_args... */ ){\r
        var l = arguments.length - 1,\r
                raw, func, args, params, i;\r
-               \r
-       X_Node_updateTimerID && X_Node_startUpdate();\r
-       \r
+\r
        switch( name ){\r
                case 'nodeType' :\r
                        return this[ '_tag' ] ? 1 : 3;\r
@@ -1213,13 +1211,12 @@ function X_Node_call( name /*, opt_args... */ ){
                        return v;\r
                case 'fontSize' :\r
                        return X_Node_CSS_getCharSize( this );\r
-               case 'GPU' :\r
-                       return this[ '_flags' ] & X_Node_State.GPU_NOW ? 'NOW' :\r
-                               this[ '_flags' ] & X_Node_State.GPU_RELEASE_RESERVED ? '解除予約' : '';\r
                case 'inGPU' :\r
                        return !!( this[ '_flags' ] & ( X_Node_State.GPU_NOW | X_Node_State.GPU_RELEASE_RESERVED ) );\r
        };\r
        \r
+       X_Node_updateTimerID && X_Node_startUpdate();\r
+       \r
        raw  = this[ '_rawObject' ] || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this );\r
        if( !raw ) return;\r
        \r
@@ -1330,6 +1327,8 @@ function X_Node_startUpdate( time ){
        if( time ){\r
                // X.Timer 経由でないと発火しない このイベントでサイズを取ると無限ループに\r
                X_System[ '_listeners' ] && X_System[ '_listeners' ][ X_EVENT_UPDATED ] && X_System[ 'dispatch' ]( X_EVENT_UPDATED );   \r
+       } else {\r
+               X_System[ '_listeners' ] && X_System[ '_listeners' ][ X_EVENT_UPDATED ] && X_System[ 'asyncDispatch' ]( X_EVENT_UPDATED );\r
        };\r
        \r
        X_ViewPort[ '_listeners' ] && X_ViewPort[ '_listeners' ][ X_EVENT_AFTER_UPDATE ] && X_ViewPort[ 'asyncDispatch' ]( X_EVENT_AFTER_UPDATE );\r
index e68b852..56c8adf 100644 (file)
@@ -61,6 +61,8 @@ var X_Node_ANIMATIONS            = [],
        X_Node_Anime_reserved        = false,\r
        X_Node_Anime_updateTimerID   = 0,\r
        X_Node_Anime_needsDetection  = false,\r
+       X_Node_Anime_onTransition    = false,\r
+       \r
        X_Node_Anime_hasTransform    = !!X_Node_CSS_VENDER_PREFIX[ 'transform' ],\r
        /* Opera mobile で  translateZ(0) が有効だと XY が 0 0 になる */\r
        /* GPUレイヤーにいる間に要素のコンテンツを変更をすると transitionend が動かなくなるっぽい Mac safari と firefox, 手当てが済むまでここは常に false */\r
@@ -70,8 +72,7 @@ var X_Node_ANIMATIONS            = [],
        X_Node_Anime_transitionProps = X_Node_Anime_hasTransform ? X_Node_CSS_VENDER_PREFIX[ 'transform' ] : 'left,top',\r
        // transitionEnd イベント中に要素の更新( X_Node_startUpdate() )ができるか?\r
        // iOS3+4 では可能、iOS6.1.5 で不可。TODO iOS5 及び他の環境で調査。ダメな場合、anime.html が正しく描画されない。\r
-       X_Node_updateOnTransitionEnd = X_UA[ 'iOS' ] < 6,\r
-       X_Node_Anime_onTransition    = false;\r
+       X_Node_updateOnTransitionEnd = X_UA[ 'iOS' ] < 6;\r
 \r
 // gpu化だけ transformX , willChange\r
 // 終了位置の変更\r
@@ -123,10 +124,19 @@ Node.prototype[ 'animate' ] = function( start, dest, duration, easing, wait ){
                \r
                X_Node_Anime_reserveUpdate( true );\r
        } else {\r
-               X_System[ 'unlisten' ]( X_EVENT_UPDATED, X_Node_Anime_updateAnimationsNoTransition );\r
-               X_Node_Anime_updateTimerID || ( X_Node_Anime_updateTimerID = X_Timer_requestFrame( X_Node_Anime_updateAnimationsNoTransition ) );\r
+               if( !X_Node_Anime_reserved ){\r
+                       X_Node_Anime_reserved = true;\r
+                       if( X_Node_updateTimerID ){\r
+                               X_System[ 'listen' ]( X_EVENT_UPDATED, X_Node_Anime_updateAnimationsNoTransition );\r
+                               X_Node_Anime_updateTimerID && X_Timer_cancelFrame( X_Node_Anime_updateTimerID );\r
+                               X_Node_Anime_updateTimerID = 0;\r
+                       } else {\r
+                               X_System[ 'unlisten' ]( X_EVENT_UPDATED, X_Node_Anime_updateAnimationsNoTransition );\r
+                               X_Node_Anime_updateTimerID = X_Timer_requestFrame( X_Node_Anime_updateAnimationsNoTransition );\r
+                       };\r
+               };\r
                \r
-               isNew && this[ 'dispatch' ]( { type : X_EVENT_ANIME_START, gpu : false } );\r
+               isNew && this[ 'dispatch' ]( { type : X_EVENT_ANIME_START, 'gpu' : false } );\r
        };\r
        \r
        // console.log( 'animate() ' + this[ '_id' ] + ' y:' + obj.startY + ' > ' + obj.destY + ' d:' + obj.duration );\r
@@ -146,7 +156,7 @@ Node.prototype[ 'stop' ] = function(){
        } else {\r
                X_Node_ANIMATIONS.splice( X_Node_ANIMATIONS.indexOf( this ), 1 );\r
                //obj.gpuTimerID && X_Timer_remove( obj.gpuTimerID );\r
-               delete this[ '_anime' ];                \r
+               delete this[ '_anime' ];\r
        };\r
        return this;\r
 };\r
@@ -294,7 +304,7 @@ function X_Node_Anime_updateAnimation( xnode ){
                        //console.log( '開始位置 ' + phase );\r
                        X_Node_Anime_updatePosition( xnode, obj.startX, obj.startY, obj.startA, phase === 8 );\r
                        \r
-                       xnode[ 'dispatch' ]( { type : X_EVENT_ANIME_START, gpu : phase === 8 } );\r
+                       xnode[ 'dispatch' ]( { type : X_EVENT_ANIME_START, 'gpu' : phase === 8 } );\r
                        ++obj.phase;\r
                        break;\r
                case  1 :\r
@@ -320,7 +330,7 @@ function X_Node_Anime_updateAnimation( xnode ){
                        obj.phase = obj.gpuParent ? 10 : 4;\r
                        // このタイミングで animation 関連の css を削除したところ(X_Node_Anime_clearTransition)、iOS3、4 で再描画忘れが度々起きるように、、、\r
                        if( !obj.gpuParent ) X_Node_Anime_clearTransition( xnode );\r
-                       xnode[ 'dispatch' ]( { type : X_EVENT_ANIME_END, gpu : obj.gpuParent } );\r
+                       xnode[ 'dispatch' ]( { type : X_EVENT_ANIME_END, 'gpu' : obj.gpuParent } );\r
                        break;\r
 \r
                case 4 :\r
@@ -355,7 +365,7 @@ function X_Node_Anime_updateAnimation( xnode ){
                                X_Node_Anime_clearTransition( xnode );\r
                                X_Node_Anime_updatePosition( xnode, obj.destX, obj.destY, obj.destA, phase === 14 );\r
                                obj.phase = phase === 14 ? 10 : 4;\r
-                               xnode[ 'dispatch' ]( { type : X_EVENT_ANIME_END, gpu : obj.gpuParent } );\r
+                               xnode[ 'dispatch' ]( { type : X_EVENT_ANIME_END, 'gpu' : obj.gpuParent } );\r
                        } else {\r
                                current = X_Node_Anime_getComputedPosition( xnode );\r
                                obj.startX    = current.x;\r
@@ -419,7 +429,7 @@ function X_Node_Anime_onTransitionEnd( e ){
        this[ '_anime' ].phase = 3;\r
        \r
        X_Node_Anime_onTransition = true;\r
-       this[ 'dispatch' ]( { type : X_EVENT_ANIME_END, gpu : this[ '_anime' ].gpuParent } );\r
+       this[ 'dispatch' ]( { type : X_EVENT_ANIME_END, 'gpu' : this[ '_anime' ].gpuParent } );\r
        X_Node_Anime_onTransition = false;\r
        \r
        X_Node_Anime_needsDetection = true;\r
@@ -448,7 +458,7 @@ function X_Node_Anime_releaseGPULayer(){
 \r
 function X_Node_Anime_gpuReleased(){\r
        //console.log( 'GPU レイヤーが解放されました' );\r
-       this[ 'dispatch' ]( { type : X_EVENT_GPU_RELEASED, gpu : true } );\r
+       this[ 'dispatch' ]( { type : X_EVENT_GPU_RELEASED, 'gpu' : true } );\r
 };\r
 \r
 function X_Node_Anime_clearTransition( xnode ){\r
@@ -504,7 +514,7 @@ function X_Node_Anime_updatePosition( xnode, x, y, opacity, useGPU ){
        };\r
 };\r
 \r
-function X_Node_Anime_updateAnimationsNoTransition(){\r
+function X_Node_Anime_updateAnimationsNoTransition( e ){\r
        var i = X_Node_ANIMATIONS.length,\r
                now = X_Timer_now(),\r
                obj,\r
@@ -522,7 +532,7 @@ function X_Node_Anime_updateAnimationsNoTransition(){
                        X_Node_ANIMATIONS.splice( i, 1 );\r
                        \r
                        // filter な 親が解除されないと子要素への filter が反映されない\r
-                       xnode[ 'asyncDispatch' ]( { type : X_EVENT_ANIME_END, gpu : false } );\r
+                       xnode[ 'asyncDispatch' ]( { type : X_EVENT_ANIME_END, 'gpu' : false } );\r
                } else {\r
                        easing = obj.easing.fn( ( now - obj.startTime ) / obj.duration );\r
                        newX   = ( obj.destX - obj.startX ) * easing + obj.startX;\r
@@ -536,14 +546,21 @@ function X_Node_Anime_updateAnimationsNoTransition(){
                };\r
        };\r
        \r
-       if( c ){\r
+       c && console.log( 'anime... ' + X_Node_updateTimerID );\r
+       \r
+       if( X_Node_Anime_reserved = c ){\r
                if( X_Node_updateTimerID ){\r
-                       X_System[ 'listen' ]( X_EVENT_UPDATED, X_Node_Anime_updateAnimationsNoTransition );\r
+                       // scrollbox では X_System X_EVENT_UPDATED は不可。。。\r
+                       !e || e.type !== X_EVENT_UPDATED ?\r
+                               X_System[ 'listen' ]( X_EVENT_UPDATED, X_Node_Anime_updateAnimationsNoTransition ) :\r
+                               X_Node_Anime_updateTimerID && X_Timer_cancelFrame( X_Node_Anime_updateTimerID );\r
                        X_Node_Anime_updateTimerID = 0;\r
                } else {\r
+                       X_System[ 'unlisten' ]( X_EVENT_UPDATED, X_Node_Anime_updateAnimationsNoTransition );\r
                        X_Node_Anime_updateTimerID = X_Timer_requestFrame( X_Node_Anime_updateAnimationsNoTransition );\r
                };\r
        } else {\r
+               X_System[ 'unlisten' ]( X_EVENT_UPDATED, X_Node_Anime_updateAnimationsNoTransition );\r
                X_Node_Anime_updateTimerID = 0;\r
        };\r
 };\r
index 4eb6988..4f3ca4a 100644 (file)
@@ -33,6 +33,8 @@ Android1.6- の XHR で 401 エラーが返った場合は、iframe に xml を
 var // Opera7.6+, Safari1.2+, khtml3.?+, Gecko0.9.7+\r
        // ie7 ではローカルリソースには ActiveX の XHR を使う\r
        X_Net_XHR_W3C      = ( !X_UA[ 'IE7' ] || !X_URL_IS_LOCAL ) && window[ 'XMLHttpRequest' ] && new XMLHttpRequest(),\r
+       X_Net_XHR_progress = false && X_Net_XHR_W3C && X_Net_XHR_W3C.onprogress !== undefined,\r
+       X_Net_XHR_upload   = false && X_Net_XHR_W3C && !!X_Net_XHR_W3C.upload,\r
        \r
        X_Net_XHR_X_DOMAIN = window[ 'XDomainRequest' ] && new XDomainRequest(),\r
        X_Net_XHR_VERSION  = 0,\r
@@ -64,11 +66,13 @@ X[ 'Net' ][ 'XHR' ] = {
  */\r
        'FLASH'       : false,\r
 \r
-// https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\r
-// Progress Events     Chrome7, firefox3.5, ie10, opera12, Safari?, Chrome for Android 0.16\r
-       'PROGRESS'    : false, //\r
+/**\r
+ * https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\r
+ * Progress Events     Chrome7, firefox3.5, ie10, opera12, Safari?, Chrome for Android 0.16\r
+ */\r
+       'PROGRESS'    : X_Net_XHR_progress, //\r
 \r
-       'UL_PROGRESS' : false,\r
+       'UL_PROGRESS' : X_Net_XHR_upload,\r
 \r
        'CORS'        : X_Net_XHR_X_DOMAIN || ( X_Net_XHR_W3C && X_Net_XHR_W3C.withCredentials !== undefined )\r
 };\r
@@ -191,8 +195,11 @@ if( X_Net_XHR_W3C || X_Net_XHR_ACTIVE_X ){
                                if( !X_Net_XHR_ACTIVE_X && X_Type_isFunction( raw.setRequestHeader ) ){\r
                                        \r
                                        // http://nakigao.sitemix.jp/blog/?p=2040\r
-                                       // SafariでHTTP/412のエラー\r
-                                       // headers[ 'If-Modified-Since' ] = ( new Date ).toUTCString();\r
+                                       // json 取得時に SafariでHTTP/412のエラー。但し相手が audio の場合、この指定があるとロードに失敗する。 iOS8.2, iOS7.1 では遭遇せず\r
+                                       if( this._type === 'json' ){\r
+                                               console.log( 'If-Modified-Since : ' + this._type );\r
+                                               headers[ 'If-Modified-Since' ] = ( new Date ).toUTCString();\r
+                                       };\r
                                        \r
                                        for( p in headers ){\r
                                                if( X_EMPTY_OBJECT[ p ] ) continue;\r
@@ -247,9 +254,18 @@ if( X_Net_XHR_W3C || X_Net_XHR_ACTIVE_X ){
                                // Timeout した Gecko の xhr.response に触るとエラー??\r
                                if( X_UA[ 'Opera' ] || X_UA[ 'Webkit' ]  || X_UA[ 'Gecko' ] ){\r
                                        if( this._error ){\r
+                                               \r
+                                               if( X_Net_XHR_upload ){\r
+                                                       this[ '_rawObject' ].upload.removeEventListener( 'progress', X_NET_XHRWrapper.onUploadProgress );\r
+                                               };\r
+                                                                                       \r
                                                X_EventDispatcher_toggleAllEvents( this, false );\r
                                                this[ '_rawObject' ] = new XMLHttpRequest();\r
                                                X_EventDispatcher_toggleAllEvents( this, true );\r
+                                               \r
+                                               if( X_Net_XHR_upload ){\r
+                                                       this[ '_rawObject' ].upload.addEventListener( 'progress', X_NET_XHRWrapper.onUploadProgress );\r
+                                               };\r
                                        };\r
                                };\r
 \r
@@ -398,7 +414,7 @@ if( X_Net_XHR_W3C || X_Net_XHR_ACTIVE_X ){
                                this._timerID = 0;\r
                        },\r
                        \r
-                       onUploadProgress : X[ 'Net' ][ 'XHR' ][ 'UL_PROGRESS' ] && function( e ){\r
+                       onUploadProgress : X_Net_XHR_upload && function( e ){\r
                                var raw  = X_NET_XHRWrapper[ '_rawObject' ].upload,\r
                                        live = !X_NET_XHRWrapper._canceled,\r
                                        states, data;\r
@@ -421,13 +437,13 @@ if( X_Net_XHR_W3C || X_Net_XHR_ACTIVE_X ){
        if( X_Net_XHR_ACTIVE_X ){ // win ie5-6\r
                X_NET_XHRWrapper[ 'listen' ]( 'readystatechange' );\r
        } else \r
-       if( X[ 'Net' ][ 'XHR' ][ 'PROGRESS' ] ){\r
+       if( X_Net_XHR_progress ){\r
                X_NET_XHRWrapper[ 'listen' ]( [ 'load', 'progress', 'error', 'timeout' ] ); //, 'abort'\r
        } else {\r
                X_NET_XHRWrapper[ 'listen' ]( [ 'load', 'readystatechange', 'error', 'timeout' ] ); //, 'abort'\r
        };\r
        \r
-       if( X_NET_XHRWrapper.onUploadProgress ){\r
+       if( X_Net_XHR_upload ){\r
                X_NET_XHRWrapper[ '_rawObject' ].upload.addEventListener( 'progress', X_NET_XHRWrapper.onUploadProgress );\r
        };\r
 };\r
index 905ffd1..8a5e1ed 100644 (file)
@@ -324,6 +324,14 @@ if( X_Audio_WebAudio_context ){
                }
        );
 
+       /*
+        * http://qiita.com/sou/items/5688d4e7d3a37b4e2ff1
+        * L-01F 等の一部端末で Web Audio API の再生結果に特定条件下でノイズが混ざることがある。
+        * 描画レート(描画 FPS)が下がるとノイズが混ざり始め、レートを上げると再生結果が正常になるというもので、オーディオ処理が描画スレッドに巻き込まれているような動作を見せる。
+        */
+       if( X_UA[ 'Android' ] && X_UA[ 'Chrome' ] ){
+               X_Node_systemNode.create( 'div', { id : 'fps-slowdown-make-sound-noisy' } );
+       };
 
        X_Audio_BACKENDS.push(
                {
index 0191bb0..cd5e4f4 100644 (file)
@@ -140,10 +140,6 @@ X.UI._ScrollBox = X.UI._ChromeBox.inherits(
                                        X_UI_rootData[ 'listenOnce' ]( X.UI.Event.LAYOUT_COMPLETE, this, X_UI_ScrollBox_onLayoutComplete );\r
                                };\r
                },\r
-               \r
-               scrollBy : function( x, y, opt_time, opt_easing ){\r
-                       this.scrollTo( this.scrollX + x, this.scrollY + y, opt_time, opt_easing );\r
-               },\r
        \r
                scrollTo : function( x, y, opt_time, opt_easing, opt_release ){\r
                        //if( this.scrollX === x && this.scrollY === y ) return;\r
@@ -175,8 +171,8 @@ function X_UI_ScrollBox_onLayoutComplete( e ){
        // scroll の停止、GPU の解除\r
        var font = this.fontSize = this._containerXNode.call( 'fontSize' );\r
        \r
-       this.maxScrollX = ( this.boxWidth  - this._containerNode.boxWidth ) * font;\r
-       this.maxScrollY = ( this.boxHeight - this._containerNode.boxHeight ) * font;\r
+       this.maxScrollX = ( this.boxWidth  - this._containerNode.boxWidth ) * font | 0;\r
+       this.maxScrollY = ( this.boxHeight - this._containerNode.boxHeight ) * font | 0;\r
 \r
        this.hasHScroll = this.scrollXEnabled && this.maxScrollX < 0;\r
        this.hasVScroll = this.scrollYEnabled && this.maxScrollY < 0;\r
@@ -395,7 +391,7 @@ function X_UI_ScrollBox_onEnd( e ){
                easing = '',\r
                newX, newY,\r
                momentumX, momentumY,\r
-               duration, distanceX, distanceY, font;\r
+               duration, distanceX, distanceY;\r
                                                \r
        this[ 'unlisten' ]( X.UI.Event._POINTER_MOVE, this, X_UI_ScrollBox_onMove );\r
        this[ 'unlisten' ]( [ X.UI.Event._POINTER_UP, X.UI.Event._POINTER_CANCEL ], this, X_UI_ScrollBox_onEnd );\r
@@ -422,24 +418,24 @@ function X_UI_ScrollBox_onEnd( e ){
        // we scrolled less than 10 pixels\r
        if( !this.moved ){\r
                // this[ 'dispatch' ]( X_EVENT_CANCELED );\r
+               console.log( 'we scrolled less than 10 pixels' );\r
                return ret;\r
        };\r
 \r
        // start momentum animation if needed\r
        if( this.momentumEnabled && duration < 300 ){\r
-               font = this.fontSize;\r
                momentumX = this.hasHScroll ?\r
-                                               X_UI_ScrollBox_momentum( this.scrollX, this.startX, duration, this.maxScrollX, this.bounceEnabled ? this.boxWidth  * font : 0, this.deceleration ) :\r
+                                               X_UI_ScrollBox_momentum( this.scrollX, this.startX, duration, this.maxScrollX, this.bounceEnabled ? this.boxWidth  * this.fontSize : 0, this.deceleration ) :\r
                                                { destination: newX, duration: 0 };\r
                momentumY = this.hasVScroll   ?\r
-                                               X_UI_ScrollBox_momentum( this.scrollY, this.startY, duration, this.maxScrollY, this.bounceEnabled ? this.boxHeight * font : 0, this.deceleration ) :\r
+                                               X_UI_ScrollBox_momentum( this.scrollY, this.startY, duration, this.maxScrollY, this.bounceEnabled ? this.boxHeight * this.fontSize : 0, this.deceleration ) :\r
                                                { destination: newY, duration: 0 };\r
                newX = momentumX.destination;\r
                newY = momentumY.destination;\r
                time = Math.max( momentumX.duration, momentumY.duration ) | 0;\r
                this.isInTransition = true;\r
        } else {\r
-               //console.log( '慣性無し' );\r
+               console.log( '慣性無し' );\r
        };\r
 \r
        if( newX != this.scrollX || newY != this.scrollY ){\r
@@ -448,12 +444,12 @@ function X_UI_ScrollBox_onEnd( e ){
                        easing = 'quadratic';\r
                };\r
 \r
-               //console.log( 'end2 x:' + newX + ' y:' + newY + ' t:' + time );\r
+               console.log( 'end2 x:' + newX + ' y:' + newY + ' t:' + time );\r
                this.scrollTo( newX, newY, time, easing, 1000 );\r
                return ret;\r
        };\r
 \r
-       //console.log( 'end1 x:' + newX + ' y:' + newY );\r
+       console.log( 'end1 x:' + newX + ' y:' + newY );\r
        this.scrollTo( newX, newY, 0, '', 1000 );       // ensures that the last position is rounded\r
 \r
        this[ 'dispatch' ]( X.UI.Event.SCROLL_END );\r
@@ -482,7 +478,7 @@ function X_UI_ScrollBox_resetPosition( that, time ){
        };\r
 \r
        if( x === that.scrollX && y === that.scrollY ){\r
-               //console.log( 'no バウンド y:' + y + ' max:' + that.maxScrollY );\r
+               console.log( 'no バウンド y:' + y + ' max:' + that.maxScrollY );\r
                return false;\r
        };\r
 \r
@@ -497,7 +493,6 @@ function X_UI_ScrollBox_onAnimeEnd( e ){
        if( e.target !== this._containerXNode || !this.isInTransition ){\r
                return X_Callback_NONE;\r
        };\r
-       //this.xnodeScroller.stop();\r
        if( !X_UI_ScrollBox_resetPosition( this, this.bounceTime ) ){\r
                this.isInTransition = false;\r
                this.dispatch( X.UI.Event.SCROLL_END );\r
index 8890fd4..26ce539 100644 (file)
@@ -2,7 +2,7 @@ var X_UI_rootData  = null,
        X_UI_eventBusy = false;
 
 function X_UI_eventRellay( e ){
-       var font    = X[ 'ViewPort' ][ 'getBaseFontSize' ](),
+       var font    = X_ViewPort_baseFontSize,
                x       = e.clientX / font,
                y       = e.clientY / font,
                type    = X.UI.Event.NameToID[ e.type ],
@@ -114,7 +114,7 @@ X.UI._PageRoot = X.UI._Box.inherits(
                        } );
                        
                        // hover や rollover rollout のための move イベントの追加
-                       this.xnodeInteractiveLayer[ 'listen' ]( 'pointermove', X_UI_eventRellay );
+                       ( X.UA.IE < 9 ? X_ViewPort_document : X_ViewPort )[ 'listen' ]( 'pointermove', X_UI_eventRellay );
                        if( counter[ X.UI.Event._POINTER_MOVE ] ){
                                ++counter[ X.UI.Event._POINTER_MOVE ];
                        } else {