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;
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 );
};
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 ){
*/
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;
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();
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' ); // ?
// 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 もしかしたらこのタイミングで更新できるかも。
// 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;
};