From 07b760aeb0f078e2e4a721240368119e60b8249d Mon Sep 17 00:00:00 2001 From: dbeam Date: Mon, 23 Nov 2015 22:12:17 -0800 Subject: MD Downloads: fix up some Polymer 1.2.3 issues and re-vulcanize R=michaelpg@chromium.org BUG=none TEST=new Polymer, same great downloads taste! NOPRESUBMIT=true # for long lines in crisper.js Review URL: https://codereview.chromium.org/1462153007 Cr-Commit-Position: refs/heads/master@{#361262} --- chrome/browser/resources/md_downloads/crisper.js | 3167 ++++++++++++-------- chrome/browser/resources/md_downloads/manager.css | 15 +- chrome/browser/resources/md_downloads/manager.html | 29 +- chrome/browser/resources/md_downloads/manager.js | 6 +- .../resources/md_downloads/shared_style.css | 4 + chrome/browser/resources/md_downloads/toolbar.css | 2 +- .../browser/resources/md_downloads/vulcanized.html | 1026 +------ 7 files changed, 2138 insertions(+), 2111 deletions(-) diff --git a/chrome/browser/resources/md_downloads/crisper.js b/chrome/browser/resources/md_downloads/crisper.js index 49ea697..da445238 100644 --- a/chrome/browser/resources/md_downloads/crisper.js +++ b/chrome/browser/resources/md_downloads/crisper.js @@ -1465,12 +1465,15 @@ function elide(original, maxLength) { * @return {T} A non-null |condition|. */ function assert(condition, opt_message) { - 'use strict'; if (!condition) { - var msg = 'Assertion failed'; + var message = 'Assertion failed'; if (opt_message) - msg = msg + ': ' + opt_message; - throw new Error(msg); + message = message + ': ' + opt_message; + var error = new Error(message); + var global = function() { return this; }(); + if (global.traceAssertionsForTesting) + console.warn(error.stack); + throw error; } return condition; } @@ -1497,7 +1500,7 @@ function assert(condition, opt_message) { * @param {string=} opt_message A message to show when this is hit. */ function assertNotReached(opt_message) { - throw new Error(opt_message || 'Unreachable code hit'); + assert(false, opt_message || 'Unreachable code hit'); } /** @@ -1508,10 +1511,8 @@ function assertNotReached(opt_message) { * @template T */ function assertInstanceof(value, type, opt_message) { - if (!(value instanceof type)) { - throw new Error(opt_message || - value + ' is not a[n] ' + (type.name || typeof type)); - } + assert(value instanceof type, + opt_message || value + ' is not a[n] ' + (type.name || typeof type)); return value; }; // Copyright 2015 The Chromium Authors. All rights reserved. @@ -1804,10 +1805,11 @@ addEventListener('DOMContentLoaded', resolve); window.Polymer = { Settings: function () { var user = window.Polymer || {}; -location.search.slice(1).split('&').forEach(function (o) { +var parts = location.search.slice(1).split('&'); +for (var i = 0, o; i < parts.length && (o = parts[i]); i++) { o = o.split('='); o[0] && (user[o[0]] = o[1] || true); -}); +} var wantShadow = user.dom === 'shadow'; var hasShadow = Boolean(Element.prototype.createShadowRoot); var nativeShadow = hasShadow && !window.ShadowDOMPolyfill; @@ -1894,15 +1896,53 @@ this._callbacks.push(cb); }, _makeReady: function () { this._ready = true; -this._callbacks.forEach(function (cb) { -cb(); -}); +for (var i = 0; i < this._callbacks.length; i++) { +this._callbacks[i](); +} this._callbacks = []; }, _catchFirstRender: function () { requestAnimationFrame(function () { Polymer.RenderStatus._makeReady(); }); +}, +_afterNextRenderQueue: [], +_waitingNextRender: false, +afterNextRender: function (element, fn, args) { +this._watchNextRender(); +this._afterNextRenderQueue.push([ +element, +fn, +args +]); +}, +_watchNextRender: function () { +if (!this._waitingNextRender) { +this._waitingNextRender = true; +var fn = function () { +Polymer.RenderStatus._flushNextRender(); +}; +if (!this._ready) { +this.whenReady(fn); +} else { +requestAnimationFrame(fn); +} +} +}, +_flushNextRender: function () { +var self = this; +setTimeout(function () { +self._flushRenderCallbacks(self._afterNextRenderQueue); +self._afterNextRenderQueue = []; +self._waitingNextRender = false; +}); +}, +_flushRenderCallbacks: function (callbacks) { +for (var i = 0, h; i < callbacks.length; i++) { +h = callbacks[i]; +h[1].apply(h[0], h[2] || Polymer.nar); +} +; } }; if (window.HTMLImports) { @@ -1932,27 +1972,33 @@ this._doBehavior('created'); this._initFeatures(); }, attachedCallback: function () { +var self = this; Polymer.RenderStatus.whenReady(function () { -this.isAttached = true; -this._doBehavior('attached'); -}.bind(this)); +self.isAttached = true; +self._doBehavior('attached'); +}); }, detachedCallback: function () { this.isAttached = false; this._doBehavior('detached'); }, -attributeChangedCallback: function (name) { +attributeChangedCallback: function (name, oldValue, newValue) { this._attributeChangedImpl(name); -this._doBehavior('attributeChanged', arguments); +this._doBehavior('attributeChanged', [ +name, +oldValue, +newValue +]); }, _attributeChangedImpl: function (name) { this._setAttributeToProperty(this, name); }, extend: function (prototype, api) { if (prototype && api) { -Object.getOwnPropertyNames(api).forEach(function (n) { +var n$ = Object.getOwnPropertyNames(api); +for (var i = 0, n; i < n$.length && (n = n$[i]); i++) { this.copyOwnProperty(n, api, prototype); -}, this); +} } return prototype || api; }, @@ -2030,7 +2076,7 @@ import: function (id, selector) { if (id) { var m = findModule(id); if (!m) { -forceDocumentUpgrade(); +forceDomModulesUpgrade(); m = findModule(id); } if (m && selector) { @@ -2042,12 +2088,17 @@ return m; }); var cePolyfill = window.CustomElements && !CustomElements.useNative; document.registerElement('dom-module', DomModule); -function forceDocumentUpgrade() { +function forceDomModulesUpgrade() { if (cePolyfill) { var script = document._currentScript || document.currentScript; -var doc = script && script.ownerDocument; -if (doc) { -CustomElements.upgradeAll(doc); +var doc = script && script.ownerDocument || document; +var modules = doc.querySelectorAll('dom-module'); +for (var i = modules.length - 1, m; i >= 0 && (m = modules[i]); i--) { +if (m.__upgraded__) { +return; +} else { +CustomElements.upgrade(m); +} } } } @@ -2082,7 +2133,8 @@ return behaviors; }, _flattenBehaviorsList: function (behaviors) { var flat = []; -behaviors.forEach(function (b) { +for (var i = 0; i < behaviors.length; i++) { +var b = behaviors[i]; if (b instanceof Array) { flat = flat.concat(this._flattenBehaviorsList(b)); } else if (b) { @@ -2090,31 +2142,16 @@ flat.push(b); } else { this._warn(this._logf('_flattenBehaviorsList', 'behavior is null, check for missing or 404 import')); } -}, this); +} return flat; }, _mixinBehavior: function (b) { -Object.getOwnPropertyNames(b).forEach(function (n) { -switch (n) { -case 'hostAttributes': -case 'registered': -case 'properties': -case 'observers': -case 'listeners': -case 'created': -case 'attached': -case 'detached': -case 'attributeChanged': -case 'configure': -case 'ready': -break; -default: -if (!this.hasOwnProperty(n)) { +var n$ = Object.getOwnPropertyNames(b); +for (var i = 0, n; i < n$.length && (n = n$[i]); i++) { +if (!Polymer.Base._behaviorProperties[n] && !this.hasOwnProperty(n)) { this.copyOwnProperty(n, b, this); } -break; } -}, this); }, _prepBehaviors: function () { this._prepFlattenedBehaviors(this.behaviors); @@ -2126,9 +2163,9 @@ this._prepBehavior(behaviors[i]); this._prepBehavior(this); }, _doBehavior: function (name, args) { -this.behaviors.forEach(function (b) { -this._invokeBehavior(b, name, args); -}, this); +for (var i = 0; i < this.behaviors.length; i++) { +this._invokeBehavior(this.behaviors[i], name, args); +} this._invokeBehavior(this, name, args); }, _invokeBehavior: function (b, name, args) { @@ -2138,12 +2175,24 @@ fn.apply(this, args || Polymer.nar); } }, _marshalBehaviors: function () { -this.behaviors.forEach(function (b) { -this._marshalBehavior(b); -}, this); +for (var i = 0; i < this.behaviors.length; i++) { +this._marshalBehavior(this.behaviors[i]); +} this._marshalBehavior(this); } }); +Polymer.Base._behaviorProperties = { +hostAttributes: true, +registered: true, +properties: true, +observers: true, +listeners: true, +created: true, +attached: true, +detached: true, +attributeChanged: true, +ready: true +}; Polymer.Base._addFeature({ _getExtendedPrototype: function (tag) { return this._getExtendedNativePrototype(tag); @@ -2195,9 +2244,13 @@ properties: {}, getPropertyInfo: function (property) { var info = this._getPropertyInfo(property, this.properties); if (!info) { -this.behaviors.some(function (b) { -return info = this._getPropertyInfo(property, b.properties); -}, this); +for (var i = 0; i < this.behaviors.length; i++) { +info = this._getPropertyInfo(property, this.behaviors[i].properties); +if (info) { +return info; +} +} +; } return info || Polymer.nob; }, @@ -2210,6 +2263,40 @@ if (p) { p.defined = true; } return p; +}, +_prepPropertyInfo: function () { +this._propertyInfo = {}; +for (var i = 0, p; i < this.behaviors.length; i++) { +this._addPropertyInfo(this._propertyInfo, this.behaviors[i].properties); +} +this._addPropertyInfo(this._propertyInfo, this.properties); +this._addPropertyInfo(this._propertyInfo, this._propertyEffects); +}, +_addPropertyInfo: function (target, source) { +if (source) { +var t, s; +for (var i in source) { +t = target[i]; +s = source[i]; +if (i[0] === '_' && !s.readOnly) { +continue; +} +if (!target[i]) { +target[i] = { +type: typeof s === 'function' ? s : s.type, +readOnly: s.readOnly, +attribute: Polymer.CaseMap.camelToDashCase(i) +}; +} else { +if (!t.type) { +t.type = s.type; +} +if (!t.readOnly) { +t.readOnly = s.readOnly; +} +} +} +} } }); Polymer.CaseMap = { @@ -2237,21 +2324,24 @@ return g[0] + '-' + g[1].toLowerCase(); } }; Polymer.Base._addFeature({ -_prepAttributes: function () { -this._aggregatedAttributes = {}; -}, _addHostAttributes: function (attributes) { +if (!this._aggregatedAttributes) { +this._aggregatedAttributes = {}; +} if (attributes) { this.mixin(this._aggregatedAttributes, attributes); } }, _marshalHostAttributes: function () { +if (this._aggregatedAttributes) { this._applyAttributes(this, this._aggregatedAttributes); +} }, _applyAttributes: function (node, attr$) { for (var n in attr$) { if (!this.hasAttribute(n) && n !== 'class') { -this.serializeValueToAttribute(attr$[n], n, this); +var v = attr$[n]; +this.serializeValueToAttribute(v, n, this); } } }, @@ -2259,29 +2349,40 @@ _marshalAttributes: function () { this._takeAttributesToModel(this); }, _takeAttributesToModel: function (model) { -for (var i = 0, l = this.attributes.length; i < l; i++) { -this._setAttributeToProperty(model, this.attributes[i].name); +if (this.hasAttributes()) { +for (var i in this._propertyInfo) { +var info = this._propertyInfo[i]; +if (this.hasAttribute(info.attribute)) { +this._setAttributeToProperty(model, info.attribute, i, info); +} +} } }, -_setAttributeToProperty: function (model, attrName) { +_setAttributeToProperty: function (model, attribute, property, info) { if (!this._serializing) { -var propName = Polymer.CaseMap.dashToCamelCase(attrName); -var info = this.getPropertyInfo(propName); -if (info.defined || this._propertyEffects && this._propertyEffects[propName]) { -var val = this.getAttribute(attrName); -model[propName] = this.deserialize(val, info.type); +var property = property || Polymer.CaseMap.dashToCamelCase(attribute); +info = info || this._propertyInfo && this._propertyInfo[property]; +if (info && !info.readOnly) { +var v = this.getAttribute(attribute); +model[property] = this.deserialize(v, info.type); } } }, _serializing: false, -reflectPropertyToAttribute: function (name) { +reflectPropertyToAttribute: function (property, attribute, value) { this._serializing = true; -this.serializeValueToAttribute(this[name], Polymer.CaseMap.camelToDashCase(name)); +value = value === undefined ? this[property] : value; +this.serializeValueToAttribute(value, attribute || Polymer.CaseMap.camelToDashCase(property)); this._serializing = false; }, serializeValueToAttribute: function (value, attribute, node) { var str = this.serialize(value); -(node || this)[str === undefined ? 'removeAttribute' : 'setAttribute'](attribute, str); +node = node || this; +if (str === undefined) { +node.removeAttribute(attribute); +} else { +node.setAttribute(attribute, str); +} }, deserialize: function (value, type) { switch (type) { @@ -2357,13 +2458,13 @@ debouncer.stop(); } } }); -Polymer.version = '1.1.5'; +Polymer.version = '1.2.3'; Polymer.Base._addFeature({ _registerFeatures: function () { this._prepIs(); -this._prepAttributes(); this._prepBehaviors(); this._prepConstructor(); +this._prepPropertyInfo(); }, _prepBehavior: function (b) { this._addHostAttributes(b.hostAttributes); @@ -2378,13 +2479,14 @@ this._marshalBehaviors(); }); Polymer.Base._addFeature({ _prepTemplate: function () { -this._template = this._template || Polymer.DomModule.import(this.is, 'template'); +if (this._template === undefined) { +this._template = Polymer.DomModule.import(this.is, 'template'); +} if (this._template && this._template.hasAttribute('is')) { this._warn(this._logf('_prepTemplate', 'top-level Polymer template ' + 'must not be a type-extension, found', this._template, 'Move inside simple