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

Unified Diff: appengine/config_service/ui/bower_components/polymer/lib/legacy/class.html

Issue 2923973003: Added base template for config ui. (Closed)
Patch Set: Created 3 years, 6 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 side-by-side diff with in-line comments
Download patch
Index: appengine/config_service/ui/bower_components/polymer/lib/legacy/class.html
diff --git a/appengine/config_service/ui/bower_components/polymer/lib/legacy/class.html b/appengine/config_service/ui/bower_components/polymer/lib/legacy/class.html
new file mode 100644
index 0000000000000000000000000000000000000000..a63c6a16a74bcc14e42f7872998430b836075097
--- /dev/null
+++ b/appengine/config_service/ui/bower_components/polymer/lib/legacy/class.html
@@ -0,0 +1,334 @@
+<!--
+@license
+Copyright (c) 2017 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="legacy-element-mixin.html">
+<script>
+
+ (function() {
+
+ 'use strict';
+
+ let LegacyElementMixin = Polymer.LegacyElementMixin;
+
+ let metaProps = {
+ attached: true,
+ detached: true,
+ ready: true,
+ created: true,
+ beforeRegister: true,
+ registered: true,
+ attributeChanged: true,
+ // meta objects
+ behaviors: true
+ }
+
+ /**
+ * Applies a "legacy" behavior or array of behaviors to the provided class.
+ *
+ * Note: this method will automatically also apply the `Polymer.LegacyElementMixin`
+ * to ensure that any legacy behaviors can rely on legacy Polymer API on
+ * the underlying element.
+ *
+ * @param {Object|Array} behaviors Behavior object or array of behaviors.
+ * @param {HTMLElement} klass Element class.
+ * @return {HTMLElement} Returns a new Element class extended by the
+ * passed in `behaviors` and also by `Polymer.LegacyElementMixin`.
+ * @memberof Polymer
+ */
+ function mixinBehaviors(behaviors, klass) {
+ if (!behaviors) {
+ return klass;
+ }
+ // NOTE: ensure the bahevior is extending a class with
+ // legacy element api. This is necessary since behaviors expect to be able
+ // to access 1.x legacy api.
+ klass = LegacyElementMixin(klass);
+ if (!Array.isArray(behaviors)) {
+ behaviors = [behaviors];
+ }
+ let superBehaviors = klass.prototype.behaviors;
+ // get flattened, deduped list of behaviors *not* already on super class
+ behaviors = flattenBehaviors(behaviors, null, superBehaviors);
+ // mixin new behaviors
+ klass = _mixinBehaviors(behaviors, klass);
+ if (superBehaviors) {
+ behaviors = superBehaviors.concat(behaviors);
+ }
+ // Set behaviors on prototype for BC...
+ klass.prototype.behaviors = behaviors;
+ return klass;
+ }
+
+ // NOTE:
+ // 1.x
+ // Behaviors were mixed in *in reverse order* and de-duped on the fly.
+ // The rule was that behavior properties were copied onto the element
+ // prototype if and only if the property did not already exist.
+ // Given: Polymer{ behaviors: [A, B, C, A, B]}, property copy order was:
+ // (1), B, (2), A, (3) C. This means prototype properties win over
+ // B properties win over A win over C. This mirrors what would happen
+ // with inheritance if element extended B extended A extended C.
+ //
+ // Again given, Polymer{ behaviors: [A, B, C, A, B]}, the resulting
+ // `behaviors` array was [C, A, B].
+ // Behavior lifecycle methods were called in behavior array order
+ // followed by the element, e.g. (1) C.created, (2) A.created,
+ // (3) B.created, (4) element.created. There was no support for
+ // super, and "super-behavior" methods were callable only by name).
+ //
+ // 2.x
+ // Behaviors are made into proper mixins which live in the
+ // element's prototype chain. Behaviors are placed in the element prototype
+ // eldest to youngest and de-duped youngest to oldest:
+ // So, first [A, B, C, A, B] becomes [C, A, B] then,
+ // the element prototype becomes (oldest) (1) Polymer.Element, (2) class(C),
+ // (3) class(A), (4) class(B), (5) class(Polymer({...})).
+ // Result:
+ // This means element properties win over B properties win over A win
+ // over C. (same as 1.x)
+ // If lifecycle is called (super then me), order is
+ // (1) C.created, (2) A.created, (3) B.created, (4) element.created
+ // (again same as 1.x)
+ function _mixinBehaviors(behaviors, klass) {
+ for (let i=0; i<behaviors.length; i++) {
+ let b = behaviors[i];
+ if (b) {
+ klass = Array.isArray(b) ? _mixinBehaviors(b, klass) :
+ GenerateClassFromInfo(b, klass);
+ }
+ }
+ return klass;
+ }
+
+ /**
+ * @param {Array} behaviors List of behaviors to flatten.
+ * @param {Array=} list Target list to flatten behaviors into.
+ * @param {Array=} exclude List of behaviors to exclude from the list.
+ * @return {Array} Returns the list of flattened behaviors.
+ */
+ function flattenBehaviors(behaviors, list, exclude) {
+ list = list || [];
+ for (let i=behaviors.length-1; i >= 0; i--) {
+ let b = behaviors[i];
+ if (b) {
+ if (Array.isArray(b)) {
+ flattenBehaviors(b, list);
+ } else {
+ // dedup
+ if (list.indexOf(b) < 0 && (!exclude || exclude.indexOf(b) < 0)) {
+ list.unshift(b);
+ }
+ }
+ } else {
+ console.warn('behavior is null, check for missing or 404 import');
+ }
+ }
+ return list;
+ }
+
+ function GenerateClassFromInfo(info, Base) {
+
+ class PolymerGenerated extends Base {
+
+ static get properties() {
+ return info.properties;
+ }
+
+ static get observers() {
+ return info.observers;
+ }
+
+ static get template() {
+ // get template first from any imperative set in `info._template`
+ return info._template ||
+ // next look in dom-module associated with this element's is.
+ Polymer.DomModule.import(this.is, 'template') ||
+ // next look for superclass template (note: use superclass symbol
+ // to ensure correct `this.is`)
+ Base.template ||
+ // finally fall back to `_template` in element's protoype.
+ this.prototype._template;
+ }
+
+ created() {
+ super.created();
+ if (info.created) {
+ info.created.call(this);
+ }
+ }
+
+ _registered() {
+ super._registered();
+ /* NOTE: `beforeRegister` is called here for bc, but the behavior
+ is different than in 1.x. In 1.0, the method was called *after*
+ mixing prototypes together but *before* processing of meta-objects.
+ However, dynamic effects can still be set here and can be done either
+ in `beforeRegister` or `registered`. It is no longer possible to set
+ `is` in `beforeRegister` as you could in 1.x.
+ */
+ if (info.beforeRegister) {
+ info.beforeRegister.call(Object.getPrototypeOf(this));
+ }
+ if (info.registered) {
+ info.registered.call(Object.getPrototypeOf(this));
+ }
+ }
+
+ _applyListeners() {
+ super._applyListeners();
+ if (info.listeners) {
+ for (let l in info.listeners) {
+ this._addMethodEventListenerToNode(this, l, info.listeners[l]);
+ }
+ }
+ }
+
+ // note: exception to "super then me" rule;
+ // do work before calling super so that super attributes
+ // only apply if not already set.
+ _ensureAttributes() {
+ if (info.hostAttributes) {
+ for (let a in info.hostAttributes) {
+ this._ensureAttribute(a, info.hostAttributes[a]);
+ }
+ }
+ super._ensureAttributes();
+ }
+
+ ready() {
+ super.ready();
+ if (info.ready) {
+ info.ready.call(this);
+ }
+ }
+
+ attached() {
+ super.attached();
+ if (info.attached) {
+ info.attached.call(this);
+ }
+ }
+
+ detached() {
+ super.detached();
+ if (info.detached) {
+ info.detached.call(this);
+ }
+ }
+
+ attributeChanged(name, old, value) {
+ super.attributeChanged(name, old, value);
+ if (info.attributeChanged) {
+ info.attributeChanged.call(this, name, old, value);
+ }
+ }
+ }
+
+ PolymerGenerated.generatedFrom = info
+
+ for (let p in info) {
+ // NOTE: cannot copy `metaProps` methods onto prototype at least because
+ // `super.ready` must be called and is not included in the user fn.
+ if (!(p in metaProps)) {
+ let pd = Object.getOwnPropertyDescriptor(info, p);
+ if (pd) {
+ Object.defineProperty(PolymerGenerated.prototype, p, pd);
+ }
+ }
+ }
+
+ return PolymerGenerated;
+ }
+
+ /**
+ * Generates a class that extends `Polymer.LegacyElement` based on the
+ * provided info object. Metadata objects on the `info` object
+ * (`properties`, `observers`, `listeners`, `behaviors`, `is`) are used
+ * for Polymer's meta-programming systems, and any functions are copied
+ * to the generated class.
+ *
+ * Valid "metadata" values are as follows:
+ *
+ * `is`: String providing the tag name to register the element under. In
+ * addition, if a `dom-module` with the same id exists, the first template
+ * in that `dom-module` will be stamped into the shadow root of this element,
+ * with support for declarative event listeners (`on-...`), Polymer data
+ * bindings (`[[...]]` and `{{...}}`), and id-based node finding into
+ * `this.$`.
+ *
+ * `properties`: Object describing property-related metadata used by Polymer
+ * features (key: property names, value: object containing property metadata).
+ * Valid keys in per-property metadata include:
+ * - `type` (String|Number|Object|Array|...): Used by
+ * `attributeChangedCallback` to determine how string-based attributes
+ * are deserialized to JavaScript property values.
+ * - `notify` (boolean): Causes a change in the property to fire a
+ * non-bubbling event called `<property>-changed`. Elements that have
+ * enabled two-way binding to the property use this event to observe changes.
+ * - `readOnly` (boolean): Creates a getter for the property, but no setter.
+ * To set a read-only property, use the private setter method
+ * `_setProperty(property, value)`.
+ * - `observer` (string): Observer method name that will be called when
+ * the property changes. The arguments of the method are
+ * `(value, previousValue)`.
+ * - `computed` (string): String describing method and dependent properties
+ * for computing the value of this property (e.g. `'computeFoo(bar, zot)'`).
+ * Computed properties are read-only by default and can only be changed
+ * via the return value of the computing method.
+ *
+ * `observers`: Array of strings describing multi-property observer methods
+ * and their dependent properties (e.g. `'observeABC(a, b, c)'`).
+ *
+ * `listeners`: Object describing event listeners to be added to each
+ * instance of this element (key: event name, value: method name).
+ *
+ * `behaviors`: Array of additional `info` objects containing metadata
+ * and callbacks in the same format as the `info` object here which are
+ * merged into this element.
+ *
+ * `hostAttributes`: Object listing attributes to be applied to the host
+ * once created (key: attribute name, value: attribute value). Values
+ * are serialized based on the type of the value. Host attributes should
+ * generally be limited to attributes such as `tabIndex` and `aria-...`.
+ * Attributes in `hostAttributes` are only applied if a user-supplied
+ * attribute is not already present (attributes in markup override
+ * `hostAttributes`).
+ *
+ * In addition, the following Polymer-specific callbacks may be provided:
+ * - `registered`: called after first instance of this element,
+ * - `created`: called during `constructor`
+ * - `attached`: called during `connectedCallback`
+ * - `detached`: called during `disconnectedCallback`
+ * - `ready`: called before first `attached`, after all properties of
+ * this element have been propagated to its template and all observers
+ * have run
+ *
+ * @param {Object} info Object containing Polymer metadata and functions
+ * to become class methods.
+ * @return {Polymer.LegacyElement} Generated class
+ * @memberof Polymer
+ */
+ Polymer.Class = function(info) {
+ if (!info) {
+ console.warn('Polymer.Class requires `info` argument');
+ }
+ let klass = GenerateClassFromInfo(info, info.behaviors ?
+ // note: mixinBehaviors ensures `LegacyElementMixin`.
+ mixinBehaviors(info.behaviors, HTMLElement) :
+ LegacyElementMixin(HTMLElement));
+ // decorate klass with registration info
+ klass.is = info.is;
+ return klass;
+ }
+
+ Polymer.mixinBehaviors = mixinBehaviors;
+
+ })();
+
+</script>

Powered by Google App Engine
This is Rietveld 408576698