OSDN Git Service

fix X.Type.isHTMLElement for NetFront.
authoritozyun <itozyun@user.sourceforge.jp>
Thu, 23 Oct 2014 11:34:38 +0000 (20:34 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Thu, 23 Oct 2014 11:34:38 +0000 (20:34 +0900)
12 files changed:
0.6.x/js/01_core/01_X.js
0.6.x/js/01_core/03_XType.js
0.6.x/js/01_core/13_XEventDispatcher.js
0.6.x/js/01_core/14_XTimer.js
0.6.x/js/01_core/15_XSystem.js
0.6.x/js/01_core/16_XViewPort.js
0.6.x/js/02_dom/03_XDomEvent.js
0.6.x/js/02_dom/10_XNodeAnime.js [new file with mode: 0644]
0.6.x/js/06_net/02_XNetJSONP.js
0.6.x/js/06_net/04_XNetImage.js
0.6.x/js/07_audio/01_XHTML5Audio.js
0.6.x/js/import.js

index 7655eee..f46ae28 100644 (file)
@@ -1,4 +1,4 @@
-\r
+//{+DEV\r
 if( !window['console'] || ( window.parent && window.parent.log ) )\r
        console = { log : function(a){\r
                var win, elm;\r
@@ -8,6 +8,7 @@ if( !window['console'] || ( window.parent && window.parent.log ) )
                        elm && ( elm.innerHTML = a + '<br>' + elm.innerHTML );\r
                };\r
        } };\r
+//+DEV}\r
 \r
 var undefined,\r
        X_EMPTY_OBJECT = {},\r
index f3ede40..acc1b42 100644 (file)
@@ -50,6 +50,8 @@ X.Type = {
                new Function( 'v',\r
                        ( X_UA.IE4 || X_UA.MacIE ) ?\r
                                'return v&&v.tagName&&v.insertAdjacentHTML&&true' : // ie4 or MacIE5.23, v.all <- error\r
+                       X_UA.NetFront < 4 ?\r
+                               'return v&&v.nodeType===1' : // instanceof not a function.                      \r
                        window[ 'HTMLElement' ] ?\r
                                'return v instanceof HTMLElement' :\r
                        //window[ 'Element' ] ?\r
index 1aaadc5..8b29138 100644 (file)
@@ -515,13 +515,14 @@ var X_EventDispatcher_actualAddEvent =
                        if( that._isSilverlight ){\r
                                list.slcallback = X_Callback_create( that, X_EventDispatcher_sliverLightDispatch, [ type ] );\r
                                list.sltoken    = raw.AddEventListener( type, list.slcallback );\r
+                       } else\r
+                       if( X.UA.iOS && type === 'webkitTransitionEnd' ){\r
+                               raw.addEventListener( type, X_EventDispatcher_iOSTransitionEndDispatch, false );\r
                        } else {\r
                                console.log( 'event > ' + type );\r
                                that._handleEvent || ( that._handleEvent = X_Callback_create( that, X_EventDispatcher_actualHandleEvent ) );\r
                                \r
-                               if( X.UA.iOS && type === 'webkitTransitionEnd' ){\r
-                                       raw.addEventListener( type, X_EventDispatcher_iOS3transitionEndDispatch, false );\r
-                               } else\r
+\r
                                if( raw.addEventListener ){\r
                                        raw.addEventListener( type, that._handleEvent, false );\r
                                } else {\r
@@ -569,7 +570,7 @@ var X_EventDispatcher_actualAddEvent =
  * 参照できていない問題に遭遇、、、iOS3.1.3 & iOS6.1.5 で確認\r
  * animation も怪しい、、、\r
  */\r
-function X_EventDispatcher_iOS3transitionEndDispatch( e ){\r
+function X_EventDispatcher_iOSTransitionEndDispatch( e ){\r
        return X_Node_getXNode( this ).dispatch( X_Event_RenameTo[ e.type ] );\r
 };\r
 \r
@@ -606,10 +607,11 @@ var X_EventDispatcher_actualRemoveEvent =
                                X_Callback_correct( list.slcallback );\r
                                delete list.sltoken;\r
                                delete list.slcallback;\r
+                       } else\r
+                       if( X.UA.iOS && type === 'webkitTransitionEnd' ){\r
+                               raw.removeEventListener( type, X_EventDispatcher_iOSTransitionEndDispatch, false );\r
                        } else {\r
-                               if( X.UA.iOS && type === 'webkitTransitionEnd' ){\r
-                                       raw.removeEventListener( type, X_EventDispatcher_iOS3transitionEndDispatch, false );\r
-                               } else                          \r
+                                                               \r
                                if( raw.addEventListener ){\r
                                        raw.removeEventListener( type, that._handleEvent, false );\r
                                } else {\r
index be20ccc..242f18e 100644 (file)
@@ -38,14 +38,17 @@ var X_Timer_now = Date.now || function(){ return +new Date; },
 \r
        X_Timer_SET_TIMEOUT   = window.setTimeout,\r
        X_Timer_CLEAR_TIMEOUT = window.clearTimeout,\r
-       \r
+\r
+       // http://uupaa.hatenablog.com/entry/2012/02/01/083607\r
+       // Firefox 4 partial (request only), Mobile Firefox5 ready (request only), Firefox 11 ready (cancel impl)       \r
        X_Timer_REQ_ANIME_FRAME =\r
                window.requestAnimationFrame ||\r
                window.webkitRequestAnimationFrame ||\r
-               window.mozRequestAnimationFrame ||\r
+               window.mozRequestAnimationFrame && window.mozCancelRequestAnimationFrame ||\r
                window.oRequestAnimationFrame ||\r
                window.msRequestAnimationFrame ||\r
                false,\r
+\r
        X_Timer_CANCEL_ANIME_FRAME =\r
                window.cancelRequestAnimationFrame ||\r
                window.webkitCancelAnimationFrame ||\r
index 0331531..3345d1b 100644 (file)
@@ -1,16 +1,50 @@
 \r
+var \r
+       X_System_postMessageAccessKey = window.postMessage ? Math.random() * 10000 | 0 : 0,\r
+       \r
+       X_System_MESSAGE_RECIVERS = X_System_postMessageAccessKey && {},\r
 \r
-var X_System = X_Class_override(\r
-       new X.EventDispatcher(),\r
-       {\r
-               monitor : function(){\r
+       X_System = X_Class_override(\r
+               new X.EventDispatcher(),\r
+               {\r
+                       monitor : function(){\r
+                               \r
+                       },\r
+                       \r
+                       gc : function(){\r
+                               \r
+                       },\r
                        \r
-               },\r
-               \r
-               gc : function(){\r
+                       message : function( name, callback ){\r
+                               var key = Math.random() * 10000 | 0;\r
+                               if( !X_System_postMessageAccessKey ) return;\r
+                               // name にスペースは含まない\r
+                               X_System_MESSAGE_RECIVERS[ name + key ] = callback;\r
+                               X_ViewPort.listen( 'message', X_System );\r
+                               \r
+                               return X_System_postMessageAccessKey + '-' + name + key;\r
+                       },\r
                        \r
+                       handleEvent : function( e ){\r
+                               var i, _i, name;\r
+                               switch( e ){\r
+                                       case 'message' :\r
+                                               if( e.origin === X.URL.BASE_URL ){\r
+                                                       i = e.data.indexOf( '-' );\r
+                                                       console.log( 'msg ||| ' + e.data.substr( 0, i ) );\r
+                                                       if( e.data.substr( 0, i ) == X_System_postMessageAccessKey ){\r
+                                                               name = e.data.substr( i, _i = e.data.indexOf( ' ' ) );\r
+                                                               if( X_System_MESSAGE_RECIVERS[ name ] ){\r
+                                                                       X_System_MESSAGE_RECIVERS[ name ]( e.data.substr( _i + name.length ) );\r
+                                                               };\r
+                                                       };\r
+                                               };\r
+                                               console.log( e.origin + ' ' + X.URL.BASE_URL );\r
+                                               \r
+                                               return X_Callback_PREVENT_DEFAULT | X_Callback_STOP_PROPAGATION;\r
+                               };\r
+                       }\r
                }\r
-       }\r
 ),\r
 \r
 X_System_javascriptScore;\r
index 6eb62df..61c898f 100644 (file)
@@ -25,15 +25,14 @@ var X_ViewPort_readyState,
        },
        
        X_ViewPort_document = new X.EventDispatcher( document ),
-       
-       X_ViewPort_postMessageAccessKey = Math.random() * 10000 | 0,
 
 X_ViewPort = X_Class_override(
        new X.EventDispatcher( window ),
        {
 
                handleEvent : function( e ){
-                       var href;
+                       var href, i, name;
+                       
                        switch( e.type ){
                                case 'beforeunload' :
                                        // ie では a href="javascript" な要素でも beforeunload が起こる
@@ -73,15 +72,6 @@ X_ViewPort = X_Class_override(
                                                X_ViewPort.asyncDispatch( X.Event.VIEW_DEACTIVATE );                                            
                                        };
                                        break;
-                               
-                               // TODO
-                               case 'message' :
-                                       if( e.origin !== X.URL.BASE_URL ){
-                                               
-                                       } else {
-                                               e.data;
-                                       };
-                                       break;
                        };
                }
                
@@ -272,6 +262,8 @@ X.ViewPort = {
                X_TEMP.onDomContentLoaded = function(){
                        var s, size, elmHtml, elmHead, elmBody, html, head, body;
                        
+                       console.log( '> X_TEMP.onDomContentLoaded rs:' + X_ViewPort_readyState );
+                       
                        if( X_TEMP.SYSTEM_EVENT_PRE_INIT <= X_ViewPort_readyState ) return X_Callback_UN_LISTEN;
                        X_ViewPort_readyState = X_TEMP.SYSTEM_EVENT_PRE_INIT;
                        
@@ -372,7 +364,7 @@ X.ViewPort = {
                                X_ViewPort.asyncDispatch( { type : X.Event.XDOM_READY, w : X_ViewPort_width = size[ 0 ], h : X_ViewPort_height = size[ 1 ] } );
                        } );
 
-                       console.log( X_ViewPort.asyncDispatch( X_TEMP.SYSTEM_EVENT_PRE_INIT ) );        
+                       X_ViewPort.asyncDispatch( X_TEMP.SYSTEM_EVENT_PRE_INIT );       
 
 
                        X_EventDispatcher_systemListen( X_ViewPort, [ 'beforeunload', 'unload' ] );
index ec27fb1..3b1c59e 100644 (file)
@@ -29,6 +29,18 @@ if( !X_UA.IE || 9 <= X_UA.IE ){
                //this._event        = e;\r
                this.type          = type = X_Event_RenameTo[ originalType ] || originalType;\r
                \r
+               switch( type ){\r
+                       case 'message' :\r
+                               this.data   = e.data;\r
+                               this.origin = e.origin;\r
+                               this.source = e.source;\r
+                               break;\r
+                       case 'progress' :\r
+                               this.loaded = e.loaded;\r
+                               this.total  = e.total;\r
+                               break;\r
+               };\r
+               \r
                //console.log( 'original : ' + originalType + ' > ' + type );\r
                // http://msdn.microsoft.com/ja-jp/library/ie/dn304886%28v=vs.85%29.aspx\r
                // ポインター イベントの更新\r
@@ -257,6 +269,19 @@ if( !X_UA.IE || 9 <= X_UA.IE ){
                this.ctrlKey       = e.ctrlKey;\r
                this.shiftKey      = e.shiftKey;                \r
 \r
+               \r
+               switch( this.type ){\r
+                       case 'message' :\r
+                               this.data   = e.data;\r
+                               this.origin = e.origin;\r
+                               this.source = e.source;\r
+                               break;\r
+                       case 'progress' :\r
+                               this.loaded = e.loaded;\r
+                               this.total  = e.total;\r
+                               break;\r
+               };\r
+\r
                // http://www.programming-magic.com/20090127231544/\r
                switch( originalType ){\r
                        case 'click'    :\r
diff --git a/0.6.x/js/02_dom/10_XNodeAnime.js b/0.6.x/js/02_dom/10_XNodeAnime.js
new file mode 100644 (file)
index 0000000..b62a7f3
--- /dev/null
@@ -0,0 +1,410 @@
+\r
+\r
+var\r
+       ease = {\r
+               quadratic: {\r
+                       style: 'cubic-bezier(0.25, 0.46, 0.45, 0.94)',\r
+                       fn: function (k) {\r
+                               return k * ( 2 - k );\r
+                       }\r
+               },\r
+               circular: {\r
+                       style: 'cubic-bezier(0.1, 0.57, 0.1, 1)',       // Not properly "circular" but this looks better, it should be (0.075, 0.82, 0.165, 1)\r
+                       fn: function (k) {\r
+                               return Math.sqrt( 1 - ( --k * k ) );\r
+                       }\r
+               },\r
+               back: {\r
+                       style: 'cubic-bezier(0.175, 0.885, 0.32, 1.275)',\r
+                       fn: function (k) {\r
+                               var b = 4;\r
+                               return ( k = k - 1 ) * k * ( ( b + 1 ) * k + b ) + 1;\r
+                       }\r
+               },\r
+               bounce: {\r
+                       style: '',\r
+                       fn: function (k) {\r
+                               if ( ( k /= 1 ) < ( 1 / 2.75 ) ) {\r
+                                       return 7.5625 * k * k;\r
+                               } else if ( k < ( 2 / 2.75 ) ) {\r
+                                       return 7.5625 * ( k -= ( 1.5 / 2.75 ) ) * k + 0.75;\r
+                               } else if ( k < ( 2.5 / 2.75 ) ) {\r
+                                       return 7.5625 * ( k -= ( 2.25 / 2.75 ) ) * k + 0.9375;\r
+                               } else {\r
+                                       return 7.5625 * ( k -= ( 2.625 / 2.75 ) ) * k + 0.984375;\r
+                               }\r
+                       }\r
+               },\r
+               elastic: {\r
+                       style: '',\r
+                       fn: function (k) {\r
+                               var f = 0.22,\r
+                                       e = 0.4;\r
+\r
+                               if ( k === 0 ) { return 0; }\r
+                               if ( k == 1 ) { return 1; }\r
+\r
+                               return ( e * Math.pow( 2, - 10 * k ) * Math.sin( ( k - f / 4 ) * ( 2 * Math.PI ) / f ) + 1 );\r
+                       }\r
+               }\r
+       };\r
+               \r
+// 新規アニメーションが追加された場合、\r
+// tree が dirty なら AFTER_COMMIT を待つ\r
+// 1) xnode の既存アニメーションとの親子関係の調査\r
+// 親なら -> 既存アニメーションの GPU レイヤー解除\r
+// 子なら -> GPU レイヤーを設定しない\r
+// 2) 目標座標のセット\r
+// 3) アニメーション完了後も GPU レイヤーはしばらく解除しない スクロール等の連続アニメーション時に GPU 転送時間で画面ががたつくから\r
+// アニメ中の remove\r
+\r
+var X_Node_ANIMATIONS            = [],\r
+       X_Node_Anime_updateTimerID   = 0,\r
+       X_Node_Anime_needsDetection  = false,\r
+       X_Node_Anime_hasTransform    = !!X_Node_CSS_VENDER_PREFIX[ 'transform' ],\r
+       X_Node_Anime_translateZ      = X_Node_CSS_VENDER_PREFIX[ 'perspective' ] && !X.UA.OperaMobile && !X.UA.OperaTablet ? ' translateZ(0)' : '',\r
+       X_Node_Anime_hasTransition   = !!X_Node_CSS_VENDER_PREFIX[ 'transitionDelay' ] && !X.UA.Opera, // Opera12(XP,8.1) 切った方がスムース\r
+       X_Node_Anime_transitionProps = X_Node_Anime_hasTransform ? X_Node_CSS_VENDER_PREFIX[ 'transform' ] : 'left,top';\r
+\r
+Node.prototype.animate = function( start, dest, duration, easing, wait ){\r
+       var obj = this._anime || ( this._anime = {} );\r
+       \r
+       obj.duration  = X.Type.isFinite( duration ) && 0 <= duration ? duration : 500;\r
+       obj.easing    = ease[ easing ] || ease.circular;\r
+       // 現在 GPUレイヤーのtop になっているか?将来については phase で判定\r
+       obj.gpuParent = obj.gpuParent || false;\r
+       obj.phase     = duration === 0 ? 9 : 0; //\r
+       obj.wait      = X.Type.isFinite( wait ) ? wait : 1000;\r
+               \r
+       obj.startTime = X_Timer_now();\r
+       obj.startX    = start.x || 0;\r
+       obj.startY    = start.y || 0;\r
+       obj.startA    = 0 <= start.opacity && start.opacity <= 1 ? start.opacity : 1;\r
+       \r
+       obj.destTime  = obj.startTime + obj.duration;\r
+       obj.destX     = dest.x || 0;\r
+       obj.destY     = dest.y || 0;\r
+       obj.destA     = 0 <= dest.opacity && dest.opacity <= 1 ? dest.opacity : 1;\r
+\r
+       \r
+       if( obj.gpuTimerID ){\r
+               X.Timer.remove( obj.gpuTimerID );\r
+               delete obj.gpuTimerID;\r
+       };\r
+       \r
+       X_Node_Anime_needsDetection = true;\r
+       if( X_Node_Anime_hasTransition ){\r
+               X_Node_Anime_reserveUpdate();\r
+       } else {\r
+               X_Node_Anime_updateTimerID || ( X_Node_Anime_updateTimerID = X.Timer.requestFrame( X_Node_Anime_updateAnimationsNoTransition ) );               \r
+       };\r
+\r
+       X_Node_ANIMATIONS.indexOf( this ) === -1 &&\r
+               ( X_Node_ANIMATIONS[ X_Node_ANIMATIONS.length ] = this );\r
+       \r
+       return this;\r
+};\r
+\r
+Node.prototype.stop = function(){\r
+       var obj = this._anime;\r
+       if( !obj ) return;\r
+       if( X_Node_Anime_hasTransition ){\r
+               obj.phase = 99;\r
+               X_Node_Anime_needsDetection = true;\r
+               X_Node_Anime_reserveUpdate();\r
+       } 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
+       };\r
+       return this;\r
+};\r
+\r
+function X_Node_Anime_reserveUpdate(){\r
+       if( !X_Node_Anime_updateTimerID ){\r
+               // Opera12 requestAnimationFrame では transition が動かない、、、\r
+               X_Node_Anime_updateTimerID =\r
+                       X_UA.Opera ?\r
+                               X.Timer.once( 0, X_Node_Anime_updateAnimations ) :\r
+                               X.Timer.requestFrame( X_Node_Anime_updateAnimations );\r
+       };\r
+};\r
+\r
+function X_Node_Anime_updateAnimations(){\r
+       var i = X_Node_ANIMATIONS.length, ret, c = false;\r
+       \r
+       if( X_Node_Anime_needsDetection ) X_Node_Anime_detectAnimationlayers();\r
+       \r
+       for( ; i; ){\r
+               xnode = X_Node_ANIMATIONS[ --i ];\r
+               ret = X_Node_Anime_updateAnimation( xnode );\r
+               if( ret === true ){\r
+                       X_Node_ANIMATIONS.splice( i, 1 );\r
+                       xnode._anime.gpuTimerID && X.Timer.remove( xnode._anime.gpuTimerID );\r
+                       delete xnode._anime;\r
+               } else\r
+               if( ret !== false ){\r
+                       c = true;\r
+               };\r
+       };\r
+       \r
+       X_Node_Anime_updateTimerID = 0;\r
+       if( c ){\r
+               X_Node_Anime_reserveUpdate();\r
+       };\r
+};\r
+\r
+// TODO X.Timer.requestFrame 経由の BEFORE_UPDATE で更新を行う\r
+function X_Node_Anime_detectAnimationlayers(){\r
+       var i = X_Node_ANIMATIONS.length,\r
+               l = i,\r
+               j, xnode, parent, hasGPUChild, changed, remove;\r
+\r
+       for( ; i; ){\r
+               xnode = X_Node_ANIMATIONS[ --i ];\r
+               parent = hasGPUChild = false;\r
+               \r
+               for( j = l; j; ){\r
+                       _xnode = X_Node_ANIMATIONS[ --j ];\r
+                       \r
+                       if( xnode.parent === _xnode.parent ){\r
+                               continue;\r
+                       } else\r
+                       if( _xnode.contains( xnode ) ){\r
+                               if( _xnode._anime.phase === 3 || _xnode._anime.phase === 10 ){\r
+                                       _xnode._anime.phase = 15;\r
+                               } else\r
+                               if( xnode._anime.gpuParent ){\r
+                                       changed = parent = true;\r
+                                       xnode._anime.phase = xnode._anime.phase === 2 ? 6 : 15;// GPU レイヤーの解除 > アニメーションは継続, すでに終了フェイズなら破棄\r
+                               } else\r
+                               if( [ 7, 8, 9, 13, 14 ].indexOf( xnode._anime.phase ) !== -1 ){// GPU レイヤーの中止\r
+                                       changed = parent = true;\r
+                                       xnode._anime.phase -= 8;\r
+                               };\r
+                               break;\r
+                       } else\r
+                       if( xnode.contains( _xnode ) ){\r
+                               if( xnode._anime.phase === 3 || xnode._anime.phase === 10 ){\r
+                                       xnode._anime.phase = 15;\r
+                               } else\r
+                               if( _xnode._anime.gpuParent ){\r
+                                       changed = hasGPUChild = true;\r
+                                       _xnode._anime.phase = _xnode._anime.phase === 2 ? 6 : 15;// GPU レイヤーの解除 > アニメーションは継続, すでに終了フェイズなら破棄\r
+                               } else\r
+                               if( [ 7, 8, 9, 13, 14 ].indexOf( _xnode._anime.phase ) !== -1 ){// GPU レイヤーの中止\r
+                                       changed = hasGPUChild = true;\r
+                                       _xnode._anime.phase -= 8;\r
+                               };\r
+                               break;\r
+                       };\r
+               };\r
+               if( !parent && xnode._anime.phase !== 15 ){\r
+                       if( xnode._anime.phase === 0 ){\r
+                               // 新規\r
+                               changed = changed || !xnode._anime.gpuParent;\r
+                               xnode._anime.phase = hasGPUChild ? 7 : 8;// 非GPU -> GPU 子に GPU アニメをもつなら、タイミングをずらす。\r
+                       } else {\r
+                               // 非GPU -> GPU\r
+                               changed = changed || !xnode._anime.gpuParent;\r
+                               xnode._anime.phase = hasGPUChild ? 13 : 14;// 非GPU -> GPU 子に GPU アニメをもつなら、タイミングをずらす。\r
+                       };\r
+               };\r
+       };\r
+       \r
+       X_Node_Anime_needsDetection = false;\r
+};\r
+\r
+function X_Node_Anime_updateAnimation( xnode ){\r
+       var obj   = xnode._anime,\r
+               phase = obj.phase,\r
+               current, time;\r
+       switch( phase ){\r
+               case -1 :// 子の GPU レイヤー解除待ち\r
+               case  7 :\r
+                       ++obj.phase;\r
+                       break;\r
+               case  0 : // 開始位置+アニメーションの設定 \r
+               case  8 :\r
+                       X_Node_Anime_updatePosition( xnode, obj.startX, obj.startY, obj.startA, phase === 8 );\r
+                       ++obj.phase;\r
+                       break;\r
+               case  1 :\r
+               case  9 : // 終了位置の設定\r
+                       obj.gpuParent = phase === 9;\r
+                       X_Node_Anime_updateTransition( xnode, obj.duration, obj.easing );\r
+                       X_Node_Anime_updatePosition( xnode, obj.destX, obj.destY, obj.destA, obj.gpuParent );\r
+                       obj.phase = 2;\r
+                       break;\r
+               \r
+               case 2 :\r
+                       // アニメーション中\r
+                       break;\r
+               \r
+               case 3 : // アニメーションの解除\r
+                       X_Node_Anime_updateTransition( xnode, 0 );\r
+                       obj.phase = obj.gpuParent ? 10 : 4;\r
+                       break;\r
+\r
+               case 4 :\r
+                       // アニメーションは停止・GPU = false -> リストから削除\r
+                       obj.gpuParent = false;\r
+                       return true;\r
+\r
+               case 10 :\r
+                       // アニメーションは停止・GPUレイヤーは解除していない(再アニメーションに備えて待機)\r
+                       if( !obj.gpuTimerID ){\r
+                               obj.gpuTimerID = X.Timer.once( obj.wait, xnode, X_Node_Anime_releaseGPULayer );\r
+                       };\r
+                       return false;\r
+               \r
+               case  5 :\r
+               case 13 :\r
+                       // 子のGPU解除待ち\r
+                       ++obj.phase;\r
+                       break;\r
+               \r
+               // GPU レイヤーの変更> アニメーションは継続,但し残り時間が短ければ停止\r
+               case  6 :               \r
+               case 14 :\r
+                       now  = X_Timer_now();\r
+                       time = obj.duration - now + obj.startTime;\r
+                       if( time < 16 ){\r
+                               X_Node_Anime_updateTransition( xnode, 0 );\r
+                               X_Node_Anime_updatePosition( xnode, obj.destX, obj.destY, obj.destA, phase === 14 );\r
+                               obj.phase = phase === 14 ? 10 : 4;\r
+                       } else {\r
+                               current = X_Node_Anime_getComputedPosition( xnode );\r
+                               obj.startX    = current.x;\r
+                               obj.startY    = current.y;\r
+                               obj.startA    = current.a;\r
+                               obj.duration  = time;\r
+                               obj.startTime = now;\r
+                               //X_Node_Anime_updateTransition( xnode, time, obj.easing );\r
+                               X_Node_Anime_updatePosition( xnode, current.x, current.y, current.a, phase === 14 );\r
+                               obj.phase = phase === 14 ? 9 : 1;\r
+                       };\r
+                       break;\r
+               \r
+               case 15 :\r
+                       // GPU有効で停止(待機)している xnode の解除\r
+                       console.log( 'GPU有効で停止(待機)している xnode の解除' + xnode._tag + xnode.getOrder() );\r
+                       X_Node_Anime_updateTransition( xnode, 0 );\r
+                       X_Node_Anime_updatePosition( xnode, obj.destX, obj.destY, obj.destA, false );\r
+                       obj.gpuTimerID && X.Timer.remove( obj.gpuTimerID );\r
+                       return true;\r
+               \r
+               case 99 : // stop() : アニメーションの中断して削除\r
+                       current = X_Node_Anime_getComputedPosition( xnode );\r
+                                               \r
+                       X_Node_Anime_updateTransition( xnode, 0 );\r
+                       X_Node_Anime_updatePosition( xnode, current.x, current.y, current.a, obj.gpuParent );\r
+                       obj.phase = obj.gpuParent ? 10 : 4;\r
+                       break;\r
+               \r
+       };\r
+};\r
+\r
+function X_Node_Anime_getComputedPosition( that ) {\r
+       var matrix = X_node_CSS_getComputedStyle( that._rawObject, null ),\r
+               x, y;\r
+\r
+       if ( X_Node_Anime_hasTransform ) {\r
+               matrix = matrix[ X_Node_CSS_VENDER_PREFIX[ 'transform' ] ].split( ')' )[ 0 ].split( ', ' );\r
+               x = + ( matrix[ 12 ] || matrix[ 4 ] );\r
+               y = + ( matrix[ 13 ] || matrix[ 5 ] );\r
+       } else {\r
+               x = + parseInt( matrix.left );\r
+               y = + parseInt( matrix.top );\r
+       };\r
+       \r
+       return { x: x, y: y, a : matrix[ X_Node_CSS_Support[ 'opacity' ] ] };\r
+};\r
+\r
+function X_Node_Anime_onTransitionEnd(){\r
+       this._anime.phase = 3;\r
+       X_Node_Anime_needsDetection = true;\r
+       X_Node_Anime_reserveUpdate();\r
+\r
+       return X.Callback.UN_LISTEN | X.Callback.PREVENT_DEFAULT;\r
+};\r
+\r
+function X_Node_Anime_releaseGPULayer(){\r
+       var obj = this._anime;\r
+       X_Node_Anime_updatePosition( this, obj.destX, obj.destY, obj.destA, false );\r
+       X_Node_ANIMATIONS.splice( X_Node_ANIMATIONS.indexOf( this ), 1 );\r
+       delete obj.gpuTimerID;\r
+       delete this._anime;\r
+       console.log( 'GPUレイヤーの破棄' );\r
+};\r
+\r
+function X_Node_Anime_updateTransition( xnode, time, easing ){\r
+       // 開始座標のセット(新規のみ)\r
+       // アニメーション指定のセット(または解除)(対象のみ)\r
+       // 目標座標のセット\r
+       if( time ){\r
+               xnode.listenOnce( 'transitionend', X_Node_Anime_onTransitionEnd );\r
+       } else {\r
+               xnode.unlisten( 'transitionend', X_Node_Anime_onTransitionEnd );\r
+       };\r
+       xnode.css({\r
+               transitionProperty       : X_Node_Anime_transitionProps + ',opacity',\r
+               willChange               : time ? X_Node_Anime_transitionProps + ',opacity' : '',\r
+               backfaceVisibility       : time ? 'hidden' : '',\r
+               transitionTimingFunction : time ? easing.style : '',\r
+               transitionDelay          : '0s',\r
+               transitionDuration       : time ? time + 'ms' : ''\r
+       });\r
+};\r
+\r
+function X_Node_Anime_updatePosition( xnode, x, y, opacity, useGPU ){\r
+       if( X_Node_Anime_hasTransform ){\r
+               xnode.css({\r
+                       transform : 'translate(' + ( x | 0 ) + 'px,' + ( y | 0 ) + 'px)' + ( useGPU ? X_Node_Anime_translateZ : '' ),\r
+                       opacity   : opacity\r
+               });\r
+       } else {\r
+               xnode.css({\r
+                       left    : ( x | 0 ) + 'px',\r
+                       top     : ( y | 0 ) + 'px',\r
+                       opacity : opacity\r
+               });\r
+       };\r
+       // xnode._anime.x, y\r
+};\r
+\r
+function X_Node_Anime_updateAnimationsNoTransition(){\r
+       var i = X_Node_ANIMATIONS.length,\r
+               now = X_Timer_now(),\r
+               obj,\r
+               newX, newY, newA, easing,\r
+               c = false;\r
+       \r
+       for( ; i; ){\r
+               xnode = X_Node_ANIMATIONS[ --i ];\r
+               obj   = xnode._anime;\r
+\r
+               if( obj.destTime <= now ){\r
+                       X_Node_Anime_updatePosition( xnode, obj.destX, obj.destY, obj.destA, false );\r
+                       xnode.asyncDispatch( 'transitionend' );\r
+                       \r
+                       X_Node_ANIMATIONS.splice( i, 1 );\r
+                       delete xnode._anime;                    \r
+               } else {\r
+                       easing = obj.easing.fn( ( now - obj.startTime ) / obj.duration );\r
+                       newX   = ( obj.destX - obj.startX ) * easing + obj.startX;\r
+                       newY   = ( obj.destY - obj.startY ) * easing + obj.startY;\r
+                       newA   = ( obj.destA - obj.startA ) * easing + obj.startA;\r
+                       X_Node_Anime_updatePosition( xnode, newX, newY, newA, false );\r
+                       \r
+                       c = true;       \r
+               };\r
+       };\r
+       \r
+       if( c ){\r
+               X_Node_Anime_updateTimerID = X.Timer.requestFrame( X_Node_Anime_updateAnimationsNoTransition );\r
+       } else {\r
+               X_Node_Anime_updateTimerID = 0;\r
+       };\r
+};\r
+\r
index 45cfec5..69252c7 100644 (file)
@@ -35,12 +35,19 @@ X.Net.JSONP = {
                }
 };
 
+function X_Net_JSONP_reciveMessage( data ){
+       console.log( data );
+};
+
 var X_NET_JSONP_ACCESS_KEY = Math.random(),
        
+       X_NET_JSONP_SEND_MSG_KEY = X_System.message( 'X.Net.JSONP', X_Net_JSONP_reciveMessage ),
+       
        X_NET_JSONP_NinjaIframe,
        
        X_Net_JSONP_onloadCount;
 
+       
 
 function X_NET_JSONP_loadScriptInNinjaIframe( url ){
        var json2Path     = 'js/libs/json2.js',
@@ -51,6 +58,9 @@ function X_NET_JSONP_loadScriptInNinjaIframe( url ){
        
        // TODO '<scr'+'ipt> 化 恐らくアンチウイルスソフトが反応しないための対策
        // TODO postMessage の利用
+       // document.postMessage()→window.postMessage() (Opera 9.50 build 9841 -)
+       // http://d.hatena.ne.jp/cnrd/20080518/1211099169
+       // 最近の仕様変更(引数のtargetOriginとかMessageEventのoriginとか)にはまだ対応してないみたい 
 
        if( X_UA.Opera ){
                html = [
@@ -78,6 +88,7 @@ function X_NET_JSONP_loadScriptInNinjaIframe( url ){
                                'onunload=function(){clearTimeout(id)};',
                                'nw=0;', // なぜか必要,,,
                                'function cb(o){nw-=+new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',parent.JSON.stringify(o).replace(/\\\\u([a-fA-F0-9]{4})/g,function(a,b){return String.fromCharCode(parseInt(b,16))}),-nw)}',
+                               //'function cb(o){if(nw){nw-=+new Date;postMessage("', X_NET_JSONP_SEND_MSG_KEY,' "+nw+"|"+parent.JSON.stringify(o).replace(/\\\\u([a-fA-F0-9]{4})/g,function(a,b){return String.fromCharCode(parseInt(b,16))}),"*");nw=0}}',                   
                                'function tm(){jp.src="', url ,'";nw=+new Date}',
                                'id=setTimeout(tm,16);',
                        '</script>'
@@ -107,6 +118,7 @@ function X_NET_JSONP_loadScriptInNinjaIframe( url ){
                        '<script>',
                                'nw=+new Date;',
                                'function cb(o){if(nw){nw-=+new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',JSON.stringify(o),-nw);nw=0}}',
+                               //'function cb(o){if(nw){nw-=+new Date;parent.postMessage("', X_NET_JSONP_SEND_MSG_KEY,' "+nw+"|"+JSON.stringify(o),"', location.origin, '");nw=0}}',
                        '</script>',
                        '<script src="', url, '"></script>'
                ];
index 853ec82..2a872cb 100644 (file)
@@ -81,6 +81,8 @@ X_NET_ImageWrapper = X_Class_override(
                                                src  : this.abspath,\r
                                                w    : size[ 0 ],\r
                                                h    : size[ 1 ]\r
+                                               // TODO feedback net speed\r
+                                               // time , this._rawObject.fileSize\r
                                        } );\r
                                        break;\r
                                case X.Event.KILL_INSTANCE :\r
index 3bce85d..341e8d4 100644 (file)
@@ -188,11 +188,14 @@ if( window.HTMLAudioElement ){
                         * http://uguisu.skr.jp/html/table3.html\r
                         */\r
                        handleEventProxy : function( e ){\r
+                               console.log(e.type);\r
+                               \r
                                switch( e.type ){\r
                                        case 'loadstart' :      //      ブラウザがコンテンツの検索を開始した場合に発生\r
                                                break;\r
                                        case 'progress' :       //      ブラウザがコンテンツの取得を実行した場合に発生\r
-                                               console.log( e.loaded / e.total );\r
+                                               //console.log( e.loaded + ' ' + e.total * 100 + '%' );\r
+                                               console.log( this._rawObject.buffered.end(0) / this._rawObject.duration * 100 + '%' );\r
                                                break;\r
                                        case 'suspend' :        //      ブラウザが意図的にコンテンツの取得を現在行っていない場合に発生(ダウンロードは未完了)\r
                                        case 'abort' :          //      ダウンロードの完了前にコンテンツの取得を停止した場合に発生(この停止はエラーによるものではない)\r
@@ -220,7 +223,6 @@ if( window.HTMLAudioElement ){
                                        case 'durationchange' : // duration属性が更新された場合に発生\r
                                        case 'volumechange' :   // volume属性とmuted属性のどちらかが変化した場合に発生\r
                                };\r
-                               \r
                                //console.log( 'html5 ' + e.type + ' ' + ( this.proxy._listeners && this.proxy._listeners[ e.type ] && this.proxy._listeners[ e.type ].length ) );\r
                                //e.type === 'canplaythrough' && console.dir( e );\r
                                this.proxy.dispatch( e );\r
index e9d5192..d052a6a 100644 (file)
@@ -36,6 +36,7 @@ document.write( [
                'js/02_dom/07_XNodeList.js',\r
                'js/02_dom/08_XNodeSelector.js',\r
                'js/02_dom/09_XHTMLParser.js',\r
+               'js/02_dom/10_XNodeAnime.js',\r
                'js/02_dom/22_XTreeBuilder.js',\r
 \r
                'js/03_plugin/00_XPlugin.js',\r