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/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();
},