Title: [133851] trunk
Revision
133851
Author
vse...@chromium.org
Date
2012-11-07 22:45:03 -0800 (Wed, 07 Nov 2012)

Log Message

Web Inspector: Infinite loop in DataGrid::autoSizeColumn
https://bugs.webkit.org/show_bug.cgi?id=101363

Reviewed by Pavel Feldman.

Source/WebCore:

Test: inspector/datagrid-autosize.html

* inspector/front-end/DataGrid.js:
(WebInspector.DataGrid.prototype._autoSizeWidths):
(WebInspector.DataGrid.prototype.autoSizeColumns):

LayoutTests:

* inspector/datagrid-autosize-expected.txt: Added.
* inspector/datagrid-autosize.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (133850 => 133851)


--- trunk/LayoutTests/ChangeLog	2012-11-08 06:35:58 UTC (rev 133850)
+++ trunk/LayoutTests/ChangeLog	2012-11-08 06:45:03 UTC (rev 133851)
@@ -1,3 +1,13 @@
+2012-11-07  Vsevolod Vlasov  <vse...@chromium.org>
+
+        Web Inspector: Infinite loop in DataGrid::autoSizeColumn
+        https://bugs.webkit.org/show_bug.cgi?id=101363
+
+        Reviewed by Pavel Feldman.
+
+        * inspector/datagrid-autosize-expected.txt: Added.
+        * inspector/datagrid-autosize.html: Added.
+
 2012-11-07  Keishi Hattori  <kei...@webkit.org>
 
         Implement week picking to calendar picker

Added: trunk/LayoutTests/inspector/datagrid-autosize-expected.txt (0 => 133851)


--- trunk/LayoutTests/inspector/datagrid-autosize-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/inspector/datagrid-autosize-expected.txt	2012-11-08 06:45:03 UTC (rev 133851)
@@ -0,0 +1,28 @@
+Tests DataGrid column auto size calculation.
+
+Bug 101363
+Auto sizing [198,2,400], minPercent=90, maxPercent=undefined
+    [33,33,34]
+Auto sizing [1000], minPercent=5, maxPercent=undefined
+    [100]
+Auto sizing [10], minPercent=5, maxPercent=undefined
+    [100]
+Auto sizing [1000,1000], minPercent=5, maxPercent=undefined
+    [50,50]
+Auto sizing [30,30,30,30], minPercent=5, maxPercent=undefined
+    [25,25,25,25]
+Auto sizing [1,100,100,100], minPercent=25, maxPercent=undefined
+    [25,25,25,25]
+Auto sizing [100,100,100,100], minPercent=25, maxPercent=undefined
+    [25,25,25,25]
+Auto sizing [1,1,1,100], minPercent=25, maxPercent=undefined
+    [25,25,25,25]
+Auto sizing [1,100,100], minPercent=25, maxPercent=40
+    [25,37,38]
+Auto sizing [100,100,100], minPercent=25, maxPercent=40
+    [34,33,33]
+Auto sizing [1,1,100], minPercent=25, maxPercent=40
+    [30,30,40]
+Auto sizing [3,10,7,7,13,13,9,10,15,15,20,20,14,14,12,12,12,10,9,14,10,6,7,10,18], minPercent=5, maxPercent=undefined
+    [4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4]
+

Added: trunk/LayoutTests/inspector/datagrid-autosize.html (0 => 133851)


--- trunk/LayoutTests/inspector/datagrid-autosize.html	                        (rev 0)
+++ trunk/LayoutTests/inspector/datagrid-autosize.html	2012-11-08 06:45:03 UTC (rev 133851)
@@ -0,0 +1,38 @@
+<html>
+<head>
+<script src=""
+<script type="text/_javascript_">
+function test()
+{
+  setTimeout(InspectorTest.completeTest.bind(InspectorTest), 3000);
+    function testAutoSize(widths, minPercent, maxPercent)
+    {
+        InspectorTest.addResult("Auto sizing " + JSON.stringify(widths) + ", minPercent=" + minPercent + ", maxPercent=" + maxPercent);
+        var result = WebInspector.DataGrid.prototype._autoSizeWidths(widths, minPercent, maxPercent);
+        InspectorTest.addResult("    " + JSON.stringify(result));
+    }
+
+    testAutoSize([198, 2, 400], 90);
+    testAutoSize([1000], 5);
+    testAutoSize([10], 5);
+    testAutoSize([1000, 1000], 5);
+    testAutoSize([30, 30, 30, 30], 5);
+    testAutoSize([1, 100, 100, 100], 25);
+    testAutoSize([100, 100, 100, 100], 25);
+    testAutoSize([1, 1, 1, 100], 25);
+    testAutoSize([1, 100, 100], 25, 40);
+    testAutoSize([100, 100, 100], 25, 40);
+    testAutoSize([1, 1, 100], 25, 40);
+
+    // https://bugs.webkit.org/show_bug.cgi?id=101363
+    testAutoSize([3, 10, 7, 7, 13, 13, 9, 10, 15, 15, 20, 20, 14, 14, 12, 12, 12, 10, 9, 14, 10, 6, 7, 10, 18], 5);
+    InspectorTest.completeTest();
+}
+
+</script>
+</head>
+<body _onload_="runTest()">
+<p>Tests DataGrid column auto size calculation.</p>
+<a href="" 101363</a>
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (133850 => 133851)


--- trunk/Source/WebCore/ChangeLog	2012-11-08 06:35:58 UTC (rev 133850)
+++ trunk/Source/WebCore/ChangeLog	2012-11-08 06:45:03 UTC (rev 133851)
@@ -1,3 +1,16 @@
+2012-11-07  Vsevolod Vlasov  <vse...@chromium.org>
+
+        Web Inspector: Infinite loop in DataGrid::autoSizeColumn
+        https://bugs.webkit.org/show_bug.cgi?id=101363
+
+        Reviewed by Pavel Feldman.
+
+        Test: inspector/datagrid-autosize.html
+
+        * inspector/front-end/DataGrid.js:
+        (WebInspector.DataGrid.prototype._autoSizeWidths):
+        (WebInspector.DataGrid.prototype.autoSizeColumns):
+
 2012-11-07  Keishi Hattori  <kei...@webkit.org>
 
         Implement week picking to calendar picker

Modified: trunk/Source/WebCore/inspector/front-end/DataGrid.js (133850 => 133851)


--- trunk/Source/WebCore/inspector/front-end/DataGrid.js	2012-11-08 06:35:58 UTC (rev 133850)
+++ trunk/Source/WebCore/inspector/front-end/DataGrid.js	2012-11-08 06:45:03 UTC (rev 133851)
@@ -436,49 +436,33 @@
     },
 
     /**
-     * @param {number=} maxDescentLevel
+     * @param {Array<number>} widths
+     * @param {number} minPercent
+     * @param {number=} maxPercent
      */
-    autoSizeColumns: function(minPercent, maxPercent, maxDescentLevel)
+    _autoSizeWidths: function(widths, minPercent, maxPercent)
     {
         if (minPercent)
-            minPercent = Math.min(minPercent, Math.floor(100 / this._columnCount));
-        var widths = {};
-        var columns = this.columns;
-        for (var columnIdentifier in columns)
-            widths[columnIdentifier] = (columns[columnIdentifier].title || "").length;
-
-        maxDescentLevel = maxDescentLevel || 0;
-        var children = this._enumerateChildren(this._rootNode, [], maxDescentLevel + 1);
-        for (var i = 0; i < children.length; ++i) {
-            var node = children[i];
-            for (var columnIdentifier in columns) {
-                var text = node.data[columnIdentifier] || "";
-                if (text.length > widths[columnIdentifier])
-                    widths[columnIdentifier] = text.length;
-            }
-        }
-
-        var totalColumnWidths = 0;
-        for (var columnIdentifier in columns)
-            totalColumnWidths += widths[columnIdentifier];
-
-        var recoupPercent = 0;
-        for (var columnIdentifier in columns) {
-            var width = Math.round(100 * widths[columnIdentifier] / totalColumnWidths);
-            if (minPercent && width < minPercent) {
-                recoupPercent += (minPercent - width);
+            minPercent = Math.min(minPercent, Math.floor(100 / widths.length));
+        var totalWidth = 0;
+        for (var i = 0; i < widths.length; ++i)
+            totalWidth += widths[i];
+        var totalPercentWidth = 0;
+        for (var i = 0; i < widths.length; ++i) {
+            var width = Math.round(100 * widths[i] / totalWidth);
+            if (minPercent && width < minPercent)
                 width = minPercent;
-            } else if (maxPercent && width > maxPercent) {
-                recoupPercent -= (width - maxPercent);
+            else if (maxPercent && width > maxPercent)
                 width = maxPercent;
-            }
-            widths[columnIdentifier] = width;
+            totalPercentWidth += width;
+            widths[i] = width;
         }
+        var recoupPercent = totalPercentWidth - 100;
 
         while (minPercent && recoupPercent > 0) {
-            for (var columnIdentifier in columns) {
-                if (widths[columnIdentifier] > minPercent) {
-                    --widths[columnIdentifier];
+            for (var i = 0; i < widths.length; ++i) {
+                if (widths[i] > minPercent) {
+                    --widths[i];
                     --recoupPercent;
                     if (!recoupPercent)
                         break;
@@ -487,9 +471,9 @@
         }
 
         while (maxPercent && recoupPercent < 0) {
-            for (var columnIdentifier in columns) {
-                if (widths[columnIdentifier] < maxPercent) {
-                    ++widths[columnIdentifier];
+            for (var i = 0; i < widths.length; ++i) {
+                if (widths[i] < maxPercent) {
+                    ++widths[i];
                     ++recoupPercent;
                     if (!recoupPercent)
                         break;
@@ -497,8 +481,36 @@
             }
         }
 
-        for (var columnIdentifier in columns)
-            columns[columnIdentifier].element.style.width = widths[columnIdentifier] + "%";
+        return widths;
+    },
+
+    /**
+     * @param {number} minPercent
+     * @param {number=} maxPercent
+     * @param {number=} maxDescentLevel
+     */
+    autoSizeColumns: function(minPercent, maxPercent, maxDescentLevel)
+    {
+        var widths = [];
+        var columnIdentifiers = Object.keys(this.columns);
+        for (var i = 0; i < columnIdentifiers.length; ++i)
+            widths[i] = (this.columns[columnIdentifiers[i]].title || "").length;
+
+        maxDescentLevel = maxDescentLevel || 0;
+        var children = this._enumerateChildren(this._rootNode, [], maxDescentLevel + 1);
+        for (var i = 0; i < children.length; ++i) {
+            var node = children[i];
+            for (var j = 0; j < columnIdentifiers.length; ++j) {
+                var text = node.data[columnIdentifiers[j]] || "";
+                if (text.length > widths[j])
+                    widths[j] = text.length;
+            }
+        }
+
+        widths = this._autoSizeWidths(widths, minPercent, maxPercent);
+
+        for (var i = 0; i < columnIdentifiers.length; ++i)
+            this.columns[columnIdentifiers[i]].element.style.width = widths[i] + "%";
         this._columnWidthsInitialized = false;
         this.updateWidths();
     },
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to