[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc
jamesr at google.com
jamesr at google.com
Wed Dec 22 12:14:56 UTC 2010
The following commit has been merged in the debian/experimental branch:
commit f88b258efb0bd10f8e98d4afe7d2f63a860c6b28
Author: jamesr at google.com <jamesr at google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Tue Aug 17 20:57:15 2010 +0000
2010-08-17 Fady Samuel <fsamuel at 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 Fady Samuel <fsamuel at 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: http://svn.webkit.org/repository/webkit/trunk@65539 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index f5a5456..a3dbd55 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,37 @@
+2010-08-17 Fady Samuel <fsamuel at 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 at 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
index 0000000..44ffe4c
--- /dev/null
+++ b/LayoutTests/fast/table/simple_paint.html
@@ -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
index 0000000..0e88c80
--- /dev/null
+++ b/LayoutTests/platform/chromium-linux/fast/table/simple_paint-expected.checksum
@@ -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
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
index 0000000..126dcae
--- /dev/null
+++ b/LayoutTests/platform/chromium-linux/fast/table/simple_paint-expected.txt
@@ -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
index 0000000..3af318c
--- /dev/null
+++ b/LayoutTests/platform/chromium-linux/tables/hittesting/filltable-emptycells-expected.txt
@@ -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
index 0000000..83718e6
--- /dev/null
+++ b/LayoutTests/platform/chromium-linux/tables/hittesting/filltable-levels-expected.txt
@@ -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
index 0000000..3cddc7d
--- /dev/null
+++ b/LayoutTests/platform/chromium-linux/tables/hittesting/filltable-outline-expected.txt
@@ -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
index 0000000..83718e6
--- /dev/null
+++ b/LayoutTests/platform/chromium-linux/tables/hittesting/filltable-rtl-expected.txt
@@ -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
index 0000000..f380786
--- /dev/null
+++ b/LayoutTests/platform/chromium-linux/tables/hittesting/filltable-stress-expected.txt
@@ -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/platform/chromium/test_expectations.txt b/LayoutTests/platform/chromium/test_expectations.txt
index 691093b..c997a71 100644
--- a/LayoutTests/platform/chromium/test_expectations.txt
+++ b/LayoutTests/platform/chromium/test_expectations.txt
@@ -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
index 0000000..0e88c80
--- /dev/null
+++ b/LayoutTests/platform/gtk/fast/table/simple_paint-expected.checksum
@@ -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
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
index 0000000..126dcae
--- /dev/null
+++ b/LayoutTests/platform/gtk/fast/table/simple_paint-expected.txt
@@ -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
index 0000000..3af318c
--- /dev/null
+++ b/LayoutTests/platform/gtk/tables/hittesting/filltable-emptycells-expected.txt
@@ -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
index 0000000..83718e6
--- /dev/null
+++ b/LayoutTests/platform/gtk/tables/hittesting/filltable-levels-expected.txt
@@ -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
index 0000000..3cddc7d
--- /dev/null
+++ b/LayoutTests/platform/gtk/tables/hittesting/filltable-outline-expected.txt
@@ -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
index 0000000..83718e6
--- /dev/null
+++ b/LayoutTests/platform/gtk/tables/hittesting/filltable-rtl-expected.txt
@@ -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
index 0000000..f380786
--- /dev/null
+++ b/LayoutTests/platform/gtk/tables/hittesting/filltable-stress-expected.txt
@@ -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
index 0000000..81e4ac1
--- /dev/null
+++ b/LayoutTests/tables/hittesting/filltable-emptycells.html
@@ -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
index 0000000..8e8fc3a
--- /dev/null
+++ b/LayoutTests/tables/hittesting/filltable-levels.html
@@ -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
index 0000000..c61c638
--- /dev/null
+++ b/LayoutTests/tables/hittesting/filltable-outline.html
@@ -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
index 0000000..f7d9910
--- /dev/null
+++ b/LayoutTests/tables/hittesting/filltable-rtl.html
@@ -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
index 0000000..61286e3
--- /dev/null
+++ b/LayoutTests/tables/hittesting/filltable-stress.html
@@ -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>
+
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index e075717..9f4fdf7 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,23 @@
+2010-08-17 Fady Samuel <fsamuel at 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 at chromium.org>
Reviewed by Dave Hyatt.
diff --git a/WebCore/rendering/RenderTableSection.cpp b/WebCore/rendering/RenderTableSection.cpp
index 56c9746..5ee72b5 100644
--- a/WebCore/rendering/RenderTableSection.cpp
+++ b/WebCore/rendering/RenderTableSection.cpp
@@ -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
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list