mirror of
https://github.com/Polymer/polymer.git
synced 2026-08-19 01:14:44 -05:00
1020 lines
31 KiB
HTML
1020 lines
31 KiB
HTML
<!doctype html>
|
|
<!--
|
|
@license
|
|
Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
|
|
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
|
|
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
|
|
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
|
|
Code distributed by Google as part of the polymer project is also
|
|
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
|
-->
|
|
<html>
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
|
|
<script src="wct-browser-config.js"></script>
|
|
<script src="../../node_modules/wct-browser-legacy/browser.js"></script>
|
|
<script type="module" src="../../polymer-legacy.js"></script>
|
|
</head>
|
|
<body>
|
|
|
|
<dom-module id='test-self-observe'>
|
|
<template>
|
|
<slot id="slot"></slot>
|
|
</template>
|
|
<script type="module">
|
|
import { Polymer } from '../../polymer-legacy.js';
|
|
import { dom } from '../../lib/legacy/polymer.dom.js';
|
|
Polymer({
|
|
is:'test-self-observe',
|
|
attached: function() {
|
|
this._observer = dom(this).observeNodes(function(info) {
|
|
this.info = info;
|
|
});
|
|
},
|
|
detached: function() {
|
|
dom(this).unobserveNodes(this._observer);
|
|
}
|
|
});
|
|
</script>
|
|
</dom-module>
|
|
|
|
<dom-module id='test-static'>
|
|
<template>
|
|
<div>static</div>
|
|
</template>
|
|
<script type="module">
|
|
import { Polymer } from '../../polymer-legacy.js';
|
|
Polymer({
|
|
is:'test-static'
|
|
});
|
|
</script>
|
|
</dom-module>
|
|
|
|
<dom-module id='test-slot'>
|
|
<template>
|
|
<span id="slotContainer">[<slot id="slot"></slot>]</span>
|
|
</template>
|
|
<script type="module">
|
|
import { Polymer } from '../../polymer-legacy.js';
|
|
Polymer({
|
|
is:'test-slot'
|
|
});
|
|
</script>
|
|
</dom-module>
|
|
|
|
<dom-module id='test-slot1'>
|
|
<template>
|
|
<test-slot id="slot"><slot></slot></test-slot>
|
|
</template>
|
|
<script type="module">
|
|
import { Polymer } from '../../polymer-legacy.js';
|
|
Polymer({
|
|
is:'test-slot1'
|
|
});
|
|
</script>
|
|
</dom-module>
|
|
|
|
<dom-module id='test-slot2'>
|
|
<template>
|
|
<test-slot1 id="slot"><slot></slot></test-slot1>
|
|
</template>
|
|
<script type="module">
|
|
import { Polymer } from '../../polymer-legacy.js';
|
|
Polymer({
|
|
is:'test-slot2'
|
|
});
|
|
</script>
|
|
</dom-module>
|
|
|
|
<dom-module id='test-slot3'>
|
|
<template>
|
|
<test-slot2 id="slot"><slot></slot></test-slot2>
|
|
</template>
|
|
<script type="module">
|
|
import { Polymer } from '../../polymer-legacy.js';
|
|
Polymer({
|
|
is:'test-slot3'
|
|
});
|
|
</script>
|
|
</dom-module>
|
|
|
|
<dom-module id='test-slot-raw'>
|
|
<template>
|
|
<div id="slot"><slot></slot></div>
|
|
</template>
|
|
<script type="module">
|
|
import { Polymer } from '../../polymer-legacy.js';
|
|
Polymer({
|
|
is:'test-slot-raw'
|
|
});
|
|
</script>
|
|
</dom-module>
|
|
|
|
<dom-module id='test-slot-attr'>
|
|
<template>
|
|
[<slot id="slot" name="d"></slot>]
|
|
</template>
|
|
<script type="module">
|
|
import { Polymer } from '../../polymer-legacy.js';
|
|
Polymer({
|
|
is:'test-slot-attr'
|
|
});
|
|
</script>
|
|
</dom-module>
|
|
|
|
<dom-module id='test-slot-attr1'>
|
|
<template>
|
|
<test-slot-attr id="slot"><slot name="c" slot="d"></slot></test-slot-attr>
|
|
</template>
|
|
<script type="module">
|
|
import { Polymer } from '../../polymer-legacy.js';
|
|
Polymer({
|
|
is:'test-slot-attr1'
|
|
});
|
|
</script>
|
|
</dom-module>
|
|
|
|
<dom-module id='test-slot-attr2'>
|
|
<template>
|
|
<test-slot-attr1 id="slot"><slot name="b" slot="c"></slot></test-slot-attr1>
|
|
</template>
|
|
<script type="module">
|
|
import { Polymer } from '../../polymer-legacy.js';
|
|
Polymer({
|
|
is:'test-slot-attr2'
|
|
});
|
|
</script>
|
|
</dom-module>
|
|
|
|
<dom-module id='test-slot-attr3'>
|
|
<template>
|
|
<test-slot-attr2 id="slot"><slot name="a" slot="b"></slot></test-slot-attr2>
|
|
</template>
|
|
<script type="module">
|
|
import { Polymer } from '../../polymer-legacy.js';
|
|
Polymer({
|
|
is:'test-slot-attr3'
|
|
});
|
|
</script>
|
|
</dom-module>
|
|
|
|
<dom-module id='test-slot-attr-inside'>
|
|
<template>
|
|
<test-slot-attr3 id="slot"><slot name="a" slot="a"></slot></test-slot-attr3>
|
|
</template>
|
|
<script type="module">
|
|
import { Polymer } from '../../polymer-legacy.js';
|
|
Polymer({
|
|
is:'test-slot-attr-inside'
|
|
});
|
|
</script>
|
|
</dom-module>
|
|
|
|
|
|
<test-slot><div>A</div><div>B</div></test-slot>
|
|
|
|
<test-static><div>static A</div><div>static B</div></test-static>
|
|
|
|
<div id="staticDiv"></div>
|
|
|
|
<script type="module">
|
|
import { dom } from '../../lib/legacy/polymer.dom.js';
|
|
|
|
suite('observeNodes', function() {
|
|
|
|
test('observe initial state of distributing element', function() {
|
|
var recordedA;
|
|
var el = document.querySelector('test-slot');
|
|
var observer1 = dom(el).observeNodes(function(info) {
|
|
recordedA = info;
|
|
});
|
|
observer1.flush();
|
|
assert.equal(recordedA.addedNodes.length, 2);
|
|
recordedA = null;
|
|
var recordedB;
|
|
var observer2 = dom(el).observeNodes(function(info) {
|
|
recordedB = info;
|
|
});
|
|
observer2.flush();
|
|
assert.equal(recordedA, null);
|
|
assert.equal(recordedB.addedNodes.length, 2);
|
|
dom(el).unobserveNodes(observer1);
|
|
dom(el).unobserveNodes(observer2);
|
|
});
|
|
|
|
test('observe initial state of non-distributing element', function() {
|
|
var recordedA;
|
|
var el = document.querySelector('test-static');
|
|
var observer1 = dom(el).observeNodes(function(info) {
|
|
recordedA = info;
|
|
});
|
|
observer1.flush();
|
|
assert.equal(recordedA.addedNodes.length, 2);
|
|
recordedA = null;
|
|
var recordedB;
|
|
var observer2 = dom(el).observeNodes(function(info) {
|
|
recordedB = info;
|
|
});
|
|
observer2.flush();
|
|
assert.equal(recordedA, null);
|
|
assert.equal(recordedB.addedNodes.length, 2);
|
|
dom(el).unobserveNodes(observer1);
|
|
dom(el).unobserveNodes(observer2);
|
|
});
|
|
|
|
test('observeNodes called in observed node context', function(done) {
|
|
var el = document.createElement('test-slot');
|
|
document.body.appendChild(el);
|
|
var observer = dom(el).observeNodes(function() {
|
|
assert.equal(this, el);
|
|
done();
|
|
});
|
|
// add
|
|
var d = document.createElement('div');
|
|
dom(el).appendChild(d);
|
|
observer.flush();
|
|
});
|
|
|
|
test('observe children changes to distributing element', function() {
|
|
var el = document.createElement('test-slot');
|
|
document.body.appendChild(el);
|
|
|
|
var recorded;
|
|
var observer = dom(el).observeNodes(function(info) {
|
|
recorded = info;
|
|
});
|
|
// add
|
|
var d = document.createElement('div');
|
|
var d1 = document.createElement('div');
|
|
dom(el).appendChild(d);
|
|
dom(el).appendChild(d1);
|
|
observer.flush();
|
|
assert.equal(recorded.addedNodes.length, 2);
|
|
assert.equal(recorded.removedNodes.length, 0);
|
|
assert.equal(recorded.addedNodes[0], d);
|
|
assert.equal(recorded.addedNodes[1], d1);
|
|
// remove
|
|
dom(el).removeChild(d);
|
|
dom(el).removeChild(d1);
|
|
observer.flush();
|
|
assert.equal(recorded.addedNodes.length, 0);
|
|
assert.equal(recorded.removedNodes.length, 2);
|
|
assert.equal(recorded.removedNodes[0], d);
|
|
assert.equal(recorded.removedNodes[1], d1);
|
|
// add
|
|
dom(el).appendChild(d);
|
|
dom(el).appendChild(d1);
|
|
observer.flush();
|
|
assert.equal(recorded.addedNodes.length, 2);
|
|
assert.equal(recorded.addedNodes[0], d);
|
|
assert.equal(recorded.addedNodes[1], d1);
|
|
// reset, unobserve and remove
|
|
recorded = null;
|
|
dom(el).unobserveNodes(observer);
|
|
dom(el).removeChild(d);
|
|
dom(el).removeChild(d1);
|
|
observer.flush();
|
|
assert.equal(recorded, null);
|
|
document.body.removeChild(el);
|
|
});
|
|
|
|
test('observe children changes to distributing element that provoke additional changes', function() {
|
|
var el = document.createElement('test-slot');
|
|
document.body.appendChild(el);
|
|
|
|
var recordedInfo, elAddedInObserver;
|
|
var observerCallCount = 0;
|
|
var observer = dom(el).observeNodes(function(info) {
|
|
observerCallCount++;
|
|
recordedInfo = info;
|
|
if (dom(info.target).childNodes.length < 5) {
|
|
elAddedInObserver = document.createElement('div');
|
|
dom(info.target).appendChild(elAddedInObserver);
|
|
}
|
|
|
|
});
|
|
// add
|
|
var d = document.createElement('div');
|
|
dom(el).appendChild(d);
|
|
while (observer.flush()) {
|
|
// re-flush until done
|
|
}
|
|
assert.equal(observerCallCount, 5);
|
|
assert.equal(recordedInfo.addedNodes.length, 1);
|
|
assert.equal(recordedInfo.addedNodes[0], elAddedInObserver);
|
|
assert.equal(dom(el).childNodes.length, 5);
|
|
document.body.removeChild(el);
|
|
dom(el).unobserveNodes(observer);
|
|
});
|
|
|
|
test('observe children changes to distributing element (async)', function(done) {
|
|
var el = document.createElement('test-slot');
|
|
document.body.appendChild(el);
|
|
|
|
var nodes = [];
|
|
var handle = dom(el).observeNodes(function(info) {
|
|
for (var i=0, at; i < info.removedNodes.length; i++) {
|
|
at = nodes.indexOf(info.removedNodes[i]);
|
|
assert.isAbove(at, -1);
|
|
nodes.splice(at, 1);
|
|
}
|
|
nodes = nodes.concat(info.addedNodes);
|
|
});
|
|
// add
|
|
var d = document.createElement('div');
|
|
var d1 = document.createElement('div');
|
|
dom(el).appendChild(d);
|
|
dom(el).appendChild(d1);
|
|
setTimeout(function() {
|
|
assert.sameMembers(el.getEffectiveChildNodes(), nodes);
|
|
// remove
|
|
dom(el).removeChild(d);
|
|
dom(el).removeChild(d1);
|
|
setTimeout(function() {
|
|
assert.sameMembers(el.getEffectiveChildNodes(), nodes);
|
|
// add
|
|
dom(el).appendChild(d);
|
|
dom(el).appendChild(d1);
|
|
setTimeout(function() {
|
|
assert.sameMembers(el.getEffectiveChildNodes(), nodes);
|
|
dom(el).unobserveNodes(handle);
|
|
dom(el).removeChild(d);
|
|
dom(el).removeChild(d1);
|
|
setTimeout(function() {
|
|
assert.notEqual(nodes.length, el.getEffectiveChildNodes().length);
|
|
document.body.removeChild(el);
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
test('observe children changes to non-distributing element', function() {
|
|
var el = document.createElement('test-static');
|
|
document.body.appendChild(el);
|
|
|
|
var recorded;
|
|
var observer = dom(el).observeNodes(function(info) {
|
|
recorded = info;
|
|
});
|
|
// add
|
|
var d = document.createElement('div');
|
|
var d1 = document.createElement('div');
|
|
dom(el).appendChild(d);
|
|
dom(el).appendChild(d1);
|
|
observer.flush();
|
|
assert.equal(recorded.addedNodes.length, 2);
|
|
assert.equal(recorded.removedNodes.length, 0);
|
|
assert.equal(recorded.addedNodes[0], d);
|
|
assert.equal(recorded.addedNodes[1], d1);
|
|
// remove
|
|
dom(el).removeChild(d);
|
|
dom(el).removeChild(d1);
|
|
observer.flush();
|
|
assert.equal(recorded.addedNodes.length, 0);
|
|
assert.equal(recorded.removedNodes.length, 2);
|
|
assert.equal(recorded.removedNodes[0], d);
|
|
assert.equal(recorded.removedNodes[1], d1);
|
|
// add
|
|
dom(el).appendChild(d);
|
|
dom(el).appendChild(d1);
|
|
observer.flush();
|
|
assert.equal(recorded.addedNodes.length, 2);
|
|
assert.equal(recorded.addedNodes[0], d);
|
|
assert.equal(recorded.addedNodes[1], d1);
|
|
// reset, unobserve and remove
|
|
recorded = null;
|
|
dom(el).unobserveNodes(observer);
|
|
dom(el).removeChild(d);
|
|
dom(el).removeChild(d1);
|
|
observer.flush();
|
|
assert.equal(recorded, null);
|
|
document.body.removeChild(el);
|
|
});
|
|
|
|
test('observe changes to inner node wrapping <slot>', function() {
|
|
var el = document.createElement('test-slot');
|
|
document.body.appendChild(el);
|
|
|
|
var observedInfo;
|
|
var observer = dom(el.$.slotContainer).observeNodes(function(info) {
|
|
observedInfo = info;
|
|
});
|
|
observer.flush();
|
|
// add
|
|
var d = document.createElement('div');
|
|
var d1 = document.createElement('div');
|
|
dom(el).appendChild(d);
|
|
dom(el).appendChild(d1);
|
|
observer.flush();
|
|
assert.equal(observedInfo.target, el.$.slotContainer);
|
|
assert.equal(observedInfo.addedNodes.length, 2);
|
|
assert.equal(observedInfo.removedNodes.length, 0);
|
|
// remove
|
|
dom(el).removeChild(d);
|
|
dom(el).removeChild(d1);
|
|
observer.flush();
|
|
assert.equal(observedInfo.addedNodes.length, 0);
|
|
assert.equal(observedInfo.removedNodes.length, 2);
|
|
// add
|
|
dom(el).appendChild(d);
|
|
dom(el).appendChild(d1);
|
|
observer.flush();
|
|
assert.equal(observedInfo.addedNodes.length, 2);
|
|
assert.equal(observedInfo.removedNodes.length, 0);
|
|
// reset, unobserve and remove
|
|
observedInfo = null;
|
|
dom(el.$.slotContainer).unobserveNodes(observer);
|
|
dom(el).removeChild(d);
|
|
dom(el).removeChild(d1);
|
|
observer.flush();
|
|
assert.equal(observedInfo, null);
|
|
document.body.removeChild(el);
|
|
});
|
|
|
|
test('observe changes to <slot>', function() {
|
|
var el = document.createElement('test-slot');
|
|
document.body.appendChild(el);
|
|
|
|
var observedInfo;
|
|
var observer = dom(el.$.slot).observeNodes(function(info) {
|
|
observedInfo = info;
|
|
});
|
|
observer.flush();
|
|
// add
|
|
var d = document.createElement('div');
|
|
var d1 = document.createElement('div');
|
|
dom(el).appendChild(d);
|
|
dom(el).appendChild(d1);
|
|
observer.flush();
|
|
assert.equal(observedInfo.target, el.$.slot);
|
|
assert.equal(observedInfo.addedNodes.length, 2);
|
|
assert.equal(observedInfo.removedNodes.length, 0);
|
|
// remove
|
|
dom(el).removeChild(d);
|
|
dom(el).removeChild(d1);
|
|
observer.flush();
|
|
assert.equal(observedInfo.addedNodes.length, 0);
|
|
assert.equal(observedInfo.removedNodes.length, 2);
|
|
// add
|
|
dom(el).appendChild(d);
|
|
dom(el).appendChild(d1);
|
|
observer.flush();
|
|
assert.equal(observedInfo.addedNodes.length, 2);
|
|
assert.equal(observedInfo.removedNodes.length, 0);
|
|
// reset, unobserve and remove
|
|
observedInfo = null;
|
|
dom(el.$.slot).unobserveNodes(observer);
|
|
dom(el).removeChild(d);
|
|
dom(el).removeChild(d1);
|
|
observer.flush();
|
|
assert.equal(observedInfo, null);
|
|
document.body.removeChild(el);
|
|
});
|
|
|
|
test('observe effective children inside distributing element', function() {
|
|
var el = document.createElement('test-slot1');
|
|
document.body.appendChild(el);
|
|
|
|
var recorded;
|
|
var observer = dom(el.$.slot).observeNodes(function(info) {
|
|
recorded = info;
|
|
});
|
|
observer.flush();
|
|
// add
|
|
var d = document.createElement('div');
|
|
var d1 = document.createElement('div');
|
|
dom(el).appendChild(d);
|
|
dom(el).appendChild(d1);
|
|
observer.flush();
|
|
assert.equal(recorded.addedNodes.length, 2);
|
|
assert.equal(recorded.removedNodes.length, 0);
|
|
assert.equal(recorded.addedNodes[0], d);
|
|
assert.equal(recorded.addedNodes[1], d1);
|
|
// remove
|
|
dom(el).removeChild(d);
|
|
dom(el).removeChild(d1);
|
|
observer.flush();
|
|
assert.equal(recorded.addedNodes.length, 0);
|
|
assert.equal(recorded.removedNodes.length, 2);
|
|
assert.equal(recorded.removedNodes[0], d);
|
|
assert.equal(recorded.removedNodes[1], d1);
|
|
// add
|
|
dom(el).appendChild(d);
|
|
dom(el).appendChild(d1);
|
|
observer.flush();
|
|
assert.equal(recorded.addedNodes.length, 2);
|
|
assert.equal(recorded.addedNodes[0], d);
|
|
assert.equal(recorded.addedNodes[1], d1);
|
|
// reset, unobserve and remove
|
|
recorded = null;
|
|
dom(el.$.slot).unobserveNodes(observer);
|
|
dom(el).removeChild(d);
|
|
dom(el).removeChild(d1);
|
|
observer.flush();
|
|
assert.equal(recorded, null);
|
|
document.body.removeChild(el);
|
|
});
|
|
|
|
test('observe effective children changes when adding to another host', function() {
|
|
var el = document.createElement('test-slot1');
|
|
document.body.appendChild(el);
|
|
|
|
var recorded;
|
|
var observer = dom(el.$.slot).observeNodes(function(info) {
|
|
recorded = info;
|
|
});
|
|
observer.flush();
|
|
// add
|
|
var d = document.createElement('div');
|
|
var d1 = document.createElement('div');
|
|
dom(el).appendChild(d);
|
|
dom(el).appendChild(d1);
|
|
observer.flush();
|
|
assert.equal(recorded.addedNodes.length, 2);
|
|
assert.equal(recorded.removedNodes.length, 0);
|
|
assert.equal(recorded.addedNodes[0], d);
|
|
assert.equal(recorded.addedNodes[1], d1);
|
|
// add somewhere else... we should see these as removes
|
|
dom(document.body).appendChild(d);
|
|
dom(document.body).appendChild(d1);
|
|
observer.flush();
|
|
assert.equal(recorded.addedNodes.length, 0);
|
|
assert.equal(recorded.removedNodes.length, 2);
|
|
assert.equal(recorded.removedNodes[0], d);
|
|
assert.equal(recorded.removedNodes[1], d1);
|
|
// cleanup
|
|
dom(document.body).removeChild(d);
|
|
dom(document.body).removeChild(d1);
|
|
document.body.removeChild(el);
|
|
dom(el.$.slot).unobserveNodes(observer);
|
|
});
|
|
|
|
test('observe effective children changes in static slot when adding to another host', function() {
|
|
var el = document.createElement('staticDiv');
|
|
document.body.appendChild(el);
|
|
|
|
var recorded;
|
|
var observer = dom(el).observeNodes(function(info) {
|
|
recorded = info;
|
|
});
|
|
observer.flush();
|
|
// add
|
|
var d = document.createElement('div');
|
|
var d1 = document.createElement('div');
|
|
dom(el).appendChild(d);
|
|
dom(el).appendChild(d1);
|
|
observer.flush();
|
|
assert.equal(recorded.addedNodes.length, 2);
|
|
assert.equal(recorded.removedNodes.length, 0);
|
|
assert.equal(recorded.addedNodes[0], d);
|
|
assert.equal(recorded.addedNodes[1], d1);
|
|
// add somewhere else... we should see these as removes
|
|
dom(document.body).appendChild(d);
|
|
dom(document.body).appendChild(d1);
|
|
observer.flush();
|
|
assert.equal(recorded.addedNodes.length, 0);
|
|
assert.equal(recorded.removedNodes.length, 2);
|
|
assert.equal(recorded.removedNodes[0], d);
|
|
assert.equal(recorded.removedNodes[1], d1);
|
|
// cleanup
|
|
dom(document.body).removeChild(d);
|
|
dom(document.body).removeChild(d1);
|
|
document.body.removeChild(el);
|
|
dom(el).unobserveNodes(observer);
|
|
});
|
|
|
|
test('observe effective children inside deep distributing element', function() {
|
|
var el = document.createElement('test-slot3');
|
|
document.body.appendChild(el);
|
|
|
|
var recorded;
|
|
var slot = el.$.slot.$.slot.$.slot;
|
|
var observer = dom(slot).observeNodes(function(info) {
|
|
recorded = info;
|
|
});
|
|
// add
|
|
var d = document.createElement('div');
|
|
var d1 = document.createElement('div');
|
|
dom(el).appendChild(d);
|
|
dom(el).appendChild(d1);
|
|
observer.flush();
|
|
assert.equal(recorded.addedNodes.length, 2);
|
|
assert.equal(recorded.removedNodes.length, 0);
|
|
assert.equal(recorded.addedNodes[0], d);
|
|
assert.equal(recorded.addedNodes[1], d1);
|
|
// remove
|
|
dom(el).removeChild(d);
|
|
dom(el).removeChild(d1);
|
|
observer.flush();
|
|
assert.equal(recorded.addedNodes.length, 0);
|
|
assert.equal(recorded.removedNodes.length, 2);
|
|
assert.equal(recorded.removedNodes[0], d);
|
|
assert.equal(recorded.removedNodes[1], d1);
|
|
// add
|
|
dom(el).appendChild(d);
|
|
dom(el).appendChild(d1);
|
|
observer.flush();
|
|
assert.equal(recorded.addedNodes.length, 2);
|
|
assert.equal(recorded.addedNodes[0], d);
|
|
assert.equal(recorded.addedNodes[1], d1);
|
|
// reset, unobserve and remove
|
|
recorded = null;
|
|
dom(slot).unobserveNodes(observer);
|
|
dom(el).removeChild(d);
|
|
dom(el).removeChild(d1);
|
|
observer.flush();
|
|
assert.equal(recorded, null);
|
|
document.body.removeChild(el);
|
|
});
|
|
|
|
test('observe <slot> inside deep distributing element', function() {
|
|
var el = document.createElement('test-slot3');
|
|
document.body.appendChild(el);
|
|
|
|
var recorded;
|
|
var slot = el.$.slot.$.slot.$.slot.$.slot;
|
|
assert.equal(slot.localName, 'slot');
|
|
var observer = dom(slot).observeNodes(function(info) {
|
|
recorded = info;
|
|
});
|
|
// add
|
|
var d = document.createElement('div');
|
|
var d1 = document.createElement('div');
|
|
dom(el).appendChild(d);
|
|
dom(el).appendChild(d1);
|
|
observer.flush();
|
|
assert.equal(recorded.addedNodes.length, 2);
|
|
assert.equal(recorded.removedNodes.length, 0);
|
|
assert.equal(recorded.addedNodes[0], d);
|
|
assert.equal(recorded.addedNodes[1], d1);
|
|
// remove
|
|
dom(el).removeChild(d);
|
|
dom(el).removeChild(d1);
|
|
observer.flush();
|
|
assert.equal(recorded.addedNodes.length, 0);
|
|
assert.equal(recorded.removedNodes.length, 2);
|
|
assert.equal(recorded.removedNodes[0], d);
|
|
assert.equal(recorded.removedNodes[1], d1);
|
|
// add
|
|
dom(el).appendChild(d);
|
|
dom(el).appendChild(d1);
|
|
observer.flush();
|
|
assert.equal(recorded.addedNodes.length, 2);
|
|
assert.equal(recorded.addedNodes[0], d);
|
|
assert.equal(recorded.addedNodes[1], d1);
|
|
// reset, unobserve and remove
|
|
recorded = null;
|
|
dom(slot).unobserveNodes(observer);
|
|
dom(el).removeChild(d);
|
|
dom(el).removeChild(d1);
|
|
observer.flush();
|
|
assert.equal(recorded, null);
|
|
document.body.removeChild(el);
|
|
});
|
|
|
|
test('observe effective children inside deep distributing element (async)', function(done) {
|
|
var el = document.createElement('test-slot3');
|
|
document.body.appendChild(el);
|
|
|
|
var recorded;
|
|
var slot = el.$.slot.$.slot.$.slot;
|
|
var observer = dom(slot).observeNodes(function(info) {
|
|
recorded = info;
|
|
});
|
|
// add
|
|
var d = document.createElement('div');
|
|
var d1 = document.createElement('div');
|
|
dom(el).appendChild(d);
|
|
dom(el).appendChild(d1);
|
|
setTimeout(function() {
|
|
assert.equal(recorded.addedNodes.length, 2);
|
|
assert.equal(recorded.removedNodes.length, 0);
|
|
assert.equal(recorded.addedNodes[0], d);
|
|
assert.equal(recorded.addedNodes[1], d1);
|
|
// remove
|
|
dom(el).removeChild(d);
|
|
dom(el).removeChild(d1);
|
|
setTimeout(function() {
|
|
assert.equal(recorded.addedNodes.length, 0);
|
|
assert.equal(recorded.removedNodes.length, 2);
|
|
assert.equal(recorded.removedNodes[0], d);
|
|
assert.equal(recorded.removedNodes[1], d1);
|
|
// add
|
|
dom(el).appendChild(d);
|
|
dom(el).appendChild(d1);
|
|
setTimeout(function() {
|
|
assert.equal(recorded.addedNodes.length, 2);
|
|
assert.equal(recorded.addedNodes[0], d);
|
|
assert.equal(recorded.addedNodes[1], d1);
|
|
// reset, unobserve and remove
|
|
recorded = null;
|
|
dom(slot).unobserveNodes(observer);
|
|
dom(el).removeChild(d);
|
|
dom(el).removeChild(d1);
|
|
setTimeout(function() {
|
|
assert.equal(recorded, null);
|
|
document.body.removeChild(el);
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
|
|
test('observe effective children attr changes inside deep distributing element (async)', function(done) {
|
|
var el = document.createElement('test-slot-attr3');
|
|
document.body.appendChild(el);
|
|
|
|
var recorded;
|
|
var slot = el.$.slot.$.slot.$.slot;
|
|
var observer = dom(slot).observeNodes(function(info) {
|
|
recorded = info;
|
|
});
|
|
observer.flush();
|
|
recorded = null;
|
|
// add
|
|
var d = document.createElement('div');
|
|
var d1 = document.createElement('div');
|
|
dom(el).appendChild(d);
|
|
dom(el).appendChild(d1);
|
|
observer.flush();
|
|
assert.equal(recorded, null);
|
|
setTimeout(function() {
|
|
assert.equal(recorded, null);
|
|
dom(d).setAttribute('slot', 'a');
|
|
setTimeout(function() {
|
|
assert.equal(recorded.addedNodes.length, 1);
|
|
assert.equal(recorded.removedNodes.length, 0);
|
|
assert.equal(recorded.addedNodes[0], d);
|
|
dom(d).removeAttribute('slot');
|
|
setTimeout(function() {
|
|
assert.equal(recorded.addedNodes.length, 0);
|
|
assert.equal(recorded.removedNodes.length, 1);
|
|
assert.equal(recorded.removedNodes[0], d);
|
|
recorded = null;
|
|
dom(slot).unobserveNodes(observer);
|
|
dom(d).setAttribute('slot', 'a');
|
|
setTimeout(function() {
|
|
assert.equal(recorded, null);
|
|
document.body.removeChild(el);
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
test('observe effective children attr changes inside deep distributing element without outer select (async)', function(done) {
|
|
var el = document.createElement('test-slot-attr-inside');
|
|
document.body.appendChild(el);
|
|
|
|
var recorded;
|
|
var slot = el.$.slot.$.slot.$.slot.$.slot;
|
|
var observer = dom(slot).observeNodes(function(info) {
|
|
recorded = info;
|
|
});
|
|
observer.flush();
|
|
recorded = null;
|
|
// add
|
|
var d = document.createElement('div');
|
|
var d1 = document.createElement('div');
|
|
dom(el).appendChild(d);
|
|
dom(el).appendChild(d1);
|
|
observer.flush();
|
|
assert.equal(recorded, null);
|
|
setTimeout(function() {
|
|
assert.equal(recorded, null);
|
|
dom(d).setAttribute('slot', 'a');
|
|
setTimeout(function() {
|
|
assert.equal(recorded.addedNodes.length, 1);
|
|
assert.equal(recorded.removedNodes.length, 0);
|
|
assert.equal(recorded.addedNodes[0], d);
|
|
dom(d).removeAttribute('slot');
|
|
setTimeout(function() {
|
|
assert.equal(recorded.addedNodes.length, 0);
|
|
assert.equal(recorded.removedNodes.length, 1);
|
|
assert.equal(recorded.removedNodes[0], d);
|
|
recorded = null;
|
|
dom(slot).unobserveNodes(observer);
|
|
dom(d).setAttribute('slot', 'a');
|
|
setTimeout(function() {
|
|
assert.equal(recorded, null);
|
|
document.body.removeChild(el);
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
test('add/remove multiple observers', function() {
|
|
var el = document.createElement('test-slot1');
|
|
document.body.appendChild(el);
|
|
|
|
var r1 = 0;
|
|
var h1 = dom(el.$.slot).observeNodes(function() {
|
|
r1++;
|
|
});
|
|
var r2 = 0;
|
|
var h2 = dom(el.$.slot).observeNodes(function() {
|
|
r2++;
|
|
});
|
|
var r3 = 0;
|
|
var h3 = dom(el.$.slot).observeNodes(function() {
|
|
r3++;
|
|
});
|
|
// add
|
|
var d = document.createElement('div');
|
|
dom(el).appendChild(d);
|
|
h1.flush();
|
|
h2.flush();
|
|
h3.flush();
|
|
assert.equal(r1, 1);
|
|
assert.equal(r2, 1);
|
|
assert.equal(r3, 1);
|
|
dom(el.$.slot).unobserveNodes(h1);
|
|
d = document.createElement('div');
|
|
dom(el).appendChild(d);
|
|
h1.flush();
|
|
h2.flush();
|
|
h3.flush();
|
|
assert.equal(r1, 1);
|
|
assert.equal(r2, 2);
|
|
assert.equal(r3, 2);
|
|
dom(el.$.slot).unobserveNodes(h2);
|
|
d = document.createElement('div');
|
|
dom(el).appendChild(d);
|
|
h1.flush();
|
|
h2.flush();
|
|
h3.flush();
|
|
assert.equal(r1, 1);
|
|
assert.equal(r2, 2);
|
|
assert.equal(r3, 3);
|
|
dom(el.$.slot).unobserveNodes(h3);
|
|
d = document.createElement('div');
|
|
dom(el).appendChild(d);
|
|
h1.flush();
|
|
h2.flush();
|
|
h3.flush();
|
|
assert.equal(r1, 1);
|
|
assert.equal(r2, 2);
|
|
assert.equal(r3, 3);
|
|
h1 = dom(el.$.slot).observeNodes(h1.callback);
|
|
h2 = dom(el.$.slot).observeNodes(h2.callback);
|
|
h3 = dom(el.$.slot).observeNodes(h3.callback);
|
|
h1.flush();
|
|
h2.flush();
|
|
h3.flush();
|
|
assert.equal(r1, 2);
|
|
assert.equal(r2, 3);
|
|
assert.equal(r3, 4);
|
|
d = document.createElement('div');
|
|
dom(el).appendChild(d);
|
|
h1.flush();
|
|
h2.flush();
|
|
h3.flush();
|
|
assert.equal(r1, 3);
|
|
assert.equal(r2, 4);
|
|
assert.equal(r3, 5);
|
|
dom(el.$.slot).unobserveNodes(h3);
|
|
d = document.createElement('div');
|
|
dom(el).appendChild(d);
|
|
h1.flush();
|
|
h2.flush();
|
|
h3.flush();
|
|
assert.equal(r1, 4);
|
|
assert.equal(r2, 5);
|
|
assert.equal(r3, 5);
|
|
dom(el.$.slot).unobserveNodes(h2);
|
|
d = document.createElement('div');
|
|
dom(el).appendChild(d);
|
|
h1.flush();
|
|
h2.flush();
|
|
h3.flush();
|
|
assert.equal(r1, 5);
|
|
assert.equal(r2, 5);
|
|
assert.equal(r3, 5);
|
|
dom(el.$.slot).unobserveNodes(h1);
|
|
d = document.createElement('div');
|
|
dom(el).appendChild(d);
|
|
h1.flush();
|
|
h2.flush();
|
|
h3.flush();
|
|
assert.equal(r1, 5);
|
|
assert.equal(r2, 5);
|
|
assert.equal(r3, 5);
|
|
});
|
|
|
|
test('observe changes of target with dynamically added <slot>', function() {
|
|
var el = document.createElement('test-static');
|
|
document.body.appendChild(el);
|
|
var container = el.shadowRoot.childNodes[1];
|
|
var recorded = null;
|
|
var observer = dom(container).observeNodes(function(info) {
|
|
recorded = info;
|
|
});
|
|
var slot = document.createElement('slot');
|
|
container.appendChild(slot);
|
|
observer.flush();
|
|
recorded = null;
|
|
var child = document.createElement('div');
|
|
el.appendChild(child);
|
|
observer.flush();
|
|
assert.equal(recorded.addedNodes.length, 1);
|
|
assert.equal(recorded.addedNodes[0], child);
|
|
recorded = null;
|
|
el.removeChild(child);
|
|
observer.flush();
|
|
assert.equal(recorded.removedNodes.length, 1);
|
|
assert.equal(recorded.removedNodes[0], child);
|
|
recorded = null;
|
|
container.removeChild(slot);
|
|
observer.flush();
|
|
el.appendChild(child);
|
|
assert.equal(recorded, null);
|
|
dom(container).unobserveNodes(observer);
|
|
document.body.removeChild(el);
|
|
});
|
|
|
|
test('observe changes of target with dynamically added <slot> (flush/async)', function(done) {
|
|
var el = document.createElement('test-static');
|
|
document.body.appendChild(el);
|
|
var container = el.shadowRoot.childNodes[1];
|
|
var recorded = null;
|
|
var observer = dom(container).observeNodes(function(info) {
|
|
recorded = info;
|
|
});
|
|
var slot = document.createElement('slot');
|
|
container.appendChild(slot);
|
|
observer.flush();
|
|
recorded = null;
|
|
var child = document.createElement('div');
|
|
el.appendChild(child);
|
|
setTimeout(function() {
|
|
assert.equal(recorded.addedNodes.length, 1);
|
|
assert.equal(recorded.addedNodes[0], child);
|
|
done();
|
|
});
|
|
});
|
|
|
|
test('observe changes of target with dynamically added <slot> (async)', function(done) {
|
|
var el = document.createElement('test-static');
|
|
document.body.appendChild(el);
|
|
var container = el.shadowRoot.childNodes[1];
|
|
var recorded = null;
|
|
var observer = dom(container).observeNodes(function(info) {
|
|
recorded = info;
|
|
});
|
|
var slot = document.createElement('slot');
|
|
container.appendChild(slot);
|
|
observer.flush();
|
|
recorded = null;
|
|
var child = document.createElement('div');
|
|
el.appendChild(child);
|
|
setTimeout(function() {
|
|
assert.equal(recorded.addedNodes.length, 1);
|
|
assert.equal(recorded.addedNodes[0], child);
|
|
recorded = null;
|
|
el.removeChild(child);
|
|
setTimeout(function() {
|
|
assert.equal(recorded.removedNodes.length, 1);
|
|
assert.equal(recorded.removedNodes[0], child);
|
|
recorded = null;
|
|
container.removeChild(slot);
|
|
setTimeout(function() {
|
|
el.appendChild(child);
|
|
assert.equal(recorded, null);
|
|
dom(container).unobserveNodes(observer);
|
|
document.body.removeChild(el);
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
test('element distributed to insertion point observing itself', function() {
|
|
var host = document.createElement('test-slot');
|
|
var el = document.createElement('test-self-observe');
|
|
host.appendChild(el);
|
|
document.body.appendChild(host);
|
|
if (window.ShadyDOM) {
|
|
ShadyDOM.flush();
|
|
}
|
|
assert.ok(el._observer);
|
|
var div = document.createElement('div');
|
|
el.appendChild(div);
|
|
el._observer.flush();
|
|
assert.equal(el.info.addedNodes[0], div);
|
|
document.body.removeChild(host);
|
|
});
|
|
|
|
});
|
|
</script>
|
|
|
|
</body>
|
|
</html>
|