File: test_nsITableEditor_in_plaintext-only.html

package info (click to toggle)
firefox 147.0.3-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,683,320 kB
  • sloc: cpp: 7,607,359; javascript: 6,533,295; ansic: 3,775,223; python: 1,415,500; xml: 634,561; asm: 438,949; java: 186,241; sh: 62,752; makefile: 18,079; objc: 13,092; perl: 12,808; yacc: 4,583; cs: 3,846; pascal: 3,448; lex: 1,720; ruby: 1,003; php: 436; lisp: 258; awk: 247; sql: 66; sed: 54; csh: 10; exp: 6
file content (500 lines) | stat: -rw-r--r-- 20,745 bytes parent folder | download | duplicates (11)
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
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
<script>
"use strict";

SimpleTest.waitForExplicitFinish();
SimpleTest.waitForFocus(async () => {
  document.body.contentEditable = "plaintext-only";
  document.body.focus();
  const tableEditor = getHTMLEditor();

  await (async function test_insertTableCell() {
    document.body.innerHTML = "<table><td><br></td></table>";
    const td = document.querySelector("td");
    td.getBoundingClientRect();
    getSelection().collapse(td, 0);
    const innerHTML = document.body.innerHTML;
    try {
      tableEditor.insertTableCell(1, true);
      ok(false, "insertTableCell should fail in contenteditable=plaintext-only");
    } catch (e) {
      is(
        e.name,
        "NS_ERROR_NOT_AVAILABLE",
        "insertTableCell should throw NS_ERROR_NOT_AVAILABLE exception"
      );
    }
    await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));
    is(document.body.innerHTML, innerHTML, "insertTableCell shouldn't change the DOM");
  })();

  await (async function test_insertTableColumn() {
    document.body.innerHTML = "<table><td><br></td></table>";
    const td = document.querySelector("td");
    td.getBoundingClientRect();
    getSelection().collapse(td, 0);
    const innerHTML = document.body.innerHTML;
    try {
      tableEditor.insertTableColumn(1, true);
      ok(false, "insertTableColumn should fail in contenteditable=plaintext-only");
    } catch (e) {
      is(
        e.name,
        "NS_ERROR_NOT_AVAILABLE",
        "insertTableColumn should throw NS_ERROR_NOT_AVAILABLE exception"
      );
    }
    await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));
    is(document.body.innerHTML, innerHTML, "insertTableColumn shouldn't change the DOM");
  })();

  await (async function test_insertTableRow() {
    document.body.innerHTML = "<table><td><br></td></table>";
    const td = document.querySelector("td");
    td.getBoundingClientRect();
    getSelection().collapse(td, 0);
    const innerHTML = document.body.innerHTML;
    try {
      tableEditor.insertTableRow(1, true);
      ok(false, "insertTableRow should fail in contenteditable=plaintext-only");
    } catch (e) {
      is(
        e.name,
        "NS_ERROR_NOT_AVAILABLE",
        "insertTableRow should throw NS_ERROR_NOT_AVAILABLE exception"
      );
    }
    await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));
    is(document.body.innerHTML, innerHTML, "insertTableRow shouldn't change the DOM");
  })();

  await (async function test_deleteTableCellContents() {
    document.body.innerHTML = "<table><td>abc</td></table>";
    const td = document.querySelector("td");
    td.getBoundingClientRect();
    getSelection().selectAllChildren(td);
    const innerHTML = document.body.innerHTML;
    try {
      tableEditor.deleteTableCellContents();
      ok(false, "deleteTableCellContents should fail in contenteditable=plaintext-only");
    } catch (e) {
      is(
        e.name,
        "NS_ERROR_NOT_AVAILABLE",
        "deleteTableCellContents should throw NS_ERROR_NOT_AVAILABLE exception"
      );
    }
    await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));
    is(document.body.innerHTML, innerHTML, "deleteTableCellContents shouldn't change the DOM");
  })();

  await (async function test_deleteTableCell() {
    document.body.innerHTML = "<table><td><br></td><td><br></td></table>";
    const td = document.querySelector("td");
    td.getBoundingClientRect();
    getSelection().collapse(td, 0);
    const innerHTML = document.body.innerHTML;
    try {
      tableEditor.deleteTableCell(1);
      ok(false, "deleteTableCell should fail in contenteditable=plaintext-only");
    } catch (e) {
      is(
        e.name,
        "NS_ERROR_NOT_AVAILABLE",
        "deleteTableCell should throw NS_ERROR_NOT_AVAILABLE exception"
      );
    }
    await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));
    is(document.body.innerHTML, innerHTML, "deleteTableCell shouldn't change the DOM");
  })();

  await (async function test_deleteTableColumn() {
    document.body.innerHTML = "<table><td><br></td><td><br></td></table>";
    const td = document.querySelector("td");
    td.getBoundingClientRect();
    getSelection().collapse(td, 0);
    const innerHTML = document.body.innerHTML;
    try {
      tableEditor.deleteTableColumn(1);
      ok(false, "deleteTableColumn should fail in contenteditable=plaintext-only");
    } catch (e) {
      is(
        e.name,
        "NS_ERROR_NOT_AVAILABLE",
        "deleteTableColumn should throw NS_ERROR_NOT_AVAILABLE exception"
      );
    }
    await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));
    is(document.body.innerHTML, innerHTML, "deleteTableColumn shouldn't change the DOM");
  })();

  await (async function test_deleteTableRow() {
    document.body.innerHTML = "<table><tr><td><br></td></tr><tr><td><br></td></tr></table>";
    const td = document.querySelector("td");
    td.getBoundingClientRect();
    getSelection().collapse(td, 0);
    const innerHTML = document.body.innerHTML;
    try {
      tableEditor.deleteTableRow(1);
      ok(false, "deleteTableRow should fail in contenteditable=plaintext-only");
    } catch (e) {
      is(
        e.name,
        "NS_ERROR_NOT_AVAILABLE",
        "deleteTableRow should throw NS_ERROR_NOT_AVAILABLE exception"
      );
    }
    await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));
    is(document.body.innerHTML, innerHTML, "deleteTableRow shouldn't change the DOM");
  })();

  await (async function test_selectTableCell() {
    document.body.innerHTML = "<table><td>abc</td></table>";
    const td = document.querySelector("td");
    td.getBoundingClientRect();
    getSelection().collapse(td.firstChild, 0);
    const innerHTML = document.body.innerHTML;
    try {
      tableEditor.selectTableCell();
      ok(true, "selectTableCell should succeed even in contenteditable=plaintext-only");
    } catch (e) {
      ok(false, `selectTableCell shouldn't fail in contenteditable=plaintext-only (${e.message})`);
    }
    await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));
    is(document.body.innerHTML, innerHTML, "selectTableCell shouldn't change the DOM");
  })();

  await (async function test_selectTableRow() {
    document.body.innerHTML = "<table><td>abc</td></table>";
    const td = document.querySelector("td");
    td.getBoundingClientRect();
    getSelection().collapse(td.firstChild, 0);
    const innerHTML = document.body.innerHTML;
    try {
      tableEditor.selectTableRow();
      ok(true, "selectTableRow should succeed even in contenteditable=plaintext-only");
    } catch (e) {
      ok(false, `selectTableRow shouldn't fail in contenteditable=plaintext-only (${e.message})`);
    }
    await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));
    is(document.body.innerHTML, innerHTML, "selectTableRow shouldn't change the DOM");
  })();

  await (async function test_selectTableColumn() {
    document.body.innerHTML = "<table><td>abc</td></table>";
    const td = document.querySelector("td");
    td.getBoundingClientRect();
    getSelection().collapse(td.firstChild, 0);
    const innerHTML = document.body.innerHTML;
    try {
      tableEditor.selectTableColumn();
      ok(true, "selectTableColumn should succeed even in contenteditable=plaintext-only");
    } catch (e) {
      ok(false, `selectTableColumn shouldn't fail in contenteditable=plaintext-only (${e.message})`);
    }
    await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));
    is(document.body.innerHTML, innerHTML, "selectTableColumn shouldn't change the DOM");
  })();

  await (async function test_selectTable() {
    document.body.innerHTML = "<table><td>abc</td></table>";
    const td = document.querySelector("td");
    td.getBoundingClientRect();
    getSelection().collapse(td.firstChild, 0);
    const innerHTML = document.body.innerHTML;
    try {
      tableEditor.selectTable();
      ok(true, "selectTable should succeed even in contenteditable=plaintext-only");
    } catch (e) {
      ok(false, `selectTable shouldn't fail in contenteditable=plaintext-only (${e.message})`);
    }
    await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));
    is(document.body.innerHTML, innerHTML, "selectTable shouldn't change the DOM");
  })();

  await (async function test_selectAllTableCells() {
    document.body.innerHTML = "<table><td>abc</td></table>";
    const td = document.querySelector("td");
    td.getBoundingClientRect();
    getSelection().collapse(td.firstChild, 0);
    const innerHTML = document.body.innerHTML;
    try {
      tableEditor.selectAllTableCells();
      ok(true, "selectAllTableCells should succeed even in contenteditable=plaintext-only");
    } catch (e) {
      ok(false, `selectAllTableCells shouldn't fail in contenteditable=plaintext-only (${e.message})`);
    }
    await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));
    is(document.body.innerHTML, innerHTML, "selectAllTableCells shouldn't change the DOM");
  })();

  await (async function test_switchTableCellHeaderType() {
    document.body.innerHTML = "<table><td><br></td></table>";
    const td = document.querySelector("td");
    td.getBoundingClientRect();
    getSelection().collapse(td, 0);
    const innerHTML = document.body.innerHTML;
    try {
      tableEditor.switchTableCellHeaderType(td);
      ok(false, "switchTableCellHeaderType should fail in contenteditable=plaintext-only");
    } catch (e) {
      is(
        e.name,
        "NS_ERROR_NOT_AVAILABLE",
        "switchTableCellHeaderType should throw NS_ERROR_NOT_AVAILABLE exception"
      );
    }
    await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));
    is(document.body.innerHTML, innerHTML, "switchTableCellHeaderType shouldn't change the DOM");
  })();

  await (async function test_joinTableCells() {
    document.body.innerHTML = "<table><td><br></td><td><br></td></table>";
    const td1 = document.querySelector("td");
    const td2 = document.querySelector("td + td");
    td1.getBoundingClientRect();
    const range1 = document.createRange();
    range1.selectNode(td1);
    const range2 = document.createRange();
    range2.selectNode(td2);
    getSelection().removeAllRanges();
    getSelection().addRange(range1);
    getSelection().addRange(range2);
    const innerHTML = document.body.innerHTML;
    try {
      tableEditor.joinTableCells(true);
      ok(false, "joinTableCells should fail in contenteditable=plaintext-only");
    } catch (e) {
      is(
        e.name,
        "NS_ERROR_NOT_AVAILABLE",
        "joinTableCells should throw NS_ERROR_NOT_AVAILABLE exception"
      );
    }
    await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));
    is(document.body.innerHTML, innerHTML, "joinTableCells shouldn't change the DOM");
  })();

  await (async function test_splitTableCell() {
    document.body.innerHTML = "<table><tr><td colspan=\"2\" rowspan=\"2\"><br></td><td><br></td></tr><tr><td><br></td></tr></table>";
    const td = document.querySelector("td");
    td.getBoundingClientRect();
    getSelection().collapse(td, 0);
    const innerHTML = document.body.innerHTML;
    try {
      tableEditor.splitTableCell();
      ok(false, "splitTableCell should fail in contenteditable=plaintext-only");
    } catch (e) {
      is(
        e.name,
        "NS_ERROR_NOT_AVAILABLE",
        "splitTableCell should throw NS_ERROR_NOT_AVAILABLE exception"
      );
    }
    await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));
    is(document.body.innerHTML, innerHTML, "splitTableCell shouldn't change the DOM");
  })();

  await (async function test_normalizeTable() {
    document.body.innerHTML = "<table><tr><td><br></td><td><br></td></tr><tr><td><br></td></tr></table>";
    const td = document.querySelector("td");
    td.getBoundingClientRect();
    getSelection().collapse(td, 0);
    const innerHTML = document.body.innerHTML;
    try {
      tableEditor.normalizeTable(document.querySelector("table"));
      ok(false, "normalizeTable should fail in contenteditable=plaintext-only");
    } catch (e) {
      is(
        e.name,
        "NS_ERROR_NOT_AVAILABLE",
        "normalizeTable should throw NS_ERROR_NOT_AVAILABLE exception"
      );
    }
    await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));
    is(document.body.innerHTML, innerHTML, "normalizeTable shouldn't change the DOM");
  })();

  await (async function test_getCellIndexes() {
    document.body.innerHTML = "<table><td><br></td></table>";
    const td = document.querySelector("td");
    td.getBoundingClientRect();
    getSelection().collapse(td, 0);
    const innerHTML = document.body.innerHTML;
    try {
      const rowIndex = {};
      const colIndex = {};
      tableEditor.getCellIndexes(td, rowIndex, colIndex);
      ok(true, "getCellIndexes should succeed even in contenteditable=plaintext-only");
    } catch (e) {
      ok(false, `getCellIndexes shouldn't fail in contenteditable=plaintext-only (${e.message})`);
    }
    await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));
    is(document.body.innerHTML, innerHTML, "getCellIndexes shouldn't change the DOM");
  })();

  await (async function test_getTableSize() {
    document.body.innerHTML = "<table><td><br></td></table>";
    const td = document.querySelector("td");
    td.getBoundingClientRect();
    getSelection().collapse(td, 0);
    const innerHTML = document.body.innerHTML;
    try {
      const rowSize = {};
      const colSize = {};
      tableEditor.getTableSize(td, rowSize, colSize);
      ok(true, "getTableSize should succeed even in contenteditable=plaintext-only");
    } catch (e) {
      ok(false, `getTableSize shouldn't fail in contenteditable=plaintext-only (${e.message})`);
    }
    await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));
    is(document.body.innerHTML, innerHTML, "getTableSize shouldn't change the DOM");
  })();

  await (async function test_getCellAt() {
    document.body.innerHTML = "<table><td><br></td></table>";
    const td = document.querySelector("td");
    td.getBoundingClientRect();
    getSelection().collapse(td, 0);
    const innerHTML = document.body.innerHTML;
    try {
      tableEditor.getCellAt(document.querySelector("table"), 0, 0);
      ok(true, "getCellAt should succeed even in contenteditable=plaintext-only");
    } catch (e) {
      ok(false, `getCellAt shouldn't fail in contenteditable=plaintext-only (${e.message})`);
    }
    await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));
    is(document.body.innerHTML, innerHTML, "getCellAt shouldn't change the DOM");
  })();

  await (async function test_getCellDataAt() {
    document.body.innerHTML = "<table><td><br></td></table>";
    const td = document.querySelector("td");
    td.getBoundingClientRect();
    getSelection().collapse(td, 0);
    const innerHTML = document.body.innerHTML;
    try {
      const cellElement = {},
        rowIndex = {}, colIndex = {},
        rowSpan = {}, colSpan = {},
        effectiveRowSpan = {}, effectiveColSpan = {},
        isSelected = {};
      tableEditor.getCellDataAt(
        document.querySelector("table"),
        0, 0,
        cellElement,
        rowIndex, colIndex,
        rowSpan, colSpan,
        effectiveRowSpan, effectiveColSpan,
        isSelected
      );
      ok(true, "getCellDataAt should succeed even in contenteditable=plaintext-only");
    } catch (e) {
      ok(false, `getCellDataAt shouldn't fail in contenteditable=plaintext-only (${e.message})`);
    }
    await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));
    is(document.body.innerHTML, innerHTML, "getCellDataAt shouldn't change the DOM");
  })();

  await (async function test_getFirstRow() {
    document.body.innerHTML = "<table><td><br></td></table>";
    const td = document.querySelector("td");
    td.getBoundingClientRect();
    getSelection().collapse(td, 0);
    const innerHTML = document.body.innerHTML;
    try {
      tableEditor.getFirstRow(document.querySelector("table"));
      ok(true, "getFirstRow should succeed even in contenteditable=plaintext-only");
    } catch (e) {
      ok(false, `getFirstRow shouldn't fail in contenteditable=plaintext-only (${e.message})`);
    }
    await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));
    is(document.body.innerHTML, innerHTML, "getFirstRow shouldn't change the DOM");
  })();

  await (async function test_getSelectedOrParentTableElement() {
    document.body.innerHTML = "<table><td><br></td></table>";
    const td = document.querySelector("td");
    td.getBoundingClientRect();
    getSelection().collapse(td, 0);
    const innerHTML = document.body.innerHTML;
    try {
      const tagName = {}, count = {};
      tableEditor.getSelectedOrParentTableElement(document.querySelector("table"), tagName, count);
      ok(true, "getSelectedOrParentTableElement should succeed even in contenteditable=plaintext-only");
    } catch (e) {
      ok(false, `getSelectedOrParentTableElement shouldn't fail in contenteditable=plaintext-only (${e.message})`);
    }
    await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));
    is(document.body.innerHTML, innerHTML, "getSelectedOrParentTableElement shouldn't change the DOM");
  })();

  await (async function test_getSelectedCellsType() {
    document.body.innerHTML = "<table><td><br></td></table>";
    const td = document.querySelector("td");
    td.getBoundingClientRect();
    getSelection().collapse(td, 0);
    const innerHTML = document.body.innerHTML;
    try {
      tableEditor.getSelectedCellsType(td);
      ok(true, "getSelectedCellsType should succeed even in contenteditable=plaintext-only");
    } catch (e) {
      ok(false, `getSelectedCellsType shouldn't fail in contenteditable=plaintext-only (${e.message})`);
    }
    await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));
    is(document.body.innerHTML, innerHTML, "getSelectedCellsType shouldn't change the DOM");
  })();

  await (async function test_getFirstSelectedCellInTable() {
    document.body.innerHTML = "<table><td><br></td></table>";
    const td = document.querySelector("td");
    td.getBoundingClientRect();
    getSelection().collapse(td, 0);
    const innerHTML = document.body.innerHTML;
    try {
      const rowIndex = {}, colIndex = {};
      tableEditor.getFirstSelectedCellInTable(document.querySelector("table"), rowIndex, colIndex);
      ok(true, "getFirstSelectedCellInTable should succeed even in contenteditable=plaintext-only");
    } catch (e) {
      ok(false, `getFirstSelectedCellInTable shouldn't fail in contenteditable=plaintext-only (${e.message})`);
    }
    await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));
    is(document.body.innerHTML, innerHTML, "getFirstSelectedCellInTable shouldn't change the DOM");
  })();

  await (async function test_getSelectedCells() {
    document.body.innerHTML = "<table><td><br></td></table>";
    const td = document.querySelector("td");
    td.getBoundingClientRect();
    getSelection().collapse(td, 0);
    const innerHTML = document.body.innerHTML;
    try {
      tableEditor.getSelectedCells();
      ok(true, "getSelectedCells should succeed even in contenteditable=plaintext-only");
    } catch (e) {
      ok(false, `getSelectedCells shouldn't fail in contenteditable=plaintext-only (${e.message})`);
    }
    await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));
    is(document.body.innerHTML, innerHTML, "getSelectedCells shouldn't change the DOM");
  })();

  document.body.removeAttribute("contenteditable");
  SimpleTest.finish();
});

function getHTMLEditor() {
  const Ci = SpecialPowers.Ci;
  const editingSession = SpecialPowers.wrap(window).docShell.editingSession;
  return editingSession.getEditorForWindow(window)
    .QueryInterface(Ci.nsITableEditor);
}
</script>
</head>
<body></body>
</html>