Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(147)

Side by Side Diff: pkg/web_components/lib/platform.concat.js

Issue 507653004: update polymer to 0.3.5 (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: updating pubspecs and changelogs to reflect breaking change with bug in web_components Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /** 1 /**
2 * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. 2 * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
3 * This code may only be used under the BSD style license found at http://polyme r.github.io/LICENSE.txt 3 * This code may only be used under the BSD style license found at http://polyme r.github.io/LICENSE.txt
4 * The complete set of authors may be found at http://polymer.github.io/AUTHORS. txt 4 * The complete set of authors may be found at http://polymer.github.io/AUTHORS. txt
5 * The complete set of contributors may be found at http://polymer.github.io/CON TRIBUTORS.txt 5 * The complete set of contributors may be found at http://polymer.github.io/CON TRIBUTORS.txt
6 * Code distributed by Google as part of the polymer project is also 6 * Code distributed by Google as part of the polymer project is also
7 * subject to an additional IP rights grant found at http://polymer.github.io/PA TENTS.txt 7 * subject to an additional IP rights grant found at http://polymer.github.io/PA TENTS.txt
8 */ 8 */
9 9
10 window.Platform = window.Platform || {}; 10 window.Platform = window.Platform || {};
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 entry[1] = value; 88 entry[1] = value;
89 else 89 else
90 defineProperty(key, this.name, {value: [key, value], writable: true}); 90 defineProperty(key, this.name, {value: [key, value], writable: true});
91 }, 91 },
92 get: function(key) { 92 get: function(key) {
93 var entry; 93 var entry;
94 return (entry = key[this.name]) && entry[0] === key ? 94 return (entry = key[this.name]) && entry[0] === key ?
95 entry[1] : undefined; 95 entry[1] : undefined;
96 }, 96 },
97 delete: function(key) { 97 delete: function(key) {
98 this.set(key, undefined); 98 var entry = key[this.name];
99 if (!entry) return false;
100 var hasValue = entry[0] === key;
101 entry[0] = entry[1] = undefined;
102 return hasValue;
103 },
104 has: function(key) {
105 var entry = key[this.name];
106 if (!entry) return false;
107 return entry[0] === key;
99 } 108 }
100 }; 109 };
101 110
102 window.WeakMap = WeakMap; 111 window.WeakMap = WeakMap;
103 })(); 112 })();
104 } 113 }
105 114
106 // Copyright 2012 Google Inc. 115 // Copyright 2012 Google Inc.
107 // 116 //
108 // Licensed under the Apache License, Version 2.0 (the "License"); 117 // Licensed under the Apache License, Version 2.0 (the "License");
109 // you may not use this file except in compliance with the License. 118 // you may not use this file except in compliance with the License.
110 // You may obtain a copy of the License at 119 // You may obtain a copy of the License at
111 // 120 //
112 // http://www.apache.org/licenses/LICENSE-2.0 121 // http://www.apache.org/licenses/LICENSE-2.0
113 // 122 //
114 // Unless required by applicable law or agreed to in writing, software 123 // Unless required by applicable law or agreed to in writing, software
115 // distributed under the License is distributed on an "AS IS" BASIS, 124 // distributed under the License is distributed on an "AS IS" BASIS,
116 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 125 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
117 // See the License for the specific language governing permissions and 126 // See the License for the specific language governing permissions and
118 // limitations under the License. 127 // limitations under the License.
119 128
120 (function(global) { 129 (function(global) {
121 'use strict'; 130 'use strict';
122 131
132 var testingExposeCycleCount = global.testingExposeCycleCount;
133
123 // Detect and do basic sanity checking on Object/Array.observe. 134 // Detect and do basic sanity checking on Object/Array.observe.
124 function detectObjectObserve() { 135 function detectObjectObserve() {
125 if (typeof Object.observe !== 'function' || 136 if (typeof Object.observe !== 'function' ||
126 typeof Array.observe !== 'function') { 137 typeof Array.observe !== 'function') {
127 return false; 138 return false;
128 } 139 }
129 140
130 var records = []; 141 var records = [];
131 142
132 function callback(recs) { 143 function callback(recs) {
(...skipping 30 matching lines...) Expand all
163 174
164 var hasObserve = detectObjectObserve(); 175 var hasObserve = detectObjectObserve();
165 176
166 function detectEval() { 177 function detectEval() {
167 // Don't test for eval if we're running in a Chrome App environment. 178 // Don't test for eval if we're running in a Chrome App environment.
168 // We check for APIs set that only exist in a Chrome App context. 179 // We check for APIs set that only exist in a Chrome App context.
169 if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) { 180 if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {
170 return false; 181 return false;
171 } 182 }
172 183
184 // Firefox OS Apps do not allow eval. This feature detection is very hacky
185 // but even if some other platform adds support for this function this code
186 // will continue to work.
187 if (navigator.getDeviceStorage) {
188 return false;
189 }
190
173 try { 191 try {
174 var f = new Function('', 'return true;'); 192 var f = new Function('', 'return true;');
175 return f(); 193 return f();
176 } catch (ex) { 194 } catch (ex) {
177 return false; 195 return false;
178 } 196 }
179 } 197 }
180 198
181 var hasEval = detectEval(); 199 var hasEval = detectEval();
182 200
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after
537 invalidPath.valid = false; 555 invalidPath.valid = false;
538 invalidPath.getValueFrom = invalidPath.setValueFrom = function() {}; 556 invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};
539 557
540 var MAX_DIRTY_CHECK_CYCLES = 1000; 558 var MAX_DIRTY_CHECK_CYCLES = 1000;
541 559
542 function dirtyCheck(observer) { 560 function dirtyCheck(observer) {
543 var cycles = 0; 561 var cycles = 0;
544 while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) { 562 while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {
545 cycles++; 563 cycles++;
546 } 564 }
547 if (global.testingExposeCycleCount) 565 if (testingExposeCycleCount)
548 global.dirtyCheckCycleCount = cycles; 566 global.dirtyCheckCycleCount = cycles;
549 567
550 return cycles > 0; 568 return cycles > 0;
551 } 569 }
552 570
553 function objectIsEmpty(object) { 571 function objectIsEmpty(object) {
554 for (var prop in object) 572 for (var prop in object)
555 return false; 573 return false;
556 return true; 574 return true;
557 } 575 }
(...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after
936 954
937 if (observer.check_()) 955 if (observer.check_())
938 anyChanged = true; 956 anyChanged = true;
939 957
940 allObservers.push(observer); 958 allObservers.push(observer);
941 } 959 }
942 if (runEOMTasks()) 960 if (runEOMTasks())
943 anyChanged = true; 961 anyChanged = true;
944 } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged); 962 } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);
945 963
946 if (global.testingExposeCycleCount) 964 if (testingExposeCycleCount)
947 global.dirtyCheckCycleCount = cycles; 965 global.dirtyCheckCycleCount = cycles;
948 966
949 runningMicrotaskCheckpoint = false; 967 runningMicrotaskCheckpoint = false;
950 }; 968 };
951 969
952 if (collectObservers) { 970 if (collectObservers) {
953 global.Platform.clearObservers = function() { 971 global.Platform.clearObservers = function() {
954 allObservers = []; 972 allObservers = [];
955 }; 973 };
956 } 974 }
(...skipping 881 matching lines...) Expand 10 before | Expand all | Expand 10 after
1838 var nativePrototypeTable = new WeakMap(); 1856 var nativePrototypeTable = new WeakMap();
1839 var wrappers = Object.create(null); 1857 var wrappers = Object.create(null);
1840 1858
1841 function detectEval() { 1859 function detectEval() {
1842 // Don't test for eval if we're running in a Chrome App environment. 1860 // Don't test for eval if we're running in a Chrome App environment.
1843 // We check for APIs set that only exist in a Chrome App context. 1861 // We check for APIs set that only exist in a Chrome App context.
1844 if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) { 1862 if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {
1845 return false; 1863 return false;
1846 } 1864 }
1847 1865
1866 // Firefox OS Apps do not allow eval. This feature detection is very hacky
1867 // but even if some other platform adds support for this function this code
1868 // will continue to work.
1869 if (navigator.getDeviceStorage) {
1870 return false;
1871 }
1872
1848 try { 1873 try {
1849 var f = new Function('return true;'); 1874 var f = new Function('return true;');
1850 return f(); 1875 return f();
1851 } catch (ex) { 1876 } catch (ex) {
1852 return false; 1877 return false;
1853 } 1878 }
1854 } 1879 }
1855 1880
1856 var hasEval = detectEval(); 1881 var hasEval = detectEval();
1857 1882
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
1949 }; 1974 };
1950 1975
1951 function isEventHandlerName(name) { 1976 function isEventHandlerName(name) {
1952 return /^on[a-z]+$/.test(name); 1977 return /^on[a-z]+$/.test(name);
1953 } 1978 }
1954 1979
1955 function isIdentifierName(name) { 1980 function isIdentifierName(name) {
1956 return /^\w[a-zA-Z_0-9]*$/.test(name); 1981 return /^\w[a-zA-Z_0-9]*$/.test(name);
1957 } 1982 }
1958 1983
1984 // The name of the implementation property is intentionally hard to
1985 // remember. Unfortunately, browsers are slower doing obj[expr] than
1986 // obj.foo so we resort to repeat this ugly name. This ugly name is never
1987 // used outside of this file though.
1988
1959 function getGetter(name) { 1989 function getGetter(name) {
1960 return hasEval && isIdentifierName(name) ? 1990 return hasEval && isIdentifierName(name) ?
1961 new Function('return this.impl.' + name) : 1991 new Function('return this.__impl4cf1e782hg__.' + name) :
1962 function() { return this.impl[name]; }; 1992 function() { return this.__impl4cf1e782hg__[name]; };
1963 } 1993 }
1964 1994
1965 function getSetter(name) { 1995 function getSetter(name) {
1966 return hasEval && isIdentifierName(name) ? 1996 return hasEval && isIdentifierName(name) ?
1967 new Function('v', 'this.impl.' + name + ' = v') : 1997 new Function('v', 'this.__impl4cf1e782hg__.' + name + ' = v') :
1968 function(v) { this.impl[name] = v; }; 1998 function(v) { this.__impl4cf1e782hg__[name] = v; };
1969 } 1999 }
1970 2000
1971 function getMethod(name) { 2001 function getMethod(name) {
1972 return hasEval && isIdentifierName(name) ? 2002 return hasEval && isIdentifierName(name) ?
1973 new Function('return this.impl.' + name + 2003 new Function('return this.__impl4cf1e782hg__.' + name +
1974 '.apply(this.impl, arguments)') : 2004 '.apply(this.__impl4cf1e782hg__, arguments)') :
1975 function() { return this.impl[name].apply(this.impl, arguments); }; 2005 function() {
2006 return this.__impl4cf1e782hg__[name].apply(
2007 this.__impl4cf1e782hg__, arguments);
2008 };
1976 } 2009 }
1977 2010
1978 function getDescriptor(source, name) { 2011 function getDescriptor(source, name) {
1979 try { 2012 try {
1980 return Object.getOwnPropertyDescriptor(source, name); 2013 return Object.getOwnPropertyDescriptor(source, name);
1981 } catch (ex) { 2014 } catch (ex) {
1982 // JSC and V8 both use data properties instead of accessors which can 2015 // JSC and V8 both use data properties instead of accessors which can
1983 // cause getting the property desciptor to throw an exception. 2016 // cause getting the property desciptor to throw an exception.
1984 // https://bugs.webkit.org/show_bug.cgi?id=49739 2017 // https://bugs.webkit.org/show_bug.cgi?id=49739
1985 return dummyDescriptor; 2018 return dummyDescriptor;
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
2086 function GeneratedWrapper(node) { 2119 function GeneratedWrapper(node) {
2087 superWrapperConstructor.call(this, node); 2120 superWrapperConstructor.call(this, node);
2088 } 2121 }
2089 var p = Object.create(superWrapperConstructor.prototype); 2122 var p = Object.create(superWrapperConstructor.prototype);
2090 p.constructor = GeneratedWrapper; 2123 p.constructor = GeneratedWrapper;
2091 GeneratedWrapper.prototype = p; 2124 GeneratedWrapper.prototype = p;
2092 2125
2093 return GeneratedWrapper; 2126 return GeneratedWrapper;
2094 } 2127 }
2095 2128
2096 var OriginalDOMImplementation = window.DOMImplementation;
2097 var OriginalEventTarget = window.EventTarget;
2098 var OriginalEvent = window.Event;
2099 var OriginalNode = window.Node;
2100 var OriginalWindow = window.Window;
2101 var OriginalRange = window.Range;
2102 var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;
2103 var OriginalWebGLRenderingContext = window.WebGLRenderingContext;
2104 var OriginalSVGElementInstance = window.SVGElementInstance;
2105
2106 function isWrapper(object) { 2129 function isWrapper(object) {
2107 return object instanceof wrappers.EventTarget || 2130 return object && object.__impl4cf1e782hg__;
2108 object instanceof wrappers.Event ||
2109 object instanceof wrappers.Range ||
2110 object instanceof wrappers.DOMImplementation ||
2111 object instanceof wrappers.CanvasRenderingContext2D ||
2112 wrappers.WebGLRenderingContext &&
2113 object instanceof wrappers.WebGLRenderingContext;
2114 } 2131 }
2115 2132
2116 function isNative(object) { 2133 function isNative(object) {
2117 return OriginalEventTarget && object instanceof OriginalEventTarget || 2134 return !isWrapper(object);
2118 object instanceof OriginalNode ||
2119 object instanceof OriginalEvent ||
2120 object instanceof OriginalWindow ||
2121 object instanceof OriginalRange ||
2122 object instanceof OriginalDOMImplementation ||
2123 object instanceof OriginalCanvasRenderingContext2D ||
2124 OriginalWebGLRenderingContext &&
2125 object instanceof OriginalWebGLRenderingContext ||
2126 OriginalSVGElementInstance &&
2127 object instanceof OriginalSVGElementInstance;
2128 } 2135 }
2129 2136
2130 /** 2137 /**
2131 * Wraps a node in a WrapperNode. If there already exists a wrapper for the 2138 * Wraps a node in a WrapperNode. If there already exists a wrapper for the
2132 * |node| that wrapper is returned instead. 2139 * |node| that wrapper is returned instead.
2133 * @param {Node} node 2140 * @param {Node} node
2134 * @return {WrapperNode} 2141 * @return {WrapperNode}
2135 */ 2142 */
2136 function wrap(impl) { 2143 function wrap(impl) {
2137 if (impl === null) 2144 if (impl === null)
2138 return null; 2145 return null;
2139 2146
2140 assert(isNative(impl)); 2147 assert(isNative(impl));
2141 return impl.polymerWrapper_ || 2148 return impl.__wrapper8e3dd93a60__ ||
2142 (impl.polymerWrapper_ = new (getWrapperConstructor(impl))(impl)); 2149 (impl.__wrapper8e3dd93a60__ = new (getWrapperConstructor(impl))(impl));
2143 } 2150 }
2144 2151
2145 /** 2152 /**
2146 * Unwraps a wrapper and returns the node it is wrapping. 2153 * Unwraps a wrapper and returns the node it is wrapping.
2147 * @param {WrapperNode} wrapper 2154 * @param {WrapperNode} wrapper
2148 * @return {Node} 2155 * @return {Node}
2149 */ 2156 */
2150 function unwrap(wrapper) { 2157 function unwrap(wrapper) {
2151 if (wrapper === null) 2158 if (wrapper === null)
2152 return null; 2159 return null;
2153 assert(isWrapper(wrapper)); 2160 assert(isWrapper(wrapper));
2154 return wrapper.impl; 2161 return wrapper.__impl4cf1e782hg__;
2162 }
2163
2164 function unsafeUnwrap(wrapper) {
2165 return wrapper.__impl4cf1e782hg__;
2166 }
2167
2168 function setWrapper(impl, wrapper) {
2169 wrapper.__impl4cf1e782hg__ = impl;
2170 impl.__wrapper8e3dd93a60__ = wrapper;
2155 } 2171 }
2156 2172
2157 /** 2173 /**
2158 * Unwraps object if it is a wrapper. 2174 * Unwraps object if it is a wrapper.
2159 * @param {Object} object 2175 * @param {Object} object
2160 * @return {Object} The native implementation object. 2176 * @return {Object} The native implementation object.
2161 */ 2177 */
2162 function unwrapIfNeeded(object) { 2178 function unwrapIfNeeded(object) {
2163 return object && isWrapper(object) ? unwrap(object) : object; 2179 return object && isWrapper(object) ? unwrap(object) : object;
2164 } 2180 }
(...skipping 11 matching lines...) Expand all
2176 * Overrides the current wrapper (if any) for node. 2192 * Overrides the current wrapper (if any) for node.
2177 * @param {Node} node 2193 * @param {Node} node
2178 * @param {WrapperNode=} wrapper If left out the wrapper will be created as 2194 * @param {WrapperNode=} wrapper If left out the wrapper will be created as
2179 * needed next time someone wraps the node. 2195 * needed next time someone wraps the node.
2180 */ 2196 */
2181 function rewrap(node, wrapper) { 2197 function rewrap(node, wrapper) {
2182 if (wrapper === null) 2198 if (wrapper === null)
2183 return; 2199 return;
2184 assert(isNative(node)); 2200 assert(isNative(node));
2185 assert(wrapper === undefined || isWrapper(wrapper)); 2201 assert(wrapper === undefined || isWrapper(wrapper));
2186 node.polymerWrapper_ = wrapper; 2202 node.__wrapper8e3dd93a60__ = wrapper;
2187 } 2203 }
2188 2204
2189 var getterDescriptor = { 2205 var getterDescriptor = {
2190 get: undefined, 2206 get: undefined,
2191 configurable: true, 2207 configurable: true,
2192 enumerable: true 2208 enumerable: true
2193 }; 2209 };
2194 2210
2195 function defineGetter(constructor, name, getter) { 2211 function defineGetter(constructor, name, getter) {
2196 getterDescriptor.get = getter; 2212 getterDescriptor.get = getter;
2197 defineProperty(constructor.prototype, name, getterDescriptor); 2213 defineProperty(constructor.prototype, name, getterDescriptor);
2198 } 2214 }
2199 2215
2200 function defineWrapGetter(constructor, name) { 2216 function defineWrapGetter(constructor, name) {
2201 defineGetter(constructor, name, function() { 2217 defineGetter(constructor, name, function() {
2202 return wrap(this.impl[name]); 2218 return wrap(this.__impl4cf1e782hg__[name]);
2203 }); 2219 });
2204 } 2220 }
2205 2221
2206 /** 2222 /**
2207 * Forwards existing methods on the native object to the wrapper methods. 2223 * Forwards existing methods on the native object to the wrapper methods.
2208 * This does not wrap any of the arguments or the return value since the 2224 * This does not wrap any of the arguments or the return value since the
2209 * wrapper implementation already takes care of that. 2225 * wrapper implementation already takes care of that.
2210 * @param {Array.<Function>} constructors 2226 * @param {Array.<Function>} constructors
2211 * @parem {Array.<string>} names 2227 * @parem {Array.<string>} names
2212 */ 2228 */
(...skipping 14 matching lines...) Expand all
2227 scope.defineWrapGetter = defineWrapGetter; 2243 scope.defineWrapGetter = defineWrapGetter;
2228 scope.forwardMethodsToWrapper = forwardMethodsToWrapper; 2244 scope.forwardMethodsToWrapper = forwardMethodsToWrapper;
2229 scope.isWrapper = isWrapper; 2245 scope.isWrapper = isWrapper;
2230 scope.isWrapperFor = isWrapperFor; 2246 scope.isWrapperFor = isWrapperFor;
2231 scope.mixin = mixin; 2247 scope.mixin = mixin;
2232 scope.nativePrototypeTable = nativePrototypeTable; 2248 scope.nativePrototypeTable = nativePrototypeTable;
2233 scope.oneOf = oneOf; 2249 scope.oneOf = oneOf;
2234 scope.registerObject = registerObject; 2250 scope.registerObject = registerObject;
2235 scope.registerWrapper = register; 2251 scope.registerWrapper = register;
2236 scope.rewrap = rewrap; 2252 scope.rewrap = rewrap;
2253 scope.setWrapper = setWrapper;
2254 scope.unsafeUnwrap = unsafeUnwrap;
2237 scope.unwrap = unwrap; 2255 scope.unwrap = unwrap;
2238 scope.unwrapIfNeeded = unwrapIfNeeded; 2256 scope.unwrapIfNeeded = unwrapIfNeeded;
2239 scope.wrap = wrap; 2257 scope.wrap = wrap;
2240 scope.wrapIfNeeded = wrapIfNeeded; 2258 scope.wrapIfNeeded = wrapIfNeeded;
2241 scope.wrappers = wrappers; 2259 scope.wrappers = wrappers;
2242 2260
2243 })(window.ShadowDOMPolyfill); 2261 })(window.ShadowDOMPolyfill);
2244 2262
2245 /* 2263 /*
2246 * Copyright 2013 The Polymer Authors. All rights reserved. 2264 * Copyright 2013 The Polymer Authors. All rights reserved.
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after
2542 this.callback_ = callback; 2560 this.callback_ = callback;
2543 this.nodes_ = []; 2561 this.nodes_ = [];
2544 this.records_ = []; 2562 this.records_ = [];
2545 this.uid_ = ++uidCounter; 2563 this.uid_ = ++uidCounter;
2546 2564
2547 // This will leak. There is no way to implement this without WeakRefs :'( 2565 // This will leak. There is no way to implement this without WeakRefs :'(
2548 globalMutationObservers.push(this); 2566 globalMutationObservers.push(this);
2549 } 2567 }
2550 2568
2551 MutationObserver.prototype = { 2569 MutationObserver.prototype = {
2570 constructor: MutationObserver,
2571
2552 // http://dom.spec.whatwg.org/#dom-mutationobserver-observe 2572 // http://dom.spec.whatwg.org/#dom-mutationobserver-observe
2553 observe: function(target, options) { 2573 observe: function(target, options) {
2554 target = wrapIfNeeded(target); 2574 target = wrapIfNeeded(target);
2555 2575
2556 var newOptions = new MutationObserverOptions(options); 2576 var newOptions = new MutationObserverOptions(options);
2557 2577
2558 // 6. 2578 // 6.
2559 var registration; 2579 var registration;
2560 var registrations = registrationsTable.get(target); 2580 var registrations = registrationsTable.get(target);
2561 if (!registrations) 2581 if (!registrations)
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
2751 // Use of this source code is goverened by a BSD-style 2771 // Use of this source code is goverened by a BSD-style
2752 // license that can be found in the LICENSE file. 2772 // license that can be found in the LICENSE file.
2753 2773
2754 (function(scope) { 2774 (function(scope) {
2755 'use strict'; 2775 'use strict';
2756 2776
2757 var forwardMethodsToWrapper = scope.forwardMethodsToWrapper; 2777 var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;
2758 var getTreeScope = scope.getTreeScope; 2778 var getTreeScope = scope.getTreeScope;
2759 var mixin = scope.mixin; 2779 var mixin = scope.mixin;
2760 var registerWrapper = scope.registerWrapper; 2780 var registerWrapper = scope.registerWrapper;
2781 var setWrapper = scope.setWrapper;
2782 var unsafeUnwrap = scope.unsafeUnwrap;
2761 var unwrap = scope.unwrap; 2783 var unwrap = scope.unwrap;
2762 var wrap = scope.wrap; 2784 var wrap = scope.wrap;
2763 var wrappers = scope.wrappers; 2785 var wrappers = scope.wrappers;
2764 2786
2765 var wrappedFuns = new WeakMap(); 2787 var wrappedFuns = new WeakMap();
2766 var listenersTable = new WeakMap(); 2788 var listenersTable = new WeakMap();
2767 var handledEventsTable = new WeakMap(); 2789 var handledEventsTable = new WeakMap();
2768 var currentlyDispatchingEvents = new WeakMap(); 2790 var currentlyDispatchingEvents = new WeakMap();
2769 var targetTable = new WeakMap(); 2791 var targetTable = new WeakMap();
2770 var currentTargetTable = new WeakMap(); 2792 var currentTargetTable = new WeakMap();
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after
3205 3227
3206 /** 3228 /**
3207 * Creates a new Event wrapper or wraps an existin native Event object. 3229 * Creates a new Event wrapper or wraps an existin native Event object.
3208 * @param {string|Event} type 3230 * @param {string|Event} type
3209 * @param {Object=} options 3231 * @param {Object=} options
3210 * @constructor 3232 * @constructor
3211 */ 3233 */
3212 function Event(type, options) { 3234 function Event(type, options) {
3213 if (type instanceof OriginalEvent) { 3235 if (type instanceof OriginalEvent) {
3214 var impl = type; 3236 var impl = type;
3215 if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload') 3237 if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload') {
3216 return new BeforeUnloadEvent(impl); 3238 return new BeforeUnloadEvent(impl);
3217 this.impl = impl; 3239 }
3240 setWrapper(impl, this);
3218 } else { 3241 } else {
3219 return wrap(constructEvent(OriginalEvent, 'Event', type, options)); 3242 return wrap(constructEvent(OriginalEvent, 'Event', type, options));
3220 } 3243 }
3221 } 3244 }
3222 Event.prototype = { 3245 Event.prototype = {
3223 get target() { 3246 get target() {
3224 return targetTable.get(this); 3247 return targetTable.get(this);
3225 }, 3248 },
3226 get currentTarget() { 3249 get currentTarget() {
3227 return currentTargetTable.get(this); 3250 return currentTargetTable.get(this);
(...skipping 23 matching lines...) Expand all
3251 return options; 3274 return options;
3252 return Object.create(options, { 3275 return Object.create(options, {
3253 relatedTarget: {value: unwrap(options.relatedTarget)} 3276 relatedTarget: {value: unwrap(options.relatedTarget)}
3254 }); 3277 });
3255 } 3278 }
3256 3279
3257 function registerGenericEvent(name, SuperEvent, prototype) { 3280 function registerGenericEvent(name, SuperEvent, prototype) {
3258 var OriginalEvent = window[name]; 3281 var OriginalEvent = window[name];
3259 var GenericEvent = function(type, options) { 3282 var GenericEvent = function(type, options) {
3260 if (type instanceof OriginalEvent) 3283 if (type instanceof OriginalEvent)
3261 this.impl = type; 3284 setWrapper(type, this);
3262 else 3285 else
3263 return wrap(constructEvent(OriginalEvent, name, type, options)); 3286 return wrap(constructEvent(OriginalEvent, name, type, options));
3264 }; 3287 };
3265 GenericEvent.prototype = Object.create(SuperEvent.prototype); 3288 GenericEvent.prototype = Object.create(SuperEvent.prototype);
3266 if (prototype) 3289 if (prototype)
3267 mixin(GenericEvent.prototype, prototype); 3290 mixin(GenericEvent.prototype, prototype);
3268 if (OriginalEvent) { 3291 if (OriginalEvent) {
3269 // - Old versions of Safari fails on new FocusEvent (and others?). 3292 // - Old versions of Safari fails on new FocusEvent (and others?).
3270 // - IE does not support event constructors. 3293 // - IE does not support event constructors.
3271 // - createEvent('FocusEvent') throws in Firefox. 3294 // - createEvent('FocusEvent') throws in Firefox.
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
3382 // Safari 7 does not yet have BeforeUnloadEvent. 3405 // Safari 7 does not yet have BeforeUnloadEvent.
3383 // https://bugs.webkit.org/show_bug.cgi?id=120849 3406 // https://bugs.webkit.org/show_bug.cgi?id=120849
3384 var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent; 3407 var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent;
3385 3408
3386 function BeforeUnloadEvent(impl) { 3409 function BeforeUnloadEvent(impl) {
3387 Event.call(this, impl); 3410 Event.call(this, impl);
3388 } 3411 }
3389 BeforeUnloadEvent.prototype = Object.create(Event.prototype); 3412 BeforeUnloadEvent.prototype = Object.create(Event.prototype);
3390 mixin(BeforeUnloadEvent.prototype, { 3413 mixin(BeforeUnloadEvent.prototype, {
3391 get returnValue() { 3414 get returnValue() {
3392 return this.impl.returnValue; 3415 return unsafeUnwrap(this).returnValue;
3393 }, 3416 },
3394 set returnValue(v) { 3417 set returnValue(v) {
3395 this.impl.returnValue = v; 3418 unsafeUnwrap(this).returnValue = v;
3396 } 3419 }
3397 }); 3420 });
3398 3421
3399 if (OriginalBeforeUnloadEvent) 3422 if (OriginalBeforeUnloadEvent)
3400 registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent); 3423 registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent);
3401 3424
3402 function isValidListener(fun) { 3425 function isValidListener(fun) {
3403 if (typeof fun === 'function') 3426 if (typeof fun === 'function')
3404 return true; 3427 return true;
3405 return fun && fun.handleEvent; 3428 return fun && fun.handleEvent;
(...skipping 16 matching lines...) Expand all
3422 } 3445 }
3423 3446
3424 var OriginalEventTarget = window.EventTarget; 3447 var OriginalEventTarget = window.EventTarget;
3425 3448
3426 /** 3449 /**
3427 * This represents a wrapper for an EventTarget. 3450 * This represents a wrapper for an EventTarget.
3428 * @param {!EventTarget} impl The original event target. 3451 * @param {!EventTarget} impl The original event target.
3429 * @constructor 3452 * @constructor
3430 */ 3453 */
3431 function EventTarget(impl) { 3454 function EventTarget(impl) {
3432 this.impl = impl; 3455 setWrapper(impl, this);
3433 } 3456 }
3434 3457
3435 // Node and Window have different internal type checks in WebKit so we cannot 3458 // Node and Window have different internal type checks in WebKit so we cannot
3436 // use the same method as the original function. 3459 // use the same method as the original function.
3437 var methodNames = [ 3460 var methodNames = [
3438 'addEventListener', 3461 'addEventListener',
3439 'removeEventListener', 3462 'removeEventListener',
3440 'dispatchEvent' 3463 'dispatchEvent'
3441 ]; 3464 ];
3442 3465
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
3560 3583
3561 function wrapEventTargetMethods(constructors) { 3584 function wrapEventTargetMethods(constructors) {
3562 forwardMethodsToWrapper(constructors, methodNames); 3585 forwardMethodsToWrapper(constructors, methodNames);
3563 } 3586 }
3564 3587
3565 var originalElementFromPoint = document.elementFromPoint; 3588 var originalElementFromPoint = document.elementFromPoint;
3566 3589
3567 function elementFromPoint(self, document, x, y) { 3590 function elementFromPoint(self, document, x, y) {
3568 scope.renderAllPending(); 3591 scope.renderAllPending();
3569 3592
3570 var element = wrap(originalElementFromPoint.call(document.impl, x, y)); 3593 var element =
3594 wrap(originalElementFromPoint.call(unsafeUnwrap(document), x, y));
3571 if (!element) 3595 if (!element)
3572 return null; 3596 return null;
3573 var path = getEventPath(element, null); 3597 var path = getEventPath(element, null);
3574 3598
3575 // scope the path to this TreeScope 3599 // scope the path to this TreeScope
3576 var idx = path.lastIndexOf(self); 3600 var idx = path.lastIndexOf(self);
3577 if (idx == -1) 3601 if (idx == -1)
3578 return null; 3602 return null;
3579 else 3603 else
3580 path = path.slice(0, idx); 3604 path = path.slice(0, idx);
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
3653 * Use of this source code is goverened by a BSD-style 3677 * Use of this source code is goverened by a BSD-style
3654 * license that can be found in the LICENSE file. 3678 * license that can be found in the LICENSE file.
3655 */ 3679 */
3656 3680
3657 (function(scope) { 3681 (function(scope) {
3658 'use strict'; 3682 'use strict';
3659 3683
3660 var UIEvent = scope.wrappers.UIEvent; 3684 var UIEvent = scope.wrappers.UIEvent;
3661 var mixin = scope.mixin; 3685 var mixin = scope.mixin;
3662 var registerWrapper = scope.registerWrapper; 3686 var registerWrapper = scope.registerWrapper;
3663 var unwrap = scope.unwrap; 3687 var setWrapper = scope.setWrapper;
3688 var unsafeUnwrap = scope.unsafeUnwrap;
3664 var wrap = scope.wrap; 3689 var wrap = scope.wrap;
3665 3690
3666 // TouchEvent is WebKit/Blink only. 3691 // TouchEvent is WebKit/Blink only.
3667 var OriginalTouchEvent = window.TouchEvent; 3692 var OriginalTouchEvent = window.TouchEvent;
3668 if (!OriginalTouchEvent) 3693 if (!OriginalTouchEvent)
3669 return; 3694 return;
3670 3695
3671 var nativeEvent; 3696 var nativeEvent;
3672 try { 3697 try {
3673 nativeEvent = document.createEvent('TouchEvent'); 3698 nativeEvent = document.createEvent('TouchEvent');
3674 } catch (ex) { 3699 } catch (ex) {
3675 // In Chrome creating a TouchEvent fails if the feature is not turned on 3700 // In Chrome creating a TouchEvent fails if the feature is not turned on
3676 // which it isn't on desktop Chrome. 3701 // which it isn't on desktop Chrome.
3677 return; 3702 return;
3678 } 3703 }
3679 3704
3680 var nonEnumDescriptor = {enumerable: false}; 3705 var nonEnumDescriptor = {enumerable: false};
3681 3706
3682 function nonEnum(obj, prop) { 3707 function nonEnum(obj, prop) {
3683 Object.defineProperty(obj, prop, nonEnumDescriptor); 3708 Object.defineProperty(obj, prop, nonEnumDescriptor);
3684 } 3709 }
3685 3710
3686 function Touch(impl) { 3711 function Touch(impl) {
3687 this.impl = impl; 3712 setWrapper(impl, this);
3688 } 3713 }
3689 3714
3690 Touch.prototype = { 3715 Touch.prototype = {
3691 get target() { 3716 get target() {
3692 return wrap(this.impl.target); 3717 return wrap(unsafeUnwrap(this).target);
3693 } 3718 }
3694 }; 3719 };
3695 3720
3696 var descr = { 3721 var descr = {
3697 configurable: true, 3722 configurable: true,
3698 enumerable: true, 3723 enumerable: true,
3699 get: null 3724 get: null
3700 }; 3725 };
3701 3726
3702 [ 3727 [
3703 'clientX', 3728 'clientX',
3704 'clientY', 3729 'clientY',
3705 'screenX', 3730 'screenX',
3706 'screenY', 3731 'screenY',
3707 'pageX', 3732 'pageX',
3708 'pageY', 3733 'pageY',
3709 'identifier', 3734 'identifier',
3710 'webkitRadiusX', 3735 'webkitRadiusX',
3711 'webkitRadiusY', 3736 'webkitRadiusY',
3712 'webkitRotationAngle', 3737 'webkitRotationAngle',
3713 'webkitForce' 3738 'webkitForce'
3714 ].forEach(function(name) { 3739 ].forEach(function(name) {
3715 descr.get = function() { 3740 descr.get = function() {
3716 return this.impl[name]; 3741 return unsafeUnwrap(this)[name];
3717 }; 3742 };
3718 Object.defineProperty(Touch.prototype, name, descr); 3743 Object.defineProperty(Touch.prototype, name, descr);
3719 }); 3744 });
3720 3745
3721 function TouchList() { 3746 function TouchList() {
3722 this.length = 0; 3747 this.length = 0;
3723 nonEnum(this, 'length'); 3748 nonEnum(this, 'length');
3724 } 3749 }
3725 3750
3726 TouchList.prototype = { 3751 TouchList.prototype = {
(...skipping 12 matching lines...) Expand all
3739 } 3764 }
3740 3765
3741 function TouchEvent(impl) { 3766 function TouchEvent(impl) {
3742 UIEvent.call(this, impl); 3767 UIEvent.call(this, impl);
3743 } 3768 }
3744 3769
3745 TouchEvent.prototype = Object.create(UIEvent.prototype); 3770 TouchEvent.prototype = Object.create(UIEvent.prototype);
3746 3771
3747 mixin(TouchEvent.prototype, { 3772 mixin(TouchEvent.prototype, {
3748 get touches() { 3773 get touches() {
3749 return wrapTouchList(unwrap(this).touches); 3774 return wrapTouchList(unsafeUnwrap(this).touches);
3750 }, 3775 },
3751 3776
3752 get targetTouches() { 3777 get targetTouches() {
3753 return wrapTouchList(unwrap(this).targetTouches); 3778 return wrapTouchList(unsafeUnwrap(this).targetTouches);
3754 }, 3779 },
3755 3780
3756 get changedTouches() { 3781 get changedTouches() {
3757 return wrapTouchList(unwrap(this).changedTouches); 3782 return wrapTouchList(unsafeUnwrap(this).changedTouches);
3758 }, 3783 },
3759 3784
3760 initTouchEvent: function() { 3785 initTouchEvent: function() {
3761 // The only way to use this is to reuse the TouchList from an existing 3786 // The only way to use this is to reuse the TouchList from an existing
3762 // TouchEvent. Since this is WebKit/Blink proprietary API we will not 3787 // TouchEvent. Since this is WebKit/Blink proprietary API we will not
3763 // implement this until someone screams. 3788 // implement this until someone screams.
3764 throw new Error('Not implemented'); 3789 throw new Error('Not implemented');
3765 } 3790 }
3766 }); 3791 });
3767 3792
3768 registerWrapper(OriginalTouchEvent, TouchEvent, nativeEvent); 3793 registerWrapper(OriginalTouchEvent, TouchEvent, nativeEvent);
3769 3794
3770 scope.wrappers.Touch = Touch; 3795 scope.wrappers.Touch = Touch;
3771 scope.wrappers.TouchEvent = TouchEvent; 3796 scope.wrappers.TouchEvent = TouchEvent;
3772 scope.wrappers.TouchList = TouchList; 3797 scope.wrappers.TouchList = TouchList;
3773 3798
3774 })(window.ShadowDOMPolyfill); 3799 })(window.ShadowDOMPolyfill);
3775 3800
3776 3801
3777 // Copyright 2012 The Polymer Authors. All rights reserved. 3802 // Copyright 2012 The Polymer Authors. All rights reserved.
3778 // Use of this source code is goverened by a BSD-style 3803 // Use of this source code is goverened by a BSD-style
3779 // license that can be found in the LICENSE file. 3804 // license that can be found in the LICENSE file.
3780 3805
3781 (function(scope) { 3806 (function(scope) {
3782 'use strict'; 3807 'use strict';
3783 3808
3809 var unsafeUnwrap = scope.unsafeUnwrap;
3784 var wrap = scope.wrap; 3810 var wrap = scope.wrap;
3785 3811
3786 var nonEnumDescriptor = {enumerable: false}; 3812 var nonEnumDescriptor = {enumerable: false};
3787 3813
3788 function nonEnum(obj, prop) { 3814 function nonEnum(obj, prop) {
3789 Object.defineProperty(obj, prop, nonEnumDescriptor); 3815 Object.defineProperty(obj, prop, nonEnumDescriptor);
3790 } 3816 }
3791 3817
3792 function NodeList() { 3818 function NodeList() {
3793 this.length = 0; 3819 this.length = 0;
(...skipping 12 matching lines...) Expand all
3806 var wrapperList = new NodeList(); 3832 var wrapperList = new NodeList();
3807 for (var i = 0, length = list.length; i < length; i++) { 3833 for (var i = 0, length = list.length; i < length; i++) {
3808 wrapperList[i] = wrap(list[i]); 3834 wrapperList[i] = wrap(list[i]);
3809 } 3835 }
3810 wrapperList.length = length; 3836 wrapperList.length = length;
3811 return wrapperList; 3837 return wrapperList;
3812 } 3838 }
3813 3839
3814 function addWrapNodeListMethod(wrapperConstructor, name) { 3840 function addWrapNodeListMethod(wrapperConstructor, name) {
3815 wrapperConstructor.prototype[name] = function() { 3841 wrapperConstructor.prototype[name] = function() {
3816 return wrapNodeList(this.impl[name].apply(this.impl, arguments)); 3842 return wrapNodeList(
3843 unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments));
3817 }; 3844 };
3818 } 3845 }
3819 3846
3820 scope.wrappers.NodeList = NodeList; 3847 scope.wrappers.NodeList = NodeList;
3821 scope.addWrapNodeListMethod = addWrapNodeListMethod; 3848 scope.addWrapNodeListMethod = addWrapNodeListMethod;
3822 scope.wrapNodeList = wrapNodeList; 3849 scope.wrapNodeList = wrapNodeList;
3823 3850
3824 })(window.ShadowDOMPolyfill); 3851 })(window.ShadowDOMPolyfill);
3825 3852
3826 /* 3853 /*
(...skipping 26 matching lines...) Expand all
3853 var TreeScope = scope.TreeScope; 3880 var TreeScope = scope.TreeScope;
3854 var assert = scope.assert; 3881 var assert = scope.assert;
3855 var defineWrapGetter = scope.defineWrapGetter; 3882 var defineWrapGetter = scope.defineWrapGetter;
3856 var enqueueMutation = scope.enqueueMutation; 3883 var enqueueMutation = scope.enqueueMutation;
3857 var getTreeScope = scope.getTreeScope; 3884 var getTreeScope = scope.getTreeScope;
3858 var isWrapper = scope.isWrapper; 3885 var isWrapper = scope.isWrapper;
3859 var mixin = scope.mixin; 3886 var mixin = scope.mixin;
3860 var registerTransientObservers = scope.registerTransientObservers; 3887 var registerTransientObservers = scope.registerTransientObservers;
3861 var registerWrapper = scope.registerWrapper; 3888 var registerWrapper = scope.registerWrapper;
3862 var setTreeScope = scope.setTreeScope; 3889 var setTreeScope = scope.setTreeScope;
3890 var unsafeUnwrap = scope.unsafeUnwrap;
3863 var unwrap = scope.unwrap; 3891 var unwrap = scope.unwrap;
3864 var unwrapIfNeeded = scope.unwrapIfNeeded; 3892 var unwrapIfNeeded = scope.unwrapIfNeeded;
3865 var wrap = scope.wrap; 3893 var wrap = scope.wrap;
3866 var wrapIfNeeded = scope.wrapIfNeeded; 3894 var wrapIfNeeded = scope.wrapIfNeeded;
3867 var wrappers = scope.wrappers; 3895 var wrappers = scope.wrappers;
3868 3896
3869 function assertIsNodeWrapper(node) { 3897 function assertIsNodeWrapper(node) {
3870 assert(node instanceof Node); 3898 assert(node instanceof Node);
3871 } 3899 }
3872 3900
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
4086 n.parentNode.removeChild(n); 4114 n.parentNode.removeChild(n);
4087 } 4115 }
4088 } 4116 }
4089 4117
4090 var originalImportNode = document.importNode; 4118 var originalImportNode = document.importNode;
4091 var originalCloneNode = window.Node.prototype.cloneNode; 4119 var originalCloneNode = window.Node.prototype.cloneNode;
4092 4120
4093 function cloneNode(node, deep, opt_doc) { 4121 function cloneNode(node, deep, opt_doc) {
4094 var clone; 4122 var clone;
4095 if (opt_doc) 4123 if (opt_doc)
4096 clone = wrap(originalImportNode.call(opt_doc, node.impl, false)); 4124 clone = wrap(originalImportNode.call(opt_doc, unsafeUnwrap(node), false));
4097 else 4125 else
4098 clone = wrap(originalCloneNode.call(node.impl, false)); 4126 clone = wrap(originalCloneNode.call(unsafeUnwrap(node), false));
4099 4127
4100 if (deep) { 4128 if (deep) {
4101 for (var child = node.firstChild; child; child = child.nextSibling) { 4129 for (var child = node.firstChild; child; child = child.nextSibling) {
4102 clone.appendChild(cloneNode(child, true, opt_doc)); 4130 clone.appendChild(cloneNode(child, true, opt_doc));
4103 } 4131 }
4104 4132
4105 if (node instanceof wrappers.HTMLTemplateElement) { 4133 if (node instanceof wrappers.HTMLTemplateElement) {
4106 var cloneContent = clone.content; 4134 var cloneContent = clone.content;
4107 for (var child = node.content.firstChild; 4135 for (var child = node.content.firstChild;
4108 child; 4136 child;
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
4231 !invalidateParent(childWrapper); 4259 !invalidateParent(childWrapper);
4232 4260
4233 if (useNative) 4261 if (useNative)
4234 nodes = collectNodesNative(childWrapper); 4262 nodes = collectNodesNative(childWrapper);
4235 else 4263 else
4236 nodes = collectNodes(childWrapper, this, previousNode, refWrapper); 4264 nodes = collectNodes(childWrapper, this, previousNode, refWrapper);
4237 4265
4238 if (useNative) { 4266 if (useNative) {
4239 ensureSameOwnerDocument(this, childWrapper); 4267 ensureSameOwnerDocument(this, childWrapper);
4240 clearChildNodes(this); 4268 clearChildNodes(this);
4241 originalInsertBefore.call(this.impl, unwrap(childWrapper), refNode); 4269 originalInsertBefore.call(unsafeUnwrap(this), unwrap(childWrapper), refN ode);
4242 } else { 4270 } else {
4243 if (!previousNode) 4271 if (!previousNode)
4244 this.firstChild_ = nodes[0]; 4272 this.firstChild_ = nodes[0];
4245 if (!refWrapper) { 4273 if (!refWrapper) {
4246 this.lastChild_ = nodes[nodes.length - 1]; 4274 this.lastChild_ = nodes[nodes.length - 1];
4247 if (this.firstChild_ === undefined) 4275 if (this.firstChild_ === undefined)
4248 this.firstChild_ = this.firstChild; 4276 this.firstChild_ = this.firstChild;
4249 } 4277 }
4250 4278
4251 var parentNode = refNode ? refNode.parentNode : this.impl; 4279 var parentNode = refNode ? refNode.parentNode : unsafeUnwrap(this);
4252 4280
4253 // insertBefore refWrapper no matter what the parent is? 4281 // insertBefore refWrapper no matter what the parent is?
4254 if (parentNode) { 4282 if (parentNode) {
4255 originalInsertBefore.call(parentNode, 4283 originalInsertBefore.call(parentNode,
4256 unwrapNodesForInsertion(this, nodes), refNode); 4284 unwrapNodesForInsertion(this, nodes), refNode);
4257 } else { 4285 } else {
4258 adoptNodesIfNeeded(this, nodes); 4286 adoptNodesIfNeeded(this, nodes);
4259 } 4287 }
4260 } 4288 }
4261 4289
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
4312 childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling; 4340 childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;
4313 if (childWrapperNextSibling) { 4341 if (childWrapperNextSibling) {
4314 childWrapperNextSibling.previousSibling_ = 4342 childWrapperNextSibling.previousSibling_ =
4315 childWrapperPreviousSibling; 4343 childWrapperPreviousSibling;
4316 } 4344 }
4317 4345
4318 childWrapper.previousSibling_ = childWrapper.nextSibling_ = 4346 childWrapper.previousSibling_ = childWrapper.nextSibling_ =
4319 childWrapper.parentNode_ = undefined; 4347 childWrapper.parentNode_ = undefined;
4320 } else { 4348 } else {
4321 clearChildNodes(this); 4349 clearChildNodes(this);
4322 removeChildOriginalHelper(this.impl, childNode); 4350 removeChildOriginalHelper(unsafeUnwrap(this), childNode);
4323 } 4351 }
4324 4352
4325 if (!surpressMutations) { 4353 if (!surpressMutations) {
4326 enqueueMutation(this, 'childList', { 4354 enqueueMutation(this, 'childList', {
4327 removedNodes: createOneElementNodeList(childWrapper), 4355 removedNodes: createOneElementNodeList(childWrapper),
4328 nextSibling: childWrapperNextSibling, 4356 nextSibling: childWrapperNextSibling,
4329 previousSibling: childWrapperPreviousSibling 4357 previousSibling: childWrapperPreviousSibling
4330 }); 4358 });
4331 } 4359 }
4332 4360
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
4378 // replaceChild no matter what the parent is? 4406 // replaceChild no matter what the parent is?
4379 if (oldChildNode.parentNode) { 4407 if (oldChildNode.parentNode) {
4380 originalReplaceChild.call( 4408 originalReplaceChild.call(
4381 oldChildNode.parentNode, 4409 oldChildNode.parentNode,
4382 unwrapNodesForInsertion(this, nodes), 4410 unwrapNodesForInsertion(this, nodes),
4383 oldChildNode); 4411 oldChildNode);
4384 } 4412 }
4385 } else { 4413 } else {
4386 ensureSameOwnerDocument(this, newChildWrapper); 4414 ensureSameOwnerDocument(this, newChildWrapper);
4387 clearChildNodes(this); 4415 clearChildNodes(this);
4388 originalReplaceChild.call(this.impl, unwrap(newChildWrapper), 4416 originalReplaceChild.call(unsafeUnwrap(this), unwrap(newChildWrapper),
4389 oldChildNode); 4417 oldChildNode);
4390 } 4418 }
4391 4419
4392 enqueueMutation(this, 'childList', { 4420 enqueueMutation(this, 'childList', {
4393 addedNodes: nodes, 4421 addedNodes: nodes,
4394 removedNodes: createOneElementNodeList(oldChildWrapper), 4422 removedNodes: createOneElementNodeList(oldChildWrapper),
4395 nextSibling: nextNode, 4423 nextSibling: nextNode,
4396 previousSibling: previousNode 4424 previousSibling: previousNode
4397 }); 4425 });
4398 4426
(...skipping 15 matching lines...) Expand all
4414 }, 4442 },
4415 4443
4416 hasChildNodes: function() { 4444 hasChildNodes: function() {
4417 return this.firstChild !== null; 4445 return this.firstChild !== null;
4418 }, 4446 },
4419 4447
4420 /** @type {Node} */ 4448 /** @type {Node} */
4421 get parentNode() { 4449 get parentNode() {
4422 // If the parentNode has not been overridden, use the original parentNode. 4450 // If the parentNode has not been overridden, use the original parentNode.
4423 return this.parentNode_ !== undefined ? 4451 return this.parentNode_ !== undefined ?
4424 this.parentNode_ : wrap(this.impl.parentNode); 4452 this.parentNode_ : wrap(unsafeUnwrap(this).parentNode);
4425 }, 4453 },
4426 4454
4427 /** @type {Node} */ 4455 /** @type {Node} */
4428 get firstChild() { 4456 get firstChild() {
4429 return this.firstChild_ !== undefined ? 4457 return this.firstChild_ !== undefined ?
4430 this.firstChild_ : wrap(this.impl.firstChild); 4458 this.firstChild_ : wrap(unsafeUnwrap(this).firstChild);
4431 }, 4459 },
4432 4460
4433 /** @type {Node} */ 4461 /** @type {Node} */
4434 get lastChild() { 4462 get lastChild() {
4435 return this.lastChild_ !== undefined ? 4463 return this.lastChild_ !== undefined ?
4436 this.lastChild_ : wrap(this.impl.lastChild); 4464 this.lastChild_ : wrap(unsafeUnwrap(this).lastChild);
4437 }, 4465 },
4438 4466
4439 /** @type {Node} */ 4467 /** @type {Node} */
4440 get nextSibling() { 4468 get nextSibling() {
4441 return this.nextSibling_ !== undefined ? 4469 return this.nextSibling_ !== undefined ?
4442 this.nextSibling_ : wrap(this.impl.nextSibling); 4470 this.nextSibling_ : wrap(unsafeUnwrap(this).nextSibling);
4443 }, 4471 },
4444 4472
4445 /** @type {Node} */ 4473 /** @type {Node} */
4446 get previousSibling() { 4474 get previousSibling() {
4447 return this.previousSibling_ !== undefined ? 4475 return this.previousSibling_ !== undefined ?
4448 this.previousSibling_ : wrap(this.impl.previousSibling); 4476 this.previousSibling_ : wrap(unsafeUnwrap(this).previousSibling);
4449 }, 4477 },
4450 4478
4451 get parentElement() { 4479 get parentElement() {
4452 var p = this.parentNode; 4480 var p = this.parentNode;
4453 while (p && p.nodeType !== Node.ELEMENT_NODE) { 4481 while (p && p.nodeType !== Node.ELEMENT_NODE) {
4454 p = p.parentNode; 4482 p = p.parentNode;
4455 } 4483 }
4456 return p; 4484 return p;
4457 }, 4485 },
4458 4486
4459 get textContent() { 4487 get textContent() {
4460 // TODO(arv): This should fallback to this.impl.textContent if there 4488 // TODO(arv): This should fallback to unsafeUnwrap(this).textContent if th ere
4461 // are no shadow trees below or above the context node. 4489 // are no shadow trees below or above the context node.
4462 var s = ''; 4490 var s = '';
4463 for (var child = this.firstChild; child; child = child.nextSibling) { 4491 for (var child = this.firstChild; child; child = child.nextSibling) {
4464 if (child.nodeType != Node.COMMENT_NODE) { 4492 if (child.nodeType != Node.COMMENT_NODE) {
4465 s += child.textContent; 4493 s += child.textContent;
4466 } 4494 }
4467 } 4495 }
4468 return s; 4496 return s;
4469 }, 4497 },
4470 set textContent(textContent) { 4498 set textContent(textContent) {
4471 var removedNodes = snapshotNodeList(this.childNodes); 4499 var removedNodes = snapshotNodeList(this.childNodes);
4472 4500
4473 if (this.invalidateShadowRenderer()) { 4501 if (this.invalidateShadowRenderer()) {
4474 removeAllChildNodes(this); 4502 removeAllChildNodes(this);
4475 if (textContent !== '') { 4503 if (textContent !== '') {
4476 var textNode = this.impl.ownerDocument.createTextNode(textContent); 4504 var textNode = unsafeUnwrap(this).ownerDocument.createTextNode(textCon tent);
4477 this.appendChild(textNode); 4505 this.appendChild(textNode);
4478 } 4506 }
4479 } else { 4507 } else {
4480 clearChildNodes(this); 4508 clearChildNodes(this);
4481 this.impl.textContent = textContent; 4509 unsafeUnwrap(this).textContent = textContent;
4482 } 4510 }
4483 4511
4484 var addedNodes = snapshotNodeList(this.childNodes); 4512 var addedNodes = snapshotNodeList(this.childNodes);
4485 4513
4486 enqueueMutation(this, 'childList', { 4514 enqueueMutation(this, 'childList', {
4487 addedNodes: addedNodes, 4515 addedNodes: addedNodes,
4488 removedNodes: removedNodes 4516 removedNodes: removedNodes
4489 }); 4517 });
4490 4518
4491 nodesWereRemoved(removedNodes); 4519 nodesWereRemoved(removedNodes);
(...skipping 14 matching lines...) Expand all
4506 return cloneNode(this, deep); 4534 return cloneNode(this, deep);
4507 }, 4535 },
4508 4536
4509 contains: function(child) { 4537 contains: function(child) {
4510 return contains(this, wrapIfNeeded(child)); 4538 return contains(this, wrapIfNeeded(child));
4511 }, 4539 },
4512 4540
4513 compareDocumentPosition: function(otherNode) { 4541 compareDocumentPosition: function(otherNode) {
4514 // This only wraps, it therefore only operates on the composed DOM and not 4542 // This only wraps, it therefore only operates on the composed DOM and not
4515 // the logical DOM. 4543 // the logical DOM.
4516 return originalCompareDocumentPosition.call(this.impl, 4544 return originalCompareDocumentPosition.call(unsafeUnwrap(this),
4517 unwrapIfNeeded(otherNode)); 4545 unwrapIfNeeded(otherNode));
4518 }, 4546 },
4519 4547
4520 normalize: function() { 4548 normalize: function() {
4521 var nodes = snapshotNodeList(this.childNodes); 4549 var nodes = snapshotNodeList(this.childNodes);
4522 var remNodes = []; 4550 var remNodes = [];
4523 var s = ''; 4551 var s = '';
4524 var modNode; 4552 var modNode;
4525 4553
4526 for (var i = 0, n; i < nodes.length; i++) { 4554 for (var i = 0, n; i < nodes.length; i++) {
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
4577 4605
4578 // Copyright 2013 The Polymer Authors. All rights reserved. 4606 // Copyright 2013 The Polymer Authors. All rights reserved.
4579 // Use of this source code is governed by a BSD-style 4607 // Use of this source code is governed by a BSD-style
4580 // license that can be found in the LICENSE file. 4608 // license that can be found in the LICENSE file.
4581 4609
4582 (function(scope) { 4610 (function(scope) {
4583 'use strict'; 4611 'use strict';
4584 4612
4585 var HTMLCollection = scope.wrappers.HTMLCollection; 4613 var HTMLCollection = scope.wrappers.HTMLCollection;
4586 var NodeList = scope.wrappers.NodeList; 4614 var NodeList = scope.wrappers.NodeList;
4615 var getTreeScope = scope.getTreeScope;
4616 var unsafeUnwrap = scope.unsafeUnwrap;
4617 var wrap = scope.wrap;
4618
4619 var originalDocumentQuerySelector = document.querySelector;
4620 var originalElementQuerySelector = document.documentElement.querySelector;
4621
4622 var originalDocumentQuerySelectorAll = document.querySelectorAll;
4623 var originalElementQuerySelectorAll = document.documentElement.querySelectorAl l;
4624
4625 var originalDocumentGetElementsByTagName = document.getElementsByTagName;
4626 var originalElementGetElementsByTagName = document.documentElement.getElements ByTagName;
4627
4628 var originalDocumentGetElementsByTagNameNS = document.getElementsByTagNameNS;
4629 var originalElementGetElementsByTagNameNS = document.documentElement.getElemen tsByTagNameNS;
4630
4631 var OriginalElement = window.Element;
4632 var OriginalDocument = window.HTMLDocument || window.Document;
4633
4634 function filterNodeList(list, index, result, deep) {
4635 var wrappedItem = null;
4636 var root = null;
4637 for (var i = 0, length = list.length; i < length; i++) {
4638 wrappedItem = wrap(list[i]);
4639 if (!deep && (root = getTreeScope(wrappedItem).root)) {
4640 if (root instanceof scope.wrappers.ShadowRoot) {
4641 continue;
4642 }
4643 }
4644 result[index++] = wrappedItem;
4645 }
4646
4647 return index;
4648 }
4649
4650 function shimSelector(selector) {
4651 return String(selector).replace(/\/deep\//g, ' ');
4652 }
4587 4653
4588 function findOne(node, selector) { 4654 function findOne(node, selector) {
4589 var m, el = node.firstElementChild; 4655 var m, el = node.firstElementChild;
4590 while (el) { 4656 while (el) {
4591 if (el.matches(selector)) 4657 if (el.matches(selector))
4592 return el; 4658 return el;
4593 m = findOne(el, selector); 4659 m = findOne(el, selector);
4594 if (m) 4660 if (m)
4595 return m; 4661 return m;
4596 el = el.nextElementSibling; 4662 el = el.nextElementSibling;
(...skipping 10 matching lines...) Expand all
4607 function matchesTagName(el, localName, localNameLowerCase) { 4673 function matchesTagName(el, localName, localNameLowerCase) {
4608 var ln = el.localName; 4674 var ln = el.localName;
4609 return ln === localName || 4675 return ln === localName ||
4610 ln === localNameLowerCase && el.namespaceURI === XHTML_NS; 4676 ln === localNameLowerCase && el.namespaceURI === XHTML_NS;
4611 } 4677 }
4612 4678
4613 function matchesEveryThing() { 4679 function matchesEveryThing() {
4614 return true; 4680 return true;
4615 } 4681 }
4616 4682
4617 function matchesLocalName(el, localName) { 4683 function matchesLocalNameOnly(el, ns, localName) {
4618 return el.localName === localName; 4684 return el.localName === localName;
4619 } 4685 }
4620 4686
4621 function matchesNameSpace(el, ns) { 4687 function matchesNameSpace(el, ns) {
4622 return el.namespaceURI === ns; 4688 return el.namespaceURI === ns;
4623 } 4689 }
4624 4690
4625 function matchesLocalNameNS(el, ns, localName) { 4691 function matchesLocalNameNS(el, ns, localName) {
4626 return el.namespaceURI === ns && el.localName === localName; 4692 return el.namespaceURI === ns && el.localName === localName;
4627 } 4693 }
4628 4694
4629 function findElements(node, result, p, arg0, arg1) { 4695 function findElements(node, index, result, p, arg0, arg1) {
4630 var el = node.firstElementChild; 4696 var el = node.firstElementChild;
4631 while (el) { 4697 while (el) {
4632 if (p(el, arg0, arg1)) 4698 if (p(el, arg0, arg1))
4633 result[result.length++] = el; 4699 result[index++] = el;
4634 findElements(el, result, p, arg0, arg1); 4700 index = findElements(el, index, result, p, arg0, arg1);
4635 el = el.nextElementSibling; 4701 el = el.nextElementSibling;
4636 } 4702 }
4637 return result; 4703 return index;
4638 } 4704 }
4639 4705
4640 // find and findAll will only match Simple Selectors, 4706 // find and findAll will only match Simple Selectors,
4641 // Structural Pseudo Classes are not guarenteed to be correct 4707 // Structural Pseudo Classes are not guarenteed to be correct
4642 // http://www.w3.org/TR/css3-selectors/#simple-selectors 4708 // http://www.w3.org/TR/css3-selectors/#simple-selectors
4643 4709
4710 function querySelectorAllFiltered(p, index, result, selector, deep) {
4711 var target = unsafeUnwrap(this);
4712 var list;
4713 var root = getTreeScope(this).root;
4714 if (root instanceof scope.wrappers.ShadowRoot) {
4715 // We are in the shadow tree and the logical tree is
4716 // going to be disconnected so we do a manual tree traversal
4717 return findElements(this, index, result, p, selector, null);
4718 } else if (target instanceof OriginalElement) {
4719 list = originalElementQuerySelectorAll.call(target, selector);
4720 } else if (target instanceof OriginalDocument) {
4721 list = originalDocumentQuerySelectorAll.call(target, selector);
4722 } else {
4723 // When we get a ShadowRoot the logical tree is going to be disconnected
4724 // so we do a manual tree traversal
4725 return findElements(this, index, result, p, selector, null);
4726 }
4727
4728 return filterNodeList(list, index, result, deep);
4729 }
4730
4644 var SelectorsInterface = { 4731 var SelectorsInterface = {
4645 querySelector: function(selector) { 4732 querySelector: function(selector) {
4646 return findOne(this, selector); 4733 var shimmed = shimSelector(selector);
4734 var deep = shimmed !== selector;
4735 selector = shimmed;
4736
4737 var target = unsafeUnwrap(this);
4738 var wrappedItem;
4739 var root = getTreeScope(this).root;
4740 if (root instanceof scope.wrappers.ShadowRoot) {
4741 // We are in the shadow tree and the logical tree is
4742 // going to be disconnected so we do a manual tree traversal
4743 return findOne(this, selector);
4744 } else if (target instanceof OriginalElement) {
4745 wrappedItem = wrap(originalElementQuerySelector.call(target, selector));
4746 } else if (target instanceof OriginalDocument) {
4747 wrappedItem = wrap(originalDocumentQuerySelector.call(target, selector)) ;
4748 } else {
4749 // When we get a ShadowRoot the logical tree is going to be disconnected
4750 // so we do a manual tree traversal
4751 return findOne(this, selector);
4752 }
4753
4754 if (!wrappedItem) {
4755 // When the original query returns nothing
4756 // we return nothing (to be consistent with the other wrapped calls)
4757 return wrappedItem;
4758 } else if (!deep && (root = getTreeScope(wrappedItem).root)) {
4759 if (root instanceof scope.wrappers.ShadowRoot) {
4760 // When the original query returns an element in the ShadowDOM
4761 // we must do a manual tree traversal
4762 return findOne(this, selector);
4763 }
4764 }
4765
4766 return wrappedItem;
4647 }, 4767 },
4648 querySelectorAll: function(selector) { 4768 querySelectorAll: function(selector) {
4649 return findElements(this, new NodeList(), matchesSelector, selector); 4769 var shimmed = shimSelector(selector);
4770 var deep = shimmed !== selector;
4771 selector = shimmed;
4772
4773 var result = new NodeList();
4774
4775 result.length = querySelectorAllFiltered.call(this,
4776 matchesSelector,
4777 0,
4778 result,
4779 selector,
4780 deep);
4781
4782 return result;
4650 } 4783 }
4651 }; 4784 };
4652 4785
4786 function getElementsByTagNameFiltered(p, index, result, localName,
4787 lowercase) {
4788 var target = unsafeUnwrap(this);
4789 var list;
4790 var root = getTreeScope(this).root;
4791 if (root instanceof scope.wrappers.ShadowRoot) {
4792 // We are in the shadow tree and the logical tree is
4793 // going to be disconnected so we do a manual tree traversal
4794 return findElements(this, index, result, p, localName, lowercase);
4795 } else if (target instanceof OriginalElement) {
4796 list = originalElementGetElementsByTagName.call(target, localName,
4797 lowercase);
4798 } else if (target instanceof OriginalDocument) {
4799 list = originalDocumentGetElementsByTagName.call(target, localName,
4800 lowercase);
4801 } else {
4802 // When we get a ShadowRoot the logical tree is going to be disconnected
4803 // so we do a manual tree traversal
4804 return findElements(this, index, result, p, localName, lowercase);
4805 }
4806
4807 return filterNodeList(list, index, result, false);
4808 }
4809
4810 function getElementsByTagNameNSFiltered(p, index, result, ns, localName) {
4811 var target = unsafeUnwrap(this);
4812 var list;
4813 var root = getTreeScope(this).root;
4814 if (root instanceof scope.wrappers.ShadowRoot) {
4815 // We are in the shadow tree and the logical tree is
4816 // going to be disconnected so we do a manual tree traversal
4817 return findElements(this, index, result, p, ns, localName);
4818 } else if (target instanceof OriginalElement) {
4819 list = originalElementGetElementsByTagNameNS.call(target, ns, localName);
4820 } else if (target instanceof OriginalDocument) {
4821 list = originalDocumentGetElementsByTagNameNS.call(target, ns, localName);
4822 } else {
4823 // When we get a ShadowRoot the logical tree is going to be disconnected
4824 // so we do a manual tree traversal
4825 return findElements(this, index, result, p, ns, localName);
4826 }
4827
4828 return filterNodeList(list, index, result, false);
4829 }
4830
4653 var GetElementsByInterface = { 4831 var GetElementsByInterface = {
4654 getElementsByTagName: function(localName) { 4832 getElementsByTagName: function(localName) {
4655 var result = new HTMLCollection(); 4833 var result = new HTMLCollection();
4656 if (localName === '*') 4834 var match = localName === '*' ? matchesEveryThing : matchesTagName;
4657 return findElements(this, result, matchesEveryThing);
4658 4835
4659 return findElements(this, result, 4836 result.length = getElementsByTagNameFiltered.call(this,
4660 matchesTagName, 4837 match,
4838 0,
4839 result,
4661 localName, 4840 localName,
4662 localName.toLowerCase()); 4841 localName.toLowerCase());
4842
4843 return result;
4663 }, 4844 },
4664 4845
4665 getElementsByClassName: function(className) { 4846 getElementsByClassName: function(className) {
4666 // TODO(arv): Check className? 4847 // TODO(arv): Check className?
4667 return this.querySelectorAll('.' + className); 4848 return this.querySelectorAll('.' + className);
4668 }, 4849 },
4669 4850
4670 getElementsByTagNameNS: function(ns, localName) { 4851 getElementsByTagNameNS: function(ns, localName) {
4671 var result = new HTMLCollection(); 4852 var result = new HTMLCollection();
4853 var match = null;
4672 4854
4673 if (ns === '') { 4855 if (ns === '*') {
4674 ns = null; 4856 match = localName === '*' ? matchesEveryThing : matchesLocalNameOnly;
4675 } else if (ns === '*') { 4857 } else {
4676 if (localName === '*') 4858 match = localName === '*' ? matchesNameSpace : matchesLocalNameNS;
4677 return findElements(this, result, matchesEveryThing);
4678 return findElements(this, result, matchesLocalName, localName);
4679 } 4859 }
4680 4860
4681 if (localName === '*') 4861 result.length = getElementsByTagNameNSFiltered.call(this,
4682 return findElements(this, result, matchesNameSpace, ns); 4862 match,
4863 0,
4864 result,
4865 ns || null,
4866 localName);
4683 4867
4684 return findElements(this, result, matchesLocalNameNS, ns, localName); 4868 return result;
4685 } 4869 }
4686 }; 4870 };
4687 4871
4688 scope.GetElementsByInterface = GetElementsByInterface; 4872 scope.GetElementsByInterface = GetElementsByInterface;
4689 scope.SelectorsInterface = SelectorsInterface; 4873 scope.SelectorsInterface = SelectorsInterface;
4690 4874
4691 })(window.ShadowDOMPolyfill); 4875 })(window.ShadowDOMPolyfill);
4692 4876
4693 // Copyright 2013 The Polymer Authors. All rights reserved. 4877 // Copyright 2013 The Polymer Authors. All rights reserved.
4694 // Use of this source code is goverened by a BSD-style 4878 // Use of this source code is goverened by a BSD-style
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
4771 // license that can be found in the LICENSE file. 4955 // license that can be found in the LICENSE file.
4772 4956
4773 (function(scope) { 4957 (function(scope) {
4774 'use strict'; 4958 'use strict';
4775 4959
4776 var ChildNodeInterface = scope.ChildNodeInterface; 4960 var ChildNodeInterface = scope.ChildNodeInterface;
4777 var Node = scope.wrappers.Node; 4961 var Node = scope.wrappers.Node;
4778 var enqueueMutation = scope.enqueueMutation; 4962 var enqueueMutation = scope.enqueueMutation;
4779 var mixin = scope.mixin; 4963 var mixin = scope.mixin;
4780 var registerWrapper = scope.registerWrapper; 4964 var registerWrapper = scope.registerWrapper;
4965 var unsafeUnwrap = scope.unsafeUnwrap;
4781 4966
4782 var OriginalCharacterData = window.CharacterData; 4967 var OriginalCharacterData = window.CharacterData;
4783 4968
4784 function CharacterData(node) { 4969 function CharacterData(node) {
4785 Node.call(this, node); 4970 Node.call(this, node);
4786 } 4971 }
4787 CharacterData.prototype = Object.create(Node.prototype); 4972 CharacterData.prototype = Object.create(Node.prototype);
4788 mixin(CharacterData.prototype, { 4973 mixin(CharacterData.prototype, {
4789 get textContent() { 4974 get textContent() {
4790 return this.data; 4975 return this.data;
4791 }, 4976 },
4792 set textContent(value) { 4977 set textContent(value) {
4793 this.data = value; 4978 this.data = value;
4794 }, 4979 },
4795 get data() { 4980 get data() {
4796 return this.impl.data; 4981 return unsafeUnwrap(this).data;
4797 }, 4982 },
4798 set data(value) { 4983 set data(value) {
4799 var oldValue = this.impl.data; 4984 var oldValue = unsafeUnwrap(this).data;
4800 enqueueMutation(this, 'characterData', { 4985 enqueueMutation(this, 'characterData', {
4801 oldValue: oldValue 4986 oldValue: oldValue
4802 }); 4987 });
4803 this.impl.data = value; 4988 unsafeUnwrap(this).data = value;
4804 } 4989 }
4805 }); 4990 });
4806 4991
4807 mixin(CharacterData.prototype, ChildNodeInterface); 4992 mixin(CharacterData.prototype, ChildNodeInterface);
4808 4993
4809 registerWrapper(OriginalCharacterData, CharacterData, 4994 registerWrapper(OriginalCharacterData, CharacterData,
4810 document.createTextNode('')); 4995 document.createTextNode(''));
4811 4996
4812 scope.wrappers.CharacterData = CharacterData; 4997 scope.wrappers.CharacterData = CharacterData;
4813 })(window.ShadowDOMPolyfill); 4998 })(window.ShadowDOMPolyfill);
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
4855 scope.wrappers.Text = Text; 5040 scope.wrappers.Text = Text;
4856 })(window.ShadowDOMPolyfill); 5041 })(window.ShadowDOMPolyfill);
4857 5042
4858 // Copyright 2014 The Polymer Authors. All rights reserved. 5043 // Copyright 2014 The Polymer Authors. All rights reserved.
4859 // Use of this source code is goverened by a BSD-style 5044 // Use of this source code is goverened by a BSD-style
4860 // license that can be found in the LICENSE file. 5045 // license that can be found in the LICENSE file.
4861 5046
4862 (function(scope) { 5047 (function(scope) {
4863 'use strict'; 5048 'use strict';
4864 5049
5050 var setWrapper = scope.setWrapper;
5051 var unsafeUnwrap = scope.unsafeUnwrap;
5052
4865 function invalidateClass(el) { 5053 function invalidateClass(el) {
4866 scope.invalidateRendererBasedOnAttribute(el, 'class'); 5054 scope.invalidateRendererBasedOnAttribute(el, 'class');
4867 } 5055 }
4868 5056
4869 function DOMTokenList(impl, ownerElement) { 5057 function DOMTokenList(impl, ownerElement) {
4870 this.impl = impl; 5058 setWrapper(impl, this);
4871 this.ownerElement_ = ownerElement; 5059 this.ownerElement_ = ownerElement;
4872 } 5060 }
4873 5061
4874 DOMTokenList.prototype = { 5062 DOMTokenList.prototype = {
5063 constructor: DOMTokenList,
4875 get length() { 5064 get length() {
4876 return this.impl.length; 5065 return unsafeUnwrap(this).length;
4877 }, 5066 },
4878 item: function(index) { 5067 item: function(index) {
4879 return this.impl.item(index); 5068 return unsafeUnwrap(this).item(index);
4880 }, 5069 },
4881 contains: function(token) { 5070 contains: function(token) {
4882 return this.impl.contains(token); 5071 return unsafeUnwrap(this).contains(token);
4883 }, 5072 },
4884 add: function() { 5073 add: function() {
4885 this.impl.add.apply(this.impl, arguments); 5074 unsafeUnwrap(this).add.apply(unsafeUnwrap(this), arguments);
4886 invalidateClass(this.ownerElement_); 5075 invalidateClass(this.ownerElement_);
4887 }, 5076 },
4888 remove: function() { 5077 remove: function() {
4889 this.impl.remove.apply(this.impl, arguments); 5078 unsafeUnwrap(this).remove.apply(unsafeUnwrap(this), arguments);
4890 invalidateClass(this.ownerElement_); 5079 invalidateClass(this.ownerElement_);
4891 }, 5080 },
4892 toggle: function(token) { 5081 toggle: function(token) {
4893 var rv = this.impl.toggle.apply(this.impl, arguments); 5082 var rv = unsafeUnwrap(this).toggle.apply(unsafeUnwrap(this), arguments);
4894 invalidateClass(this.ownerElement_); 5083 invalidateClass(this.ownerElement_);
4895 return rv; 5084 return rv;
4896 }, 5085 },
4897 toString: function() { 5086 toString: function() {
4898 return this.impl.toString(); 5087 return unsafeUnwrap(this).toString();
4899 } 5088 }
4900 }; 5089 };
4901 5090
4902 scope.wrappers.DOMTokenList = DOMTokenList; 5091 scope.wrappers.DOMTokenList = DOMTokenList;
4903 })(window.ShadowDOMPolyfill); 5092 })(window.ShadowDOMPolyfill);
4904 5093
4905 // Copyright 2013 The Polymer Authors. All rights reserved. 5094 // Copyright 2013 The Polymer Authors. All rights reserved.
4906 // Use of this source code is goverened by a BSD-style 5095 // Use of this source code is goverened by a BSD-style
4907 // license that can be found in the LICENSE file. 5096 // license that can be found in the LICENSE file.
4908 5097
4909 (function(scope) { 5098 (function(scope) {
4910 'use strict'; 5099 'use strict';
4911 5100
4912 var ChildNodeInterface = scope.ChildNodeInterface; 5101 var ChildNodeInterface = scope.ChildNodeInterface;
4913 var GetElementsByInterface = scope.GetElementsByInterface; 5102 var GetElementsByInterface = scope.GetElementsByInterface;
4914 var Node = scope.wrappers.Node; 5103 var Node = scope.wrappers.Node;
4915 var DOMTokenList = scope.wrappers.DOMTokenList; 5104 var DOMTokenList = scope.wrappers.DOMTokenList;
4916 var ParentNodeInterface = scope.ParentNodeInterface; 5105 var ParentNodeInterface = scope.ParentNodeInterface;
4917 var SelectorsInterface = scope.SelectorsInterface; 5106 var SelectorsInterface = scope.SelectorsInterface;
4918 var addWrapNodeListMethod = scope.addWrapNodeListMethod; 5107 var addWrapNodeListMethod = scope.addWrapNodeListMethod;
4919 var enqueueMutation = scope.enqueueMutation; 5108 var enqueueMutation = scope.enqueueMutation;
4920 var mixin = scope.mixin; 5109 var mixin = scope.mixin;
4921 var oneOf = scope.oneOf; 5110 var oneOf = scope.oneOf;
4922 var registerWrapper = scope.registerWrapper; 5111 var registerWrapper = scope.registerWrapper;
4923 var unwrap = scope.unwrap; 5112 var unsafeUnwrap = scope.unsafeUnwrap;
4924 var wrappers = scope.wrappers; 5113 var wrappers = scope.wrappers;
4925 5114
4926 var OriginalElement = window.Element; 5115 var OriginalElement = window.Element;
4927 5116
4928 var matchesNames = [ 5117 var matchesNames = [
4929 'matches', // needs to come first. 5118 'matches', // needs to come first.
4930 'mozMatchesSelector', 5119 'mozMatchesSelector',
4931 'msMatchesSelector', 5120 'msMatchesSelector',
4932 'webkitMatchesSelector', 5121 'webkitMatchesSelector',
4933 ].filter(function(name) { 5122 ].filter(function(name) {
(...skipping 28 matching lines...) Expand all
4962 5151
4963 var classListTable = new WeakMap(); 5152 var classListTable = new WeakMap();
4964 5153
4965 function Element(node) { 5154 function Element(node) {
4966 Node.call(this, node); 5155 Node.call(this, node);
4967 } 5156 }
4968 Element.prototype = Object.create(Node.prototype); 5157 Element.prototype = Object.create(Node.prototype);
4969 mixin(Element.prototype, { 5158 mixin(Element.prototype, {
4970 createShadowRoot: function() { 5159 createShadowRoot: function() {
4971 var newShadowRoot = new wrappers.ShadowRoot(this); 5160 var newShadowRoot = new wrappers.ShadowRoot(this);
4972 this.impl.polymerShadowRoot_ = newShadowRoot; 5161 unsafeUnwrap(this).polymerShadowRoot_ = newShadowRoot;
4973 5162
4974 var renderer = scope.getRendererForHost(this); 5163 var renderer = scope.getRendererForHost(this);
4975 renderer.invalidate(); 5164 renderer.invalidate();
4976 5165
4977 return newShadowRoot; 5166 return newShadowRoot;
4978 }, 5167 },
4979 5168
4980 get shadowRoot() { 5169 get shadowRoot() {
4981 return this.impl.polymerShadowRoot_ || null; 5170 return unsafeUnwrap(this).polymerShadowRoot_ || null;
4982 }, 5171 },
4983 5172
4984 // getDestinationInsertionPoints added in ShadowRenderer.js 5173 // getDestinationInsertionPoints added in ShadowRenderer.js
4985 5174
4986 setAttribute: function(name, value) { 5175 setAttribute: function(name, value) {
4987 var oldValue = this.impl.getAttribute(name); 5176 var oldValue = unsafeUnwrap(this).getAttribute(name);
4988 this.impl.setAttribute(name, value); 5177 unsafeUnwrap(this).setAttribute(name, value);
4989 enqueAttributeChange(this, name, oldValue); 5178 enqueAttributeChange(this, name, oldValue);
4990 invalidateRendererBasedOnAttribute(this, name); 5179 invalidateRendererBasedOnAttribute(this, name);
4991 }, 5180 },
4992 5181
4993 removeAttribute: function(name) { 5182 removeAttribute: function(name) {
4994 var oldValue = this.impl.getAttribute(name); 5183 var oldValue = unsafeUnwrap(this).getAttribute(name);
4995 this.impl.removeAttribute(name); 5184 unsafeUnwrap(this).removeAttribute(name);
4996 enqueAttributeChange(this, name, oldValue); 5185 enqueAttributeChange(this, name, oldValue);
4997 invalidateRendererBasedOnAttribute(this, name); 5186 invalidateRendererBasedOnAttribute(this, name);
4998 }, 5187 },
4999 5188
5000 matches: function(selector) { 5189 matches: function(selector) {
5001 return originalMatches.call(this.impl, selector); 5190 return originalMatches.call(unsafeUnwrap(this), selector);
5002 }, 5191 },
5003 5192
5004 get classList() { 5193 get classList() {
5005 var list = classListTable.get(this); 5194 var list = classListTable.get(this);
5006 if (!list) { 5195 if (!list) {
5007 classListTable.set(this, 5196 classListTable.set(this,
5008 list = new DOMTokenList(unwrap(this).classList, this)); 5197 list = new DOMTokenList(unsafeUnwrap(this).classList, this));
5009 } 5198 }
5010 return list; 5199 return list;
5011 }, 5200 },
5012 5201
5013 get className() { 5202 get className() {
5014 return unwrap(this).className; 5203 return unsafeUnwrap(this).className;
5015 }, 5204 },
5016 5205
5017 set className(v) { 5206 set className(v) {
5018 this.setAttribute('class', v); 5207 this.setAttribute('class', v);
5019 }, 5208 },
5020 5209
5021 get id() { 5210 get id() {
5022 return unwrap(this).id; 5211 return unsafeUnwrap(this).id;
5023 }, 5212 },
5024 5213
5025 set id(v) { 5214 set id(v) {
5026 this.setAttribute('id', v); 5215 this.setAttribute('id', v);
5027 } 5216 }
5028 }); 5217 });
5029 5218
5030 matchesNames.forEach(function(name) { 5219 matchesNames.forEach(function(name) {
5031 if (name !== 'matches') { 5220 if (name !== 'matches') {
5032 Element.prototype[name] = function(selector) { 5221 Element.prototype[name] = function(selector) {
(...skipping 28 matching lines...) Expand all
5061 'use strict'; 5250 'use strict';
5062 5251
5063 var Element = scope.wrappers.Element; 5252 var Element = scope.wrappers.Element;
5064 var defineGetter = scope.defineGetter; 5253 var defineGetter = scope.defineGetter;
5065 var enqueueMutation = scope.enqueueMutation; 5254 var enqueueMutation = scope.enqueueMutation;
5066 var mixin = scope.mixin; 5255 var mixin = scope.mixin;
5067 var nodesWereAdded = scope.nodesWereAdded; 5256 var nodesWereAdded = scope.nodesWereAdded;
5068 var nodesWereRemoved = scope.nodesWereRemoved; 5257 var nodesWereRemoved = scope.nodesWereRemoved;
5069 var registerWrapper = scope.registerWrapper; 5258 var registerWrapper = scope.registerWrapper;
5070 var snapshotNodeList = scope.snapshotNodeList; 5259 var snapshotNodeList = scope.snapshotNodeList;
5260 var unsafeUnwrap = scope.unsafeUnwrap;
5071 var unwrap = scope.unwrap; 5261 var unwrap = scope.unwrap;
5072 var wrap = scope.wrap; 5262 var wrap = scope.wrap;
5073 var wrappers = scope.wrappers; 5263 var wrappers = scope.wrappers;
5074 5264
5075 ///////////////////////////////////////////////////////////////////////////// 5265 /////////////////////////////////////////////////////////////////////////////
5076 // innerHTML and outerHTML 5266 // innerHTML and outerHTML
5077 5267
5078 // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#es capingString 5268 // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#es capingString
5079 var escapeAttrRegExp = /[&\u00A0"]/g; 5269 var escapeAttrRegExp = /[&\u00A0"]/g;
5080 var escapeDataRegExp = /[&\u00A0<>]/g; 5270 var escapeDataRegExp = /[&\u00A0<>]/g;
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
5227 else 5417 else
5228 setInnerHTML(this, value, this.tagName); 5418 setInnerHTML(this, value, this.tagName);
5229 5419
5230 // If we have a non native template element we need to handle this 5420 // If we have a non native template element we need to handle this
5231 // manually since setting impl.innerHTML would add the html as direct 5421 // manually since setting impl.innerHTML would add the html as direct
5232 // children and not be moved over to the content fragment. 5422 // children and not be moved over to the content fragment.
5233 } else if (!OriginalHTMLTemplateElement && 5423 } else if (!OriginalHTMLTemplateElement &&
5234 this instanceof wrappers.HTMLTemplateElement) { 5424 this instanceof wrappers.HTMLTemplateElement) {
5235 setInnerHTML(this.content, value); 5425 setInnerHTML(this.content, value);
5236 } else { 5426 } else {
5237 this.impl.innerHTML = value; 5427 unsafeUnwrap(this).innerHTML = value;
5238 } 5428 }
5239 5429
5240 var addedNodes = snapshotNodeList(this.childNodes); 5430 var addedNodes = snapshotNodeList(this.childNodes);
5241 5431
5242 enqueueMutation(this, 'childList', { 5432 enqueueMutation(this, 'childList', {
5243 addedNodes: addedNodes, 5433 addedNodes: addedNodes,
5244 removedNodes: removedNodes 5434 removedNodes: removedNodes
5245 }); 5435 });
5246 5436
5247 nodesWereRemoved(removedNodes); 5437 nodesWereRemoved(removedNodes);
(...skipping 30 matching lines...) Expand all
5278 case 'beforeend': 5468 case 'beforeend':
5279 contextElement = this; 5469 contextElement = this;
5280 refNode = null; 5470 refNode = null;
5281 break; 5471 break;
5282 default: 5472 default:
5283 return; 5473 return;
5284 } 5474 }
5285 5475
5286 var df = frag(contextElement, text); 5476 var df = frag(contextElement, text);
5287 contextElement.insertBefore(df, refNode); 5477 contextElement.insertBefore(df, refNode);
5478 },
5479
5480 get hidden() {
5481 return this.hasAttribute('hidden');
5482 },
5483 set hidden(v) {
5484 if (v) {
5485 this.setAttribute('hidden', '');
5486 } else {
5487 this.removeAttribute('hidden');
5488 }
5288 } 5489 }
5289 }); 5490 });
5290 5491
5291 function frag(contextElement, html) { 5492 function frag(contextElement, html) {
5292 // TODO(arv): This does not work with SVG and other non HTML elements. 5493 // TODO(arv): This does not work with SVG and other non HTML elements.
5293 var p = unwrap(contextElement.cloneNode(false)); 5494 var p = unwrap(contextElement.cloneNode(false));
5294 p.innerHTML = html; 5495 p.innerHTML = html;
5295 var df = unwrap(document.createDocumentFragment()); 5496 var df = unwrap(document.createDocumentFragment());
5296 var c; 5497 var c;
5297 while (c = p.firstChild) { 5498 while (c = p.firstChild) {
5298 df.appendChild(c); 5499 df.appendChild(c);
5299 } 5500 }
5300 return wrap(df); 5501 return wrap(df);
5301 } 5502 }
5302 5503
5303 function getter(name) { 5504 function getter(name) {
5304 return function() { 5505 return function() {
5305 scope.renderAllPending(); 5506 scope.renderAllPending();
5306 return this.impl[name]; 5507 return unsafeUnwrap(this)[name];
5307 }; 5508 };
5308 } 5509 }
5309 5510
5310 function getterRequiresRendering(name) { 5511 function getterRequiresRendering(name) {
5311 defineGetter(HTMLElement, name, getter(name)); 5512 defineGetter(HTMLElement, name, getter(name));
5312 } 5513 }
5313 5514
5314 [ 5515 [
5315 'clientHeight', 5516 'clientHeight',
5316 'clientLeft', 5517 'clientLeft',
5317 'clientTop', 5518 'clientTop',
5318 'clientWidth', 5519 'clientWidth',
5319 'offsetHeight', 5520 'offsetHeight',
5320 'offsetLeft', 5521 'offsetLeft',
5321 'offsetTop', 5522 'offsetTop',
5322 'offsetWidth', 5523 'offsetWidth',
5323 'scrollHeight', 5524 'scrollHeight',
5324 'scrollWidth', 5525 'scrollWidth',
5325 ].forEach(getterRequiresRendering); 5526 ].forEach(getterRequiresRendering);
5326 5527
5327 function getterAndSetterRequiresRendering(name) { 5528 function getterAndSetterRequiresRendering(name) {
5328 Object.defineProperty(HTMLElement.prototype, name, { 5529 Object.defineProperty(HTMLElement.prototype, name, {
5329 get: getter(name), 5530 get: getter(name),
5330 set: function(v) { 5531 set: function(v) {
5331 scope.renderAllPending(); 5532 scope.renderAllPending();
5332 this.impl[name] = v; 5533 unsafeUnwrap(this)[name] = v;
5333 }, 5534 },
5334 configurable: true, 5535 configurable: true,
5335 enumerable: true 5536 enumerable: true
5336 }); 5537 });
5337 } 5538 }
5338 5539
5339 [ 5540 [
5340 'scrollLeft', 5541 'scrollLeft',
5341 'scrollTop', 5542 'scrollTop',
5342 ].forEach(getterAndSetterRequiresRendering); 5543 ].forEach(getterAndSetterRequiresRendering);
5343 5544
5344 function methodRequiresRendering(name) { 5545 function methodRequiresRendering(name) {
5345 Object.defineProperty(HTMLElement.prototype, name, { 5546 Object.defineProperty(HTMLElement.prototype, name, {
5346 value: function() { 5547 value: function() {
5347 scope.renderAllPending(); 5548 scope.renderAllPending();
5348 return this.impl[name].apply(this.impl, arguments); 5549 return unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments);
5349 }, 5550 },
5350 configurable: true, 5551 configurable: true,
5351 enumerable: true 5552 enumerable: true
5352 }); 5553 });
5353 } 5554 }
5354 5555
5355 [ 5556 [
5356 'getBoundingClientRect', 5557 'getBoundingClientRect',
5357 'getClientRects', 5558 'getClientRects',
5358 'scrollIntoView' 5559 'scrollIntoView'
(...skipping 13 matching lines...) Expand all
5372 // Copyright 2013 The Polymer Authors. All rights reserved. 5573 // Copyright 2013 The Polymer Authors. All rights reserved.
5373 // Use of this source code is goverened by a BSD-style 5574 // Use of this source code is goverened by a BSD-style
5374 // license that can be found in the LICENSE file. 5575 // license that can be found in the LICENSE file.
5375 5576
5376 (function(scope) { 5577 (function(scope) {
5377 'use strict'; 5578 'use strict';
5378 5579
5379 var HTMLElement = scope.wrappers.HTMLElement; 5580 var HTMLElement = scope.wrappers.HTMLElement;
5380 var mixin = scope.mixin; 5581 var mixin = scope.mixin;
5381 var registerWrapper = scope.registerWrapper; 5582 var registerWrapper = scope.registerWrapper;
5583 var unsafeUnwrap = scope.unsafeUnwrap;
5382 var wrap = scope.wrap; 5584 var wrap = scope.wrap;
5383 5585
5384 var OriginalHTMLCanvasElement = window.HTMLCanvasElement; 5586 var OriginalHTMLCanvasElement = window.HTMLCanvasElement;
5385 5587
5386 function HTMLCanvasElement(node) { 5588 function HTMLCanvasElement(node) {
5387 HTMLElement.call(this, node); 5589 HTMLElement.call(this, node);
5388 } 5590 }
5389 HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype); 5591 HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype);
5390 5592
5391 mixin(HTMLCanvasElement.prototype, { 5593 mixin(HTMLCanvasElement.prototype, {
5392 getContext: function() { 5594 getContext: function() {
5393 var context = this.impl.getContext.apply(this.impl, arguments); 5595 var context = unsafeUnwrap(this).getContext.apply(unsafeUnwrap(this), argu ments);
5394 return context && wrap(context); 5596 return context && wrap(context);
5395 } 5597 }
5396 }); 5598 });
5397 5599
5398 registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement, 5600 registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement,
5399 document.createElement('canvas')); 5601 document.createElement('canvas'));
5400 5602
5401 scope.wrappers.HTMLCanvasElement = HTMLCanvasElement; 5603 scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;
5402 })(window.ShadowDOMPolyfill); 5604 })(window.ShadowDOMPolyfill);
5403 5605
5404 // Copyright 2013 The Polymer Authors. All rights reserved. 5606 // Copyright 2013 The Polymer Authors. All rights reserved.
5405 // Use of this source code is goverened by a BSD-style 5607 // Use of this source code is goverened by a BSD-style
5406 // license that can be found in the LICENSE file. 5608 // license that can be found in the LICENSE file.
5407 5609
5408 (function(scope) { 5610 (function(scope) {
5409 'use strict'; 5611 'use strict';
5410 5612
5411 var HTMLElement = scope.wrappers.HTMLElement; 5613 var HTMLElement = scope.wrappers.HTMLElement;
5412 var mixin = scope.mixin; 5614 var mixin = scope.mixin;
5413 var registerWrapper = scope.registerWrapper; 5615 var registerWrapper = scope.registerWrapper;
5414 5616
5415 var OriginalHTMLContentElement = window.HTMLContentElement; 5617 var OriginalHTMLContentElement = window.HTMLContentElement;
5416 5618
5417 function HTMLContentElement(node) { 5619 function HTMLContentElement(node) {
5418 HTMLElement.call(this, node); 5620 HTMLElement.call(this, node);
5419 } 5621 }
5420 HTMLContentElement.prototype = Object.create(HTMLElement.prototype); 5622 HTMLContentElement.prototype = Object.create(HTMLElement.prototype);
5421 mixin(HTMLContentElement.prototype, { 5623 mixin(HTMLContentElement.prototype, {
5624 constructor: HTMLContentElement,
5625
5422 get select() { 5626 get select() {
5423 return this.getAttribute('select'); 5627 return this.getAttribute('select');
5424 }, 5628 },
5425 set select(value) { 5629 set select(value) {
5426 this.setAttribute('select', value); 5630 this.setAttribute('select', value);
5427 }, 5631 },
5428 5632
5429 setAttribute: function(n, v) { 5633 setAttribute: function(n, v) {
5430 HTMLElement.prototype.setAttribute.call(this, n, v); 5634 HTMLElement.prototype.setAttribute.call(this, n, v);
5431 if (String(n).toLowerCase() === 'select') 5635 if (String(n).toLowerCase() === 'select')
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
5532 var mixin = scope.mixin; 5736 var mixin = scope.mixin;
5533 var NodeList = scope.wrappers.NodeList; 5737 var NodeList = scope.wrappers.NodeList;
5534 var registerWrapper = scope.registerWrapper; 5738 var registerWrapper = scope.registerWrapper;
5535 5739
5536 var OriginalHTMLShadowElement = window.HTMLShadowElement; 5740 var OriginalHTMLShadowElement = window.HTMLShadowElement;
5537 5741
5538 function HTMLShadowElement(node) { 5742 function HTMLShadowElement(node) {
5539 HTMLElement.call(this, node); 5743 HTMLElement.call(this, node);
5540 } 5744 }
5541 HTMLShadowElement.prototype = Object.create(HTMLElement.prototype); 5745 HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);
5746 HTMLShadowElement.prototype.constructor = HTMLShadowElement;
5542 5747
5543 // getDistributedNodes is added in ShadowRenderer 5748 // getDistributedNodes is added in ShadowRenderer
5544 5749
5545 if (OriginalHTMLShadowElement) 5750 if (OriginalHTMLShadowElement)
5546 registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement); 5751 registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement);
5547 5752
5548 scope.wrappers.HTMLShadowElement = HTMLShadowElement; 5753 scope.wrappers.HTMLShadowElement = HTMLShadowElement;
5549 })(window.ShadowDOMPolyfill); 5754 })(window.ShadowDOMPolyfill);
5550 5755
5551 // Copyright 2013 The Polymer Authors. All rights reserved. 5756 // Copyright 2013 The Polymer Authors. All rights reserved.
5552 // Use of this source code is goverened by a BSD-style 5757 // Use of this source code is goverened by a BSD-style
5553 // license that can be found in the LICENSE file. 5758 // license that can be found in the LICENSE file.
5554 5759
5555 (function(scope) { 5760 (function(scope) {
5556 'use strict'; 5761 'use strict';
5557 5762
5558 var HTMLElement = scope.wrappers.HTMLElement; 5763 var HTMLElement = scope.wrappers.HTMLElement;
5559 var mixin = scope.mixin; 5764 var mixin = scope.mixin;
5560 var registerWrapper = scope.registerWrapper; 5765 var registerWrapper = scope.registerWrapper;
5766 var unsafeUnwrap = scope.unsafeUnwrap;
5561 var unwrap = scope.unwrap; 5767 var unwrap = scope.unwrap;
5562 var wrap = scope.wrap; 5768 var wrap = scope.wrap;
5563 5769
5564 var contentTable = new WeakMap(); 5770 var contentTable = new WeakMap();
5565 var templateContentsOwnerTable = new WeakMap(); 5771 var templateContentsOwnerTable = new WeakMap();
5566 5772
5567 // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html# dfn-template-contents-owner 5773 // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html# dfn-template-contents-owner
5568 function getTemplateContentsOwner(doc) { 5774 function getTemplateContentsOwner(doc) {
5569 if (!doc.defaultView) 5775 if (!doc.defaultView)
5570 return doc; 5776 return doc;
(...skipping 26 matching lines...) Expand all
5597 function HTMLTemplateElement(node) { 5803 function HTMLTemplateElement(node) {
5598 HTMLElement.call(this, node); 5804 HTMLElement.call(this, node);
5599 if (!OriginalHTMLTemplateElement) { 5805 if (!OriginalHTMLTemplateElement) {
5600 var content = extractContent(node); 5806 var content = extractContent(node);
5601 contentTable.set(this, wrap(content)); 5807 contentTable.set(this, wrap(content));
5602 } 5808 }
5603 } 5809 }
5604 HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype); 5810 HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype);
5605 5811
5606 mixin(HTMLTemplateElement.prototype, { 5812 mixin(HTMLTemplateElement.prototype, {
5813 constructor: HTMLTemplateElement,
5607 get content() { 5814 get content() {
5608 if (OriginalHTMLTemplateElement) 5815 if (OriginalHTMLTemplateElement)
5609 return wrap(this.impl.content); 5816 return wrap(unsafeUnwrap(this).content);
5610 return contentTable.get(this); 5817 return contentTable.get(this);
5611 }, 5818 },
5612 5819
5613 // TODO(arv): cloneNode needs to clone content. 5820 // TODO(arv): cloneNode needs to clone content.
5614 5821
5615 }); 5822 });
5616 5823
5617 if (OriginalHTMLTemplateElement) 5824 if (OriginalHTMLTemplateElement)
5618 registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement); 5825 registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement);
5619 5826
5620 scope.wrappers.HTMLTemplateElement = HTMLTemplateElement; 5827 scope.wrappers.HTMLTemplateElement = HTMLTemplateElement;
5621 })(window.ShadowDOMPolyfill); 5828 })(window.ShadowDOMPolyfill);
5622 5829
5623 // Copyright 2013 The Polymer Authors. All rights reserved. 5830 // Copyright 2013 The Polymer Authors. All rights reserved.
5624 // Use of this source code is goverened by a BSD-style 5831 // Use of this source code is goverened by a BSD-style
5625 // license that can be found in the LICENSE file. 5832 // license that can be found in the LICENSE file.
5626 5833
5627 (function(scope) { 5834 (function(scope) {
5628 'use strict'; 5835 'use strict';
5629 5836
5630 var HTMLElement = scope.wrappers.HTMLElement; 5837 var HTMLElement = scope.wrappers.HTMLElement;
5631 var registerWrapper = scope.registerWrapper; 5838 var registerWrapper = scope.registerWrapper;
5632 5839
5633 var OriginalHTMLMediaElement = window.HTMLMediaElement; 5840 var OriginalHTMLMediaElement = window.HTMLMediaElement;
5634 5841
5842 if (!OriginalHTMLMediaElement) return;
5843
5635 function HTMLMediaElement(node) { 5844 function HTMLMediaElement(node) {
5636 HTMLElement.call(this, node); 5845 HTMLElement.call(this, node);
5637 } 5846 }
5638 HTMLMediaElement.prototype = Object.create(HTMLElement.prototype); 5847 HTMLMediaElement.prototype = Object.create(HTMLElement.prototype);
5639 5848
5640 registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement, 5849 registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement,
5641 document.createElement('audio')); 5850 document.createElement('audio'));
5642 5851
5643 scope.wrappers.HTMLMediaElement = HTMLMediaElement; 5852 scope.wrappers.HTMLMediaElement = HTMLMediaElement;
5644 })(window.ShadowDOMPolyfill); 5853 })(window.ShadowDOMPolyfill);
5645 5854
5646 // Copyright 2013 The Polymer Authors. All rights reserved. 5855 // Copyright 2013 The Polymer Authors. All rights reserved.
5647 // Use of this source code is goverened by a BSD-style 5856 // Use of this source code is goverened by a BSD-style
5648 // license that can be found in the LICENSE file. 5857 // license that can be found in the LICENSE file.
5649 5858
5650 (function(scope) { 5859 (function(scope) {
5651 'use strict'; 5860 'use strict';
5652 5861
5653 var HTMLMediaElement = scope.wrappers.HTMLMediaElement; 5862 var HTMLMediaElement = scope.wrappers.HTMLMediaElement;
5654 var registerWrapper = scope.registerWrapper; 5863 var registerWrapper = scope.registerWrapper;
5655 var unwrap = scope.unwrap; 5864 var unwrap = scope.unwrap;
5656 var rewrap = scope.rewrap; 5865 var rewrap = scope.rewrap;
5657 5866
5658 var OriginalHTMLAudioElement = window.HTMLAudioElement; 5867 var OriginalHTMLAudioElement = window.HTMLAudioElement;
5659 5868
5869 if (!OriginalHTMLAudioElement) return;
5870
5660 function HTMLAudioElement(node) { 5871 function HTMLAudioElement(node) {
5661 HTMLMediaElement.call(this, node); 5872 HTMLMediaElement.call(this, node);
5662 } 5873 }
5663 HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype); 5874 HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype);
5664 5875
5665 registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement, 5876 registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement,
5666 document.createElement('audio')); 5877 document.createElement('audio'));
5667 5878
5668 function Audio(src) { 5879 function Audio(src) {
5669 if (!(this instanceof Audio)) { 5880 if (!(this instanceof Audio)) {
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
5882 var unwrap = scope.unwrap; 6093 var unwrap = scope.unwrap;
5883 var wrap = scope.wrap; 6094 var wrap = scope.wrap;
5884 6095
5885 var OriginalHTMLTableSectionElement = window.HTMLTableSectionElement; 6096 var OriginalHTMLTableSectionElement = window.HTMLTableSectionElement;
5886 6097
5887 function HTMLTableSectionElement(node) { 6098 function HTMLTableSectionElement(node) {
5888 HTMLElement.call(this, node); 6099 HTMLElement.call(this, node);
5889 } 6100 }
5890 HTMLTableSectionElement.prototype = Object.create(HTMLElement.prototype); 6101 HTMLTableSectionElement.prototype = Object.create(HTMLElement.prototype);
5891 mixin(HTMLTableSectionElement.prototype, { 6102 mixin(HTMLTableSectionElement.prototype, {
6103 constructor: HTMLTableSectionElement,
5892 get rows() { 6104 get rows() {
5893 return wrapHTMLCollection(unwrap(this).rows); 6105 return wrapHTMLCollection(unwrap(this).rows);
5894 }, 6106 },
5895 insertRow: function(index) { 6107 insertRow: function(index) {
5896 return wrap(unwrap(this).insertRow(index)); 6108 return wrap(unwrap(this).insertRow(index));
5897 } 6109 }
5898 }); 6110 });
5899 6111
5900 registerWrapper(OriginalHTMLTableSectionElement, HTMLTableSectionElement, 6112 registerWrapper(OriginalHTMLTableSectionElement, HTMLTableSectionElement,
5901 document.createElement('thead')); 6113 document.createElement('thead'));
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
6052 // Copyright 2014 The Polymer Authors. All rights reserved. 6264 // Copyright 2014 The Polymer Authors. All rights reserved.
6053 // Use of this source code is goverened by a BSD-style 6265 // Use of this source code is goverened by a BSD-style
6054 // license that can be found in the LICENSE file. 6266 // license that can be found in the LICENSE file.
6055 6267
6056 (function(scope) { 6268 (function(scope) {
6057 'use strict'; 6269 'use strict';
6058 6270
6059 var EventTarget = scope.wrappers.EventTarget; 6271 var EventTarget = scope.wrappers.EventTarget;
6060 var mixin = scope.mixin; 6272 var mixin = scope.mixin;
6061 var registerWrapper = scope.registerWrapper; 6273 var registerWrapper = scope.registerWrapper;
6274 var unsafeUnwrap = scope.unsafeUnwrap;
6062 var wrap = scope.wrap; 6275 var wrap = scope.wrap;
6063 6276
6064 var OriginalSVGElementInstance = window.SVGElementInstance; 6277 var OriginalSVGElementInstance = window.SVGElementInstance;
6065 if (!OriginalSVGElementInstance) 6278 if (!OriginalSVGElementInstance)
6066 return; 6279 return;
6067 6280
6068 function SVGElementInstance(impl) { 6281 function SVGElementInstance(impl) {
6069 EventTarget.call(this, impl); 6282 EventTarget.call(this, impl);
6070 } 6283 }
6071 6284
6072 SVGElementInstance.prototype = Object.create(EventTarget.prototype); 6285 SVGElementInstance.prototype = Object.create(EventTarget.prototype);
6073 mixin(SVGElementInstance.prototype, { 6286 mixin(SVGElementInstance.prototype, {
6074 /** @type {SVGElement} */ 6287 /** @type {SVGElement} */
6075 get correspondingElement() { 6288 get correspondingElement() {
6076 return wrap(this.impl.correspondingElement); 6289 return wrap(unsafeUnwrap(this).correspondingElement);
6077 }, 6290 },
6078 6291
6079 /** @type {SVGUseElement} */ 6292 /** @type {SVGUseElement} */
6080 get correspondingUseElement() { 6293 get correspondingUseElement() {
6081 return wrap(this.impl.correspondingUseElement); 6294 return wrap(unsafeUnwrap(this).correspondingUseElement);
6082 }, 6295 },
6083 6296
6084 /** @type {SVGElementInstance} */ 6297 /** @type {SVGElementInstance} */
6085 get parentNode() { 6298 get parentNode() {
6086 return wrap(this.impl.parentNode); 6299 return wrap(unsafeUnwrap(this).parentNode);
6087 }, 6300 },
6088 6301
6089 /** @type {SVGElementInstanceList} */ 6302 /** @type {SVGElementInstanceList} */
6090 get childNodes() { 6303 get childNodes() {
6091 throw new Error('Not implemented'); 6304 throw new Error('Not implemented');
6092 }, 6305 },
6093 6306
6094 /** @type {SVGElementInstance} */ 6307 /** @type {SVGElementInstance} */
6095 get firstChild() { 6308 get firstChild() {
6096 return wrap(this.impl.firstChild); 6309 return wrap(unsafeUnwrap(this).firstChild);
6097 }, 6310 },
6098 6311
6099 /** @type {SVGElementInstance} */ 6312 /** @type {SVGElementInstance} */
6100 get lastChild() { 6313 get lastChild() {
6101 return wrap(this.impl.lastChild); 6314 return wrap(unsafeUnwrap(this).lastChild);
6102 }, 6315 },
6103 6316
6104 /** @type {SVGElementInstance} */ 6317 /** @type {SVGElementInstance} */
6105 get previousSibling() { 6318 get previousSibling() {
6106 return wrap(this.impl.previousSibling); 6319 return wrap(unsafeUnwrap(this).previousSibling);
6107 }, 6320 },
6108 6321
6109 /** @type {SVGElementInstance} */ 6322 /** @type {SVGElementInstance} */
6110 get nextSibling() { 6323 get nextSibling() {
6111 return wrap(this.impl.nextSibling); 6324 return wrap(unsafeUnwrap(this).nextSibling);
6112 } 6325 }
6113 }); 6326 });
6114 6327
6115 registerWrapper(OriginalSVGElementInstance, SVGElementInstance); 6328 registerWrapper(OriginalSVGElementInstance, SVGElementInstance);
6116 6329
6117 scope.wrappers.SVGElementInstance = SVGElementInstance; 6330 scope.wrappers.SVGElementInstance = SVGElementInstance;
6118 })(window.ShadowDOMPolyfill); 6331 })(window.ShadowDOMPolyfill);
6119 6332
6120 // Copyright 2013 The Polymer Authors. All rights reserved. 6333 // Copyright 2013 The Polymer Authors. All rights reserved.
6121 // Use of this source code is goverened by a BSD-style 6334 // Use of this source code is goverened by a BSD-style
6122 // license that can be found in the LICENSE file. 6335 // license that can be found in the LICENSE file.
6123 6336
6124 (function(scope) { 6337 (function(scope) {
6125 'use strict'; 6338 'use strict';
6126 6339
6127 var mixin = scope.mixin; 6340 var mixin = scope.mixin;
6128 var registerWrapper = scope.registerWrapper; 6341 var registerWrapper = scope.registerWrapper;
6342 var setWrapper = scope.setWrapper;
6343 var unsafeUnwrap = scope.unsafeUnwrap;
6129 var unwrap = scope.unwrap; 6344 var unwrap = scope.unwrap;
6130 var unwrapIfNeeded = scope.unwrapIfNeeded; 6345 var unwrapIfNeeded = scope.unwrapIfNeeded;
6131 var wrap = scope.wrap; 6346 var wrap = scope.wrap;
6132 6347
6133 var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D; 6348 var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;
6134 6349
6135 function CanvasRenderingContext2D(impl) { 6350 function CanvasRenderingContext2D(impl) {
6136 this.impl = impl; 6351 setWrapper(impl, this);
6137 } 6352 }
6138 6353
6139 mixin(CanvasRenderingContext2D.prototype, { 6354 mixin(CanvasRenderingContext2D.prototype, {
6140 get canvas() { 6355 get canvas() {
6141 return wrap(this.impl.canvas); 6356 return wrap(unsafeUnwrap(this).canvas);
6142 }, 6357 },
6143 6358
6144 drawImage: function() { 6359 drawImage: function() {
6145 arguments[0] = unwrapIfNeeded(arguments[0]); 6360 arguments[0] = unwrapIfNeeded(arguments[0]);
6146 this.impl.drawImage.apply(this.impl, arguments); 6361 unsafeUnwrap(this).drawImage.apply(unsafeUnwrap(this), arguments);
6147 }, 6362 },
6148 6363
6149 createPattern: function() { 6364 createPattern: function() {
6150 arguments[0] = unwrap(arguments[0]); 6365 arguments[0] = unwrap(arguments[0]);
6151 return this.impl.createPattern.apply(this.impl, arguments); 6366 return unsafeUnwrap(this).createPattern.apply(unsafeUnwrap(this), argument s);
6152 } 6367 }
6153 }); 6368 });
6154 6369
6155 registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D, 6370 registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D,
6156 document.createElement('canvas').getContext('2d')); 6371 document.createElement('canvas').getContext('2d'));
6157 6372
6158 scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D; 6373 scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D;
6159 })(window.ShadowDOMPolyfill); 6374 })(window.ShadowDOMPolyfill);
6160 6375
6161 // Copyright 2013 The Polymer Authors. All rights reserved. 6376 // Copyright 2013 The Polymer Authors. All rights reserved.
6162 // Use of this source code is goverened by a BSD-style 6377 // Use of this source code is goverened by a BSD-style
6163 // license that can be found in the LICENSE file. 6378 // license that can be found in the LICENSE file.
6164 6379
6165 (function(scope) { 6380 (function(scope) {
6166 'use strict'; 6381 'use strict';
6167 6382
6168 var mixin = scope.mixin; 6383 var mixin = scope.mixin;
6169 var registerWrapper = scope.registerWrapper; 6384 var registerWrapper = scope.registerWrapper;
6385 var setWrapper = scope.setWrapper;
6386 var unsafeUnwrap = scope.unsafeUnwrap;
6170 var unwrapIfNeeded = scope.unwrapIfNeeded; 6387 var unwrapIfNeeded = scope.unwrapIfNeeded;
6171 var wrap = scope.wrap; 6388 var wrap = scope.wrap;
6172 6389
6173 var OriginalWebGLRenderingContext = window.WebGLRenderingContext; 6390 var OriginalWebGLRenderingContext = window.WebGLRenderingContext;
6174 6391
6175 // IE10 does not have WebGL. 6392 // IE10 does not have WebGL.
6176 if (!OriginalWebGLRenderingContext) 6393 if (!OriginalWebGLRenderingContext)
6177 return; 6394 return;
6178 6395
6179 function WebGLRenderingContext(impl) { 6396 function WebGLRenderingContext(impl) {
6180 this.impl = impl; 6397 setWrapper(impl, this);
6181 } 6398 }
6182 6399
6183 mixin(WebGLRenderingContext.prototype, { 6400 mixin(WebGLRenderingContext.prototype, {
6184 get canvas() { 6401 get canvas() {
6185 return wrap(this.impl.canvas); 6402 return wrap(unsafeUnwrap(this).canvas);
6186 }, 6403 },
6187 6404
6188 texImage2D: function() { 6405 texImage2D: function() {
6189 arguments[5] = unwrapIfNeeded(arguments[5]); 6406 arguments[5] = unwrapIfNeeded(arguments[5]);
6190 this.impl.texImage2D.apply(this.impl, arguments); 6407 unsafeUnwrap(this).texImage2D.apply(unsafeUnwrap(this), arguments);
6191 }, 6408 },
6192 6409
6193 texSubImage2D: function() { 6410 texSubImage2D: function() {
6194 arguments[6] = unwrapIfNeeded(arguments[6]); 6411 arguments[6] = unwrapIfNeeded(arguments[6]);
6195 this.impl.texSubImage2D.apply(this.impl, arguments); 6412 unsafeUnwrap(this).texSubImage2D.apply(unsafeUnwrap(this), arguments);
6196 } 6413 }
6197 }); 6414 });
6198 6415
6199 // Blink/WebKit has broken DOM bindings. Usually we would create an instance 6416 // Blink/WebKit has broken DOM bindings. Usually we would create an instance
6200 // of the object and pass it into registerWrapper as a "blueprint" but 6417 // of the object and pass it into registerWrapper as a "blueprint" but
6201 // creating WebGL contexts is expensive and might fail so we use a dummy 6418 // creating WebGL contexts is expensive and might fail so we use a dummy
6202 // object with dummy instance properties for these broken browsers. 6419 // object with dummy instance properties for these broken browsers.
6203 var instanceProperties = /WebKit/.test(navigator.userAgent) ? 6420 var instanceProperties = /WebKit/.test(navigator.userAgent) ?
6204 {drawingBufferHeight: null, drawingBufferWidth: null} : {}; 6421 {drawingBufferHeight: null, drawingBufferWidth: null} : {};
6205 6422
6206 registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext, 6423 registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext,
6207 instanceProperties); 6424 instanceProperties);
6208 6425
6209 scope.wrappers.WebGLRenderingContext = WebGLRenderingContext; 6426 scope.wrappers.WebGLRenderingContext = WebGLRenderingContext;
6210 })(window.ShadowDOMPolyfill); 6427 })(window.ShadowDOMPolyfill);
6211 6428
6212 // Copyright 2013 The Polymer Authors. All rights reserved. 6429 // Copyright 2013 The Polymer Authors. All rights reserved.
6213 // Use of this source code is goverened by a BSD-style 6430 // Use of this source code is goverened by a BSD-style
6214 // license that can be found in the LICENSE file. 6431 // license that can be found in the LICENSE file.
6215 6432
6216 (function(scope) { 6433 (function(scope) {
6217 'use strict'; 6434 'use strict';
6218 6435
6219 var registerWrapper = scope.registerWrapper; 6436 var registerWrapper = scope.registerWrapper;
6437 var setWrapper = scope.setWrapper;
6438 var unsafeUnwrap = scope.unsafeUnwrap;
6220 var unwrap = scope.unwrap; 6439 var unwrap = scope.unwrap;
6221 var unwrapIfNeeded = scope.unwrapIfNeeded; 6440 var unwrapIfNeeded = scope.unwrapIfNeeded;
6222 var wrap = scope.wrap; 6441 var wrap = scope.wrap;
6223 6442
6224 var OriginalRange = window.Range; 6443 var OriginalRange = window.Range;
6225 6444
6226 function Range(impl) { 6445 function Range(impl) {
6227 this.impl = impl; 6446 setWrapper(impl, this);
6228 } 6447 }
6229 Range.prototype = { 6448 Range.prototype = {
6230 get startContainer() { 6449 get startContainer() {
6231 return wrap(this.impl.startContainer); 6450 return wrap(unsafeUnwrap(this).startContainer);
6232 }, 6451 },
6233 get endContainer() { 6452 get endContainer() {
6234 return wrap(this.impl.endContainer); 6453 return wrap(unsafeUnwrap(this).endContainer);
6235 }, 6454 },
6236 get commonAncestorContainer() { 6455 get commonAncestorContainer() {
6237 return wrap(this.impl.commonAncestorContainer); 6456 return wrap(unsafeUnwrap(this).commonAncestorContainer);
6238 }, 6457 },
6239 setStart: function(refNode,offset) { 6458 setStart: function(refNode,offset) {
6240 this.impl.setStart(unwrapIfNeeded(refNode), offset); 6459 unsafeUnwrap(this).setStart(unwrapIfNeeded(refNode), offset);
6241 }, 6460 },
6242 setEnd: function(refNode,offset) { 6461 setEnd: function(refNode,offset) {
6243 this.impl.setEnd(unwrapIfNeeded(refNode), offset); 6462 unsafeUnwrap(this).setEnd(unwrapIfNeeded(refNode), offset);
6244 }, 6463 },
6245 setStartBefore: function(refNode) { 6464 setStartBefore: function(refNode) {
6246 this.impl.setStartBefore(unwrapIfNeeded(refNode)); 6465 unsafeUnwrap(this).setStartBefore(unwrapIfNeeded(refNode));
6247 }, 6466 },
6248 setStartAfter: function(refNode) { 6467 setStartAfter: function(refNode) {
6249 this.impl.setStartAfter(unwrapIfNeeded(refNode)); 6468 unsafeUnwrap(this).setStartAfter(unwrapIfNeeded(refNode));
6250 }, 6469 },
6251 setEndBefore: function(refNode) { 6470 setEndBefore: function(refNode) {
6252 this.impl.setEndBefore(unwrapIfNeeded(refNode)); 6471 unsafeUnwrap(this).setEndBefore(unwrapIfNeeded(refNode));
6253 }, 6472 },
6254 setEndAfter: function(refNode) { 6473 setEndAfter: function(refNode) {
6255 this.impl.setEndAfter(unwrapIfNeeded(refNode)); 6474 unsafeUnwrap(this).setEndAfter(unwrapIfNeeded(refNode));
6256 }, 6475 },
6257 selectNode: function(refNode) { 6476 selectNode: function(refNode) {
6258 this.impl.selectNode(unwrapIfNeeded(refNode)); 6477 unsafeUnwrap(this).selectNode(unwrapIfNeeded(refNode));
6259 }, 6478 },
6260 selectNodeContents: function(refNode) { 6479 selectNodeContents: function(refNode) {
6261 this.impl.selectNodeContents(unwrapIfNeeded(refNode)); 6480 unsafeUnwrap(this).selectNodeContents(unwrapIfNeeded(refNode));
6262 }, 6481 },
6263 compareBoundaryPoints: function(how, sourceRange) { 6482 compareBoundaryPoints: function(how, sourceRange) {
6264 return this.impl.compareBoundaryPoints(how, unwrap(sourceRange)); 6483 return unsafeUnwrap(this).compareBoundaryPoints(how, unwrap(sourceRange));
6265 }, 6484 },
6266 extractContents: function() { 6485 extractContents: function() {
6267 return wrap(this.impl.extractContents()); 6486 return wrap(unsafeUnwrap(this).extractContents());
6268 }, 6487 },
6269 cloneContents: function() { 6488 cloneContents: function() {
6270 return wrap(this.impl.cloneContents()); 6489 return wrap(unsafeUnwrap(this).cloneContents());
6271 }, 6490 },
6272 insertNode: function(node) { 6491 insertNode: function(node) {
6273 this.impl.insertNode(unwrapIfNeeded(node)); 6492 unsafeUnwrap(this).insertNode(unwrapIfNeeded(node));
6274 }, 6493 },
6275 surroundContents: function(newParent) { 6494 surroundContents: function(newParent) {
6276 this.impl.surroundContents(unwrapIfNeeded(newParent)); 6495 unsafeUnwrap(this).surroundContents(unwrapIfNeeded(newParent));
6277 }, 6496 },
6278 cloneRange: function() { 6497 cloneRange: function() {
6279 return wrap(this.impl.cloneRange()); 6498 return wrap(unsafeUnwrap(this).cloneRange());
6280 }, 6499 },
6281 isPointInRange: function(node, offset) { 6500 isPointInRange: function(node, offset) {
6282 return this.impl.isPointInRange(unwrapIfNeeded(node), offset); 6501 return unsafeUnwrap(this).isPointInRange(unwrapIfNeeded(node), offset);
6283 }, 6502 },
6284 comparePoint: function(node, offset) { 6503 comparePoint: function(node, offset) {
6285 return this.impl.comparePoint(unwrapIfNeeded(node), offset); 6504 return unsafeUnwrap(this).comparePoint(unwrapIfNeeded(node), offset);
6286 }, 6505 },
6287 intersectsNode: function(node) { 6506 intersectsNode: function(node) {
6288 return this.impl.intersectsNode(unwrapIfNeeded(node)); 6507 return unsafeUnwrap(this).intersectsNode(unwrapIfNeeded(node));
6289 }, 6508 },
6290 toString: function() { 6509 toString: function() {
6291 return this.impl.toString(); 6510 return unsafeUnwrap(this).toString();
6292 } 6511 }
6293 }; 6512 };
6294 6513
6295 // IE9 does not have createContextualFragment. 6514 // IE9 does not have createContextualFragment.
6296 if (OriginalRange.prototype.createContextualFragment) { 6515 if (OriginalRange.prototype.createContextualFragment) {
6297 Range.prototype.createContextualFragment = function(html) { 6516 Range.prototype.createContextualFragment = function(html) {
6298 return wrap(this.impl.createContextualFragment(html)); 6517 return wrap(unsafeUnwrap(this).createContextualFragment(html));
6299 }; 6518 };
6300 } 6519 }
6301 6520
6302 registerWrapper(window.Range, Range, document.createRange()); 6521 registerWrapper(window.Range, Range, document.createRange());
6303 6522
6304 scope.wrappers.Range = Range; 6523 scope.wrappers.Range = Range;
6305 6524
6306 })(window.ShadowDOMPolyfill); 6525 })(window.ShadowDOMPolyfill);
6307 6526
6308 // Copyright 2013 The Polymer Authors. All rights reserved. 6527 // Copyright 2013 The Polymer Authors. All rights reserved.
(...skipping 29 matching lines...) Expand all
6338 'use strict'; 6557 'use strict';
6339 6558
6340 var DocumentFragment = scope.wrappers.DocumentFragment; 6559 var DocumentFragment = scope.wrappers.DocumentFragment;
6341 var TreeScope = scope.TreeScope; 6560 var TreeScope = scope.TreeScope;
6342 var elementFromPoint = scope.elementFromPoint; 6561 var elementFromPoint = scope.elementFromPoint;
6343 var getInnerHTML = scope.getInnerHTML; 6562 var getInnerHTML = scope.getInnerHTML;
6344 var getTreeScope = scope.getTreeScope; 6563 var getTreeScope = scope.getTreeScope;
6345 var mixin = scope.mixin; 6564 var mixin = scope.mixin;
6346 var rewrap = scope.rewrap; 6565 var rewrap = scope.rewrap;
6347 var setInnerHTML = scope.setInnerHTML; 6566 var setInnerHTML = scope.setInnerHTML;
6567 var unsafeUnwrap = scope.unsafeUnwrap;
6348 var unwrap = scope.unwrap; 6568 var unwrap = scope.unwrap;
6349 6569
6350 var shadowHostTable = new WeakMap(); 6570 var shadowHostTable = new WeakMap();
6351 var nextOlderShadowTreeTable = new WeakMap(); 6571 var nextOlderShadowTreeTable = new WeakMap();
6352 6572
6353 var spaceCharRe = /[ \t\n\r\f]/; 6573 var spaceCharRe = /[ \t\n\r\f]/;
6354 6574
6355 function ShadowRoot(hostWrapper) { 6575 function ShadowRoot(hostWrapper) {
6356 var node = unwrap(hostWrapper.impl.ownerDocument.createDocumentFragment()); 6576 var node = unwrap(unsafeUnwrap(hostWrapper).ownerDocument.createDocumentFrag ment());
6357 DocumentFragment.call(this, node); 6577 DocumentFragment.call(this, node);
6358 6578
6359 // createDocumentFragment associates the node with a wrapper 6579 // createDocumentFragment associates the node with a wrapper
6360 // DocumentFragment instance. Override that. 6580 // DocumentFragment instance. Override that.
6361 rewrap(node, this); 6581 rewrap(node, this);
6362 6582
6363 var oldShadowRoot = hostWrapper.shadowRoot; 6583 var oldShadowRoot = hostWrapper.shadowRoot;
6364 nextOlderShadowTreeTable.set(this, oldShadowRoot); 6584 nextOlderShadowTreeTable.set(this, oldShadowRoot);
6365 6585
6366 this.treeScope_ = 6586 this.treeScope_ =
6367 new TreeScope(this, getTreeScope(oldShadowRoot || hostWrapper)); 6587 new TreeScope(this, getTreeScope(oldShadowRoot || hostWrapper));
6368 6588
6369 shadowHostTable.set(this, hostWrapper); 6589 shadowHostTable.set(this, hostWrapper);
6370 } 6590 }
6371 ShadowRoot.prototype = Object.create(DocumentFragment.prototype); 6591 ShadowRoot.prototype = Object.create(DocumentFragment.prototype);
6372 mixin(ShadowRoot.prototype, { 6592 mixin(ShadowRoot.prototype, {
6593 constructor: ShadowRoot,
6594
6373 get innerHTML() { 6595 get innerHTML() {
6374 return getInnerHTML(this); 6596 return getInnerHTML(this);
6375 }, 6597 },
6376 set innerHTML(value) { 6598 set innerHTML(value) {
6377 setInnerHTML(this, value); 6599 setInnerHTML(this, value);
6378 this.invalidateShadowRenderer(); 6600 this.invalidateShadowRenderer();
6379 }, 6601 },
6380 6602
6381 get olderShadowRoot() { 6603 get olderShadowRoot() {
6382 return nextOlderShadowTreeTable.get(this) || null; 6604 return nextOlderShadowTreeTable.get(this) || null;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
6414 6636
6415 var Element = scope.wrappers.Element; 6637 var Element = scope.wrappers.Element;
6416 var HTMLContentElement = scope.wrappers.HTMLContentElement; 6638 var HTMLContentElement = scope.wrappers.HTMLContentElement;
6417 var HTMLShadowElement = scope.wrappers.HTMLShadowElement; 6639 var HTMLShadowElement = scope.wrappers.HTMLShadowElement;
6418 var Node = scope.wrappers.Node; 6640 var Node = scope.wrappers.Node;
6419 var ShadowRoot = scope.wrappers.ShadowRoot; 6641 var ShadowRoot = scope.wrappers.ShadowRoot;
6420 var assert = scope.assert; 6642 var assert = scope.assert;
6421 var getTreeScope = scope.getTreeScope; 6643 var getTreeScope = scope.getTreeScope;
6422 var mixin = scope.mixin; 6644 var mixin = scope.mixin;
6423 var oneOf = scope.oneOf; 6645 var oneOf = scope.oneOf;
6646 var unsafeUnwrap = scope.unsafeUnwrap;
6424 var unwrap = scope.unwrap; 6647 var unwrap = scope.unwrap;
6425 var wrap = scope.wrap; 6648 var wrap = scope.wrap;
6426 6649
6427 /** 6650 /**
6428 * Updates the fields of a wrapper to a snapshot of the logical DOM as needed. 6651 * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.
6429 * Up means parentNode 6652 * Up means parentNode
6430 * Sideways means previous and next sibling. 6653 * Sideways means previous and next sibling.
6431 * @param {!Node} wrapper 6654 * @param {!Node} wrapper
6432 */ 6655 */
6433 function updateWrapperUpAndSideways(wrapper) { 6656 function updateWrapperUpAndSideways(wrapper) {
(...skipping 450 matching lines...) Expand 10 before | Expand all | Expand 10 after
6884 }); 7107 });
6885 7108
6886 // Pseudo selectors have been removed from the spec. 7109 // Pseudo selectors have been removed from the spec.
6887 }, 7110 },
6888 7111
6889 dependsOnAttribute: function(name) { 7112 dependsOnAttribute: function(name) {
6890 return this.attributes[name]; 7113 return this.attributes[name];
6891 }, 7114 },
6892 7115
6893 associateNode: function(node) { 7116 associateNode: function(node) {
6894 node.impl.polymerShadowRenderer_ = this; 7117 unsafeUnwrap(node).polymerShadowRenderer_ = this;
6895 } 7118 }
6896 }; 7119 };
6897 7120
6898 // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-population-algorit hm 7121 // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-population-algorit hm
6899 function poolPopulation(node) { 7122 function poolPopulation(node) {
6900 var pool = []; 7123 var pool = [];
6901 for (var child = node.firstChild; child; child = child.nextSibling) { 7124 for (var child = node.firstChild; child; child = child.nextSibling) {
6902 if (isInsertionPoint(child)) { 7125 if (isInsertionPoint(child)) {
6903 pool.push.apply(pool, getDistributedNodes(child)); 7126 pool.push.apply(pool, getDistributedNodes(child));
6904 } else { 7127 } else {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
6938 // IE11 crashes when delete is used. 7161 // IE11 crashes when delete is used.
6939 destinationInsertionPointsTable.set(node, undefined); 7162 destinationInsertionPointsTable.set(node, undefined);
6940 } 7163 }
6941 7164
6942 // AllowedSelectors : 7165 // AllowedSelectors :
6943 // TypeSelector 7166 // TypeSelector
6944 // * 7167 // *
6945 // ClassSelector 7168 // ClassSelector
6946 // IDSelector 7169 // IDSelector
6947 // AttributeSelector 7170 // AttributeSelector
6948 var selectorStartCharRe = /^[*.#[a-zA-Z_|]/; 7171 // negation
7172 var selectorStartCharRe = /^(:not\()?[*.#[a-zA-Z_|]/;
6949 7173
6950 function matches(node, contentElement) { 7174 function matches(node, contentElement) {
6951 var select = contentElement.getAttribute('select'); 7175 var select = contentElement.getAttribute('select');
6952 if (!select) 7176 if (!select)
6953 return true; 7177 return true;
6954 7178
6955 // Here we know the select attribute is a non empty string. 7179 // Here we know the select attribute is a non empty string.
6956 select = select.trim(); 7180 select = select.trim();
6957 if (!select) 7181 if (!select)
6958 return true; 7182 return true;
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
7007 // - a new shadow root is created 7231 // - a new shadow root is created
7008 // - a direct child to a content/shadow element is added or removed 7232 // - a direct child to a content/shadow element is added or removed
7009 // - a sibling to a content/shadow element is added or removed 7233 // - a sibling to a content/shadow element is added or removed
7010 // - content[select] is changed 7234 // - content[select] is changed
7011 // - an attribute in a direct child to a host is modified 7235 // - an attribute in a direct child to a host is modified
7012 7236
7013 /** 7237 /**
7014 * This gets called when a node was added or removed to it. 7238 * This gets called when a node was added or removed to it.
7015 */ 7239 */
7016 Node.prototype.invalidateShadowRenderer = function(force) { 7240 Node.prototype.invalidateShadowRenderer = function(force) {
7017 var renderer = this.impl.polymerShadowRenderer_; 7241 var renderer = unsafeUnwrap(this).polymerShadowRenderer_;
7018 if (renderer) { 7242 if (renderer) {
7019 renderer.invalidate(); 7243 renderer.invalidate();
7020 return true; 7244 return true;
7021 } 7245 }
7022 7246
7023 return false; 7247 return false;
7024 }; 7248 };
7025 7249
7026 HTMLContentElement.prototype.getDistributedNodes = 7250 HTMLContentElement.prototype.getDistributedNodes =
7027 HTMLShadowElement.prototype.getDistributedNodes = function() { 7251 HTMLShadowElement.prototype.getDistributedNodes = function() {
(...skipping 10 matching lines...) Expand all
7038 7262
7039 HTMLContentElement.prototype.nodeIsInserted_ = 7263 HTMLContentElement.prototype.nodeIsInserted_ =
7040 HTMLShadowElement.prototype.nodeIsInserted_ = function() { 7264 HTMLShadowElement.prototype.nodeIsInserted_ = function() {
7041 // Invalidate old renderer if any. 7265 // Invalidate old renderer if any.
7042 this.invalidateShadowRenderer(); 7266 this.invalidateShadowRenderer();
7043 7267
7044 var shadowRoot = getShadowRootAncestor(this); 7268 var shadowRoot = getShadowRootAncestor(this);
7045 var renderer; 7269 var renderer;
7046 if (shadowRoot) 7270 if (shadowRoot)
7047 renderer = getRendererForShadowRoot(shadowRoot); 7271 renderer = getRendererForShadowRoot(shadowRoot);
7048 this.impl.polymerShadowRenderer_ = renderer; 7272 unsafeUnwrap(this).polymerShadowRenderer_ = renderer;
7049 if (renderer) 7273 if (renderer)
7050 renderer.invalidate(); 7274 renderer.invalidate();
7051 }; 7275 };
7052 7276
7053 scope.getRendererForHost = getRendererForHost; 7277 scope.getRendererForHost = getRendererForHost;
7054 scope.getShadowTrees = getShadowTrees; 7278 scope.getShadowTrees = getShadowTrees;
7055 scope.renderAllPending = renderAllPending; 7279 scope.renderAllPending = renderAllPending;
7056 7280
7057 scope.getDestinationInsertionPoints = getDestinationInsertionPoints; 7281 scope.getDestinationInsertionPoints = getDestinationInsertionPoints;
7058 7282
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
7120 })(window.ShadowDOMPolyfill); 7344 })(window.ShadowDOMPolyfill);
7121 7345
7122 // Copyright 2014 The Polymer Authors. All rights reserved. 7346 // Copyright 2014 The Polymer Authors. All rights reserved.
7123 // Use of this source code is goverened by a BSD-style 7347 // Use of this source code is goverened by a BSD-style
7124 // license that can be found in the LICENSE file. 7348 // license that can be found in the LICENSE file.
7125 7349
7126 (function(scope) { 7350 (function(scope) {
7127 'use strict'; 7351 'use strict';
7128 7352
7129 var registerWrapper = scope.registerWrapper; 7353 var registerWrapper = scope.registerWrapper;
7354 var setWrapper = scope.setWrapper;
7355 var unsafeUnwrap = scope.unsafeUnwrap;
7130 var unwrap = scope.unwrap; 7356 var unwrap = scope.unwrap;
7131 var unwrapIfNeeded = scope.unwrapIfNeeded; 7357 var unwrapIfNeeded = scope.unwrapIfNeeded;
7132 var wrap = scope.wrap; 7358 var wrap = scope.wrap;
7133 7359
7134 var OriginalSelection = window.Selection; 7360 var OriginalSelection = window.Selection;
7135 7361
7136 function Selection(impl) { 7362 function Selection(impl) {
7137 this.impl = impl; 7363 setWrapper(impl, this);
7138 } 7364 }
7139 Selection.prototype = { 7365 Selection.prototype = {
7140 get anchorNode() { 7366 get anchorNode() {
7141 return wrap(this.impl.anchorNode); 7367 return wrap(unsafeUnwrap(this).anchorNode);
7142 }, 7368 },
7143 get focusNode() { 7369 get focusNode() {
7144 return wrap(this.impl.focusNode); 7370 return wrap(unsafeUnwrap(this).focusNode);
7145 }, 7371 },
7146 addRange: function(range) { 7372 addRange: function(range) {
7147 this.impl.addRange(unwrap(range)); 7373 unsafeUnwrap(this).addRange(unwrap(range));
7148 }, 7374 },
7149 collapse: function(node, index) { 7375 collapse: function(node, index) {
7150 this.impl.collapse(unwrapIfNeeded(node), index); 7376 unsafeUnwrap(this).collapse(unwrapIfNeeded(node), index);
7151 }, 7377 },
7152 containsNode: function(node, allowPartial) { 7378 containsNode: function(node, allowPartial) {
7153 return this.impl.containsNode(unwrapIfNeeded(node), allowPartial); 7379 return unsafeUnwrap(this).containsNode(unwrapIfNeeded(node), allowPartial) ;
7154 }, 7380 },
7155 extend: function(node, offset) { 7381 extend: function(node, offset) {
7156 this.impl.extend(unwrapIfNeeded(node), offset); 7382 unsafeUnwrap(this).extend(unwrapIfNeeded(node), offset);
7157 }, 7383 },
7158 getRangeAt: function(index) { 7384 getRangeAt: function(index) {
7159 return wrap(this.impl.getRangeAt(index)); 7385 return wrap(unsafeUnwrap(this).getRangeAt(index));
7160 }, 7386 },
7161 removeRange: function(range) { 7387 removeRange: function(range) {
7162 this.impl.removeRange(unwrap(range)); 7388 unsafeUnwrap(this).removeRange(unwrap(range));
7163 }, 7389 },
7164 selectAllChildren: function(node) { 7390 selectAllChildren: function(node) {
7165 this.impl.selectAllChildren(unwrapIfNeeded(node)); 7391 unsafeUnwrap(this).selectAllChildren(unwrapIfNeeded(node));
7166 }, 7392 },
7167 toString: function() { 7393 toString: function() {
7168 return this.impl.toString(); 7394 return unsafeUnwrap(this).toString();
7169 } 7395 }
7170 }; 7396 };
7171 7397
7172 // WebKit extensions. Not implemented. 7398 // WebKit extensions. Not implemented.
7173 // readonly attribute Node baseNode; 7399 // readonly attribute Node baseNode;
7174 // readonly attribute long baseOffset; 7400 // readonly attribute long baseOffset;
7175 // readonly attribute Node extentNode; 7401 // readonly attribute Node extentNode;
7176 // readonly attribute long extentOffset; 7402 // readonly attribute long extentOffset;
7177 // [RaisesException] void setBaseAndExtent([Default=Undefined] optional Node b aseNode, 7403 // [RaisesException] void setBaseAndExtent([Default=Undefined] optional Node b aseNode,
7178 // [Default=Undefined] optional long baseOffset, 7404 // [Default=Undefined] optional long baseOffset,
(...skipping 24 matching lines...) Expand all
7203 var TreeScope = scope.TreeScope; 7429 var TreeScope = scope.TreeScope;
7204 var cloneNode = scope.cloneNode; 7430 var cloneNode = scope.cloneNode;
7205 var defineWrapGetter = scope.defineWrapGetter; 7431 var defineWrapGetter = scope.defineWrapGetter;
7206 var elementFromPoint = scope.elementFromPoint; 7432 var elementFromPoint = scope.elementFromPoint;
7207 var forwardMethodsToWrapper = scope.forwardMethodsToWrapper; 7433 var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;
7208 var matchesNames = scope.matchesNames; 7434 var matchesNames = scope.matchesNames;
7209 var mixin = scope.mixin; 7435 var mixin = scope.mixin;
7210 var registerWrapper = scope.registerWrapper; 7436 var registerWrapper = scope.registerWrapper;
7211 var renderAllPending = scope.renderAllPending; 7437 var renderAllPending = scope.renderAllPending;
7212 var rewrap = scope.rewrap; 7438 var rewrap = scope.rewrap;
7439 var setWrapper = scope.setWrapper;
7440 var unsafeUnwrap = scope.unsafeUnwrap;
7213 var unwrap = scope.unwrap; 7441 var unwrap = scope.unwrap;
7214 var wrap = scope.wrap; 7442 var wrap = scope.wrap;
7215 var wrapEventTargetMethods = scope.wrapEventTargetMethods; 7443 var wrapEventTargetMethods = scope.wrapEventTargetMethods;
7216 var wrapNodeList = scope.wrapNodeList; 7444 var wrapNodeList = scope.wrapNodeList;
7217 7445
7218 var implementationTable = new WeakMap(); 7446 var implementationTable = new WeakMap();
7219 7447
7220 function Document(node) { 7448 function Document(node) {
7221 Node.call(this, node); 7449 Node.call(this, node);
7222 this.treeScope_ = new TreeScope(this, null); 7450 this.treeScope_ = new TreeScope(this, null);
7223 } 7451 }
7224 Document.prototype = Object.create(Node.prototype); 7452 Document.prototype = Object.create(Node.prototype);
7225 7453
7226 defineWrapGetter(Document, 'documentElement'); 7454 defineWrapGetter(Document, 'documentElement');
7227 7455
7228 // Conceptually both body and head can be in a shadow but suporting that seems 7456 // Conceptually both body and head can be in a shadow but suporting that seems
7229 // overkill at this point. 7457 // overkill at this point.
7230 defineWrapGetter(Document, 'body'); 7458 defineWrapGetter(Document, 'body');
7231 defineWrapGetter(Document, 'head'); 7459 defineWrapGetter(Document, 'head');
7232 7460
7233 // document cannot be overridden so we override a bunch of its methods 7461 // document cannot be overridden so we override a bunch of its methods
7234 // directly on the instance. 7462 // directly on the instance.
7235 7463
7236 function wrapMethod(name) { 7464 function wrapMethod(name) {
7237 var original = document[name]; 7465 var original = document[name];
7238 Document.prototype[name] = function() { 7466 Document.prototype[name] = function() {
7239 return wrap(original.apply(this.impl, arguments)); 7467 return wrap(original.apply(unsafeUnwrap(this), arguments));
7240 }; 7468 };
7241 } 7469 }
7242 7470
7243 [ 7471 [
7244 'createComment', 7472 'createComment',
7245 'createDocumentFragment', 7473 'createDocumentFragment',
7246 'createElement', 7474 'createElement',
7247 'createElementNS', 7475 'createElementNS',
7248 'createEvent', 7476 'createEvent',
7249 'createEventNS', 7477 'createEventNS',
7250 'createRange', 7478 'createRange',
7251 'createTextNode', 7479 'createTextNode',
7252 'getElementById' 7480 'getElementById'
7253 ].forEach(wrapMethod); 7481 ].forEach(wrapMethod);
7254 7482
7255 var originalAdoptNode = document.adoptNode; 7483 var originalAdoptNode = document.adoptNode;
7256 7484
7257 function adoptNodeNoRemove(node, doc) { 7485 function adoptNodeNoRemove(node, doc) {
7258 originalAdoptNode.call(doc.impl, unwrap(node)); 7486 originalAdoptNode.call(unsafeUnwrap(doc), unwrap(node));
7259 adoptSubtree(node, doc); 7487 adoptSubtree(node, doc);
7260 } 7488 }
7261 7489
7262 function adoptSubtree(node, doc) { 7490 function adoptSubtree(node, doc) {
7263 if (node.shadowRoot) 7491 if (node.shadowRoot)
7264 doc.adoptNode(node.shadowRoot); 7492 doc.adoptNode(node.shadowRoot);
7265 if (node instanceof ShadowRoot) 7493 if (node instanceof ShadowRoot)
7266 adoptOlderShadowRoots(node, doc); 7494 adoptOlderShadowRoots(node, doc);
7267 for (var child = node.firstChild; child; child = child.nextSibling) { 7495 for (var child = node.firstChild; child; child = child.nextSibling) {
7268 adoptSubtree(child, doc); 7496 adoptSubtree(child, doc);
(...skipping 12 matching lines...) Expand all
7281 adoptNode: function(node) { 7509 adoptNode: function(node) {
7282 if (node.parentNode) 7510 if (node.parentNode)
7283 node.parentNode.removeChild(node); 7511 node.parentNode.removeChild(node);
7284 adoptNodeNoRemove(node, this); 7512 adoptNodeNoRemove(node, this);
7285 return node; 7513 return node;
7286 }, 7514 },
7287 elementFromPoint: function(x, y) { 7515 elementFromPoint: function(x, y) {
7288 return elementFromPoint(this, this, x, y); 7516 return elementFromPoint(this, this, x, y);
7289 }, 7517 },
7290 importNode: function(node, deep) { 7518 importNode: function(node, deep) {
7291 return cloneNode(node, deep, this.impl); 7519 return cloneNode(node, deep, unsafeUnwrap(this));
7292 }, 7520 },
7293 getSelection: function() { 7521 getSelection: function() {
7294 renderAllPending(); 7522 renderAllPending();
7295 return new Selection(originalGetSelection.call(unwrap(this))); 7523 return new Selection(originalGetSelection.call(unwrap(this)));
7296 }, 7524 },
7297 getElementsByName: function(name) { 7525 getElementsByName: function(name) {
7298 return SelectorsInterface.querySelectorAll.call(this, 7526 return SelectorsInterface.querySelectorAll.call(this,
7299 '[name=' + JSON.stringify(String(name)) + ']'); 7527 '[name=' + JSON.stringify(String(name)) + ']');
7300 } 7528 }
7301 }); 7529 });
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
7376 p.extends = extendsOption; 7604 p.extends = extendsOption;
7377 7605
7378 function CustomElementConstructor(node) { 7606 function CustomElementConstructor(node) {
7379 if (!node) { 7607 if (!node) {
7380 if (extendsOption) { 7608 if (extendsOption) {
7381 return document.createElement(extendsOption, tagName); 7609 return document.createElement(extendsOption, tagName);
7382 } else { 7610 } else {
7383 return document.createElement(tagName); 7611 return document.createElement(tagName);
7384 } 7612 }
7385 } 7613 }
7386 this.impl = node; 7614 setWrapper(node, this);
7387 } 7615 }
7388 CustomElementConstructor.prototype = prototype; 7616 CustomElementConstructor.prototype = prototype;
7389 CustomElementConstructor.prototype.constructor = CustomElementConstructor; 7617 CustomElementConstructor.prototype.constructor = CustomElementConstructor;
7390 7618
7391 scope.constructorTable.set(newPrototype, CustomElementConstructor); 7619 scope.constructorTable.set(newPrototype, CustomElementConstructor);
7392 scope.nativePrototypeTable.set(prototype, newPrototype); 7620 scope.nativePrototypeTable.set(prototype, newPrototype);
7393 7621
7394 // registration is synchronous so do it last 7622 // registration is synchronous so do it last
7395 var nativeConstructor = originalRegisterElement.call(unwrap(this), 7623 var nativeConstructor = originalRegisterElement.call(unwrap(this),
7396 tagName, p); 7624 tagName, p);
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
7473 if (window.HTMLDocument) 7701 if (window.HTMLDocument)
7474 registerWrapper(window.HTMLDocument, Document); 7702 registerWrapper(window.HTMLDocument, Document);
7475 7703
7476 wrapEventTargetMethods([ 7704 wrapEventTargetMethods([
7477 window.HTMLBodyElement, 7705 window.HTMLBodyElement,
7478 window.HTMLDocument || window.Document, // Gecko adds these to HTMLDocument 7706 window.HTMLDocument || window.Document, // Gecko adds these to HTMLDocument
7479 window.HTMLHeadElement, 7707 window.HTMLHeadElement,
7480 ]); 7708 ]);
7481 7709
7482 function DOMImplementation(impl) { 7710 function DOMImplementation(impl) {
7483 this.impl = impl; 7711 setWrapper(impl, this);
7484 } 7712 }
7485 7713
7486 function wrapImplMethod(constructor, name) { 7714 function wrapImplMethod(constructor, name) {
7487 var original = document.implementation[name]; 7715 var original = document.implementation[name];
7488 constructor.prototype[name] = function() { 7716 constructor.prototype[name] = function() {
7489 return wrap(original.apply(this.impl, arguments)); 7717 return wrap(original.apply(unsafeUnwrap(this), arguments));
7490 }; 7718 };
7491 } 7719 }
7492 7720
7493 function forwardImplMethod(constructor, name) { 7721 function forwardImplMethod(constructor, name) {
7494 var original = document.implementation[name]; 7722 var original = document.implementation[name];
7495 constructor.prototype[name] = function() { 7723 constructor.prototype[name] = function() {
7496 return original.apply(this.impl, arguments); 7724 return original.apply(unsafeUnwrap(this), arguments);
7497 }; 7725 };
7498 } 7726 }
7499 7727
7500 wrapImplMethod(DOMImplementation, 'createDocumentType'); 7728 wrapImplMethod(DOMImplementation, 'createDocumentType');
7501 wrapImplMethod(DOMImplementation, 'createDocument'); 7729 wrapImplMethod(DOMImplementation, 'createDocument');
7502 wrapImplMethod(DOMImplementation, 'createHTMLDocument'); 7730 wrapImplMethod(DOMImplementation, 'createHTMLDocument');
7503 forwardImplMethod(DOMImplementation, 'hasFeature'); 7731 forwardImplMethod(DOMImplementation, 'hasFeature');
7504 7732
7505 registerWrapper(window.DOMImplementation, DOMImplementation); 7733 registerWrapper(window.DOMImplementation, DOMImplementation);
7506 7734
(...skipping 23 matching lines...) Expand all
7530 var Selection = scope.wrappers.Selection; 7758 var Selection = scope.wrappers.Selection;
7531 var mixin = scope.mixin; 7759 var mixin = scope.mixin;
7532 var registerWrapper = scope.registerWrapper; 7760 var registerWrapper = scope.registerWrapper;
7533 var renderAllPending = scope.renderAllPending; 7761 var renderAllPending = scope.renderAllPending;
7534 var unwrap = scope.unwrap; 7762 var unwrap = scope.unwrap;
7535 var unwrapIfNeeded = scope.unwrapIfNeeded; 7763 var unwrapIfNeeded = scope.unwrapIfNeeded;
7536 var wrap = scope.wrap; 7764 var wrap = scope.wrap;
7537 7765
7538 var OriginalWindow = window.Window; 7766 var OriginalWindow = window.Window;
7539 var originalGetComputedStyle = window.getComputedStyle; 7767 var originalGetComputedStyle = window.getComputedStyle;
7768 var originalGetDefaultComputedStyle = window.getDefaultComputedStyle;
7540 var originalGetSelection = window.getSelection; 7769 var originalGetSelection = window.getSelection;
7541 7770
7542 function Window(impl) { 7771 function Window(impl) {
7543 EventTarget.call(this, impl); 7772 EventTarget.call(this, impl);
7544 } 7773 }
7545 Window.prototype = Object.create(EventTarget.prototype); 7774 Window.prototype = Object.create(EventTarget.prototype);
7546 7775
7547 OriginalWindow.prototype.getComputedStyle = function(el, pseudo) { 7776 OriginalWindow.prototype.getComputedStyle = function(el, pseudo) {
7548 return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo); 7777 return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);
7549 }; 7778 };
7550 7779
7780 // Mozilla proprietary extension.
7781 if (originalGetDefaultComputedStyle) {
7782 OriginalWindow.prototype.getDefaultComputedStyle = function(el, pseudo) {
7783 return wrap(this || window).getDefaultComputedStyle(
7784 unwrapIfNeeded(el), pseudo);
7785 };
7786 }
7787
7551 OriginalWindow.prototype.getSelection = function() { 7788 OriginalWindow.prototype.getSelection = function() {
7552 return wrap(this || window).getSelection(); 7789 return wrap(this || window).getSelection();
7553 }; 7790 };
7554 7791
7555 // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065 7792 // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065
7556 delete window.getComputedStyle; 7793 delete window.getComputedStyle;
7557 delete window.getSelection; 7794 delete window.getSelection;
7558 7795
7559 ['addEventListener', 'removeEventListener', 'dispatchEvent'].forEach( 7796 ['addEventListener', 'removeEventListener', 'dispatchEvent'].forEach(
7560 function(name) { 7797 function(name) {
(...skipping 15 matching lines...) Expand all
7576 getSelection: function() { 7813 getSelection: function() {
7577 renderAllPending(); 7814 renderAllPending();
7578 return new Selection(originalGetSelection.call(unwrap(this))); 7815 return new Selection(originalGetSelection.call(unwrap(this)));
7579 }, 7816 },
7580 7817
7581 get document() { 7818 get document() {
7582 return wrap(unwrap(this).document); 7819 return wrap(unwrap(this).document);
7583 } 7820 }
7584 }); 7821 });
7585 7822
7823 // Mozilla proprietary extension.
7824 if (originalGetDefaultComputedStyle) {
7825 Window.prototype.getDefaultComputedStyle = function(el, pseudo) {
7826 renderAllPending();
7827 return originalGetDefaultComputedStyle.call(unwrap(this),
7828 unwrapIfNeeded(el),pseudo);
7829 };
7830 }
7831
7586 registerWrapper(OriginalWindow, Window, window); 7832 registerWrapper(OriginalWindow, Window, window);
7587 7833
7588 scope.wrappers.Window = Window; 7834 scope.wrappers.Window = Window;
7589 7835
7590 })(window.ShadowDOMPolyfill); 7836 })(window.ShadowDOMPolyfill);
7591 7837
7592 /** 7838 /**
7593 * Copyright 2014 The Polymer Authors. All rights reserved. 7839 * Copyright 2014 The Polymer Authors. All rights reserved.
7594 * Use of this source code is goverened by a BSD-style 7840 * Use of this source code is goverened by a BSD-style
7595 * license that can be found in the LICENSE file. 7841 * license that can be found in the LICENSE file.
(...skipping 23 matching lines...) Expand all
7619 /** 7865 /**
7620 * Copyright 2014 The Polymer Authors. All rights reserved. 7866 * Copyright 2014 The Polymer Authors. All rights reserved.
7621 * Use of this source code is goverened by a BSD-style 7867 * Use of this source code is goverened by a BSD-style
7622 * license that can be found in the LICENSE file. 7868 * license that can be found in the LICENSE file.
7623 */ 7869 */
7624 7870
7625 (function(scope) { 7871 (function(scope) {
7626 'use strict'; 7872 'use strict';
7627 7873
7628 var registerWrapper = scope.registerWrapper; 7874 var registerWrapper = scope.registerWrapper;
7875 var setWrapper = scope.setWrapper;
7629 var unwrap = scope.unwrap; 7876 var unwrap = scope.unwrap;
7630 7877
7631 var OriginalFormData = window.FormData; 7878 var OriginalFormData = window.FormData;
7632 7879
7633 function FormData(formElement) { 7880 function FormData(formElement) {
7634 this.impl = new OriginalFormData(formElement && unwrap(formElement)); 7881 var impl;
7882 if (formElement instanceof OriginalFormData) {
7883 impl = formElement;
7884 } else {
7885 impl = new OriginalFormData(formElement && unwrap(formElement));
7886 }
7887 setWrapper(impl, this);
7635 } 7888 }
7636 7889
7637 registerWrapper(OriginalFormData, FormData, new OriginalFormData()); 7890 registerWrapper(OriginalFormData, FormData, new OriginalFormData());
7638 7891
7639 scope.wrappers.FormData = FormData; 7892 scope.wrappers.FormData = FormData;
7640 7893
7641 })(window.ShadowDOMPolyfill); 7894 })(window.ShadowDOMPolyfill);
7642 7895
7643 // Copyright 2013 The Polymer Authors. All rights reserved. 7896 // Copyright 2013 The Polymer Authors. All rights reserved.
7644 // Use of this source code is goverened by a BSD-style 7897 // Use of this source code is goverened by a BSD-style
(...skipping 743 matching lines...) Expand 10 before | Expand all | Expand 10 after
8388 } else { 8641 } else {
8389 addCssToDocument(cssText); 8642 addCssToDocument(cssText);
8390 } 8643 }
8391 } 8644 }
8392 }; 8645 };
8393 8646
8394 var selectorRe = /([^{]*)({[\s\S]*?})/gim, 8647 var selectorRe = /([^{]*)({[\s\S]*?})/gim,
8395 cssCommentRe = /\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim, 8648 cssCommentRe = /\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,
8396 // TODO(sorvell): remove either content or comment 8649 // TODO(sorvell): remove either content or comment
8397 cssCommentNextSelectorRe = /\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^ {]*?){/gim, 8650 cssCommentNextSelectorRe = /\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^ {]*?){/gim,
8398 cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\:[\s]*['|"]([ ^'"]*)['|"][^}]*}([^{]*?){/gim, 8651 cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\:[\s]*?['"](. *?)['"][;\s]*}([^{]*?){/gim,
8399 // TODO(sorvell): remove either content or comment 8652 // TODO(sorvell): remove either content or comment
8400 cssCommentRuleRe = /\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim, 8653 cssCommentRuleRe = /\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,
8401 cssContentRuleRe = /(polyfill-rule)[^}]*(content\:[\s]*['|"]([^'"]*)['|"][^; ]*;)[^}]*}/gim, 8654 cssContentRuleRe = /(polyfill-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[ ^}]*}/gim,
8402 // TODO(sorvell): remove either content or comment 8655 // TODO(sorvell): remove either content or comment
8403 cssCommentUnscopedRuleRe = /\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*] *\*+)*)\//gim, 8656 cssCommentUnscopedRuleRe = /\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*] *\*+)*)\//gim,
8404 cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\:[\s]*['|" ]([^'"]*)['|"][^;]*;)[^}]*}/gim, 8657 cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\:[\s]*['"] (.*?)['"])[;\s]*[^}]*}/gim,
8405 cssPseudoRe = /::(x-[^\s{,(]*)/gim, 8658 cssPseudoRe = /::(x-[^\s{,(]*)/gim,
8406 cssPartRe = /::part\(([^)]*)\)/gim, 8659 cssPartRe = /::part\(([^)]*)\)/gim,
8407 // note: :host pre-processed to -shadowcsshost. 8660 // note: :host pre-processed to -shadowcsshost.
8408 polyfillHost = '-shadowcsshost', 8661 polyfillHost = '-shadowcsshost',
8409 // note: :host-context pre-processed to -shadowcsshostcontext. 8662 // note: :host-context pre-processed to -shadowcsshostcontext.
8410 polyfillHostContext = '-shadowcsscontext', 8663 polyfillHostContext = '-shadowcsscontext',
8411 parenSuffix = ')(?:\\((' + 8664 parenSuffix = ')(?:\\((' +
8412 '(?:\\([^)(]*\\)|[^)(]*)+?' + 8665 '(?:\\([^)(]*\\)|[^)(]*)+?' +
8413 ')\\))?([^,{]*)'; 8666 ')\\))?([^,{]*)';
8414 cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'), 8667 cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
8590 style.textContent = ShadowCSS.shimStyle(style); 8843 style.textContent = ShadowCSS.shimStyle(style);
8591 style.removeAttribute(SHIM_ATTRIBUTE, ''); 8844 style.removeAttribute(SHIM_ATTRIBUTE, '');
8592 style.setAttribute(SHIMMED_ATTRIBUTE, ''); 8845 style.setAttribute(SHIMMED_ATTRIBUTE, '');
8593 style[SHIMMED_ATTRIBUTE] = true; 8846 style[SHIMMED_ATTRIBUTE] = true;
8594 // place in document 8847 // place in document
8595 if (style.parentNode !== head) { 8848 if (style.parentNode !== head) {
8596 // replace links in head 8849 // replace links in head
8597 if (elt.parentNode === head) { 8850 if (elt.parentNode === head) {
8598 head.replaceChild(style, elt); 8851 head.replaceChild(style, elt);
8599 } else { 8852 } else {
8600 head.appendChild(style); 8853 this.addElementToDocument(style);
8601 } 8854 }
8602 } 8855 }
8603 style.__importParsed = true; 8856 style.__importParsed = true;
8604 this.markParsingComplete(elt); 8857 this.markParsingComplete(elt);
8605 this.parseNext(); 8858 this.parseNext();
8606 } 8859 }
8607 8860
8608 var hasResource = HTMLImports.parser.hasResource; 8861 var hasResource = HTMLImports.parser.hasResource;
8609 HTMLImports.parser.hasResource = function(node) { 8862 HTMLImports.parser.hasResource = function(node) {
8610 if (node.localName === 'link' && node.rel === 'stylesheet' && 8863 if (node.localName === 'link' && node.rel === 'stylesheet' &&
(...skipping 616 matching lines...) Expand 10 before | Expand all | Expand 10 after
9227 set hash(hash) { 9480 set hash(hash) {
9228 if (this._isInvalid) 9481 if (this._isInvalid)
9229 return; 9482 return;
9230 this._fragment = '#'; 9483 this._fragment = '#';
9231 if ('#' == hash[0]) 9484 if ('#' == hash[0])
9232 hash = hash.slice(1); 9485 hash = hash.slice(1);
9233 parse.call(this, hash, 'fragment'); 9486 parse.call(this, hash, 'fragment');
9234 } 9487 }
9235 }; 9488 };
9236 9489
9490 // Copy over the static methods
9491 var OriginalURL = scope.URL;
9492 if (OriginalURL) {
9493 jURL.createObjectURL = function(blob) {
9494 // IE extension allows a second optional options argument.
9495 // http://msdn.microsoft.com/en-us/library/ie/hh772302(v=vs.85).aspx
9496 return OriginalURL.createObjectURL.apply(OriginalURL, arguments);
9497 };
9498 jURL.revokeObjectURL = function(url) {
9499 OriginalURL.revokeObjectURL(url);
9500 };
9501 }
9502
9237 scope.URL = jURL; 9503 scope.URL = jURL;
9238 9504
9239 })(window); 9505 })(this);
9240 9506
9241 /* 9507 /*
9242 * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. 9508 * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
9243 * This code may only be used under the BSD style license found at http://polyme r.github.io/LICENSE.txt 9509 * This code may only be used under the BSD style license found at http://polyme r.github.io/LICENSE.txt
9244 * The complete set of authors may be found at http://polymer.github.io/AUTHORS. txt 9510 * The complete set of authors may be found at http://polymer.github.io/AUTHORS. txt
9245 * The complete set of contributors may be found at http://polymer.github.io/CON TRIBUTORS.txt 9511 * The complete set of contributors may be found at http://polymer.github.io/CON TRIBUTORS.txt
9246 * Code distributed by Google as part of the polymer project is also 9512 * Code distributed by Google as part of the polymer project is also
9247 * subject to an additional IP rights grant found at http://polymer.github.io/PA TENTS.txt 9513 * subject to an additional IP rights grant found at http://polymer.github.io/PA TENTS.txt
9248 */ 9514 */
9249 9515
(...skipping 1207 matching lines...) Expand 10 before | Expand all | Expand 10 after
10457 10723
10458 global.JsMutationObserver = JsMutationObserver; 10724 global.JsMutationObserver = JsMutationObserver;
10459 10725
10460 if (!global.MutationObserver) 10726 if (!global.MutationObserver)
10461 global.MutationObserver = JsMutationObserver; 10727 global.MutationObserver = JsMutationObserver;
10462 10728
10463 10729
10464 })(this); 10730 })(this);
10465 10731
10466 /* 10732 /*
10467 * Copyright 2013 The Polymer Authors. All rights reserved. 10733 * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
10468 * Use of this source code is governed by a BSD-style 10734 * This code may only be used under the BSD style license found at http://polyme r.github.io/LICENSE.txt
10469 * license that can be found in the LICENSE file. 10735 * The complete set of authors may be found at http://polymer.github.io/AUTHORS. txt
10736 * The complete set of contributors may be found at http://polymer.github.io/CON TRIBUTORS.txt
10737 * Code distributed by Google as part of the polymer project is also
10738 * subject to an additional IP rights grant found at http://polymer.github.io/PA TENTS.txt
10470 */ 10739 */
10471 window.HTMLImports = window.HTMLImports || {flags:{}}; 10740 window.HTMLImports = window.HTMLImports || {flags:{}};
10472 /* 10741 /*
10473 * Copyright 2013 The Polymer Authors. All rights reserved. 10742 * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
10474 * Use of this source code is governed by a BSD-style 10743 * This code may only be used under the BSD style license found at http://polyme r.github.io/LICENSE.txt
10475 * license that can be found in the LICENSE file. 10744 * The complete set of authors may be found at http://polymer.github.io/AUTHORS. txt
10745 * The complete set of contributors may be found at http://polymer.github.io/CON TRIBUTORS.txt
10746 * Code distributed by Google as part of the polymer project is also
10747 * subject to an additional IP rights grant found at http://polymer.github.io/PA TENTS.txt
10748 */(function(scope) {
10749
10750 var hasNative = ('import' in document.createElement('link'));
10751 var useNative = hasNative;
10752
10753 isIE = /Trident/.test(navigator.userAgent);
10754
10755 // TODO(sorvell): SD polyfill intrusion
10756 var hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);
10757 var wrap = function(node) {
10758 return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;
10759 };
10760 var mainDoc = wrap(document);
10761
10762 // NOTE: We cannot polyfill document.currentScript because it's not possible
10763 // both to override and maintain the ability to capture the native value;
10764 // therefore we choose to expose _currentScript both when native imports
10765 // and the polyfill are in use.
10766 var currentScriptDescriptor = {
10767 get: function() {
10768 var script = HTMLImports.currentScript || document.currentScript ||
10769 // NOTE: only works when called in synchronously executing code.
10770 // readyState should check if `loading` but IE10 is
10771 // interactive when scripts run so we cheat.
10772 (document.readyState !== 'complete' ?
10773 document.scripts[document.scripts.length - 1] : null);
10774 return wrap(script);
10775 },
10776 configurable: true
10777 };
10778
10779 Object.defineProperty(document, '_currentScript', currentScriptDescriptor);
10780 Object.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);
10781
10782 // call a callback when all HTMLImports in the document at call (or at least
10783 // document ready) time have loaded.
10784 // 1. ensure the document is in a ready state (has dom), then
10785 // 2. watch for loading of imports and call callback when done
10786 function whenImportsReady(callback, doc) {
10787 doc = doc || mainDoc;
10788 // if document is loading, wait and try again
10789 whenDocumentReady(function() {
10790 watchImportsLoad(callback, doc);
10791 }, doc);
10792 }
10793
10794 // call the callback when the document is in a ready state (has dom)
10795 var requiredReadyState = isIE ? 'complete' : 'interactive';
10796 var READY_EVENT = 'readystatechange';
10797 function isDocumentReady(doc) {
10798 return (doc.readyState === 'complete' ||
10799 doc.readyState === requiredReadyState);
10800 }
10801
10802 // call <callback> when we ensure the document is in a ready state
10803 function whenDocumentReady(callback, doc) {
10804 if (!isDocumentReady(doc)) {
10805 var checkReady = function() {
10806 if (doc.readyState === 'complete' ||
10807 doc.readyState === requiredReadyState) {
10808 doc.removeEventListener(READY_EVENT, checkReady);
10809 whenDocumentReady(callback, doc);
10810 }
10811 }
10812 doc.addEventListener(READY_EVENT, checkReady);
10813 } else if (callback) {
10814 callback();
10815 }
10816 }
10817
10818 // call <callback> when we ensure all imports have loaded
10819 function watchImportsLoad(callback, doc) {
10820 var imports = doc.querySelectorAll('link[rel=import]');
10821 var loaded = 0, l = imports.length;
10822 function checkDone(d) {
10823 if (loaded == l) {
10824 callback && callback();
10825 }
10826 }
10827 function loadedImport(e) {
10828 loaded++;
10829 checkDone();
10830 }
10831 if (l) {
10832 for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {
10833 if (isImportLoaded(imp)) {
10834 loadedImport.call(imp);
10835 } else {
10836 imp.addEventListener('load', loadedImport);
10837 imp.addEventListener('error', loadedImport);
10838 }
10839 }
10840 } else {
10841 checkDone();
10842 }
10843 }
10844
10845 // NOTE: test for native imports loading is based on explicitly watching
10846 // all imports (see below).
10847 function isImportLoaded(link) {
10848 return useNative ? link.__loaded : link.__importParsed;
10849 }
10850
10851 // TODO(sorvell): install a mutation observer to see if HTMLImports have loaded
10852 // this is a workaround for https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007
10853 // and should be removed when this bug is addressed.
10854 if (useNative) {
10855 new MutationObserver(function(mxns) {
10856 for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {
10857 if (m.addedNodes) {
10858 handleImports(m.addedNodes);
10859 }
10860 }
10861 }).observe(document.head, {childList: true});
10862
10863 function handleImports(nodes) {
10864 for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {
10865 if (isImport(n)) {
10866 handleImport(n);
10867 }
10868 }
10869 }
10870
10871 function isImport(element) {
10872 return element.localName === 'link' && element.rel === 'import';
10873 }
10874
10875 function handleImport(element) {
10876 var loaded = element.import;
10877 if (loaded) {
10878 markTargetLoaded({target: element});
10879 } else {
10880 element.addEventListener('load', markTargetLoaded);
10881 element.addEventListener('error', markTargetLoaded);
10882 }
10883 }
10884
10885 function markTargetLoaded(event) {
10886 event.target.__loaded = true;
10887 }
10888
10889 }
10890
10891 // Fire the 'HTMLImportsLoaded' event when imports in document at load time
10892 // have loaded. This event is required to simulate the script blocking
10893 // behavior of native imports. A main document script that needs to be sure
10894 // imports have loaded should wait for this event.
10895 whenImportsReady(function() {
10896 HTMLImports.ready = true;
10897 HTMLImports.readyTime = new Date().getTime();
10898 mainDoc.dispatchEvent(
10899 new CustomEvent('HTMLImportsLoaded', {bubbles: true})
10900 );
10901 });
10902
10903 // exports
10904 scope.useNative = useNative;
10905 scope.isImportLoaded = isImportLoaded;
10906 scope.whenReady = whenImportsReady;
10907 scope.isIE = isIE;
10908
10909 // deprecated
10910 scope.whenImportsReady = whenImportsReady;
10911
10912 })(window.HTMLImports);
10913
10914 /*
10915 * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
10916 * This code may only be used under the BSD style license found at http://polyme r.github.io/LICENSE.txt
10917 * The complete set of authors may be found at http://polymer.github.io/AUTHORS. txt
10918 * The complete set of contributors may be found at http://polymer.github.io/CON TRIBUTORS.txt
10919 * Code distributed by Google as part of the polymer project is also
10920 * subject to an additional IP rights grant found at http://polymer.github.io/PA TENTS.txt
10476 */ 10921 */
10477
10478 (function(scope) { 10922 (function(scope) {
10479 10923
10480 // imports 10924 // imports
10481 var path = scope.path; 10925 var path = scope.path;
10482 var xhr = scope.xhr; 10926 var xhr = scope.xhr;
10483 var flags = scope.flags; 10927 var flags = scope.flags;
10484 10928
10485 // TODO(sorvell): this loader supports a dynamic list of urls 10929 // TODO(sorvell): this loader supports a dynamic list of urls
10486 // and an oncomplete callback that is called when the loader is done. 10930 // and an oncomplete callback that is called when the loader is done.
10487 // The polyfill currently does *not* need this dynamism or the onComplete 10931 // The polyfill currently does *not* need this dynamism or the onComplete
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
10576 xhr.loadDocument(url, receiveXhr); 11020 xhr.loadDocument(url, receiveXhr);
10577 } else { 11021 } else {
10578 xhr.load(url, receiveXhr); 11022 xhr.load(url, receiveXhr);
10579 } 11023 }
10580 */ 11024 */
10581 } 11025 }
10582 }, 11026 },
10583 receive: function(url, elt, err, resource, redirectedUrl) { 11027 receive: function(url, elt, err, resource, redirectedUrl) {
10584 this.cache[url] = resource; 11028 this.cache[url] = resource;
10585 var $p = this.pending[url]; 11029 var $p = this.pending[url];
10586 if ( redirectedUrl && redirectedUrl !== url ) {
10587 this.cache[redirectedUrl] = resource;
10588 $p = $p.concat(this.pending[redirectedUrl]);
10589 }
10590 for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) { 11030 for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {
10591 //if (!err) { 11031 // If url was redirected, use the redirected location so paths are
10592 // If url was redirected, use the redirected location so paths are 11032 // calculated relative to that.
10593 // calculated relative to that. 11033 this.onload(url, p, resource, err, redirectedUrl);
10594 this.onload(redirectedUrl || url, p, resource);
10595 //}
10596 this.tail(); 11034 this.tail();
10597 } 11035 }
10598 this.pending[url] = null; 11036 this.pending[url] = null;
10599 if ( redirectedUrl && redirectedUrl !== url ) {
10600 this.pending[redirectedUrl] = null;
10601 }
10602 }, 11037 },
10603 tail: function() { 11038 tail: function() {
10604 --this.inflight; 11039 --this.inflight;
10605 this.checkDone(); 11040 this.checkDone();
10606 }, 11041 },
10607 checkDone: function() { 11042 checkDone: function() {
10608 if (!this.inflight) { 11043 if (!this.inflight) {
10609 this.oncomplete(); 11044 this.oncomplete();
10610 } 11045 }
10611 } 11046 }
(...skipping 14 matching lines...) Expand all
10626 request.open('GET', url, xhr.async); 11061 request.open('GET', url, xhr.async);
10627 request.addEventListener('readystatechange', function(e) { 11062 request.addEventListener('readystatechange', function(e) {
10628 if (request.readyState === 4) { 11063 if (request.readyState === 4) {
10629 // Servers redirecting an import can add a Location header to help us 11064 // Servers redirecting an import can add a Location header to help us
10630 // polyfill correctly. 11065 // polyfill correctly.
10631 var locationHeader = request.getResponseHeader("Location"); 11066 var locationHeader = request.getResponseHeader("Location");
10632 var redirectedUrl = null; 11067 var redirectedUrl = null;
10633 if (locationHeader) { 11068 if (locationHeader) {
10634 var redirectedUrl = (locationHeader.substr( 0, 1 ) === "/") 11069 var redirectedUrl = (locationHeader.substr( 0, 1 ) === "/")
10635 ? location.origin + locationHeader // Location is a relative path 11070 ? location.origin + locationHeader // Location is a relative path
10636 : redirectedUrl; // Full path 11071 : locationHeader; // Full path
10637 } 11072 }
10638 next.call(nextContext, !xhr.ok(request) && request, 11073 next.call(nextContext, !xhr.ok(request) && request,
10639 request.response || request.responseText, redirectedUrl); 11074 request.response || request.responseText, redirectedUrl);
10640 } 11075 }
10641 }); 11076 });
10642 request.send(); 11077 request.send();
10643 return request; 11078 return request;
10644 }, 11079 },
10645 loadDocument: function(url, next, nextContext) { 11080 loadDocument: function(url, next, nextContext) {
10646 this.load(url, next, nextContext).responseType = 'document'; 11081 this.load(url, next, nextContext).responseType = 'document';
10647 } 11082 }
10648 }; 11083 };
10649 11084
10650 // exports 11085 // exports
10651 scope.xhr = xhr; 11086 scope.xhr = xhr;
10652 scope.Loader = Loader; 11087 scope.Loader = Loader;
10653 11088
10654 })(window.HTMLImports); 11089 })(window.HTMLImports);
10655 11090
10656 /* 11091 /*
10657 * Copyright 2013 The Polymer Authors. All rights reserved. 11092 * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
10658 * Use of this source code is governed by a BSD-style 11093 * This code may only be used under the BSD style license found at http://polyme r.github.io/LICENSE.txt
10659 * license that can be found in the LICENSE file. 11094 * The complete set of authors may be found at http://polymer.github.io/AUTHORS. txt
11095 * The complete set of contributors may be found at http://polymer.github.io/CON TRIBUTORS.txt
11096 * Code distributed by Google as part of the polymer project is also
11097 * subject to an additional IP rights grant found at http://polymer.github.io/PA TENTS.txt
10660 */ 11098 */
10661
10662 (function(scope) { 11099 (function(scope) {
10663 11100
10664 var IMPORT_LINK_TYPE = 'import'; 11101 var IMPORT_LINK_TYPE = 'import';
10665 var flags = scope.flags; 11102 var flags = scope.flags;
10666 var isIe = /Trident/.test(navigator.userAgent); 11103 var isIE = scope.isIE;
10667 // TODO(sorvell): SD polyfill intrusion 11104 // TODO(sorvell): SD polyfill intrusion
10668 var mainDoc = window.ShadowDOMPolyfill ? 11105 var mainDoc = window.ShadowDOMPolyfill ?
10669 window.ShadowDOMPolyfill.wrapIfNeeded(document) : document; 11106 window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;
10670 11107
10671 // importParser 11108 // importParser
10672 // highlander object to manage parsing of imports 11109 // highlander object to manage parsing of imports
10673 // parses import related elements 11110 // parses import related elements
10674 // and ensures proper parse order 11111 // and ensures proper parse order
10675 // parse order is enforced by crawling the tree and monitoring which elements 11112 // parse order is enforced by crawling the tree and monitoring which elements
10676 // have been parsed; async parsing is also supported. 11113 // have been parsed; async parsing is also supported.
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
10745 parser.parseNext(); 11182 parser.parseNext();
10746 }); 11183 });
10747 }, 11184 },
10748 parseImport: function(elt) { 11185 parseImport: function(elt) {
10749 // TODO(sorvell): consider if there's a better way to do this; 11186 // TODO(sorvell): consider if there's a better way to do this;
10750 // expose an imports parsing hook; this is needed, for example, by the 11187 // expose an imports parsing hook; this is needed, for example, by the
10751 // CustomElements polyfill. 11188 // CustomElements polyfill.
10752 if (HTMLImports.__importsParsingHook) { 11189 if (HTMLImports.__importsParsingHook) {
10753 HTMLImports.__importsParsingHook(elt); 11190 HTMLImports.__importsParsingHook(elt);
10754 } 11191 }
10755 elt.import.__importParsed = true; 11192 if (elt.import) {
11193 elt.import.__importParsed = true;
11194 }
10756 this.markParsingComplete(elt); 11195 this.markParsingComplete(elt);
10757 // fire load event 11196 // fire load event
10758 if (elt.__resource) { 11197 if (elt.__resource && !elt.__error) {
10759 elt.dispatchEvent(new CustomEvent('load', {bubbles: false})); 11198 elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));
10760 } else { 11199 } else {
10761 elt.dispatchEvent(new CustomEvent('error', {bubbles: false})); 11200 elt.dispatchEvent(new CustomEvent('error', {bubbles: false}));
10762 } 11201 }
10763 // TODO(sorvell): workaround for Safari addEventListener not working 11202 // TODO(sorvell): workaround for Safari addEventListener not working
10764 // for elements not in the main document. 11203 // for elements not in the main document.
10765 if (elt.__pending) { 11204 if (elt.__pending) {
10766 var fn; 11205 var fn;
10767 while (elt.__pending.length) { 11206 while (elt.__pending.length) {
10768 fn = elt.__pending.shift(); 11207 fn = elt.__pending.shift();
(...skipping 15 matching lines...) Expand all
10784 }, 11223 },
10785 parseStyle: function(elt) { 11224 parseStyle: function(elt) {
10786 // TODO(sorvell): style element load event can just not fire so clone styles 11225 // TODO(sorvell): style element load event can just not fire so clone styles
10787 var src = elt; 11226 var src = elt;
10788 elt = cloneStyle(elt); 11227 elt = cloneStyle(elt);
10789 elt.__importElement = src; 11228 elt.__importElement = src;
10790 this.parseGeneric(elt); 11229 this.parseGeneric(elt);
10791 }, 11230 },
10792 parseGeneric: function(elt) { 11231 parseGeneric: function(elt) {
10793 this.trackElement(elt); 11232 this.trackElement(elt);
10794 document.head.appendChild(elt); 11233 this.addElementToDocument(elt);
11234 },
11235 rootImportForElement: function(elt) {
11236 var n = elt;
11237 while (n.ownerDocument.__importLink) {
11238 n = n.ownerDocument.__importLink;
11239 }
11240 return n;
11241 },
11242 addElementToDocument: function(elt) {
11243 var port = this.rootImportForElement(elt.__importElement || elt);
11244 var l = port.__insertedElements = port.__insertedElements || 0;
11245 var refNode = port.nextElementSibling;
11246 for (var i=0; i < l; i++) {
11247 refNode = refNode && refNode.nextElementSibling;
11248 }
11249 port.parentNode.insertBefore(elt, refNode);
10795 }, 11250 },
10796 // tracks when a loadable element has loaded 11251 // tracks when a loadable element has loaded
10797 trackElement: function(elt, callback) { 11252 trackElement: function(elt, callback) {
10798 var self = this; 11253 var self = this;
10799 var done = function(e) { 11254 var done = function(e) {
10800 if (callback) { 11255 if (callback) {
10801 callback(e); 11256 callback(e);
10802 } 11257 }
10803 self.markParsingComplete(elt); 11258 self.markParsingComplete(elt);
10804 self.parseNext(); 11259 self.parseNext();
10805 }; 11260 };
10806 elt.addEventListener('load', done); 11261 elt.addEventListener('load', done);
10807 elt.addEventListener('error', done); 11262 elt.addEventListener('error', done);
10808 11263
10809 // NOTE: IE does not fire "load" event for styles that have already loaded 11264 // NOTE: IE does not fire "load" event for styles that have already loaded
10810 // This is in violation of the spec, so we try our hardest to work around it 11265 // This is in violation of the spec, so we try our hardest to work around it
10811 if (isIe && elt.localName === 'style') { 11266 if (isIE && elt.localName === 'style') {
10812 var fakeLoad = false; 11267 var fakeLoad = false;
10813 // If there's not @import in the textContent, assume it has loaded 11268 // If there's not @import in the textContent, assume it has loaded
10814 if (elt.textContent.indexOf('@import') == -1) { 11269 if (elt.textContent.indexOf('@import') == -1) {
10815 fakeLoad = true; 11270 fakeLoad = true;
10816 // if we have a sheet, we have been parsed 11271 // if we have a sheet, we have been parsed
10817 } else if (elt.sheet) { 11272 } else if (elt.sheet) {
10818 fakeLoad = true; 11273 fakeLoad = true;
10819 var csr = elt.sheet.cssRules; 11274 var csr = elt.sheet.cssRules;
10820 var len = csr ? csr.length : 0; 11275 var len = csr ? csr.length : 0;
10821 // search the rules for @import's 11276 // search the rules for @import's
(...skipping 19 matching lines...) Expand all
10841 parseScript: function(scriptElt) { 11296 parseScript: function(scriptElt) {
10842 var script = document.createElement('script'); 11297 var script = document.createElement('script');
10843 script.__importElement = scriptElt; 11298 script.__importElement = scriptElt;
10844 script.src = scriptElt.src ? scriptElt.src : 11299 script.src = scriptElt.src ? scriptElt.src :
10845 generateScriptDataUrl(scriptElt); 11300 generateScriptDataUrl(scriptElt);
10846 scope.currentScript = scriptElt; 11301 scope.currentScript = scriptElt;
10847 this.trackElement(script, function(e) { 11302 this.trackElement(script, function(e) {
10848 script.parentNode.removeChild(script); 11303 script.parentNode.removeChild(script);
10849 scope.currentScript = null; 11304 scope.currentScript = null;
10850 }); 11305 });
10851 document.head.appendChild(script); 11306 this.addElementToDocument(script);
10852 }, 11307 },
10853 // determine the next element in the tree which should be parsed 11308 // determine the next element in the tree which should be parsed
10854 nextToParse: function() { 11309 nextToParse: function() {
10855 return !this.parsingElement && this.nextToParseInDoc(mainDoc); 11310 return !this.parsingElement && this.nextToParseInDoc(mainDoc);
10856 }, 11311 },
10857 nextToParseInDoc: function(doc, link) { 11312 nextToParseInDoc: function(doc, link) {
10858 var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc)); 11313 if (doc) {
10859 for (var i=0, l=nodes.length, p=0, n; (i<l) && (n=nodes[i]); i++) { 11314 var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));
10860 if (!this.isParsed(n)) { 11315 for (var i=0, l=nodes.length, p=0, n; (i<l) && (n=nodes[i]); i++) {
10861 if (this.hasResource(n)) { 11316 if (!this.isParsed(n)) {
10862 return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n; 11317 if (this.hasResource(n)) {
10863 } else { 11318 return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;
10864 return; 11319 } else {
11320 return;
11321 }
10865 } 11322 }
10866 } 11323 }
10867 } 11324 }
10868 // all nodes have been parsed, ready to parse import, if any 11325 // all nodes have been parsed, ready to parse import, if any
10869 return link; 11326 return link;
10870 }, 11327 },
10871 // return the set of parse selectors relevant for this node. 11328 // return the set of parse selectors relevant for this node.
10872 parseSelectorsForNode: function(node) { 11329 parseSelectorsForNode: function(node) {
10873 var doc = node.ownerDocument || node; 11330 var doc = node.ownerDocument || node;
10874 return doc === mainDoc ? this.documentSelectors : this.importsSelectors; 11331 return doc === mainDoc ? this.documentSelectors : this.importsSelectors;
10875 }, 11332 },
10876 isParsed: function(node) { 11333 isParsed: function(node) {
10877 return node.__importParsed; 11334 return node.__importParsed;
10878 }, 11335 },
10879 hasResource: function(node) { 11336 hasResource: function(node) {
10880 if (nodeIsImport(node) && !node.import) { 11337 if (nodeIsImport(node) && (node.import === undefined)) {
10881 return false; 11338 return false;
10882 } 11339 }
10883 return true; 11340 return true;
10884 } 11341 }
10885 }; 11342 };
10886 11343
10887 function nodeIsImport(elt) { 11344 function nodeIsImport(elt) {
10888 return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE); 11345 return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);
10889 } 11346 }
10890 11347
10891 function generateScriptDataUrl(script) { 11348 function generateScriptDataUrl(script) {
10892 var scriptContent = generateScriptContent(script); 11349 var scriptContent = generateScriptContent(script);
10893 var b64 = 'data:text/javascript'; 11350 return 'data:text/javascript;charset=utf-8,' + encodeURIComponent(scriptConten t);
10894 // base64 may be smaller, but does not handle unicode characters
10895 // attempt base64 first, fall back to escaped text
10896 try {
10897 b64 += (';base64,' + btoa(scriptContent));
10898 } catch(e) {
10899 b64 += (';charset=utf-8,' + encodeURIComponent(scriptContent));
10900 }
10901 return b64;
10902 } 11351 }
10903 11352
10904 function generateScriptContent(script) { 11353 function generateScriptContent(script) {
10905 return script.textContent + generateSourceMapHint(script); 11354 return script.textContent + generateSourceMapHint(script);
10906 } 11355 }
10907 11356
10908 // calculate source map hint 11357 // calculate source map hint
10909 function generateSourceMapHint(script) { 11358 function generateSourceMapHint(script) {
10910 var moniker = script.__nodeUrl; 11359 var moniker = script.__nodeUrl;
10911 if (!moniker) { 11360 if (!moniker) {
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
10956 urlObj.href = urlPath; 11405 urlObj.href = urlPath;
10957 urlPath = urlObj.href; 11406 urlPath = urlObj.href;
10958 return pre + '\'' + urlPath + '\'' + post; 11407 return pre + '\'' + urlPath + '\'' + post;
10959 }); 11408 });
10960 } 11409 }
10961 } 11410 }
10962 11411
10963 // exports 11412 // exports
10964 scope.parser = importParser; 11413 scope.parser = importParser;
10965 scope.path = path; 11414 scope.path = path;
10966 scope.isIE = isIe;
10967 11415
10968 })(HTMLImports); 11416 })(HTMLImports);
10969 11417
10970 /* 11418 /*
10971 * Copyright 2013 The Polymer Authors. All rights reserved. 11419 * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
10972 * Use of this source code is governed by a BSD-style 11420 * This code may only be used under the BSD style license found at http://polyme r.github.io/LICENSE.txt
10973 * license that can be found in the LICENSE file. 11421 * The complete set of authors may be found at http://polymer.github.io/AUTHORS. txt
11422 * The complete set of contributors may be found at http://polymer.github.io/CON TRIBUTORS.txt
11423 * Code distributed by Google as part of the polymer project is also
11424 * subject to an additional IP rights grant found at http://polymer.github.io/PA TENTS.txt
10974 */ 11425 */
11426 (function(scope) {
10975 11427
10976 (function(scope) { 11428 var useNative = scope.useNative;
10977
10978 var hasNative = ('import' in document.createElement('link'));
10979 var useNative = hasNative;
10980 var flags = scope.flags; 11429 var flags = scope.flags;
10981 var IMPORT_LINK_TYPE = 'import'; 11430 var IMPORT_LINK_TYPE = 'import';
10982 11431
10983 // TODO(sorvell): SD polyfill intrusion 11432 // TODO(sorvell): SD polyfill intrusion
10984 var mainDoc = window.ShadowDOMPolyfill ? 11433 var mainDoc = window.ShadowDOMPolyfill ?
10985 ShadowDOMPolyfill.wrapIfNeeded(document) : document; 11434 ShadowDOMPolyfill.wrapIfNeeded(document) : document;
10986 11435
10987 if (!useNative) { 11436 if (!useNative) {
10988 11437
10989 // imports 11438 // imports
(...skipping 27 matching lines...) Expand all
11017 marshalNodes: function(parent) { 11466 marshalNodes: function(parent) {
11018 // all preloadable nodes in inDocument 11467 // all preloadable nodes in inDocument
11019 return parent.querySelectorAll(this.loadSelectorsForNode(parent)); 11468 return parent.querySelectorAll(this.loadSelectorsForNode(parent));
11020 }, 11469 },
11021 // find the proper set of load selectors for a given node 11470 // find the proper set of load selectors for a given node
11022 loadSelectorsForNode: function(node) { 11471 loadSelectorsForNode: function(node) {
11023 var doc = node.ownerDocument || node; 11472 var doc = node.ownerDocument || node;
11024 return doc === mainDoc ? this.documentPreloadSelectors : 11473 return doc === mainDoc ? this.documentPreloadSelectors :
11025 this.importsPreloadSelectors; 11474 this.importsPreloadSelectors;
11026 }, 11475 },
11027 loaded: function(url, elt, resource) { 11476 loaded: function(url, elt, resource, err, redirectedUrl) {
11028 flags.load && console.log('loaded', url, elt); 11477 flags.load && console.log('loaded', url, elt);
11029 // store generic resource 11478 // store generic resource
11030 // TODO(sorvell): fails for nodes inside <template>.content 11479 // TODO(sorvell): fails for nodes inside <template>.content
11031 // see https://code.google.com/p/chromium/issues/detail?id=249381. 11480 // see https://code.google.com/p/chromium/issues/detail?id=249381.
11032 elt.__resource = resource; 11481 elt.__resource = resource;
11482 elt.__error = err;
11033 if (isDocumentLink(elt)) { 11483 if (isDocumentLink(elt)) {
11034 var doc = this.documents[url]; 11484 var doc = this.documents[url];
11035 // if we've never seen a document at this url 11485 // if we've never seen a document at this url
11036 if (!doc) { 11486 if (doc === undefined) {
11037 // generate an HTMLDocument from data 11487 // generate an HTMLDocument from data
11038 doc = makeDocument(resource, url); 11488 doc = err ? null : makeDocument(resource, redirectedUrl || url);
11039 doc.__importLink = elt; 11489 if (doc) {
11040 // TODO(sorvell): we cannot use MO to detect parsed nodes because 11490 doc.__importLink = elt;
11041 // SD polyfill does not report these as mutations. 11491 // note, we cannot use MO to detect parsed nodes because
11042 this.bootDocument(doc); 11492 // SD polyfill does not report these as mutations.
11493 this.bootDocument(doc);
11494 }
11043 // cache document 11495 // cache document
11044 this.documents[url] = doc; 11496 this.documents[url] = doc;
11045 } 11497 }
11046 // don't store import record until we're actually loaded 11498 // don't store import record until we're actually loaded
11047 // store document resource 11499 // store document resource
11048 elt.import = doc; 11500 elt.import = doc;
11049 } 11501 }
11050 parser.parseNext(); 11502 parser.parseNext();
11051 }, 11503 },
11052 bootDocument: function(doc) { 11504 bootDocument: function(doc) {
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
11105 // install html 11557 // install html
11106 doc.body.innerHTML = resource; 11558 doc.body.innerHTML = resource;
11107 } 11559 }
11108 // TODO(sorvell): ideally this code is not aware of Template polyfill, 11560 // TODO(sorvell): ideally this code is not aware of Template polyfill,
11109 // but for now the polyfill needs help to bootstrap these templates 11561 // but for now the polyfill needs help to bootstrap these templates
11110 if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) { 11562 if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {
11111 HTMLTemplateElement.bootstrap(doc); 11563 HTMLTemplateElement.bootstrap(doc);
11112 } 11564 }
11113 return doc; 11565 return doc;
11114 } 11566 }
11567
11568 // Polyfill document.baseURI for browsers without it.
11569 if (!document.baseURI) {
11570 var baseURIDescriptor = {
11571 get: function() {
11572 var base = document.querySelector('base');
11573 return base ? base.href : window.location.href;
11574 },
11575 configurable: true
11576 };
11577
11578 Object.defineProperty(document, 'baseURI', baseURIDescriptor);
11579 Object.defineProperty(mainDoc, 'baseURI', baseURIDescriptor);
11580 }
11581
11582 // IE shim for CustomEvent
11583 if (typeof window.CustomEvent !== 'function') {
11584 window.CustomEvent = function(inType, dictionary) {
11585 var e = document.createEvent('HTMLEvents');
11586 e.initEvent(inType,
11587 dictionary.bubbles === false ? false : true,
11588 dictionary.cancelable === false ? false : true,
11589 dictionary.detail);
11590 return e;
11591 };
11592 }
11593
11115 } else { 11594 } else {
11116 // do nothing if using native imports 11595 // do nothing if using native imports
11117 var importer = {}; 11596 var importer = {};
11118 } 11597 }
11119 11598
11120 // NOTE: We cannot polyfill document.currentScript because it's not possible
11121 // both to override and maintain the ability to capture the native value;
11122 // therefore we choose to expose _currentScript both when native imports
11123 // and the polyfill are in use.
11124 var currentScriptDescriptor = {
11125 get: function() {
11126 return HTMLImports.currentScript || document.currentScript;
11127 },
11128 configurable: true
11129 };
11130
11131 Object.defineProperty(document, '_currentScript', currentScriptDescriptor);
11132 Object.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);
11133
11134 // Polyfill document.baseURI for browsers without it.
11135 if (!document.baseURI) {
11136 var baseURIDescriptor = {
11137 get: function() {
11138 return window.location.href;
11139 },
11140 configurable: true
11141 };
11142
11143 Object.defineProperty(document, 'baseURI', baseURIDescriptor);
11144 Object.defineProperty(mainDoc, 'baseURI', baseURIDescriptor);
11145 }
11146
11147 // call a callback when all HTMLImports in the document at call (or at least
11148 // document ready) time have loaded.
11149 // 1. ensure the document is in a ready state (has dom), then
11150 // 2. watch for loading of imports and call callback when done
11151 function whenImportsReady(callback, doc) {
11152 doc = doc || mainDoc;
11153 // if document is loading, wait and try again
11154 whenDocumentReady(function() {
11155 watchImportsLoad(callback, doc);
11156 }, doc);
11157 }
11158
11159 // call the callback when the document is in a ready state (has dom)
11160 var requiredReadyState = HTMLImports.isIE ? 'complete' : 'interactive';
11161 var READY_EVENT = 'readystatechange';
11162 function isDocumentReady(doc) {
11163 return (doc.readyState === 'complete' ||
11164 doc.readyState === requiredReadyState);
11165 }
11166
11167 // call <callback> when we ensure the document is in a ready state
11168 function whenDocumentReady(callback, doc) {
11169 if (!isDocumentReady(doc)) {
11170 var checkReady = function() {
11171 if (doc.readyState === 'complete' ||
11172 doc.readyState === requiredReadyState) {
11173 doc.removeEventListener(READY_EVENT, checkReady);
11174 whenDocumentReady(callback, doc);
11175 }
11176 }
11177 doc.addEventListener(READY_EVENT, checkReady);
11178 } else if (callback) {
11179 callback();
11180 }
11181 }
11182
11183 // call <callback> when we ensure all imports have loaded
11184 function watchImportsLoad(callback, doc) {
11185 var imports = doc.querySelectorAll('link[rel=import]');
11186 var loaded = 0, l = imports.length;
11187 function checkDone(d) {
11188 if (loaded == l) {
11189 callback && callback();
11190 }
11191 }
11192 function loadedImport(e) {
11193 loaded++;
11194 checkDone();
11195 }
11196 if (l) {
11197 for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {
11198 if (isImportLoaded(imp)) {
11199 loadedImport.call(imp);
11200 } else {
11201 imp.addEventListener('load', loadedImport);
11202 imp.addEventListener('error', loadedImport);
11203 }
11204 }
11205 } else {
11206 checkDone();
11207 }
11208 }
11209
11210 function isImportLoaded(link) {
11211 return useNative ? (link.import && (link.import.readyState !== 'loading')) || link.__loaded :
11212 link.__importParsed;
11213 }
11214
11215 // TODO(sorvell): install a mutation observer to see if HTMLImports have loaded
11216 // this is a workaround for https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007
11217 // and should be removed when this bug is addressed.
11218 if (useNative) {
11219 new MutationObserver(function(mxns) {
11220 for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {
11221 if (m.addedNodes) {
11222 handleImports(m.addedNodes);
11223 }
11224 }
11225 }).observe(document.head, {childList: true});
11226
11227 function handleImports(nodes) {
11228 for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {
11229 if (isImport(n)) {
11230 handleImport(n);
11231 }
11232 }
11233 }
11234
11235 function isImport(element) {
11236 return element.localName === 'link' && element.rel === 'import';
11237 }
11238
11239 function handleImport(element) {
11240 var loaded = element.import;
11241 if (loaded) {
11242 markTargetLoaded({target: element});
11243 } else {
11244 element.addEventListener('load', markTargetLoaded);
11245 element.addEventListener('error', markTargetLoaded);
11246 }
11247 }
11248
11249 function markTargetLoaded(event) {
11250 event.target.__loaded = true;
11251 }
11252
11253 }
11254
11255 // exports 11599 // exports
11256 scope.hasNative = hasNative;
11257 scope.useNative = useNative;
11258 scope.importer = importer; 11600 scope.importer = importer;
11259 scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE; 11601 scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;
11260 scope.isImportLoaded = isImportLoaded;
11261 scope.importLoader = importLoader; 11602 scope.importLoader = importLoader;
11262 scope.whenReady = whenImportsReady;
11263 11603
11264 // deprecated
11265 scope.whenImportsReady = whenImportsReady;
11266 11604
11267 })(window.HTMLImports); 11605 })(window.HTMLImports);
11268 11606
11269 /* 11607 /*
11270 Copyright 2013 The Polymer Authors. All rights reserved. 11608 * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
11271 Use of this source code is governed by a BSD-style 11609 * This code may only be used under the BSD style license found at http://polyme r.github.io/LICENSE.txt
11272 license that can be found in the LICENSE file. 11610 * The complete set of authors may be found at http://polymer.github.io/AUTHORS. txt
11273 */ 11611 * The complete set of contributors may be found at http://polymer.github.io/CON TRIBUTORS.txt
11274 11612 * Code distributed by Google as part of the polymer project is also
11613 * subject to an additional IP rights grant found at http://polymer.github.io/PA TENTS.txt
11614 */
11275 (function(scope){ 11615 (function(scope){
11276 11616
11277 var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE; 11617 var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;
11278 var importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']'; 11618 var importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';
11279 var importer = scope.importer; 11619 var importer = scope.importer;
11280 var parser = scope.parser; 11620 var parser = scope.parser;
11281 11621
11282 // we track mutations for addedNodes, looking for imports 11622 // we track mutations for addedNodes, looking for imports
11283 function handler(mutations) { 11623 function handler(mutations) {
11284 for (var i=0, l=mutations.length, m; (i<l) && (m=mutations[i]); i++) { 11624 for (var i=0, l=mutations.length, m; (i<l) && (m=mutations[i]); i++) {
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
11330 } 11670 }
11331 11671
11332 // exports 11672 // exports
11333 // TODO(sorvell): factor so can put on scope 11673 // TODO(sorvell): factor so can put on scope
11334 scope.observe = observe; 11674 scope.observe = observe;
11335 importer.observe = observe; 11675 importer.observe = observe;
11336 11676
11337 })(HTMLImports); 11677 })(HTMLImports);
11338 11678
11339 /* 11679 /*
11340 * Copyright 2013 The Polymer Authors. All rights reserved. 11680 * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
11341 * Use of this source code is governed by a BSD-style 11681 * This code may only be used under the BSD style license found at http://polyme r.github.io/LICENSE.txt
11342 * license that can be found in the LICENSE file. 11682 * The complete set of authors may be found at http://polymer.github.io/AUTHORS. txt
11683 * The complete set of contributors may be found at http://polymer.github.io/CON TRIBUTORS.txt
11684 * Code distributed by Google as part of the polymer project is also
11685 * subject to an additional IP rights grant found at http://polymer.github.io/PA TENTS.txt
11343 */ 11686 */
11344 (function(){ 11687 (function(){
11345 11688
11346 // bootstrap 11689 // bootstrap
11347 11690
11348 // IE shim for CustomEvent
11349 if (typeof window.CustomEvent !== 'function') {
11350 window.CustomEvent = function(inType, dictionary) {
11351 var e = document.createEvent('HTMLEvents');
11352 e.initEvent(inType,
11353 dictionary.bubbles === false ? false : true,
11354 dictionary.cancelable === false ? false : true,
11355 dictionary.detail);
11356 return e;
11357 };
11358 }
11359
11360 // TODO(sorvell): SD polyfill intrusion 11691 // TODO(sorvell): SD polyfill intrusion
11361 var doc = window.ShadowDOMPolyfill ? 11692 var doc = window.ShadowDOMPolyfill ?
11362 window.ShadowDOMPolyfill.wrapIfNeeded(document) : document; 11693 window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;
11363 11694
11364 // Fire the 'HTMLImportsLoaded' event when imports in document at load time
11365 // have loaded. This event is required to simulate the script blocking
11366 // behavior of native imports. A main document script that needs to be sure
11367 // imports have loaded should wait for this event.
11368 HTMLImports.whenImportsReady(function() {
11369 HTMLImports.ready = true;
11370 HTMLImports.readyTime = new Date().getTime();
11371 doc.dispatchEvent(
11372 new CustomEvent('HTMLImportsLoaded', {bubbles: true})
11373 );
11374 });
11375
11376
11377 // no need to bootstrap the polyfill when native imports is available. 11695 // no need to bootstrap the polyfill when native imports is available.
11378 if (!HTMLImports.useNative) { 11696 if (!HTMLImports.useNative) {
11379 function bootstrap() { 11697 function bootstrap() {
11380 HTMLImports.importer.bootDocument(doc); 11698 HTMLImports.importer.bootDocument(doc);
11381 } 11699 }
11382 11700
11383 // TODO(sorvell): SD polyfill does *not* generate mutations for nodes added 11701 // TODO(sorvell): SD polyfill does *not* generate mutations for nodes added
11384 // by the parser. For this reason, we must wait until the dom exists to 11702 // by the parser. For this reason, we must wait until the dom exists to
11385 // bootstrap. 11703 // bootstrap.
11386 if (document.readyState === 'complete' || 11704 if (document.readyState === 'complete' ||
11387 (document.readyState === 'interactive' && !window.attachEvent)) { 11705 (document.readyState === 'interactive' && !window.attachEvent)) {
11388 bootstrap(); 11706 bootstrap();
11389 } else { 11707 } else {
11390 document.addEventListener('DOMContentLoaded', bootstrap); 11708 document.addEventListener('DOMContentLoaded', bootstrap);
11391 } 11709 }
11392 } 11710 }
11393 11711
11394 })(); 11712 })();
11395 11713
11396 /* 11714 /*
11397 * Copyright 2013 The Polymer Authors. All rights reserved. 11715 * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
11398 * Use of this source code is governed by a BSD-style 11716 * This code may only be used under the BSD style license found at http://polyme r.github.io/LICENSE.txt
11399 * license that can be found in the LICENSE file. 11717 * The complete set of authors may be found at http://polymer.github.io/AUTHORS. txt
11718 * The complete set of contributors may be found at http://polymer.github.io/CON TRIBUTORS.txt
11719 * Code distributed by Google as part of the polymer project is also
11720 * subject to an additional IP rights grant found at http://polymer.github.io/PA TENTS.txt
11400 */ 11721 */
11401 window.CustomElements = window.CustomElements || {flags:{}}; 11722 window.CustomElements = window.CustomElements || {flags:{}};
11402 /* 11723 /*
11403 Copyright 2013 The Polymer Authors. All rights reserved. 11724 * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
11404 Use of this source code is governed by a BSD-style 11725 * This code may only be used under the BSD style license found at http://polyme r.github.io/LICENSE.txt
11405 license that can be found in the LICENSE file. 11726 * The complete set of authors may be found at http://polymer.github.io/AUTHORS. txt
11406 */ 11727 * The complete set of contributors may be found at http://polymer.github.io/CON TRIBUTORS.txt
11728 * Code distributed by Google as part of the polymer project is also
11729 * subject to an additional IP rights grant found at http://polymer.github.io/PA TENTS.txt
11730 */
11407 11731
11408 (function(scope){ 11732 (function(scope){
11409 11733
11410 var logFlags = window.logFlags || {}; 11734 var logFlags = window.logFlags || {};
11411 var IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : 'none '; 11735 var IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : 'none ';
11412 11736
11413 // walk the subtree rooted at node, applying 'find(element, data)' function 11737 // walk the subtree rooted at node, applying 'find(element, data)' function
11414 // to each element 11738 // to each element
11415 // if 'find' returns true for 'element', do not search element's subtree 11739 // if 'find' returns true for 'element', do not search element's subtree
11416 function findAll(node, find, data) { 11740 function findAll(node, find, data) {
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after
11738 scope.insertedNode = insertedNode; 12062 scope.insertedNode = insertedNode;
11739 12063
11740 scope.observeDocument = observeDocument; 12064 scope.observeDocument = observeDocument;
11741 scope.upgradeDocument = upgradeDocument; 12065 scope.upgradeDocument = upgradeDocument;
11742 12066
11743 scope.takeRecords = takeRecords; 12067 scope.takeRecords = takeRecords;
11744 12068
11745 })(window.CustomElements); 12069 })(window.CustomElements);
11746 12070
11747 /* 12071 /*
11748 * Copyright 2013 The Polymer Authors. All rights reserved. 12072 * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
11749 * Use of this source code is governed by a BSD-style 12073 * This code may only be used under the BSD style license found at http://polyme r.github.io/LICENSE.txt
11750 * license that can be found in the LICENSE file. 12074 * The complete set of authors may be found at http://polymer.github.io/AUTHORS. txt
12075 * The complete set of contributors may be found at http://polymer.github.io/CON TRIBUTORS.txt
12076 * Code distributed by Google as part of the polymer project is also
12077 * subject to an additional IP rights grant found at http://polymer.github.io/PA TENTS.txt
11751 */ 12078 */
11752 12079
11753 /** 12080 /**
11754 * Implements `document.register` 12081 * Implements `document.registerElement`
11755 * @module CustomElements 12082 * @module CustomElements
11756 */ 12083 */
11757 12084
11758 /** 12085 /**
11759 * Polyfilled extensions to the `document` object. 12086 * Polyfilled extensions to the `document` object.
11760 * @class Document 12087 * @class Document
11761 */ 12088 */
11762 12089
11763 (function(scope) { 12090 (function(scope) {
11764 12091
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
11976 // output is a valid DOM element with the proper wrapper in place. 12303 // output is a valid DOM element with the proper wrapper in place.
11977 // 12304 //
11978 return upgrade(domCreateElement(definition.tag), definition); 12305 return upgrade(domCreateElement(definition.tag), definition);
11979 } 12306 }
11980 12307
11981 function upgrade(element, definition) { 12308 function upgrade(element, definition) {
11982 // some definitions specify an 'is' attribute 12309 // some definitions specify an 'is' attribute
11983 if (definition.is) { 12310 if (definition.is) {
11984 element.setAttribute('is', definition.is); 12311 element.setAttribute('is', definition.is);
11985 } 12312 }
11986 // remove 'unresolved' attr, which is a standin for :unresolved.
11987 element.removeAttribute('unresolved');
11988 // make 'element' implement definition.prototype 12313 // make 'element' implement definition.prototype
11989 implement(element, definition); 12314 implement(element, definition);
11990 // flag as upgraded 12315 // flag as upgraded
11991 element.__upgraded__ = true; 12316 element.__upgraded__ = true;
11992 // lifecycle management 12317 // lifecycle management
11993 created(element); 12318 created(element);
11994 // attachedCallback fires in tree order, call before recursing 12319 // attachedCallback fires in tree order, call before recursing
11995 scope.insertedNode(element); 12320 scope.insertedNode(element);
11996 // there should never be a shadow root on element at this point 12321 // there should never be a shadow root on element at this point
11997 scope.upgradeSubtree(element); 12322 scope.upgradeSubtree(element);
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
12215 12540
12216 // bc 12541 // bc
12217 document.register = document.registerElement; 12542 document.register = document.registerElement;
12218 12543
12219 scope.hasNative = hasNative; 12544 scope.hasNative = hasNative;
12220 scope.useNative = useNative; 12545 scope.useNative = useNative;
12221 12546
12222 })(window.CustomElements); 12547 })(window.CustomElements);
12223 12548
12224 /* 12549 /*
12225 * Copyright 2013 The Polymer Authors. All rights reserved. 12550 * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
12226 * Use of this source code is governed by a BSD-style 12551 * This code may only be used under the BSD style license found at http://polyme r.github.io/LICENSE.txt
12227 * license that can be found in the LICENSE file. 12552 * The complete set of authors may be found at http://polymer.github.io/AUTHORS. txt
12553 * The complete set of contributors may be found at http://polymer.github.io/CON TRIBUTORS.txt
12554 * Code distributed by Google as part of the polymer project is also
12555 * subject to an additional IP rights grant found at http://polymer.github.io/PA TENTS.txt
12228 */ 12556 */
12229 12557
12230 (function(scope) { 12558 (function(scope) {
12231 12559
12232 // import 12560 // import
12233 12561
12234 var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE; 12562 var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;
12235 12563
12236 // highlander object for parsing a document tree 12564 // highlander object for parsing a document tree
12237 12565
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
12279 12607
12280 var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach); 12608 var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);
12281 12609
12282 // exports 12610 // exports
12283 12611
12284 scope.parser = parser; 12612 scope.parser = parser;
12285 scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE; 12613 scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;
12286 12614
12287 })(window.CustomElements); 12615 })(window.CustomElements);
12288 /* 12616 /*
12289 * Copyright 2013 The Polymer Authors. All rights reserved. 12617 * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
12290 * Use of this source code is governed by a BSD-style 12618 * This code may only be used under the BSD style license found at http://polyme r.github.io/LICENSE.txt
12291 * license that can be found in the LICENSE file. 12619 * The complete set of authors may be found at http://polymer.github.io/AUTHORS. txt
12620 * The complete set of contributors may be found at http://polymer.github.io/CON TRIBUTORS.txt
12621 * Code distributed by Google as part of the polymer project is also
12622 * subject to an additional IP rights grant found at http://polymer.github.io/PA TENTS.txt
12292 */ 12623 */
12293 (function(scope){ 12624 (function(scope){
12294 12625
12295 // bootstrap parsing 12626 // bootstrap parsing
12296 function bootstrap() { 12627 function bootstrap() {
12297 // parse document 12628 // parse document
12298 CustomElements.parser.parse(document); 12629 CustomElements.parser.parse(document);
12299 // one more pass before register is 'live' 12630 // one more pass before register is 'live'
12300 CustomElements.upgradeDocument(document); 12631 CustomElements.upgradeDocument(document);
12301 // choose async 12632 // install upgrade hook if HTMLImports are available
12302 var async = window.Platform && Platform.endOfMicrotask ? 12633 if (window.HTMLImports) {
12303 Platform.endOfMicrotask : 12634 HTMLImports.__importsParsingHook = function(elt) {
12304 setTimeout; 12635 CustomElements.parser.parse(elt.import);
12305 async(function() { 12636 }
12306 // set internal 'ready' flag, now document.registerElement will trigger 12637 }
12307 // synchronous upgrades 12638 // set internal 'ready' flag, now document.registerElement will trigger
12308 CustomElements.ready = true; 12639 // synchronous upgrades
12640 CustomElements.ready = true;
12641 // async to ensure *native* custom elements upgrade prior to this
12642 // DOMContentLoaded can fire before elements upgrade (e.g. when there's
12643 // an external script)
12644 setTimeout(function() {
12309 // capture blunt profiling data 12645 // capture blunt profiling data
12310 CustomElements.readyTime = Date.now(); 12646 CustomElements.readyTime = Date.now();
12311 if (window.HTMLImports) { 12647 if (window.HTMLImports) {
12312 CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime; 12648 CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;
12313 } 12649 }
12314 // notify the system that we are bootstrapped 12650 // notify the system that we are bootstrapped
12315 document.dispatchEvent( 12651 document.dispatchEvent(
12316 new CustomEvent('WebComponentsReady', {bubbles: true}) 12652 new CustomEvent('WebComponentsReady', {bubbles: true})
12317 ); 12653 );
12318
12319 // install upgrade hook if HTMLImports are available
12320 if (window.HTMLImports) {
12321 HTMLImports.__importsParsingHook = function(elt) {
12322 CustomElements.parser.parse(elt.import);
12323 }
12324 }
12325 }); 12654 });
12326 } 12655 }
12327 12656
12328 // CustomEvent shim for IE 12657 // CustomEvent shim for IE
12329 if (typeof window.CustomEvent !== 'function') { 12658 if (typeof window.CustomEvent !== 'function') {
12330 window.CustomEvent = function(inType) { 12659 window.CustomEvent = function(inType, params) {
12331 var e = document.createEvent('HTMLEvents'); 12660 params = params || {};
12332 e.initEvent(inType, true, true); 12661 var e = document.createEvent('CustomEvent');
12662 e.initCustomEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable ), params.detail);
12333 return e; 12663 return e;
12334 }; 12664 };
12665 window.CustomEvent.prototype = window.Event.prototype;
12335 } 12666 }
12336 12667
12337 // When loading at readyState complete time (or via flag), boot custom elements 12668 // When loading at readyState complete time (or via flag), boot custom elements
12338 // immediately. 12669 // immediately.
12339 // If relevant, HTMLImports must already be loaded. 12670 // If relevant, HTMLImports must already be loaded.
12340 if (document.readyState === 'complete' || scope.flags.eager) { 12671 if (document.readyState === 'complete' || scope.flags.eager) {
12341 bootstrap(); 12672 bootstrap();
12342 // When loading at readyState interactive time, bootstrap only if HTMLImports 12673 // When loading at readyState interactive time, bootstrap only if HTMLImports
12343 // are not pending. Also avoid IE as the semantics of this state are unreliable. 12674 // are not pending. Also avoid IE as the semantics of this state are unreliable.
12344 } else if (document.readyState === 'interactive' && !window.attachEvent && 12675 } else if (document.readyState === 'interactive' && !window.attachEvent &&
(...skipping 1144 matching lines...) Expand 10 before | Expand all | Expand 10 after
13489 get bindingDelegate() { 13820 get bindingDelegate() {
13490 return this.delegate_ && this.delegate_.raw; 13821 return this.delegate_ && this.delegate_.raw;
13491 }, 13822 },
13492 13823
13493 refChanged_: function() { 13824 refChanged_: function() {
13494 if (!this.iterator_ || this.refContent_ === this.ref_.content) 13825 if (!this.iterator_ || this.refContent_ === this.ref_.content)
13495 return; 13826 return;
13496 13827
13497 this.refContent_ = undefined; 13828 this.refContent_ = undefined;
13498 this.iterator_.valueChanged(); 13829 this.iterator_.valueChanged();
13499 this.iterator_.updateIteratedValue(); 13830 this.iterator_.updateIteratedValue(this.iterator_.getUpdatedValue());
13500 }, 13831 },
13501 13832
13502 clear: function() { 13833 clear: function() {
13503 this.model_ = undefined; 13834 this.model_ = undefined;
13504 this.delegate_ = undefined; 13835 this.delegate_ = undefined;
13505 if (this.bindings_ && this.bindings_.ref) 13836 if (this.bindings_ && this.bindings_.ref)
13506 this.bindings_.ref.close() 13837 this.bindings_.ref.close()
13507 this.refContent_ = undefined; 13838 this.refContent_ = undefined;
13508 if (!this.iterator_) 13839 if (!this.iterator_)
13509 return; 13840 return;
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after
13893 deps.value.close(); 14224 deps.value.close();
13894 } 14225 }
13895 }, 14226 },
13896 14227
13897 updateDependencies: function(directives, model) { 14228 updateDependencies: function(directives, model) {
13898 this.closeDeps(); 14229 this.closeDeps();
13899 14230
13900 var deps = this.deps = {}; 14231 var deps = this.deps = {};
13901 var template = this.templateElement_; 14232 var template = this.templateElement_;
13902 14233
14234 var ifValue = true;
13903 if (directives.if) { 14235 if (directives.if) {
13904 deps.hasIf = true; 14236 deps.hasIf = true;
13905 deps.ifOneTime = directives.if.onlyOneTime; 14237 deps.ifOneTime = directives.if.onlyOneTime;
13906 deps.ifValue = processBinding(IF, directives.if, template, model); 14238 deps.ifValue = processBinding(IF, directives.if, template, model);
13907 14239
14240 ifValue = deps.ifValue;
14241
13908 // oneTime if & predicate is false. nothing else to do. 14242 // oneTime if & predicate is false. nothing else to do.
13909 if (deps.ifOneTime && !deps.ifValue) { 14243 if (deps.ifOneTime && !ifValue) {
13910 this.updateIteratedValue(); 14244 this.valueChanged();
13911 return; 14245 return;
13912 } 14246 }
13913 14247
13914 if (!deps.ifOneTime) 14248 if (!deps.ifOneTime)
13915 deps.ifValue.open(this.updateIteratedValue, this); 14249 ifValue = ifValue.open(this.updateIfValue, this);
13916 } 14250 }
13917 14251
13918 if (directives.repeat) { 14252 if (directives.repeat) {
13919 deps.repeat = true; 14253 deps.repeat = true;
13920 deps.oneTime = directives.repeat.onlyOneTime; 14254 deps.oneTime = directives.repeat.onlyOneTime;
13921 deps.value = processBinding(REPEAT, directives.repeat, template, model); 14255 deps.value = processBinding(REPEAT, directives.repeat, template, model);
13922 } else { 14256 } else {
13923 deps.repeat = false; 14257 deps.repeat = false;
13924 deps.oneTime = directives.bind.onlyOneTime; 14258 deps.oneTime = directives.bind.onlyOneTime;
13925 deps.value = processBinding(BIND, directives.bind, template, model); 14259 deps.value = processBinding(BIND, directives.bind, template, model);
13926 } 14260 }
13927 14261
14262 var value = deps.value;
13928 if (!deps.oneTime) 14263 if (!deps.oneTime)
13929 deps.value.open(this.updateIteratedValue, this); 14264 value = value.open(this.updateIteratedValue, this);
13930 14265
13931 this.updateIteratedValue(); 14266 if (!ifValue) {
14267 this.valueChanged();
14268 return;
14269 }
14270
14271 this.updateValue(value);
13932 }, 14272 },
13933 14273
13934 updateIteratedValue: function() { 14274 /**
14275 * Gets the updated value of the bind/repeat. This can potentially call
14276 * user code (if a bindingDelegate is set up) so we try to avoid it if we
14277 * already have the value in hand (from Observer.open).
14278 */
14279 getUpdatedValue: function() {
14280 var value = this.deps.value;
14281 if (!this.deps.oneTime)
14282 value = value.discardChanges();
14283 return value;
14284 },
14285
14286 updateIfValue: function(ifValue) {
14287 if (!ifValue) {
14288 this.valueChanged();
14289 return;
14290 }
14291
14292 this.updateValue(this.getUpdatedValue());
14293 },
14294
14295 updateIteratedValue: function(value) {
13935 if (this.deps.hasIf) { 14296 if (this.deps.hasIf) {
13936 var ifValue = this.deps.ifValue; 14297 var ifValue = this.deps.ifValue;
13937 if (!this.deps.ifOneTime) 14298 if (!this.deps.ifOneTime)
13938 ifValue = ifValue.discardChanges(); 14299 ifValue = ifValue.discardChanges();
13939 if (!ifValue) { 14300 if (!ifValue) {
13940 this.valueChanged(); 14301 this.valueChanged();
13941 return; 14302 return;
13942 } 14303 }
13943 } 14304 }
13944 14305
13945 var value = this.deps.value; 14306 this.updateValue(value);
13946 if (!this.deps.oneTime) 14307 },
13947 value = value.discardChanges(); 14308
14309 updateValue: function(value) {
13948 if (!this.deps.repeat) 14310 if (!this.deps.repeat)
13949 value = [value]; 14311 value = [value];
13950 var observe = this.deps.repeat && 14312 var observe = this.deps.repeat &&
13951 !this.deps.oneTime && 14313 !this.deps.oneTime &&
13952 Array.isArray(value); 14314 Array.isArray(value);
13953 this.valueChanged(value, observe); 14315 this.valueChanged(value, observe);
13954 }, 14316 },
13955 14317
13956 valueChanged: function(value, observeValue) { 14318 valueChanged: function(value, observeValue) {
13957 if (!Array.isArray(value)) 14319 if (!Array.isArray(value))
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
14227 return imported; 14589 return imported;
14228 } 14590 }
14229 } 14591 }
14230 14592
14231 // exports 14593 // exports
14232 scope.flush = flush; 14594 scope.flush = flush;
14233 14595
14234 })(window.Platform); 14596 })(window.Platform);
14235 14597
14236 14598
14237 //# sourceMappingURL=platform.concat.js.map 14599 //# sourceMappingURL=platform.concat.js.map
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698