DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Mercurial (7f9f804e9dbe)

VCS Links

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
<!DOCTYPE>
<html>
<head>
  <title>Test for nsITableEditor.getFirstSelectedCellInTable()</title>
  <script src="/tests/SimpleTest/SimpleTest.js"></script>
  <link rel="stylesheet" href="/tests/SimpleTest/test.css">
</head>
<body>
<div id="display">
</div>
<div id="content" contenteditable></div>
<pre id="test">
</pre>

<script class="testbody" type="application/javascript">

SimpleTest.waitForExplicitFinish();
SimpleTest.waitForFocus(function() {
  let editor = document.getElementById("content");
  let selection = document.getSelection();

  selection.collapse(editor, 0);
  let rowWrapper = {};
  let colWrapper = {};
  let cell = SpecialPowers.unwrap(getTableEditor().getFirstSelectedCellInTable(rowWrapper, colWrapper));
  is(cell, null,
     "nsITableEditor.getFirstSelectedCellInTable() should return null if Selection does not select cells");
  is(rowWrapper.value, 0,
     "nsITableEditor.getFirstSelectedCellInTable() should return 0 to row number if Selection does not select cells");
  is(colWrapper.value, 0,
     "nsITableEditor.getFirstSelectedCellInTable() should return 0 to row number if Selection does not select cells");

  editor.innerHTML =
    '<table id="table">' +
      '<tr id="r1"><td id="c1-1">cell1-1</td><td id="c1-2">cell1-2</td><td id="c1-3">cell1-3</td><td id="c1-4" colspan="2" rowspan="2">cell1-4</td></tr>' +
      '<tr id="r2"><th id="c2-1" rowspan="2">cell2-1</th><td id="c2-2">cell2-2<td id="c2-3">cell2-3</td></tr>' +
      '<tr id="r3"><td id="c3-2">cell3-2</td><td id="c3-3">cell3-3</td><td id="c3-4" colspan="2">cell3-4</td></tr>' +
      '<tr id="r4"><td id="c4-1" rowspan="4">cell4-1</td><td id="c4-2">cell4-2</td><td id="c4-3">cell4-3</td><th id="c4-4">cell4-4</th><td id="c4-5">cell4-5</td></tr>' +
      '<tr id="r5"><th id="c5-2">cell5-2</th><th id="c5-3" colspan="2">cell5-3</th><td id="c5-5">cell5-5</td></tr>' +
      '<tr id="r6"><td id="c6-2">cell6-2</td><td id="c6-3">cell6-3</td><td id="c6-4"><p>cell6-4</p></td><td id="c6-5">cell6-5</td></tr>' +
      '<tr id="r7"><td id="c7-2" colspan="4">cell7-2</td></tr>' +
    "</table>";

  let tr = document.getElementById("r1");
  selection.setBaseAndExtent(tr, 0, tr, 1);
  cell = SpecialPowers.unwrap(getTableEditor().getFirstSelectedCellInTable(rowWrapper, colWrapper));
  is(cell, document.getElementById("c1-1"),
     "#1-1 nsITableEditor.getFirstSelectedCellInTable() should return the first cell element in the first row");
  is(rowWrapper.value, 0,
     "#1-1 nsITableEditor.getFirstSelectedCellInTable() should return 0 to row number for the first row");
  is(colWrapper.value, 0,
     "#1-1 nsITableEditor.getFirstSelectedCellInTable() should return 0 to column number for the first column");

  tr = document.getElementById("r1");
  selection.setBaseAndExtent(tr, 3, tr, 4);
  cell = SpecialPowers.unwrap(getTableEditor().getFirstSelectedCellInTable(rowWrapper, colWrapper));
  is(cell, document.getElementById("c1-4"),
     "#1-4 nsITableEditor.getFirstSelectedCellInTable() should return the last cell element whose colspan and rowspan are 2 in the first row");
  is(rowWrapper.value, 0,
     "#1-4 nsITableEditor.getFirstSelectedCellInTable() should return 0 to row number for the first row");
  is(colWrapper.value, 3,
     "#1-4 nsITableEditor.getFirstSelectedCellInTable() should return 3 to column number for the forth column");

  tr = document.getElementById("r2");
  selection.setBaseAndExtent(tr, 0, tr, 1);
  cell = SpecialPowers.unwrap(getTableEditor().getFirstSelectedCellInTable(rowWrapper, colWrapper));
  is(cell, document.getElementById("c2-1"),
     "#2-1 nsITableEditor.getFirstSelectedCellInTable() should return the first cell element in the second row");
  is(rowWrapper.value, 1,
     "#2-1 nsITableEditor.getFirstSelectedCellInTable() should return 1 to row number for the second row");
  is(colWrapper.value, 0,
     "#2-1 nsITableEditor.getFirstSelectedCellInTable() should return 0 to column number for the first column");

  tr = document.getElementById("r7");
  selection.setBaseAndExtent(tr, 0, tr, 1);
  cell = SpecialPowers.unwrap(getTableEditor().getFirstSelectedCellInTable(rowWrapper, colWrapper));
  is(cell, document.getElementById("c7-2"),
     "#7-2 nsITableEditor.getFirstSelectedCellInTable() should return the second cell element in the last row");
  is(rowWrapper.value, 6,
     "#7-2 nsITableEditor.getFirstSelectedCellInTable() should return 6 to row number for the seventh row");
  is(colWrapper.value, 1,
     "#7-2 nsITableEditor.getFirstSelectedCellInTable() should return 1 to column number for the second column");

  selection.removeAllRanges();
  let range = document.createRange();
  range.selectNode(document.getElementById("c2-2"));
  selection.addRange(range);
  range = document.createRange();
  range.selectNode(document.getElementById("c2-3"));
  selection.addRange(range);
  cell = SpecialPowers.unwrap(getTableEditor().getFirstSelectedCellInTable(rowWrapper, colWrapper));
  is(cell, document.getElementById("c2-2"),
     "#2-2 nsITableEditor.getFirstSelectedCellInTable() should return the second cell element in the second row");
  is(rowWrapper.value, 1,
     "#2-2 nsITableEditor.getFirstSelectedCellInTable() should return 1 to row number for the second row");
  is(colWrapper.value, 1,
     "#2-2 nsITableEditor.getFirstSelectedCellInTable() should return 1 to column number for the second column");

  selection.removeAllRanges();
  range = document.createRange();
  range.selectNode(document.getElementById("c3-4"));
  selection.addRange(range);
  range = document.createRange();
  range.selectNode(document.getElementById("c5-2"));
  selection.addRange(range);
  cell = SpecialPowers.unwrap(getTableEditor().getFirstSelectedCellInTable(rowWrapper, colWrapper));
  is(cell, document.getElementById("c3-4"),
     "#3-4 nsITableEditor.getFirstSelectedCellInTable() should return the last cell element in the third row");
  is(rowWrapper.value, 2,
     "#3-4 nsITableEditor.getFirstSelectedCellInTable() should return 2 to row number for the third row");
  is(colWrapper.value, 3,
     "#3-4 nsITableEditor.getFirstSelectedCellInTable() should return 3 to column number for the forth column");

  cell = document.getElementById("c6-4");
  selection.selectAllChildren(cell);
  cell = SpecialPowers.unwrap(getTableEditor().getFirstSelectedCellInTable(rowWrapper, colWrapper));
  is(cell, null,
     "nsITableEditor.getFirstSelectedCellInTable() should return null if neither <td> nor <th> element node is selected");
  is(rowWrapper.value, 0,
     "#3-4 nsITableEditor.getFirstSelectedCellInTable() should return 0 to row number if neither <td> nor <th> element node is selected");
  is(colWrapper.value, 0,
     "#3-4 nsITableEditor.getFirstSelectedCellInTable() should return 0 to column number if neither <td> nor <th> element node is selected");

  cell = document.getElementById("c6-5");
  selection.setBaseAndExtent(cell.firstChild, 0, cell.firstChild, 0);
  cell = SpecialPowers.unwrap(getTableEditor().getFirstSelectedCellInTable(rowWrapper, colWrapper));
  is(cell, null,
     "nsITableEditor.getFirstSelectedCellInTable() should return null if a text node is selected");
  is(rowWrapper.value, 0,
     "#3-4 nsITableEditor.getFirstSelectedCellInTable() should return 0 to row number if a text node is selected");
  is(colWrapper.value, 0,
     "#3-4 nsITableEditor.getFirstSelectedCellInTable() should return 0 to column number if a text node is selected");

  // XXX If cell is not selected, nsITableEditor.getFirstSelectedCellInTable()
  //     returns null without throwing exception, however, if there is no
  //     selection ranges, throwing an exception.  This inconsistency is odd.
  selection.removeAllRanges();
  try {
    cell = SpecialPowers.unwrap(getTableEditor().getFirstSelectedCellInTable(rowWrapper, colWrapper));
    ok(false, "nsITableEditor.getFirstSelectedCellInTable() should throw an exception if there is no selection ranges");
  } catch (e) {
    ok(true, "nsITableEditor.getFirstSelectedCellInTable() should throw an exception if there is no selection ranges");
  }

  tr = document.getElementById("r6");
  selection.setBaseAndExtent(tr, 0, tr, 1);
  try {
    cell = SpecialPowers.unwrap(getTableEditor().getFirstSelectedCellInTable());
    ok(false, "nsITableEditor.getFirstSelectedCellInTable() should throw an exception if it does not have argument");
  } catch (e) {
    ok(true, "nsITableEditor.getFirstSelectedCellInTable() should throw an exception if it does not have argument");
  }

  tr = document.getElementById("r6");
  selection.setBaseAndExtent(tr, 0, tr, 1);
  try {
    cell = SpecialPowers.unwrap(getTableEditor().getFirstSelectedCellInTable(null));
    ok(false, "nsITableEditor.getFirstSelectedCellInTable() should throw an exception if its argument is only one null");
  } catch (e) {
    ok(true, "nsITableEditor.getFirstSelectedCellInTable() should throw an exception if its argument is only one null");
  }

  tr = document.getElementById("r6");
  selection.setBaseAndExtent(tr, 0, tr, 1);
  try {
    cell = SpecialPowers.unwrap(getTableEditor().getFirstSelectedCellInTable(null, null));
    ok(false, "nsITableEditor.getFirstSelectedCellInTable() should throw an exception if its arguments are all null");
  } catch (e) {
    ok(true, "nsITableEditor.getFirstSelectedCellInTable() should throw an exception if its arguments are all null");
  }

  tr = document.getElementById("r6");
  selection.setBaseAndExtent(tr, 0, tr, 1);
  try {
    cell = SpecialPowers.unwrap(getTableEditor().getFirstSelectedCellInTable(rowWrapper, null));
    ok(false, "nsITableEditor.getFirstSelectedCellInTable() should throw an exception if its column argument is null");
  } catch (e) {
    ok(true, "nsITableEditor.getFirstSelectedCellInTable() should throw an exception if its column argument is null");
  }

  tr = document.getElementById("r6");
  selection.setBaseAndExtent(tr, 0, tr, 1);
  try {
    cell = SpecialPowers.unwrap(getTableEditor().getFirstSelectedCellInTable(null, colWrapper));
    ok(false, "nsITableEditor.getFirstSelectedCellInTable() should throw an exception if its row argument is null");
  } catch (e) {
    ok(true, "nsITableEditor.getFirstSelectedCellInTable() should throw an exception if its row argument is null");
  }

  SimpleTest.finish();
});

function getTableEditor() {
  let editingSession = SpecialPowers.wrap(window).docShell.editingSession;
  return editingSession.getEditorForWindow(window).QueryInterface(SpecialPowers.Ci.nsITableEditor);
}

</script>
</body>

</html>