| Index: sky/tests/mutation-observer/observe-attributes.sky
|
| diff --git a/sky/tests/mutation-observer/observe-attributes.sky b/sky/tests/mutation-observer/observe-attributes.sky
|
| deleted file mode 100644
|
| index c824351fc78ab88eefa63d868481e6c4a053cf08..0000000000000000000000000000000000000000
|
| --- a/sky/tests/mutation-observer/observe-attributes.sky
|
| +++ /dev/null
|
| @@ -1,569 +0,0 @@
|
| -<html>
|
| -<import src="../resources/chai.sky" />
|
| -<import src="../resources/mocha.sky" />
|
| -<script>
|
| -describe('MutationObserver.observe on attributes', function() {
|
| - it('should handle basic aspects of attribute observation', function(done) {
|
| - var div;
|
| - var observer;
|
| - var mutations;
|
| -
|
| - function start() {
|
| - div = document.createElement('div');
|
| - div.setAttribute('bar', 'foo');
|
| -
|
| - observer = new MutationObserver(function(records) {
|
| - mutations = records;
|
| - });
|
| -
|
| - observer.observe(div, { attributes: true, characterData: true });
|
| - div.setAttribute('foo', 'bar');
|
| - div.removeAttribute('bar');
|
| - setTimeout(checkDisconnectAndMutate, 0);
|
| - }
|
| -
|
| - function checkDisconnectAndMutate() {
|
| - // ...can attribute changes be observed at all
|
| -
|
| - assert.equal(mutations.length, 2);
|
| - assert.equal(mutations[0].type, "attributes");
|
| - assert.equal(mutations[0].attributeName, "foo");
|
| - assert.equal(mutations[1].type, "attributes");
|
| - assert.equal(mutations[1].attributeName, "bar");
|
| -
|
| - mutations = null;
|
| - observer.disconnect();
|
| - div.setAttribute('foo', 'baz');
|
| - setTimeout(checkNotDeliveredAndMutateMultiple, 0);
|
| - }
|
| -
|
| - function checkNotDeliveredAndMutateMultiple() {
|
| - // ...observer.disconnect() should prevent further delivery of mutations.
|
| -
|
| - assert.equal(mutations, null);
|
| - observer.observe(div, { attributes: true });
|
| - div.setAttribute('foo', 'bat');
|
| - div.setAttribute('bar', 'foo');
|
| - setTimeout(finish);
|
| - }
|
| -
|
| - function finish() {
|
| - // ...re-observing after disconnect works with the same observer.
|
| -
|
| - assert.equal(mutations.length, 2);
|
| - assert.equal(mutations[0].type, "attributes");
|
| - assert.equal(mutations[0].attributeName, "foo");
|
| - assert.equal(mutations[1].type, "attributes");
|
| - assert.equal(mutations[1].attributeName, "bar");
|
| - observer.disconnect();
|
| - done();
|
| - }
|
| -
|
| - start();
|
| - });
|
| -
|
| - it('should not notify of attribute changes without asking', function(done) {
|
| - var div;
|
| - var observer;
|
| - var mutations;
|
| -
|
| - function start() {
|
| - div = document.createElement('div');
|
| - observer = new MutationObserver(function(records) {
|
| - mutations = records;
|
| - });
|
| -
|
| - observer.observe(div, { childList: true, characterData: true });
|
| - div.setAttribute('foo', 'bar');
|
| - setTimeout(finish, 0);
|
| - }
|
| -
|
| - function finish() {
|
| - assert.equal(mutations, null);
|
| - observer.disconnect();
|
| - done();
|
| - }
|
| -
|
| - start();
|
| - });
|
| -
|
| - it('re-observing the same node with the same observer has the effect of resetting the options', function(done) {
|
| - var div;
|
| - var observer;
|
| - var mutations;
|
| - var calls = 0;
|
| -
|
| - function start() {
|
| - div = document.createElement('div');
|
| - observer = new MutationObserver(function(records) {
|
| - mutations = records;
|
| - calls++;
|
| - });
|
| -
|
| - observer.observe(div, { attributes: true, characterData: true });
|
| - observer.observe(div, { attributes: true });
|
| - div.setAttribute('foo', 'bar');
|
| - setTimeout(checkDisconnectAndMutate, 0);
|
| - }
|
| -
|
| - function checkDisconnectAndMutate() {
|
| - assert.equal(calls, 1);
|
| - assert.equal(mutations.length, 1);
|
| - assert.equal(mutations[0].type, "attributes");
|
| - assert.equal(mutations[0].attributeName, "foo");
|
| - mutations = null;
|
| - observer.observe(div, { attributes: true, characterData: true });
|
| - observer.observe(div, { childList: true });
|
| - div.setAttribute('foo', 'baz');
|
| - setTimeout(finish, 0);
|
| - }
|
| -
|
| - function finish() {
|
| - assert.equal(mutations, null);
|
| - observer.disconnect();
|
| - done();
|
| - }
|
| -
|
| - start();
|
| - });
|
| -
|
| - it('multiple observers can be registered to a given node and both receive mutations', function(done) {
|
| - var div;
|
| - var observer;
|
| - var observer2;
|
| - var mutations;
|
| - var mutations2;
|
| -
|
| - function start() {
|
| - div = document.createElement('div');
|
| - observer = new MutationObserver(function(records) {
|
| - mutations = records;
|
| - });
|
| - observer2 = new MutationObserver(function(records) {
|
| - mutations2 = records;
|
| - });
|
| - observer.observe(div, { attributes: true });
|
| - observer2.observe(div, { attributes: true });
|
| - div.setAttribute('foo', 'bar');
|
| - setTimeout(finish, 0);
|
| - }
|
| -
|
| - function finish() {
|
| - assert.equal(mutations.length, 1);
|
| - assert.equal(mutations[0].type, "attributes");
|
| - assert.equal(mutations[0].attributeName, "foo");
|
| - assert.equal(mutations2.length, 1);
|
| - assert.equal(mutations2[0].type, "attributes");
|
| - assert.equal(mutations2[0].attributeName, "foo");
|
| - observer.disconnect();
|
| - observer2.disconnect();
|
| - done();
|
| - }
|
| -
|
| - start();
|
| - });
|
| -
|
| - it('should deliver mutations on modifications to node properties which delegate to attribute storage', function(done) {
|
| - var img, a;
|
| - var observer;
|
| - var mutations;
|
| -
|
| - function start() {
|
| - img = document.createElement('img');
|
| - a = document.createElement('a');
|
| -
|
| - observer = new MutationObserver(function(records) {
|
| - mutations = records;
|
| - });
|
| -
|
| - observer.observe(img, { attributes: true });
|
| - observer.observe(a, { attributes: true });
|
| -
|
| - img.src = 'baz.png';
|
| - a.href = 'foo.html';
|
| -
|
| - setTimeout(finish, 0);
|
| - }
|
| -
|
| - function finish() {
|
| - assert.equal(mutations.length, 2);
|
| - assert.equal(mutations[0].type, "attributes");
|
| - assert.equal(mutations[0].attributeName, "src");
|
| - assert.equal(mutations[1].type, "attributes");
|
| - assert.equal(mutations[1].attributeName, "href");
|
| - observer.disconnect();
|
| - done();
|
| - }
|
| -
|
| - start();
|
| - });
|
| -
|
| - it('should handle basic oldValue delivery', function(done) {
|
| - var div;
|
| - var observer;
|
| - var mutations;
|
| -
|
| - function start() {
|
| - div = document.createElement('div');
|
| - div.setAttribute('bar', 'boo');
|
| -
|
| - observer = new MutationObserver(function(records) {
|
| - mutations = records;
|
| - });
|
| - observer.observe(div, { attributes: true, attributeOldValue: true });
|
| - div.setAttribute('foo', 'bar');
|
| - div.setAttribute('foo', 'baz');
|
| - div.removeAttribute('bar');
|
| - div.removeAttribute('non-existant');
|
| - setTimeout(finish, 0);
|
| - }
|
| -
|
| - function finish() {
|
| - assert.equal(mutations.length, 3);
|
| - assert.equal(mutations[0].type, "attributes");
|
| - assert.equal(mutations[0].attributeName, "foo");
|
| - assert.equal(mutations[0].oldValue, null);
|
| - assert.equal(mutations[1].type, "attributes");
|
| - assert.equal(mutations[1].attributeName, "foo");
|
| - assert.equal(mutations[1].oldValue, "bar");
|
| - assert.equal(mutations[2].type, "attributes");
|
| - assert.equal(mutations[2].attributeName, "bar");
|
| - assert.equal(mutations[2].oldValue, "boo");
|
| - observer.disconnect();
|
| - done();
|
| - }
|
| -
|
| - start();
|
| - });
|
| -
|
| - it('should deliver oldValue when needed', function(done) {
|
| - var div;
|
| - var observerWithOldValue;
|
| - var observer;
|
| - var mutationsWithOldValue;
|
| - var mutations;
|
| -
|
| - function start() {
|
| - div = document.createElement('div');
|
| - div.setAttribute('foo', 'bar');
|
| - observerWithOldValue = new MutationObserver(function(records) {
|
| - mutationsWithOldValue = records;
|
| - });
|
| - observer = new MutationObserver(function(records) {
|
| - mutations = records;
|
| - });
|
| - observerWithOldValue.observe(div, { attributes: true, attributeOldValue: true });
|
| - observer.observe(div, { attributes: true });
|
| - div.setAttribute('foo', 'baz');
|
| - setTimeout(finish, 0);
|
| - }
|
| -
|
| - function finish() {
|
| - assert.equal(mutationsWithOldValue.length, 1);
|
| - assert.equal(mutationsWithOldValue[0].type, "attributes");
|
| - assert.equal(mutationsWithOldValue[0].attributeName, "foo");
|
| - assert.equal(mutationsWithOldValue[0].oldValue, "bar");
|
| - assert.equal(mutations.length, 1);
|
| - assert.equal(mutations[0].type, "attributes");
|
| - assert.equal(mutations[0].attributeName, "foo");
|
| - assert.equal(mutations[0].oldValue, null);
|
| - observerWithOldValue.disconnect();
|
| - observer.disconnect();
|
| - done();
|
| - }
|
| -
|
| - start();
|
| - });
|
| -
|
| - it('should give attributeOldValue if any entries request it with multiple observers', function(done) {
|
| - var div;
|
| - var span;
|
| - var observer;
|
| - var mutations;
|
| -
|
| - function start() {
|
| - div = document.createElement('div');
|
| - span = div.appendChild(document.createElement('span'));
|
| - span.setAttribute('foo', 'bar');
|
| - observer = new MutationObserver(function(records) {
|
| - mutations = records;
|
| - });
|
| - observer.observe(div, { attributes: true, attributeOldValue: true, subtree: true });
|
| - observer.observe(span, { attributes: true });
|
| - span.setAttribute('foo', 'baz');
|
| - setTimeout(finish, 0);
|
| - }
|
| -
|
| - function finish() {
|
| - assert.equal(mutations.length, 1);
|
| - assert.equal(mutations[0].type, "attributes");
|
| - assert.equal(mutations[0].attributeName, "foo");
|
| - assert.equal(mutations[0].oldValue, "bar");
|
| - observer.disconnect();
|
| - done();
|
| - }
|
| -
|
| - start();
|
| - });
|
| -
|
| - it('should handle setting an attribute via reflected IDL attribute', function(done) {
|
| - var div;
|
| - var observer;
|
| - var mutations;
|
| -
|
| - function start() {
|
| - div = document.createElement('div');
|
| - observer = new MutationObserver(function(records) {
|
| - mutations = records;
|
| - });
|
| - observer.observe(div, { attributes: true, attributeOldValue: true });
|
| - div.id = 'foo';
|
| - div.id = 'bar';
|
| - div.id = null;
|
| - setTimeout(finish, 0);
|
| - }
|
| -
|
| - function finish() {
|
| - assert.equal(mutations.length, 3);
|
| - assert.equal(mutations[0].type, "attributes");
|
| - assert.equal(mutations[0].attributeName, "id");
|
| - assert.equal(mutations[0].oldValue, null);
|
| - assert.equal(mutations[1].type, "attributes");
|
| - assert.equal(mutations[1].attributeName, "id");
|
| - assert.equal(mutations[1].oldValue, "foo");
|
| - assert.equal(mutations[2].type, "attributes");
|
| - assert.equal(mutations[2].attributeName, "id");
|
| - assert.equal(mutations[2].oldValue, "bar");
|
| - observer.disconnect();
|
| - done();
|
| - }
|
| -
|
| - start();
|
| - });
|
| -
|
| - it('should respect attributeFilter on HTML elements', function(done) {
|
| - var div, path;
|
| - var observer;
|
| - var mutations;
|
| -
|
| - function start() {
|
| - observer = new MutationObserver(function(records) {
|
| - mutations = records;
|
| - });
|
| -
|
| - div = document.createElement('div');
|
| - observer.observe(div, { attributes: true, attributeFilter: ['foo', 'bar', 'booM'] });
|
| - div.setAttribute('foo', 'foo');
|
| - div.setAttribute('bar', 'bar');
|
| - div.setAttribute('baz', 'baz');
|
| - div.setAttribute('BOOm', 'boom');
|
| -
|
| - setTimeout(finish, 0);
|
| - }
|
| -
|
| - function finish() {
|
| - // ...only foo and bar should be received.
|
| -
|
| - assert.equal(mutations.length, 2);
|
| - assert.equal(mutations[0].type, "attributes");
|
| - assert.equal(mutations[0].attributeName, "foo");
|
| - assert.equal(mutations[1].type, "attributes");
|
| - assert.equal(mutations[1].attributeName, "bar");
|
| - observer.disconnect();
|
| - done();
|
| - }
|
| -
|
| - start();
|
| - });
|
| -
|
| - it('should respect different attributeFilters when observing multiple subtree nodes', function(done) {
|
| - var div, div2, div3;
|
| - var observer;
|
| - var mutations;
|
| -
|
| - function start() {
|
| - observer = new MutationObserver(function(records) {
|
| - mutations = records;
|
| - });
|
| -
|
| - div = document.createElement('div');
|
| - div2 = div.appendChild(document.createElement('div'));
|
| - div3 = div2.appendChild(document.createElement('div'));
|
| -
|
| - observer.observe(div, { attributes: true, subtree: true, attributeFilter: ['foo', 'bar'] });
|
| - observer.observe(div2, { attributes: true, subtree: true, attributeFilter: ['bar', 'bat'] });
|
| -
|
| - div3.setAttribute('foo', 'foo');
|
| - div3.setAttribute('bar', 'bar');
|
| - div3.setAttribute('bat', 'bat');
|
| - div3.setAttribute('baz', 'baz');
|
| -
|
| - setTimeout(checkAndObserveAll, 0);
|
| - }
|
| -
|
| - function checkAndObserveAll() {
|
| - // ...only foo, bar & bat should be received.
|
| -
|
| - assert.equal(mutations.length, 3);
|
| - assert.equal(mutations[0].type, "attributes");
|
| - assert.equal(mutations[0].attributeName, "foo");
|
| - assert.equal(mutations[1].type, "attributes");
|
| - assert.equal(mutations[1].attributeName, "bar");
|
| - assert.equal(mutations[2].type, "attributes");
|
| - assert.equal(mutations[2].attributeName, "bat");
|
| -
|
| - observer.observe(div2, { attributes: true, subtree: true });
|
| - div3.setAttribute('bar', 'bar');
|
| - div3.setAttribute('bat', 'bat');
|
| - div3.setAttribute('baz', 'baz');
|
| -
|
| - setTimeout(finish, 0);
|
| - }
|
| -
|
| - function finish() {
|
| - // ...bar, bat & baz should all be received.
|
| -
|
| - assert.equal(mutations.length, 3);
|
| - assert.equal(mutations[0].type, "attributes");
|
| - assert.equal(mutations[0].attributeName, "bar");
|
| - assert.equal(mutations[1].type, "attributes");
|
| - assert.equal(mutations[1].attributeName, "bat");
|
| - assert.equal(mutations[2].type, "attributes");
|
| - assert.equal(mutations[2].attributeName, "baz");
|
| -
|
| - observer.disconnect();
|
| - done();
|
| - }
|
| -
|
| - start();
|
| - });
|
| -
|
| - it('should create records for the style property', function(done) {
|
| - var div, path;
|
| - var observer;
|
| - var mutations;
|
| -
|
| - function start() {
|
| - observer = new MutationObserver(function(records) {
|
| - mutations = records;
|
| - });
|
| -
|
| - div = document.createElement('div');
|
| - div.setAttribute('style', 'color: yellow; width: 100px;');
|
| - observer.observe(div, { attributes: true });
|
| - div.style.color = 'red';
|
| - div.style.width = '200px';
|
| - div.style.color = 'blue';
|
| -
|
| - setTimeout(checkAndContinue, 0);
|
| - }
|
| -
|
| - function checkAndContinue() {
|
| - assert.equal(mutations.length, 3);
|
| - assert.equal(mutations[0].type, "attributes");
|
| - assert.equal(mutations[0].attributeName, "style");
|
| - assert.equal(mutations[0].oldValue, null);
|
| - assert.equal(mutations[1].type, "attributes");
|
| - assert.equal(mutations[1].attributeName, "style");
|
| - assert.equal(mutations[1].oldValue, null);
|
| - assert.equal(mutations[2].type, "attributes");
|
| - assert.equal(mutations[2].attributeName, "style");
|
| - assert.equal(mutations[2].oldValue, null);
|
| -
|
| - mutations = null;
|
| - div.getAttribute('style');
|
| - setTimeout(finish, 0);
|
| - }
|
| -
|
| - function finish() {
|
| - // ...mutation record created.
|
| -
|
| - assert.equal(mutations, null);
|
| -
|
| - observer.disconnect();
|
| - done();
|
| - }
|
| -
|
| - start();
|
| - });
|
| -
|
| - it('should have oldValue for style property mutations', function(done) {
|
| - var div, path;
|
| - var observer;
|
| - var mutations;
|
| -
|
| - function start() {
|
| - observer = new MutationObserver(function(records) {
|
| - mutations = records;
|
| - });
|
| -
|
| - div = document.createElement('div');
|
| - div.setAttribute('style', 'color: yellow; width: 100px;');
|
| - observer.observe(div, { attributes: true, attributeOldValue: true });
|
| - div.style.color = 'red';
|
| - div.style.width = '200px';
|
| - div.style.color = 'blue';
|
| -
|
| - setTimeout(checkAndContinue, 0);
|
| - }
|
| -
|
| - function checkAndContinue() {
|
| - assert.equal(mutations.length, 3);
|
| - assert.equal(mutations[0].type, "attributes");
|
| - assert.equal(mutations[0].attributeName, "style");
|
| - assert.equal(mutations[0].oldValue, "color: yellow; width: 100px;");
|
| - assert.equal(mutations[1].type, "attributes");
|
| - assert.equal(mutations[1].attributeName, "style");
|
| - assert.equal(mutations[1].oldValue, "color: rgb(255, 0, 0); width: 100px;");
|
| - assert.equal(mutations[2].type, "attributes");
|
| - assert.equal(mutations[2].attributeName, "style");
|
| - assert.equal(mutations[2].oldValue, "color: rgb(255, 0, 0); width: 200px;");
|
| -
|
| - mutations = null;
|
| - div.getAttribute('style');
|
| - setTimeout(finish, 0);
|
| - }
|
| -
|
| - function finish() {
|
| - // ...mutation record created.
|
| -
|
| - assert.equal(mutations, null);
|
| -
|
| - observer.disconnect();
|
| - done();
|
| - }
|
| -
|
| - start();
|
| - });
|
| -
|
| - it('should not create records for noop style property mutation', function(done) {
|
| - var div, path;
|
| - var observer;
|
| - var mutations;
|
| -
|
| - function start() {
|
| - observer = new MutationObserver(function(records) {
|
| - mutations = records;
|
| - });
|
| -
|
| - div = document.createElement('div');
|
| - div.setAttribute('style', 'color: yellow; width: 100px;');
|
| - observer.observe(div, { attributes: true });
|
| - div.style.removeProperty('height');
|
| -
|
| - setTimeout(finish, 0);
|
| - }
|
| -
|
| - function finish() {
|
| - assert.equal(mutations, null);
|
| -
|
| - observer.disconnect();
|
| - done();
|
| - }
|
| -
|
| - start();
|
| - });
|
| -});
|
| -</script>
|
| -</body>
|
| -</html>
|
|
|