Index: third_party/polymer/v1_0/components-chromium/polymer/polymer-extracted.js |
diff --git a/third_party/polymer/v1_0/components-chromium/polymer/polymer-extracted.js b/third_party/polymer/v1_0/components-chromium/polymer/polymer-extracted.js |
index ce6d33d9c562b0ad164786cdb6b73f94a78ed401..aad713d4b462a2b4a2e54cc641d8db89cfaf7202 100644 |
--- a/third_party/polymer/v1_0/components-chromium/polymer/polymer-extracted.js |
+++ b/third_party/polymer/v1_0/components-chromium/polymer/polymer-extracted.js |
@@ -406,6 +406,19 @@ var MOUSE_EVENTS = [ |
'mouseup', |
'click' |
]; |
+var MOUSE_WHICH_TO_BUTTONS = [ |
+0, |
+1, |
+4, |
+2 |
+]; |
+var MOUSE_HAS_BUTTONS = function () { |
+try { |
+return new MouseEvent('test', { buttons: 1 }).buttons === 1; |
+} catch (e) { |
+return false; |
+} |
+}(); |
var IS_TOUCH_ONLY = navigator.userAgent.match(/iP(?:[oa]d|hone)|Android/); |
var mouseCanceller = function (mouseEvent) { |
mouseEvent[HANDLED_OBJ] = { skip: true }; |
@@ -444,6 +457,34 @@ POINTERSTATE.mouse.mouseIgnoreJob = null; |
}; |
POINTERSTATE.mouse.mouseIgnoreJob = Polymer.Debounce(POINTERSTATE.mouse.mouseIgnoreJob, unset, MOUSE_TIMEOUT); |
} |
+function hasLeftMouseButton(ev) { |
+var type = ev.type; |
+if (MOUSE_EVENTS.indexOf(type) === -1) { |
+return false; |
+} |
+if (type === 'mousemove') { |
+var buttons = ev.buttons === undefined ? 1 : ev.buttons; |
+if (ev instanceof window.MouseEvent && !MOUSE_HAS_BUTTONS) { |
+buttons = MOUSE_WHICH_TO_BUTTONS[ev.which] || 0; |
+} |
+return Boolean(buttons & 1); |
+} else { |
+var button = ev.button === undefined ? 0 : ev.button; |
+return button === 0; |
+} |
+} |
+function isSyntheticClick(ev) { |
+if (ev.type === 'click') { |
+if (ev.detail === 0) { |
+return true; |
+} |
+var t = Gestures.findOriginalTarget(ev); |
+var bcr = t.getBoundingClientRect(); |
+var x = ev.pageX, y = ev.pageY; |
+return !(x >= bcr.left && x <= bcr.right && (y >= bcr.top && y <= bcr.bottom)); |
+} |
+return false; |
+} |
var POINTERSTATE = { |
mouse: { |
target: null, |
@@ -468,6 +509,16 @@ break; |
} |
return ta; |
} |
+function trackDocument(stateObj, movefn, upfn) { |
+stateObj.movefn = movefn; |
+stateObj.upfn = upfn; |
+document.addEventListener('mousemove', movefn); |
+document.addEventListener('mouseup', upfn); |
+} |
+function untrackDocument(stateObj) { |
+document.removeEventListener('mousemove', stateObj.movefn); |
+document.removeEventListener('mouseup', stateObj.upfn); |
+} |
var Gestures = { |
gestures: {}, |
recognizers: [], |
@@ -673,18 +724,48 @@ deps: [ |
'touchstart', |
'touchend' |
], |
+flow: { |
+start: [ |
+'mousedown', |
+'touchstart' |
+], |
+end: [ |
+'mouseup', |
+'touchend' |
+] |
+}, |
emits: [ |
'down', |
'up' |
], |
+info: { |
+movefn: function () { |
+}, |
+upfn: function () { |
+} |
+}, |
+reset: function () { |
+untrackDocument(this.info); |
+}, |
mousedown: function (e) { |
+if (!hasLeftMouseButton(e)) { |
+return; |
+} |
var t = Gestures.findOriginalTarget(e); |
var self = this; |
+var movefn = function movefn(e) { |
+if (!hasLeftMouseButton(e)) { |
+self.fire('up', t, e); |
+untrackDocument(self.info); |
+} |
+}; |
var upfn = function upfn(e) { |
+if (hasLeftMouseButton(e)) { |
self.fire('up', t, e); |
-document.removeEventListener('mouseup', upfn); |
+} |
+untrackDocument(self.info); |
}; |
-document.addEventListener('mouseup', upfn); |
+trackDocument(this.info, movefn, upfn); |
this.fire('down', t, e); |
}, |
touchstart: function (e) { |
@@ -735,6 +816,10 @@ this.moves.shift(); |
} |
this.moves.push(move); |
}, |
+movefn: function () { |
+}, |
+upfn: function () { |
+}, |
prevent: false |
}, |
reset: function () { |
@@ -744,6 +829,7 @@ this.info.moves = []; |
this.info.x = 0; |
this.info.y = 0; |
this.info.prevent = false; |
+untrackDocument(this.info); |
}, |
hasMovedEnough: function (x, y) { |
if (this.info.prevent) { |
@@ -757,6 +843,9 @@ var dy = Math.abs(this.info.y - y); |
return dx >= TRACK_DISTANCE || dy >= TRACK_DISTANCE; |
}, |
mousedown: function (e) { |
+if (!hasLeftMouseButton(e)) { |
+return; |
+} |
var t = Gestures.findOriginalTarget(e); |
var self = this; |
var movefn = function movefn(e) { |
@@ -767,6 +856,10 @@ self.info.addMove({ |
x: x, |
y: y |
}); |
+if (!hasLeftMouseButton(e)) { |
+self.info.state = 'end'; |
+untrackDocument(self.info); |
+} |
self.fire(t, e); |
self.info.started = true; |
} |
@@ -776,11 +869,9 @@ if (self.info.started) { |
Gestures.prevent('tap'); |
movefn(e); |
} |
-document.removeEventListener('mousemove', movefn); |
-document.removeEventListener('mouseup', upfn); |
+untrackDocument(self.info); |
}; |
-document.addEventListener('mousemove', movefn); |
-document.addEventListener('mouseup', upfn); |
+trackDocument(this.info, movefn, upfn); |
this.info.x = e.clientX; |
this.info.y = e.clientY; |
}, |
@@ -875,10 +966,14 @@ this.info.x = e.clientX; |
this.info.y = e.clientY; |
}, |
mousedown: function (e) { |
+if (hasLeftMouseButton(e)) { |
this.save(e); |
+} |
}, |
click: function (e) { |
+if (hasLeftMouseButton(e)) { |
this.forward(e); |
+} |
}, |
touchstart: function (e) { |
this.save(e.changedTouches[0]); |
@@ -890,7 +985,7 @@ forward: function (e) { |
var dx = Math.abs(e.clientX - this.info.x); |
var dy = Math.abs(e.clientY - this.info.y); |
var t = Gestures.findOriginalTarget(e); |
-if (isNaN(dx) || isNaN(dy) || dx <= TAP_DISTANCE && dy <= TAP_DISTANCE) { |
+if (isNaN(dx) || isNaN(dy) || dx <= TAP_DISTANCE && dy <= TAP_DISTANCE || isSyntheticClick(e)) { |
if (!this.info.prevent) { |
Gestures.fire(t, 'tap', { |
x: e.clientX, |
@@ -1511,7 +1606,7 @@ trigger: trigger |
}); |
}, |
_parseMethod: function (expression) { |
-var m = expression.match(/(\w*)\((.*)\)/); |
+var m = expression.match(/([^\s]+)\((.*)\)/); |
if (m) { |
var sig = { |
method: m[1], |
@@ -1606,6 +1701,10 @@ this._handlers = []; |
_marshalAttributes: function () { |
this._takeAttributesToModel(this._config); |
}, |
+_attributeChangedImpl: function (name) { |
+var model = this._clientsReadied ? this : this._config; |
+this._setAttributeToProperty(model, name); |
+}, |
_configValue: function (name, value) { |
this._config[name] = value; |
}, |
@@ -1885,36 +1984,56 @@ var array = this.get(path); |
var args = Array.prototype.slice.call(arguments, 1); |
var len = array.length; |
var ret = array.push.apply(array, args); |
+if (args.length) { |
this._notifySplice(array, path, len, args.length, []); |
+} |
return ret; |
}, |
pop: function (path) { |
var array = this.get(path); |
+var hadLength = Boolean(array.length); |
var args = Array.prototype.slice.call(arguments, 1); |
-var rem = array.slice(-1); |
var ret = array.pop.apply(array, args); |
-this._notifySplice(array, path, array.length, 0, rem); |
+if (hadLength) { |
+this._notifySplice(array, path, array.length, 0, [ret]); |
+} |
return ret; |
}, |
splice: function (path, start, deleteCount) { |
var array = this.get(path); |
+if (start < 0) { |
+start = array.length - Math.floor(-start); |
+} else { |
+start = Math.floor(start); |
+} |
+if (!start) { |
+start = 0; |
+} |
var args = Array.prototype.slice.call(arguments, 1); |
var ret = array.splice.apply(array, args); |
-this._notifySplice(array, path, start, args.length - 2, ret); |
+var addedCount = Math.max(args.length - 2, 0); |
+if (addedCount || ret.length) { |
+this._notifySplice(array, path, start, addedCount, ret); |
+} |
return ret; |
}, |
shift: function (path) { |
var array = this.get(path); |
+var hadLength = Boolean(array.length); |
var args = Array.prototype.slice.call(arguments, 1); |
var ret = array.shift.apply(array, args); |
+if (hadLength) { |
this._notifySplice(array, path, 0, 0, [ret]); |
+} |
return ret; |
}, |
unshift: function (path) { |
var array = this.get(path); |
var args = Array.prototype.slice.call(arguments, 1); |
var ret = array.unshift.apply(array, args); |
+if (args.length) { |
this._notifySplice(array, path, 0, args.length, []); |
+} |
return ret; |
} |
}); |
@@ -1937,7 +2056,7 @@ text = this._clean(text); |
return this._parseCss(this._lex(text), text); |
}, |
_clean: function (cssText) { |
-return cssText.replace(rx.comments, '').replace(rx.port, ''); |
+return cssText.replace(this._rx.comments, '').replace(this._rx.port, ''); |
}, |
_lex: function (text) { |
var root = { |
@@ -1976,15 +2095,15 @@ var ss = node.previous ? node.previous.end : node.parent.start; |
t = text.substring(ss, node.start - 1); |
t = t.substring(t.lastIndexOf(';') + 1); |
var s = node.parsedSelector = node.selector = t.trim(); |
-node.atRule = s.indexOf(AT_START) === 0; |
+node.atRule = s.indexOf(this.AT_START) === 0; |
if (node.atRule) { |
-if (s.indexOf(MEDIA_START) === 0) { |
+if (s.indexOf(this.MEDIA_START) === 0) { |
node.type = this.types.MEDIA_RULE; |
-} else if (s.match(rx.keyframesRule)) { |
+} else if (s.match(this._rx.keyframesRule)) { |
node.type = this.types.KEYFRAMES_RULE; |
} |
} else { |
-if (s.indexOf(VAR_START) === 0) { |
+if (s.indexOf(this.VAR_START) === 0) { |
node.type = this.types.MIXIN_RULE; |
} else { |
node.type = this.types.STYLE_RULE; |
@@ -2004,12 +2123,12 @@ text = text || ''; |
var cssText = ''; |
if (node.cssText || node.rules) { |
var r$ = node.rules; |
-if (r$ && (preserveProperties || !hasMixinRules(r$))) { |
+if (r$ && (preserveProperties || !this._hasMixinRules(r$))) { |
for (var i = 0, l = r$.length, r; i < l && (r = r$[i]); i++) { |
cssText = this.stringify(r, preserveProperties, cssText); |
} |
} else { |
-cssText = preserveProperties ? node.cssText : removeCustomProps(node.cssText); |
+cssText = preserveProperties ? node.cssText : this.removeCustomProps(node.cssText); |
cssText = cssText.trim(); |
if (cssText) { |
cssText = ' ' + cssText + '\n'; |
@@ -2027,6 +2146,19 @@ text += this.CLOSE_BRACE + '\n\n'; |
} |
return text; |
}, |
+_hasMixinRules: function (rules) { |
+return rules[0].selector.indexOf(this.VAR_START) >= 0; |
+}, |
+removeCustomProps: function (cssText) { |
+cssText = this.removeCustomPropAssignment(cssText); |
+return this.removeCustomPropApply(cssText); |
+}, |
+removeCustomPropAssignment: function (cssText) { |
+return cssText.replace(this._rx.customProp, '').replace(this._rx.mixinProp, ''); |
+}, |
+removeCustomPropApply: function (cssText) { |
+return cssText.replace(this._rx.mixinApply, '').replace(this._rx.varApply, ''); |
+}, |
types: { |
STYLE_RULE: 1, |
KEYFRAMES_RULE: 7, |
@@ -2034,18 +2166,8 @@ MEDIA_RULE: 4, |
MIXIN_RULE: 1000 |
}, |
OPEN_BRACE: '{', |
-CLOSE_BRACE: '}' |
-}; |
-function hasMixinRules(rules) { |
-return rules[0].selector.indexOf(VAR_START) >= 0; |
-} |
-function removeCustomProps(cssText) { |
-return cssText.replace(rx.customProp, '').replace(rx.mixinProp, '').replace(rx.mixinApply, '').replace(rx.varApply, ''); |
-} |
-var VAR_START = '--'; |
-var MEDIA_START = '@media'; |
-var AT_START = '@'; |
-var rx = { |
+CLOSE_BRACE: '}', |
+_rx: { |
comments: /\/\*[^*]*\*+([^\/*][^*]*\*+)*\//gim, |
port: /@import[^;]*;/gim, |
customProp: /(?:^|[\s;])--[^;{]*?:[^{};]*?(?:[;\n]|$)/gim, |
@@ -2053,6 +2175,10 @@ mixinProp: /(?:^|[\s;])--[^;{]*?:[^{;]*?{[^}]*?}(?:[;\n]|$)?/gim, |
mixinApply: /@apply[\s]*\([^)]*?\)[\s]*(?:[;\n]|$)?/gim, |
varApply: /[^;:]*?:[^;]*var[^;]*(?:[;\n]|$)?/gim, |
keyframesRule: /^@[^\s]*keyframes/ |
+}, |
+VAR_START: '--', |
+MEDIA_START: '@media', |
+AT_START: '@' |
}; |
return api; |
}(); |
@@ -2085,7 +2211,7 @@ clearStyleRules: function (style) { |
style.__cssRules = null; |
}, |
forEachStyleRule: function (node, callback) { |
-var s = node.selector; |
+var s = node.parsedSelector; |
var skipRules = false; |
if (node.type === this.ruleTypes.STYLE_RULE) { |
callback(node); |
@@ -2225,7 +2351,7 @@ var p$ = rule.selector.split(COMPLEX_SELECTOR_SEP); |
for (var i = 0, l = p$.length, p; i < l && (p = p$[i]); i++) { |
p$[i] = transformer.call(this, p, scope, hostScope); |
} |
-rule.selector = p$.join(COMPLEX_SELECTOR_SEP); |
+rule.selector = rule.transformedSelector = p$.join(COMPLEX_SELECTOR_SEP); |
}, |
_transformComplexSelector: function (selector, scope, hostScope) { |
var stop = false; |
@@ -2580,7 +2706,8 @@ return property && property.trim() || ''; |
}, |
valueForProperties: function (property, props) { |
var parts = property.split(';'); |
-for (var i = 0, p, m; i < parts.length && (p = parts[i]); i++) { |
+for (var i = 0, p, m; i < parts.length; i++) { |
+if (p = parts[i]) { |
m = p.match(this.rx.MIXIN_MATCH); |
if (m) { |
p = this.valueForProperty(props[m[1]], props); |
@@ -2594,6 +2721,7 @@ p = pp.join(':'); |
} |
parts[i] = p && p.lastIndexOf(';') === p.length - 1 ? p.slice(0, -1) : p || ''; |
} |
+} |
return parts.join(';'); |
}, |
applyProperties: function (rule, props) { |
@@ -2613,7 +2741,7 @@ styleUtil.forRulesInStyles(styles, function (rule) { |
if (!rule.propertyInfo) { |
self.decorateRule(rule); |
} |
-if (element && rule.propertyInfo.properties && matchesSelector.call(element, rule.selector)) { |
+if (element && rule.propertyInfo.properties && matchesSelector.call(element, rule.transformedSelector || rule.parsedSelector)) { |
self.collectProperties(rule, props); |
addToBitMask(i, o); |
} |
@@ -3011,9 +3139,9 @@ this._pushHost(); |
this._stampTemplate(); |
this._popHost(); |
this._marshalAnnotationReferences(); |
-this._marshalHostAttributes(); |
this._setupDebouncers(); |
this._marshalInstanceEffects(); |
+this._marshalHostAttributes(); |
this._marshalBehaviors(); |
this._marshalAttributes(); |
this._tryReady(); |
@@ -3026,6 +3154,7 @@ this._listenListeners(b.listeners); |
var nativeShadow = Polymer.Settings.useNativeShadow; |
var propertyUtils = Polymer.StyleProperties; |
var styleUtil = Polymer.StyleUtil; |
+var cssParse = Polymer.CssParse; |
var styleDefaults = Polymer.StyleDefaults; |
var styleTransformer = Polymer.StyleTransformer; |
Polymer({ |
@@ -3063,7 +3192,7 @@ var self = this; |
e.textContent = styleUtil.toCssText(styleUtil.rulesForStyle(e), function (rule) { |
var css = rule.cssText = rule.parsedCssText; |
if (rule.propertyInfo && rule.propertyInfo.cssText) { |
-css = css.replace(propertyUtils.rx.VAR_ASSIGN, ''); |
+css = cssParse.removeCustomPropAssignment(css); |
rule.cssText = propertyUtils.valueForProperties(css, props); |
} |
styleTransformer.documentRule(rule); |
@@ -3111,11 +3240,25 @@ _showHideChildrenImpl: function (hide) { |
var c = this._children; |
for (var i = 0; i < c.length; i++) { |
var n = c[i]; |
-if (n.style) { |
-n.style.display = hide ? 'none' : ''; |
-n.__hideTemplateChildren__ = hide; |
+if (Boolean(hide) != Boolean(n.__hideTemplateChildren__)) { |
+if (n.nodeType === Node.TEXT_NODE) { |
+if (hide) { |
+n.__polymerTextContent__ = n.textContent; |
+n.textContent = ''; |
+} else { |
+n.textContent = n.__polymerTextContent__; |
+} |
+} else if (n.style) { |
+if (hide) { |
+n.__polymerDisplay__ = n.style.display; |
+n.style.display = 'none'; |
+} else { |
+n.style.display = n.__polymerDisplay__; |
} |
} |
+} |
+n.__hideTemplateChildren__ = hide; |
+} |
}, |
_debounceTemplate: function (fn) { |
Polymer.dom.addDebouncer(this.debounce('_debounceTemplate', fn)); |
@@ -3797,16 +3940,23 @@ is: 'array-selector', |
properties: { |
items: { |
type: Array, |
-observer: '_itemsChanged' |
+observer: '_resetSelection' |
+}, |
+multi: { |
+type: Boolean, |
+value: false, |
+observer: '_resetSelection' |
}, |
selected: { |
type: Object, |
notify: true |
}, |
-toggle: Boolean, |
-multi: Boolean |
+toggle: { |
+type: Boolean, |
+value: false |
+} |
}, |
-_itemsChanged: function () { |
+_resetSelection: function () { |
if (Array.isArray(this.selected)) { |
for (var i = 0; i < this.selected.length; i++) { |
this.unlinkPaths('selected.' + i); |
@@ -3815,20 +3965,28 @@ this.unlinkPaths('selected.' + i); |
this.unlinkPaths('selected'); |
} |
if (this.multi) { |
+if (!this.selected || this.selected.length) { |
this.selected = []; |
+this._selectedColl = Polymer.Collection.get(this.selected); |
+} |
} else { |
this.selected = null; |
+this._selectedColl = null; |
+} |
+}, |
+isSelected: function (item) { |
+if (this.multi) { |
+return this._selectedColl.getKey(item) !== undefined; |
+} else { |
+return this.selected == item; |
} |
}, |
deselect: function (item) { |
if (this.multi) { |
-var scol = Polymer.Collection.get(this.selected); |
-var sidx = this.selected.indexOf(item); |
-if (sidx >= 0) { |
-var skey = scol.getKey(item); |
-this.splice('selected', sidx, 1); |
+if (this.isSelected(item)) { |
+var skey = this._selectedColl.getKey(item); |
+this.arrayDelete('selected', item); |
this.unlinkPaths('selected.' + skey); |
-return true; |
} |
} else { |
this.selected = null; |
@@ -3839,18 +3997,14 @@ select: function (item) { |
var icol = Polymer.Collection.get(this.items); |
var key = icol.getKey(item); |
if (this.multi) { |
-var scol = Polymer.Collection.get(this.selected); |
-var skey = scol.getKey(item); |
-if (skey >= 0) { |
+if (this.isSelected(item)) { |
if (this.toggle) { |
this.deselect(item); |
} |
} else { |
this.push('selected', item); |
-this.async(function () { |
-skey = scol.getKey(item); |
+skey = this._selectedColl.getKey(item); |
this.linkPaths('selected.' + skey, 'items.' + key); |
-}); |
} |
} else { |
if (this.toggle && item == this.selected) { |
@@ -3895,7 +4049,6 @@ this._flushTemplates(); |
_render: function () { |
if (this.if) { |
if (!this.ctor) { |
-this._wrapTextNodes(this._content || this.content); |
this.templatize(this); |
} |
this._ensureInstance(); |
@@ -3931,16 +4084,6 @@ parent.removeChild(n); |
this._instance = null; |
} |
}, |
-_wrapTextNodes: function (root) { |
-for (var n = root.firstChild; n; n = n.nextSibling) { |
-if (n.nodeType === Node.TEXT_NODE && n.textContent.trim()) { |
-var s = document.createElement('span'); |
-root.insertBefore(s, n); |
-s.appendChild(n); |
-n = s; |
-} |
-} |
-}, |
_showHideChildren: function () { |
var hidden = this.__hideTemplateChildren__ || !this.if; |
if (this._instance) { |
@@ -3958,37 +4101,11 @@ this._instance.notifyPath(path, value, true); |
} |
} |
}); |
-Polymer.ImportStatus = { |
-_ready: false, |
-_callbacks: [], |
-whenLoaded: function (cb) { |
-if (this._ready) { |
-cb(); |
-} else { |
-this._callbacks.push(cb); |
-} |
-}, |
-_importsLoaded: function () { |
-this._ready = true; |
-this._callbacks.forEach(function (cb) { |
-cb(); |
-}); |
-this._callbacks = []; |
-} |
-}; |
-window.addEventListener('load', function () { |
-Polymer.ImportStatus._importsLoaded(); |
-}); |
-if (window.HTMLImports) { |
-HTMLImports.whenReady(function () { |
-Polymer.ImportStatus._importsLoaded(); |
-}); |
-} |
Polymer({ |
is: 'dom-bind', |
extends: 'template', |
created: function () { |
-Polymer.ImportStatus.whenLoaded(this._markImportsReady.bind(this)); |
+Polymer.RenderStatus.whenReady(this._markImportsReady.bind(this)); |
}, |
_ensureReady: function () { |
if (!this._readied) { |