virtualgrid: DOM element leak fix
authorWoosung Sohn <woosungim.sohn@samsung.com>
Mon, 28 Jan 2013 11:37:29 +0000 (20:37 +0900)
committerMinkyu Kang <mk7.kang@samsung.com>
Mon, 28 Jan 2013 12:58:11 +0000 (21:58 +0900)
Removing temporary dom nodes without parent occured DOM element leak.
This patch changes the process creating temporary dom elements to
append them to a document fragment node after creation.

Change-Id: I6ca0c055fde3de39c0e928cd25b91ef9d86817bf

src/widgets/virtualgrid/js/jquery.mobile.tizen.virtualgrid.js

index 6b5e69e..b0a6796 100644 (file)
                                _lastX : 0,
                                _speedX : 0,
                                _rowsPerView : 0,
+                               _fragment : null,
 
                                _filterRatio : 0.9
                        });
                                return;
                        }
 
+                       // make a fragment.
+                       self._fragment = document.createDocumentFragment();
+
                        // read defined properties(width and height) from dom element.
                        self._inheritedSize = self._getinheritedSize(self.element);
 
                                $row = null,
                                $wrapper = null;
 
-                       $wrapper = $(document.createElement("div"));
+                       $wrapper = $( self._createElement( "div" ) );
                        $wrapper.addClass("ui-scrollview-view");
                        for ( index = 0; index < count ; index += 1 ) {
                                $row = self._makeRow( self._template, index );
                                attrName = self._direction ? "top" : "left",
                                blockClassName = self._direction ? "ui-virtualgrid-wrapblock-x" : "ui-virtualgrid-wrapblock-y",
                                blockAttrName = self._direction ? "top" : "left",
-                               wrapBlock = $( document.createElement( "div" ));
+                               wrapBlock = $( self._createElement( "div" ) );
 
                        wrapBlock.addClass( blockClassName ).attr("row-index", rowIndex);
                        for ( colIndex = 0; colIndex < self._itemCount; colIndex++ ) {
-                               itemData = self._itemData( index );
-                               if ( itemData ) {
-                                       htmlData = self._makeHtmlData( myTemplate, index, colIndex);
+                               htmlData = self._makeHtmlData( myTemplate, index, colIndex);
+                               if ( htmlData ) {
                                        wrapBlock.append( htmlData );
-                                       index += 1;
                                }
+                               index += 1;
                        }
                        return wrapBlock;
                },
                                opts = self.options,
                                $columns = null,
                                $column = null,
+                               $block = block.attr ? block : $( block ),
                                data = null,
                                htmlData = null,
                                myTemplate = null,
                                dataIdx = 0,
                                tempBlocks = null;
 
-                       $columns = $(block).attr("row-index", index).children();
+                       $columns = $block.attr("row-index", index).children();
                        if ( $columns.length !== self._itemCount ) {
-                               $(block).children().remove();
+                               $block.children().remove();
                                tempBlocks = $(self._makeRow( self._template, index ));
-                               $(block).append(tempBlocks.children());
+                               $block.append(tempBlocks.children());
                                tempBlocks.remove();
                                return ;
                        }
 
                        dataIdx = index * self._itemCount;
                        for ( idx = 0; idx < self._itemCount ; idx += 1 ) {
-                               $column = $columns[idx];
+                               $column = $columns.eq(idx);
                                data = self._itemData(dataIdx);
                                if ( $column && data ) {
                                        myTemplate = self._template;
                                        htmlData.remove();      // Clear temporary htmlData to free cache
                                        dataIdx ++;
                                } else if ($column && !data ) {
-                                       $($column).remove();
+                                       $column.remove();
                                }
                        }
                },
 
+               _createElement : function ( tag ) {
+                       var element = document.createElement( tag );
+
+                       this._fragment.appendChild( element );
+                       return element;
+               },
+
                /* Text & image src replace function */
                // @param oldItem   : prev HtmlDivElement
                // @param newItem   : new HtmlDivElement for replace