<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>35632</bug_id>
          
          <creation_ts>2010-03-03 01:46:14 -0800</creation_ts>
          <short_desc>htmlediting.cpp : isEmptyTableCell() is incomplete</short_desc>
          <delta_ts>2010-06-09 22:35:52 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>HTML Editing</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Roland Steiner">rolandsteiner</reporter>
          <assigned_to name="Roland Steiner">rolandsteiner</assigned_to>
          <cc>enrica</cc>
    
    <cc>eric</cc>
    
    <cc>ojan</cc>
    
    <cc>tony</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>195417</commentid>
    <comment_count>0</comment_count>
    <who name="Roland Steiner">rolandsteiner</who>
    <bug_when>2010-03-03 01:46:14 -0800</bug_when>
    <thetext>As currently implemented, isEmptyTableCell() will return true if the passed-in node is table cell, or a BR child of a table cell. It will not test whether there are (other) children present. This causes part of the incorrect behavior described in https://bugs.webkit.org/show_bug.cgi?id=35369.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>195418</commentid>
    <comment_count>1</comment_count>
      <attachid>49888</attachid>
    <who name="Roland Steiner">rolandsteiner</who>
    <bug_when>2010-03-03 01:49:27 -0800</bug_when>
    <thetext>Created attachment 49888
patch - fix isEmptyTableCell

patch fixing the isEmptyTableCell() function</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>195622</commentid>
    <comment_count>2</comment_count>
      <attachid>49888</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2010-03-03 08:36:53 -0800</bug_when>
    <thetext>Comment on attachment 49888
patch - fix isEmptyTableCell

Can&apos;t land a change like this without a test case.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>195885</commentid>
    <comment_count>3</comment_count>
      <attachid>49983</attachid>
    <who name="Roland Steiner">rolandsteiner</who>
    <bug_when>2010-03-03 21:48:01 -0800</bug_when>
    <thetext>Created attachment 49983
patch - fix isEmptyTableCell, added layout test

Same patch as before, with added layout test.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>199925</commentid>
    <comment_count>4</comment_count>
      <attachid>49983</attachid>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2010-03-15 16:44:51 -0700</bug_when>
    <thetext>Comment on attachment 49983
patch - fix isEmptyTableCell, added layout test

&gt; Index: WebCore/ChangeLog
&gt; ===================================================================
&gt; --- WebCore/ChangeLog	(revision 55504)
&gt; +++ WebCore/ChangeLog	(working copy)
&gt; @@ -1,3 +1,18 @@
&gt; +2010-03-04  Roland Steiner  &lt;rolandsteiner@chromium.org&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        Bug 35632 -  htmlediting.cpp : isEmptyTableCell() is incomplete
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=35632
&gt; +
&gt; +        Correct isEmptyTableCell to check for the presence of other renderer
&gt; +        children.
&gt; +
&gt; +        Test: editing/deleting/delete-br-in-last-table-cell.html
&gt; +
&gt; +        * editing/htmlediting.cpp:
&gt; +        (WebCore::isEmptyTableCell):
&gt; +
&gt;  2010-03-03  Laszlo Gombos  &lt;laszlo.1.gombos@nokia.com&gt;
&gt;  
&gt;          Reviewed by Kenneth Rohde Christiansen.
&gt; Index: WebCore/editing/htmlediting.cpp
&gt; ===================================================================
&gt; --- WebCore/editing/htmlediting.cpp	(revision 55504)
&gt; +++ WebCore/editing/htmlediting.cpp	(working copy)
&gt; @@ -863,7 +863,28 @@ bool isTableCell(const Node* node)
&gt;  
&gt;  bool isEmptyTableCell(const Node* node)
&gt;  {
&gt; -    return node &amp;&amp; node-&gt;renderer() &amp;&amp; (node-&gt;renderer()-&gt;isTableCell() || (node-&gt;renderer()-&gt;isBR() &amp;&amp; node-&gt;parentNode()-&gt;renderer() &amp;&amp; node-&gt;parentNode()-&gt;renderer()-&gt;isTableCell()));     
&gt; +    // Returns true IFF the passed in node is one of:
&gt; +    //   .) a table cell with no children,
&gt; +    //   .) a table cell with a single BR child, and which has no other child renderers, including :before and :after renderers
&gt; +    //   .) the BR child of such a table cell
&gt; +    if (!node)
&gt; +        return false;
&gt; +    RenderObject* renderer = node-&gt;renderer();
&gt; +    if (!renderer)
&gt; +        return false;
&gt; +    if (renderer-&gt;isBR()) {
&gt; +        renderer = renderer-&gt;parent();
&gt; +        if (!renderer)
&gt; +            return false;
&gt; +    }
&gt; +    if (!renderer-&gt;isTableCell())
&gt; +        return false;
&gt; +    RenderObject* childRenderer = renderer-&gt;firstChild();
&gt; +    if (!childRenderer)
&gt; +        return true;
&gt; +    if (!childRenderer-&gt;isBR())
&gt; +        return false;
&gt; +    return !childRenderer-&gt;nextSibling();
&gt;  }
&gt;
I don&apos;t think this is 100% correct. You should test with markup that contains line breaks.
Those are non rendered text nodes. Make sure your code still returns the expected boolean value if you have something like:

&lt;tr&gt;
&lt;td&gt;
&lt;br&gt;
&lt;span&gt;hello&lt;/span&gt;
  
&gt;  PassRefPtr&lt;HTMLElement&gt; createDefaultParagraphElement(Document* document)
&gt; Index: LayoutTests/ChangeLog
&gt; ===================================================================
&gt; --- LayoutTests/ChangeLog	(revision 55504)
&gt; +++ LayoutTests/ChangeLog	(working copy)
&gt; @@ -1,3 +1,20 @@
&gt; +2010-03-03  Roland Steiner  &lt;rolandsteiner@chromium.org&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        Bug 35632 -  htmlediting.cpp : isEmptyTableCell() is incomplete
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=35632
&gt; +
&gt; +        Correct isEmptyTableCell to check for the presence of other renderer
&gt; +        children.
&gt; +        
&gt; +        Layout test checks that deleting a &lt;br&gt; within the last table cell works.
&gt; +
&gt; +        * editing/deleting/delete-br-in-last-table-cell-expected.txt: Added.
&gt; +        * editing/deleting/delete-br-in-last-table-cell.html: Added.
&gt; +        * platform/gtk/Skipped:
&gt; +        * platform/qt/Skipped:
&gt; +
&gt;  2010-03-03  Diego Gonzalez  &lt;diego.gonzalez@openbossa.org&gt;
&gt;  
&gt;          Reviewed by Kenneth Rohde Christiansen.
&gt; Index: LayoutTests/editing/deleting/delete-br-in-last-table-cell-expected.txt
&gt; ===================================================================
&gt; --- LayoutTests/editing/deleting/delete-br-in-last-table-cell-expected.txt	(revision 0)
&gt; +++ LayoutTests/editing/deleting/delete-br-in-last-table-cell-expected.txt	(revision 0)
&gt; @@ -0,0 +1,11 @@
&gt; +Bug 35369 and Bug 35632
&gt; +
&gt; +Executing a delete command when positioned before a BR in a table cell (esp. the last)
&gt; +
&gt; +---
&gt; +1	2
&gt; +3	4
&gt; +---
&gt; +
&gt; +Before: &lt;tbody&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;4&lt;br&gt;&lt;br id=&quot;lastBR&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt; 
&gt; +After : &lt;tbody&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;4&lt;br id=&quot;lastBR&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;
&gt; Index: LayoutTests/editing/deleting/delete-br-in-last-table-cell.html
&gt; ===================================================================
&gt; --- LayoutTests/editing/deleting/delete-br-in-last-table-cell.html	(revision 0)
&gt; +++ LayoutTests/editing/deleting/delete-br-in-last-table-cell.html	(revision 0)
&gt; @@ -0,0 +1,40 @@
&gt; +&lt;html&gt;
&gt; +&lt;head&gt;
&gt; +&lt;script src=../editing.js language=&quot;JavaScript&quot; type=&quot;text/JavaScript&quot; &gt;&lt;/script&gt;
&gt; +&lt;script&gt;
&gt; +function runTest()
&gt; +{
&gt; +    table = document.getElementById(&quot;table&quot;);
&gt; +    br = document.getElementById(&quot;lastBR&quot;);
&gt; +    before = document.getElementById(&quot;before&quot;);
&gt; +    after = document.getElementById(&quot;after&quot;);
&gt; +    before.innerText = table.innerHTML;
&gt; +    sel = window.getSelection();
&gt; +    sel.setBaseAndExtent(br, 0, br, 0);
&gt; +    deleteCommand();
&gt; +    after.innerText = table.innerHTML.toString();
&gt; +}
&gt; +&lt;/script&gt;
&gt; +&lt;/head&gt;
&gt; +
&gt; +&lt;body&gt;
&gt; +&lt;p&gt;&lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=35369&quot;&gt;Bug 35369&lt;/a&gt; and &lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=35632&quot;&gt;Bug 35632&lt;/a&gt;&lt;/p&gt;
&gt; +&lt;p&gt;Executing a delete command when positioned before a BR in a table cell (esp. the last)&lt;/p&gt;
&gt; +&lt;div contenteditable&gt;
&gt; +---
&gt; +&lt;table id=&quot;table&quot;&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;4&lt;br&gt;&lt;br id=&quot;lastBR&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&gt; +---
&gt; +&lt;/div&gt;
&gt; +&lt;br&gt;
&gt; +&lt;p&gt;Before: &lt;span id=&quot;before&quot;&gt;FAILED&lt;/span&gt;
&gt; +&lt;br&gt;
&gt; +&lt;p&gt;After : &lt;span id=&quot;after&quot;&gt;FAILED&lt;/span&gt;
&gt; +
&gt; +&lt;script&gt;
&gt; +if (window.layoutTestController)
&gt; +    layoutTestController.dumpAsText();
&gt; +
&gt; +runTest();
&gt; +&lt;/script&gt;
&gt; +&lt;/body&gt;
&gt; +&lt;/html&gt;
&gt; \ No newline at end of file
&gt; Index: LayoutTests/platform/gtk/Skipped
&gt; ===================================================================
&gt; --- LayoutTests/platform/gtk/Skipped	(revision 55504)
&gt; +++ LayoutTests/platform/gtk/Skipped	(working copy)
&gt; @@ -856,6 +856,7 @@ editing/deleting/delete-br-008.html
&gt;  editing/deleting/delete-br-009.html
&gt;  editing/deleting/delete-br-011.html
&gt;  editing/deleting/delete-br-012.html
&gt; +editing/deleting/delete-br-in-last-table-cell.html
&gt;  editing/deleting/delete-by-word-002.html
&gt;  editing/deleting/delete-character-001.html
&gt;  editing/deleting/delete-first-list-item.html
&gt; Index: LayoutTests/platform/qt/Skipped
&gt; ===================================================================
&gt; --- LayoutTests/platform/qt/Skipped	(revision 55504)
&gt; +++ LayoutTests/platform/qt/Skipped	(working copy)
&gt; @@ -1646,6 +1646,7 @@ editing/deleting/delete-br-010.html
&gt;  editing/deleting/delete-br-011.html
&gt;  editing/deleting/delete-br-012.html
&gt;  editing/deleting/delete-br-013.html
&gt; +editing/deleting/delete-br-in-last-table-cell.html
&gt;  editing/deleting/delete-character-001.html
&gt;  editing/deleting/delete-contiguous-ws-001.html
&gt;  editing/deleting/delete-first-list-item.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>200036</commentid>
    <comment_count>5</comment_count>
    <who name="Roland Steiner">rolandsteiner</who>
    <bug_when>2010-03-16 00:05:28 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; &gt;  bool isEmptyTableCell(const Node* node)
&gt; &gt;  {
&gt; &gt; -    return node &amp;&amp; node-&gt;renderer() &amp;&amp; (node-&gt;renderer()-&gt;isTableCell() || (node-&gt;renderer()-&gt;isBR() &amp;&amp; node-&gt;parentNode()-&gt;renderer() &amp;&amp; node-&gt;parentNode()-&gt;renderer()-&gt;isTableCell()));     
&gt; &gt; +    // Returns true IFF the passed in node is one of:
&gt; &gt; +    //   .) a table cell with no children,
&gt; &gt; +    //   .) a table cell with a single BR child, and which has no other child renderers, including :before and :after renderers
&gt; &gt; +    //   .) the BR child of such a table cell
&gt; &gt; +    if (!node)
&gt; &gt; +        return false;
&gt; &gt; +    RenderObject* renderer = node-&gt;renderer();
&gt; &gt; +    if (!renderer)
&gt; &gt; +        return false;
&gt; &gt; +    if (renderer-&gt;isBR()) {
&gt; &gt; +        renderer = renderer-&gt;parent();
&gt; &gt; +        if (!renderer)
&gt; &gt; +            return false;
&gt; &gt; +    }
&gt; &gt; +    if (!renderer-&gt;isTableCell())
&gt; &gt; +        return false;
&gt; &gt; +    RenderObject* childRenderer = renderer-&gt;firstChild();
&gt; &gt; +    if (!childRenderer)
&gt; &gt; +        return true;
&gt; &gt; +    if (!childRenderer-&gt;isBR())
&gt; &gt; +        return false;
&gt; &gt; +    return !childRenderer-&gt;nextSibling();
&gt; &gt;  }
&gt; &gt;
&gt; I don&apos;t think this is 100% correct. You should test with markup that contains
&gt; line breaks.
&gt; Those are non rendered text nodes. Make sure your code still returns the
&gt; expected boolean value if you have something like:
&gt; 
&gt; &lt;tr&gt;
&gt; &lt;td&gt;
&gt; &lt;br&gt;
&gt; &lt;span&gt;hello&lt;/span&gt;

I don&apos;t quite follow - in your example, the &lt;br&gt; has a nextSibling, so the function returns false (it&apos;s not an empty table cell).

Note that the bug that spawned this implementation (https://bugs.webkit.org/show_bug.cgi?id=35369) also has similar table cell contents: &lt;td&gt;4&lt;br&gt;&lt;br&gt;&lt;/td&gt;. 

Am I misunderstanding your comment, or am I missing the forest for the trees here? ;)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>200228</commentid>
    <comment_count>6</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2010-03-16 09:02:22 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; (In reply to comment #4)
&gt; &gt; &gt;  bool isEmptyTableCell(const Node* node)
&gt; &gt; &gt;  {
&gt; &gt; &gt; -    return node &amp;&amp; node-&gt;renderer() &amp;&amp; (node-&gt;renderer()-&gt;isTableCell() || (node-&gt;renderer()-&gt;isBR() &amp;&amp; node-&gt;parentNode()-&gt;renderer() &amp;&amp; node-&gt;parentNode()-&gt;renderer()-&gt;isTableCell()));     
&gt; &gt; &gt; +    // Returns true IFF the passed in node is one of:
&gt; &gt; &gt; +    //   .) a table cell with no children,
&gt; &gt; &gt; +    //   .) a table cell with a single BR child, and which has no other child renderers, including :before and :after renderers
&gt; &gt; &gt; +    //   .) the BR child of such a table cell
&gt; &gt; &gt; +    if (!node)
&gt; &gt; &gt; +        return false;
&gt; &gt; &gt; +    RenderObject* renderer = node-&gt;renderer();
&gt; &gt; &gt; +    if (!renderer)
&gt; &gt; &gt; +        return false;
&gt; &gt; &gt; +    if (renderer-&gt;isBR()) {
&gt; &gt; &gt; +        renderer = renderer-&gt;parent();
&gt; &gt; &gt; +        if (!renderer)
&gt; &gt; &gt; +            return false;
&gt; &gt; &gt; +    }
&gt; &gt; &gt; +    if (!renderer-&gt;isTableCell())
&gt; &gt; &gt; +        return false;
&gt; &gt; &gt; +    RenderObject* childRenderer = renderer-&gt;firstChild();
&gt; &gt; &gt; +    if (!childRenderer)
&gt; &gt; &gt; +        return true;
&gt; &gt; &gt; +    if (!childRenderer-&gt;isBR())
&gt; &gt; &gt; +        return false;
&gt; &gt; &gt; +    return !childRenderer-&gt;nextSibling();
&gt; &gt; &gt;  }
&gt; &gt; &gt;
&gt; &gt; I don&apos;t think this is 100% correct. You should test with markup that contains
&gt; &gt; line breaks.
&gt; &gt; Those are non rendered text nodes. Make sure your code still returns the
&gt; &gt; expected boolean value if you have something like:
&gt; &gt; 
&gt; &gt; &lt;tr&gt;
&gt; &gt; &lt;td&gt;
&gt; &gt; &lt;br&gt;
&gt; &gt; &lt;span&gt;hello&lt;/span&gt;
&gt; 
&gt; I don&apos;t quite follow - in your example, the &lt;br&gt; has a nextSibling, so the
&gt; function returns false (it&apos;s not an empty table cell).
&gt; 
&gt; Note that the bug that spawned this implementation
&gt; (https://bugs.webkit.org/show_bug.cgi?id=35369) also has similar table cell
&gt; contents: &lt;td&gt;4&lt;br&gt;&lt;br&gt;&lt;/td&gt;. 
&gt; 
&gt; Am I misunderstanding your comment, or am I missing the forest for the trees
&gt; here? ;)

When you have new lines in the markup, the DOM tree contains text nodes that are not rendered.
The DOM tree for 
&lt;br&gt;&lt;span&gt;hello&lt;/span&gt;
is different from the DOM tree for
&lt;br&gt;
&lt;span&gt;hello&lt;/span&gt;.
In this case between &lt;br&gt; and &lt;span&gt; there is a non rendered text node.
I hope this helps clarify my comment.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>200583</commentid>
    <comment_count>7</comment_count>
      <attachid>50872</attachid>
    <who name="Roland Steiner">rolandsteiner</who>
    <bug_when>2010-03-16 21:48:26 -0700</bug_when>
    <thetext>Created attachment 50872
patch - change isEmptyTableCell() and layout tests

Thanks for the clarification, now I understood what you meant. Uploaded a new patch version that skips unrendered nodes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>228293</commentid>
    <comment_count>8</comment_count>
      <attachid>50872</attachid>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-05-20 03:05:32 -0700</bug_when>
    <thetext>Comment on attachment 50872
patch - change isEmptyTableCell() and layout tests

LayoutTests/ChangeLog:16
 +          * platform/qt/Skipped:
Why is the test skipped in GTK and Qt?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>228609</commentid>
    <comment_count>9</comment_count>
      <attachid>50872</attachid>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2010-05-20 15:50:47 -0700</bug_when>
    <thetext>Comment on attachment 50872
patch - change isEmptyTableCell() and layout tests

This test shouldn&apos;t be platform specific. r=me if you remove adding the test to the skipped lists. Please consider doing the other comments below as well.

WebCore/editing/htmlediting.cpp:870
 +      //   .) the BR child of such a table cell
Side note: This seems wrong to me. Seems like it will lead to confusing calling code. In either case, your patch isn&apos;t adding this. Might deserve a FIXME though if you agree that this is string. I&apos;d be happier if this were called isEmptyTableCellOrInsideOf...or something like that. Not asking you to change this for this patch though. Just a cleanup to consider for a followup patch.

LayoutTests/editing/deleting/delete-br-in-last-table-cell.html:41
 +  \ No newline at end of file
please add a newline.

LayoutTests/editing/deleting/delete-br-in-last-table-cell.html:35
 +      layoutTestController.dumpAsText();
dump_as_markup didn&apos;t exist when you wrote this patch, but it would be appropriate for this test. tony can show you how to write one if you have trouble (you just include the dump_as_markup.js file as a script element).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>232299</commentid>
    <comment_count>10</comment_count>
    <who name="Roland Steiner">rolandsteiner</who>
    <bug_when>2010-05-31 02:42:04 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; (From update of attachment 50872 [details])
&gt; This test shouldn&apos;t be platform specific. r=me if you remove adding the test to the skipped lists. Please consider doing the other comments below as well.

I of course agree that the code changed here isn&apos;t be platform-specific. The reason I added the test to the Skipped lists is that all similar tests that use the same functionality used in the test to arrive at isEmptyTableCell() - i.e., execCommand(&quot;delete&quot;) - are skipped as well.

So in order to not include the test in the Skipped list of those platforms, AFAICT the test would need to be rewritten completely (?)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>235575</commentid>
    <comment_count>11</comment_count>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2010-06-08 16:39:22 -0700</bug_when>
    <thetext>(In reply to comment #10)
&gt; (In reply to comment #9)
&gt; &gt; (From update of attachment 50872 [details] [details])
&gt; &gt; This test shouldn&apos;t be platform specific. r=me if you remove adding the test to the skipped lists. Please consider doing the other comments below as well.
&gt; 
&gt; I of course agree that the code changed here isn&apos;t be platform-specific. The reason I added the test to the Skipped lists is that all similar tests that use the same functionality used in the test to arrive at isEmptyTableCell() - i.e., execCommand(&quot;delete&quot;) - are skipped as well.
&gt; 
&gt; So in order to not include the test in the Skipped list of those platforms, AFAICT the test would need to be rewritten completely (?)

I see. That makes sense. I took another look at the patch. One nit: It would be nice to add a few line breaks logically grouping the code in isEmptyTableCell. It&apos;s a bit hard to read as one big chunk like that.

r=me either way</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>236164</commentid>
    <comment_count>12</comment_count>
    <who name="Roland Steiner">rolandsteiner</who>
    <bug_when>2010-06-09 22:35:52 -0700</bug_when>
    <thetext>Broke up the function a bit and added further comments for clarification.

Changed the test to use dump_as_markup.

Landed as r60936.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>49888</attachid>
            <date>2010-03-03 01:49:27 -0800</date>
            <delta_ts>2010-03-03 21:48:01 -0800</delta_ts>
            <desc>patch - fix isEmptyTableCell</desc>
            <filename>isEmptyTableCell.patch</filename>
            <type>text/plain</type>
            <size>2101</size>
            <attacher name="Roland Steiner">rolandsteiner</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1NTQ1NCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTggQEAKKzIwMTAtMDMtMDMgIFJvbGFuZCBTdGVpbmVyICA8cm9sYW5kc3RlaW5l
ckBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisK
KyAgICAgICAgQnVnIDM1NjMyIC0gIGh0bWxlZGl0aW5nLmNwcCA6IGlzRW1wdHlUYWJsZUNlbGwo
KSBpcyBpbmNvbXBsZXRlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD0zNTYzMgorCisgICAgICAgIENvcnJlY3QgaXNFbXB0eVRhYmxlQ2VsbCB0byBjaGVj
ayBmb3IgdGhlIHByZXNlbmNlIG9mIG90aGVyIHJlbmRlcmVyCisgICAgICAgIGNoaWxkcmVuLgor
CisgICAgICAgIE5vIG5ldyB0ZXN0cyAoc2ltcGxlIGNvZGUgY2hhbmdlKS4KKworICAgICAgICAq
IGVkaXRpbmcvaHRtbGVkaXRpbmcuY3BwOgorICAgICAgICAoV2ViQ29yZTo6aXNFbXB0eVRhYmxl
Q2VsbCk6CisKIDIwMTAtMDMtMDIgIEVyaWMgVWhyaGFuZSAgPGVyaWN1QGNocm9taXVtLm9yZz4K
IAogICAgICAgICBSZXZpZXdlZCBieSBEYXZpZCBMZXZpbi4KSW5kZXg6IFdlYkNvcmUvZWRpdGlu
Zy9odG1sZWRpdGluZy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9lZGl0aW5nL2h0bWxlZGl0
aW5nLmNwcAkocmV2aXNpb24gNTU0NTQpCisrKyBXZWJDb3JlL2VkaXRpbmcvaHRtbGVkaXRpbmcu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC04NjMsNyArODYzLDI4IEBAIGJvb2wgaXNUYWJsZUNlbGwo
Y29uc3QgTm9kZSogbm9kZSkKIAogYm9vbCBpc0VtcHR5VGFibGVDZWxsKGNvbnN0IE5vZGUqIG5v
ZGUpCiB7Ci0gICAgcmV0dXJuIG5vZGUgJiYgbm9kZS0+cmVuZGVyZXIoKSAmJiAobm9kZS0+cmVu
ZGVyZXIoKS0+aXNUYWJsZUNlbGwoKSB8fCAobm9kZS0+cmVuZGVyZXIoKS0+aXNCUigpICYmIG5v
ZGUtPnBhcmVudE5vZGUoKS0+cmVuZGVyZXIoKSAmJiBub2RlLT5wYXJlbnROb2RlKCktPnJlbmRl
cmVyKCktPmlzVGFibGVDZWxsKCkpKTsgICAgIAorICAgIC8vIFJldHVybnMgdHJ1ZSBJRkYgdGhl
IHBhc3NlZCBpbiBub2RlIGlzIG9uZSBvZjoKKyAgICAvLyAgIC4pIGEgdGFibGUgY2VsbCB3aXRo
IG5vIGNoaWxkcmVuLAorICAgIC8vICAgLikgYSB0YWJsZSBjZWxsIHdpdGggYSBzaW5nbGUgQlIg
Y2hpbGQsIGFuZCB3aGljaCBoYXMgbm8gb3RoZXIgY2hpbGQgcmVuZGVyZXJzLCBpbmNsdWRpbmcg
OmJlZm9yZSBhbmQgOmFmdGVyIHJlbmRlcmVycworICAgIC8vICAgLikgdGhlIEJSIGNoaWxkIG9m
IHN1Y2ggYSB0YWJsZSBjZWxsCisgICAgaWYgKCFub2RlKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IG5vZGUtPnJlbmRlcmVyKCk7CisgICAgaWYg
KCFyZW5kZXJlcikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChyZW5kZXJlci0+aXNC
UigpKSB7CisgICAgICAgIHJlbmRlcmVyID0gcmVuZGVyZXItPnBhcmVudCgpOworICAgICAgICBp
ZiAoIXJlbmRlcmVyKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAo
IXJlbmRlcmVyLT5pc1RhYmxlQ2VsbCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgUmVu
ZGVyT2JqZWN0KiBjaGlsZFJlbmRlcmVyID0gcmVuZGVyZXItPmZpcnN0Q2hpbGQoKTsKKyAgICBp
ZiAoIWNoaWxkUmVuZGVyZXIpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIGlmICghY2hpbGRS
ZW5kZXJlci0+aXNCUigpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuICFjaGls
ZFJlbmRlcmVyLT5uZXh0U2libGluZygpOwogfQogCiBQYXNzUmVmUHRyPEhUTUxFbGVtZW50PiBj
cmVhdGVEZWZhdWx0UGFyYWdyYXBoRWxlbWVudChEb2N1bWVudCogZG9jdW1lbnQpCg==
</data>
<flag name="review"
          id="32876"
          type_id="1"
          status="-"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>49983</attachid>
            <date>2010-03-03 21:48:01 -0800</date>
            <delta_ts>2010-03-16 21:48:26 -0700</delta_ts>
            <desc>patch - fix isEmptyTableCell, added layout test</desc>
            <filename>isEmptyTableCell.patch</filename>
            <type>text/plain</type>
            <size>6414</size>
            <attacher name="Roland Steiner">rolandsteiner</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1NTUwNCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTggQEAKKzIwMTAtMDMtMDQgIFJvbGFuZCBTdGVpbmVyICA8cm9sYW5kc3RlaW5l
ckBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisK
KyAgICAgICAgQnVnIDM1NjMyIC0gIGh0bWxlZGl0aW5nLmNwcCA6IGlzRW1wdHlUYWJsZUNlbGwo
KSBpcyBpbmNvbXBsZXRlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD0zNTYzMgorCisgICAgICAgIENvcnJlY3QgaXNFbXB0eVRhYmxlQ2VsbCB0byBjaGVj
ayBmb3IgdGhlIHByZXNlbmNlIG9mIG90aGVyIHJlbmRlcmVyCisgICAgICAgIGNoaWxkcmVuLgor
CisgICAgICAgIFRlc3Q6IGVkaXRpbmcvZGVsZXRpbmcvZGVsZXRlLWJyLWluLWxhc3QtdGFibGUt
Y2VsbC5odG1sCisKKyAgICAgICAgKiBlZGl0aW5nL2h0bWxlZGl0aW5nLmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6OmlzRW1wdHlUYWJsZUNlbGwpOgorCiAyMDEwLTAzLTAzICBMYXN6bG8gR29tYm9z
ICA8bGFzemxvLjEuZ29tYm9zQG5va2lhLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBLZW5u
ZXRoIFJvaGRlIENocmlzdGlhbnNlbi4KSW5kZXg6IFdlYkNvcmUvZWRpdGluZy9odG1sZWRpdGlu
Zy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9lZGl0aW5nL2h0bWxlZGl0aW5nLmNwcAkocmV2
aXNpb24gNTU1MDQpCisrKyBXZWJDb3JlL2VkaXRpbmcvaHRtbGVkaXRpbmcuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC04NjMsNyArODYzLDI4IEBAIGJvb2wgaXNUYWJsZUNlbGwoY29uc3QgTm9kZSog
bm9kZSkKIAogYm9vbCBpc0VtcHR5VGFibGVDZWxsKGNvbnN0IE5vZGUqIG5vZGUpCiB7Ci0gICAg
cmV0dXJuIG5vZGUgJiYgbm9kZS0+cmVuZGVyZXIoKSAmJiAobm9kZS0+cmVuZGVyZXIoKS0+aXNU
YWJsZUNlbGwoKSB8fCAobm9kZS0+cmVuZGVyZXIoKS0+aXNCUigpICYmIG5vZGUtPnBhcmVudE5v
ZGUoKS0+cmVuZGVyZXIoKSAmJiBub2RlLT5wYXJlbnROb2RlKCktPnJlbmRlcmVyKCktPmlzVGFi
bGVDZWxsKCkpKTsgICAgIAorICAgIC8vIFJldHVybnMgdHJ1ZSBJRkYgdGhlIHBhc3NlZCBpbiBu
b2RlIGlzIG9uZSBvZjoKKyAgICAvLyAgIC4pIGEgdGFibGUgY2VsbCB3aXRoIG5vIGNoaWxkcmVu
LAorICAgIC8vICAgLikgYSB0YWJsZSBjZWxsIHdpdGggYSBzaW5nbGUgQlIgY2hpbGQsIGFuZCB3
aGljaCBoYXMgbm8gb3RoZXIgY2hpbGQgcmVuZGVyZXJzLCBpbmNsdWRpbmcgOmJlZm9yZSBhbmQg
OmFmdGVyIHJlbmRlcmVycworICAgIC8vICAgLikgdGhlIEJSIGNoaWxkIG9mIHN1Y2ggYSB0YWJs
ZSBjZWxsCisgICAgaWYgKCFub2RlKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgUmVuZGVy
T2JqZWN0KiByZW5kZXJlciA9IG5vZGUtPnJlbmRlcmVyKCk7CisgICAgaWYgKCFyZW5kZXJlcikK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChyZW5kZXJlci0+aXNCUigpKSB7CisgICAg
ICAgIHJlbmRlcmVyID0gcmVuZGVyZXItPnBhcmVudCgpOworICAgICAgICBpZiAoIXJlbmRlcmVy
KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIXJlbmRlcmVyLT5p
c1RhYmxlQ2VsbCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgUmVuZGVyT2JqZWN0KiBj
aGlsZFJlbmRlcmVyID0gcmVuZGVyZXItPmZpcnN0Q2hpbGQoKTsKKyAgICBpZiAoIWNoaWxkUmVu
ZGVyZXIpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIGlmICghY2hpbGRSZW5kZXJlci0+aXNC
UigpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuICFjaGlsZFJlbmRlcmVyLT5u
ZXh0U2libGluZygpOwogfQogCiBQYXNzUmVmUHRyPEhUTUxFbGVtZW50PiBjcmVhdGVEZWZhdWx0
UGFyYWdyYXBoRWxlbWVudChEb2N1bWVudCogZG9jdW1lbnQpCkluZGV4OiBMYXlvdXRUZXN0cy9D
aGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lvbiA1
NTUwNCkKKysrIExheW91dFRlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsx
LDIwIEBACisyMDEwLTAzLTAzICBSb2xhbmQgU3RlaW5lciAgPHJvbGFuZHN0ZWluZXJAY2hyb21p
dW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
IEJ1ZyAzNTYzMiAtICBodG1sZWRpdGluZy5jcHAgOiBpc0VtcHR5VGFibGVDZWxsKCkgaXMgaW5j
b21wbGV0ZQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
MzU2MzIKKworICAgICAgICBDb3JyZWN0IGlzRW1wdHlUYWJsZUNlbGwgdG8gY2hlY2sgZm9yIHRo
ZSBwcmVzZW5jZSBvZiBvdGhlciByZW5kZXJlcgorICAgICAgICBjaGlsZHJlbi4KKyAgICAgICAg
CisgICAgICAgIExheW91dCB0ZXN0IGNoZWNrcyB0aGF0IGRlbGV0aW5nIGEgPGJyPiB3aXRoaW4g
dGhlIGxhc3QgdGFibGUgY2VsbCB3b3Jrcy4KKworICAgICAgICAqIGVkaXRpbmcvZGVsZXRpbmcv
ZGVsZXRlLWJyLWluLWxhc3QtdGFibGUtY2VsbC1leHBlY3RlZC50eHQ6IEFkZGVkLgorICAgICAg
ICAqIGVkaXRpbmcvZGVsZXRpbmcvZGVsZXRlLWJyLWluLWxhc3QtdGFibGUtY2VsbC5odG1sOiBB
ZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ndGsvU2tpcHBlZDoKKyAgICAgICAgKiBwbGF0Zm9y
bS9xdC9Ta2lwcGVkOgorCiAyMDEwLTAzLTAzICBEaWVnbyBHb256YWxleiAgPGRpZWdvLmdvbnph
bGV6QG9wZW5ib3NzYS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgS2VubmV0aCBSb2hkZSBD
aHJpc3RpYW5zZW4uCkluZGV4OiBMYXlvdXRUZXN0cy9lZGl0aW5nL2RlbGV0aW5nL2RlbGV0ZS1i
ci1pbi1sYXN0LXRhYmxlLWNlbGwtZXhwZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRl
c3RzL2VkaXRpbmcvZGVsZXRpbmcvZGVsZXRlLWJyLWluLWxhc3QtdGFibGUtY2VsbC1leHBlY3Rl
ZC50eHQJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9lZGl0aW5nL2RlbGV0aW5nL2RlbGV0
ZS1ici1pbi1sYXN0LXRhYmxlLWNlbGwtZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDExIEBACitCdWcgMzUzNjkgYW5kIEJ1ZyAzNTYzMgorCitFeGVjdXRpbmcgYSBkZWxldGUg
Y29tbWFuZCB3aGVuIHBvc2l0aW9uZWQgYmVmb3JlIGEgQlIgaW4gYSB0YWJsZSBjZWxsIChlc3Au
IHRoZSBsYXN0KQorCistLS0KKzEJMgorMwk0CistLS0KKworQmVmb3JlOiA8dGJvZHk+PHRyPjx0
ZD4xPC90ZD48dGQ+MjwvdGQ+PC90cj48dHI+PHRkPjM8L3RkPjx0ZD40PGJyPjxiciBpZD0ibGFz
dEJSIj48L3RkPjwvdHI+PC90Ym9keT4gCitBZnRlciA6IDx0Ym9keT48dHI+PHRkPjE8L3RkPjx0
ZD4yPC90ZD48L3RyPjx0cj48dGQ+MzwvdGQ+PHRkPjQ8YnIgaWQ9Imxhc3RCUiI+PC90ZD48L3Ry
PjwvdGJvZHk+CkluZGV4OiBMYXlvdXRUZXN0cy9lZGl0aW5nL2RlbGV0aW5nL2RlbGV0ZS1ici1p
bi1sYXN0LXRhYmxlLWNlbGwuaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9lZGl0aW5n
L2RlbGV0aW5nL2RlbGV0ZS1ici1pbi1sYXN0LXRhYmxlLWNlbGwuaHRtbAkocmV2aXNpb24gMCkK
KysrIExheW91dFRlc3RzL2VkaXRpbmcvZGVsZXRpbmcvZGVsZXRlLWJyLWluLWxhc3QtdGFibGUt
Y2VsbC5odG1sCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDQwIEBACis8aHRtbD4KKzxoZWFkPgor
PHNjcmlwdCBzcmM9Li4vZWRpdGluZy5qcyBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4
dC9KYXZhU2NyaXB0IiA+PC9zY3JpcHQ+Cis8c2NyaXB0PgorZnVuY3Rpb24gcnVuVGVzdCgpCit7
CisgICAgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGFibGUiKTsKKyAgICBiciA9
IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsYXN0QlIiKTsKKyAgICBiZWZvcmUgPSBkb2N1bWVu
dC5nZXRFbGVtZW50QnlJZCgiYmVmb3JlIik7CisgICAgYWZ0ZXIgPSBkb2N1bWVudC5nZXRFbGVt
ZW50QnlJZCgiYWZ0ZXIiKTsKKyAgICBiZWZvcmUuaW5uZXJUZXh0ID0gdGFibGUuaW5uZXJIVE1M
OworICAgIHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKKyAgICBzZWwuc2V0QmFzZUFuZEV4
dGVudChiciwgMCwgYnIsIDApOworICAgIGRlbGV0ZUNvbW1hbmQoKTsKKyAgICBhZnRlci5pbm5l
clRleHQgPSB0YWJsZS5pbm5lckhUTUwudG9TdHJpbmcoKTsKK30KKzwvc2NyaXB0PgorPC9oZWFk
PgorCis8Ym9keT4KKzxwPjxhIGhyZWY9Imh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD0zNTM2OSI+QnVnIDM1MzY5PC9hPiBhbmQgPGEgaHJlZj0iaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTM1NjMyIj5CdWcgMzU2MzI8L2E+PC9wPgorPHA+RXhl
Y3V0aW5nIGEgZGVsZXRlIGNvbW1hbmQgd2hlbiBwb3NpdGlvbmVkIGJlZm9yZSBhIEJSIGluIGEg
dGFibGUgY2VsbCAoZXNwLiB0aGUgbGFzdCk8L3A+Cis8ZGl2IGNvbnRlbnRlZGl0YWJsZT4KKy0t
LQorPHRhYmxlIGlkPSJ0YWJsZSI+PHRyPjx0ZD4xPC90ZD48dGQ+MjwvdGQ+PC90cj48dHI+PHRk
PjM8L3RkPjx0ZD40PGJyPjxiciBpZD0ibGFzdEJSIj48L3RkPjwvdHI+PC90YWJsZT4KKy0tLQor
PC9kaXY+Cis8YnI+Cis8cD5CZWZvcmU6IDxzcGFuIGlkPSJiZWZvcmUiPkZBSUxFRDwvc3Bhbj4K
Kzxicj4KKzxwPkFmdGVyIDogPHNwYW4gaWQ9ImFmdGVyIj5GQUlMRUQ8L3NwYW4+CisKKzxzY3Jp
cHQ+CitpZiAod2luZG93LmxheW91dFRlc3RDb250cm9sbGVyKQorICAgIGxheW91dFRlc3RDb250
cm9sbGVyLmR1bXBBc1RleHQoKTsKKworcnVuVGVzdCgpOworPC9zY3JpcHQ+Cis8L2JvZHk+Cis8
L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpJbmRleDogTGF5b3V0VGVzdHMvcGxh
dGZvcm0vZ3RrL1NraXBwZWQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvcGxhdGZvcm0vZ3Rr
L1NraXBwZWQJKHJldmlzaW9uIDU1NTA0KQorKysgTGF5b3V0VGVzdHMvcGxhdGZvcm0vZ3RrL1Nr
aXBwZWQJKHdvcmtpbmcgY29weSkKQEAgLTg1Niw2ICs4NTYsNyBAQCBlZGl0aW5nL2RlbGV0aW5n
L2RlbGV0ZS1ici0wMDguaHRtbAogZWRpdGluZy9kZWxldGluZy9kZWxldGUtYnItMDA5Lmh0bWwK
IGVkaXRpbmcvZGVsZXRpbmcvZGVsZXRlLWJyLTAxMS5odG1sCiBlZGl0aW5nL2RlbGV0aW5nL2Rl
bGV0ZS1ici0wMTIuaHRtbAorZWRpdGluZy9kZWxldGluZy9kZWxldGUtYnItaW4tbGFzdC10YWJs
ZS1jZWxsLmh0bWwKIGVkaXRpbmcvZGVsZXRpbmcvZGVsZXRlLWJ5LXdvcmQtMDAyLmh0bWwKIGVk
aXRpbmcvZGVsZXRpbmcvZGVsZXRlLWNoYXJhY3Rlci0wMDEuaHRtbAogZWRpdGluZy9kZWxldGlu
Zy9kZWxldGUtZmlyc3QtbGlzdC1pdGVtLmh0bWwKSW5kZXg6IExheW91dFRlc3RzL3BsYXRmb3Jt
L3F0L1NraXBwZWQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvcGxhdGZvcm0vcXQvU2tpcHBl
ZAkocmV2aXNpb24gNTU1MDQpCisrKyBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9xdC9Ta2lwcGVkCSh3
b3JraW5nIGNvcHkpCkBAIC0xNjQ2LDYgKzE2NDYsNyBAQCBlZGl0aW5nL2RlbGV0aW5nL2RlbGV0
ZS1ici0wMTAuaHRtbAogZWRpdGluZy9kZWxldGluZy9kZWxldGUtYnItMDExLmh0bWwKIGVkaXRp
bmcvZGVsZXRpbmcvZGVsZXRlLWJyLTAxMi5odG1sCiBlZGl0aW5nL2RlbGV0aW5nL2RlbGV0ZS1i
ci0wMTMuaHRtbAorZWRpdGluZy9kZWxldGluZy9kZWxldGUtYnItaW4tbGFzdC10YWJsZS1jZWxs
Lmh0bWwKIGVkaXRpbmcvZGVsZXRpbmcvZGVsZXRlLWNoYXJhY3Rlci0wMDEuaHRtbAogZWRpdGlu
Zy9kZWxldGluZy9kZWxldGUtY29udGlndW91cy13cy0wMDEuaHRtbAogZWRpdGluZy9kZWxldGlu
Zy9kZWxldGUtZmlyc3QtbGlzdC1pdGVtLmh0bWwK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>50872</attachid>
            <date>2010-03-16 21:48:26 -0700</date>
            <delta_ts>2010-05-20 15:50:47 -0700</delta_ts>
            <desc>patch - change isEmptyTableCell() and layout tests</desc>
            <filename>isEmptyTableCell.patch</filename>
            <type>text/plain</type>
            <size>6400</size>
            <attacher name="Roland Steiner">rolandsteiner</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1NjA5OCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTggQEAKKzIwMTAtMDMtMTcgIFJvbGFuZCBTdGVpbmVyICA8cm9sYW5kc3RlaW5l
ckBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisK
KyAgICAgICAgQnVnIDM1NjMyIC0gIGh0bWxlZGl0aW5nLmNwcCA6IGlzRW1wdHlUYWJsZUNlbGwo
KSBpcyBpbmNvbXBsZXRlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD0zNTYzMgorCisgICAgICAgIENvcnJlY3QgaXNFbXB0eVRhYmxlQ2VsbCB0byBjaGVj
ayBmb3IgdGhlIHByZXNlbmNlIG9mIG90aGVyIHJlbmRlcmVyCisgICAgICAgIGNoaWxkcmVuLgor
CisgICAgICAgIFRlc3Q6IGVkaXRpbmcvZGVsZXRpbmcvZGVsZXRlLWJyLWluLWxhc3QtdGFibGUt
Y2VsbC5odG1sCisKKyAgICAgICAgKiBlZGl0aW5nL2h0bWxlZGl0aW5nLmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6OmlzRW1wdHlUYWJsZUNlbGwpOgorCiAyMDEwLTAzLTE2ICBKb2huIEFiZC1FbC1N
YWxlayAgPGphbUBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gRmlz
aGVyLgpJbmRleDogV2ViQ29yZS9lZGl0aW5nL2h0bWxlZGl0aW5nLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL2VkaXRpbmcvaHRtbGVkaXRpbmcuY3BwCShyZXZpc2lvbiA1NjA5OCkKKysrIFdl
YkNvcmUvZWRpdGluZy9odG1sZWRpdGluZy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTg2NCw3ICs4
NjQsMjggQEAgYm9vbCBpc1RhYmxlQ2VsbChjb25zdCBOb2RlKiBub2RlKQogCiBib29sIGlzRW1w
dHlUYWJsZUNlbGwoY29uc3QgTm9kZSogbm9kZSkKIHsKLSAgICByZXR1cm4gbm9kZSAmJiBub2Rl
LT5yZW5kZXJlcigpICYmIChub2RlLT5yZW5kZXJlcigpLT5pc1RhYmxlQ2VsbCgpIHx8IChub2Rl
LT5yZW5kZXJlcigpLT5pc0JSKCkgJiYgbm9kZS0+cGFyZW50Tm9kZSgpLT5yZW5kZXJlcigpICYm
IG5vZGUtPnBhcmVudE5vZGUoKS0+cmVuZGVyZXIoKS0+aXNUYWJsZUNlbGwoKSkpOyAgICAgCisg
ICAgLy8gUmV0dXJucyB0cnVlIElGRiB0aGUgcGFzc2VkIGluIG5vZGUgaXMgb25lIG9mOgorICAg
IC8vICAgLikgYSB0YWJsZSBjZWxsIHdpdGggbm8gY2hpbGRyZW4sCisgICAgLy8gICAuKSBhIHRh
YmxlIGNlbGwgd2l0aCBhIHNpbmdsZSBCUiBjaGlsZCwgYW5kIHdoaWNoIGhhcyBubyBvdGhlciBj
aGlsZCByZW5kZXJlcnMsIGluY2x1ZGluZyA6YmVmb3JlIGFuZCA6YWZ0ZXIgcmVuZGVyZXJzCisg
ICAgLy8gICAuKSB0aGUgQlIgY2hpbGQgb2Ygc3VjaCBhIHRhYmxlIGNlbGwKKyAgICB3aGlsZSAo
bm9kZSAmJiAhbm9kZS0+cmVuZGVyZXIoKSkKKyAgICAgICAgbm9kZSA9IG5vZGUtPnBhcmVudCgp
OworICAgIGlmICghbm9kZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIFJlbmRlck9iamVj
dCogcmVuZGVyZXIgPSBub2RlLT5yZW5kZXJlcigpOworICAgIGlmIChyZW5kZXJlci0+aXNCUigp
KSB7CisgICAgICAgIHJlbmRlcmVyID0gcmVuZGVyZXItPnBhcmVudCgpOworICAgICAgICBpZiAo
IXJlbmRlcmVyKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIXJl
bmRlcmVyLT5pc1RhYmxlQ2VsbCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgUmVuZGVy
T2JqZWN0KiBjaGlsZFJlbmRlcmVyID0gcmVuZGVyZXItPmZpcnN0Q2hpbGQoKTsKKyAgICBpZiAo
IWNoaWxkUmVuZGVyZXIpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIGlmICghY2hpbGRSZW5k
ZXJlci0+aXNCUigpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuICFjaGlsZFJl
bmRlcmVyLT5uZXh0U2libGluZygpOwogfQogCiBQYXNzUmVmUHRyPEhUTUxFbGVtZW50PiBjcmVh
dGVEZWZhdWx0UGFyYWdyYXBoRWxlbWVudChEb2N1bWVudCogZG9jdW1lbnQpCkluZGV4OiBMYXlv
dXRUZXN0cy9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCShy
ZXZpc2lvbiA1NjA5OCkKKysrIExheW91dFRlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpA
QCAtMSwzICsxLDIwIEBACisyMDEwLTAzLTE3ICBSb2xhbmQgU3RlaW5lciAgPHJvbGFuZHN0ZWlu
ZXJAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgIEJ1ZyAzNTYzMiAtICBodG1sZWRpdGluZy5jcHAgOiBpc0VtcHR5VGFibGVDZWxs
KCkgaXMgaW5jb21wbGV0ZQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9MzU2MzIKKworICAgICAgICBDb3JyZWN0IGlzRW1wdHlUYWJsZUNlbGwgdG8gY2hl
Y2sgZm9yIHRoZSBwcmVzZW5jZSBvZiBvdGhlciByZW5kZXJlcgorICAgICAgICBjaGlsZHJlbi4K
KyAgICAgICAgCisgICAgICAgIExheW91dCB0ZXN0IGNoZWNrcyB0aGF0IGRlbGV0aW5nIGEgPGJy
PiB3aXRoaW4gdGhlIGxhc3QgdGFibGUgY2VsbCB3b3Jrcy4KKworICAgICAgICAqIGVkaXRpbmcv
ZGVsZXRpbmcvZGVsZXRlLWJyLWluLWxhc3QtdGFibGUtY2VsbC1leHBlY3RlZC50eHQ6IEFkZGVk
LgorICAgICAgICAqIGVkaXRpbmcvZGVsZXRpbmcvZGVsZXRlLWJyLWluLWxhc3QtdGFibGUtY2Vs
bC5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ndGsvU2tpcHBlZDoKKyAgICAgICAg
KiBwbGF0Zm9ybS9xdC9Ta2lwcGVkOgorCiAyMDEwLTAzLTE2ICBKb2huIEFiZC1FbC1NYWxlayAg
PGphbUBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gRmlzaGVyLgpJ
bmRleDogTGF5b3V0VGVzdHMvZWRpdGluZy9kZWxldGluZy9kZWxldGUtYnItaW4tbGFzdC10YWJs
ZS1jZWxsLWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9lZGl0aW5nL2Rl
bGV0aW5nL2RlbGV0ZS1ici1pbi1sYXN0LXRhYmxlLWNlbGwtZXhwZWN0ZWQudHh0CShyZXZpc2lv
biAwKQorKysgTGF5b3V0VGVzdHMvZWRpdGluZy9kZWxldGluZy9kZWxldGUtYnItaW4tbGFzdC10
YWJsZS1jZWxsLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxMSBAQAorQnVn
IDM1MzY5IGFuZCBCdWcgMzU2MzIKKworRXhlY3V0aW5nIGEgZGVsZXRlIGNvbW1hbmQgd2hlbiBw
b3NpdGlvbmVkIGJlZm9yZSBhIEJSIGluIGEgdGFibGUgY2VsbCAoZXNwLiB0aGUgbGFzdCkKKwor
LS0tCisxCTIKKzMJNAorLS0tCisKK0JlZm9yZTogPHRib2R5Pjx0cj48dGQ+MTwvdGQ+PHRkPjI8
L3RkPjwvdHI+PHRyPjx0ZD4zPC90ZD48dGQ+NDxicj48YnIgaWQ9Imxhc3RCUiI+PC90ZD48L3Ry
PjwvdGJvZHk+IAorQWZ0ZXIgOiA8dGJvZHk+PHRyPjx0ZD4xPC90ZD48dGQ+MjwvdGQ+PC90cj48
dHI+PHRkPjM8L3RkPjx0ZD40PGJyIGlkPSJsYXN0QlIiPjwvdGQ+PC90cj48L3Rib2R5PgpJbmRl
eDogTGF5b3V0VGVzdHMvZWRpdGluZy9kZWxldGluZy9kZWxldGUtYnItaW4tbGFzdC10YWJsZS1j
ZWxsLmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvZWRpdGluZy9kZWxldGluZy9kZWxl
dGUtYnItaW4tbGFzdC10YWJsZS1jZWxsLmh0bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0
cy9lZGl0aW5nL2RlbGV0aW5nL2RlbGV0ZS1ici1pbi1sYXN0LXRhYmxlLWNlbGwuaHRtbAkocmV2
aXNpb24gMCkKQEAgLTAsMCArMSw0MCBAQAorPGh0bWw+Cis8aGVhZD4KKzxzY3JpcHQgc3JjPS4u
L2VkaXRpbmcuanMgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvSmF2YVNjcmlwdCIg
Pjwvc2NyaXB0PgorPHNjcmlwdD4KK2Z1bmN0aW9uIHJ1blRlc3QoKQoreworICAgIHRhYmxlID0g
ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRhYmxlIik7CisgICAgYnIgPSBkb2N1bWVudC5nZXRF
bGVtZW50QnlJZCgibGFzdEJSIik7CisgICAgYmVmb3JlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5
SWQoImJlZm9yZSIpOworICAgIGFmdGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFmdGVy
Iik7CisgICAgYmVmb3JlLmlubmVyVGV4dCA9IHRhYmxlLmlubmVySFRNTDsKKyAgICBzZWwgPSB3
aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CisgICAgc2VsLnNldEJhc2VBbmRFeHRlbnQoYnIsIDAsIGJy
LCAwKTsKKyAgICBkZWxldGVDb21tYW5kKCk7CisgICAgYWZ0ZXIuaW5uZXJUZXh0ID0gdGFibGUu
aW5uZXJIVE1MLnRvU3RyaW5nKCk7Cit9Cis8L3NjcmlwdD4KKzwvaGVhZD4KKworPGJvZHk+Cis8
cD48YSBocmVmPSJodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzUzNjki
PkJ1ZyAzNTM2OTwvYT4gYW5kIDxhIGhyZWY9Imh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0zNTYzMiI+QnVnIDM1NjMyPC9hPjwvcD4KKzxwPkV4ZWN1dGluZyBhIGRlbGV0
ZSBjb21tYW5kIHdoZW4gcG9zaXRpb25lZCBiZWZvcmUgYSBCUiBpbiBhIHRhYmxlIGNlbGwgKGVz
cC4gdGhlIGxhc3QpPC9wPgorPGRpdiBjb250ZW50ZWRpdGFibGU+CistLS0KKzx0YWJsZSBpZD0i
dGFibGUiPjx0cj48dGQ+MTwvdGQ+PHRkPjI8L3RkPjwvdHI+PHRyPjx0ZD4zPC90ZD48dGQ+NDxi
cj48YnIgaWQ9Imxhc3RCUiI+PC90ZD48L3RyPjwvdGFibGU+CistLS0KKzwvZGl2PgorPGJyPgor
PHA+QmVmb3JlOiA8c3BhbiBpZD0iYmVmb3JlIj5GQUlMRUQ8L3NwYW4+Cis8YnI+Cis8cD5BZnRl
ciA6IDxzcGFuIGlkPSJhZnRlciI+RkFJTEVEPC9zcGFuPgorCis8c2NyaXB0PgoraWYgKHdpbmRv
dy5sYXlvdXRUZXN0Q29udHJvbGxlcikKKyAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5kdW1wQXNU
ZXh0KCk7CisKK3J1blRlc3QoKTsKKzwvc2NyaXB0PgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5l
d2xpbmUgYXQgZW5kIG9mIGZpbGUKSW5kZXg6IExheW91dFRlc3RzL3BsYXRmb3JtL2d0ay9Ta2lw
cGVkCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL3BsYXRmb3JtL2d0ay9Ta2lwcGVkCShyZXZp
c2lvbiA1NjA5OCkKKysrIExheW91dFRlc3RzL3BsYXRmb3JtL2d0ay9Ta2lwcGVkCSh3b3JraW5n
IGNvcHkpCkBAIC04NjAsNiArODYwLDcgQEAgZWRpdGluZy9kZWxldGluZy9kZWxldGUtYnItMDA4
Lmh0bWwKIGVkaXRpbmcvZGVsZXRpbmcvZGVsZXRlLWJyLTAwOS5odG1sCiBlZGl0aW5nL2RlbGV0
aW5nL2RlbGV0ZS1ici0wMTEuaHRtbAogZWRpdGluZy9kZWxldGluZy9kZWxldGUtYnItMDEyLmh0
bWwKK2VkaXRpbmcvZGVsZXRpbmcvZGVsZXRlLWJyLWluLWxhc3QtdGFibGUtY2VsbC5odG1sCiBl
ZGl0aW5nL2RlbGV0aW5nL2RlbGV0ZS1ieS13b3JkLTAwMi5odG1sCiBlZGl0aW5nL2RlbGV0aW5n
L2RlbGV0ZS1jaGFyYWN0ZXItMDAxLmh0bWwKIGVkaXRpbmcvZGVsZXRpbmcvZGVsZXRlLWZpcnN0
LWxpc3QtaXRlbS5odG1sCkluZGV4OiBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9xdC9Ta2lwcGVkCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIExheW91dFRlc3RzL3BsYXRmb3JtL3F0L1NraXBwZWQJKHJldmlzaW9uIDU2
MDk4KQorKysgTGF5b3V0VGVzdHMvcGxhdGZvcm0vcXQvU2tpcHBlZAkod29ya2luZyBjb3B5KQpA
QCAtMTY0OSw2ICsxNjQ5LDcgQEAgZWRpdGluZy9kZWxldGluZy9kZWxldGUtYnItMDEwLmh0bWwK
IGVkaXRpbmcvZGVsZXRpbmcvZGVsZXRlLWJyLTAxMS5odG1sCiBlZGl0aW5nL2RlbGV0aW5nL2Rl
bGV0ZS1ici0wMTIuaHRtbAogZWRpdGluZy9kZWxldGluZy9kZWxldGUtYnItMDEzLmh0bWwKK2Vk
aXRpbmcvZGVsZXRpbmcvZGVsZXRlLWJyLWluLWxhc3QtdGFibGUtY2VsbC5odG1sCiBlZGl0aW5n
L2RlbGV0aW5nL2RlbGV0ZS1jaGFyYWN0ZXItMDAxLmh0bWwKIGVkaXRpbmcvZGVsZXRpbmcvZGVs
ZXRlLWNvbnRpZ3VvdXMtd3MtMDAxLmh0bWwKIGVkaXRpbmcvZGVsZXRpbmcvZGVsZXRlLWZpcnN0
LWxpc3QtaXRlbS5odG1sCg==
</data>
<flag name="review"
          id="34046"
          type_id="1"
          status="+"
          setter="ojan"
    />
          </attachment>
      

    </bug>

</bugzilla>