summaryrefslogtreecommitdiffstats
path: root/editor/libeditor/tests/test_command_state_when_readonly.html
blob: 7b4daaa1b37b7294faa2af1ebee1a48ba3338149 (plain)
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
<!doctype html>
<title>Test for nsIEditor.isCommandEnabled for normal and read-only editors</title>
<script src="/tests/SimpleTest/SimpleTest.js"></script>
<script src="/tests/SimpleTest/EventUtils.js"></script>
<link rel="stylesheet" href="/tests/SimpleTest/test.css">
<div contenteditable></div>
<script>
  let node = document.querySelector("div");
  node.focus();
  let htmlEditor =
    SpecialPowers.wrap(window).docShell.editingSession.getEditorForWindow(window);

  // Supported environments for each command. Supported values for each
  // environment property:
  //   content: "empty", "non-empty", "cleared"
  //   selected: true, false
  //   readonly: true, false
  //
  // If an environment definition does not state a certain property, the command
  // supports all possible values for that property. The following definition:
  //    "cmd_copy": [{content: "non-empty", selected: true}],
  // is equivalent to:
  //    "cmd_copy": [
  //      {content: "non-empty", selected: true, readonly: true},
  //      {content: "non-empty", selected: true, readonly: false},
  //    ],
  const TEST_COMMANDS = {
    "cmd_selectAll": [{content: "non-empty"}],

    "cmd_copy": [{content: "non-empty", selected: true}],

    "cmd_cut": [{content: "non-empty", selected: true, readonly: false}],
    "cmd_delete": [{content: "non-empty", selected: true, readonly: false}],
    "cmd_removeList":[{content: "non-empty", selected: true, readonly: false}],

    "cmd_undo": [{content: "cleared", readonly: false}],
    "cmd_redo": [{content: "cleared", readonly: false}],

    "cmd_switchTextDirection": [{readonly: false}],
    "cmd_bold": [{readonly: false}],
    "cmd_italic": [{readonly: false}],
    "cmd_underline": [{readonly: false}],
    "cmd_em": [{readonly: false}],
    "cmd_strong": [{readonly: false}],
    "cmd_strikethrough": [{readonly: false}],
    "cmd_superscript": [{readonly: false}],
    "cmd_subscript": [{readonly: false}],
    "cmd_indent": [{readonly: false}],
    "cmd_outdent": [{readonly: false}],
    "cmd_formatBlock": [{readonly: false}],
    "cmd_paragraphState": [{readonly: false}],
    "cmd_fontFace": [{readonly: false}],
    "cmd_fontSize": [{readonly: false}],
    "cmd_fontColor": [{readonly: false}],
    "cmd_backgroundColor": [{readonly: false}],
    "cmd_highlight": [{readonly: false}],
    "cmd_align": [{readonly: false}],
    "cmd_removeStyles": [{readonly: false}],
    "cmd_increaseFont": [{readonly: false}],
    "cmd_decreaseFont": [{readonly: false}],
    "cmd_insertHR": [{readonly: false}],
    "cmd_insertHTML": [{readonly: false}],
    "cmd_insertText": [{readonly: false}],
    "cmd_insertParagraph": [{readonly: false}],
    "cmd_insertLineBreak": [{readonly: false}],
    "cmd_tt":[{readonly: false}],
    "cmd_nobreak":[{readonly: false}],
    "cmd_cite":[{readonly: false}],
    "cmd_abbr":[{readonly: false}],
    "cmd_acronym":[{readonly: false}],
    "cmd_code":[{readonly: false}],
    "cmd_samp":[{readonly: false}],
    "cmd_var":[{readonly: false}],
    "cmd_removeLinks":[{readonly: false}],
    "cmd_ol":[{readonly: false}],
    "cmd_ul":[{readonly: false}],
    "cmd_dt":[{readonly: false}],
    "cmd_dd":[{readonly: false}],

    // InsertTagCommand
    "cmd_insertImageNoUI": [{readonly: false}],
    "cmd_insertLinkNoUI": [{readonly: false}],
  };

  function testCommands(content) {
    for (let readonly of [true, false]){
      if (readonly) {
        htmlEditor.flags |= SpecialPowers.Ci.nsIEditor.eEditorReadonlyMask;
      } else {
        htmlEditor.flags &= ~SpecialPowers.Ci.nsIEditor.eEditorReadonlyMask;
      }

      for (let selected of [true, false]) {
        let selection = window.getSelection();
        selection.collapse(node);

        if (selected) {
          if (content == "non-empty") {
            // The command cmd_removeList needs selected text inside a list. It
            // does not matter for all other commands, so lets just select that.
            let range = document.createRange();
            let li = document.querySelector("li");
            range.selectNodeContents(li);
            selection.removeAllRanges();
            selection.addRange(range);
          } else {
            document.execCommand("selectAll");
          }
        }

        for (let [cmd, supports] of Object.entries(TEST_COMMANDS)) {
          // Check if the command should support this environment.
          let expected = supports.some(supported =>
            content == (supported?.content ?? content) &&
            readonly == (supported?.readonly ?? readonly) &&
            selected == (supported?.selected ?? selected)
          )
          is(
            SpecialPowers.isCommandEnabled(window, cmd),
            expected,
            `Enabled state of command ${cmd} should be ${
              expected ? "TRUE" : "FALSE"
            } for ${JSON.stringify({content, selected, readonly})}`
          );
        }
      }
    }
  }

  testCommands("empty");

  // The cmd_removeList command needs a list.
  node.innerHTML = "<ul><li><span>abcd</span></li></ul>";
  testCommands("non-empty");

  // Make some content modifications to enable undo and redo.
  node.innerText = "ABC";
  is(node.innerText.trim(), "ABC", "phase 1");
  document.execCommand("selectAll");
  synthesizeKey("KEY_Backspace");
  is(node.innerText.trim(), "", "phase 2");
  synthesizeKey("3");
  is(node.innerText.trim(), "3", "phase 3");
  SpecialPowers.doCommand(window, "cmd_undo");
  is(node.innerText.trim(), "", "phase 4");

  node.innerHTML = "";
  testCommands("cleared");
</script>