mirror of
https://github.com/Polymer/polymer.git
synced 2025-02-25 18:55:30 -06:00
Merge branch '2.0-scrub' into 2.0-styling-fallbacks
This commit is contained in:
commit
2c9954f950
@ -1,2 +1,4 @@
|
||||
<!DOCTYPE html>
|
||||
<link rel="import" href="src/elements/element.html">
|
||||
<link rel="import" href="src/mixins/element-mixin.html">
|
||||
<script>
|
||||
Polymer.Element = Polymer.ElementMixin(HTMLElement);
|
||||
</script>
|
@ -1,4 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<link rel="import" href="src/legacy/legacy-element.html">
|
||||
<link rel="import" href="src/legacy/polymer-fn.html">
|
||||
<link rel="import" href="src/legacy/class.html">
|
20
polymer.html
20
polymer.html
@ -1,10 +1,16 @@
|
||||
<!DOCTYPE html>
|
||||
<link rel="import" href="polymer-legacy.html">
|
||||
<link rel="import" href="src/legacy/legacy-element-mixin.html">
|
||||
<link rel="import" href="src/legacy/polymer-fn.html">
|
||||
<link rel="import" href="src/legacy/class.html">
|
||||
<!-- template elements -->
|
||||
<link rel="import" href="src/legacy/templatizer-behavior.html">
|
||||
<link rel="import" href="src/data-elements/dom-bind.html">
|
||||
<link rel="import" href="src/data-elements/dom-repeat.html">
|
||||
<link rel="import" href="src/data-elements/dom-if.html">
|
||||
<link rel="import" href="src/data-elements/array-selector.html">
|
||||
<link rel="import" href="src/elements/dom-bind.html">
|
||||
<link rel="import" href="src/elements/dom-repeat.html">
|
||||
<link rel="import" href="src/elements/dom-if.html">
|
||||
<link rel="import" href="src/elements/array-selector.html">
|
||||
<!-- custom-style -->
|
||||
<link rel="import" href="src/styling/custom-style.html">
|
||||
<link rel="import" href="src/elements/custom-style.html">
|
||||
<script>
|
||||
Polymer.LegacyElement = Polymer.LegacyElementMixin(HTMLElement);
|
||||
// bc
|
||||
Polymer.Base = Polymer.LegacyElement.prototype;
|
||||
</script>
|
@ -1,207 +0,0 @@
|
||||
<!--
|
||||
@license
|
||||
Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
|
||||
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
|
||||
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
|
||||
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
|
||||
Code distributed by Google as part of the polymer project is also
|
||||
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
||||
-->
|
||||
|
||||
<link rel="import" href="../utils/boot.html">
|
||||
<link rel="import" href="../utils/utils.html">
|
||||
<link rel="import" href="../utils/case-map.html">
|
||||
<script>
|
||||
(function() {
|
||||
|
||||
'use strict';
|
||||
|
||||
var caseMap = Polymer.CaseMap;
|
||||
|
||||
Polymer.Attributes = Polymer.Utils.dedupingMixin(function(superClass) {
|
||||
|
||||
/**
|
||||
* @unrestricted
|
||||
*/
|
||||
class Attributes extends superClass {
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
this.__serializing = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensures the element has the given attribute. If it does not,
|
||||
* assigns the given value to the attribute.
|
||||
*
|
||||
*
|
||||
* @method _ensureAttribute
|
||||
* @param {string} attribute Name of attribute to ensure is set.
|
||||
* @param {string} value of the attribute.
|
||||
*/
|
||||
_ensureAttribute(attribute, value) {
|
||||
if (!this.hasAttribute(attribute)) {
|
||||
this._valueToNodeAttribute(this, value, attribute);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Deserializes an attribute to its associated property.
|
||||
*
|
||||
* This method calls the `_deserializeAttribute` method to convert the string to
|
||||
* a typed value.
|
||||
*
|
||||
* @method _attributeToProperty
|
||||
* @param {string} attribute Name of attribute to deserialize.
|
||||
* @param {string} value of the attribute.
|
||||
* @param {*} type type to deserialize to.
|
||||
*/
|
||||
_attributeToProperty(attribute, value, type) {
|
||||
// Don't deserialize back to property if currently reflecting
|
||||
if (!this.__serializing) {
|
||||
var property = caseMap.dashToCamelCase(attribute);
|
||||
this[property] = this._deserializeAttribute(value, type);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Serializes a property to its associated attribute.
|
||||
*
|
||||
* @method _propertyToAttribute
|
||||
* @param {string} property Property name to reflect.
|
||||
* @param {string=} attribute Attribute name to reflect.
|
||||
* @param {*=} value Property value to refect.
|
||||
*/
|
||||
_propertyToAttribute(property, attribute, value) {
|
||||
this.__serializing = true;
|
||||
value = (arguments.length < 3) ? this[property] : value;
|
||||
this._valueToNodeAttribute(this, value,
|
||||
attribute || caseMap.camelToDashCase(property));
|
||||
this.__serializing = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a typed value to an HTML attribute on a node.
|
||||
*
|
||||
* This method calls the `_serializeAttribute` method to convert the typed
|
||||
* value to a string. If the `_serializeAttribute` method returns `undefined`,
|
||||
* the attribute will be removed (this is the default for boolean
|
||||
* type `false`).
|
||||
*
|
||||
* @method _valueToNodeAttribute
|
||||
* @param {Element} node Element to set attribute to.
|
||||
* @param {*} value Value to serialize.
|
||||
* @param {string} attribute Attribute name to serialize to.
|
||||
*/
|
||||
_valueToNodeAttribute(node, value, attribute) {
|
||||
var str = this._serializeAttribute(value);
|
||||
if (str === undefined) {
|
||||
node.removeAttribute(attribute);
|
||||
} else {
|
||||
node.setAttribute(attribute, str);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a typed value to a string.
|
||||
*
|
||||
* This method is called by Polymer when setting JS property values to
|
||||
* HTML attributes. Users may override this method on Polymer element
|
||||
* prototypes to provide serialization for custom types.
|
||||
*
|
||||
* @method _serializeAttribute
|
||||
* @param {*} value Property value to serialize.
|
||||
* @return {string | undefined} String serialized from the provided property value.
|
||||
*/
|
||||
_serializeAttribute(value) {
|
||||
/* eslint-disable no-fallthrough */
|
||||
switch (typeof value) {
|
||||
case 'boolean':
|
||||
return value ? '' : undefined;
|
||||
|
||||
case 'object':
|
||||
if (value instanceof Date) {
|
||||
return value.toString();
|
||||
} else if (value) {
|
||||
try {
|
||||
return JSON.stringify(value);
|
||||
} catch(x) {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
default:
|
||||
return value != null ? value.toString() : undefined;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a string to a typed value.
|
||||
*
|
||||
* This method is called by Polymer when reading HTML attribute values to
|
||||
* JS properties. Users may override this method on Polymer element
|
||||
* prototypes to provide deserialization for custom `type`s. Note,
|
||||
* the `type` argument is the value of the `type` field provided in the
|
||||
* `properties` configuration object for a given property, and is
|
||||
* by convention the constructor for the type to deserialize.
|
||||
*
|
||||
* Note: The return value of `undefined` is used as a sentinel value to
|
||||
* indicate the attribute should be removed.
|
||||
*
|
||||
* @method _deserializeAttribute
|
||||
* @param {string} value Attribute value to deserialize.
|
||||
* @param {*} type Type to deserialize the string to.
|
||||
* @return {*} Typed value deserialized from the provided string.
|
||||
*/
|
||||
_deserializeAttribute(value, type) {
|
||||
/**
|
||||
* @type {*}
|
||||
*/
|
||||
let outValue;
|
||||
switch (type) {
|
||||
case Number:
|
||||
outValue = Number(value);
|
||||
break;
|
||||
|
||||
case Boolean:
|
||||
outValue = (value !== null);
|
||||
break;
|
||||
|
||||
case Object:
|
||||
try {
|
||||
outValue = JSON.parse(value);
|
||||
} catch(x) {
|
||||
// allow non-JSON literals like Strings and Numbers
|
||||
}
|
||||
break;
|
||||
|
||||
case Array:
|
||||
try {
|
||||
outValue = JSON.parse(value);
|
||||
} catch(x) {
|
||||
outValue = null;
|
||||
console.warn('Polymer::Attributes: couldn`t decode Array as JSON');
|
||||
}
|
||||
break;
|
||||
|
||||
case Date:
|
||||
outValue = new Date(value);
|
||||
break;
|
||||
|
||||
case String:
|
||||
default:
|
||||
outValue = value;
|
||||
break;
|
||||
}
|
||||
|
||||
return outValue;
|
||||
}
|
||||
/* eslint-enable no-fallthrough */
|
||||
}
|
||||
|
||||
return Attributes;
|
||||
});
|
||||
|
||||
|
||||
})();
|
||||
</script>
|
@ -63,8 +63,8 @@ is false, `selected` is a property representing the last selected item. When
|
||||
-->
|
||||
|
||||
<link rel="import" href="../../polymer-element.html">
|
||||
<link rel="import" href="../utils/utils.html">
|
||||
<link rel="import" href="../utils/array-splice.html">
|
||||
<link rel="import" href="../lib/utils.html">
|
||||
<link rel="import" href="../lib/array-splice.html">
|
||||
|
||||
<script>
|
||||
(function() {
|
||||
@ -283,7 +283,7 @@ is false, `selected` is a property representing the last selected item. When
|
||||
_selectedIndexForItemIndex(idx) {
|
||||
let selected = this.__dataLinkedPaths['items.' + idx];
|
||||
if (selected) {
|
||||
return parseInt(selected.slice('selected.'.length), 10);
|
||||
return parseInt(selected.slice('selected.'.length), 10);
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,3 @@
|
||||
<!doctype html>
|
||||
<!--
|
||||
@license
|
||||
Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
|
||||
@ -9,15 +8,14 @@ Code distributed by Google as part of the polymer project is also
|
||||
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
||||
-->
|
||||
<link rel="import" href="../../../shadycss/custom-style-interface.html">
|
||||
<link rel="import" href="../../../shadycss/element-style-interface.html">
|
||||
<link rel="import" href="style-gather.html">
|
||||
<link rel="import" href="../lib/style-gather.html">
|
||||
<script>
|
||||
(function() {
|
||||
'use strict';
|
||||
|
||||
const attr = 'include';
|
||||
|
||||
const CustomStyleInterface = window.CustomStyleInterface;
|
||||
const CustomStyleInterface = window.ShadyCSS.CustomStyleInterface;
|
||||
|
||||
class CustomStyle extends HTMLElement {
|
||||
constructor() {
|
@ -8,11 +8,8 @@ Code distributed by Google as part of the polymer project is also
|
||||
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
||||
-->
|
||||
|
||||
<link rel="import" href="../utils/boot.html">
|
||||
<link rel="import" href="../../src/properties/property-effects.html">
|
||||
<link rel="import" href="../../src/attributes/attributes.html">
|
||||
<link rel="import" href="../../src/template/template-stamp.html">
|
||||
<link rel="import" href="../../src/events/gesture-event-listeners.html">
|
||||
<link rel="import" href="../lib/boot.html">
|
||||
<link rel="import" href="../mixins/property-effects.html">
|
||||
|
||||
<script>
|
||||
|
@ -9,9 +9,9 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
-->
|
||||
|
||||
<link rel="import" href="../../polymer-element.html">
|
||||
<link rel="import" href="templatize.html">
|
||||
<link rel="import" href="../utils/debounce.html">
|
||||
<link rel="import" href="../utils/flush.html">
|
||||
<link rel="import" href="../lib/templatize.html">
|
||||
<link rel="import" href="../lib/debounce.html">
|
||||
<link rel="import" href="../lib/flush.html">
|
||||
|
||||
<script>
|
||||
|
@ -1,4 +1,5 @@
|
||||
<link rel="import" href="../utils/boot.html">
|
||||
<link rel="import" href="../lib/boot.html">
|
||||
<link rel="import" href="../lib/resolve-url.html">
|
||||
<script>
|
||||
|
||||
(function() {
|
||||
@ -41,18 +42,15 @@
|
||||
}
|
||||
|
||||
get assetpath() {
|
||||
let assetpath = this.__assetpath || this.getAttribute('assetpath');
|
||||
let assetpath = this.__assetpath;
|
||||
// Don't override existing assetpath.
|
||||
if (assetpath) {}
|
||||
// Polyfilled import.
|
||||
else if (window.HTMLImports && !HTMLImports.useNative &&
|
||||
HTMLImports.importForElement) {
|
||||
const imp = HTMLImports.importForElement(this);
|
||||
assetpath = imp ? imp.href : '';
|
||||
}
|
||||
// Native import.
|
||||
else if (this.ownerDocument !== document && this.baseURI) {
|
||||
assetpath = this.baseURI;
|
||||
if (!assetpath) {
|
||||
// note: assetpath set via an attribute must be relative to this
|
||||
// element's location.
|
||||
assetpath = this.getAttribute('assetpath') || '';
|
||||
const root = window.HTMLImports && HTMLImports.importForElement ?
|
||||
HTMLImports.importForElement(this) || document : this.ownerDocument;
|
||||
assetpath = Polymer.ResolveUrl.resolveUrl(assetpath, root.baseURI);
|
||||
}
|
||||
// Memoize.
|
||||
this.__assetpath = assetpath;
|
@ -99,9 +99,9 @@ Then the `observe` property should be configured as follows:
|
||||
-->
|
||||
|
||||
<link rel="import" href="../../polymer-element.html">
|
||||
<link rel="import" href="templatize.html">
|
||||
<link rel="import" href="../utils/debounce.html">
|
||||
<link rel="import" href="../utils/flush.html">
|
||||
<link rel="import" href="../lib/templatize.html">
|
||||
<link rel="import" href="../lib/debounce.html">
|
||||
<link rel="import" href="../lib/flush.html">
|
||||
|
||||
<script>
|
||||
(function() {
|
@ -1,55 +0,0 @@
|
||||
<!--
|
||||
@license
|
||||
Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
|
||||
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
|
||||
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
|
||||
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
|
||||
Code distributed by Google as part of the polymer project is also
|
||||
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
||||
-->
|
||||
<link rel="import" href="../utils/boot.html">
|
||||
<link rel="import" href="../utils/utils.html">
|
||||
<script>
|
||||
(function() {
|
||||
|
||||
'use strict';
|
||||
|
||||
function createNodeEventHandler(context, eventName, methodName) {
|
||||
// Instances can optionally have a _methodHost which allows redirecting where
|
||||
// to find methods. Currently used by `templatize`.
|
||||
context = context._methodHost || context;
|
||||
var handler = function(e) {
|
||||
if (context[methodName]) {
|
||||
context[methodName](e, e.detail);
|
||||
} else {
|
||||
console.warn('listener method `' + methodName + '` not defined');
|
||||
}
|
||||
};
|
||||
return handler;
|
||||
}
|
||||
|
||||
Polymer.EventListeners = Polymer.Utils.dedupingMixin(function(superClass) {
|
||||
|
||||
return class EventListeners extends superClass {
|
||||
|
||||
_addMethodEventListenerToNode(node, eventName, methodName, context) {
|
||||
context = context || node;
|
||||
var handler = createNodeEventHandler(context, eventName, methodName);
|
||||
this._addEventListenerToNode(node, eventName, handler);
|
||||
return handler;
|
||||
}
|
||||
|
||||
_addEventListenerToNode(node, eventName, handler) {
|
||||
node.addEventListener(eventName, handler);
|
||||
}
|
||||
|
||||
_removeEventListenerFromNode(node, eventName, handler) {
|
||||
node.removeEventListener(eventName, handler);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
})();
|
||||
</script>
|
@ -7,8 +7,8 @@ The complete set of contributors may be found at http://polymer.github.io/CONTRI
|
||||
Code distributed by Google as part of the polymer project is also
|
||||
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
||||
-->
|
||||
<link rel="import" href="legacy-element.html">
|
||||
<link rel="import" href="../utils/utils.html">
|
||||
<link rel="import" href="legacy-element-mixin.html">
|
||||
<link rel="import" href="../lib/utils.html">
|
||||
<script>
|
||||
|
||||
(function() {
|
||||
|
@ -9,15 +9,12 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
-->
|
||||
|
||||
<link rel="import" href="../../../shadycss/apply-shim.html">
|
||||
<link rel="import" href="../../../shadycss/element-style-interface.html">
|
||||
<link rel="import" href="../elements/element.html">
|
||||
<link rel="import" href="../styling/style-util.html">
|
||||
<link rel="import" href="../events/gesture-event-listeners.html">
|
||||
<link rel="import" href="../utils/utils.html">
|
||||
<link rel="import" href="../utils/async-render.html">
|
||||
<link rel="import" href="../utils/polymer.dom.html">
|
||||
<link rel="import" href="../utils/unresolved.html">
|
||||
<link rel="import" href="../legacy/logging.html">
|
||||
<link rel="import" href="../mixins/element-mixin.html">
|
||||
<link rel="import" href="../mixins/gesture-event-listeners.html">
|
||||
<link rel="import" href="../lib/utils.html">
|
||||
<link rel="import" href="../lib/async-render.html">
|
||||
<link rel="import" href="../lib/unresolved.html">
|
||||
<link rel="import" href="polymer.dom.html">
|
||||
|
||||
<script>
|
||||
(function() {
|
||||
@ -25,12 +22,14 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
'use strict';
|
||||
|
||||
var utils = Polymer.Utils;
|
||||
var styleInterface = window.ElementStyleInterface;
|
||||
var styleInterface = window.ShadyCSS;
|
||||
|
||||
const hasColor = (window.chrome && !(/edge/i.test(navigator.userAgent))) || (/firefox/i.test(navigator.userAgent));
|
||||
const prefix = hasColor ? ['%c[%s::%s]:', 'font-weight: bold; background-color:#EEEE00;'] : ['[%s::%s]:'];
|
||||
|
||||
Polymer.LegacyElementMixin = Polymer.Utils.dedupingMixin(function(base) {
|
||||
|
||||
const mixin = Polymer.Logging(
|
||||
Polymer.GestureEventListeners(Polymer.ElementMixin(base)));
|
||||
const mixin = Polymer.GestureEventListeners(Polymer.ElementMixin(base));
|
||||
|
||||
return class LegacyElement extends mixin {
|
||||
|
||||
@ -87,11 +86,11 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
_applyListeners() {}
|
||||
|
||||
serialize(value) {
|
||||
return this._serializeAttribute(value);
|
||||
return this._serializeValue(value);
|
||||
}
|
||||
|
||||
deserialize(value, type) {
|
||||
return this._deserializeAttribute(value, type);
|
||||
return this._deserializeValue(value, type);
|
||||
}
|
||||
|
||||
reflectPropertyToAttribute(property, attribute, value) {
|
||||
@ -715,13 +714,39 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
return null;
|
||||
}
|
||||
|
||||
// logging
|
||||
_logger(level, args) {
|
||||
// accept ['foo', 'bar'] and [['foo', 'bar']]
|
||||
if (Array.isArray(args) && args.length === 1) {
|
||||
args = args[0];
|
||||
}
|
||||
switch(level) {
|
||||
case 'log':
|
||||
case 'warn':
|
||||
case 'error':
|
||||
console[level](...args);
|
||||
}
|
||||
}
|
||||
|
||||
_log(...args) {
|
||||
this._logger('log', args);
|
||||
}
|
||||
|
||||
_warn(...args) {
|
||||
this._logger('warn', args);
|
||||
}
|
||||
|
||||
_error(...args) {
|
||||
this._logger('error', args)
|
||||
}
|
||||
|
||||
_logf(...args) {
|
||||
return prefix.concat(this.is).concat(args);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
// bc
|
||||
Polymer.LegacyElement = Polymer.LegacyElementMixin(HTMLElement);
|
||||
Polymer.Base = Polymer.LegacyElement.prototype;
|
||||
|
||||
})();
|
||||
</script>
|
@ -1,46 +0,0 @@
|
||||
<!--
|
||||
@license
|
||||
Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
|
||||
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
|
||||
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
|
||||
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
|
||||
Code distributed by Google as part of the polymer project is also
|
||||
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
||||
-->
|
||||
<link rel="import" href="../utils/utils.html">
|
||||
<script>
|
||||
(function() {
|
||||
'use strict';
|
||||
Polymer.Logging = Polymer.Utils.dedupingMixin(function(superClass) {
|
||||
const hasColor = (window.chrome && !(/edge/i.test(navigator.userAgent))) || (/firefox/i.test(navigator.userAgent));
|
||||
const prefix = hasColor ? ['%c[%s::%s]:', 'font-weight: bold; background-color:#EEEE00;'] : ['[%s::%s]:']
|
||||
|
||||
return class Logging extends superClass {
|
||||
_logger(level, args) {
|
||||
// accept ['foo', 'bar'] and [['foo', 'bar']]
|
||||
if (Array.isArray(args) && args.length === 1) {
|
||||
args = args[0];
|
||||
}
|
||||
switch(level) {
|
||||
case 'log':
|
||||
case 'warn':
|
||||
case 'error':
|
||||
console[level](...args);
|
||||
}
|
||||
}
|
||||
_log(...args) {
|
||||
this._logger('log', args);
|
||||
}
|
||||
_warn(...args) {
|
||||
this._logger('warn', args);
|
||||
}
|
||||
_error(...args) {
|
||||
this._logger('error', args)
|
||||
}
|
||||
_logf(...args) {
|
||||
return prefix.concat(this.is).concat(args);
|
||||
}
|
||||
};
|
||||
});
|
||||
})();
|
||||
</script>
|
@ -7,11 +7,11 @@ The complete set of contributors may be found at http://polymer.github.io/CONTRI
|
||||
Code distributed by Google as part of the polymer project is also
|
||||
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
||||
-->
|
||||
<link rel="import" href="boot.html">
|
||||
<link rel="import" href="utils.html">
|
||||
<link rel="import" href="array-splice.html">
|
||||
<link rel="import" href="async.html">
|
||||
<link rel="import" href="flush.html">
|
||||
<link rel="import" href="../lib/boot.html">
|
||||
<link rel="import" href="../lib/utils.html">
|
||||
<link rel="import" href="../lib/array-splice.html">
|
||||
<link rel="import" href="../lib/async.html">
|
||||
<link rel="import" href="../lib/flush.html">
|
||||
<script>
|
||||
(function() {
|
||||
|
@ -8,7 +8,7 @@ Code distributed by Google as part of the polymer project is also
|
||||
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
||||
-->
|
||||
|
||||
<link rel="import" href="../data-elements/templatize.html">
|
||||
<link rel="import" href="../lib/templatize.html">
|
||||
|
||||
<script>
|
||||
(function() {
|
||||
@ -30,7 +30,7 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
return Polymer.Templatize.modelForElement(this._templatizerTemplate, el);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Polymer.Templatizer = Templatizer;
|
||||
|
||||
})();
|
||||
|
@ -7,8 +7,8 @@ The complete set of contributors may be found at http://polymer.github.io/CONTRI
|
||||
Code distributed by Google as part of the polymer project is also
|
||||
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
||||
-->
|
||||
<link rel="import" href="../utils/boot.html">
|
||||
<link rel="import" href="../utils/utils.html">
|
||||
<link rel="import" href="boot.html">
|
||||
<link rel="import" href="utils.html">
|
||||
<link rel="import" href="async.html">
|
||||
|
||||
<script>
|
||||
@ -36,7 +36,7 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
setConfig(asyncModule, cb) {
|
||||
this._asyncModule = asyncModule;
|
||||
this._callback = cb;
|
||||
this._timer = this._asyncModule.run(this._callback);
|
||||
this._timer = this._asyncModule.run(this.flush);
|
||||
},
|
||||
|
||||
/**
|
@ -7,6 +7,8 @@ The complete set of contributors may be found at http://polymer.github.io/CONTRI
|
||||
Code distributed by Google as part of the polymer project is also
|
||||
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
||||
-->
|
||||
<link rel="import" href="boot.html">
|
||||
|
||||
<script>
|
||||
|
||||
(function() {
|
@ -1,4 +1,3 @@
|
||||
<!doctype html>
|
||||
<!--
|
||||
@license
|
||||
Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
|
||||
@ -8,7 +7,7 @@ The complete set of contributors may be found at http://polymer.github.io/CONTRI
|
||||
Code distributed by Google as part of the polymer project is also
|
||||
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
||||
-->
|
||||
<link rel="import" href="../template/resolve-url.html">
|
||||
<link rel="import" href="resolve-url.html">
|
||||
<script>
|
||||
(function() {
|
||||
'use strict';
|
@ -8,11 +8,8 @@ Code distributed by Google as part of the polymer project is also
|
||||
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
||||
-->
|
||||
|
||||
<link rel="import" href="../utils/boot.html">
|
||||
<link rel="import" href="../../src/properties/property-effects.html">
|
||||
<link rel="import" href="../../src/attributes/attributes.html">
|
||||
<link rel="import" href="../../src/template/template-stamp.html">
|
||||
<link rel="import" href="../../src/events/gesture-event-listeners.html">
|
||||
<link rel="import" href="boot.html">
|
||||
<link rel="import" href="../mixins/property-effects.html">
|
||||
|
||||
<script>
|
||||
(function() {
|
||||
@ -130,7 +127,7 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
* @override
|
||||
*/
|
||||
_setUnmanagedPropertyToNode(node, prop, value) {
|
||||
if (node.__hideTemplateChildren__ &&
|
||||
if (node.__hideTemplateChildren__ &&
|
||||
node.nodeType == Node.TEXT_NODE && prop == 'textContent') {
|
||||
node.__polymerTextContent__ = value;
|
||||
} else {
|
@ -8,14 +8,12 @@ Code distributed by Google as part of the polymer project is also
|
||||
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
||||
-->
|
||||
|
||||
<link rel="import" href="../utils/boot.html">
|
||||
<link rel="import" href="../legacy/dom-module.html">
|
||||
<link rel="import" href="../utils/case-map.html">
|
||||
<link rel="import" href="../events/event-listeners.html">
|
||||
<link rel="import" href="../template/template-stamp.html">
|
||||
<link rel="import" href="../properties/property-effects.html">
|
||||
<link rel="import" href="../styling/style-gather.html">
|
||||
<link rel="import" href="../../../shadycss/element-style-interface.html">
|
||||
<link rel="import" href="../lib/boot.html">
|
||||
<link rel="import" href="../lib/case-map.html">
|
||||
<link rel="import" href="../lib/style-gather.html">
|
||||
<link rel="import" href="../lib/resolve-url.html">
|
||||
<link rel="import" href="../elements/dom-module.html">
|
||||
<link rel="import" href="property-effects.html">
|
||||
|
||||
<script>
|
||||
(function() {
|
||||
@ -23,7 +21,7 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
'use strict';
|
||||
|
||||
let caseMap = Polymer.CaseMap;
|
||||
let styleInterface = window.ElementStyleInterface;
|
||||
let styleInterface = window.ShadyCSS;
|
||||
|
||||
// Same as Polymer.Utils.mixin, but upgrades shorthand type
|
||||
// syntax to { type: Type }
|
||||
@ -399,12 +397,8 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
* @return {string} Rewritten URL relative to the import
|
||||
*/
|
||||
resolveUrl(url) {
|
||||
var module = Polymer.DomModule.import(this.constructor.is);
|
||||
var root = '';
|
||||
if (module) {
|
||||
root = Polymer.ResolveUrl.resolveUrl(
|
||||
module.assetpath, module.ownerDocument.baseURI);
|
||||
}
|
||||
const module = Polymer.DomModule.import(this.constructor.is);
|
||||
const root = module ? module.assetpath : document.baseURI;
|
||||
return Polymer.ResolveUrl.resolveUrl(url, root);
|
||||
}
|
||||
|
||||
@ -457,8 +451,6 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
}
|
||||
};
|
||||
|
||||
Polymer.Element = Polymer.ElementMixin(HTMLElement);
|
||||
|
||||
Polymer.updateStyles = function(props) {
|
||||
styleInterface.styleDocument(props);
|
||||
};
|
@ -7,11 +7,10 @@ The complete set of contributors may be found at http://polymer.github.io/CONTRI
|
||||
Code distributed by Google as part of the polymer project is also
|
||||
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
||||
-->
|
||||
<link rel="import" href="../utils/async.html">
|
||||
<link rel="import" href="../utils/boot.html">
|
||||
<link rel="import" href="../utils/utils.html">
|
||||
<link rel="import" href="../utils/debounce.html">
|
||||
<link rel="import" href="event-listeners.html">
|
||||
<link rel="import" href="../lib/async.html">
|
||||
<link rel="import" href="../lib/boot.html">
|
||||
<link rel="import" href="../lib/utils.html">
|
||||
<link rel="import" href="../lib/debounce.html">
|
||||
|
||||
<script>
|
||||
(function() {
|
||||
@ -732,17 +731,18 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
|
||||
Polymer.GestureEventListeners = Polymer.Utils.dedupingMixin(function(superClass) {
|
||||
|
||||
const mixin = Polymer.EventListeners(superClass);
|
||||
return class GestureEventListeners extends mixin {
|
||||
return class GestureEventListeners extends superClass {
|
||||
|
||||
_addEventListenerToNode(node, eventName, handler) {
|
||||
if (!gestures.addListener(node, eventName, handler)) {
|
||||
if (!gestures.addListener(node, eventName, handler) &&
|
||||
super._addEventListenerToNode) {
|
||||
super._addEventListenerToNode(node, eventName, handler);
|
||||
}
|
||||
}
|
||||
|
||||
_removeEventListenerFromNode(node, eventName, handler) {
|
||||
if (!gestures.removeListener(node, eventName, handler)) {
|
||||
if (!gestures.removeListener(node, eventName, handler) &&
|
||||
super._removeEventListenerFromNode) {
|
||||
super._removeEventListenerFromNode(node, eventName, handler);
|
||||
}
|
||||
}
|
@ -8,14 +8,20 @@ Code distributed by Google as part of the polymer project is also
|
||||
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
||||
-->
|
||||
|
||||
<link rel="import" href="../utils/boot.html">
|
||||
<link rel="import" href="../utils/utils.html">
|
||||
<link rel="import" href="../lib/boot.html">
|
||||
<link rel="import" href="../lib/utils.html">
|
||||
<link rel="import" href="../lib/case-map.html">
|
||||
<link rel="import" href="../lib/async.html">
|
||||
|
||||
<script>
|
||||
(function() {
|
||||
|
||||
'use strict';
|
||||
|
||||
var caseMap = Polymer.CaseMap;
|
||||
|
||||
var microtask = Polymer.Async.microTask;
|
||||
|
||||
// Save map of native properties; this forms a blacklist or properties
|
||||
// that won't have their values "saved" by `saveAccessorValue`, since
|
||||
// reading from an HTMLElement accessor from the context of a prototype throws
|
||||
@ -68,27 +74,223 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
|
||||
return class PropertyAccessors extends superClass {
|
||||
|
||||
static createPropertiesForAttributes() {
|
||||
let a$ = this.observedAttributes;
|
||||
for (let i=0; i < a$.length; i++) {
|
||||
this.prototype._createPropertyAccessor(caseMap.dashToCamelCase(a$[i]));
|
||||
}
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
this._initializeProperties();
|
||||
}
|
||||
|
||||
attributeChangedCallback(name, old, value) {
|
||||
if (old !== value) {
|
||||
this._attributeToProperty(name, value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes the local storage for property accessors.
|
||||
*
|
||||
* Override to initialize with e.g. default values by setting values into
|
||||
* accessors.
|
||||
* Default initialization via initializing
|
||||
* local property & pending data storage with any accessor values saved
|
||||
* in `__dataProto`. If instance properties had been set before the
|
||||
* element upgraded and gained accessors on its prototype, these values
|
||||
* are set into the prototype's accessors after being deleted from the
|
||||
* instance.
|
||||
*
|
||||
* @protected
|
||||
*/
|
||||
_initializeProperties() {
|
||||
this.__data = {};
|
||||
this.__serializing = false;
|
||||
this.__dataCounter = 0;
|
||||
this.__dataInvalid = false;
|
||||
// initialize data with prototype values saved when creating accessors
|
||||
this.__data = {};
|
||||
this.__dataPending = null;
|
||||
this.__dataOld = null;
|
||||
this.__dataInvalid = false;
|
||||
if (this.__dataProto) {
|
||||
this._initializeProtoProperties(this.__dataProto);
|
||||
}
|
||||
}
|
||||
|
||||
_initializeProtoProperties(props) {
|
||||
for (let p in props) {
|
||||
this._setProperty(p, props[p]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensures the element has the given attribute. If it does not,
|
||||
* assigns the given value to the attribute.
|
||||
*
|
||||
*
|
||||
* @method _ensureAttribute
|
||||
* @param {string} attribute Name of attribute to ensure is set.
|
||||
* @param {string} value of the attribute.
|
||||
*/
|
||||
_ensureAttribute(attribute, value) {
|
||||
if (!this.hasAttribute(attribute)) {
|
||||
this._valueToNodeAttribute(this, value, attribute);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Deserializes an attribute to its associated property.
|
||||
*
|
||||
* This method calls the `_deserializeValue` method to convert the string to
|
||||
* a typed value.
|
||||
*
|
||||
* @method _attributeToProperty
|
||||
* @param {string} attribute Name of attribute to deserialize.
|
||||
* @param {string} value of the attribute.
|
||||
* @param {*} type type to deserialize to.
|
||||
*/
|
||||
_attributeToProperty(attribute, value, type) {
|
||||
// Don't deserialize back to property if currently reflecting
|
||||
if (!this.__serializing) {
|
||||
var property = caseMap.dashToCamelCase(attribute);
|
||||
this[property] = this._deserializeValue(value, type);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Serializes a property to its associated attribute.
|
||||
*
|
||||
* @method _propertyToAttribute
|
||||
* @param {string} property Property name to reflect.
|
||||
* @param {string=} attribute Attribute name to reflect.
|
||||
* @param {*=} value Property value to refect.
|
||||
*/
|
||||
_propertyToAttribute(property, attribute, value) {
|
||||
this.__serializing = true;
|
||||
value = (arguments.length < 3) ? this[property] : value;
|
||||
this._valueToNodeAttribute(this, value,
|
||||
attribute || caseMap.camelToDashCase(property));
|
||||
this.__serializing = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a typed value to an HTML attribute on a node.
|
||||
*
|
||||
* This method calls the `_serializeValue` method to convert the typed
|
||||
* value to a string. If the `_serializeValue` method returns `undefined`,
|
||||
* the attribute will be removed (this is the default for boolean
|
||||
* type `false`).
|
||||
*
|
||||
* @method _valueToNodeAttribute
|
||||
* @param {Element} node Element to set attribute to.
|
||||
* @param {*} value Value to serialize.
|
||||
* @param {string} attribute Attribute name to serialize to.
|
||||
*/
|
||||
_valueToNodeAttribute(node, value, attribute) {
|
||||
var str = this._serializeValue(value);
|
||||
if (str === undefined) {
|
||||
node.removeAttribute(attribute);
|
||||
} else {
|
||||
node.setAttribute(attribute, str);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a typed value to a string.
|
||||
*
|
||||
* This method is called by Polymer when setting JS property values to
|
||||
* HTML attributes. Users may override this method on Polymer element
|
||||
* prototypes to provide serialization for custom types.
|
||||
*
|
||||
* @method _serializeValue
|
||||
* @param {*} value Property value to serialize.
|
||||
* @return {string | undefined} String serialized from the provided property value.
|
||||
*/
|
||||
_serializeValue(value) {
|
||||
/* eslint-disable no-fallthrough */
|
||||
switch (typeof value) {
|
||||
case 'boolean':
|
||||
return value ? '' : undefined;
|
||||
|
||||
case 'object':
|
||||
if (value instanceof Date) {
|
||||
return value.toString();
|
||||
} else if (value) {
|
||||
try {
|
||||
return JSON.stringify(value);
|
||||
} catch(x) {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
default:
|
||||
return value != null ? value.toString() : undefined;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a string to a typed value.
|
||||
*
|
||||
* This method is called by Polymer when reading HTML attribute values to
|
||||
* JS properties. Users may override this method on Polymer element
|
||||
* prototypes to provide deserialization for custom `type`s. Note,
|
||||
* the `type` argument is the value of the `type` field provided in the
|
||||
* `properties` configuration object for a given property, and is
|
||||
* by convention the constructor for the type to deserialize.
|
||||
*
|
||||
* Note: The return value of `undefined` is used as a sentinel value to
|
||||
* indicate the attribute should be removed.
|
||||
*
|
||||
* @method _deserializeValue
|
||||
* @param {string} value Attribute value to deserialize.
|
||||
* @param {*} type Type to deserialize the string to.
|
||||
* @return {*} Typed value deserialized from the provided string.
|
||||
*/
|
||||
_deserializeValue(value, type) {
|
||||
/**
|
||||
* @type {*}
|
||||
*/
|
||||
let outValue;
|
||||
switch (type) {
|
||||
case Number:
|
||||
outValue = Number(value);
|
||||
break;
|
||||
|
||||
case Boolean:
|
||||
outValue = (value !== null);
|
||||
break;
|
||||
|
||||
case Object:
|
||||
try {
|
||||
outValue = JSON.parse(value);
|
||||
} catch(x) {
|
||||
// allow non-JSON literals like Strings and Numbers
|
||||
}
|
||||
break;
|
||||
|
||||
case Array:
|
||||
try {
|
||||
outValue = JSON.parse(value);
|
||||
} catch(x) {
|
||||
outValue = null;
|
||||
console.warn('Polymer::Attributes: couldn`t decode Array as JSON');
|
||||
}
|
||||
break;
|
||||
|
||||
case Date:
|
||||
outValue = new Date(value);
|
||||
break;
|
||||
|
||||
case String:
|
||||
default:
|
||||
outValue = value;
|
||||
break;
|
||||
}
|
||||
|
||||
return outValue;
|
||||
}
|
||||
/* eslint-enable no-fallthrough */
|
||||
|
||||
/**
|
||||
* Creates a setter/getter pair for the named property with its own
|
||||
* local storage. The getter returns the value in the local storage,
|
||||
@ -183,7 +385,7 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
_invalidateProperties() {
|
||||
if (!this.__dataInvalid) {
|
||||
this.__dataInvalid = true;
|
||||
Promise.resolve().then(() => {
|
||||
microtask.run(() => {
|
||||
if (this.__dataInvalid) {
|
||||
this.__dataInvalid = false;
|
||||
this._flushProperties();
|
@ -9,15 +9,14 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
-->
|
||||
|
||||
|
||||
<link rel="import" href="../utils/boot.html">
|
||||
<link rel="import" href="../utils/utils.html">
|
||||
<link rel="import" href="../utils/path.html">
|
||||
<link rel="import" href="property-accessors.html">
|
||||
<link rel="import" href="../attributes/attributes.html">
|
||||
<link rel="import" href="../lib/boot.html">
|
||||
<link rel="import" href="../lib/utils.html">
|
||||
<link rel="import" href="../lib/path.html">
|
||||
<!-- for notify, reflect -->
|
||||
<link rel="import" href="../utils/case-map.html">
|
||||
<link rel="import" href="../lib/case-map.html">
|
||||
<link rel="import" href="property-accessors.html">
|
||||
<!-- for annotated effects -->
|
||||
<link rel="import" href="../template/template-stamp.html">
|
||||
<link rel="import" href="template-stamp.html">
|
||||
|
||||
|
||||
<script>
|
||||
@ -151,7 +150,7 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
* If no trigger is given, the path is deemed to match.
|
||||
*
|
||||
* @param {string} path Path or property that changed
|
||||
* @param {Object} trigger Descriptor
|
||||
* @param {Object} trigger Descriptor
|
||||
* @return {boolean} Whether the path matched the trigger
|
||||
*/
|
||||
function pathMatchesTrigger(path, trigger) {
|
||||
@ -1185,8 +1184,7 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
|
||||
Polymer.PropertyEffects = Polymer.Utils.dedupingMixin(function(superClass) {
|
||||
|
||||
const mixin = Polymer.TemplateStamp(
|
||||
Polymer.Attributes(Polymer.PropertyAccessors(superClass)));
|
||||
const mixin = Polymer.TemplateStamp(Polymer.PropertyAccessors(superClass));
|
||||
|
||||
/**
|
||||
* @unrestricted
|
||||
@ -1197,8 +1195,8 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
return TYPES;
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
_initializeProperties() {
|
||||
super._initializeProperties();
|
||||
this._asyncEffects = false;
|
||||
this.__dataInitialized = false;
|
||||
this.__dataPendingClients = null;
|
||||
@ -1209,29 +1207,7 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
// May be set on instance prior to upgrade
|
||||
this.__dataCompoundStorage = this.__dataCompoundStorage || null;
|
||||
this.__dataHost = this.__dataHost || null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds to default initialization in `PropertyAccessors` by initializing
|
||||
* local property & pending data storage with any accessor values saved
|
||||
* in `__dataProto`. If instance properties had been set before the
|
||||
* element upgraded and gained accessors on its prototype, these values
|
||||
* are set into the prototype's accessors after being deleted from the
|
||||
* instance.
|
||||
*
|
||||
* @override
|
||||
*/
|
||||
_initializeProperties() {
|
||||
super._initializeProperties();
|
||||
this.__dataTemp = {};
|
||||
// initialize data with prototype values saved when creating accessors
|
||||
if (this.__dataProto) {
|
||||
this.__data = Object.create(this.__dataProto);
|
||||
this.__dataPending = Object.create(this.__dataProto);
|
||||
this.__dataOld = {};
|
||||
} else {
|
||||
this.__dataPending = null;
|
||||
}
|
||||
// update instance properties
|
||||
for (let p in this.__propertyEffects) {
|
||||
if (this.hasOwnProperty(p)) {
|
||||
@ -1242,6 +1218,12 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
}
|
||||
}
|
||||
|
||||
_initializeProtoProperties(props) {
|
||||
this.__data = Object.create(props);
|
||||
this.__dataPending = Object.create(props);
|
||||
this.__dataOld = {};
|
||||
}
|
||||
|
||||
// Prototype setup ----------------------------------------
|
||||
|
||||
/**
|
||||
@ -1418,7 +1400,7 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
|
||||
/**
|
||||
* Applies a value to a non-Polymer element/node's property.
|
||||
*
|
||||
*
|
||||
* The implementation makes a best-effort at binding interop:
|
||||
* Some native element properties have side-effects when
|
||||
* re-setting the same value (e.g. setting <input>.value resets the
|
||||
@ -1427,7 +1409,7 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
* accept objects, we explicitly re-set object changes coming from the
|
||||
* Polymer world (which may include deep object changes without the
|
||||
* top reference changing), erring on the side of providing more
|
||||
* information.
|
||||
* information.
|
||||
*
|
||||
* Users may override this method to provide alternate approaches.
|
||||
*
|
@ -7,67 +7,114 @@ The complete set of contributors may be found at http://polymer.github.io/CONTRI
|
||||
Code distributed by Google as part of the polymer project is also
|
||||
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
||||
-->
|
||||
<link rel="import" href="../utils/boot.html">
|
||||
<link rel="import" href="../utils/utils.html">
|
||||
<link rel="import" href="../utils/case-map.html">
|
||||
<link rel="import" href="resolve-url.html">
|
||||
|
||||
<link rel="import" href="../lib/boot.html">
|
||||
<link rel="import" href="../lib/utils.html">
|
||||
|
||||
<script>
|
||||
/**
|
||||
* Scans a template to produce an annotation list that that associates
|
||||
* metadata culled from markup with tree locations
|
||||
* metadata and information to associate the metadata with nodes in an instance.
|
||||
*
|
||||
* Supported expressions include:
|
||||
*
|
||||
* Double-mustache annotations in text content. The annotation must be the only
|
||||
* content in the tag, compound expressions are not supported.
|
||||
*
|
||||
* <[tag]>{{annotation}}<[tag]>
|
||||
*
|
||||
* Double-escaped annotations in an attribute, either {{}} or [[]].
|
||||
*
|
||||
* <[tag] someAttribute="{{annotation}}" another="[[annotation]]"><[tag]>
|
||||
*
|
||||
* `on-` style event declarations.
|
||||
*
|
||||
* <[tag] on-<event-name>="annotation"><[tag]>
|
||||
*
|
||||
* Note that the `annotations` feature does not implement any behaviors
|
||||
* associated with these expressions, it only captures the data.
|
||||
*
|
||||
* Generated data-structure:
|
||||
*
|
||||
* [
|
||||
* {
|
||||
* id: '<id>',
|
||||
* events: [
|
||||
* {
|
||||
* name: '<name>'
|
||||
* value: '<annotation>'
|
||||
* }, ...
|
||||
* ],
|
||||
* bindings: [
|
||||
* {
|
||||
* kind: ['text'|'attribute'],
|
||||
* mode: ['{'|'['],
|
||||
* name: '<name>'
|
||||
* value: '<annotation>'
|
||||
* }, ...
|
||||
* ],
|
||||
* // TODO(sjmiles): this is annotation-parent, not node-parent
|
||||
* parent: <reference to parent annotation object>,
|
||||
* index: <integer index in parent's childNodes collection>
|
||||
* },
|
||||
* ...
|
||||
* ]
|
||||
*
|
||||
* @class Annotations feature
|
||||
*/
|
||||
(function() {
|
||||
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* Scans a template to produce an annotation object that stores expression
|
||||
* metadata along with information to associate the metadata with nodes in an
|
||||
* instance.
|
||||
*
|
||||
* Elements with `id` in the template are noted and marshaled into an
|
||||
* the `$` hash in an instance.
|
||||
*
|
||||
* Example
|
||||
*
|
||||
* <template>
|
||||
* <div id="foo"></div>
|
||||
* </template>
|
||||
* <script>
|
||||
* Polymer({
|
||||
* task: function() {
|
||||
* this.$.foo.style.color = 'red';
|
||||
* }
|
||||
* });
|
||||
* </script>
|
||||
*
|
||||
* Other expressions that are noted include:
|
||||
*
|
||||
* Double-mustache annotations in text content. The annotation must be the only
|
||||
* content in the tag, compound expressions are not (currently) supported.
|
||||
*
|
||||
* <[tag]>{{path.to.host.property}}<[tag]>
|
||||
*
|
||||
* Double-mustache annotations in an attribute.
|
||||
*
|
||||
* <[tag] someAttribute="{{path.to.host.property}}"><[tag]>
|
||||
*
|
||||
* Only immediate host properties can automatically trigger side-effects.
|
||||
* Setting `host.path` in the example above triggers the binding, setting
|
||||
* `host.path.to.host.property` does not.
|
||||
*
|
||||
* `on-` style event declarations.
|
||||
*
|
||||
* <[tag] on-<event-name>="{{hostMethodName}}"><[tag]>
|
||||
*
|
||||
* Note: **the `annotations` feature does not actually implement the behaviors
|
||||
* associated with these expressions, it only captures the data**.
|
||||
*
|
||||
* Other optional features contain actual data implementations.
|
||||
*
|
||||
* @class standard feature: annotations
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
Scans a template to produce an annotation map that stores expression metadata
|
||||
and information that associates the metadata to nodes in a template instance.
|
||||
|
||||
Supported annotations are:
|
||||
|
||||
* id attributes
|
||||
* binding annotations in text nodes
|
||||
* double-mustache expressions: {{expression}}
|
||||
* double-bracket expressions: [[expression]]
|
||||
* binding annotations in attributes
|
||||
* attribute-bind expressions: name="{{expression}} || [[expression]]"
|
||||
* property-bind expressions: name*="{{expression}} || [[expression]]"
|
||||
* property-bind expressions: name:="expression"
|
||||
* event annotations
|
||||
* event delegation directives: on-<eventName>="expression"
|
||||
|
||||
Generated data-structure:
|
||||
|
||||
[
|
||||
{
|
||||
id: '<id>',
|
||||
events: [
|
||||
{
|
||||
mode: ['auto'|''],
|
||||
name: '<name>'
|
||||
value: '<expression>'
|
||||
}, ...
|
||||
],
|
||||
bindings: [
|
||||
{
|
||||
kind: ['text'|'attribute'|'property'],
|
||||
mode: ['auto'|''],
|
||||
name: '<name>'
|
||||
value: '<expression>'
|
||||
}, ...
|
||||
],
|
||||
// TODO(sjmiles): confusingly, this is annotation-parent, not node-parent
|
||||
parent: <reference to parent annotation>,
|
||||
index: <integer index in parent's childNodes collection>
|
||||
},
|
||||
...
|
||||
]
|
||||
|
||||
TODO(sjmiles): this module should produce either syntactic metadata
|
||||
(e.g. double-mustache, double-bracket, star-attr), or semantic metadata
|
||||
(e.g. manual-bind, auto-bind, property-bind). Right now it's half and half.
|
||||
|
||||
*/
|
||||
|
||||
// null-array (shared empty array to avoid null-checks)
|
||||
const emptyArray = [];
|
||||
|
||||
@ -388,9 +435,72 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
Polymer.ResolveUrl.resolveAttrs(element, currentTemplate.ownerDocument);
|
||||
}
|
||||
|
||||
Polymer.Annotations = Polymer.Utils.dedupingMixin(function(superClass) {
|
||||
// construct `$` map (from id annotations)
|
||||
function applyIdToMap(inst, map, dom, note) {
|
||||
if (note.id) {
|
||||
map[note.id] = inst._findTemplateAnnotatedNode(dom, note);
|
||||
}
|
||||
}
|
||||
|
||||
return class Annotations extends superClass {
|
||||
// install event listeners (from event annotations)
|
||||
function applyEventListener(inst, dom, note, host) {
|
||||
if (note.events && note.events.length) {
|
||||
var node = inst._findTemplateAnnotatedNode(dom, note);
|
||||
for (var j=0, e$=note.events, e; (j<e$.length) && (e=e$[j]); j++) {
|
||||
inst._addMethodEventListenerToNode(node, e.name, e.value, host);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// push configuration references at configure time
|
||||
function applyTemplateContent(inst, dom, note) {
|
||||
if (note.templateContent) {
|
||||
var node = inst._findTemplateAnnotatedNode(dom, note);
|
||||
node._content = note.templateContent;
|
||||
}
|
||||
}
|
||||
|
||||
function createNodeEventHandler(context, eventName, methodName) {
|
||||
// Instances can optionally have a _methodHost which allows redirecting where
|
||||
// to find methods. Currently used by `templatize`.
|
||||
context = context._methodHost || context;
|
||||
var handler = function(e) {
|
||||
if (context[methodName]) {
|
||||
context[methodName](e, e.detail);
|
||||
} else {
|
||||
console.warn('listener method `' + methodName + '` not defined');
|
||||
}
|
||||
};
|
||||
return handler;
|
||||
}
|
||||
|
||||
Polymer.TemplateStamp = Polymer.Utils.dedupingMixin(function(superClass) {
|
||||
|
||||
return class TemplateStamp extends superClass {
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
this.$ = null;
|
||||
}
|
||||
|
||||
_stampTemplate(template) {
|
||||
// Polyfill support: bootstrap the template if it has not already been
|
||||
if (template && !template.content &&
|
||||
window.HTMLTemplateElement && HTMLTemplateElement.decorate) {
|
||||
HTMLTemplateElement.decorate(template);
|
||||
}
|
||||
var notes = this._parseTemplateAnnotations(template);
|
||||
var dom = document.importNode(template._content || template.content, true);
|
||||
// NOTE: ShadyDom optimization indicating there is an insertion point
|
||||
dom.__noInsertionPoint = !notes._hasInsertionPoint;
|
||||
this.$ = {};
|
||||
for (var i=0, l=notes.length, note; (i<l) && (note=notes[i]); i++) {
|
||||
applyIdToMap(this, this.$, dom, note);
|
||||
applyTemplateContent(this, dom, note);
|
||||
applyEventListener(this, dom, note, this);
|
||||
}
|
||||
return dom;
|
||||
}
|
||||
|
||||
// preprocess-time
|
||||
|
||||
@ -425,6 +535,21 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
}
|
||||
}
|
||||
|
||||
_addMethodEventListenerToNode(node, eventName, methodName, context) {
|
||||
context = context || node;
|
||||
var handler = createNodeEventHandler(context, eventName, methodName);
|
||||
this._addEventListenerToNode(node, eventName, handler);
|
||||
return handler;
|
||||
}
|
||||
|
||||
_addEventListenerToNode(node, eventName, handler) {
|
||||
node.addEventListener(eventName, handler);
|
||||
}
|
||||
|
||||
_removeEventListenerFromNode(node, eventName, handler) {
|
||||
node.removeEventListener(eventName, handler);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
});
|
@ -1,36 +0,0 @@
|
||||
<!--
|
||||
@license
|
||||
Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
|
||||
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
|
||||
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
|
||||
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
|
||||
Code distributed by Google as part of the polymer project is also
|
||||
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
||||
-->
|
||||
<script>
|
||||
(function() {
|
||||
'use strict';
|
||||
|
||||
let StyleUtil = {
|
||||
|
||||
isTargetedBuild(buildType) {
|
||||
return (!window.ShadyDOM || !ShadyDOM.inUse) ?
|
||||
buildType === 'shadow' : buildType === 'shady';
|
||||
},
|
||||
|
||||
cssBuildTypeForModule(module) {
|
||||
let dm = Polymer.DomModule.import(module);
|
||||
if (dm) {
|
||||
return this.getCssBuildType(dm);
|
||||
}
|
||||
},
|
||||
|
||||
getCssBuildType(element) {
|
||||
return element.getAttribute('css-build');
|
||||
}
|
||||
};
|
||||
|
||||
Polymer.StyleUtil = StyleUtil;
|
||||
|
||||
})();
|
||||
</script>
|
@ -1,178 +0,0 @@
|
||||
<!--
|
||||
@license
|
||||
Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
|
||||
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
|
||||
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
|
||||
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
|
||||
Code distributed by Google as part of the polymer project is also
|
||||
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
||||
-->
|
||||
|
||||
<link rel="import" href="../utils/boot.html">
|
||||
<link rel="import" href="../utils/utils.html">
|
||||
<link rel="import" href="../events/event-listeners.html">
|
||||
<link rel="import" href="annotations.html">
|
||||
<script>
|
||||
(function() {
|
||||
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* Scans a template to produce an annotation object that stores expression
|
||||
* metadata along with information to associate the metadata with nodes in an
|
||||
* instance.
|
||||
*
|
||||
* Elements with `id` in the template are noted and marshaled into an
|
||||
* the `$` hash in an instance.
|
||||
*
|
||||
* Example
|
||||
*
|
||||
* <template>
|
||||
* <div id="foo"></div>
|
||||
* </template>
|
||||
* <script>
|
||||
* Polymer({
|
||||
* task: function() {
|
||||
* this.$.foo.style.color = 'red';
|
||||
* }
|
||||
* });
|
||||
* </script>
|
||||
*
|
||||
* Other expressions that are noted include:
|
||||
*
|
||||
* Double-mustache annotations in text content. The annotation must be the only
|
||||
* content in the tag, compound expressions are not (currently) supported.
|
||||
*
|
||||
* <[tag]>{{path.to.host.property}}<[tag]>
|
||||
*
|
||||
* Double-mustache annotations in an attribute.
|
||||
*
|
||||
* <[tag] someAttribute="{{path.to.host.property}}"><[tag]>
|
||||
*
|
||||
* Only immediate host properties can automatically trigger side-effects.
|
||||
* Setting `host.path` in the example above triggers the binding, setting
|
||||
* `host.path.to.host.property` does not.
|
||||
*
|
||||
* `on-` style event declarations.
|
||||
*
|
||||
* <[tag] on-<event-name>="{{hostMethodName}}"><[tag]>
|
||||
*
|
||||
* Note: **the `annotations` feature does not actually implement the behaviors
|
||||
* associated with these expressions, it only captures the data**.
|
||||
*
|
||||
* Other optional features contain actual data implementations.
|
||||
*
|
||||
* @class standard feature: annotations
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
Scans a template to produce an annotation map that stores expression metadata
|
||||
and information that associates the metadata to nodes in a template instance.
|
||||
|
||||
Supported annotations are:
|
||||
|
||||
* id attributes
|
||||
* binding annotations in text nodes
|
||||
* double-mustache expressions: {{expression}}
|
||||
* double-bracket expressions: [[expression]]
|
||||
* binding annotations in attributes
|
||||
* attribute-bind expressions: name="{{expression}} || [[expression]]"
|
||||
* property-bind expressions: name*="{{expression}} || [[expression]]"
|
||||
* property-bind expressions: name:="expression"
|
||||
* event annotations
|
||||
* event delegation directives: on-<eventName>="expression"
|
||||
|
||||
Generated data-structure:
|
||||
|
||||
[
|
||||
{
|
||||
id: '<id>',
|
||||
events: [
|
||||
{
|
||||
mode: ['auto'|''],
|
||||
name: '<name>'
|
||||
value: '<expression>'
|
||||
}, ...
|
||||
],
|
||||
bindings: [
|
||||
{
|
||||
kind: ['text'|'attribute'|'property'],
|
||||
mode: ['auto'|''],
|
||||
name: '<name>'
|
||||
value: '<expression>'
|
||||
}, ...
|
||||
],
|
||||
// TODO(sjmiles): confusingly, this is annotation-parent, not node-parent
|
||||
parent: <reference to parent annotation>,
|
||||
index: <integer index in parent's childNodes collection>
|
||||
},
|
||||
...
|
||||
]
|
||||
|
||||
TODO(sjmiles): this module should produce either syntactic metadata
|
||||
(e.g. double-mustache, double-bracket, star-attr), or semantic metadata
|
||||
(e.g. manual-bind, auto-bind, property-bind). Right now it's half and half.
|
||||
|
||||
*/
|
||||
|
||||
// construct `$` map (from id annotations)
|
||||
function applyIdToMap(inst, map, dom, note) {
|
||||
if (note.id) {
|
||||
map[note.id] = inst._findTemplateAnnotatedNode(dom, note);
|
||||
}
|
||||
}
|
||||
|
||||
// install event listeners (from event annotations)
|
||||
function applyEventListener(inst, dom, note, host) {
|
||||
if (note.events && note.events.length) {
|
||||
var node = inst._findTemplateAnnotatedNode(dom, note);
|
||||
for (var j=0, e$=note.events, e; (j<e$.length) && (e=e$[j]); j++) {
|
||||
inst._addMethodEventListenerToNode(node, e.name, e.value, host);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// push configuration references at configure time
|
||||
function applyTemplateContent(inst, dom, note) {
|
||||
if (note.templateContent) {
|
||||
var node = inst._findTemplateAnnotatedNode(dom, note);
|
||||
node._content = note.templateContent;
|
||||
}
|
||||
}
|
||||
|
||||
Polymer.TemplateStamp = Polymer.Utils.dedupingMixin(function(superClass) {
|
||||
|
||||
const mixin = Polymer.Annotations(Polymer.EventListeners(superClass));
|
||||
return class TemplateStamp extends mixin {
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
this.$ = null;
|
||||
}
|
||||
|
||||
_stampTemplate(template) {
|
||||
// Polyfill support: bootstrap the template if it has not already been
|
||||
if (template && !template.content &&
|
||||
window.HTMLTemplateElement && HTMLTemplateElement.decorate) {
|
||||
HTMLTemplateElement.decorate(template);
|
||||
}
|
||||
var notes = this._parseTemplateAnnotations(template);
|
||||
var dom = document.importNode(template._content || template.content, true);
|
||||
// NOTE: ShadyDom optimization indicating there is an insertion point
|
||||
dom.__noInsertionPoint = !notes._hasInsertionPoint;
|
||||
this.$ = {};
|
||||
for (var i=0, l=notes.length, note; (i<l) && (note=notes[i]); i++) {
|
||||
applyIdToMap(this, this.$, dom, note);
|
||||
applyTemplateContent(this, dom, note);
|
||||
applyEventListener(this, dom, note, this);
|
||||
}
|
||||
return dom;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
})();
|
||||
</script>
|
@ -24,8 +24,8 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
<script>
|
||||
|
||||
var suites = [
|
||||
'unit/bind.html',
|
||||
'unit/notify-path.html',
|
||||
'unit/property-effects.html',
|
||||
'unit/path-effects.html',
|
||||
'unit/shady.html',
|
||||
'unit/shady-events.html',
|
||||
'unit/shady-content.html',
|
||||
|
@ -13,7 +13,7 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
<meta charset="utf-8">
|
||||
<script src="../../../webcomponentsjs/webcomponents-lite.js"></script>
|
||||
<script src="../../../web-component-tester/browser.js"></script>
|
||||
<link rel="import" href="../../src/utils/async.html">
|
||||
<link rel="import" href="../../src/lib/async.html">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
|
@ -13,7 +13,7 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
<meta charset="utf-8">
|
||||
<script src="../../../webcomponentsjs/webcomponents-lite.js"></script>
|
||||
<script src="../../../web-component-tester/browser.js"></script>
|
||||
<link rel="import" href="../../src/utils/case-map.html">
|
||||
<link rel="import" href="../../src/lib/case-map.html">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
|
@ -299,12 +299,8 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
var xBar, xFoo, stylesBuilt;
|
||||
|
||||
suiteSetup(function() {
|
||||
var customStyle = document.querySelector('style[is="custom-style"]');
|
||||
stylesBuilt = Polymer.StyleUtil.getCssBuildType(customStyle);
|
||||
|
||||
xBar = document.querySelector('x-bar');
|
||||
xFoo = document.querySelector('x-foo');
|
||||
|
||||
});
|
||||
|
||||
test('root styles applied', function() {
|
||||
|
@ -113,6 +113,17 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
});
|
||||
});
|
||||
|
||||
test('flush debouncer', function(done) {
|
||||
var callback = sinon.spy();
|
||||
var job = Polymer.Debouncer.debounce(null, Polymer.Async.microTask, callback);
|
||||
|
||||
setTimeout(function() {
|
||||
job.flush();
|
||||
assert.isTrue(callback.calledOnce, 'callback should be called once');
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
test('different debouncers and multiple micro tasks', function(done) {
|
||||
var callback = sinon.spy();
|
||||
var job1 = Polymer.Debouncer.debounce(null, Polymer.Async.microTask, callback);
|
||||
|
@ -15,7 +15,6 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
<script src="../../../web-component-tester/browser.js"></script>
|
||||
<link rel="import" href="../../polymer.html">
|
||||
<link rel="import" href="dom-repeat-elements.html">
|
||||
<link rel="import" href="../../src/utils/array-splice.html">
|
||||
<style>
|
||||
/* makes painting faster when testing on IOS simulator */
|
||||
x-repeat-chunked {
|
||||
|
@ -13,7 +13,7 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
<meta charset="utf-8">
|
||||
<script src="../../../webcomponentsjs/webcomponents-lite.js"></script>
|
||||
<script src="../../../web-component-tester/browser.js"></script>
|
||||
<link rel="import" href="../../src/utils/utils.html">
|
||||
<link rel="import" href="../../src/lib/utils.html">
|
||||
<body>
|
||||
|
||||
<x-test></x-test>
|
||||
|
@ -36,7 +36,7 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
</dom-module>
|
||||
<script>
|
||||
HTMLImports.whenReady(() => {
|
||||
class XMixin extends Polymer.Logging(Polymer.Element) {
|
||||
class XMixin extends Polymer.LegacyElement {
|
||||
static get is() { return 'x-mixin' }
|
||||
static get config() {
|
||||
return {
|
||||
|
@ -14,7 +14,7 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
<script src="../../../webcomponentsjs/webcomponents-lite.js"></script>
|
||||
<script src="../../../web-component-tester/browser.js"></script>
|
||||
<link rel="import" href="../../polymer.html">
|
||||
<link rel="import" href="notify-path-elements.html">
|
||||
<link rel="import" href="path-effects-elements.html">
|
||||
<body>
|
||||
|
||||
<script>
|
||||
@ -957,7 +957,7 @@ suite('path API', function() {
|
||||
});
|
||||
|
||||
suite('corner cases', function() {
|
||||
|
||||
|
||||
test('malformed observer has nice message on failure', function() {
|
||||
var thrown = false;
|
||||
var verifyError = function(e) {
|
@ -13,7 +13,7 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
<meta charset="utf-8">
|
||||
<script src="../../../webcomponentsjs/webcomponents-lite.js"></script>
|
||||
<script src="../../../web-component-tester/browser.js"></script>
|
||||
<link rel="import" href="../../src/utils/path.html">
|
||||
<link rel="import" href="../../src/lib/path.html">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
|
@ -13,7 +13,7 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
<meta charset="utf-8">
|
||||
<script src="../../../webcomponentsjs/webcomponents-lite.js"></script>
|
||||
<script src="../../../web-component-tester/browser.js"></script>
|
||||
<link rel="import" href="../../polymer-legacy.html">
|
||||
<link rel="import" href="../../polymer.html">
|
||||
<body>
|
||||
|
||||
<dom-module id="my-element">
|
||||
|
@ -14,7 +14,7 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
<script src="../../../webcomponentsjs/webcomponents-lite.js"></script>
|
||||
<script src="../../../web-component-tester/browser.js"></script>
|
||||
<link rel="import" href="../../polymer.html">
|
||||
<link rel="import" href="bind-elements.html">
|
||||
<link rel="import" href="property-effects-elements.html">
|
||||
<body>
|
||||
<dom-repeat id="class-repeat" items='["class1", "class2"]'>
|
||||
<template>
|
@ -458,7 +458,7 @@ suite('scoped-styling-apply', function() {
|
||||
var stylesBuilt;
|
||||
|
||||
suiteSetup(function() {
|
||||
stylesBuilt = Polymer.StyleUtil.cssBuildTypeForModule('x-scope');
|
||||
stylesBuilt = false;
|
||||
});
|
||||
|
||||
test('variable mixins calculated correctly and inherit', function() {
|
||||
|
Loading…
Reference in New Issue
Block a user