OSDN Git Service

Version 0.6.199, bug fixes X.Node.Anime & X.Util.Window & X.Net.OAuth2 & X.UI.*.
[pettanr/clientJs.git] / 0.6.x / js / 02_dom / 20_XNode.js
index b0c3723..e40f832 100644 (file)
@@ -560,7 +560,8 @@ function X_Node_append( v ){
                        return X_Node_append.apply( this, X_HtmlParser_parse( v, true ) );
                case X_NodeType_XNODE :
                        // 親の xnodes から v を消す
-                       v.parent && v[ 'remove' ]();
+               if( v.parent === this && xnodes[ xnodes.length - 1 ] === v ) return this;
+                       v[ 'remove' ]();
                        // IE4 でテキストノードの追加、FIXED 済でない場合、親に要素の追加を通知
                        if( X_UA[ 'IE4' ] && !v[ '_tag' ] && ( ( this[ '_flags' ] & X_NodeFlags_IE4_FIXED ) === 0 ) ) this[ '_flags' ] |= X_NodeFlags_IE4_DIRTY_CHILDREN;
                        break;
@@ -780,6 +781,13 @@ function X_Node_remove(){
        
        if( !parent ) return this;
 
+       // TODO anime
+       // stop() ->
+       if( this[ '_anime' ] && this[ '_anime' ].phase ){
+               console.log( 'Animation 中の REMOVE' );
+               this[ 'stop' ]();
+       };
+
        delete this.parent;
        parent[ '_xnodes' ].splice( parent[ '_xnodes' ].indexOf( this ), 1 );
        
@@ -852,7 +860,13 @@ function X_Node_onKill( that ){
        };
 
        X_Node_CHASHE[ that[ '_uid' ] ] = null; // array に対して delete X_Node_CHASHE[ uid ] はまずい!
-       
+
+// TODO anime
+       if( that[ '_anime' ] && that[ '_anime' ].phase ){
+               console.log( 'Animation 中の KILL' );
+               that[ 'stop' ]();
+       };
+
 // remove _xnodes
        if( X_UA_DOM.IE4 ){
                if( elm ){
@@ -882,17 +896,22 @@ function X_Node_onKill( that ){
  */
 function X_Node_contains( v ){
        var elm, type, xnodes, i;
+       
        if( !v || !this[ '_tag' ] || this === v ) return false;
+       
        // contains ie4+
+       /*
        if( ( elm = this[ '_rawObject' ] || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this ) ) && document.contains && ( type = X_Node_getType( v ) ) && ( type === X_NodeType_RAW_HTML || type === X_NodeType_RAW_TEXT ) ){
                return elm.contains( v );
-       };
+       }; */
 
        //if( document.compareDocumentPosition ){
        //      
        //};
+       
        xnodes = this[ '_xnodes' ];
        if( !xnodes || !xnodes.length ) return false;
+       if( this === v[ 'parent' ] ) return true; // fast
        if( xnodes.indexOf( v ) !== -1 ) return true; // fast
        for( i = xnodes.length; i; ){
                if( xnodes[ --i ][ 'contains' ]( v ) ) return true;
@@ -1218,6 +1237,12 @@ function X_Node_call( name /*, opt_args... */ ){
                        return this.parent ? X_Node_CSS_getCharSize( this ) : 0;
                case 'inGPU' :
                        return !!( this[ '_flags' ] & ( X_NodeFlags_GPU_NOW | X_NodeFlags_GPU_RELEASE_RESERVED ) );
+               case 'canAnimateNow' :
+                       return ( this[ '_flags' ] & X_NodeFlags_IN_TREE ) && X_NodeAnime_detectWaitAnimation( this, true, true ) === 6;
+               case 'animeState' :
+                       return this[ '_anime' ] ? this[ '_anime' ].phase : 0;
+               case 'animeProgress' :
+                       return this[ '_anime' ] && this[ '_anime' ].phase === 7 ? this[ '_anime' ].progress : 0;
        };
        
        X_Node_updateTimerID && X_Node_startUpdate();
@@ -1362,6 +1387,7 @@ function X_Node_startUpdate( time ){
                for( ; i; ){
                        xnodeOrElm = removal[ --i ];
                        // TODO GPU レイヤーの子の場合、remove をスキップする。 非GPU レイヤーへ apppend される場合、clone する?
+                       // GPU レイヤーを削除する場合、cssText = '' して GPU レイヤーを解除する
                        if( !xnodeOrElm[ 'instanceOf' ] ){
                                if( X_UA_DOM.IE4 ){
                                        xnodeOrElm.removeAttribute( 'id' ); // ?
@@ -1424,14 +1450,14 @@ var X_Node__commitUpdate =
 
                        // 1. GPU 一切の更新をスキップ
                        if( that[ '_flags' ] & X_NodeFlags_GPU_NOW ){
-                               //console.log( '更新のskip ' + !!( that[ '_flags' ] & X_Node_BitMask_IS_DIRTY ) );
+                               console.log( '更新のskip ' + !!( that[ '_flags' ] & X_Node_BitMask_IS_DIRTY ) );
                                that[ '_flags' ] & X_Node_BitMask_IS_DIRTY && X_Node__updateRawNode( that, elm );
                                return elm;
                        };
 
                        // 2. GPU解放予約
                        if( that[ '_flags' ] & X_NodeFlags_GPU_RELEASE_RESERVED ){
-                               // console.log( 'GPU 解放 ' );
+                               console.log( 'GPU 解放 ' );
                                //X_Node_updateReservedByReleaseGPU = true;
                                that[ '_flags' ] &= X_Node_BitMask_RESET_GPU;
                                //return elm;// TODO もしかしたらこのタイミングで更新できるかも。
@@ -1439,6 +1465,7 @@ var X_Node__commitUpdate =
 
                        // 3. GPU予約 -> GPU
                        if( that[ '_flags' ] & X_NodeFlags_GPU_RESERVED ){
+                               // TODO size 取得のための update の場合、GPU化を待つ
                                that[ '_flags' ] &= X_Node_BitMask_RESET_GPU;
                                that[ '_flags' ] |= X_NodeFlags_GPU_NOW;
                        };