2010-08-17 Fady Samuel <fsamuel@chromium.org>
authorjamesr@google.com <jamesr@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 17 Aug 2010 20:57:15 +0000 (20:57 +0000)
committerjamesr@google.com <jamesr@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 17 Aug 2010 20:57:15 +0000 (20:57 +0000)
        Reviewed by David Hyatt.

        Updated table cell hit testing and painting to use binary search instead of linear scan.

        Improved Table Hit Testing and Painting Performance
        https://bugs.webkit.org/show_bug.cgi?id=43933

        Tests: fast/table/simple_paint.html
               tables/hittesting/filltable-emptycells.html
               tables/hittesting/filltable-levels.html
               tables/hittesting/filltable-outline.html
               tables/hittesting/filltable-rtl.html
               tables/hittesting/filltable-stress.html

        * rendering/RenderTableSection.cpp:
        (WebCore::RenderTableSection::paintObject): Dirty rect determined using binary search.
        (WebCore::RenderTableSection::nodeAtPoint): Cell hit determined using binary search
2010-08-17  Fady Samuel  <fsamuel@chromium.org>

        Reviewed by David Hyatt.

        Updated table cell hit testing and painting to use binary search instead of a linear scan.

        Layout tests check that hit testing of empty cells, overlapping cells,
        cells with outlines, right-to-left tables, and large
        tables all work as expected.

        Improved Table Hit Testing and Painting Performance
        https://bugs.webkit.org/show_bug.cgi?id=43933

        * fast/table/simple_paint.html: Added.
        * platform/chromium-linux/fast/table/simple_paint-expected.checksum: Added.
        * platform/chromium-linux/fast/table/simple_paint-expected.png: Added.
        * platform/chromium-linux/fast/table/simple_paint-expected.txt: Added.
        * platform/chromium-linux/tables/hittesting/filltable-emptycells-expected.txt: Added.
        * platform/chromium-linux/tables/hittesting/filltable-levels-expected.txt: Added.
        * platform/chromium-linux/tables/hittesting/filltable-outline-expected.txt: Added.
        * platform/chromium-linux/tables/hittesting/filltable-rtl-expected.txt: Added.
        * platform/chromium-linux/tables/hittesting/filltable-stress-expected.txt: Added.
        * platform/chromium/test_expectations.txt:
        * platform/gtk/tables/hittesting/filltable-emptycells-expected.txt: Added.
        * platform/gtk/tables/hittesting/filltable-levels-expected.txt: Added.
        * platform/gtk/tables/hittesting/filltable-outline-expected.txt: Added.
        * platform/gtk/tables/hittesting/filltable-rtl-expected.txt: Added.
        * platform/gtk/tables/hittesting/filltable-stress-expected.txt: Added.
        * tables/hittesting/filltable-emptycells.html: Added.
        * tables/hittesting/filltable-levels.html: Added.
        * tables/hittesting/filltable-outline.html: Added.
        * tables/hittesting/filltable-rtl.html: Added.
        * tables/hittesting/filltable-stress.html: Added.

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

26 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/table/simple_paint.html [new file with mode: 0644]
LayoutTests/platform/chromium-linux/fast/table/simple_paint-expected.checksum [new file with mode: 0644]
LayoutTests/platform/chromium-linux/fast/table/simple_paint-expected.png [new file with mode: 0644]
LayoutTests/platform/chromium-linux/fast/table/simple_paint-expected.txt [new file with mode: 0644]
LayoutTests/platform/chromium-linux/tables/hittesting/filltable-emptycells-expected.txt [new file with mode: 0644]
LayoutTests/platform/chromium-linux/tables/hittesting/filltable-levels-expected.txt [new file with mode: 0644]
LayoutTests/platform/chromium-linux/tables/hittesting/filltable-outline-expected.txt [new file with mode: 0644]
LayoutTests/platform/chromium-linux/tables/hittesting/filltable-rtl-expected.txt [new file with mode: 0644]
LayoutTests/platform/chromium-linux/tables/hittesting/filltable-stress-expected.txt [new file with mode: 0644]
LayoutTests/platform/chromium/test_expectations.txt
LayoutTests/platform/gtk/fast/table/simple_paint-expected.checksum [new file with mode: 0644]
LayoutTests/platform/gtk/fast/table/simple_paint-expected.png [new file with mode: 0644]
LayoutTests/platform/gtk/fast/table/simple_paint-expected.txt [new file with mode: 0644]
LayoutTests/platform/gtk/tables/hittesting/filltable-emptycells-expected.txt [new file with mode: 0644]
LayoutTests/platform/gtk/tables/hittesting/filltable-levels-expected.txt [new file with mode: 0644]
LayoutTests/platform/gtk/tables/hittesting/filltable-outline-expected.txt [new file with mode: 0644]
LayoutTests/platform/gtk/tables/hittesting/filltable-rtl-expected.txt [new file with mode: 0644]
LayoutTests/platform/gtk/tables/hittesting/filltable-stress-expected.txt [new file with mode: 0644]
LayoutTests/tables/hittesting/filltable-emptycells.html [new file with mode: 0644]
LayoutTests/tables/hittesting/filltable-levels.html [new file with mode: 0644]
LayoutTests/tables/hittesting/filltable-outline.html [new file with mode: 0644]
LayoutTests/tables/hittesting/filltable-rtl.html [new file with mode: 0644]
LayoutTests/tables/hittesting/filltable-stress.html [new file with mode: 0644]
WebCore/ChangeLog
WebCore/rendering/RenderTableSection.cpp

index f5a5456..a3dbd55 100644 (file)
@@ -1,3 +1,37 @@
+2010-08-17  Fady Samuel  <fsamuel@chromium.org>
+
+        Reviewed by David Hyatt.
+
+        Updated table cell hit testing and painting to use binary search instead of a linear scan.
+
+        Layout tests check that hit testing of empty cells, overlapping cells,
+        cells with outlines, right-to-left tables, and large
+        tables all work as expected.
+
+        Improved Table Hit Testing and Painting Performance
+        https://bugs.webkit.org/show_bug.cgi?id=43933
+
+        * fast/table/simple_paint.html: Added.
+        * platform/chromium-linux/fast/table/simple_paint-expected.checksum: Added.
+        * platform/chromium-linux/fast/table/simple_paint-expected.png: Added.
+        * platform/chromium-linux/fast/table/simple_paint-expected.txt: Added.
+        * platform/chromium-linux/tables/hittesting/filltable-emptycells-expected.txt: Added.
+        * platform/chromium-linux/tables/hittesting/filltable-levels-expected.txt: Added.
+        * platform/chromium-linux/tables/hittesting/filltable-outline-expected.txt: Added.
+        * platform/chromium-linux/tables/hittesting/filltable-rtl-expected.txt: Added.
+        * platform/chromium-linux/tables/hittesting/filltable-stress-expected.txt: Added.
+        * platform/chromium/test_expectations.txt:
+        * platform/gtk/tables/hittesting/filltable-emptycells-expected.txt: Added.
+        * platform/gtk/tables/hittesting/filltable-levels-expected.txt: Added.
+        * platform/gtk/tables/hittesting/filltable-outline-expected.txt: Added.
+        * platform/gtk/tables/hittesting/filltable-rtl-expected.txt: Added.
+        * platform/gtk/tables/hittesting/filltable-stress-expected.txt: Added.
+        * tables/hittesting/filltable-emptycells.html: Added.
+        * tables/hittesting/filltable-levels.html: Added.
+        * tables/hittesting/filltable-outline.html: Added.
+        * tables/hittesting/filltable-rtl.html: Added.
+        * tables/hittesting/filltable-stress.html: Added.
+
 2010-08-17  Abhishek Arya  <inferno@chromium.org>
 
         Reviewed by Dave Hyatt.
diff --git a/LayoutTests/fast/table/simple_paint.html b/LayoutTests/fast/table/simple_paint.html
new file mode 100644 (file)
index 0000000..44ffe4c
--- /dev/null
@@ -0,0 +1,62 @@
+<html>
+<head>
+<title>Simple Table Painting</title>
+  <style>
+    table.testtable { border: 1px solid black; border-collapse:collapse; background-color: green; }
+    table.testtable td { border: 1px solid black;  font-size: 20px; background-color: green; width:60px; height:60px; direction:rtl;}
+    body { margin: 0px 0px 0px 0px; }
+  </style>
+  <script>
+      if (window.layoutTestController) {
+          window.layoutTestController.waitUntilDone();
+      }
+  </script>
+</head>
+  <body>
+    <table class="testtable">
+      <tr>
+        <td></td>
+        <td></td>
+        <td></td>
+        <td></td>
+        <td></td>
+      </tr>
+      <tr>
+        <td></td>
+        <td></td>
+        <td></td>
+        <td></td>
+        <td></td>
+      </tr>
+      <tr>
+        <td></td>
+        <td></td>
+        <td style="background-color: red;" id="testcell"></td>
+        <td></td>
+        <td></td>
+      </tr>
+      <tr>
+        <td></td>
+        <td></td>
+        <td></td>
+        <td></td>
+        <td></td>
+      </tr>
+      <tr>
+        <td></td>
+        <td></td>
+        <td></td>
+        <td></td>
+        <td></td>
+      </tr>
+    </table>
+    <script>
+      var testCell = document.getElementById("testcell");
+      var offset = document.body.offsetTop;
+      testCell.style.backgroundColor = "green";
+      if (window.layoutTestController) {
+          window.layoutTestController.notifyDone();
+      }
+    </script>
+  </body>
+</html>
diff --git a/LayoutTests/platform/chromium-linux/fast/table/simple_paint-expected.checksum b/LayoutTests/platform/chromium-linux/fast/table/simple_paint-expected.checksum
new file mode 100644 (file)
index 0000000..0e88c80
--- /dev/null
@@ -0,0 +1 @@
+58a97402f46fee222b81aecc51b9f92c
\ No newline at end of file
diff --git a/LayoutTests/platform/chromium-linux/fast/table/simple_paint-expected.png b/LayoutTests/platform/chromium-linux/fast/table/simple_paint-expected.png
new file mode 100644 (file)
index 0000000..e9b4b6e
Binary files /dev/null and b/LayoutTests/platform/chromium-linux/fast/table/simple_paint-expected.png differ
diff --git a/LayoutTests/platform/chromium-linux/fast/table/simple_paint-expected.txt b/LayoutTests/platform/chromium-linux/fast/table/simple_paint-expected.txt
new file mode 100644 (file)
index 0000000..126dcae
--- /dev/null
@@ -0,0 +1,37 @@
+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 (0,0) size 800x600
+      RenderTable {TABLE} at (0,0) size 316x301 [bgcolor=#008000] [border: none]
+        RenderTableSection {TBODY} at (0,0) size 315x300
+          RenderTableRow {TR} at (0,0) size 315x60
+            RenderTableCell {TD} at (0,28) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1]
+            RenderTableCell {TD} at (63,28) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1]
+            RenderTableCell {TD} at (126,28) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1]
+            RenderTableCell {TD} at (189,28) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=0 c=3 rs=1 cs=1]
+            RenderTableCell {TD} at (252,28) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=0 c=4 rs=1 cs=1]
+          RenderTableRow {TR} at (0,60) size 315x60
+            RenderTableCell {TD} at (0,88) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=1 c=0 rs=1 cs=1]
+            RenderTableCell {TD} at (63,88) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=1 c=1 rs=1 cs=1]
+            RenderTableCell {TD} at (126,88) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=1 c=2 rs=1 cs=1]
+            RenderTableCell {TD} at (189,88) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=1 c=3 rs=1 cs=1]
+            RenderTableCell {TD} at (252,88) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=1 c=4 rs=1 cs=1]
+          RenderTableRow {TR} at (0,120) size 315x60
+            RenderTableCell {TD} at (0,148) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=2 c=0 rs=1 cs=1]
+            RenderTableCell {TD} at (63,148) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=2 c=1 rs=1 cs=1]
+            RenderTableCell {TD} at (126,148) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=2 c=2 rs=1 cs=1]
+            RenderTableCell {TD} at (189,148) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=2 c=3 rs=1 cs=1]
+            RenderTableCell {TD} at (252,148) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=2 c=4 rs=1 cs=1]
+          RenderTableRow {TR} at (0,180) size 315x60
+            RenderTableCell {TD} at (0,208) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=3 c=0 rs=1 cs=1]
+            RenderTableCell {TD} at (63,208) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=3 c=1 rs=1 cs=1]
+            RenderTableCell {TD} at (126,208) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=3 c=2 rs=1 cs=1]
+            RenderTableCell {TD} at (189,208) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=3 c=3 rs=1 cs=1]
+            RenderTableCell {TD} at (252,208) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=3 c=4 rs=1 cs=1]
+          RenderTableRow {TR} at (0,240) size 315x60
+            RenderTableCell {TD} at (0,268) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=4 c=0 rs=1 cs=1]
+            RenderTableCell {TD} at (63,268) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=4 c=1 rs=1 cs=1]
+            RenderTableCell {TD} at (126,268) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=4 c=2 rs=1 cs=1]
+            RenderTableCell {TD} at (189,268) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=4 c=3 rs=1 cs=1]
+            RenderTableCell {TD} at (252,268) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=4 c=4 rs=1 cs=1]
diff --git a/LayoutTests/platform/chromium-linux/tables/hittesting/filltable-emptycells-expected.txt b/LayoutTests/platform/chromium-linux/tables/hittesting/filltable-emptycells-expected.txt
new file mode 100644 (file)
index 0000000..3af318c
--- /dev/null
@@ -0,0 +1,8 @@
+SUCCESS!!!
+Hit cell at row: 0, column: 0: SUCCESS
+Hit cell at row: 0, column: 1: EMPTY
+Hit cell at row: 0, column: 2: EMPTY
+Hit cell at row: 1, column: 0: SUCCESS
+Hit cell at row: 1, column: 1: SUCCESS
+Hit cell at row: 1, column: 2: SUCCESS
+
diff --git a/LayoutTests/platform/chromium-linux/tables/hittesting/filltable-levels-expected.txt b/LayoutTests/platform/chromium-linux/tables/hittesting/filltable-levels-expected.txt
new file mode 100644 (file)
index 0000000..83718e6
--- /dev/null
@@ -0,0 +1,11 @@
+SUCCESS!!!
+Hit cell at row: 0, column: 0: SUCCESS
+Hit cell at row: 0, column: 1: SUCCESS
+Hit cell at row: 0, column: 2: SUCCESS
+Hit cell at row: 1, column: 0: SUCCESS
+Hit cell at row: 1, column: 1: SUCCESS
+Hit cell at row: 1, column: 2: SUCCESS
+Hit cell at row: 2, column: 0: SUCCESS
+Hit cell at row: 2, column: 1: SUCCESS
+Hit cell at row: 2, column: 2: SUCCESS
+
diff --git a/LayoutTests/platform/chromium-linux/tables/hittesting/filltable-outline-expected.txt b/LayoutTests/platform/chromium-linux/tables/hittesting/filltable-outline-expected.txt
new file mode 100644 (file)
index 0000000..3cddc7d
--- /dev/null
@@ -0,0 +1,102 @@
+SUCCESS!!!
+Hit cell at row: 0, column: 0: SUCCESS
+Hit cell at row: 0, column: 1: SUCCESS
+Hit cell at row: 0, column: 2: SUCCESS
+Hit cell at row: 0, column: 3: SUCCESS
+Hit cell at row: 0, column: 4: SUCCESS
+Hit cell at row: 0, column: 5: SUCCESS
+Hit cell at row: 0, column: 6: SUCCESS
+Hit cell at row: 0, column: 7: SUCCESS
+Hit cell at row: 0, column: 8: SUCCESS
+Hit cell at row: 0, column: 9: SUCCESS
+Hit cell at row: 1, column: 0: SUCCESS
+Hit cell at row: 1, column: 1: SUCCESS
+Hit cell at row: 1, column: 2: SUCCESS
+Hit cell at row: 1, column: 3: SUCCESS
+Hit cell at row: 1, column: 4: SUCCESS
+Hit cell at row: 1, column: 5: SUCCESS
+Hit cell at row: 1, column: 6: SUCCESS
+Hit cell at row: 1, column: 7: SUCCESS
+Hit cell at row: 1, column: 8: SUCCESS
+Hit cell at row: 1, column: 9: SUCCESS
+Hit cell at row: 2, column: 0: SUCCESS
+Hit cell at row: 2, column: 1: SUCCESS
+Hit cell at row: 2, column: 2: SUCCESS
+Hit cell at row: 2, column: 3: SUCCESS
+Hit cell at row: 2, column: 4: SUCCESS
+Hit cell at row: 2, column: 5: SUCCESS
+Hit cell at row: 2, column: 6: SUCCESS
+Hit cell at row: 2, column: 7: SUCCESS
+Hit cell at row: 2, column: 8: SUCCESS
+Hit cell at row: 2, column: 9: SUCCESS
+Hit cell at row: 3, column: 0: SUCCESS
+Hit cell at row: 3, column: 1: SUCCESS
+Hit cell at row: 3, column: 2: SUCCESS
+Hit cell at row: 3, column: 3: SUCCESS
+Hit cell at row: 3, column: 4: SUCCESS
+Hit cell at row: 3, column: 5: SUCCESS
+Hit cell at row: 3, column: 6: SUCCESS
+Hit cell at row: 3, column: 7: SUCCESS
+Hit cell at row: 3, column: 8: SUCCESS
+Hit cell at row: 3, column: 9: SUCCESS
+Hit cell at row: 4, column: 0: SUCCESS
+Hit cell at row: 4, column: 1: SUCCESS
+Hit cell at row: 4, column: 2: SUCCESS
+Hit cell at row: 4, column: 3: SUCCESS
+Hit cell at row: 4, column: 4: SUCCESS
+Hit cell at row: 4, column: 5: SUCCESS
+Hit cell at row: 4, column: 6: SUCCESS
+Hit cell at row: 4, column: 7: SUCCESS
+Hit cell at row: 4, column: 8: SUCCESS
+Hit cell at row: 4, column: 9: SUCCESS
+Hit cell at row: 5, column: 0: SUCCESS
+Hit cell at row: 5, column: 1: SUCCESS
+Hit cell at row: 5, column: 2: SUCCESS
+Hit cell at row: 5, column: 3: SUCCESS
+Hit cell at row: 5, column: 4: SUCCESS
+Hit cell at row: 5, column: 5: SUCCESS
+Hit cell at row: 5, column: 6: SUCCESS
+Hit cell at row: 5, column: 7: SUCCESS
+Hit cell at row: 5, column: 8: SUCCESS
+Hit cell at row: 5, column: 9: SUCCESS
+Hit cell at row: 6, column: 0: SUCCESS
+Hit cell at row: 6, column: 1: SUCCESS
+Hit cell at row: 6, column: 2: SUCCESS
+Hit cell at row: 6, column: 3: SUCCESS
+Hit cell at row: 6, column: 4: SUCCESS
+Hit cell at row: 6, column: 5: SUCCESS
+Hit cell at row: 6, column: 6: SUCCESS
+Hit cell at row: 6, column: 7: SUCCESS
+Hit cell at row: 6, column: 8: SUCCESS
+Hit cell at row: 6, column: 9: SUCCESS
+Hit cell at row: 7, column: 0: SUCCESS
+Hit cell at row: 7, column: 1: SUCCESS
+Hit cell at row: 7, column: 2: SUCCESS
+Hit cell at row: 7, column: 3: SUCCESS
+Hit cell at row: 7, column: 4: SUCCESS
+Hit cell at row: 7, column: 5: SUCCESS
+Hit cell at row: 7, column: 6: SUCCESS
+Hit cell at row: 7, column: 7: SUCCESS
+Hit cell at row: 7, column: 8: SUCCESS
+Hit cell at row: 7, column: 9: SUCCESS
+Hit cell at row: 8, column: 0: SUCCESS
+Hit cell at row: 8, column: 1: SUCCESS
+Hit cell at row: 8, column: 2: SUCCESS
+Hit cell at row: 8, column: 3: SUCCESS
+Hit cell at row: 8, column: 4: SUCCESS
+Hit cell at row: 8, column: 5: SUCCESS
+Hit cell at row: 8, column: 6: SUCCESS
+Hit cell at row: 8, column: 7: SUCCESS
+Hit cell at row: 8, column: 8: SUCCESS
+Hit cell at row: 8, column: 9: SUCCESS
+Hit cell at row: 9, column: 0: SUCCESS
+Hit cell at row: 9, column: 1: SUCCESS
+Hit cell at row: 9, column: 2: SUCCESS
+Hit cell at row: 9, column: 3: SUCCESS
+Hit cell at row: 9, column: 4: SUCCESS
+Hit cell at row: 9, column: 5: SUCCESS
+Hit cell at row: 9, column: 6: SUCCESS
+Hit cell at row: 9, column: 7: SUCCESS
+Hit cell at row: 9, column: 8: SUCCESS
+Hit cell at row: 9, column: 9: SUCCESS
+
diff --git a/LayoutTests/platform/chromium-linux/tables/hittesting/filltable-rtl-expected.txt b/LayoutTests/platform/chromium-linux/tables/hittesting/filltable-rtl-expected.txt
new file mode 100644 (file)
index 0000000..83718e6
--- /dev/null
@@ -0,0 +1,11 @@
+SUCCESS!!!
+Hit cell at row: 0, column: 0: SUCCESS
+Hit cell at row: 0, column: 1: SUCCESS
+Hit cell at row: 0, column: 2: SUCCESS
+Hit cell at row: 1, column: 0: SUCCESS
+Hit cell at row: 1, column: 1: SUCCESS
+Hit cell at row: 1, column: 2: SUCCESS
+Hit cell at row: 2, column: 0: SUCCESS
+Hit cell at row: 2, column: 1: SUCCESS
+Hit cell at row: 2, column: 2: SUCCESS
+
diff --git a/LayoutTests/platform/chromium-linux/tables/hittesting/filltable-stress-expected.txt b/LayoutTests/platform/chromium-linux/tables/hittesting/filltable-stress-expected.txt
new file mode 100644 (file)
index 0000000..f380786
--- /dev/null
@@ -0,0 +1,458 @@
+SUCCESS!!!
+Attempting to hit cell at row: 0, column: 0: SUCCESS
+Attempting to hit cell at row: 0, column: 1: SUCCESS
+Attempting to hit cell at row: 0, column: 2: SUCCESS
+Attempting to hit cell at row: 0, column: 3: SUCCESS
+Attempting to hit cell at row: 0, column: 4: SUCCESS
+Attempting to hit cell at row: 0, column: 5: SUCCESS
+Attempting to hit cell at row: 0, column: 6: SUCCESS
+Attempting to hit cell at row: 0, column: 7: SUCCESS
+Attempting to hit cell at row: 0, column: 8: SUCCESS
+Attempting to hit cell at row: 0, column: 9: SUCCESS
+Attempting to hit cell at row: 0, column: 10: SUCCESS
+Attempting to hit cell at row: 0, column: 11: SUCCESS
+Attempting to hit cell at row: 0, column: 12: SUCCESS
+Attempting to hit cell at row: 0, column: 13: SUCCESS
+Attempting to hit cell at row: 0, column: 14: SUCCESS
+Attempting to hit cell at row: 0, column: 15: SUCCESS
+Attempting to hit cell at row: 0, column: 16: SUCCESS
+Attempting to hit cell at row: 0, column: 17: SUCCESS
+Attempting to hit cell at row: 0, column: 18: SUCCESS
+Attempting to hit cell at row: 1, column: 0: SUCCESS
+Attempting to hit cell at row: 1, column: 1: SUCCESS
+Attempting to hit cell at row: 1, column: 2: SUCCESS
+Attempting to hit cell at row: 1, column: 3: SUCCESS
+Attempting to hit cell at row: 1, column: 4: SUCCESS
+Attempting to hit cell at row: 1, column: 5: SUCCESS
+Attempting to hit cell at row: 1, column: 6: SUCCESS
+Attempting to hit cell at row: 1, column: 7: SUCCESS
+Attempting to hit cell at row: 1, column: 8: SUCCESS
+Attempting to hit cell at row: 1, column: 9: SUCCESS
+Attempting to hit cell at row: 1, column: 10: SUCCESS
+Attempting to hit cell at row: 1, column: 11: SUCCESS
+Attempting to hit cell at row: 1, column: 12: SUCCESS
+Attempting to hit cell at row: 1, column: 13: SUCCESS
+Attempting to hit cell at row: 1, column: 14: SUCCESS
+Attempting to hit cell at row: 1, column: 15: SUCCESS
+Attempting to hit cell at row: 1, column: 16: SUCCESS
+Attempting to hit cell at row: 1, column: 17: SUCCESS
+Attempting to hit cell at row: 1, column: 18: SUCCESS
+Attempting to hit cell at row: 2, column: 0: SUCCESS
+Attempting to hit cell at row: 2, column: 1: SUCCESS
+Attempting to hit cell at row: 2, column: 2: SUCCESS
+Attempting to hit cell at row: 2, column: 3: SUCCESS
+Attempting to hit cell at row: 2, column: 4: SUCCESS
+Attempting to hit cell at row: 2, column: 5: SUCCESS
+Attempting to hit cell at row: 2, column: 6: SUCCESS
+Attempting to hit cell at row: 2, column: 7: SUCCESS
+Attempting to hit cell at row: 2, column: 8: SUCCESS
+Attempting to hit cell at row: 2, column: 9: SUCCESS
+Attempting to hit cell at row: 2, column: 10: SUCCESS
+Attempting to hit cell at row: 2, column: 11: SUCCESS
+Attempting to hit cell at row: 2, column: 12: SUCCESS
+Attempting to hit cell at row: 2, column: 13: SUCCESS
+Attempting to hit cell at row: 2, column: 14: SUCCESS
+Attempting to hit cell at row: 2, column: 15: SUCCESS
+Attempting to hit cell at row: 2, column: 16: SUCCESS
+Attempting to hit cell at row: 2, column: 17: SUCCESS
+Attempting to hit cell at row: 2, column: 18: SUCCESS
+Attempting to hit cell at row: 3, column: 0: SUCCESS
+Attempting to hit cell at row: 3, column: 1: SUCCESS
+Attempting to hit cell at row: 3, column: 2: SUCCESS
+Attempting to hit cell at row: 3, column: 3: SUCCESS
+Attempting to hit cell at row: 3, column: 4: SUCCESS
+Attempting to hit cell at row: 3, column: 5: SUCCESS
+Attempting to hit cell at row: 3, column: 6: SUCCESS
+Attempting to hit cell at row: 3, column: 7: SUCCESS
+Attempting to hit cell at row: 3, column: 8: SUCCESS
+Attempting to hit cell at row: 3, column: 9: SUCCESS
+Attempting to hit cell at row: 3, column: 10: SUCCESS
+Attempting to hit cell at row: 3, column: 11: SUCCESS
+Attempting to hit cell at row: 3, column: 12: SUCCESS
+Attempting to hit cell at row: 3, column: 13: SUCCESS
+Attempting to hit cell at row: 3, column: 14: SUCCESS
+Attempting to hit cell at row: 3, column: 15: SUCCESS
+Attempting to hit cell at row: 3, column: 16: SUCCESS
+Attempting to hit cell at row: 3, column: 17: SUCCESS
+Attempting to hit cell at row: 3, column: 18: SUCCESS
+Attempting to hit cell at row: 4, column: 0: SUCCESS
+Attempting to hit cell at row: 4, column: 1: SUCCESS
+Attempting to hit cell at row: 4, column: 2: SUCCESS
+Attempting to hit cell at row: 4, column: 3: SUCCESS
+Attempting to hit cell at row: 4, column: 4: SUCCESS
+Attempting to hit cell at row: 4, column: 5: SUCCESS
+Attempting to hit cell at row: 4, column: 6: SUCCESS
+Attempting to hit cell at row: 4, column: 7: SUCCESS
+Attempting to hit cell at row: 4, column: 8: SUCCESS
+Attempting to hit cell at row: 4, column: 9: SUCCESS
+Attempting to hit cell at row: 4, column: 10: SUCCESS
+Attempting to hit cell at row: 4, column: 11: SUCCESS
+Attempting to hit cell at row: 4, column: 12: SUCCESS
+Attempting to hit cell at row: 4, column: 13: SUCCESS
+Attempting to hit cell at row: 4, column: 14: SUCCESS
+Attempting to hit cell at row: 4, column: 15: SUCCESS
+Attempting to hit cell at row: 4, column: 16: SUCCESS
+Attempting to hit cell at row: 4, column: 17: SUCCESS
+Attempting to hit cell at row: 4, column: 18: SUCCESS
+Attempting to hit cell at row: 5, column: 0: SUCCESS
+Attempting to hit cell at row: 5, column: 1: SUCCESS
+Attempting to hit cell at row: 5, column: 2: SUCCESS
+Attempting to hit cell at row: 5, column: 3: SUCCESS
+Attempting to hit cell at row: 5, column: 4: SUCCESS
+Attempting to hit cell at row: 5, column: 5: SUCCESS
+Attempting to hit cell at row: 5, column: 6: SUCCESS
+Attempting to hit cell at row: 5, column: 7: SUCCESS
+Attempting to hit cell at row: 5, column: 8: SUCCESS
+Attempting to hit cell at row: 5, column: 9: SUCCESS
+Attempting to hit cell at row: 5, column: 10: SUCCESS
+Attempting to hit cell at row: 5, column: 11: SUCCESS
+Attempting to hit cell at row: 5, column: 12: SUCCESS
+Attempting to hit cell at row: 5, column: 13: SUCCESS
+Attempting to hit cell at row: 5, column: 14: SUCCESS
+Attempting to hit cell at row: 5, column: 15: SUCCESS
+Attempting to hit cell at row: 5, column: 16: SUCCESS
+Attempting to hit cell at row: 5, column: 17: SUCCESS
+Attempting to hit cell at row: 5, column: 18: SUCCESS
+Attempting to hit cell at row: 6, column: 0: SUCCESS
+Attempting to hit cell at row: 6, column: 1: SUCCESS
+Attempting to hit cell at row: 6, column: 2: SUCCESS
+Attempting to hit cell at row: 6, column: 3: SUCCESS
+Attempting to hit cell at row: 6, column: 4: SUCCESS
+Attempting to hit cell at row: 6, column: 5: SUCCESS
+Attempting to hit cell at row: 6, column: 6: SUCCESS
+Attempting to hit cell at row: 6, column: 7: SUCCESS
+Attempting to hit cell at row: 6, column: 8: SUCCESS
+Attempting to hit cell at row: 6, column: 9: SUCCESS
+Attempting to hit cell at row: 6, column: 10: SUCCESS
+Attempting to hit cell at row: 6, column: 11: SUCCESS
+Attempting to hit cell at row: 6, column: 12: SUCCESS
+Attempting to hit cell at row: 6, column: 13: SUCCESS
+Attempting to hit cell at row: 6, column: 14: SUCCESS
+Attempting to hit cell at row: 6, column: 15: SUCCESS
+Attempting to hit cell at row: 6, column: 16: SUCCESS
+Attempting to hit cell at row: 6, column: 17: SUCCESS
+Attempting to hit cell at row: 6, column: 18: SUCCESS
+Attempting to hit cell at row: 7, column: 0: SUCCESS
+Attempting to hit cell at row: 7, column: 1: SUCCESS
+Attempting to hit cell at row: 7, column: 2: SUCCESS
+Attempting to hit cell at row: 7, column: 3: SUCCESS
+Attempting to hit cell at row: 7, column: 4: SUCCESS
+Attempting to hit cell at row: 7, column: 5: SUCCESS
+Attempting to hit cell at row: 7, column: 6: SUCCESS
+Attempting to hit cell at row: 7, column: 7: SUCCESS
+Attempting to hit cell at row: 7, column: 8: SUCCESS
+Attempting to hit cell at row: 7, column: 9: SUCCESS
+Attempting to hit cell at row: 7, column: 10: SUCCESS
+Attempting to hit cell at row: 7, column: 11: SUCCESS
+Attempting to hit cell at row: 7, column: 12: SUCCESS
+Attempting to hit cell at row: 7, column: 13: SUCCESS
+Attempting to hit cell at row: 7, column: 14: SUCCESS
+Attempting to hit cell at row: 7, column: 15: SUCCESS
+Attempting to hit cell at row: 7, column: 16: SUCCESS
+Attempting to hit cell at row: 7, column: 17: SUCCESS
+Attempting to hit cell at row: 7, column: 18: SUCCESS
+Attempting to hit cell at row: 8, column: 0: SUCCESS
+Attempting to hit cell at row: 8, column: 1: SUCCESS
+Attempting to hit cell at row: 8, column: 2: SUCCESS
+Attempting to hit cell at row: 8, column: 3: SUCCESS
+Attempting to hit cell at row: 8, column: 4: SUCCESS
+Attempting to hit cell at row: 8, column: 5: SUCCESS
+Attempting to hit cell at row: 8, column: 6: SUCCESS
+Attempting to hit cell at row: 8, column: 7: SUCCESS
+Attempting to hit cell at row: 8, column: 8: SUCCESS
+Attempting to hit cell at row: 8, column: 9: SUCCESS
+Attempting to hit cell at row: 8, column: 10: SUCCESS
+Attempting to hit cell at row: 8, column: 11: SUCCESS
+Attempting to hit cell at row: 8, column: 12: SUCCESS
+Attempting to hit cell at row: 8, column: 13: SUCCESS
+Attempting to hit cell at row: 8, column: 14: SUCCESS
+Attempting to hit cell at row: 8, column: 15: SUCCESS
+Attempting to hit cell at row: 8, column: 16: SUCCESS
+Attempting to hit cell at row: 8, column: 17: SUCCESS
+Attempting to hit cell at row: 8, column: 18: SUCCESS
+Attempting to hit cell at row: 9, column: 0: SUCCESS
+Attempting to hit cell at row: 9, column: 1: SUCCESS
+Attempting to hit cell at row: 9, column: 2: SUCCESS
+Attempting to hit cell at row: 9, column: 3: SUCCESS
+Attempting to hit cell at row: 9, column: 4: SUCCESS
+Attempting to hit cell at row: 9, column: 5: SUCCESS
+Attempting to hit cell at row: 9, column: 6: SUCCESS
+Attempting to hit cell at row: 9, column: 7: SUCCESS
+Attempting to hit cell at row: 9, column: 8: SUCCESS
+Attempting to hit cell at row: 9, column: 9: SUCCESS
+Attempting to hit cell at row: 9, column: 10: SUCCESS
+Attempting to hit cell at row: 9, column: 11: SUCCESS
+Attempting to hit cell at row: 9, column: 12: SUCCESS
+Attempting to hit cell at row: 9, column: 13: SUCCESS
+Attempting to hit cell at row: 9, column: 14: SUCCESS
+Attempting to hit cell at row: 9, column: 15: SUCCESS
+Attempting to hit cell at row: 9, column: 16: SUCCESS
+Attempting to hit cell at row: 9, column: 17: SUCCESS
+Attempting to hit cell at row: 9, column: 18: SUCCESS
+Attempting to hit cell at row: 10, column: 0: SUCCESS
+Attempting to hit cell at row: 10, column: 1: SUCCESS
+Attempting to hit cell at row: 10, column: 2: SUCCESS
+Attempting to hit cell at row: 10, column: 3: SUCCESS
+Attempting to hit cell at row: 10, column: 4: SUCCESS
+Attempting to hit cell at row: 10, column: 5: SUCCESS
+Attempting to hit cell at row: 10, column: 6: SUCCESS
+Attempting to hit cell at row: 10, column: 7: SUCCESS
+Attempting to hit cell at row: 10, column: 8: SUCCESS
+Attempting to hit cell at row: 10, column: 9: SUCCESS
+Attempting to hit cell at row: 10, column: 10: SUCCESS
+Attempting to hit cell at row: 10, column: 11: SUCCESS
+Attempting to hit cell at row: 10, column: 12: SUCCESS
+Attempting to hit cell at row: 10, column: 13: SUCCESS
+Attempting to hit cell at row: 10, column: 14: SUCCESS
+Attempting to hit cell at row: 10, column: 15: SUCCESS
+Attempting to hit cell at row: 10, column: 16: SUCCESS
+Attempting to hit cell at row: 10, column: 17: SUCCESS
+Attempting to hit cell at row: 10, column: 18: SUCCESS
+Attempting to hit cell at row: 11, column: 0: SUCCESS
+Attempting to hit cell at row: 11, column: 1: SUCCESS
+Attempting to hit cell at row: 11, column: 2: SUCCESS
+Attempting to hit cell at row: 11, column: 3: SUCCESS
+Attempting to hit cell at row: 11, column: 4: SUCCESS
+Attempting to hit cell at row: 11, column: 5: SUCCESS
+Attempting to hit cell at row: 11, column: 6: SUCCESS
+Attempting to hit cell at row: 11, column: 7: SUCCESS
+Attempting to hit cell at row: 11, column: 8: SUCCESS
+Attempting to hit cell at row: 11, column: 9: SUCCESS
+Attempting to hit cell at row: 11, column: 10: SUCCESS
+Attempting to hit cell at row: 11, column: 11: SUCCESS
+Attempting to hit cell at row: 11, column: 12: SUCCESS
+Attempting to hit cell at row: 11, column: 13: SUCCESS
+Attempting to hit cell at row: 11, column: 14: SUCCESS
+Attempting to hit cell at row: 11, column: 15: SUCCESS
+Attempting to hit cell at row: 11, column: 16: SUCCESS
+Attempting to hit cell at row: 11, column: 17: SUCCESS
+Attempting to hit cell at row: 11, column: 18: SUCCESS
+Attempting to hit cell at row: 12, column: 0: SUCCESS
+Attempting to hit cell at row: 12, column: 1: SUCCESS
+Attempting to hit cell at row: 12, column: 2: SUCCESS
+Attempting to hit cell at row: 12, column: 3: SUCCESS
+Attempting to hit cell at row: 12, column: 4: SUCCESS
+Attempting to hit cell at row: 12, column: 5: SUCCESS
+Attempting to hit cell at row: 12, column: 6: SUCCESS
+Attempting to hit cell at row: 12, column: 7: SUCCESS
+Attempting to hit cell at row: 12, column: 8: SUCCESS
+Attempting to hit cell at row: 12, column: 9: SUCCESS
+Attempting to hit cell at row: 12, column: 10: SUCCESS
+Attempting to hit cell at row: 12, column: 11: SUCCESS
+Attempting to hit cell at row: 12, column: 12: SUCCESS
+Attempting to hit cell at row: 12, column: 13: SUCCESS
+Attempting to hit cell at row: 12, column: 14: SUCCESS
+Attempting to hit cell at row: 12, column: 15: SUCCESS
+Attempting to hit cell at row: 12, column: 16: SUCCESS
+Attempting to hit cell at row: 12, column: 17: SUCCESS
+Attempting to hit cell at row: 12, column: 18: SUCCESS
+Attempting to hit cell at row: 13, column: 0: SUCCESS
+Attempting to hit cell at row: 13, column: 1: SUCCESS
+Attempting to hit cell at row: 13, column: 2: SUCCESS
+Attempting to hit cell at row: 13, column: 3: SUCCESS
+Attempting to hit cell at row: 13, column: 4: SUCCESS
+Attempting to hit cell at row: 13, column: 5: SUCCESS
+Attempting to hit cell at row: 13, column: 6: SUCCESS
+Attempting to hit cell at row: 13, column: 7: SUCCESS
+Attempting to hit cell at row: 13, column: 8: SUCCESS
+Attempting to hit cell at row: 13, column: 9: SUCCESS
+Attempting to hit cell at row: 13, column: 10: SUCCESS
+Attempting to hit cell at row: 13, column: 11: SUCCESS
+Attempting to hit cell at row: 13, column: 12: SUCCESS
+Attempting to hit cell at row: 13, column: 13: SUCCESS
+Attempting to hit cell at row: 13, column: 14: SUCCESS
+Attempting to hit cell at row: 13, column: 15: SUCCESS
+Attempting to hit cell at row: 13, column: 16: SUCCESS
+Attempting to hit cell at row: 13, column: 17: SUCCESS
+Attempting to hit cell at row: 13, column: 18: SUCCESS
+Attempting to hit cell at row: 14, column: 0: SUCCESS
+Attempting to hit cell at row: 14, column: 1: SUCCESS
+Attempting to hit cell at row: 14, column: 2: SUCCESS
+Attempting to hit cell at row: 14, column: 3: SUCCESS
+Attempting to hit cell at row: 14, column: 4: SUCCESS
+Attempting to hit cell at row: 14, column: 5: SUCCESS
+Attempting to hit cell at row: 14, column: 6: SUCCESS
+Attempting to hit cell at row: 14, column: 7: SUCCESS
+Attempting to hit cell at row: 14, column: 8: SUCCESS
+Attempting to hit cell at row: 14, column: 9: SUCCESS
+Attempting to hit cell at row: 14, column: 10: SUCCESS
+Attempting to hit cell at row: 14, column: 11: SUCCESS
+Attempting to hit cell at row: 14, column: 12: SUCCESS
+Attempting to hit cell at row: 14, column: 13: SUCCESS
+Attempting to hit cell at row: 14, column: 14: SUCCESS
+Attempting to hit cell at row: 14, column: 15: SUCCESS
+Attempting to hit cell at row: 14, column: 16: SUCCESS
+Attempting to hit cell at row: 14, column: 17: SUCCESS
+Attempting to hit cell at row: 14, column: 18: SUCCESS
+Attempting to hit cell at row: 15, column: 0: SUCCESS
+Attempting to hit cell at row: 15, column: 1: SUCCESS
+Attempting to hit cell at row: 15, column: 2: SUCCESS
+Attempting to hit cell at row: 15, column: 3: SUCCESS
+Attempting to hit cell at row: 15, column: 4: SUCCESS
+Attempting to hit cell at row: 15, column: 5: SUCCESS
+Attempting to hit cell at row: 15, column: 6: SUCCESS
+Attempting to hit cell at row: 15, column: 7: SUCCESS
+Attempting to hit cell at row: 15, column: 8: SUCCESS
+Attempting to hit cell at row: 15, column: 9: SUCCESS
+Attempting to hit cell at row: 15, column: 10: SUCCESS
+Attempting to hit cell at row: 15, column: 11: SUCCESS
+Attempting to hit cell at row: 15, column: 12: SUCCESS
+Attempting to hit cell at row: 15, column: 13: SUCCESS
+Attempting to hit cell at row: 15, column: 14: SUCCESS
+Attempting to hit cell at row: 15, column: 15: SUCCESS
+Attempting to hit cell at row: 15, column: 16: SUCCESS
+Attempting to hit cell at row: 15, column: 17: SUCCESS
+Attempting to hit cell at row: 15, column: 18: SUCCESS
+Attempting to hit cell at row: 16, column: 0: SUCCESS
+Attempting to hit cell at row: 16, column: 1: SUCCESS
+Attempting to hit cell at row: 16, column: 2: SUCCESS
+Attempting to hit cell at row: 16, column: 3: SUCCESS
+Attempting to hit cell at row: 16, column: 4: SUCCESS
+Attempting to hit cell at row: 16, column: 5: SUCCESS
+Attempting to hit cell at row: 16, column: 6: SUCCESS
+Attempting to hit cell at row: 16, column: 7: SUCCESS
+Attempting to hit cell at row: 16, column: 8: SUCCESS
+Attempting to hit cell at row: 16, column: 9: SUCCESS
+Attempting to hit cell at row: 16, column: 10: SUCCESS
+Attempting to hit cell at row: 16, column: 11: SUCCESS
+Attempting to hit cell at row: 16, column: 12: SUCCESS
+Attempting to hit cell at row: 16, column: 13: SUCCESS
+Attempting to hit cell at row: 16, column: 14: SUCCESS
+Attempting to hit cell at row: 16, column: 15: SUCCESS
+Attempting to hit cell at row: 16, column: 16: SUCCESS
+Attempting to hit cell at row: 16, column: 17: SUCCESS
+Attempting to hit cell at row: 16, column: 18: SUCCESS
+Attempting to hit cell at row: 17, column: 0: SUCCESS
+Attempting to hit cell at row: 17, column: 1: SUCCESS
+Attempting to hit cell at row: 17, column: 2: SUCCESS
+Attempting to hit cell at row: 17, column: 3: SUCCESS
+Attempting to hit cell at row: 17, column: 4: SUCCESS
+Attempting to hit cell at row: 17, column: 5: SUCCESS
+Attempting to hit cell at row: 17, column: 6: SUCCESS
+Attempting to hit cell at row: 17, column: 7: SUCCESS
+Attempting to hit cell at row: 17, column: 8: SUCCESS
+Attempting to hit cell at row: 17, column: 9: SUCCESS
+Attempting to hit cell at row: 17, column: 10: SUCCESS
+Attempting to hit cell at row: 17, column: 11: SUCCESS
+Attempting to hit cell at row: 17, column: 12: SUCCESS
+Attempting to hit cell at row: 17, column: 13: SUCCESS
+Attempting to hit cell at row: 17, column: 14: SUCCESS
+Attempting to hit cell at row: 17, column: 15: SUCCESS
+Attempting to hit cell at row: 17, column: 16: SUCCESS
+Attempting to hit cell at row: 17, column: 17: SUCCESS
+Attempting to hit cell at row: 17, column: 18: SUCCESS
+Attempting to hit cell at row: 18, column: 0: SUCCESS
+Attempting to hit cell at row: 18, column: 1: SUCCESS
+Attempting to hit cell at row: 18, column: 2: SUCCESS
+Attempting to hit cell at row: 18, column: 3: SUCCESS
+Attempting to hit cell at row: 18, column: 4: SUCCESS
+Attempting to hit cell at row: 18, column: 5: SUCCESS
+Attempting to hit cell at row: 18, column: 6: SUCCESS
+Attempting to hit cell at row: 18, column: 7: SUCCESS
+Attempting to hit cell at row: 18, column: 8: SUCCESS
+Attempting to hit cell at row: 18, column: 9: SUCCESS
+Attempting to hit cell at row: 18, column: 10: SUCCESS
+Attempting to hit cell at row: 18, column: 11: SUCCESS
+Attempting to hit cell at row: 18, column: 12: SUCCESS
+Attempting to hit cell at row: 18, column: 13: SUCCESS
+Attempting to hit cell at row: 18, column: 14: SUCCESS
+Attempting to hit cell at row: 18, column: 15: SUCCESS
+Attempting to hit cell at row: 18, column: 16: SUCCESS
+Attempting to hit cell at row: 18, column: 17: SUCCESS
+Attempting to hit cell at row: 18, column: 18: SUCCESS
+Attempting to hit cell at row: 19, column: 0: SUCCESS
+Attempting to hit cell at row: 19, column: 1: SUCCESS
+Attempting to hit cell at row: 19, column: 2: SUCCESS
+Attempting to hit cell at row: 19, column: 3: SUCCESS
+Attempting to hit cell at row: 19, column: 4: SUCCESS
+Attempting to hit cell at row: 19, column: 5: SUCCESS
+Attempting to hit cell at row: 19, column: 6: SUCCESS
+Attempting to hit cell at row: 19, column: 7: SUCCESS
+Attempting to hit cell at row: 19, column: 8: SUCCESS
+Attempting to hit cell at row: 19, column: 9: SUCCESS
+Attempting to hit cell at row: 19, column: 10: SUCCESS
+Attempting to hit cell at row: 19, column: 11: SUCCESS
+Attempting to hit cell at row: 19, column: 12: SUCCESS
+Attempting to hit cell at row: 19, column: 13: SUCCESS
+Attempting to hit cell at row: 19, column: 14: SUCCESS
+Attempting to hit cell at row: 19, column: 15: SUCCESS
+Attempting to hit cell at row: 19, column: 16: SUCCESS
+Attempting to hit cell at row: 19, column: 17: SUCCESS
+Attempting to hit cell at row: 19, column: 18: SUCCESS
+Attempting to hit cell at row: 20, column: 0: SUCCESS
+Attempting to hit cell at row: 20, column: 1: SUCCESS
+Attempting to hit cell at row: 20, column: 2: SUCCESS
+Attempting to hit cell at row: 20, column: 3: SUCCESS
+Attempting to hit cell at row: 20, column: 4: SUCCESS
+Attempting to hit cell at row: 20, column: 5: SUCCESS
+Attempting to hit cell at row: 20, column: 6: SUCCESS
+Attempting to hit cell at row: 20, column: 7: SUCCESS
+Attempting to hit cell at row: 20, column: 8: SUCCESS
+Attempting to hit cell at row: 20, column: 9: SUCCESS
+Attempting to hit cell at row: 20, column: 10: SUCCESS
+Attempting to hit cell at row: 20, column: 11: SUCCESS
+Attempting to hit cell at row: 20, column: 12: SUCCESS
+Attempting to hit cell at row: 20, column: 13: SUCCESS
+Attempting to hit cell at row: 20, column: 14: SUCCESS
+Attempting to hit cell at row: 20, column: 15: SUCCESS
+Attempting to hit cell at row: 20, column: 16: SUCCESS
+Attempting to hit cell at row: 20, column: 17: SUCCESS
+Attempting to hit cell at row: 20, column: 18: SUCCESS
+Attempting to hit cell at row: 21, column: 0: SUCCESS
+Attempting to hit cell at row: 21, column: 1: SUCCESS
+Attempting to hit cell at row: 21, column: 2: SUCCESS
+Attempting to hit cell at row: 21, column: 3: SUCCESS
+Attempting to hit cell at row: 21, column: 4: SUCCESS
+Attempting to hit cell at row: 21, column: 5: SUCCESS
+Attempting to hit cell at row: 21, column: 6: SUCCESS
+Attempting to hit cell at row: 21, column: 7: SUCCESS
+Attempting to hit cell at row: 21, column: 8: SUCCESS
+Attempting to hit cell at row: 21, column: 9: SUCCESS
+Attempting to hit cell at row: 21, column: 10: SUCCESS
+Attempting to hit cell at row: 21, column: 11: SUCCESS
+Attempting to hit cell at row: 21, column: 12: SUCCESS
+Attempting to hit cell at row: 21, column: 13: SUCCESS
+Attempting to hit cell at row: 21, column: 14: SUCCESS
+Attempting to hit cell at row: 21, column: 15: SUCCESS
+Attempting to hit cell at row: 21, column: 16: SUCCESS
+Attempting to hit cell at row: 21, column: 17: SUCCESS
+Attempting to hit cell at row: 21, column: 18: SUCCESS
+Attempting to hit cell at row: 22, column: 0: SUCCESS
+Attempting to hit cell at row: 22, column: 1: SUCCESS
+Attempting to hit cell at row: 22, column: 2: SUCCESS
+Attempting to hit cell at row: 22, column: 3: SUCCESS
+Attempting to hit cell at row: 22, column: 4: SUCCESS
+Attempting to hit cell at row: 22, column: 5: SUCCESS
+Attempting to hit cell at row: 22, column: 6: SUCCESS
+Attempting to hit cell at row: 22, column: 7: SUCCESS
+Attempting to hit cell at row: 22, column: 8: SUCCESS
+Attempting to hit cell at row: 22, column: 9: SUCCESS
+Attempting to hit cell at row: 22, column: 10: SUCCESS
+Attempting to hit cell at row: 22, column: 11: SUCCESS
+Attempting to hit cell at row: 22, column: 12: SUCCESS
+Attempting to hit cell at row: 22, column: 13: SUCCESS
+Attempting to hit cell at row: 22, column: 14: SUCCESS
+Attempting to hit cell at row: 22, column: 15: SUCCESS
+Attempting to hit cell at row: 22, column: 16: SUCCESS
+Attempting to hit cell at row: 22, column: 17: SUCCESS
+Attempting to hit cell at row: 22, column: 18: SUCCESS
+Attempting to hit cell at row: 23, column: 0: SUCCESS
+Attempting to hit cell at row: 23, column: 1: SUCCESS
+Attempting to hit cell at row: 23, column: 2: SUCCESS
+Attempting to hit cell at row: 23, column: 3: SUCCESS
+Attempting to hit cell at row: 23, column: 4: SUCCESS
+Attempting to hit cell at row: 23, column: 5: SUCCESS
+Attempting to hit cell at row: 23, column: 6: SUCCESS
+Attempting to hit cell at row: 23, column: 7: SUCCESS
+Attempting to hit cell at row: 23, column: 8: SUCCESS
+Attempting to hit cell at row: 23, column: 9: SUCCESS
+Attempting to hit cell at row: 23, column: 10: SUCCESS
+Attempting to hit cell at row: 23, column: 11: SUCCESS
+Attempting to hit cell at row: 23, column: 12: SUCCESS
+Attempting to hit cell at row: 23, column: 13: SUCCESS
+Attempting to hit cell at row: 23, column: 14: SUCCESS
+Attempting to hit cell at row: 23, column: 15: SUCCESS
+Attempting to hit cell at row: 23, column: 16: SUCCESS
+Attempting to hit cell at row: 23, column: 17: SUCCESS
+Attempting to hit cell at row: 23, column: 18: SUCCESS
+
index 691093b..c997a71 100644 (file)
@@ -3163,6 +3163,14 @@ BUG51869 : websocket/tests/frame-length-overflow.html = TEXT PASS
 
 BUG51854 WIN SLOW : http/tests/storage/callbacks-are-called-in-correct-context.html = PASS
 
+// Temporarily there until we baseline for Windows and Mac
+BUG43933 WIN MAC : tables/hittesting/filltable-stress.html = FAIL
+BUG43933 WIN MAC : tables/hittesting/filltable-rtl.html = FAIL
+BUG43933 WIN MAC : tables/hittesting/filltable-outline.html = FAIL
+BUG43933 WIN MAC : tables/hittesting/filltable-levels.html = FAIL
+BUG43933 WIN MAC : tables/hittesting/filltable-emptycells.html = FAIL
+BUG43933 WIN MAC : fast/table/simple_paint.html = FAIL
+
 // Regressions from r65229
 BUGWK43912 WIN LINUX : svg/W3C-SVG-1.1/masking-intro-01-f.svg = IMAGE
 BUGWK43912 WIN : svg/W3C-SVG-1.1/masking-mask-01-b.svg = IMAGE
@@ -3182,6 +3190,7 @@ BUGWK43912 WIN LINUX : svg/custom/mask-with-all-units.svg = IMAGE
 BUGWK43912 WIN LINUX : svg/custom/mask-with-default-value.svg = IMAGE
 BUGWK43912 WIN LINUX : svg/zoom/page/zoom-mask-with-percentages.svg = IMAGE
 BUGWK43912 WIN LINUX : svg/custom/absolute-sized-content-with-resources.xhtml = IMAGE
+
 // Same symptoms, failing as of r65449
 BUGWK43912 : svg/W3C-SVG-1.1/filters-color-01-b.svg = IMAGE
 BUGWK43912 : svg/W3C-SVG-1.1/filters-composite-02-b.svg = IMAGE
diff --git a/LayoutTests/platform/gtk/fast/table/simple_paint-expected.checksum b/LayoutTests/platform/gtk/fast/table/simple_paint-expected.checksum
new file mode 100644 (file)
index 0000000..0e88c80
--- /dev/null
@@ -0,0 +1 @@
+58a97402f46fee222b81aecc51b9f92c
\ No newline at end of file
diff --git a/LayoutTests/platform/gtk/fast/table/simple_paint-expected.png b/LayoutTests/platform/gtk/fast/table/simple_paint-expected.png
new file mode 100644 (file)
index 0000000..f24d398
Binary files /dev/null and b/LayoutTests/platform/gtk/fast/table/simple_paint-expected.png differ
diff --git a/LayoutTests/platform/gtk/fast/table/simple_paint-expected.txt b/LayoutTests/platform/gtk/fast/table/simple_paint-expected.txt
new file mode 100644 (file)
index 0000000..126dcae
--- /dev/null
@@ -0,0 +1,37 @@
+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 (0,0) size 800x600
+      RenderTable {TABLE} at (0,0) size 316x301 [bgcolor=#008000] [border: none]
+        RenderTableSection {TBODY} at (0,0) size 315x300
+          RenderTableRow {TR} at (0,0) size 315x60
+            RenderTableCell {TD} at (0,28) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1]
+            RenderTableCell {TD} at (63,28) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1]
+            RenderTableCell {TD} at (126,28) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1]
+            RenderTableCell {TD} at (189,28) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=0 c=3 rs=1 cs=1]
+            RenderTableCell {TD} at (252,28) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=0 c=4 rs=1 cs=1]
+          RenderTableRow {TR} at (0,60) size 315x60
+            RenderTableCell {TD} at (0,88) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=1 c=0 rs=1 cs=1]
+            RenderTableCell {TD} at (63,88) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=1 c=1 rs=1 cs=1]
+            RenderTableCell {TD} at (126,88) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=1 c=2 rs=1 cs=1]
+            RenderTableCell {TD} at (189,88) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=1 c=3 rs=1 cs=1]
+            RenderTableCell {TD} at (252,88) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=1 c=4 rs=1 cs=1]
+          RenderTableRow {TR} at (0,120) size 315x60
+            RenderTableCell {TD} at (0,148) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=2 c=0 rs=1 cs=1]
+            RenderTableCell {TD} at (63,148) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=2 c=1 rs=1 cs=1]
+            RenderTableCell {TD} at (126,148) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=2 c=2 rs=1 cs=1]
+            RenderTableCell {TD} at (189,148) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=2 c=3 rs=1 cs=1]
+            RenderTableCell {TD} at (252,148) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=2 c=4 rs=1 cs=1]
+          RenderTableRow {TR} at (0,180) size 315x60
+            RenderTableCell {TD} at (0,208) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=3 c=0 rs=1 cs=1]
+            RenderTableCell {TD} at (63,208) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=3 c=1 rs=1 cs=1]
+            RenderTableCell {TD} at (126,208) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=3 c=2 rs=1 cs=1]
+            RenderTableCell {TD} at (189,208) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=3 c=3 rs=1 cs=1]
+            RenderTableCell {TD} at (252,208) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=3 c=4 rs=1 cs=1]
+          RenderTableRow {TR} at (0,240) size 315x60
+            RenderTableCell {TD} at (0,268) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=4 c=0 rs=1 cs=1]
+            RenderTableCell {TD} at (63,268) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=4 c=1 rs=1 cs=1]
+            RenderTableCell {TD} at (126,268) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=4 c=2 rs=1 cs=1]
+            RenderTableCell {TD} at (189,268) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=4 c=3 rs=1 cs=1]
+            RenderTableCell {TD} at (252,268) size 63x3 [bgcolor=#008000] [border: (1px solid #000000)] [r=4 c=4 rs=1 cs=1]
diff --git a/LayoutTests/platform/gtk/tables/hittesting/filltable-emptycells-expected.txt b/LayoutTests/platform/gtk/tables/hittesting/filltable-emptycells-expected.txt
new file mode 100644 (file)
index 0000000..3af318c
--- /dev/null
@@ -0,0 +1,8 @@
+SUCCESS!!!
+Hit cell at row: 0, column: 0: SUCCESS
+Hit cell at row: 0, column: 1: EMPTY
+Hit cell at row: 0, column: 2: EMPTY
+Hit cell at row: 1, column: 0: SUCCESS
+Hit cell at row: 1, column: 1: SUCCESS
+Hit cell at row: 1, column: 2: SUCCESS
+
diff --git a/LayoutTests/platform/gtk/tables/hittesting/filltable-levels-expected.txt b/LayoutTests/platform/gtk/tables/hittesting/filltable-levels-expected.txt
new file mode 100644 (file)
index 0000000..83718e6
--- /dev/null
@@ -0,0 +1,11 @@
+SUCCESS!!!
+Hit cell at row: 0, column: 0: SUCCESS
+Hit cell at row: 0, column: 1: SUCCESS
+Hit cell at row: 0, column: 2: SUCCESS
+Hit cell at row: 1, column: 0: SUCCESS
+Hit cell at row: 1, column: 1: SUCCESS
+Hit cell at row: 1, column: 2: SUCCESS
+Hit cell at row: 2, column: 0: SUCCESS
+Hit cell at row: 2, column: 1: SUCCESS
+Hit cell at row: 2, column: 2: SUCCESS
+
diff --git a/LayoutTests/platform/gtk/tables/hittesting/filltable-outline-expected.txt b/LayoutTests/platform/gtk/tables/hittesting/filltable-outline-expected.txt
new file mode 100644 (file)
index 0000000..3cddc7d
--- /dev/null
@@ -0,0 +1,102 @@
+SUCCESS!!!
+Hit cell at row: 0, column: 0: SUCCESS
+Hit cell at row: 0, column: 1: SUCCESS
+Hit cell at row: 0, column: 2: SUCCESS
+Hit cell at row: 0, column: 3: SUCCESS
+Hit cell at row: 0, column: 4: SUCCESS
+Hit cell at row: 0, column: 5: SUCCESS
+Hit cell at row: 0, column: 6: SUCCESS
+Hit cell at row: 0, column: 7: SUCCESS
+Hit cell at row: 0, column: 8: SUCCESS
+Hit cell at row: 0, column: 9: SUCCESS
+Hit cell at row: 1, column: 0: SUCCESS
+Hit cell at row: 1, column: 1: SUCCESS
+Hit cell at row: 1, column: 2: SUCCESS
+Hit cell at row: 1, column: 3: SUCCESS
+Hit cell at row: 1, column: 4: SUCCESS
+Hit cell at row: 1, column: 5: SUCCESS
+Hit cell at row: 1, column: 6: SUCCESS
+Hit cell at row: 1, column: 7: SUCCESS
+Hit cell at row: 1, column: 8: SUCCESS
+Hit cell at row: 1, column: 9: SUCCESS
+Hit cell at row: 2, column: 0: SUCCESS
+Hit cell at row: 2, column: 1: SUCCESS
+Hit cell at row: 2, column: 2: SUCCESS
+Hit cell at row: 2, column: 3: SUCCESS
+Hit cell at row: 2, column: 4: SUCCESS
+Hit cell at row: 2, column: 5: SUCCESS
+Hit cell at row: 2, column: 6: SUCCESS
+Hit cell at row: 2, column: 7: SUCCESS
+Hit cell at row: 2, column: 8: SUCCESS
+Hit cell at row: 2, column: 9: SUCCESS
+Hit cell at row: 3, column: 0: SUCCESS
+Hit cell at row: 3, column: 1: SUCCESS
+Hit cell at row: 3, column: 2: SUCCESS
+Hit cell at row: 3, column: 3: SUCCESS
+Hit cell at row: 3, column: 4: SUCCESS
+Hit cell at row: 3, column: 5: SUCCESS
+Hit cell at row: 3, column: 6: SUCCESS
+Hit cell at row: 3, column: 7: SUCCESS
+Hit cell at row: 3, column: 8: SUCCESS
+Hit cell at row: 3, column: 9: SUCCESS
+Hit cell at row: 4, column: 0: SUCCESS
+Hit cell at row: 4, column: 1: SUCCESS
+Hit cell at row: 4, column: 2: SUCCESS
+Hit cell at row: 4, column: 3: SUCCESS
+Hit cell at row: 4, column: 4: SUCCESS
+Hit cell at row: 4, column: 5: SUCCESS
+Hit cell at row: 4, column: 6: SUCCESS
+Hit cell at row: 4, column: 7: SUCCESS
+Hit cell at row: 4, column: 8: SUCCESS
+Hit cell at row: 4, column: 9: SUCCESS
+Hit cell at row: 5, column: 0: SUCCESS
+Hit cell at row: 5, column: 1: SUCCESS
+Hit cell at row: 5, column: 2: SUCCESS
+Hit cell at row: 5, column: 3: SUCCESS
+Hit cell at row: 5, column: 4: SUCCESS
+Hit cell at row: 5, column: 5: SUCCESS
+Hit cell at row: 5, column: 6: SUCCESS
+Hit cell at row: 5, column: 7: SUCCESS
+Hit cell at row: 5, column: 8: SUCCESS
+Hit cell at row: 5, column: 9: SUCCESS
+Hit cell at row: 6, column: 0: SUCCESS
+Hit cell at row: 6, column: 1: SUCCESS
+Hit cell at row: 6, column: 2: SUCCESS
+Hit cell at row: 6, column: 3: SUCCESS
+Hit cell at row: 6, column: 4: SUCCESS
+Hit cell at row: 6, column: 5: SUCCESS
+Hit cell at row: 6, column: 6: SUCCESS
+Hit cell at row: 6, column: 7: SUCCESS
+Hit cell at row: 6, column: 8: SUCCESS
+Hit cell at row: 6, column: 9: SUCCESS
+Hit cell at row: 7, column: 0: SUCCESS
+Hit cell at row: 7, column: 1: SUCCESS
+Hit cell at row: 7, column: 2: SUCCESS
+Hit cell at row: 7, column: 3: SUCCESS
+Hit cell at row: 7, column: 4: SUCCESS
+Hit cell at row: 7, column: 5: SUCCESS
+Hit cell at row: 7, column: 6: SUCCESS
+Hit cell at row: 7, column: 7: SUCCESS
+Hit cell at row: 7, column: 8: SUCCESS
+Hit cell at row: 7, column: 9: SUCCESS
+Hit cell at row: 8, column: 0: SUCCESS
+Hit cell at row: 8, column: 1: SUCCESS
+Hit cell at row: 8, column: 2: SUCCESS
+Hit cell at row: 8, column: 3: SUCCESS
+Hit cell at row: 8, column: 4: SUCCESS
+Hit cell at row: 8, column: 5: SUCCESS
+Hit cell at row: 8, column: 6: SUCCESS
+Hit cell at row: 8, column: 7: SUCCESS
+Hit cell at row: 8, column: 8: SUCCESS
+Hit cell at row: 8, column: 9: SUCCESS
+Hit cell at row: 9, column: 0: SUCCESS
+Hit cell at row: 9, column: 1: SUCCESS
+Hit cell at row: 9, column: 2: SUCCESS
+Hit cell at row: 9, column: 3: SUCCESS
+Hit cell at row: 9, column: 4: SUCCESS
+Hit cell at row: 9, column: 5: SUCCESS
+Hit cell at row: 9, column: 6: SUCCESS
+Hit cell at row: 9, column: 7: SUCCESS
+Hit cell at row: 9, column: 8: SUCCESS
+Hit cell at row: 9, column: 9: SUCCESS
+
diff --git a/LayoutTests/platform/gtk/tables/hittesting/filltable-rtl-expected.txt b/LayoutTests/platform/gtk/tables/hittesting/filltable-rtl-expected.txt
new file mode 100644 (file)
index 0000000..83718e6
--- /dev/null
@@ -0,0 +1,11 @@
+SUCCESS!!!
+Hit cell at row: 0, column: 0: SUCCESS
+Hit cell at row: 0, column: 1: SUCCESS
+Hit cell at row: 0, column: 2: SUCCESS
+Hit cell at row: 1, column: 0: SUCCESS
+Hit cell at row: 1, column: 1: SUCCESS
+Hit cell at row: 1, column: 2: SUCCESS
+Hit cell at row: 2, column: 0: SUCCESS
+Hit cell at row: 2, column: 1: SUCCESS
+Hit cell at row: 2, column: 2: SUCCESS
+
diff --git a/LayoutTests/platform/gtk/tables/hittesting/filltable-stress-expected.txt b/LayoutTests/platform/gtk/tables/hittesting/filltable-stress-expected.txt
new file mode 100644 (file)
index 0000000..f380786
--- /dev/null
@@ -0,0 +1,458 @@
+SUCCESS!!!
+Attempting to hit cell at row: 0, column: 0: SUCCESS
+Attempting to hit cell at row: 0, column: 1: SUCCESS
+Attempting to hit cell at row: 0, column: 2: SUCCESS
+Attempting to hit cell at row: 0, column: 3: SUCCESS
+Attempting to hit cell at row: 0, column: 4: SUCCESS
+Attempting to hit cell at row: 0, column: 5: SUCCESS
+Attempting to hit cell at row: 0, column: 6: SUCCESS
+Attempting to hit cell at row: 0, column: 7: SUCCESS
+Attempting to hit cell at row: 0, column: 8: SUCCESS
+Attempting to hit cell at row: 0, column: 9: SUCCESS
+Attempting to hit cell at row: 0, column: 10: SUCCESS
+Attempting to hit cell at row: 0, column: 11: SUCCESS
+Attempting to hit cell at row: 0, column: 12: SUCCESS
+Attempting to hit cell at row: 0, column: 13: SUCCESS
+Attempting to hit cell at row: 0, column: 14: SUCCESS
+Attempting to hit cell at row: 0, column: 15: SUCCESS
+Attempting to hit cell at row: 0, column: 16: SUCCESS
+Attempting to hit cell at row: 0, column: 17: SUCCESS
+Attempting to hit cell at row: 0, column: 18: SUCCESS
+Attempting to hit cell at row: 1, column: 0: SUCCESS
+Attempting to hit cell at row: 1, column: 1: SUCCESS
+Attempting to hit cell at row: 1, column: 2: SUCCESS
+Attempting to hit cell at row: 1, column: 3: SUCCESS
+Attempting to hit cell at row: 1, column: 4: SUCCESS
+Attempting to hit cell at row: 1, column: 5: SUCCESS
+Attempting to hit cell at row: 1, column: 6: SUCCESS
+Attempting to hit cell at row: 1, column: 7: SUCCESS
+Attempting to hit cell at row: 1, column: 8: SUCCESS
+Attempting to hit cell at row: 1, column: 9: SUCCESS
+Attempting to hit cell at row: 1, column: 10: SUCCESS
+Attempting to hit cell at row: 1, column: 11: SUCCESS
+Attempting to hit cell at row: 1, column: 12: SUCCESS
+Attempting to hit cell at row: 1, column: 13: SUCCESS
+Attempting to hit cell at row: 1, column: 14: SUCCESS
+Attempting to hit cell at row: 1, column: 15: SUCCESS
+Attempting to hit cell at row: 1, column: 16: SUCCESS
+Attempting to hit cell at row: 1, column: 17: SUCCESS
+Attempting to hit cell at row: 1, column: 18: SUCCESS
+Attempting to hit cell at row: 2, column: 0: SUCCESS
+Attempting to hit cell at row: 2, column: 1: SUCCESS
+Attempting to hit cell at row: 2, column: 2: SUCCESS
+Attempting to hit cell at row: 2, column: 3: SUCCESS
+Attempting to hit cell at row: 2, column: 4: SUCCESS
+Attempting to hit cell at row: 2, column: 5: SUCCESS
+Attempting to hit cell at row: 2, column: 6: SUCCESS
+Attempting to hit cell at row: 2, column: 7: SUCCESS
+Attempting to hit cell at row: 2, column: 8: SUCCESS
+Attempting to hit cell at row: 2, column: 9: SUCCESS
+Attempting to hit cell at row: 2, column: 10: SUCCESS
+Attempting to hit cell at row: 2, column: 11: SUCCESS
+Attempting to hit cell at row: 2, column: 12: SUCCESS
+Attempting to hit cell at row: 2, column: 13: SUCCESS
+Attempting to hit cell at row: 2, column: 14: SUCCESS
+Attempting to hit cell at row: 2, column: 15: SUCCESS
+Attempting to hit cell at row: 2, column: 16: SUCCESS
+Attempting to hit cell at row: 2, column: 17: SUCCESS
+Attempting to hit cell at row: 2, column: 18: SUCCESS
+Attempting to hit cell at row: 3, column: 0: SUCCESS
+Attempting to hit cell at row: 3, column: 1: SUCCESS
+Attempting to hit cell at row: 3, column: 2: SUCCESS
+Attempting to hit cell at row: 3, column: 3: SUCCESS
+Attempting to hit cell at row: 3, column: 4: SUCCESS
+Attempting to hit cell at row: 3, column: 5: SUCCESS
+Attempting to hit cell at row: 3, column: 6: SUCCESS
+Attempting to hit cell at row: 3, column: 7: SUCCESS
+Attempting to hit cell at row: 3, column: 8: SUCCESS
+Attempting to hit cell at row: 3, column: 9: SUCCESS
+Attempting to hit cell at row: 3, column: 10: SUCCESS
+Attempting to hit cell at row: 3, column: 11: SUCCESS
+Attempting to hit cell at row: 3, column: 12: SUCCESS
+Attempting to hit cell at row: 3, column: 13: SUCCESS
+Attempting to hit cell at row: 3, column: 14: SUCCESS
+Attempting to hit cell at row: 3, column: 15: SUCCESS
+Attempting to hit cell at row: 3, column: 16: SUCCESS
+Attempting to hit cell at row: 3, column: 17: SUCCESS
+Attempting to hit cell at row: 3, column: 18: SUCCESS
+Attempting to hit cell at row: 4, column: 0: SUCCESS
+Attempting to hit cell at row: 4, column: 1: SUCCESS
+Attempting to hit cell at row: 4, column: 2: SUCCESS
+Attempting to hit cell at row: 4, column: 3: SUCCESS
+Attempting to hit cell at row: 4, column: 4: SUCCESS
+Attempting to hit cell at row: 4, column: 5: SUCCESS
+Attempting to hit cell at row: 4, column: 6: SUCCESS
+Attempting to hit cell at row: 4, column: 7: SUCCESS
+Attempting to hit cell at row: 4, column: 8: SUCCESS
+Attempting to hit cell at row: 4, column: 9: SUCCESS
+Attempting to hit cell at row: 4, column: 10: SUCCESS
+Attempting to hit cell at row: 4, column: 11: SUCCESS
+Attempting to hit cell at row: 4, column: 12: SUCCESS
+Attempting to hit cell at row: 4, column: 13: SUCCESS
+Attempting to hit cell at row: 4, column: 14: SUCCESS
+Attempting to hit cell at row: 4, column: 15: SUCCESS
+Attempting to hit cell at row: 4, column: 16: SUCCESS
+Attempting to hit cell at row: 4, column: 17: SUCCESS
+Attempting to hit cell at row: 4, column: 18: SUCCESS
+Attempting to hit cell at row: 5, column: 0: SUCCESS
+Attempting to hit cell at row: 5, column: 1: SUCCESS
+Attempting to hit cell at row: 5, column: 2: SUCCESS
+Attempting to hit cell at row: 5, column: 3: SUCCESS
+Attempting to hit cell at row: 5, column: 4: SUCCESS
+Attempting to hit cell at row: 5, column: 5: SUCCESS
+Attempting to hit cell at row: 5, column: 6: SUCCESS
+Attempting to hit cell at row: 5, column: 7: SUCCESS
+Attempting to hit cell at row: 5, column: 8: SUCCESS
+Attempting to hit cell at row: 5, column: 9: SUCCESS
+Attempting to hit cell at row: 5, column: 10: SUCCESS
+Attempting to hit cell at row: 5, column: 11: SUCCESS
+Attempting to hit cell at row: 5, column: 12: SUCCESS
+Attempting to hit cell at row: 5, column: 13: SUCCESS
+Attempting to hit cell at row: 5, column: 14: SUCCESS
+Attempting to hit cell at row: 5, column: 15: SUCCESS
+Attempting to hit cell at row: 5, column: 16: SUCCESS
+Attempting to hit cell at row: 5, column: 17: SUCCESS
+Attempting to hit cell at row: 5, column: 18: SUCCESS
+Attempting to hit cell at row: 6, column: 0: SUCCESS
+Attempting to hit cell at row: 6, column: 1: SUCCESS
+Attempting to hit cell at row: 6, column: 2: SUCCESS
+Attempting to hit cell at row: 6, column: 3: SUCCESS
+Attempting to hit cell at row: 6, column: 4: SUCCESS
+Attempting to hit cell at row: 6, column: 5: SUCCESS
+Attempting to hit cell at row: 6, column: 6: SUCCESS
+Attempting to hit cell at row: 6, column: 7: SUCCESS
+Attempting to hit cell at row: 6, column: 8: SUCCESS
+Attempting to hit cell at row: 6, column: 9: SUCCESS
+Attempting to hit cell at row: 6, column: 10: SUCCESS
+Attempting to hit cell at row: 6, column: 11: SUCCESS
+Attempting to hit cell at row: 6, column: 12: SUCCESS
+Attempting to hit cell at row: 6, column: 13: SUCCESS
+Attempting to hit cell at row: 6, column: 14: SUCCESS
+Attempting to hit cell at row: 6, column: 15: SUCCESS
+Attempting to hit cell at row: 6, column: 16: SUCCESS
+Attempting to hit cell at row: 6, column: 17: SUCCESS
+Attempting to hit cell at row: 6, column: 18: SUCCESS
+Attempting to hit cell at row: 7, column: 0: SUCCESS
+Attempting to hit cell at row: 7, column: 1: SUCCESS
+Attempting to hit cell at row: 7, column: 2: SUCCESS
+Attempting to hit cell at row: 7, column: 3: SUCCESS
+Attempting to hit cell at row: 7, column: 4: SUCCESS
+Attempting to hit cell at row: 7, column: 5: SUCCESS
+Attempting to hit cell at row: 7, column: 6: SUCCESS
+Attempting to hit cell at row: 7, column: 7: SUCCESS
+Attempting to hit cell at row: 7, column: 8: SUCCESS
+Attempting to hit cell at row: 7, column: 9: SUCCESS
+Attempting to hit cell at row: 7, column: 10: SUCCESS
+Attempting to hit cell at row: 7, column: 11: SUCCESS
+Attempting to hit cell at row: 7, column: 12: SUCCESS
+Attempting to hit cell at row: 7, column: 13: SUCCESS
+Attempting to hit cell at row: 7, column: 14: SUCCESS
+Attempting to hit cell at row: 7, column: 15: SUCCESS
+Attempting to hit cell at row: 7, column: 16: SUCCESS
+Attempting to hit cell at row: 7, column: 17: SUCCESS
+Attempting to hit cell at row: 7, column: 18: SUCCESS
+Attempting to hit cell at row: 8, column: 0: SUCCESS
+Attempting to hit cell at row: 8, column: 1: SUCCESS
+Attempting to hit cell at row: 8, column: 2: SUCCESS
+Attempting to hit cell at row: 8, column: 3: SUCCESS
+Attempting to hit cell at row: 8, column: 4: SUCCESS
+Attempting to hit cell at row: 8, column: 5: SUCCESS
+Attempting to hit cell at row: 8, column: 6: SUCCESS
+Attempting to hit cell at row: 8, column: 7: SUCCESS
+Attempting to hit cell at row: 8, column: 8: SUCCESS
+Attempting to hit cell at row: 8, column: 9: SUCCESS
+Attempting to hit cell at row: 8, column: 10: SUCCESS
+Attempting to hit cell at row: 8, column: 11: SUCCESS
+Attempting to hit cell at row: 8, column: 12: SUCCESS
+Attempting to hit cell at row: 8, column: 13: SUCCESS
+Attempting to hit cell at row: 8, column: 14: SUCCESS
+Attempting to hit cell at row: 8, column: 15: SUCCESS
+Attempting to hit cell at row: 8, column: 16: SUCCESS
+Attempting to hit cell at row: 8, column: 17: SUCCESS
+Attempting to hit cell at row: 8, column: 18: SUCCESS
+Attempting to hit cell at row: 9, column: 0: SUCCESS
+Attempting to hit cell at row: 9, column: 1: SUCCESS
+Attempting to hit cell at row: 9, column: 2: SUCCESS
+Attempting to hit cell at row: 9, column: 3: SUCCESS
+Attempting to hit cell at row: 9, column: 4: SUCCESS
+Attempting to hit cell at row: 9, column: 5: SUCCESS
+Attempting to hit cell at row: 9, column: 6: SUCCESS
+Attempting to hit cell at row: 9, column: 7: SUCCESS
+Attempting to hit cell at row: 9, column: 8: SUCCESS
+Attempting to hit cell at row: 9, column: 9: SUCCESS
+Attempting to hit cell at row: 9, column: 10: SUCCESS
+Attempting to hit cell at row: 9, column: 11: SUCCESS
+Attempting to hit cell at row: 9, column: 12: SUCCESS
+Attempting to hit cell at row: 9, column: 13: SUCCESS
+Attempting to hit cell at row: 9, column: 14: SUCCESS
+Attempting to hit cell at row: 9, column: 15: SUCCESS
+Attempting to hit cell at row: 9, column: 16: SUCCESS
+Attempting to hit cell at row: 9, column: 17: SUCCESS
+Attempting to hit cell at row: 9, column: 18: SUCCESS
+Attempting to hit cell at row: 10, column: 0: SUCCESS
+Attempting to hit cell at row: 10, column: 1: SUCCESS
+Attempting to hit cell at row: 10, column: 2: SUCCESS
+Attempting to hit cell at row: 10, column: 3: SUCCESS
+Attempting to hit cell at row: 10, column: 4: SUCCESS
+Attempting to hit cell at row: 10, column: 5: SUCCESS
+Attempting to hit cell at row: 10, column: 6: SUCCESS
+Attempting to hit cell at row: 10, column: 7: SUCCESS
+Attempting to hit cell at row: 10, column: 8: SUCCESS
+Attempting to hit cell at row: 10, column: 9: SUCCESS
+Attempting to hit cell at row: 10, column: 10: SUCCESS
+Attempting to hit cell at row: 10, column: 11: SUCCESS
+Attempting to hit cell at row: 10, column: 12: SUCCESS
+Attempting to hit cell at row: 10, column: 13: SUCCESS
+Attempting to hit cell at row: 10, column: 14: SUCCESS
+Attempting to hit cell at row: 10, column: 15: SUCCESS
+Attempting to hit cell at row: 10, column: 16: SUCCESS
+Attempting to hit cell at row: 10, column: 17: SUCCESS
+Attempting to hit cell at row: 10, column: 18: SUCCESS
+Attempting to hit cell at row: 11, column: 0: SUCCESS
+Attempting to hit cell at row: 11, column: 1: SUCCESS
+Attempting to hit cell at row: 11, column: 2: SUCCESS
+Attempting to hit cell at row: 11, column: 3: SUCCESS
+Attempting to hit cell at row: 11, column: 4: SUCCESS
+Attempting to hit cell at row: 11, column: 5: SUCCESS
+Attempting to hit cell at row: 11, column: 6: SUCCESS
+Attempting to hit cell at row: 11, column: 7: SUCCESS
+Attempting to hit cell at row: 11, column: 8: SUCCESS
+Attempting to hit cell at row: 11, column: 9: SUCCESS
+Attempting to hit cell at row: 11, column: 10: SUCCESS
+Attempting to hit cell at row: 11, column: 11: SUCCESS
+Attempting to hit cell at row: 11, column: 12: SUCCESS
+Attempting to hit cell at row: 11, column: 13: SUCCESS
+Attempting to hit cell at row: 11, column: 14: SUCCESS
+Attempting to hit cell at row: 11, column: 15: SUCCESS
+Attempting to hit cell at row: 11, column: 16: SUCCESS
+Attempting to hit cell at row: 11, column: 17: SUCCESS
+Attempting to hit cell at row: 11, column: 18: SUCCESS
+Attempting to hit cell at row: 12, column: 0: SUCCESS
+Attempting to hit cell at row: 12, column: 1: SUCCESS
+Attempting to hit cell at row: 12, column: 2: SUCCESS
+Attempting to hit cell at row: 12, column: 3: SUCCESS
+Attempting to hit cell at row: 12, column: 4: SUCCESS
+Attempting to hit cell at row: 12, column: 5: SUCCESS
+Attempting to hit cell at row: 12, column: 6: SUCCESS
+Attempting to hit cell at row: 12, column: 7: SUCCESS
+Attempting to hit cell at row: 12, column: 8: SUCCESS
+Attempting to hit cell at row: 12, column: 9: SUCCESS
+Attempting to hit cell at row: 12, column: 10: SUCCESS
+Attempting to hit cell at row: 12, column: 11: SUCCESS
+Attempting to hit cell at row: 12, column: 12: SUCCESS
+Attempting to hit cell at row: 12, column: 13: SUCCESS
+Attempting to hit cell at row: 12, column: 14: SUCCESS
+Attempting to hit cell at row: 12, column: 15: SUCCESS
+Attempting to hit cell at row: 12, column: 16: SUCCESS
+Attempting to hit cell at row: 12, column: 17: SUCCESS
+Attempting to hit cell at row: 12, column: 18: SUCCESS
+Attempting to hit cell at row: 13, column: 0: SUCCESS
+Attempting to hit cell at row: 13, column: 1: SUCCESS
+Attempting to hit cell at row: 13, column: 2: SUCCESS
+Attempting to hit cell at row: 13, column: 3: SUCCESS
+Attempting to hit cell at row: 13, column: 4: SUCCESS
+Attempting to hit cell at row: 13, column: 5: SUCCESS
+Attempting to hit cell at row: 13, column: 6: SUCCESS
+Attempting to hit cell at row: 13, column: 7: SUCCESS
+Attempting to hit cell at row: 13, column: 8: SUCCESS
+Attempting to hit cell at row: 13, column: 9: SUCCESS
+Attempting to hit cell at row: 13, column: 10: SUCCESS
+Attempting to hit cell at row: 13, column: 11: SUCCESS
+Attempting to hit cell at row: 13, column: 12: SUCCESS
+Attempting to hit cell at row: 13, column: 13: SUCCESS
+Attempting to hit cell at row: 13, column: 14: SUCCESS
+Attempting to hit cell at row: 13, column: 15: SUCCESS
+Attempting to hit cell at row: 13, column: 16: SUCCESS
+Attempting to hit cell at row: 13, column: 17: SUCCESS
+Attempting to hit cell at row: 13, column: 18: SUCCESS
+Attempting to hit cell at row: 14, column: 0: SUCCESS
+Attempting to hit cell at row: 14, column: 1: SUCCESS
+Attempting to hit cell at row: 14, column: 2: SUCCESS
+Attempting to hit cell at row: 14, column: 3: SUCCESS
+Attempting to hit cell at row: 14, column: 4: SUCCESS
+Attempting to hit cell at row: 14, column: 5: SUCCESS
+Attempting to hit cell at row: 14, column: 6: SUCCESS
+Attempting to hit cell at row: 14, column: 7: SUCCESS
+Attempting to hit cell at row: 14, column: 8: SUCCESS
+Attempting to hit cell at row: 14, column: 9: SUCCESS
+Attempting to hit cell at row: 14, column: 10: SUCCESS
+Attempting to hit cell at row: 14, column: 11: SUCCESS
+Attempting to hit cell at row: 14, column: 12: SUCCESS
+Attempting to hit cell at row: 14, column: 13: SUCCESS
+Attempting to hit cell at row: 14, column: 14: SUCCESS
+Attempting to hit cell at row: 14, column: 15: SUCCESS
+Attempting to hit cell at row: 14, column: 16: SUCCESS
+Attempting to hit cell at row: 14, column: 17: SUCCESS
+Attempting to hit cell at row: 14, column: 18: SUCCESS
+Attempting to hit cell at row: 15, column: 0: SUCCESS
+Attempting to hit cell at row: 15, column: 1: SUCCESS
+Attempting to hit cell at row: 15, column: 2: SUCCESS
+Attempting to hit cell at row: 15, column: 3: SUCCESS
+Attempting to hit cell at row: 15, column: 4: SUCCESS
+Attempting to hit cell at row: 15, column: 5: SUCCESS
+Attempting to hit cell at row: 15, column: 6: SUCCESS
+Attempting to hit cell at row: 15, column: 7: SUCCESS
+Attempting to hit cell at row: 15, column: 8: SUCCESS
+Attempting to hit cell at row: 15, column: 9: SUCCESS
+Attempting to hit cell at row: 15, column: 10: SUCCESS
+Attempting to hit cell at row: 15, column: 11: SUCCESS
+Attempting to hit cell at row: 15, column: 12: SUCCESS
+Attempting to hit cell at row: 15, column: 13: SUCCESS
+Attempting to hit cell at row: 15, column: 14: SUCCESS
+Attempting to hit cell at row: 15, column: 15: SUCCESS
+Attempting to hit cell at row: 15, column: 16: SUCCESS
+Attempting to hit cell at row: 15, column: 17: SUCCESS
+Attempting to hit cell at row: 15, column: 18: SUCCESS
+Attempting to hit cell at row: 16, column: 0: SUCCESS
+Attempting to hit cell at row: 16, column: 1: SUCCESS
+Attempting to hit cell at row: 16, column: 2: SUCCESS
+Attempting to hit cell at row: 16, column: 3: SUCCESS
+Attempting to hit cell at row: 16, column: 4: SUCCESS
+Attempting to hit cell at row: 16, column: 5: SUCCESS
+Attempting to hit cell at row: 16, column: 6: SUCCESS
+Attempting to hit cell at row: 16, column: 7: SUCCESS
+Attempting to hit cell at row: 16, column: 8: SUCCESS
+Attempting to hit cell at row: 16, column: 9: SUCCESS
+Attempting to hit cell at row: 16, column: 10: SUCCESS
+Attempting to hit cell at row: 16, column: 11: SUCCESS
+Attempting to hit cell at row: 16, column: 12: SUCCESS
+Attempting to hit cell at row: 16, column: 13: SUCCESS
+Attempting to hit cell at row: 16, column: 14: SUCCESS
+Attempting to hit cell at row: 16, column: 15: SUCCESS
+Attempting to hit cell at row: 16, column: 16: SUCCESS
+Attempting to hit cell at row: 16, column: 17: SUCCESS
+Attempting to hit cell at row: 16, column: 18: SUCCESS
+Attempting to hit cell at row: 17, column: 0: SUCCESS
+Attempting to hit cell at row: 17, column: 1: SUCCESS
+Attempting to hit cell at row: 17, column: 2: SUCCESS
+Attempting to hit cell at row: 17, column: 3: SUCCESS
+Attempting to hit cell at row: 17, column: 4: SUCCESS
+Attempting to hit cell at row: 17, column: 5: SUCCESS
+Attempting to hit cell at row: 17, column: 6: SUCCESS
+Attempting to hit cell at row: 17, column: 7: SUCCESS
+Attempting to hit cell at row: 17, column: 8: SUCCESS
+Attempting to hit cell at row: 17, column: 9: SUCCESS
+Attempting to hit cell at row: 17, column: 10: SUCCESS
+Attempting to hit cell at row: 17, column: 11: SUCCESS
+Attempting to hit cell at row: 17, column: 12: SUCCESS
+Attempting to hit cell at row: 17, column: 13: SUCCESS
+Attempting to hit cell at row: 17, column: 14: SUCCESS
+Attempting to hit cell at row: 17, column: 15: SUCCESS
+Attempting to hit cell at row: 17, column: 16: SUCCESS
+Attempting to hit cell at row: 17, column: 17: SUCCESS
+Attempting to hit cell at row: 17, column: 18: SUCCESS
+Attempting to hit cell at row: 18, column: 0: SUCCESS
+Attempting to hit cell at row: 18, column: 1: SUCCESS
+Attempting to hit cell at row: 18, column: 2: SUCCESS
+Attempting to hit cell at row: 18, column: 3: SUCCESS
+Attempting to hit cell at row: 18, column: 4: SUCCESS
+Attempting to hit cell at row: 18, column: 5: SUCCESS
+Attempting to hit cell at row: 18, column: 6: SUCCESS
+Attempting to hit cell at row: 18, column: 7: SUCCESS
+Attempting to hit cell at row: 18, column: 8: SUCCESS
+Attempting to hit cell at row: 18, column: 9: SUCCESS
+Attempting to hit cell at row: 18, column: 10: SUCCESS
+Attempting to hit cell at row: 18, column: 11: SUCCESS
+Attempting to hit cell at row: 18, column: 12: SUCCESS
+Attempting to hit cell at row: 18, column: 13: SUCCESS
+Attempting to hit cell at row: 18, column: 14: SUCCESS
+Attempting to hit cell at row: 18, column: 15: SUCCESS
+Attempting to hit cell at row: 18, column: 16: SUCCESS
+Attempting to hit cell at row: 18, column: 17: SUCCESS
+Attempting to hit cell at row: 18, column: 18: SUCCESS
+Attempting to hit cell at row: 19, column: 0: SUCCESS
+Attempting to hit cell at row: 19, column: 1: SUCCESS
+Attempting to hit cell at row: 19, column: 2: SUCCESS
+Attempting to hit cell at row: 19, column: 3: SUCCESS
+Attempting to hit cell at row: 19, column: 4: SUCCESS
+Attempting to hit cell at row: 19, column: 5: SUCCESS
+Attempting to hit cell at row: 19, column: 6: SUCCESS
+Attempting to hit cell at row: 19, column: 7: SUCCESS
+Attempting to hit cell at row: 19, column: 8: SUCCESS
+Attempting to hit cell at row: 19, column: 9: SUCCESS
+Attempting to hit cell at row: 19, column: 10: SUCCESS
+Attempting to hit cell at row: 19, column: 11: SUCCESS
+Attempting to hit cell at row: 19, column: 12: SUCCESS
+Attempting to hit cell at row: 19, column: 13: SUCCESS
+Attempting to hit cell at row: 19, column: 14: SUCCESS
+Attempting to hit cell at row: 19, column: 15: SUCCESS
+Attempting to hit cell at row: 19, column: 16: SUCCESS
+Attempting to hit cell at row: 19, column: 17: SUCCESS
+Attempting to hit cell at row: 19, column: 18: SUCCESS
+Attempting to hit cell at row: 20, column: 0: SUCCESS
+Attempting to hit cell at row: 20, column: 1: SUCCESS
+Attempting to hit cell at row: 20, column: 2: SUCCESS
+Attempting to hit cell at row: 20, column: 3: SUCCESS
+Attempting to hit cell at row: 20, column: 4: SUCCESS
+Attempting to hit cell at row: 20, column: 5: SUCCESS
+Attempting to hit cell at row: 20, column: 6: SUCCESS
+Attempting to hit cell at row: 20, column: 7: SUCCESS
+Attempting to hit cell at row: 20, column: 8: SUCCESS
+Attempting to hit cell at row: 20, column: 9: SUCCESS
+Attempting to hit cell at row: 20, column: 10: SUCCESS
+Attempting to hit cell at row: 20, column: 11: SUCCESS
+Attempting to hit cell at row: 20, column: 12: SUCCESS
+Attempting to hit cell at row: 20, column: 13: SUCCESS
+Attempting to hit cell at row: 20, column: 14: SUCCESS
+Attempting to hit cell at row: 20, column: 15: SUCCESS
+Attempting to hit cell at row: 20, column: 16: SUCCESS
+Attempting to hit cell at row: 20, column: 17: SUCCESS
+Attempting to hit cell at row: 20, column: 18: SUCCESS
+Attempting to hit cell at row: 21, column: 0: SUCCESS
+Attempting to hit cell at row: 21, column: 1: SUCCESS
+Attempting to hit cell at row: 21, column: 2: SUCCESS
+Attempting to hit cell at row: 21, column: 3: SUCCESS
+Attempting to hit cell at row: 21, column: 4: SUCCESS
+Attempting to hit cell at row: 21, column: 5: SUCCESS
+Attempting to hit cell at row: 21, column: 6: SUCCESS
+Attempting to hit cell at row: 21, column: 7: SUCCESS
+Attempting to hit cell at row: 21, column: 8: SUCCESS
+Attempting to hit cell at row: 21, column: 9: SUCCESS
+Attempting to hit cell at row: 21, column: 10: SUCCESS
+Attempting to hit cell at row: 21, column: 11: SUCCESS
+Attempting to hit cell at row: 21, column: 12: SUCCESS
+Attempting to hit cell at row: 21, column: 13: SUCCESS
+Attempting to hit cell at row: 21, column: 14: SUCCESS
+Attempting to hit cell at row: 21, column: 15: SUCCESS
+Attempting to hit cell at row: 21, column: 16: SUCCESS
+Attempting to hit cell at row: 21, column: 17: SUCCESS
+Attempting to hit cell at row: 21, column: 18: SUCCESS
+Attempting to hit cell at row: 22, column: 0: SUCCESS
+Attempting to hit cell at row: 22, column: 1: SUCCESS
+Attempting to hit cell at row: 22, column: 2: SUCCESS
+Attempting to hit cell at row: 22, column: 3: SUCCESS
+Attempting to hit cell at row: 22, column: 4: SUCCESS
+Attempting to hit cell at row: 22, column: 5: SUCCESS
+Attempting to hit cell at row: 22, column: 6: SUCCESS
+Attempting to hit cell at row: 22, column: 7: SUCCESS
+Attempting to hit cell at row: 22, column: 8: SUCCESS
+Attempting to hit cell at row: 22, column: 9: SUCCESS
+Attempting to hit cell at row: 22, column: 10: SUCCESS
+Attempting to hit cell at row: 22, column: 11: SUCCESS
+Attempting to hit cell at row: 22, column: 12: SUCCESS
+Attempting to hit cell at row: 22, column: 13: SUCCESS
+Attempting to hit cell at row: 22, column: 14: SUCCESS
+Attempting to hit cell at row: 22, column: 15: SUCCESS
+Attempting to hit cell at row: 22, column: 16: SUCCESS
+Attempting to hit cell at row: 22, column: 17: SUCCESS
+Attempting to hit cell at row: 22, column: 18: SUCCESS
+Attempting to hit cell at row: 23, column: 0: SUCCESS
+Attempting to hit cell at row: 23, column: 1: SUCCESS
+Attempting to hit cell at row: 23, column: 2: SUCCESS
+Attempting to hit cell at row: 23, column: 3: SUCCESS
+Attempting to hit cell at row: 23, column: 4: SUCCESS
+Attempting to hit cell at row: 23, column: 5: SUCCESS
+Attempting to hit cell at row: 23, column: 6: SUCCESS
+Attempting to hit cell at row: 23, column: 7: SUCCESS
+Attempting to hit cell at row: 23, column: 8: SUCCESS
+Attempting to hit cell at row: 23, column: 9: SUCCESS
+Attempting to hit cell at row: 23, column: 10: SUCCESS
+Attempting to hit cell at row: 23, column: 11: SUCCESS
+Attempting to hit cell at row: 23, column: 12: SUCCESS
+Attempting to hit cell at row: 23, column: 13: SUCCESS
+Attempting to hit cell at row: 23, column: 14: SUCCESS
+Attempting to hit cell at row: 23, column: 15: SUCCESS
+Attempting to hit cell at row: 23, column: 16: SUCCESS
+Attempting to hit cell at row: 23, column: 17: SUCCESS
+Attempting to hit cell at row: 23, column: 18: SUCCESS
+
diff --git a/LayoutTests/tables/hittesting/filltable-emptycells.html b/LayoutTests/tables/hittesting/filltable-emptycells.html
new file mode 100644 (file)
index 0000000..81e4ac1
--- /dev/null
@@ -0,0 +1,74 @@
+<html>
+<head>
+  <title>Hit Test: Table with empty cells</title>
+  <style>
+    table.testtable {background-color: green; border: 0px; border-collapse: collapse;}
+    table.testtable td { font-size: 20px; border: none; background-color: red; border-spacing:0px; width:30px; height:30px;}
+    body { margin: 0px 0px 0px 0px; }
+  </style>
+  <script language="JavaScript" type="text/javascript">
+    var cellHeight = 30;
+    var cellWidth = 30;
+    var logMsg = "";
+    var lastSuccess = 0;
+    var failed = false;
+
+   if (window.layoutTestController) {
+        layoutTestController.dumpAsText();
+        window.layoutTestController.waitUntilDone();
+    }
+
+    function isEmpty(row, col) {
+      return row == 0 && col > 0;
+    }
+
+    function cellMouseMove(cell) {
+      var cellId = 3 * cell.parentNode.rowIndex  + cell.cellIndex;
+      cell.style.backgroundColor = "green";
+      // If we see an even number of moves then the cell's bit is 1 else 0
+      lastSuccess = cellId;
+    }
+
+    function doTest() {
+      if (!window.layoutTestController) return;
+      var ypos = cellHeight / 2;
+      for (var row = 0; row < 2; row++) {
+        var xpos = cellWidth / 2;
+        for (var col = 0; col < 3; col++) {
+          var oldLastSuccess = lastSuccess;
+          eventSender.mouseMoveTo(xpos, ypos);
+          var cellId = 3 * row + col;
+          logMsg += "Hit cell at row: " + row + ", column: " + col + ": ";     
+          var success = lastSuccess == cellId;
+          var empty = isEmpty(row, col);
+          if (!success && !empty) failed = true;
+          logMsg += (success ? "SUCCESS" : ((empty &&  lastSuccess == oldLastSuccess)? "EMPTY" : "FAIL")) + "<br />";
+          xpos += cellWidth;
+        }
+        ypos += cellHeight;
+      }
+      document.body.innerHTML = (failed ? "FAIL!!!<br/>" : "SUCCESS!!!<br/>") +logMsg;
+      if (window.layoutTestController) {
+          window.layoutTestController.notifyDone();
+      }
+    }
+  </script>
+</head>
+  <body onload="doTest()">
+
+    <table class="testtable">
+      <tr>
+        <td align="right" id="r1c1" onmousemove="cellMouseMove(this)">
+        </td>
+      </tr>
+      <tr>
+        <td id="r2c1" onmousemove="cellMouseMove(this)">
+        </td>
+        <td id="r2c2" onmousemove="cellMouseMove(this)">
+        </td>
+        <td id="r2c3" onmousemove="cellMouseMove(this)">
+        </td>
+      </tr>
+    </table>
+  </body>
+</html>
diff --git a/LayoutTests/tables/hittesting/filltable-levels.html b/LayoutTests/tables/hittesting/filltable-levels.html
new file mode 100644 (file)
index 0000000..8e8fc3a
--- /dev/null
@@ -0,0 +1,112 @@
+<html>
+<head>
+  <title>Hit Test: Table with Cell Levels </title>
+  <style>
+    table.testtable {border: 0px; border-collapse: collapse;}
+    table.testtable td { font-size: 20px; border: none; background-color: red; border-spacing:0px; width:30px; height:30px;}
+    body { margin: 0px 0px 0px 0px; }
+  </style>
+
+<script language="JavaScript" type="text/javascript">
+    var cellHeight = 30;
+    var cellWidth = 30;
+    var logMsg = "";
+    var failed = false;
+    var hitArray = [[false, false, false],
+                    [false, false, false],
+                    [false, false, false]];
+
+
+    if (window.layoutTestController) {
+        window.layoutTestController.dumpAsText();
+        window.layoutTestController.waitUntilDone();
+    }
+
+    function clearHitArray() {
+      for (var i = 0; i < hitArray.length; ++i) {
+          for (var j = 0; j < hitArray[i].length; ++j) {
+             hitArray[i][j] = false;
+          } 
+      }
+    }
+
+    function cellMouseMove_r1c1(cell) {
+      hitArray[0][0] = true;
+      cell.style.backgroundColor = "green";
+    }
+    function cellMouseMove_r1c2(cell) {
+      hitArray[0][1] = true;
+      cell.style.backgroundColor = "green";
+    }
+    function cellMouseMove_r1c3(cell) {
+      hitArray[0][2] = true;
+      cell.style.backgroundColor = "green";
+    }
+    function cellMouseMove_r2c1(cell) {
+      hitArray[1][0] = true;
+      cell.style.backgroundColor = "green";
+    }
+
+    function cellMouseMove_r2c2(cell) {
+      hitArray[1][1] = true;
+      // The second grid slot that this cell occupies is obscured by another cell.
+      //hitArray[2][1] = true;
+      cell.style.backgroundColor = "green";
+    }
+
+    function cellMouseMove_r2c3(cell) {
+      hitArray[1][2] = true;
+      cell.style.backgroundColor = "green";
+    }
+
+    function cellMouseMove_r3c1(cell) {
+      hitArray[2][0] = true;
+      hitArray[2][1] = true;
+      cell.style.backgroundColor = "green";
+    }
+
+    function cellMouseMove_r3c3(cell) {
+      hitArray[2][2] = true;
+      cell.style.backgroundColor = "green";
+    }
+
+    function doTest() {
+      var ypos = cellHeight / 2;
+      for (var row = 0; row < 3; row++) {
+        var xpos = cellWidth / 2;
+        for (var col = 0; col < 3; col++) {
+          logMsg += "Hit cell at row: " + row + ", column: " + col + ": ";
+          eventSender.mouseMoveTo(xpos, ypos);
+          if (!hitArray[row][col]) failed = true;
+          logMsg += (hitArray[row][col] ? "SUCCESS" : "FAIL") + "<br />";
+          clearHitArray();
+          xpos += cellWidth;
+        }
+        ypos += cellHeight;
+      }
+      document.body.innerHTML =(failed ? "FAIL!!!<br/>" : "SUCCESS!!!<br/>") +logMsg;
+      if (window.layoutTestController) {
+          window.layoutTestController.notifyDone();
+      }
+    }
+</script>
+</head>
+<body onload="doTest()">
+  <table class="testtable"> 
+    <tr>
+      <td id="r1c1" onmousemove="cellMouseMove_r1c1(this)"></td>
+      <td id="r1c2" onmousemove="cellMouseMove_r1c2(this)"></td>
+      <td id="r1c3" onmousemove="cellMouseMove_r1c3(this)"></td>
+    </tr>
+    <tr>
+    <td id="r2c1" onmousemove="cellMouseMove_r2c1(this)"></td>
+    <td id="r2c2" onmousemove="cellMouseMove_r2c2(this)" rowspan="2"></td>
+    <td id="r2c3" onmousemove="cellMouseMove_r2c3(this)"></td>
+    </tr>
+    <tr>
+      <td id="r3c1" onmousemove="cellMouseMove_r3c1(this)" colspan="2"></td> 
+      <td id="r3c3" onmousemove="cellMouseMove_r3c3(this)"></td> 
+    </tr>
+  </table>
+</body>
+</html>
diff --git a/LayoutTests/tables/hittesting/filltable-outline.html b/LayoutTests/tables/hittesting/filltable-outline.html
new file mode 100644 (file)
index 0000000..c61c638
--- /dev/null
@@ -0,0 +1,204 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+
+<head>
+<title>Fill Table Hit Test</title>
+  <style>
+    table.testtable { border-width: 0 0 0 0; border-collapse: collapse;}
+    table.testtable td {  font-size: 20px; background-color: red; border-spacing:0px; width:30px; height:30px; }
+    body { margin: 0px 0px 0px 0px; }
+  </style>
+  <script language="JavaScript" type="text/javascript">
+    var cellHeight = 30;
+    var cellWidth = 30;
+    var hitArray = new Array();
+    var logMsg = "";
+    var failed = false;
+
+    if (window.layoutTestController) {
+        window.layoutTestController.dumpAsText();
+        window.layoutTestController.waitUntilDone();
+    }
+
+    for (var row = 0; row < 10; ++row) {
+        hitArray[row] = new Array();
+        for (var col = 0; col < 10; ++col) {
+            hitArray[row][col] = false;
+        } 
+    }
+
+    function clearHitArray() {
+        for (var i = 0; i < hitArray.length; ++i) {
+            for (var j = 0; j < hitArray[i].length; ++j) {
+               hitArray[i][j] = false;
+            } 
+        }
+    }
+
+    function doTest() {
+        // This test confirms that hits pass through large cell outlines.
+        var ypos = cellHeight /2 ;
+        for (var row = 0; row < 10; row++) {
+          var xpos = cellWidth / 2; 
+          for (var col = 0; col < 10; col++) {
+              logMsg += "Hit cell at row: " + row + ", column: " + col + ": ";
+              var elem = document.elementFromPoint(xpos, ypos);
+              if (elem) elem.onmousemove();
+              if (!hitArray[row][col]) failed = true;
+              logMsg += (hitArray[row][col] ? "SUCCESS" : "FAIL") + "<br />";
+              clearHitArray();
+            xpos += cellWidth;
+          }
+          ypos += cellHeight;
+        }
+        // Hide the outlines now.
+        var outline1 = document.getElementById("outline1");
+        outline1.style.outline = "none";
+        var outline2 = document.getElementById("outline2");
+        outline2.style.outline = "none";
+        document.body.innerHTML =(failed ? "FAIL!!!<br/>" : "SUCCESS!!!<br/>") +logMsg;
+        if (window.layoutTestController) {
+            window.layoutTestController.notifyDone();
+        }
+    }
+
+    function cellMouseMove(cell) {
+        hitArray[cell.parentNode.rowIndex][cell.cellIndex] = true;
+        cell.style.backgroundColor = "green";
+    }
+
+    function setup() {
+        setTimeout('doTest()', 10);
+    }
+  </script>
+</head>
+
+<body onload="setup()" >
+  <table class="testtable" cellpadding="0" cellspacing="0">
+      <tr>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+      </tr>
+      <tr>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+      </tr>
+      <tr>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)" id="outline1" style="outline: 50px solid red;"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+      </tr>
+      <tr>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+          <td onmousemove="cellMouseMove(this)"></td>
+      </tr>
+      <tr>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)" id="cellabove" style="background-color: red;"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+      </tr>
+      <tr>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)" id="cellleft"></td>
+          <td  onmousemove="cellMouseMove(this)" id="outline2" style="outline: 50px solid red;"></td>
+          <td  onmousemove="cellMouseMove(this)" id="cellright"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+      </tr>
+      <tr>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)" id="cellbelow"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+      </tr>
+      <tr>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+      </tr>
+      <tr>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+      </tr>
+      <tr>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+          <td  onmousemove="cellMouseMove(this)"></td>
+      </tr>
+  </table>
+</body>
+
+</html>
+
diff --git a/LayoutTests/tables/hittesting/filltable-rtl.html b/LayoutTests/tables/hittesting/filltable-rtl.html
new file mode 100644 (file)
index 0000000..f7d9910
--- /dev/null
@@ -0,0 +1,102 @@
+<html>
+<head>
+<title>Hit Test: Right-to-Left Table</title>
+  <style>
+    table.testtable {background-color: green; border: 0px; border-collapse: collapse;}
+    table.testtable td { font-size: 20px; border: none; background-color: red; border-spacing:0px; width:60px; height:60px; direction:rtl;}
+    body { margin: 0px 0px 0px 0px; }
+  </style>
+  <script>
+      var cellHeight = 60;
+      var cellWidth = 60;
+      var logMsg = "";
+      var failed = false;
+      var hitArray = [[false, false, false],
+                      [false, false, false],
+                      [false, false, false]];
+
+      if (window.layoutTestController) {
+          window.layoutTestController.dumpAsText();
+          window.layoutTestController.waitUntilDone();
+      }
+
+      function clearHitArray() {
+          for (var i = 0; i < hitArray.length; ++i) {
+              for (var j = 0; j < hitArray[i].length; ++j) {
+                 hitArray[i][j] = false;
+              } 
+          }
+      }
+
+      function cellMouseMove_r1c1(cell) {
+          hitArray[0][0] = true;
+          hitArray[0][1] = true;
+          hitArray[0][2] = true;
+          cell.style.backgroundColor = "green";
+      }
+
+      function cellMouseMove_r2c1(cell) {
+          hitArray[1][0] = true;
+          cell.style.backgroundColor = "green";
+      }
+
+      function cellMouseMove_r2c2(cell) {
+          hitArray[1][1] = true;
+          hitArray[2][1] = true;
+          cell.style.backgroundColor = "green";
+      }
+
+      function cellMouseMove_r2c3(cell) {
+          hitArray[1][2] = true;
+          cell.style.backgroundColor = "green";
+      }
+
+      function cellMouseMove_r3c1(cell) {
+          hitArray[2][0] = true;
+          cell.style.backgroundColor = "green";
+      }
+
+      function cellMouseMove_r3c3(cell) {
+          hitArray[2][2] = true;
+          cell.style.backgroundColor = "green";
+      }
+
+    function doTest() {
+      var ypos = cellHeight / 2;
+      for (var row = 0; row < 3; row++) {
+        var xpos = cellWidth / 2;
+        for (var col = 0; col < 3; col++) {
+          logMsg += "Hit cell at row: " + row + ", column: " + col + ": ";
+          eventSender.mouseMoveTo(xpos, ypos);
+          if (!hitArray[row][col]) failed = true;
+          logMsg += (hitArray[row][col] ? "SUCCESS" : "FAIL") + "<br />";
+          clearHitArray();
+          xpos += cellWidth;
+        }
+        ypos += cellHeight;
+      }
+      document.body.innerHTML =(failed ? "FAIL!!!<br/>" : "SUCCESS!!!<br/>") +logMsg;
+      if (window.layoutTestController) {
+          window.layoutTestController.notifyDone();
+      }
+    }
+
+  </script>
+</head>
+  <body onload="doTest()">
+    <table class="testtable">
+      <tr>
+        <td colspan="3" align="right" onmousemove="cellMouseMove_r1c1(this)"></td>
+      </tr>
+      <tr>
+        <td onmousemove="cellMouseMove_r2c1(this)"></td>
+        <td rowspan="2" onmousemove="cellMouseMove_r2c2(this)"></td>
+        <td onmousemove="cellMouseMove_r2c3(this)"></td>
+      </tr>
+      <tr>
+        <td onmousemove="cellMouseMove_r3c1(this)"></td>
+        <td onmousemove="cellMouseMove_r3c3(this)"></td>
+      </tr>
+    </table>
+  </body>
+</html>
diff --git a/LayoutTests/tables/hittesting/filltable-stress.html b/LayoutTests/tables/hittesting/filltable-stress.html
new file mode 100644 (file)
index 0000000..61286e3
--- /dev/null
@@ -0,0 +1,76 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+
+<head>
+<title>Fill Table Hit Test</title>
+  <style>
+    body { margin: 0px 0px 0px 0px; }
+  </style>
+  <script language="JavaScript" type="text/javascript">
+    var cellHeight = 20; 
+    var logMsg = "";
+    var lastSuccess = 0;
+    var failed = false;
+
+    if (window.layoutTestController) {
+        layoutTestController.dumpAsText();
+        window.layoutTestController.waitUntilDone();
+    }
+
+    function cellMouseMove(cell) {
+      cell.style.backgroundColor = "green";
+      var cellId = 24 * cell.parentNode.rowIndex  + cell.cellIndex;
+      lastSuccess = cellId;
+    }
+
+    function doTest(cellwidth) {
+      var ypos = cellHeight;
+      for (var row = 0; row < 24; row++) {
+        var xpos = cellwidth;
+        for (var col = 0; col < 19; col++) {
+          var cellId = 24 * row + col;
+          logMsg += "Attempting to hit cell at row: " + row + ", column: " + col + ": ";
+          eventSender.mouseMoveTo(xpos, ypos);
+          var success = lastSuccess == cellId;
+          if (!success) failed = true;
+          logMsg += (success ? "SUCCESS" : "FAIL") + "<br />";
+          xpos += cellwidth;
+        }
+        ypos += cellHeight;
+      }
+      document.body.innerHTML =(failed ? "FAIL!!!<br/>" : "SUCCESS!!!<br/>") +logMsg;
+      if (window.layoutTestController) {
+          window.layoutTestController.notifyDone();
+      }
+    }
+
+    function CreateTable(tablewidth, rowcount, colcount) {
+      var cellwidth = (tablewidth / colcount);
+      var tablestr = "<table style=\"table-layout:fixed;\" border=\"1\" width=\"" + 
+                     tablewidth + "\" cellspacing=\"0\" cellpadding=\"0\">";
+      for (var row = 0; row < rowcount; row++) {
+        var rowstr = "<tr height=\"20\">";
+        for (var col = 0; col < colcount; col++) {
+          var cellId = "r" + row + "c" + col;
+          var colstr = "<td width=\"" +  cellwidth + "\" id=\"" + cellId + "\" onmousemove=\"cellMouseMove(this)\"></td>";
+          rowstr += colstr;
+        }
+        rowstr += "</tr>";
+        
+        tablestr += rowstr;
+      }
+      tablestr += "</table>";
+      document.getElementById('tablebox').innerHTML = tablestr;
+      doTest(Math.round(cellwidth));
+    }
+  </script>
+</head>
+
+<body onload="CreateTable(500, 50, 20);" >
+  <div id="tablebox" style="overflow:hidden; width:500px; height:500px;"></div>
+</body>
+
+</html>
+
index e075717..9f4fdf7 100644 (file)
@@ -1,3 +1,23 @@
+2010-08-17  Fady Samuel  <fsamuel@chromium.org>
+
+        Reviewed by David Hyatt.
+
+        Updated table cell hit testing and painting to use binary search instead of linear scan.
+
+        Improved Table Hit Testing and Painting Performance
+        https://bugs.webkit.org/show_bug.cgi?id=43933
+
+        Tests: fast/table/simple_paint.html
+               tables/hittesting/filltable-emptycells.html
+               tables/hittesting/filltable-levels.html
+               tables/hittesting/filltable-outline.html
+               tables/hittesting/filltable-rtl.html
+               tables/hittesting/filltable-stress.html
+
+        * rendering/RenderTableSection.cpp:
+        (WebCore::RenderTableSection::paintObject): Dirty rect determined using binary search.
+        (WebCore::RenderTableSection::nodeAtPoint): Cell hit determined using binary search
+
 2010-08-17  Abhishek Arya  <inferno@chromium.org>
 
         Reviewed by Dave Hyatt.
index 56c9746..5ee72b5 100644 (file)
@@ -25,7 +25,6 @@
 
 #include "config.h"
 #include "RenderTableSection.h"
-
 #include "CachedImage.h"
 #include "Document.h"
 #include "HitTestResult.h"
@@ -1012,38 +1011,43 @@ void RenderTableSection::paintObject(PaintInfo& paintInfo, int tx, int ty)
     
     // If some cell overflows, just paint all of them.
     if (!m_hasOverflowingCell) {
-        for (; startrow < totalRows; startrow++) {
-            if (ty + m_rowPos[startrow + 1] >= y - os)
-                break;
-        }
-        if (startrow == totalRows && ty + m_rowPos[totalRows] + table()->outerBorderBottom() >= y - os)
-            startrow--;
+        int relativeY = y - ty;
+        int top = relativeY - os;
+        // binary search to find a row
+        startrow = std::lower_bound(m_rowPos.begin(), m_rowPos.end(), top) - m_rowPos.begin();
+
+        // The binary search above gives us the first row with
+        // a y position >= the top of the paint rect. Thus, the previous
+        // may need to be repainted as well.
+        if (startrow == m_rowPos.size() || (startrow > 0 && (m_rowPos[startrow] >  top)))
+          --startrow;
+
+        int bottom = relativeY + h + os - 1;
+        endrow = std::lower_bound(m_rowPos.begin(), m_rowPos.end(), bottom) - m_rowPos.begin();
+        if ((endrow == m_rowPos.size()) || (endrow > 0 && m_rowPos[endrow - 1] == bottom))
+          --endrow;
 
-        for (; endrow > 0; endrow--) {
-            if (ty + m_rowPos[endrow - 1] <= y + h + os)
-                break;
-        }
         if (!endrow && ty + m_rowPos[0] - table()->outerBorderTop() <= y + h + os)
-            endrow++;
+            ++endrow;
     }
-
     unsigned startcol = 0;
     unsigned endcol = totalCols;
     // FIXME: Implement RTL.
     if (!m_hasOverflowingCell && style()->direction() == LTR) {
-        for (; startcol < totalCols; startcol++) {
-            if (tx + table()->columnPositions()[startcol + 1] >= x - os)
-                break;
-        }
-        if (startcol == totalCols && tx + table()->columnPositions()[totalCols] + table()->outerBorderRight() >= x - os)
-            startcol--;
+        int relativeX = x - tx;
+        int left = relativeX - os;
+        Vector<int>& columnPos = table()->columnPositions();
+        startcol = std::lower_bound(columnPos.begin(), columnPos.end(), left) - columnPos.begin();
+        if ((startcol == columnPos.size()) || (startcol > 0 && (columnPos[startcol] > left)))
+            --startcol;
+
+        int right = relativeX + w + os - 1;
+        endcol = std::lower_bound(columnPos.begin(), columnPos.end(), right) - columnPos.begin();
+        if (endcol == columnPos.size() || (endcol > 0 && (columnPos[endcol - 1] == right)))
+            --endcol;
 
-        for (; endcol > 0; endcol--) {
-            if (tx + table()->columnPositions()[endcol - 1] <= x + w + os)
-                break;
-        }
         if (!endcol && tx + table()->columnPositions()[0] - table()->outerBorderLeft() <= y + w + os)
-            endcol++;
+            ++endcol;
     }
     if (startcol < endcol) {
         if (!m_hasMultipleCellLevels) {
@@ -1173,6 +1177,10 @@ void RenderTableSection::splitColumn(int pos, int first)
 // Hit Testing
 bool RenderTableSection::nodeAtPoint(const HitTestRequest& request, HitTestResult& result, int xPos, int yPos, int tx, int ty, HitTestAction action)
 {
+    // If we have no children then we have nothing to do.
+    if (!firstChild())
+        return false;
+
     // Table sections cannot ever be hit tested.  Effectively they do not exist.
     // Just forward to our children always.
     tx += x();
@@ -1181,17 +1189,56 @@ bool RenderTableSection::nodeAtPoint(const HitTestRequest& request, HitTestResul
     if (hasOverflowClip() && !overflowClipRect(tx, ty).intersects(result.rectFromPoint(xPos, yPos)))
         return false;
 
-    for (RenderObject* child = lastChild(); child; child = child->previousSibling()) {
-        // FIXME: We have to skip over inline flows, since they can show up inside table rows
-        // at the moment (a demoted inline <form> for example). If we ever implement a
-        // table-specific hit-test method (which we should do for performance reasons anyway),
-        // then we can remove this check.
-        if (child->isBox() && !toRenderBox(child)->hasSelfPaintingLayer() && child->nodeAtPoint(request, result, xPos, yPos, tx, ty, action)) {
+    if (m_hasOverflowingCell) {
+        for (RenderObject* child = lastChild(); child; child = child->previousSibling()) {
+            // FIXME: We have to skip over inline flows, since they can show up inside table rows
+            // at the moment (a demoted inline <form> for example). If we ever implement a
+            // table-specific hit-test method (which we should do for performance reasons anyway),
+            // then we can remove this check.
+            if (child->isBox() && !toRenderBox(child)->hasSelfPaintingLayer() && child->nodeAtPoint(request, result, xPos, yPos, tx, ty, action)) {
+                updateHitTestResult(result, IntPoint(xPos - tx, yPos - ty));
+                return true;
+            }
+        }
+        return false;
+    }
+
+    int relativeY = yPos - ty;
+    // leftrow corresponds to the first row that starts after the y mouse position
+    unsigned leftrow = std::upper_bound(m_rowPos.begin(), m_rowPos.end(), relativeY) - m_rowPos.begin();
+    if (leftrow == m_rowPos.size())
+        return false;
+    // Grab the last row that starts before the y mouse position.
+    if (leftrow > 0)
+        --leftrow;
+
+    Vector<int>& columnPos = table()->columnPositions();
+    bool rtl = style()->direction() == RTL;
+    int relativeX = xPos - tx;
+    if (rtl)
+        relativeX = columnPos[columnPos.size() - 1] - relativeX;
+
+    unsigned leftcol = std::lower_bound(columnPos.begin(), columnPos.end(), relativeX) - columnPos.begin();
+    if (leftcol == columnPos.size())
+        return false;
+    if (leftcol > 0)
+        --leftcol;
+
+    CellStruct& current = cellAt(leftrow, leftcol);
+
+    // If the cell is empty, there's nothing to do
+    if (!current.hasCells())
+        return false;
+
+    for (int i = current.cells.size() - 1; i >= 0; --i) {
+        RenderTableCell* cell = current.cells[i];
+        if (static_cast<RenderObject*>(cell)->nodeAtPoint(request, result, xPos, yPos, tx, ty, action)) {
             updateHitTestResult(result, IntPoint(xPos - tx, yPos - ty));
             return true;
         }
     }
     return false;
+
 }
 
 } // namespace WebCore