OSDN Git Service

Version 0.6.132, fix X.Node._flags & fix X.EventDispatcher._listeners & start to...
[pettanr/clientJs.git] / 0.6.x / js / 02_dom / 02_XNode.js
index cbfcdf6..3557862 100644 (file)
@@ -35,6 +35,7 @@ var
                GPU_RESERVED           : 2 << 21, // 2:GPU予約\r
                GPU_NOW                : 2 << 22, // 3:GPU now!\r
                GPU_RELEASE_RESERVED   : 2 << 23, // 4:GPU解除予約\r
+               GPU_CHILD              : 2 << 24, \r
                \r
                IE4_HAS_TEXTNODE       : X_UA.IE4 ? 2 << 21 : 0,\r
                IE4_HAS_ELEMENT        : X_UA.IE4 ? 2 << 22 : 0,\r
@@ -112,6 +113,7 @@ var
                length     : 1,\r
                parent     : null, // remove された枝も親子構造は維持している。\r
                _xnodes    : null, // Array.<Node>\r
+               _gpuParent : null,\r
 \r
                _tag       : '',\r
                _text      : '',\r
@@ -350,6 +352,30 @@ function X_Node_toggleInTreeFlag( xnodes, flag ){
        };\r
 };\r
 \r
+function X_Node_toggleInGPUFlag( gpuRoot, xnodes, flag ){\r
+       var i = xnodes.length, xnode;\r
+\r
+       if( flag ){\r
+               for( ; i; ){\r
+                       xnode = xnodes[ --i ];\r
+                       if( !xnode._gpuParent ){\r
+                               xnode._flags |= X_Node_State.GPU_CHILD;\r
+                               xnode._gpuParent = gpuRoot;\r
+                               xnode._xnodes && X_Node_toggleInTreeFlag( gpuRoot, xnode._xnodes, flag );       \r
+                       };\r
+               };\r
+       } else {\r
+               for( ; i; ){\r
+                       xnode = xnodes[ --i ];\r
+                       if( xnode._gpuParent === gpuRoot ){\r
+                               xnode._flags &= ~X_Node_State.GPU_CHILD;\r
+                               delete xnode._gpuParent;\r
+                               xnode._xnodes && X_Node_toggleInTreeFlag( gpuRoot, xnode._xnodes, flag );\r
+                       };\r
+               };\r
+       };\r
+};\r
+\r
 /* --------------------------------------\r
  *  Create\r
  */\r
@@ -651,7 +677,7 @@ function X_Node_empty(){
 function X_Node_destroy( isChild ){\r
        var xnodes = this._xnodes, i, elm;\r
        \r
-       if( !this._flags ) return;\r
+       if( ( this._flags & X_Node_State.EXIST ) === 0 ) return;\r
        \r
        elm = this._rawObject || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this );\r
        \r
@@ -664,7 +690,7 @@ function X_Node_destroy( isChild ){
 \r
        if( this._flags & X_Node_State.IN_TREE ){\r
                !isChild && this.remove();\r
-               delete this._flags;\r
+               this._flags &= ~X_Node_State.EXIST;\r
        } else {\r
                this.parent && this.parent._xnodes.splice( this.parent._xnodes.indexOf( this ), 1 );\r
                elm && !isChild && X_Node__actualRemove( this );\r
@@ -677,7 +703,7 @@ function X_Node_destroy( isChild ){
 function X_Node_onBeforeKill( e ){\r
        var xnodes = this._xnodes, i, elm;\r
        \r
-       if( !this._flags ) return X.Callback.NONE;\r
+       if( ( this._flags & X_Node_State.EXIST ) === 0 ) return X.Callback.NONE;\r
        \r
        elm = this._rawObject || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this );\r
        elm && this._listeners && this.unlisten(); // イベントの退避\r
@@ -693,7 +719,7 @@ function X_Node_onBeforeKill( e ){
        if( e ){\r
                this.remove();\r
                if( X_Node_reserveRemoval[ X_Node_reserveRemoval.length - 1 ] === this ){\r
-                       delete this._flags;\r
+                       this._flags &= ~X_Node_State.EXIST;\r
                        return X.Callback.PREVENT_DEFAULT;              \r
                };              \r
        };\r
@@ -903,11 +929,12 @@ function X_Node_text( text ){
                        };\r
                        return this;\r
                };\r
-               if( !text ) return this.empty();\r
                if( ( xnodes = this._xnodes ) && xnodes.length === 1 && !xnodes[ 0 ]._tag ){\r
                        xnodes[ 0 ].text( text );\r
                        return this;\r
                };\r
+               // TODO 一つのtextnode を残すケース 完全に削除したい場合は empty()を使う\r
+               if( !text ) return this.empty();                \r
                this.empty().createText( text );\r
                return this;\r
        };\r
@@ -1042,7 +1069,7 @@ function X_Node_startUpdate( time ){
                        xnode = removal[ --i ];\r
                        // TODO GPU レイヤーの子の場合、remove をスキップする。 非GPU レイヤーへ apppend される場合、clone する?\r
                        X_Node__actualRemove( xnode );\r
-                       !xnode._flags && xnode.kill();\r
+                       ( xnode._flags & X_Node_State.EXIST ) === 0 && xnode.kill();\r
                };\r
                removal.length = 0;\r
        };\r
@@ -1170,12 +1197,13 @@ var X_Node__commitUpdate =
                                        \r
                                        if( X_Node_documentFragment ){\r
                                                //( frg = X_Node_documentFragment ).appendChild( elm );\r
+                                               // 連続する要素の差し替えの場合に有効\r
                                        };\r
 \r
                                        if( X_Node_strictElmCreation ){\r
                                                that._flags &= X_Node_BitMask_RESET_DIRTY;\r
                                                // ie の string から要素を作る場合、ネットワーク系属性は onload イベントなどを拾うために、要素生成->イベント復帰後に適用する\r
-                                               that._newAttrs && ( that._flags |= X_Node_State.DIRTY_ATTR ); // Network 系の属性は遅らせて設定\r
+                                               that._newAttrs && ( that._flags |= X_Node_State.DIRTY_ATTR ); // _newAttrs には ネットワーク系属性が入っている。Network 系の属性は遅らせて設定\r
                                                that._flags |= X_Node_State.DIRTY_IE_FILTER;// doc 追加後に filter を指定しないと有効にならない。\r
                                        } else {\r
                                                elm.UID = that._uid;\r
@@ -1572,7 +1600,7 @@ var X_Node__afterActualCreate =
                                X_Node__afterActualCreate( xnodes[ --i ] );\r
                        };\r
                };\r
-               // ã\83\8dã\83\83ã\83\88ã\82\8fã\83¼ã\81\86系属性と filter は要素生成後に適用\r
+               // ã\83\8dã\83\83ã\83\88ã\83¯ã\83¼ã\82¯系属性と filter は要素生成後に適用\r
                if( that._flags & ( X_Node_State.DIRTY_ATTR | X_Node_State.DIRTY_IE_FILTER ) ){\r
                        X_Node__updateRawNode( that, that._rawObject || X_Node__ie4getRawNode( that ) );\r
                } else {\r