blob: 21f2de6cea3901aff412c67b30e3fb208440c6a1 [file] [log] [blame]
<html>
<import src="../resources/chai.sky" />
<import src="../resources/mocha.sky" />
<body id="body">
<script>
document.body = document.getElementById("body");
describe('MutationObserver on character data', function() {
it('should handle basic aspects of characterData observation', function(done) {
var observer;
var mutations;
var charDataNode;
function start() {
var div = document.createElement('div');
div.textContent = 'foo';
charDataNode = div.firstChild;
observer = new MutationObserver(function(records) {
mutations = records;
});
observer.observe(charDataNode, {characterData: true});
charDataNode.textContent = 'bar';
setTimeout(checkDisconnectAndMutate, 0);
}
function checkDisconnectAndMutate() {
// ...can characterData changes be observed at all
assert.equal(mutations.length, 1);
assert.equal(mutations[0].type, "characterData");
assert.equal(mutations[0].target, charDataNode);
mutations = null;
observer.disconnect();
charDataNode.textContent = 'baz';
setTimeout(checkNotDeliveredAndMutateMultiple, 0);
}
function checkNotDeliveredAndMutateMultiple() {
// ...observer.disconnect() should prevent further delivery of mutations.
assert.equal(mutations, null);
charDataNode = document.createTextNode('');
observer.observe(charDataNode, { characterData: true });
charDataNode.textContent = 'foo';
charDataNode.textContent = 'bar';
setTimeout(finish);
}
function finish() {
// ...re-observing after disconnect works with the same observer.
assert.equal(mutations.length, 2);
assert.equal(mutations[0].type, "characterData");
assert.equal(mutations[0].target, charDataNode);
assert.equal(mutations[1].type, "characterData");
assert.equal(mutations[1].target, charDataNode);
observer.disconnect();
done();
}
start();
});
it('should only notify of characterData changes when requested', function(done) {
var observer;
var mutations;
function start() {
var div = document.createElement('div');
div.textContent = 'hello';
var charDataNode = div.firstChild;
observer = new MutationObserver(function(records) {
mutations = records;
});
observer.observe(charDataNode, {childList: true, attributes: true});
charDataNode = 'goodbye';
setTimeout(finish, 0);
}
function finish() {
assert.equal(mutations, null);
observer.disconnect();
done();
}
start();
});
it('should allow multiple observers can be registered to a given node and both receive mutations', function(done) {
var observer;
var observer2;
var charDataNode;
var mutations;
var mutations2;
function start() {
var div = document.createElement('div');
div.textContent = 'foo';
charDataNode = div.firstChild;
observer = new MutationObserver(function(records) {
mutations = records;
});
observer2 = new MutationObserver(function(records) {
mutations2 = records;
});
observer.observe(charDataNode, {characterData: true});
observer2.observe(charDataNode, {characterData: true});
charDataNode.textContent = 'bar';
setTimeout(finish, 0);
}
function finish() {
assert.equal(mutations.length, 1);
assert.equal(mutations[0].type, "characterData");
assert.equal(mutations[0].target, charDataNode);
assert.equal(mutations2.length, 1);
assert.equal(mutations2[0].type, "characterData");
assert.equal(mutations2[0].target, charDataNode);
observer.disconnect();
observer2.disconnect();
done();
}
start();
});
it('should provide oldValue is returned when requested', function(done) {
var observer;
var mutations;
var charDataNode;
function start() {
var div = document.createElement('div');
div.textContent = 'foo';
charDataNode = div.firstChild;
observer = new MutationObserver(function(records) {
mutations = records;
});
observer.observe(charDataNode, {characterData: true, characterDataOldValue: true});
charDataNode.textContent = 'bar';
charDataNode.textContent = 'baz';
setTimeout(finish, 0);
}
function finish() {
assert.equal(mutations.length, 2);
assert.equal(mutations[0].type, "characterData");
assert.equal(mutations[0].target, charDataNode);
assert.equal(mutations[0].oldValue, "foo");
assert.equal(mutations[1].type, "characterData");
assert.equal(mutations[1].target, charDataNode);
assert.equal(mutations[1].oldValue, "bar");
observer.disconnect();
done();
}
start();
});
it('should allow observing both with and without oldValue', function(done) {
var observerWithOldValue;
var observer;
var mutations;
var mutationsWithOldValue;
function start() {
var div = document.createElement('div');
div.textContent = 'foo';
var charDataNode = div.firstChild;
observerWithOldValue = new MutationObserver(function(records) {
mutationsWithOldValue = records;
});
observer = new MutationObserver(function(records) {
mutations = records;
});
observerWithOldValue.observe(charDataNode, {characterData: true, characterDataOldValue: true});
observer.observe(charDataNode, {characterData: true});
charDataNode.textContent = 'bar';
setTimeout(finish, 0);
}
function finish() {
assert.equal(mutationsWithOldValue.length, 1);
assert.equal(mutationsWithOldValue[0].type, "characterData");
assert.equal(mutationsWithOldValue[0].oldValue, "foo");
assert.equal(mutations.length, 1);
assert.equal(mutations[0].type, "characterData");
assert.equal(mutations[0].oldValue, null);
observerWithOldValue.disconnect();
observer.disconnect();
done();
}
start();
});
it('should provide oldValue if any observation requests it', function(done) {
var observer;
var mutations;
function start() {
var div = document.createElement('div');
div.textContent = 'foo';
var charDataNode = div.firstChild;
observer = new MutationObserver(function(records) {
mutations = records;
});
observer.observe(div, {characterData: true, characterDataOldValue: true, subtree: true});
observer.observe(charDataNode, {characterData: true});
charDataNode.textContent = 'bar';
setTimeout(finish, 0);
}
function finish() {
assert.equal(mutations.length, 1);
assert.equal(mutations[0].type, "characterData");
assert.equal(mutations[0].oldValue, "foo");
observer.disconnect();
done();
}
start();
});
});
</script>
</html>