LayoutTests:
authorweinig <weinig@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 23 Jan 2007 01:36:22 +0000 (01:36 +0000)
committerweinig <weinig@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 23 Jan 2007 01:36:22 +0000 (01:36 +0000)
        Reviewed by Darin.

        - test for http://bugs.webkit.org/show_bug.cgi?id=12344
          NativeListBox: item hit testing does not account for top padding and border

        * fast/forms/listbox-selection-2-expected.checksum: Added.
        * fast/forms/listbox-selection-2-expected.png: Added.
        * fast/forms/listbox-selection-2-expected.txt: Added.
        * fast/forms/listbox-selection-2.html: Added.

WebCore:

        Reviewed by Darin.

        - fix http://bugs.webkit.org/show_bug.cgi?id=12344
          NativeListBox: item hit testing does not account for top padding and border

        Test: fast/forms/listbox-selection-2.html

        * rendering/RenderListBox.cpp:
        (WebCore::RenderListBox::numVisibleItems): Changed height() to contentHeight()
        since items are visible only in the content box.
        (WebCore::RenderListBox::listIndexAtOffset): Adjusted for vertical padding and
        borders. Changed to return -1 instead of the last item's index if the given offset
        is below the last item.
        (WebCore::RenderListBox::autoscroll): Adjusted for vertical padding and borders.
        (WebCore::RenderListBox::controlClipRect): Changed to return the content box since
        items should not spill into the padding box. This change is the reason the test
        generates pixel results.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@19037 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/fast/forms/listbox-selection-2-expected.checksum [new file with mode: 0644]
LayoutTests/fast/forms/listbox-selection-2-expected.png [new file with mode: 0644]
LayoutTests/fast/forms/listbox-selection-2-expected.txt [new file with mode: 0644]
LayoutTests/fast/forms/listbox-selection-2.html [new file with mode: 0644]
WebCore/ChangeLog
WebCore/rendering/RenderListBox.cpp

index 70c08ad..9abd077 100644 (file)
@@ -1,3 +1,15 @@
+2007-01-22  Mitz Pettel  <mitz@webkit.org>
+
+        Reviewed by Darin.
+
+        - test for http://bugs.webkit.org/show_bug.cgi?id=12344
+          NativeListBox: item hit testing does not account for top padding and border
+
+        * fast/forms/listbox-selection-2-expected.checksum: Added.
+        * fast/forms/listbox-selection-2-expected.png: Added.
+        * fast/forms/listbox-selection-2-expected.txt: Added.
+        * fast/forms/listbox-selection-2.html: Added.
+
 2007-01-22  Justin Garcia  <justin.garcia@apple.com>
 
         Reviewed by darin
diff --git a/LayoutTests/fast/forms/listbox-selection-2-expected.checksum b/LayoutTests/fast/forms/listbox-selection-2-expected.checksum
new file mode 100644 (file)
index 0000000..75e9aaf
--- /dev/null
@@ -0,0 +1 @@
+0dbfb5f69962420a55854958526d2cb5
\ No newline at end of file
diff --git a/LayoutTests/fast/forms/listbox-selection-2-expected.png b/LayoutTests/fast/forms/listbox-selection-2-expected.png
new file mode 100644 (file)
index 0000000..2f04b41
Binary files /dev/null and b/LayoutTests/fast/forms/listbox-selection-2-expected.png differ
diff --git a/LayoutTests/fast/forms/listbox-selection-2-expected.txt b/LayoutTests/fast/forms/listbox-selection-2-expected.txt
new file mode 100644 (file)
index 0000000..35ca331
--- /dev/null
@@ -0,0 +1,46 @@
+layer at (0,0) size 800x600
+  RenderView at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderBlock {HTML} at (0,0) size 800x600
+    RenderBody {BODY} at (8,8) size 784x584
+      RenderBlock (anonymous) at (0,0) size 784x135
+        RenderListBox {SELECT} at (2,0) size 99x135 [bgcolor=#FFFFFF] [border: (10px solid #000000)]
+        RenderText {#text} at (103,114) size 4x18
+          text run at (103,114) width 4: " "
+        RenderListBox {SELECT} at (109,0) size 73x135 [bgcolor=#FFFFFF] [border: (10px solid #000000)]
+        RenderText {#text} at (0,0) size 0x0
+        RenderText {#text} at (0,0) size 0x0
+        RenderText {#text} at (0,0) size 0x0
+      RenderBlock {DIV} at (0,135) size 784x198
+        RenderText {#text} at (0,0) size 50x18
+          text run at (0,0) width 50: "Results:"
+        RenderBR {BR} at (50,14) size 0x0
+        RenderText {#text} at (0,18) size 86x18
+          text run at (0,18) width 86: "Test 1 Passed"
+        RenderBR {BR} at (86,32) size 0x0
+        RenderText {#text} at (0,36) size 86x18
+          text run at (0,36) width 86: "Test 2 Passed"
+        RenderBR {BR} at (86,50) size 0x0
+        RenderText {#text} at (0,54) size 86x18
+          text run at (0,54) width 86: "Test 3 Passed"
+        RenderBR {BR} at (86,68) size 0x0
+        RenderText {#text} at (0,72) size 86x18
+          text run at (0,72) width 86: "Test 4 Passed"
+        RenderBR {BR} at (86,86) size 0x0
+        RenderText {#text} at (0,90) size 86x18
+          text run at (0,90) width 86: "Test 5 Passed"
+        RenderBR {BR} at (86,104) size 0x0
+        RenderText {#text} at (0,108) size 86x18
+          text run at (0,108) width 86: "Test 6 Passed"
+        RenderBR {BR} at (86,122) size 0x0
+        RenderText {#text} at (0,126) size 86x18
+          text run at (0,126) width 86: "Test 7 Passed"
+        RenderBR {BR} at (86,140) size 0x0
+        RenderText {#text} at (0,144) size 86x18
+          text run at (0,144) width 86: "Test 8 Passed"
+        RenderBR {BR} at (86,158) size 0x0
+        RenderText {#text} at (0,162) size 86x18
+          text run at (0,162) width 86: "Test 9 Passed"
+        RenderBR {BR} at (86,176) size 0x0
+        RenderText {#text} at (0,180) size 94x18
+          text run at (0,180) width 94: "Test 10 Passed"
diff --git a/LayoutTests/fast/forms/listbox-selection-2.html b/LayoutTests/fast/forms/listbox-selection-2.html
new file mode 100644 (file)
index 0000000..146b53a
--- /dev/null
@@ -0,0 +1,123 @@
+<html>
+    <head>
+        <script>
+            function setup() {
+                var results = document.createElement('div');
+                results.id = "res";
+                results.appendChild(document.createTextNode("Results:"));
+                document.body.appendChild(results);
+            }
+            function test() {
+                setup();
+                
+                mouseDownOnSelect("sl1", 0, false, false);                
+                var expectedSelectionResults = new Array(true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false);
+                testResults("sl1", expectedSelectionResults, 1);
+
+                mouseDownOnSelect("sl1", 1, false, false);                
+                expectedSelectionResults = new Array(false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false);
+                testResults("sl1", expectedSelectionResults, 2);
+
+                mouseDownOnSelect("sl1", 6, false, false);                
+                expectedSelectionResults = new Array(false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false);
+                testResults("sl1", expectedSelectionResults, 3);
+
+                mouseDownOnSelect("sl1", 7, false, false);                
+                expectedSelectionResults = new Array(false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false);
+                testResults("sl1", expectedSelectionResults, 4);
+
+                mouseDownOnSelect("sl1", 8, false, false);                
+                expectedSelectionResults = new Array(false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false);
+                testResults("sl1", expectedSelectionResults, 5);
+
+                mouseDownOnSelect("sl1", 0, false, false);                
+                expectedSelectionResults = new Array(false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false);
+                testResults("sl1", expectedSelectionResults, 6);
+
+                for (i = 0; i < 9; i++)
+                    mouseDownOnSelect("sl1", 7, false, false);                
+                expectedSelectionResults = new Array(false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true);
+                testResults("sl1", expectedSelectionResults, 7);
+
+                mouseDownOnSelect("sl2", 1, false, false);                
+                expectedSelectionResults = new Array(false, true, false);
+                testResults("sl2", expectedSelectionResults, 8);
+
+                mouseDownOnSelect("sl2", 3, false, false);                
+                expectedSelectionResults = new Array(false, true, false);
+                testResults("sl2", expectedSelectionResults, 9);
+
+                mouseDownOnSelect("sl2", 2, false, false);                
+                expectedSelectionResults = new Array(false, false, true);
+                testResults("sl2", expectedSelectionResults, 10);
+            }
+            
+            function mouseDownOnSelect(selId, index, shift, meta) {
+                var sl = document.getElementById(selId);
+                var itemHeight = 14;
+                var borderPaddingTop = 15;
+                var borderPaddingLeft = 15;
+                var y = 8 + index * itemHeight - window.pageYOffset + borderPaddingTop;
+                var event = document.createEvent("MouseEvent");
+                event.initMouseEvent("mousedown", true, true, document.defaultView, 1, sl.offsetLeft + 8 + borderPaddingLeft, sl.offsetTop + y, sl.offsetLeft + 8 + borderPaddingLeft, sl.offsetTop + y, false, false, shift, meta, 0, document);
+                sl.dispatchEvent(event);
+            }
+            
+            function testResults(selId, expectedArr, testNum) {
+                var sl = document.getElementById(selId);
+                var res = document.getElementById('res');
+                var resultsArr = new Array(sl.options.length);
+                
+                var i;
+                for (i=0; i < sl.options.length; i++) {
+                    resultsArr[i] = sl.options[i].selected;
+                }
+                var successString = "Failed";
+                var success = false;
+                if (expectedArr.join() == resultsArr.join()) {
+                    success = true;
+                    successString = "Passed";
+                }
+                
+               log("Test " + testNum + " " + successString);
+                if (!success) {
+                    log("<pre>     Expected: " + expectedArr.join() + "<br>" + "     Actual: " + resultsArr.join() + "</pre>");
+                }
+            }
+            
+            function log(msg) {
+                var r = document.getElementById('res');
+                r.innerHTML = r.innerHTML + "<br>" + msg;
+            }
+        </script>
+    </head>
+    <body onload="test()">
+
+    <select id="sl1" multiple style="height: 105px; border: 10px solid; padding: 5px;">
+        <option>one</option>
+        <option>two</option>
+        <option>three</option>
+        <option>four</option>
+        <option>five</option>
+        <option>six</option>
+        <option>seven</option>
+        <option>eight</option>
+        <option>nine</option>
+        <option>ten</option>
+        <option>eleven</option>
+        <option>twelve</option>
+        <option>thirteen</option>
+        <option>fourteen</option>
+        <option>fifteen</option>
+        <option>sixteen</option>
+        <option>seventeen</option>
+    </select>
+    
+    <select id="sl2" multiple style="height: 105px; border: 10px solid; padding: 5px;">
+        <option>one</option>
+        <option>two</option>
+        <option>three</option>
+    </select>
+
+    </body>
+</html>
index 66f2a07..114a4a2 100644 (file)
@@ -1,3 +1,23 @@
+2007-01-22  Mitz Pettel  <mitz@webkit.org>
+
+        Reviewed by Darin.
+
+        - fix http://bugs.webkit.org/show_bug.cgi?id=12344
+          NativeListBox: item hit testing does not account for top padding and border
+
+        Test: fast/forms/listbox-selection-2.html
+
+        * rendering/RenderListBox.cpp:
+        (WebCore::RenderListBox::numVisibleItems): Changed height() to contentHeight()
+        since items are visible only in the content box.
+        (WebCore::RenderListBox::listIndexAtOffset): Adjusted for vertical padding and
+        borders. Changed to return -1 instead of the last item's index if the given offset
+        is below the last item.
+        (WebCore::RenderListBox::autoscroll): Adjusted for vertical padding and borders.
+        (WebCore::RenderListBox::controlClipRect): Changed to return the content box since
+        items should not spill into the padding box. This change is the reason the test
+        generates pixel results.
+
 2007-01-22  Justin Garcia  <justin.garcia@apple.com>
 
         Reviewed by darin
index 4093081..0f63575 100644 (file)
@@ -205,7 +205,7 @@ int RenderListBox::size() const
 int RenderListBox::numVisibleItems() const
 {
     // Only count fully visible rows. But don't return 0 even if only part of a row shows.
-    return max(1, (height() + rowSpacing) / itemHeight());
+    return max(1, (contentHeight() + rowSpacing) / itemHeight());
 }
 
 int RenderListBox::numItems() const
@@ -373,15 +373,18 @@ bool RenderListBox::isPointInScrollbar(HitTestResult& result, int _x, int _y, in
 
 int RenderListBox::listIndexAtOffset(int offsetX, int offsetY)
 {
-    if (numItems() > 0) {
-        int newOffset = max(0, offsetY / itemHeight()) + m_indexOffset;
-        newOffset = min(max(0, newOffset), numItems() - 1);
-        int scrollbarWidth = m_vBar ? m_vBar->width() : 0;
-        if (offsetX >= borderLeft() + paddingLeft() && offsetX < absoluteBoundingBoxRect().width() - borderRight() - paddingRight() - scrollbarWidth)
-            return newOffset;
-    }
-            
-    return -1;
+    if (!numItems())
+        return -1;
+
+    if (offsetY < borderTop() + paddingTop() || offsetY > height() - paddingBottom() - borderBottom())
+        return -1;
+
+    int scrollbarWidth = m_vBar ? m_vBar->width() : 0;
+    if (offsetX < borderLeft() + paddingLeft() || offsetX > width() - borderRight() - paddingRight() - scrollbarWidth)
+        return -1;
+
+    int newOffset = (offsetY - borderTop() - paddingTop()) / itemHeight() + m_indexOffset;
+    return newOffset < numItems() ? newOffset : -1;
 }
 
 void RenderListBox::autoscroll()
@@ -397,9 +400,9 @@ void RenderListBox::autoscroll()
     int endIndex = -1;
     int rows = numVisibleItems();
     int offset = m_indexOffset;
-    if (offsetY < 0 && scrollToRevealElementAtListIndex(offset - 1))
+    if (offsetY < borderTop() + paddingTop() && scrollToRevealElementAtListIndex(offset - 1))
         endIndex = offset - 1;
-    else if (offsetY > absoluteBoundingBoxRect().height() && scrollToRevealElementAtListIndex(offset + rows))
+    else if (offsetY > height() - paddingBottom() - borderBottom() && scrollToRevealElementAtListIndex(offset + rows))
         endIndex = offset + rows - 1;
     else
         endIndex = listIndexAtOffset(offsetX, offsetY);
@@ -516,8 +519,9 @@ void RenderListBox::setScrollTop(int newTop)
 
 IntRect RenderListBox::controlClipRect(int tx, int ty) const
 {
-    // Clip to the padding box, since we have a scrollbar inside the padding box.
-    return IntRect(tx + borderLeft(), ty + borderTop(), clientWidth(), clientHeight());
+    IntRect clipRect = contentBox();
+    clipRect.move(tx, ty);
+    return clipRect;
 }
 
 IntRect RenderListBox::windowClipRect() const