2 <title>Test for nsIEditor.isCommandEnabled for normal and read-only editors
</title>
3 <script src=
"/tests/SimpleTest/SimpleTest.js"></script>
4 <script src=
"/tests/SimpleTest/EventUtils.js"></script>
5 <link rel=
"stylesheet" href=
"/tests/SimpleTest/test.css">
6 <div contenteditable
></div>
8 let node
= document
.querySelector("div");
11 SpecialPowers
.wrap(window
).docShell
.editingSession
.getEditorForWindow(window
);
13 // Supported environments for each command. Supported values for each
14 // environment property:
15 // content: "empty", "non-empty", "cleared"
16 // selected: true, false
17 // readonly: true, false
19 // If an environment definition does not state a certain property, the command
20 // supports all possible values for that property. The following definition:
21 // "cmd_copy": [{content: "non-empty", selected: true}],
24 // {content: "non-empty", selected: true, readonly: true},
25 // {content: "non-empty", selected: true, readonly: false},
27 const TEST_COMMANDS
= {
28 "cmd_selectAll": [{content
: "non-empty"}],
30 "cmd_copy": [{content
: "non-empty", selected
: true}],
32 "cmd_cut": [{content
: "non-empty", selected
: true, readonly
: false}],
33 "cmd_delete": [{content
: "non-empty", selected
: true, readonly
: false}],
34 "cmd_removeList":[{content
: "non-empty", selected
: true, readonly
: false}],
36 "cmd_undo": [{content
: "cleared", readonly
: false}],
37 "cmd_redo": [{content
: "cleared", readonly
: false}],
39 "cmd_switchTextDirection": [{readonly
: false}],
40 "cmd_bold": [{readonly
: false}],
41 "cmd_italic": [{readonly
: false}],
42 "cmd_underline": [{readonly
: false}],
43 "cmd_em": [{readonly
: false}],
44 "cmd_strong": [{readonly
: false}],
45 "cmd_strikethrough": [{readonly
: false}],
46 "cmd_superscript": [{readonly
: false}],
47 "cmd_subscript": [{readonly
: false}],
48 "cmd_indent": [{readonly
: false}],
49 "cmd_outdent": [{readonly
: false}],
50 "cmd_formatBlock": [{readonly
: false}],
51 "cmd_paragraphState": [{readonly
: false}],
52 "cmd_fontFace": [{readonly
: false}],
53 "cmd_fontSize": [{readonly
: false}],
54 "cmd_fontColor": [{readonly
: false}],
55 "cmd_backgroundColor": [{readonly
: false}],
56 "cmd_highlight": [{readonly
: false}],
57 "cmd_align": [{readonly
: false}],
58 "cmd_removeStyles": [{readonly
: false}],
59 "cmd_increaseFont": [{readonly
: false}],
60 "cmd_decreaseFont": [{readonly
: false}],
61 "cmd_insertHR": [{readonly
: false}],
62 "cmd_insertHTML": [{readonly
: false}],
63 "cmd_insertText": [{readonly
: false}],
64 "cmd_insertParagraph": [{readonly
: false}],
65 "cmd_insertLineBreak": [{readonly
: false}],
66 "cmd_tt":[{readonly
: false}],
67 "cmd_nobreak":[{readonly
: false}],
68 "cmd_cite":[{readonly
: false}],
69 "cmd_abbr":[{readonly
: false}],
70 "cmd_acronym":[{readonly
: false}],
71 "cmd_code":[{readonly
: false}],
72 "cmd_samp":[{readonly
: false}],
73 "cmd_var":[{readonly
: false}],
74 "cmd_removeLinks":[{readonly
: false}],
75 "cmd_ol":[{readonly
: false}],
76 "cmd_ul":[{readonly
: false}],
77 "cmd_dt":[{readonly
: false}],
78 "cmd_dd":[{readonly
: false}],
81 "cmd_insertImageNoUI": [{readonly
: false}],
82 "cmd_insertLinkNoUI": [{readonly
: false}],
85 function testCommands(content
) {
86 for (let readonly
of [true, false]){
88 htmlEditor
.flags
|= SpecialPowers
.Ci
.nsIEditor
.eEditorReadonlyMask
;
90 htmlEditor
.flags
&= ~SpecialPowers
.Ci
.nsIEditor
.eEditorReadonlyMask
;
93 for (let selected
of [true, false]) {
94 let selection
= window
.getSelection();
95 selection
.collapse(node
);
98 if (content
== "non-empty") {
99 // The command cmd_removeList needs selected text inside a list. It
100 // does not matter for all other commands, so lets just select that.
101 let range
= document
.createRange();
102 let li
= document
.querySelector("li");
103 range
.selectNodeContents(li
);
104 selection
.removeAllRanges();
105 selection
.addRange(range
);
107 document
.execCommand("selectAll");
111 for (let [cmd
, supports
] of Object
.entries(TEST_COMMANDS
)) {
112 // Check if the command should support this environment.
113 let expected
= supports
.some(supported
=>
114 content
== (supported
?.content
?? content
) &&
115 readonly
== (supported
?.readonly
?? readonly
) &&
116 selected
== (supported
?.selected
?? selected
)
119 SpecialPowers
.isCommandEnabled(window
, cmd
),
121 `Enabled state of command ${cmd} should be ${
122 expected ? "TRUE" : "FALSE"
123 } for ${JSON.stringify({content, selected, readonly})}`
130 testCommands("empty");
132 // The cmd_removeList command needs a list.
133 node
.innerHTML
= "<ul><li><span>abcd</span></li></ul>";
134 testCommands("non-empty");
136 // Make some content modifications to enable undo and redo.
137 node
.innerText
= "ABC";
138 is(node
.innerText
.trim(), "ABC", "phase 1");
139 document
.execCommand("selectAll");
140 synthesizeKey("KEY_Backspace");
141 is(node
.innerText
.trim(), "", "phase 2");
143 is(node
.innerText
.trim(), "3", "phase 3");
144 SpecialPowers
.doCommand(window
, "cmd_undo");
145 is(node
.innerText
.trim(), "", "phase 4");
148 testCommands("cleared");