Implement undoscope attribute.
[WebKit-https.git] / LayoutTests / editing / undomanager / undoscope-attribute.html
1 <!doctype html>
2 <html>
3 <head>
4 <title>undoscope attribute</title>
5 <script src="../../resources/testharness.js"></script>
6 <script src="../../resources/testharnessreport.js"></script>
7 </head>
8 <body>
9 This tests element's undoscope attribute.
10
11 <div id="outerContainer">
12     <div id="innerContainer">
13         <div id="element" undoscope></div>
14     </div>
15 </div>
16
17 <script>
18 var outerContainer = document.getElementById("outerContainer");
19 var innerContainer = document.getElementById("innerContainer");
20 var element = document.getElementById("element");
21
22 function assert_element_has_undomanager() {
23     assert_equals(element.undoManager.toString(), "[object UndoManager]");
24 }
25
26 function assert_element_not_have_undomanager() {
27     assert_equals(element.undoManager, null);
28 }
29
30 test(function() {
31     assert_own_property(element, "undoScope");
32     assert_equals(element.undoScope, true);
33 }, "An element has the undoscope attribute set to true.");
34
35 test(function() {
36     assert_element_has_undomanager();
37 }, "element.undoManager returns an UndoManager object.");
38
39 test(function() {
40     element.undoScope = false;
41
42     assert_element_not_have_undomanager();
43 }, "After element.undoScope = false, element.undoManager returns null.");
44
45 test(function() {
46     element.undoScope = true;
47
48     assert_element_has_undomanager();
49 }, "After element.undoScope = true, element.undoManager returns an UndoManager object.");
50
51 test(function() {
52     element.setAttribute('undoscope', '');
53     element.removeAttribute('undoscope');
54
55     assert_element_not_have_undomanager();
56 }, "After element.removeAttribute('undoscope'), element.undoManager returns null.");
57
58 test(function() {
59     element.setAttribute('undoscope', '');
60
61     assert_element_has_undomanager();
62 }, "After element.setAttribute('undoscope', ''), element.undoManager returns an UndoManager object.");
63
64 test(function() {
65     element.setAttribute('undoscope', 'undoscope');
66
67     assert_element_has_undomanager();
68 }, "After element.setAttribute('undoscope', 'undoscope'), element.undoManager returns an UndoManager object.");
69
70 test(function() {
71     element.setAttribute('undoscope', '');
72     element.undoScope = false;
73
74     assert_element_not_have_undomanager();
75 }, "After element.setAttribute('undoscope', ''); element.undoScope = false;, element.undoManager returns null.");
76
77 test(function() {
78     element.removeAttribute('undoscope');
79     element.undoScope = true;
80
81     assert_element_has_undomanager();
82 }, "After element.removeAttribute('undoscope'); element.undoScope = true;, element.undoManager returns an UndoManager object.");
83
84 test(function() {
85     element.undoScope = true;
86     element.removeAttribute('undoscope');
87
88     assert_element_not_have_undomanager();
89 }, "After element.undoScope = true; element.removeAttribute('undoscope');, element.undoManager returns null.");
90
91 test(function() {
92     element.undoScope = false;
93     element.setAttribute('undoscope', '');
94
95     assert_element_has_undomanager();
96 }, "After element.undoScope = false; element.setAttribute('undoscope', '');, element.undoManager returns an UndoManager object.");
97
98 test(function() {
99     innerContainer.contentEditable = "true";
100
101     assert_element_not_have_undomanager();
102 }, "After the parant of element becomes editable, element.undoManager returns null.");
103
104 test(function() {
105     innerContainer.contentEditable = "false";
106
107     assert_element_has_undomanager();
108 }, "After the parant of element becomes non-editable, element.undoManager returns an UndoManager object.");
109
110 test(function() {
111     outerContainer.contentEditable = "true";
112     innerContainer.contentEditable = "inherit";
113
114     assert_element_not_have_undomanager();
115 }, "After the parant of element becomes editable through inheritance, element.undoManager returns null.");
116
117 test(function() {
118     innerContainer.contentEditable = "false";
119     element.contentEdiable = "true";
120
121     assert_element_has_undomanager();
122 }, "After the parant of element becomes non-editable and element becomes editable, element.undoManager returns an UndoManager object.");
123
124 test(function() {
125     element.undoManager.transact({"execute": function () { }}, false);
126     
127     assert_equals(element.undoManager.length, 1);
128
129     element.undoScope = false;
130     element.undoScope = true;
131
132     assert_equals(element.undoManager.length, 0);
133 }, "element.undoManager is disconnected when element.undoScope = false.");
134
135 test(function() {
136     element.undoManager.transact({"execute": function () { }}, false);
137     
138     assert_equals(element.undoManager.length, 1);
139
140     innerContainer.contentEditable = "true";
141     innerContainer.contentEditable = "false";
142
143     assert_equals(element.undoManager.length, 0);
144 }, "element.undoManager is disconnected when its parent becomes editable.");
145
146 test(function() {
147     outerContainer.contentEditable = "false";
148     innerContainer.contentEditable = "false";
149     element.undoManager.transact({"execute": function () { }}, false);
150
151     assert_equals(element.undoManager.length, 1);
152
153     outerContainer.contentEditable = "true";
154
155     assert_equals(element.undoManager.length, 1);
156 }, "Setting contentEditable of an ancestor of element to true doesn't disconnect element.undoManager if element is still an editing host.");
157 </script>
158 </body>
159 </html>