5 <script src=
"../../../resources/js-test.js"></script>
9 <div id=
"console"></div>
12 window
.jsTestIsAsync
= true;
15 var mutationsWithOldValue
;
19 function testBasic() {
24 debug('Testing basic aspects of characterData observation.');
27 div
= document
.createElement('div');
28 div
.textContent
= 'foo';
29 charDataNode
= div
.firstChild
;
30 observer
= new MutationObserver(function(m
) {
34 observer
.observe(charDataNode
, {characterData
: true});
35 charDataNode
.textContent
= 'bar';
36 setTimeout(checkDisconnectAndMutate
, 0);
39 function checkDisconnectAndMutate() {
40 debug('...can characterData changes be observed at all');
42 shouldBe('mutations.length', '1');
43 shouldBe('mutations[0].type', '"characterData"');
44 shouldBe('mutations[0].target', 'charDataNode');
47 observer
.disconnect();
48 charDataNode
.textContent
= 'baz';
49 setTimeout(checkNotDeliveredAndMutateMultiple
, 0);
52 function checkNotDeliveredAndMutateMultiple() {
53 debug('...observer.disconnect() should prevent further delivery of mutations.');
55 shouldBe('mutations', 'null');
56 charDataNode
= document
.createComment('');
57 observer
.observe(charDataNode
, { characterData
: true });
58 charDataNode
.textContent
= 'foo';
59 charDataNode
.textContent
= 'bar';
64 debug('...re-observing after disconnect works with the same observer.');
66 shouldBe('mutations.length', '2');
67 shouldBe('mutations[0].type', '"characterData"');
68 shouldBe('mutations[0].target', 'charDataNode');
69 shouldBe('mutations[1].type', '"characterData"');
70 shouldBe('mutations[1].target', 'charDataNode');
71 observer
.disconnect();
79 function testWrongType() {
84 debug('Testing that observing without specifying "characterData" does not result in hearing about characterData changes.');
87 div
= document
.createElement('div');
88 div
.textContent
= 'hello';
89 charDataNode
= div
.firstChild
;
90 observer
= new MutationObserver(function(m
) {
94 observer
.observe(charDataNode
, {childList
: true, attributes
: true});
95 charDataNode
= 'goodbye';
96 setTimeout(finish
, 0);
100 shouldBe('mutations', 'null');
101 observer
.disconnect();
109 function testMultipleObservers() {
115 debug('Testing that multiple observers can be registered to a given node and both receive mutations.');
117 div
= document
.createElement('div');
118 div
.textContent
= 'foo';
119 charDataNode
= div
.firstChild
;
120 observer
= new MutationObserver(function(m
) {
123 observer2
= new MutationObserver(function(m
) {
126 observer
.observe(charDataNode
, {characterData
: true});
127 observer2
.observe(charDataNode
, {characterData
: true});
128 charDataNode
.textContent
= 'bar';
129 setTimeout(finish
, 0);
133 shouldBe('mutations.length', '1');
134 shouldBe('mutations[0].type', '"characterData"');
135 shouldBe('mutations[0].target', 'charDataNode');
136 shouldBe('mutations2.length', '1');
137 shouldBe('mutations2[0].type', '"characterData"');
138 shouldBe('mutations2[0].target', 'charDataNode');
139 observer
.disconnect();
140 observer2
.disconnect();
148 function testOrderingWrtDOMSubtreeModified() {
149 var div
, div2
, subDiv
;
154 debug('Testing mutation records are enqueued for characterData before DOMSubtreeModified is dispatched.');
157 div
= document
.body
.appendChild(document
.createElement('div'));
158 div2
= document
.body
.appendChild(document
.createElement('div'));
160 subDiv
= div
.appendChild(document
.createElement('div'));
161 subDiv
.textContent
= 'foo';
162 charDataNode
= subDiv
.firstChild
;
164 observer
= new MutationObserver(function(m
) {
168 listener = function(e
) {
169 div2
.setAttribute('baz', 'bat');
172 div
.addEventListener('DOMSubtreeModified', listener
);
173 observer
.observe(charDataNode
, {characterData
: true});
174 observer
.observe(div2
, {attributes
: true});
176 charDataNode
.textContent
= 'bar';
178 setTimeout(finish
, 0);
182 shouldBe('mutations.length', '2');
183 shouldBe('mutations[0].type', '"characterData"');
184 shouldBe('mutations[1].type', '"attributes"');
185 div
.removeEventListener('DOMSubtreeModified', listener
);
186 document
.body
.removeChild(div
);
187 observer
.disconnect();
195 function testOldValue() {
200 debug('Testing that oldValue is returned when requested.');
202 div
= document
.createElement('div');
203 div
.textContent
= 'foo';
204 charDataNode
= div
.firstChild
;
205 observer
= new MutationObserver(function(mutations
) {
206 window
.mutations
= mutations
;
208 observer
.observe(charDataNode
, {characterData
: true, characterDataOldValue
: true});
209 charDataNode
.textContent
= 'bar';
210 charDataNode
.textContent
= 'baz';
211 setTimeout(finish
, 0);
215 shouldBe('mutations.length', '2');
216 shouldBe('mutations[0].type', '"characterData"');
217 shouldBe('mutations[0].target', 'charDataNode');
218 shouldBe('mutations[0].oldValue', '"foo"');
219 shouldBe('mutations[1].type', '"characterData"');
220 shouldBe('mutations[1].target', 'charDataNode');
221 shouldBe('mutations[1].oldValue', '"bar"');
222 observer
.disconnect();
230 function testOldValueAsRequested() {
232 var observerWithOldValue
;
236 debug('Testing that oldValue is delivered as requested (or not).');
238 mutationsWithOldValue
= null;
239 div
= document
.createElement('div');
240 div
.textContent
= 'foo';
241 charDataNode
= div
.firstChild
;
242 observerWithOldValue
= new MutationObserver(function(mutations
) {
243 window
.mutationsWithOldValue
= mutations
;
245 observer
= new MutationObserver(function(mutations
) {
246 window
.mutations
= mutations
;
248 observerWithOldValue
.observe(charDataNode
, {characterData
: true, characterDataOldValue
: true});
249 observer
.observe(charDataNode
, {characterData
: true});
250 charDataNode
.textContent
= 'bar';
251 setTimeout(finish
, 0);
255 shouldBe('mutationsWithOldValue.length', '1');
256 shouldBe('mutationsWithOldValue[0].type', '"characterData"');
257 shouldBe('mutationsWithOldValue[0].oldValue', '"foo"');
258 shouldBe('mutations.length', '1');
259 shouldBe('mutations[0].type', '"characterData"');
260 shouldBe('mutations[0].oldValue', 'null');
261 observerWithOldValue
.disconnect();
262 observer
.disconnect();
270 function testOldValueUnionMultipleObservations() {
275 debug('An observer with multiple observations will get characterDataOldValue if any entries request it.');
277 div
= document
.createElement('div');
278 div
.textContent
= 'foo';
279 charDataNode
= div
.firstChild
;
280 observer
= new MutationObserver(function(mutations
) {
281 window
.mutations
= mutations
;
283 observer
.observe(div
, {characterData
: true, characterDataOldValue
: true, subtree
: true});
284 observer
.observe(charDataNode
, {characterData
: true});
285 charDataNode
.textContent
= 'bar';
286 setTimeout(finish
, 0);
290 shouldBe('mutations.length', '1');
291 shouldBe('mutations[0].type', '"characterData"');
292 shouldBe('mutations[0].oldValue', '"foo"');
293 observer
.disconnect();
304 testMultipleObservers
,
305 testOrderingWrtDOMSubtreeModified
,
307 testOldValueAsRequested
,
308 testOldValueUnionMultipleObservations
312 function runNextTest() {
313 if (testIndex
< tests
.length
)
314 tests
[testIndex
++]();
319 description('Test WebKitMutationObserver.observe on CharacterData nodes');