Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Effective children #2548

Merged
merged 24 commits into from
Oct 14, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
f34fb45
Adds `getEffectiveChildNodes`, `getEffectiveChildren`, `getEffectiveT…
Aug 3, 2015
6499e83
Adds `Polymer.dom(element).observeChildren(callback)` api
Aug 4, 2015
1ca065f
Merge branch 'master' into effective-children
Aug 10, 2015
effedcb
Factor dom-api's into separate helpers.
Aug 10, 2015
393ba40
Merge branch 'master' into effective-children
Aug 11, 2015
b11f86b
Add mutation tracking for distributedNodes.
Aug 13, 2015
07261e4
Add `Polymer.dom().notifyObservers` method to 'kick' observers, for e…
Aug 13, 2015
65abbd0
Merge branch 'master' into effective-children
Aug 13, 2015
19aa6eb
Merge branch 'master' into effective-children
Aug 20, 2015
1774f57
Merge branch 'master' into effective-children
Aug 24, 2015
8242a98
Add optional attribute tracking to support better distributed node no…
Aug 25, 2015
4099342
Merge branch 'master' into effective-children
Aug 27, 2015
ff2c088
Merge branch 'master' into effective-children
Aug 27, 2015
c09296e
Merge branch 'master' into effective-children
Aug 31, 2015
bd90b57
add `observeNodes` tests.
Sep 1, 2015
9ff2ee4
make tests work on polyfill.
Sep 1, 2015
b40060a
Merge branch 'master' into effective-children
Oct 8, 2015
d021039
Merge branch 'master' into effective-children
Oct 9, 2015
669acaa
Simplify change tracking by always dirty checking at the observer lev…
Oct 13, 2015
e11a4f3
Merge branch 'master' into effective-children
Oct 13, 2015
54911a7
Make shadow attribute tracking automatic based on detecting a <conten…
Oct 13, 2015
0ede79a
Add docs
Oct 13, 2015
8b1face
Add <content>.getDistributedNodes observation. Refactor flush.
Oct 14, 2015
344f5cc
ensure distribution observers see all changes that can come from attr…
Oct 14, 2015
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 60 additions & 0 deletions src/lib/dom-api-classlist.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<!--
@license
Copyright (c) 2014 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
-->
<script>

(function() {
'use strict';

var DomApi = Polymer.DomApi.ctor;

/**
* DomApi.classList allows maniuplation of `classList` compatible with
* Polymer.dom. The general usage is
* `Polymer.dom(node).classList.method(arguments)` where methods and arguments
* match native DOM.
*/
Object.defineProperty(DomApi.prototype, 'classList', {
get: function() {
if (!this._classList) {
this._classList = new DomApi.ClassList(this);
}
return this._classList;
},
configurable: true
});

DomApi.ClassList = function(host) {
this.domApi = host;
this.node = host.node;
}

DomApi.ClassList.prototype = {
add: function() {
this.node.classList.add.apply(this.node.classList, arguments);
this.domApi._distributeParent();
},

remove: function() {
this.node.classList.remove.apply(this.node.classList, arguments);
this.domApi._distributeParent();
},

toggle: function() {
this.node.classList.toggle.apply(this.node.classList, arguments);
this.domApi._distributeParent();
},
contains: function() {
return this.node.classList.contains.apply(this.node.classList,
arguments);
}
}

})();
</script>
95 changes: 95 additions & 0 deletions src/lib/dom-api-distributed-nodes-observer.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
<!--
@license
Copyright (c) 2014 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
-->
<link rel="import" href="settings.html">
<script>
(function() {
'use strict';

var DomApi = Polymer.DomApi.ctor;
var Settings = Polymer.Settings;

/**
* DomApi.DistributedNodesObserver notifies when the list returned by
* a <content> element's `getDistributedNodes()` may have changed.
* It is not meant to be used directly; it is used by
* `Polymer.dom(node).observeNodes(callback)` to observe changes to
* `<content>.getDistributedNodes()`.
*/
DomApi.DistributedNodesObserver = function(domApi) {
DomApi.EffectiveNodesObserver.call(this, domApi);
};

DomApi.DistributedNodesObserver.prototype =
Object.create(DomApi.EffectiveNodesObserver.prototype);

Polymer.Base.extend(DomApi.DistributedNodesObserver.prototype, {

// NOTE: ShadyDOM distribute provokes notification of these observers
// so no setup is required.
_setup: function() {},

_cleanup: function() {},

// no need to update sub-elements since <content> does not nest
// (but note that <slot> will)
_beforeCallListeners: function() {},

_getEffectiveNodes: function() {
return this.domApi.getDistributedNodes();
}

});

if (Settings.useShadow) {

Polymer.Base.extend(DomApi.DistributedNodesObserver.prototype, {

// NOTE: Under ShadowDOM we must observe the host element for
// changes.
_setup: function() {
if (!this._observer) {
var root = this.domApi.getOwnerRoot();
var host = root && root.host;
if (host) {
this._observer = Polymer.dom(host).observeNodes(
this._scheduleNotify.bind(this));
// NOTE: we identify this listener as needed for <content>
// notification so that enableShadowAttributeTracking
// can find these observers an ensure that we pass always
// pass notifications down.
this._observer._isContentListener = true;
if (this._hasAttrSelect()) {
Polymer.dom(host).observer.enableShadowAttributeTracking();
}
}
}
},

_hasAttrSelect: function() {
var select = this.node.getAttribute('select');
return select && select.match(/[[.]+/);
},

_cleanup: function() {
var root = this.domApi.getOwnerRoot();
var host = root && root.host;
if (host) {
Polymer.dom(host).unobserveNodes(this._observer);
}
this._observer = null;
}

});

}

})();

</script>
Loading