|
1 |
| -// Copyright 2012 The Polymer Authors. All rights reserved. |
2 |
| -// Use of this source code is goverened by a BSD-style |
3 |
| -// license that can be found in the LICENSE file. |
| 1 | +/** |
| 2 | + * Copyright 2012 The Polymer Authors. All rights reserved. |
| 3 | + * Use of this source code is goverened by a BSD-style |
| 4 | + * license that can be found in the LICENSE file. |
| 5 | + */ |
4 | 6 |
|
5 | 7 | (function(scope) {
|
6 | 8 | 'use strict';
|
7 | 9 |
|
8 | 10 | var EventTarget = scope.wrappers.EventTarget;
|
9 | 11 | var NodeList = scope.wrappers.NodeList;
|
| 12 | + var TreeScope = scope.TreeScope; |
10 | 13 | var assert = scope.assert;
|
11 | 14 | var defineWrapGetter = scope.defineWrapGetter;
|
12 | 15 | var enqueueMutation = scope.enqueueMutation;
|
| 16 | + var getTreeScope = scope.getTreeScope; |
13 | 17 | var isWrapper = scope.isWrapper;
|
14 | 18 | var mixin = scope.mixin;
|
15 | 19 | var registerTransientObservers = scope.registerTransientObservers;
|
16 | 20 | var registerWrapper = scope.registerWrapper;
|
| 21 | + var setTreeScope = scope.setTreeScope; |
17 | 22 | var unwrap = scope.unwrap;
|
18 | 23 | var wrap = scope.wrap;
|
19 | 24 | var wrapIfNeeded = scope.wrapIfNeeded;
|
|
130 | 135 | }
|
131 | 136 |
|
132 | 137 | // http://dom.spec.whatwg.org/#node-is-inserted
|
133 |
| - function nodeWasAdded(node) { |
| 138 | + function nodeWasAdded(node, treeScope) { |
| 139 | + setTreeScope(node, treeScope); |
134 | 140 | node.nodeIsInserted_();
|
135 | 141 | }
|
136 | 142 |
|
137 |
| - function nodesWereAdded(nodes) { |
| 143 | + function nodesWereAdded(nodes, parent) { |
| 144 | + var treeScope = getTreeScope(parent); |
138 | 145 | for (var i = 0; i < nodes.length; i++) {
|
139 |
| - nodeWasAdded(nodes[i]); |
| 146 | + nodeWasAdded(nodes[i], treeScope); |
140 | 147 | }
|
141 | 148 | }
|
142 | 149 |
|
143 | 150 | // http://dom.spec.whatwg.org/#node-is-removed
|
144 | 151 | function nodeWasRemoved(node) {
|
145 |
| - // Nothing at this point in time. |
| 152 | + setTreeScope(node, new TreeScope(node, null)); |
146 | 153 | }
|
147 | 154 |
|
148 | 155 | function nodesWereRemoved(nodes) {
|
149 |
| - // Nothing at this point in time. |
| 156 | + for (var i = 0; i < nodes.length; i++) { |
| 157 | + nodeWasRemoved(nodes[i]); |
| 158 | + } |
150 | 159 | }
|
151 | 160 |
|
152 | 161 | function ensureSameOwnerDocument(parent, child) {
|
|
265 | 274 | }
|
266 | 275 |
|
267 | 276 | function contains(self, child) {
|
268 |
| - // TODO(arv): Optimize using ownerDocument etc. |
| 277 | + if (!child || getTreeScope(self) !== getTreeScope(child)) |
| 278 | + return false; |
| 279 | + |
269 | 280 | for (var node = child; node; node = node.parentNode) {
|
270 | 281 | if (node === self)
|
271 | 282 | return true;
|
|
319 | 330 | * @private
|
320 | 331 | */
|
321 | 332 | this.previousSibling_ = undefined;
|
| 333 | + |
| 334 | + this.treeScope_ = undefined; |
322 | 335 | }
|
323 | 336 |
|
324 | 337 | var OriginalDocumentFragment = window.DocumentFragment;
|
|
407 | 420 | previousSibling: previousNode
|
408 | 421 | });
|
409 | 422 |
|
410 |
| - nodesWereAdded(nodes); |
| 423 | + nodesWereAdded(nodes, this); |
411 | 424 |
|
412 | 425 | return childWrapper;
|
413 | 426 | },
|
|
539 | 552 | });
|
540 | 553 |
|
541 | 554 | nodeWasRemoved(oldChildWrapper);
|
542 |
| - nodesWereAdded(nodes); |
| 555 | + nodesWereAdded(nodes, this); |
543 | 556 |
|
544 | 557 | return oldChildWrapper;
|
545 | 558 | },
|
|
631 | 644 | });
|
632 | 645 |
|
633 | 646 | nodesWereRemoved(removedNodes);
|
634 |
| - nodesWereAdded(addedNodes); |
| 647 | + nodesWereAdded(addedNodes, this); |
635 | 648 | },
|
636 | 649 |
|
637 | 650 | get childNodes() {
|
|
706 | 719 | delete Node.prototype.querySelectorAll;
|
707 | 720 | Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);
|
708 | 721 |
|
| 722 | + scope.cloneNode = cloneNode; |
709 | 723 | scope.nodeWasAdded = nodeWasAdded;
|
710 | 724 | scope.nodeWasRemoved = nodeWasRemoved;
|
711 | 725 | scope.nodesWereAdded = nodesWereAdded;
|
712 | 726 | scope.nodesWereRemoved = nodesWereRemoved;
|
713 | 727 | scope.snapshotNodeList = snapshotNodeList;
|
714 | 728 | scope.wrappers.Node = Node;
|
715 |
| - scope.cloneNode = cloneNode; |
716 | 729 |
|
717 | 730 | })(window.ShadowDOMPolyfill);
|
0 commit comments