| Index: third_party/polymer/v0_8/components/polymer/src/mini/shady.html
|
| diff --git a/third_party/polymer/v0_8/components/polymer/src/mini/shady.html b/third_party/polymer/v0_8/components/polymer/src/mini/shady.html
|
| deleted file mode 100644
|
| index 79b7829c37e6ff684ff6392e8677b2dc9b6bdf53..0000000000000000000000000000000000000000
|
| --- a/third_party/polymer/v0_8/components/polymer/src/mini/shady.html
|
| +++ /dev/null
|
| @@ -1,376 +0,0 @@
|
| -<!--
|
| -@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="../lib/array-splice.html">
|
| -<link rel="import" href="../lib/dom-api.html">
|
| -<script>
|
| -
|
| - (function() {
|
| - /**
|
| -
|
| - Implements a pared down version of ShadowDOM's scoping, which is easy to
|
| - polyfill across browsers.
|
| -
|
| - */
|
| - Polymer.Base._addFeature({
|
| -
|
| - _prepShady: function() {
|
| - // Use this system iff localDom is needed.
|
| - this._useContent = this._useContent || Boolean(this._template);
|
| - if (this._useContent) {
|
| - this._template._hasInsertionPoint =
|
| - this._template.content.querySelector('content');
|
| - }
|
| - },
|
| -
|
| - // called as part of content initialization, prior to template stamping
|
| - _poolContent: function() {
|
| - if (this._useContent) {
|
| - // capture lightChildren to help reify dom scoping
|
| - saveLightChildrenIfNeeded(this);
|
| - }
|
| - },
|
| -
|
| - // called as part of content initialization, after template stamping
|
| - _setupRoot: function() {
|
| - if (this._useContent) {
|
| - this._createLocalRoot();
|
| - }
|
| - },
|
| -
|
| - _createLocalRoot: function() {
|
| - this.shadyRoot = this.root;
|
| - this.shadyRoot._distributionClean = false;
|
| - this.shadyRoot._isShadyRoot = true;
|
| - this.shadyRoot._dirtyRoots = [];
|
| - // capture insertion point list
|
| - // TODO(sorvell): it's faster to do this via native qSA than annotator.
|
| - this.shadyRoot._insertionPoints = this._template._hasInsertionPoint ?
|
| - this.shadyRoot.querySelectorAll('content') : [];
|
| - // save logical tree info for shadyRoot.
|
| - saveLightChildrenIfNeeded(this.shadyRoot);
|
| - this.shadyRoot.host = this;
|
| - },
|
| -
|
| - /**
|
| - * Return the element whose local dom within which this element
|
| - * is contained. This is a shorthand for
|
| - * `Polymer.dom(this).getOwnerRoot().host`.
|
| - */
|
| - get domHost() {
|
| - var root = Polymer.dom(this).getOwnerRoot();
|
| - return root && root.host;
|
| - },
|
| -
|
| - /**
|
| - * Force this element to distribute its children to its local dom.
|
| - * A user should call `distributeContent` if distribution has been
|
| - * invalidated due to changes to selectors on child elements that
|
| - * effect distribution. For example, if an element contains an
|
| - * insertion point with <content select=".foo"> and a `foo` class is
|
| - * added to a child, then `distributeContent` must be called to update
|
| - * local dom distribution.
|
| - */
|
| - distributeContent: function() {
|
| - if (this._useContent) {
|
| - this.shadyRoot._distributionClean = false;
|
| - this._distributeContent();
|
| - }
|
| - },
|
| -
|
| - _distributeContent: function() {
|
| - if (this._useContent && !this.shadyRoot._distributionClean) {
|
| - // logically distribute self
|
| - this._beginDistribute();
|
| - this._distributeDirtyRoots();
|
| - this._finishDistribute();
|
| - }
|
| - },
|
| -
|
| - _beginDistribute: function() {
|
| - if (this._useContent && hasInsertionPoint(this.shadyRoot)) {
|
| - // reset distributions
|
| - this._resetDistribution();
|
| - // compute which nodes should be distributed where
|
| - // TODO(jmesserly): this is simplified because we assume a single
|
| - // ShadowRoot per host and no `<shadow>`.
|
| - this._distributePool(this.shadyRoot, this._collectPool());
|
| - }
|
| - },
|
| -
|
| - _distributeDirtyRoots: function() {
|
| - var c$ = this.shadyRoot._dirtyRoots;
|
| - for (var i=0, l= c$.length, c; (i<l) && (c=c$[i]); i++) {
|
| - c._distributeContent();
|
| - }
|
| - this.shadyRoot._dirtyRoots = [];
|
| - },
|
| -
|
| - _finishDistribute: function() {
|
| - // compose self
|
| - if (this._useContent) {
|
| - if (hasInsertionPoint(this.shadyRoot)) {
|
| - this._composeTree();
|
| - } else {
|
| - if (!this.shadyRoot._hasDistributed) {
|
| - this.textContent = '';
|
| - this.appendChild(this.shadyRoot);
|
| - } else {
|
| - // simplified non-tree walk composition
|
| - var children = this._composeNode(this);
|
| - this._updateChildNodes(this, children);
|
| - }
|
| - }
|
| - this.shadyRoot._hasDistributed = true;
|
| - this.shadyRoot._distributionClean = true;
|
| - }
|
| - },
|
| -
|
| - // This is a polyfill for Element.prototype.matches, which is sometimes
|
| - // still prefixed. Alternatively we could just polyfill it somewhere.
|
| - // Note that the arguments are reversed from what you might expect.
|
| - elementMatches: function(selector, node) {
|
| - if (node === undefined) {
|
| - node = this;
|
| - }
|
| - return matchesSelector.call(node, selector);
|
| - },
|
| -
|
| - // Many of the following methods are all conceptually static, but they are
|
| - // included here as "protected" methods to allow overriding.
|
| -
|
| - _resetDistribution: function() {
|
| - // light children
|
| - var children = getLightChildren(this);
|
| - for (var i = 0; i < children.length; i++) {
|
| - var child = children[i];
|
| - if (child._destinationInsertionPoints) {
|
| - child._destinationInsertionPoints = undefined;
|
| - }
|
| - }
|
| - // insertion points
|
| - var root = this.shadyRoot;
|
| - var p$ = root._insertionPoints;
|
| - for (var j = 0; j < p$.length; j++) {
|
| - p$[j]._distributedNodes = [];
|
| - }
|
| - },
|
| -
|
| - // Gather the pool of nodes that should be distributed. We will combine
|
| - // these with the "content root" to arrive at the composed tree.
|
| - _collectPool: function() {
|
| - var pool = [];
|
| - var children = getLightChildren(this);
|
| - for (var i = 0; i < children.length; i++) {
|
| - var child = children[i];
|
| - if (isInsertionPoint(child)) {
|
| - pool.push.apply(pool, child._distributedNodes);
|
| - } else {
|
| - pool.push(child);
|
| - }
|
| - }
|
| - return pool;
|
| - },
|
| -
|
| - // perform "logical" distribution; note, no actual dom is moved here,
|
| - // instead elements are distributed into a `content._distributedNodes`
|
| - // array where applicable.
|
| - _distributePool: function(node, pool) {
|
| - var p$ = node._insertionPoints;
|
| - for (var i=0, l=p$.length, p; (i<l) && (p=p$[i]); i++) {
|
| - this._distributeInsertionPoint(p, pool);
|
| - }
|
| - },
|
| -
|
| - _distributeInsertionPoint: function(content, pool) {
|
| - // distribute nodes from the pool that this selector matches
|
| - var anyDistributed = false;
|
| - for (var i=0, l=pool.length, node; i < l; i++) {
|
| - node=pool[i];
|
| - // skip nodes that were already used
|
| - if (!node) {
|
| - continue;
|
| - }
|
| - // distribute this node if it matches
|
| - if (this._matchesContentSelect(node, content)) {
|
| - distributeNodeInto(node, content);
|
| - // remove this node from the pool
|
| - pool[i] = undefined;
|
| - // since at least one node matched, we won't need fallback content
|
| - anyDistributed = true;
|
| - var parent = content.lightParent;
|
| - // dirty a shadyRoot if a change may trigger reprojection!
|
| - if (parent && parent.shadyRoot &&
|
| - hasInsertionPoint(parent.shadyRoot)) {
|
| - parent.shadyRoot._distributionClean = false;
|
| - this.shadyRoot._dirtyRoots.push(parent);
|
| - }
|
| - }
|
| - }
|
| - // Fallback content if nothing was distributed here
|
| - if (!anyDistributed) {
|
| - var children = getLightChildren(content);
|
| - for (var j = 0; j < children.length; j++) {
|
| - distributeNodeInto(children[j], content);
|
| - }
|
| - }
|
| - },
|
| -
|
| - // Reify dom such that it is at its correct rendering position
|
| - // based on logical distribution.
|
| - _composeTree: function() {
|
| - this._updateChildNodes(this, this._composeNode(this));
|
| - var p$ = this.shadyRoot._insertionPoints;
|
| - for (var i=0, l=p$.length, p, parent; (i<l) && (p=p$[i]); i++) {
|
| - parent = p.lightParent || p.parentNode;
|
| - if (!parent._useContent && (parent !== this) &&
|
| - (parent !== this.shadyRoot)) {
|
| - this._updateChildNodes(parent, this._composeNode(parent));
|
| - }
|
| - }
|
| - },
|
| -
|
| - // Returns the list of nodes which should be rendered inside `node`.
|
| - _composeNode: function(node) {
|
| - var children = [];
|
| - var c$ = getLightChildren(node.shadyRoot || node);
|
| - for (var i = 0; i < c$.length; i++) {
|
| - var child = c$[i];
|
| - if (isInsertionPoint(child)) {
|
| - var distributedNodes = child._distributedNodes;
|
| - for (var j = 0; j < distributedNodes.length; j++) {
|
| - var distributedNode = distributedNodes[j];
|
| - if (isFinalDestination(child, distributedNode)) {
|
| - children.push(distributedNode);
|
| - }
|
| - }
|
| - } else {
|
| - children.push(child);
|
| - }
|
| - }
|
| - return children;
|
| - },
|
| -
|
| - // Ensures that the rendered node list inside `node` is `children`.
|
| - _updateChildNodes: function(node, children) {
|
| - var splices =
|
| - Polymer.ArraySplice.calculateSplices(children, node.childNodes);
|
| - for (var i=0; i<splices.length; i++) {
|
| - var s = splices[i];
|
| - // remove
|
| - for (var j=0, c; j < s.removed.length; j++) {
|
| - c = s.removed[j];
|
| - if (c.previousSibling == children[s.index-1]) {
|
| - remove(c);
|
| - }
|
| - }
|
| - // insert
|
| - for (var idx=s.index, ch, o; idx < s.index + s.addedCount; idx++) {
|
| - ch = children[idx];
|
| - o = node.childNodes[idx];
|
| - while (o && o === ch) {
|
| - o = o.nextSibling;
|
| - }
|
| - insertBefore(node, ch, o);
|
| - }
|
| - }
|
| - },
|
| -
|
| - _matchesContentSelect: function(node, contentElement) {
|
| - var select = contentElement.getAttribute('select');
|
| - // no selector matches all nodes (including text)
|
| - if (!select) {
|
| - return true;
|
| - }
|
| - select = select.trim();
|
| - // same thing if it had only whitespace
|
| - if (!select) {
|
| - return true;
|
| - }
|
| - // selectors can only match Elements
|
| - if (!(node instanceof Element)) {
|
| - return false;
|
| - }
|
| - // only valid selectors can match:
|
| - // TypeSelector
|
| - // *
|
| - // ClassSelector
|
| - // IDSelector
|
| - // AttributeSelector
|
| - // negation
|
| - var validSelectors = /^(:not\()?[*.#[a-zA-Z_|]/;
|
| - if (!validSelectors.test(select)) {
|
| - return false;
|
| - }
|
| - return this.elementMatches(select, node);
|
| - },
|
| -
|
| - // system override point
|
| - _elementAdd: function() {},
|
| -
|
| - // system override point
|
| - _elementRemove: function() {}
|
| -
|
| - });
|
| -
|
| - var saveLightChildrenIfNeeded = Polymer.DomApi.saveLightChildrenIfNeeded;
|
| - var getLightChildren = Polymer.DomApi.getLightChildren;
|
| - var matchesSelector = Polymer.DomApi.matchesSelector;
|
| - var hasInsertionPoint = Polymer.DomApi.hasInsertionPoint;
|
| -
|
| - function distributeNodeInto(child, insertionPoint) {
|
| - insertionPoint._distributedNodes.push(child);
|
| - var points = child._destinationInsertionPoints;
|
| - if (!points) {
|
| - child._destinationInsertionPoints = [insertionPoint];
|
| - // TODO(sorvell): _destinationInsertionPoints may not be cleared when
|
| - // nodes are dynamically added/removed, therefore test before adding
|
| - // insertion points.
|
| - } else if (points.indexOf(insertionPoint) < 0) {
|
| - points.push(insertionPoint);
|
| - }
|
| - }
|
| -
|
| - function isFinalDestination(insertionPoint, node) {
|
| - var points = node._destinationInsertionPoints;
|
| - return points && points[points.length - 1] === insertionPoint;
|
| - }
|
| -
|
| - function isInsertionPoint(node) {
|
| - // TODO(jmesserly): we could add back 'shadow' support here.
|
| - return node.localName == 'content';
|
| - }
|
| -
|
| - var nativeInsertBefore = Element.prototype.insertBefore;
|
| - var nativeRemoveChild = Element.prototype.removeChild;
|
| -
|
| - function insertBefore(parentNode, newChild, refChild) {
|
| - // remove child from its old parent first
|
| - remove(newChild);
|
| - // make sure we never lose logical DOM information:
|
| - // if the parentNode doesn't have lightChildren, save that information now.
|
| - saveLightChildrenIfNeeded(parentNode);
|
| - // insert it into the real DOM
|
| - nativeInsertBefore.call(parentNode, newChild, refChild || null);
|
| - }
|
| -
|
| - function remove(node) {
|
| - var parentNode = node.parentNode;
|
| - if (parentNode) {
|
| - // make sure we never lose logical DOM information:
|
| - // if the parentNode doesn't have lightChildren, save that information now.
|
| - saveLightChildrenIfNeeded(parentNode);
|
| - // remove it from the real DOM
|
| - nativeRemoveChild.call(parentNode, node);
|
| - }
|
| - }
|
| -
|
| - })();
|
| -
|
| -</script>
|
|
|