polymer-rails 1.0.3 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a96d20ee245369e404430744a374739bc9bc1aef
4
- data.tar.gz: bc5a38ac1cc7c1d55670666c7c2de8d716abcae0
3
+ metadata.gz: d172b9731e66e8ede28d16419e23ed0f333e1a38
4
+ data.tar.gz: cf721f1ab30458b086ec02a04ca5ad5ed8d16b22
5
5
  SHA512:
6
- metadata.gz: f7aebe28ce60352583a61647fcea03ba513b56c18bb893b49dffe04a65faac9bcc56673d493d7244211dbcb5455b6f8a907bd91409284ef4c5097548b3e376f4
7
- data.tar.gz: d55946bc341f41fc9e773228a7de7ddbe3f76a677b22188ca2d70d0aa8ed82fb36c3a8fe8d708a0449dfd8d84d54db6c2d282844637cdb53c70fd3d561102dc5
6
+ metadata.gz: 8dff092d07bb8de17f252e9351208c1705cbd9fb68902099cc959e071e64b4b4394b4c8dfee710d6e8f6d8a7b082f95e8f25c1f3a9fdffa113a8142c0b59a22b
7
+ data.tar.gz: 69eae6d64d6518cab48f65463746c7b04223a998a16811442cdd994e1d995bc2d260a57c73a384bbab6e70b1e6a3e6075b892c0a35e06749fe7ff0e4d812dab1
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  # Polymer-Rails
2
- Want to get started with [web components](http://www.w3.org/wiki/WebComponents/)? Want to bring them into your Rails app? Easily build your own and use web components that are built by community in your Ruby on Rails Application. Poymer-rails helps you to do this:
2
+ Want to get started with [web components](http://www.w3.org/wiki/WebComponents/)? Want to bring them into your Rails app? Easily build your own and use web components that are built by community in your Ruby on Rails Application. Polymer-rails helps you to do this:
3
3
 
4
4
  1. Adds [polymer](http://polymer-project.org/) library to assets of your rails project.
5
5
 
@@ -16,15 +16,12 @@ This assets will be automatically compiled and required into component html file
16
16
 
17
17
 
18
18
  ## Versions
19
- Consider the 0.8 release to be our proposed API for 1.0. It is an “alpha” release — we fully expect some breaking changes as a result of the feedback we get.
19
+ Polymer 1.0 is out!
20
20
 
21
- This release is intended for early adopters who want to test out the new APIs and provide feedback. This release is optimized for performance and size, and is not yet a feature-complete replacement for 0.5.
22
-
23
- 0.8.x release is not compatible with the 0.5 APIs. For guidance on migrating an existing 0.5 element to the 0.8 APIs, see the [Migration guide](https://www.polymer-project.org/0.8/docs/migration.html).
24
-
25
- * `0.2.x` Releases include Polymer versions `0.5.x`
26
- * `0.3.x` Releases include Polymer versions `0.8.x`
21
+ * Use `0.2.x` versions of `polymer-rails` to work with Polymer versions `0.5.x`
22
+ * Use `1.0.x` versions of `polymer-rails` to work with Polymer versions `1.0.x`
27
23
 
24
+ 1.0 release is not compatible with the 0.5 APIs. For guidance on migrating an existing 0.5 elements to the 1.0 APIs, see the [Migration guide](https://www.polymer-project.org/1.0/docs/migration.html).
28
25
 
29
26
  ## Installation
30
27
 
@@ -500,7 +500,7 @@ debouncer.stop();
500
500
  }
501
501
  }
502
502
  });
503
- Polymer.version = '1.0.3';
503
+ Polymer.version = '1.0.4';
504
504
  Polymer.Base._addFeature({
505
505
  _registerFeatures: function () {
506
506
  this._prepIs();
@@ -11,13 +11,6 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
11
11
  <script>Polymer.Base._addFeature({
12
12
  _prepTemplate: function () {
13
13
  this._template = this._template || Polymer.DomModule.import(this.is, 'template');
14
- if (!this._template) {
15
- var script = document._currentScript || document.currentScript;
16
- var prev = script && script.previousElementSibling;
17
- if (prev && prev.localName === 'template') {
18
- this._template = prev;
19
- }
20
- }
21
14
  if (this._template && this._template.hasAttribute('is')) {
22
15
  this._warn(this._logf('_prepTemplate', 'top-level Polymer template ' + 'must not be a type-extension, found', this._template, 'Move inside simple <template>.'));
23
16
  }
@@ -456,20 +449,17 @@ dirtyRoots.push(host);
456
449
  }
457
450
  },
458
451
  appendChild: function (node) {
459
- var distributed;
460
- this._removeNodeFromHost(node);
452
+ var handled;
453
+ this._removeNodeFromHost(node, true);
461
454
  if (this._nodeIsInLogicalTree(this.node)) {
462
- var host = this._hostForNode(this.node);
463
- this._addLogicalInfo(node, this.node, host && host.shadyRoot);
455
+ this._addLogicalInfo(node, this.node);
464
456
  this._addNodeToHost(node);
465
- if (host) {
466
- distributed = this._maybeDistribute(node, this.node, host);
457
+ handled = this._maybeDistribute(node, this.node);
467
458
  }
468
- }
469
- if (!distributed && !this._tryRemoveUndistributedNode(node)) {
459
+ if (!handled && !this._tryRemoveUndistributedNode(node)) {
470
460
  var container = this.node._isShadyRoot ? this.node.host : this.node;
471
- nativeAppendChild.call(container, node);
472
461
  addToComposedParent(container, node);
462
+ nativeAppendChild.call(container, node);
473
463
  }
474
464
  return node;
475
465
  },
@@ -477,8 +467,8 @@ insertBefore: function (node, ref_node) {
477
467
  if (!ref_node) {
478
468
  return this.appendChild(node);
479
469
  }
480
- var distributed;
481
- this._removeNodeFromHost(node);
470
+ var handled;
471
+ this._removeNodeFromHost(node, true);
482
472
  if (this._nodeIsInLogicalTree(this.node)) {
483
473
  saveLightChildrenIfNeeded(this.node);
484
474
  var children = this.childNodes;
@@ -486,18 +476,15 @@ var index = children.indexOf(ref_node);
486
476
  if (index < 0) {
487
477
  throw Error('The ref_node to be inserted before is not a child ' + 'of this node');
488
478
  }
489
- var host = this._hostForNode(this.node);
490
- this._addLogicalInfo(node, this.node, host && host.shadyRoot, index);
479
+ this._addLogicalInfo(node, this.node, index);
491
480
  this._addNodeToHost(node);
492
- if (host) {
493
- distributed = this._maybeDistribute(node, this.node, host);
494
- }
481
+ handled = this._maybeDistribute(node, this.node);
495
482
  }
496
- if (!distributed && !this._tryRemoveUndistributedNode(node)) {
483
+ if (!handled && !this._tryRemoveUndistributedNode(node)) {
497
484
  ref_node = ref_node.localName === CONTENT ? this._firstComposedNode(ref_node) : ref_node;
498
485
  var container = this.node._isShadyRoot ? this.node.host : this.node;
499
- nativeInsertBefore.call(container, node, ref_node);
500
486
  addToComposedParent(container, node, ref_node);
487
+ nativeInsertBefore.call(container, node, ref_node);
501
488
  }
502
489
  return node;
503
490
  },
@@ -505,17 +492,16 @@ removeChild: function (node) {
505
492
  if (factory(node).parentNode !== this.node) {
506
493
  console.warn('The node to be removed is not a child of this node', node);
507
494
  }
508
- var distributed;
495
+ var handled;
509
496
  if (this._nodeIsInLogicalTree(this.node)) {
510
- var host = this._hostForNode(this.node);
511
- distributed = this._maybeDistribute(node, this.node, host);
512
497
  this._removeNodeFromHost(node);
498
+ handled = this._maybeDistribute(node, this.node);
513
499
  }
514
- if (!distributed) {
500
+ if (!handled) {
515
501
  var container = this.node._isShadyRoot ? this.node.host : this.node;
516
502
  if (container === node.parentNode) {
517
- nativeRemoveChild.call(container, node);
518
503
  removeFromComposedParent(container, node);
504
+ nativeRemoveChild.call(container, node);
519
505
  }
520
506
  }
521
507
  return node;
@@ -548,16 +534,23 @@ node._ownerShadyRoot = root;
548
534
  }
549
535
  return node._ownerShadyRoot;
550
536
  },
551
- _maybeDistribute: function (node, parent, host) {
552
- var nodeNeedsDistribute = this._nodeNeedsDistribution(node);
553
- var distribute = this._parentNeedsDistribution(parent) || nodeNeedsDistribute;
554
- if (nodeNeedsDistribute) {
537
+ _maybeDistribute: function (node, parent) {
538
+ var fragContent = node.nodeType === Node.DOCUMENT_FRAGMENT_NODE && node.querySelector(CONTENT);
539
+ var wrappedContent = fragContent && fragContent.parentNode.nodeType !== Node.DOCUMENT_FRAGMENT_NODE;
540
+ var hasContent = fragContent || node.localName === CONTENT;
541
+ if (hasContent) {
542
+ var root = this._ownerShadyRootForNode(parent);
543
+ if (root) {
544
+ var host = root.host;
555
545
  this._updateInsertionPoints(host);
556
- }
557
- if (distribute) {
558
546
  this._lazyDistribute(host);
559
547
  }
560
- return distribute;
548
+ }
549
+ var parentNeedsDist = this._parentNeedsDistribution(parent);
550
+ if (parentNeedsDist) {
551
+ this._lazyDistribute(parent);
552
+ }
553
+ return parentNeedsDist || hasContent && !wrappedContent;
561
554
  },
562
555
  _tryRemoveUndistributedNode: function (node) {
563
556
  if (this.node.shadyRoot) {
@@ -573,25 +566,56 @@ host.shadyRoot._insertionPoints = factory(host.shadyRoot).querySelectorAll(CONTE
573
566
  _nodeIsInLogicalTree: function (node) {
574
567
  return Boolean(node._lightParent || node._isShadyRoot || this._ownerShadyRootForNode(node) || node.shadyRoot);
575
568
  },
576
- _hostForNode: function (node) {
577
- var root = node.shadyRoot || (node._isShadyRoot ? node : this._ownerShadyRootForNode(node));
578
- return root && root.host;
579
- },
580
569
  _parentNeedsDistribution: function (parent) {
581
570
  return parent && parent.shadyRoot && hasInsertionPoint(parent.shadyRoot);
582
571
  },
583
- _nodeNeedsDistribution: function (node) {
584
- return node.localName === CONTENT || node.nodeType === Node.DOCUMENT_FRAGMENT_NODE && node.querySelector(CONTENT);
585
- },
586
- _removeNodeFromHost: function (node) {
587
- if (node._lightParent) {
588
- var root = this._ownerShadyRootForNode(node);
572
+ _removeNodeFromHost: function (node, ensureComposedRemoval) {
573
+ var hostNeedsDist;
574
+ var root;
575
+ var parent = node._lightParent;
576
+ if (parent) {
577
+ root = this._ownerShadyRootForNode(node);
589
578
  if (root) {
590
579
  root.host._elementRemove(node);
580
+ hostNeedsDist = this._removeDistributedChildren(root, node);
591
581
  }
592
582
  this._removeLogicalInfo(node, node._lightParent);
593
583
  }
594
584
  this._removeOwnerShadyRoot(node);
585
+ if (root && hostNeedsDist) {
586
+ this._updateInsertionPoints(root.host);
587
+ this._lazyDistribute(root.host);
588
+ } else if (ensureComposedRemoval) {
589
+ removeFromComposedParent(parent || node.parentNode, node);
590
+ }
591
+ },
592
+ _removeDistributedChildren: function (root, container) {
593
+ var hostNeedsDist;
594
+ var ip$ = root._insertionPoints;
595
+ for (var i = 0; i < ip$.length; i++) {
596
+ var content = ip$[i];
597
+ if (this._contains(container, content)) {
598
+ var dc$ = factory(content).getDistributedNodes();
599
+ for (var j = 0; j < dc$.length; j++) {
600
+ hostNeedsDist = true;
601
+ var node = dc$[i];
602
+ var parent = node.parentNode;
603
+ if (parent) {
604
+ removeFromComposedParent(parent, node);
605
+ nativeRemoveChild.call(parent, node);
606
+ }
607
+ }
608
+ }
609
+ }
610
+ return hostNeedsDist;
611
+ },
612
+ _contains: function (container, node) {
613
+ while (node) {
614
+ if (node == container) {
615
+ return true;
616
+ }
617
+ node = factory(node).parentNode;
618
+ }
595
619
  },
596
620
  _addNodeToHost: function (node) {
597
621
  var checkNode = node.nodeType === Node.DOCUMENT_FRAGMENT_NODE ? node.firstChild : node;
@@ -600,7 +624,7 @@ if (root) {
600
624
  root.host._elementAdd(node);
601
625
  }
602
626
  },
603
- _addLogicalInfo: function (node, container, root, index) {
627
+ _addLogicalInfo: function (node, container, index) {
604
628
  saveLightChildrenIfNeeded(container);
605
629
  var children = factory(container).childNodes;
606
630
  index = index === undefined ? children.length : index;
@@ -975,20 +999,17 @@ var children = getComposedChildren(parent);
975
999
  var i = ref_node ? children.indexOf(ref_node) : -1;
976
1000
  if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {
977
1001
  var fragChildren = getComposedChildren(node);
978
- fragChildren.forEach(function (c) {
979
- addNodeToComposedChildren(c, parent, children, i);
980
- });
1002
+ for (var j = 0; j < fragChildren.length; j++) {
1003
+ addNodeToComposedChildren(fragChildren[j], parent, children, i + j);
1004
+ }
1005
+ node._composedChildren = null;
981
1006
  } else {
982
1007
  addNodeToComposedChildren(node, parent, children, i);
983
1008
  }
984
1009
  }
985
1010
  function addNodeToComposedChildren(node, parent, children, i) {
986
1011
  node._composedParent = parent;
987
- if (i >= 0) {
988
- children.splice(i, 0, node);
989
- } else {
990
- children.push(node);
991
- }
1012
+ children.splice(i >= 0 ? i : children.length, 0, node);
992
1013
  }
993
1014
  function removeFromComposedParent(parent, node) {
994
1015
  node._composedParent = null;
@@ -1059,10 +1080,14 @@ get domHost() {
1059
1080
  var root = Polymer.dom(this).getOwnerRoot();
1060
1081
  return root && root.host;
1061
1082
  },
1062
- distributeContent: function () {
1083
+ distributeContent: function (updateInsertionPoints) {
1063
1084
  if (this.shadyRoot) {
1085
+ var dom = Polymer.dom(this);
1086
+ if (updateInsertionPoints) {
1087
+ dom._updateInsertionPoints(this);
1088
+ }
1064
1089
  var host = getTopDistributingHost(this);
1065
- Polymer.dom(this)._lazyDistribute(host);
1090
+ dom._lazyDistribute(host);
1066
1091
  }
1067
1092
  },
1068
1093
  _distributeContent: function () {
@@ -1092,6 +1117,7 @@ this._composeTree();
1092
1117
  } else {
1093
1118
  if (!this.shadyRoot._hasDistributed) {
1094
1119
  this.textContent = '';
1120
+ this._composedChildren = null;
1095
1121
  this.appendChild(this.shadyRoot);
1096
1122
  } else {
1097
1123
  var children = this._composeNode(this);
@@ -1251,6 +1277,7 @@ points.push(insertionPoint);
1251
1277
  }
1252
1278
  function clearDistributedDestinationInsertionPoints(content) {
1253
1279
  var e$ = content._distributedNodes;
1280
+ if (e$) {
1254
1281
  for (var i = 0; i < e$.length; i++) {
1255
1282
  var d = e$[i]._destinationInsertionPoints;
1256
1283
  if (d) {
@@ -1258,6 +1285,7 @@ d.splice(d.indexOf(content) + 1, d.length);
1258
1285
  }
1259
1286
  }
1260
1287
  }
1288
+ }
1261
1289
  function maybeRedistributeParent(content, host) {
1262
1290
  var parent = content._lightParent;
1263
1291
  if (parent && parent.shadyRoot && hasInsertionPoint(parent.shadyRoot) && parent.shadyRoot._distributionClean) {
@@ -181,6 +181,9 @@ at.value = a === 'style' ? resolveCss(v, ownerDocument) : resolve(v, ownerDocume
181
181
  }
182
182
  }
183
183
  function resolve(url, ownerDocument) {
184
+ if (url && url[0] === '#') {
185
+ return url;
186
+ }
184
187
  var resolver = getUrlResolver(ownerDocument);
185
188
  resolver.href = url;
186
189
  return resolver.href || url;
@@ -341,18 +344,57 @@ this.listen(node, name, listeners[key]);
341
344
  listen: function (node, eventName, methodName) {
342
345
  this._listen(node, eventName, this._createEventHandler(node, eventName, methodName));
343
346
  },
347
+ _boundListenerKey: function (eventName, methodName) {
348
+ return eventName + ':' + methodName;
349
+ },
350
+ _recordEventHandler: function (host, eventName, target, methodName, handler) {
351
+ var hbl = host.__boundListeners;
352
+ if (!hbl) {
353
+ hbl = host.__boundListeners = new WeakMap();
354
+ }
355
+ var bl = hbl.get(target);
356
+ if (!bl) {
357
+ bl = {};
358
+ hbl.set(target, bl);
359
+ }
360
+ var key = this._boundListenerKey(eventName, methodName);
361
+ bl[key] = handler;
362
+ },
363
+ _recallEventHandler: function (host, eventName, target, methodName) {
364
+ var hbl = host.__boundListeners;
365
+ if (!hbl) {
366
+ return;
367
+ }
368
+ var bl = hbl.get(target);
369
+ if (!bl) {
370
+ return;
371
+ }
372
+ var key = this._boundListenerKey(eventName, methodName);
373
+ return bl[key];
374
+ },
344
375
  _createEventHandler: function (node, eventName, methodName) {
345
376
  var host = this;
346
- return function (e) {
377
+ var handler = function (e) {
347
378
  if (host[methodName]) {
348
379
  host[methodName](e, e.detail);
349
380
  } else {
350
381
  host._warn(host._logf('_createEventHandler', 'listener method `' + methodName + '` not defined'));
351
382
  }
352
383
  };
384
+ this._recordEventHandler(host, eventName, node, methodName, handler);
385
+ return handler;
386
+ },
387
+ unlisten: function (node, eventName, methodName) {
388
+ var handler = this._recallEventHandler(this, eventName, node, methodName);
389
+ if (handler) {
390
+ this._unlisten(node, eventName, handler);
391
+ }
353
392
  },
354
393
  _listen: function (node, eventName, handler) {
355
394
  node.addEventListener(eventName, handler);
395
+ },
396
+ _unlisten: function (node, eventName, handler) {
397
+ node.removeEventListener(eventName, handler);
356
398
  }
357
399
  });
358
400
  (function () {
@@ -406,7 +448,6 @@ POINTERSTATE.mouse.mouseIgnoreJob = null;
406
448
  POINTERSTATE.mouse.mouseIgnoreJob = Polymer.Debounce(POINTERSTATE.mouse.mouseIgnoreJob, unset, MOUSE_TIMEOUT);
407
449
  }
408
450
  var POINTERSTATE = {
409
- tapPrevented: false,
410
451
  mouse: {
411
452
  target: null,
412
453
  mouseIgnoreJob: null
@@ -540,12 +581,43 @@ if (recognizer.touchAction) {
540
581
  this.setTouchAction(node, recognizer.touchAction);
541
582
  }
542
583
  },
584
+ remove: function (node, evType, handler) {
585
+ var recognizer = this.gestures[evType];
586
+ var deps = recognizer.deps;
587
+ var name = recognizer.name;
588
+ var gobj = node[GESTURE_KEY];
589
+ if (gobj) {
590
+ for (var i = 0, dep, gd; i < deps.length; i++) {
591
+ dep = deps[i];
592
+ gd = gobj[dep];
593
+ if (gd && gd[name]) {
594
+ gd[name] = (gd[name] || 1) - 1;
595
+ if (gd[name] === 0) {
596
+ node.removeEventListener(dep, this.handleNative);
597
+ }
598
+ }
599
+ }
600
+ }
601
+ node.removeEventListener(evType, handler);
602
+ },
543
603
  register: function (recog) {
544
604
  this.recognizers.push(recog);
545
605
  for (var i = 0; i < recog.emits.length; i++) {
546
606
  this.gestures[recog.emits[i]] = recog;
547
607
  }
548
608
  },
609
+ findRecognizerByEvent: function (evName) {
610
+ for (var i = 0, r; i < this.recognizers.length; i++) {
611
+ r = this.recognizers[i];
612
+ for (var j = 0, n; j < r.emits.length; j++) {
613
+ n = r.emits[j];
614
+ if (n === evName) {
615
+ return r;
616
+ }
617
+ }
618
+ }
619
+ return null;
620
+ },
549
621
  setTouchAction: function (node, value) {
550
622
  if (HAS_NATIVE_TA) {
551
623
  node.style.touchAction = value;
@@ -553,12 +625,23 @@ node.style.touchAction = value;
553
625
  node[TOUCH_ACTION] = value;
554
626
  },
555
627
  fire: function (target, type, detail) {
556
- var ev = new CustomEvent(type, {
557
- detail: detail,
628
+ var ev = Polymer.Base.fire(type, detail, {
629
+ node: target,
558
630
  bubbles: true,
559
631
  cancelable: true
560
632
  });
561
- target.dispatchEvent(ev);
633
+ if (ev.defaultPrevented) {
634
+ var se = detail.sourceEvent;
635
+ if (se && se.preventDefault) {
636
+ se.preventDefault();
637
+ }
638
+ }
639
+ },
640
+ prevent: function (evName) {
641
+ var recognizer = this.findRecognizerByEvent(evName);
642
+ if (recognizer.info) {
643
+ recognizer.info.prevent = true;
644
+ }
562
645
  }
563
646
  };
564
647
  Gestures.register({
@@ -589,10 +672,12 @@ touchend: function (e) {
589
672
  this.fire('up', e.currentTarget, e.changedTouches[0]);
590
673
  },
591
674
  fire: function (type, target, event) {
675
+ var self = this;
592
676
  Gestures.fire(target, type, {
593
677
  x: event.clientX,
594
678
  y: event.clientY,
595
- sourceEvent: event
679
+ sourceEvent: event,
680
+ prevent: Gestures.prevent.bind(Gestures)
596
681
  });
597
682
  }
598
683
  });
@@ -617,7 +702,8 @@ if (this.moves.length > TRACK_LENGTH) {
617
702
  this.moves.shift();
618
703
  }
619
704
  this.moves.push(move);
620
- }
705
+ },
706
+ prevent: false
621
707
  },
622
708
  clearInfo: function () {
623
709
  this.info.state = 'start';
@@ -625,8 +711,12 @@ this.info.started = false;
625
711
  this.info.moves = [];
626
712
  this.info.x = 0;
627
713
  this.info.y = 0;
714
+ this.info.prevent = false;
628
715
  },
629
716
  hasMovedEnough: function (x, y) {
717
+ if (this.info.prevent) {
718
+ return false;
719
+ }
630
720
  if (this.info.started) {
631
721
  return true;
632
722
  }
@@ -646,13 +736,12 @@ x: x,
646
736
  y: y
647
737
  });
648
738
  self.fire(t, e);
649
- e.preventDefault();
650
739
  self.info.started = true;
651
740
  }
652
741
  };
653
742
  var upfn = function upfn(e) {
654
743
  if (self.info.started) {
655
- POINTERSTATE.tapPrevented = true;
744
+ Gestures.prevent('tap');
656
745
  movefn(e);
657
746
  }
658
747
  self.clearInfo();
@@ -687,7 +776,7 @@ touchend: function (e) {
687
776
  var t = e.currentTarget;
688
777
  var ct = e.changedTouches[0];
689
778
  if (this.info.started) {
690
- POINTERSTATE.tapPrevented = true;
779
+ Gestures.prevent('tap');
691
780
  this.info.state = 'end';
692
781
  this.info.addMove({
693
782
  x: ct.clientX,
@@ -731,37 +820,37 @@ deps: [
731
820
  'touchend'
732
821
  ],
733
822
  emits: ['tap'],
734
- start: {
823
+ info: {
735
824
  x: NaN,
736
- y: NaN
825
+ y: NaN,
826
+ prevent: false
737
827
  },
738
828
  reset: function () {
739
- this.start.x = NaN;
740
- this.start.y = NaN;
829
+ this.info.x = NaN;
830
+ this.info.y = NaN;
831
+ this.info.prevent = false;
741
832
  },
742
833
  save: function (e) {
743
- this.start.x = e.clientX;
744
- this.start.y = e.clientY;
834
+ this.info.x = e.clientX;
835
+ this.info.y = e.clientY;
745
836
  },
746
837
  mousedown: function (e) {
747
- POINTERSTATE.tapPrevented = false;
748
838
  this.save(e);
749
839
  },
750
840
  click: function (e) {
751
841
  this.forward(e);
752
842
  },
753
843
  touchstart: function (e) {
754
- POINTERSTATE.tapPrevented = false;
755
844
  this.save(e.changedTouches[0]);
756
845
  },
757
846
  touchend: function (e) {
758
847
  this.forward(e.changedTouches[0]);
759
848
  },
760
849
  forward: function (e) {
761
- var dx = Math.abs(e.clientX - this.start.x);
762
- var dy = Math.abs(e.clientY - this.start.y);
850
+ var dx = Math.abs(e.clientX - this.info.x);
851
+ var dy = Math.abs(e.clientY - this.info.y);
763
852
  if (isNaN(dx) || isNaN(dy) || dx <= TAP_DISTANCE && dy <= TAP_DISTANCE) {
764
- if (!POINTERSTATE.tapPrevented) {
853
+ if (!this.info.prevent) {
765
854
  Gestures.fire(e.target, 'tap', {
766
855
  x: e.clientX,
767
856
  y: e.clientY,
@@ -786,6 +875,13 @@ Gestures.add(node, eventName, handler);
786
875
  node.addEventListener(eventName, handler);
787
876
  }
788
877
  },
878
+ _unlisten: function (node, eventName, handler) {
879
+ if (Gestures.gestures[eventName]) {
880
+ Gestures.remove(node, eventName, handler);
881
+ } else {
882
+ node.removeEventListener(eventName, handler);
883
+ }
884
+ },
789
885
  setScrollDirection: function (direction, node) {
790
886
  node = node || this;
791
887
  Gestures.setTouchAction(node, DIRECTION_MAP[direction] || 'auto');
@@ -931,9 +1027,10 @@ options = options || Polymer.nob;
931
1027
  var node = options.node || this;
932
1028
  var detail = detail === null || detail === undefined ? Polymer.nob : detail;
933
1029
  var bubbles = options.bubbles === undefined ? true : options.bubbles;
1030
+ var cancelable = Boolean(options.cancelable);
934
1031
  var event = new CustomEvent(type, {
935
1032
  bubbles: Boolean(bubbles),
936
- cancelable: Boolean(options.cancelable),
1033
+ cancelable: cancelable,
937
1034
  detail: detail
938
1035
  });
939
1036
  node.dispatchEvent(event);
@@ -1013,7 +1110,7 @@ this.fire(eventName, { value: this[property] }, { bubbles: false });
1013
1110
  },
1014
1111
  _propertySet: function (property, value, effects) {
1015
1112
  var old = this.__data__[property];
1016
- if (old !== value) {
1113
+ if (old !== value && (old === old || value === value)) {
1017
1114
  this.__data__[property] = value;
1018
1115
  if (typeof value == 'object') {
1019
1116
  this._clearPath(property);
@@ -1546,7 +1643,7 @@ h[0].call(this, h[1], h[2]);
1546
1643
  Polymer.Base._addFeature({
1547
1644
  notifyPath: function (path, value, fromAbove) {
1548
1645
  var old = this._propertySet(path, value);
1549
- if (old !== value) {
1646
+ if (old !== value && (old === old || value === value)) {
1550
1647
  this._pathEffector(path, value);
1551
1648
  if (!fromAbove) {
1552
1649
  this._notifyPath(path, value);
@@ -1707,7 +1804,7 @@ object: array,
1707
1804
  type: 'splice'
1708
1805
  }];
1709
1806
  var change = {
1710
- keySplices: Polymer.Collection.get(array).applySplices(splices),
1807
+ keySplices: Polymer.Collection.applySplices(array, splices),
1711
1808
  indexSplices: splices
1712
1809
  };
1713
1810
  this.set(path + '.splices', change);
@@ -1884,7 +1981,7 @@ var VAR_START = '--';
1884
1981
  var MEDIA_START = '@media';
1885
1982
  var AT_START = '@';
1886
1983
  var rx = {
1887
- comments: /\/\*[^*]*\*+([^\/*][^*]*\*+)*\//gim,
1984
+ comments: /\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,
1888
1985
  port: /@import[^;]*;/gim,
1889
1986
  customProp: /(?:^|[\s;])--[^;{]*?:[^{};]*?;/gim,
1890
1987
  mixinProp: /(?:^|[\s;])--[^;{]*?:[^{;]*?{[^}]*?};?/gim,
@@ -1912,7 +2009,7 @@ this.forEachStyleRule(this.rulesForStyle(s), callback);
1912
2009
  }
1913
2010
  },
1914
2011
  rulesForStyle: function (style) {
1915
- if (!style.__cssRules) {
2012
+ if (!style.__cssRules && style.textContent) {
1916
2013
  style.__cssRules = this.parser.parse(style.textContent);
1917
2014
  }
1918
2015
  return style.__cssRules;
@@ -2074,6 +2171,8 @@ stop = true;
2074
2171
  }
2075
2172
  c = o.combinator;
2076
2173
  s = o.value;
2174
+ } else {
2175
+ s = s.replace(SCOPE_JUMP, ' ');
2077
2176
  }
2078
2177
  return c + s;
2079
2178
  });
@@ -2108,19 +2207,29 @@ var p$ = selector.split(PSEUDO_PREFIX);
2108
2207
  p$[0] += scope;
2109
2208
  return p$.join(PSEUDO_PREFIX);
2110
2209
  },
2111
- rootRule: function (rule) {
2112
- this._transformRule(rule, this._transformRootSelector);
2210
+ documentRule: function (rule) {
2211
+ rule.selector = rule.parsedSelector;
2212
+ this.normalizeRootSelector(rule);
2213
+ if (!nativeShadow) {
2214
+ this._transformRule(rule, this._transformDocumentSelector);
2215
+ }
2216
+ },
2217
+ normalizeRootSelector: function (rule) {
2218
+ if (rule.selector === ROOT) {
2219
+ rule.selector = 'body';
2220
+ }
2113
2221
  },
2114
- _transformRootSelector: function (selector) {
2115
- return selector.match(SCOPE_JUMP) ? this._transformComplexSelector(selector) : selector.trim() + SCOPE_ROOT_SELECTOR;
2222
+ _transformDocumentSelector: function (selector) {
2223
+ return selector.match(SCOPE_JUMP) ? this._transformComplexSelector(selector, SCOPE_DOC_SELECTOR) : this._transformSimpleSelector(selector.trim(), SCOPE_DOC_SELECTOR);
2116
2224
  },
2117
2225
  SCOPE_NAME: 'style-scope'
2118
2226
  };
2119
2227
  var SCOPE_NAME = api.SCOPE_NAME;
2120
- var SCOPE_ROOT_SELECTOR = ':not([' + SCOPE_NAME + '])' + ':not(.' + SCOPE_NAME + ')';
2228
+ var SCOPE_DOC_SELECTOR = ':not([' + SCOPE_NAME + '])' + ':not(.' + SCOPE_NAME + ')';
2121
2229
  var COMPLEX_SELECTOR_SEP = ',';
2122
2230
  var SIMPLE_SELECTOR_SEP = /(^|[\s>+~]+)([^\s>+~]+)/g;
2123
2231
  var HOST = ':host';
2232
+ var ROOT = ':root';
2124
2233
  var HOST_PAREN = /(\:host)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/g;
2125
2234
  var CONTENT = '::content';
2126
2235
  var SCOPE_JUMP = /\:\:content|\:\:shadow|\/deep\//;
@@ -2296,6 +2405,7 @@ return mo;
2296
2405
  });
2297
2406
  }());
2298
2407
  Polymer.StyleProperties = function () {
2408
+ 'use strict';
2299
2409
  var nativeShadow = Polymer.Settings.useNativeShadow;
2300
2410
  var matchesSelector = Polymer.DomApi.matchesSelector;
2301
2411
  var styleUtil = Polymer.StyleUtil;
@@ -2362,6 +2472,10 @@ collectPropertiesInCssText: function (cssText, props) {
2362
2472
  var m;
2363
2473
  while (m = this.rx.VAR_CAPTURE.exec(cssText)) {
2364
2474
  props[m[1]] = true;
2475
+ var def = m[2];
2476
+ if (def && def.match(this.rx.IS_VAR)) {
2477
+ props[def] = true;
2478
+ }
2365
2479
  }
2366
2480
  },
2367
2481
  reify: function (props) {
@@ -2461,27 +2575,29 @@ return props;
2461
2575
  },
2462
2576
  transformStyles: function (element, properties, scopeSelector) {
2463
2577
  var self = this;
2464
- var hostRx = new RegExp(this.rx.HOST_PREFIX + element.is + this.rx.HOST_SUFFIX);
2578
+ var hostSelector = styleTransformer._calcHostScope(element.is, element.extends);
2579
+ var rxHostSelector = element.extends ? '\\' + hostSelector.slice(0, -1) + '\\]' : hostSelector;
2580
+ var hostRx = new RegExp(this.rx.HOST_PREFIX + rxHostSelector + this.rx.HOST_SUFFIX);
2465
2581
  return styleTransformer.elementStyles(element, function (rule) {
2466
2582
  self.applyProperties(rule, properties);
2467
2583
  if (rule.cssText && !nativeShadow) {
2468
- self._scopeSelector(rule, hostRx, element.is, element._scopeCssViaAttr, scopeSelector);
2584
+ self._scopeSelector(rule, hostRx, hostSelector, element._scopeCssViaAttr, scopeSelector);
2469
2585
  }
2470
2586
  });
2471
2587
  },
2472
- _scopeSelector: function (rule, hostRx, is, viaAttr, scopeId) {
2588
+ _scopeSelector: function (rule, hostRx, hostSelector, viaAttr, scopeId) {
2473
2589
  rule.transformedSelector = rule.transformedSelector || rule.selector;
2474
2590
  var selector = rule.transformedSelector;
2475
2591
  var scope = viaAttr ? '[' + styleTransformer.SCOPE_NAME + '~=' + scopeId + ']' : '.' + scopeId;
2476
2592
  var parts = selector.split(',');
2477
2593
  for (var i = 0, l = parts.length, p; i < l && (p = parts[i]); i++) {
2478
- parts[i] = p.match(hostRx) ? p.replace(is, is + scope) : scope + ' ' + p;
2594
+ parts[i] = p.match(hostRx) ? p.replace(hostSelector, hostSelector + scope) : scope + ' ' + p;
2479
2595
  }
2480
2596
  rule.selector = parts.join(',');
2481
2597
  },
2482
2598
  applyElementScopeSelector: function (element, selector, old, viaAttr) {
2483
2599
  var c = viaAttr ? element.getAttribute(styleTransformer.SCOPE_NAME) : element.className;
2484
- v = old ? c.replace(old, selector) : (c ? c + ' ' : '') + this.XSCOPE_NAME + ' ' + selector;
2600
+ var v = old ? c.replace(old, selector) : (c ? c + ' ' : '') + this.XSCOPE_NAME + ' ' + selector;
2485
2601
  if (c !== v) {
2486
2602
  if (viaAttr) {
2487
2603
  element.setAttribute(styleTransformer.SCOPE_NAME, v);
@@ -2521,6 +2637,7 @@ VAR_ASSIGN: /(?:^|;\s*)(--[^\:;]*?):\s*?(?:([^;{]*?)|{([^}]*)})(?=;)/gim,
2521
2637
  MIXIN_MATCH: /(?:^|\W+)@apply[\s]*\(([^)]*)\);?/im,
2522
2638
  VAR_MATCH: /(^|\W+)var\([\s]*([^,)]*)[\s]*,?[\s]*((?:[^,)]*)|(?:[^;]*\([^;)]*\)))[\s]*?\)/gim,
2523
2639
  VAR_CAPTURE: /\([\s]*(--[^,\s)]*)(?:,[\s]*(--[^,\s)]*))?(?:\)|,)/gim,
2640
+ IS_VAR: /^--/,
2524
2641
  BRACKETED: /\{[^}]*\}/g,
2525
2642
  HOST_PREFIX: '(?:^|[^.])',
2526
2643
  HOST_SUFFIX: '($|[.:[\\s>+~])'
@@ -2538,14 +2655,11 @@ bits[o] = (bits[o] || 0) | v;
2538
2655
  Polymer.StyleDefaults = function () {
2539
2656
  var styleProperties = Polymer.StyleProperties;
2540
2657
  var styleUtil = Polymer.StyleUtil;
2541
- var style = document.createElement('style');
2542
2658
  var api = {
2543
- style: style,
2544
- _styles: [style],
2659
+ _styles: [],
2545
2660
  _properties: null,
2546
- applyCss: function (cssText) {
2547
- this.style.textContent += cssText;
2548
- styleUtil.clearStyleRules(this.style);
2661
+ addStyle: function (style) {
2662
+ this._styles.push(style);
2549
2663
  this._properties = null;
2550
2664
  },
2551
2665
  get _styleProperties() {
@@ -2553,6 +2667,7 @@ if (!this._properties) {
2553
2667
  styleProperties.decorateStyles(this._styles);
2554
2668
  this._styles._scopeStyleProperties = null;
2555
2669
  this._properties = styleProperties.scopePropertiesFromStyles(this._styles);
2670
+ styleProperties.reify(this._properties);
2556
2671
  }
2557
2672
  return this._properties;
2558
2673
  },
@@ -2560,6 +2675,14 @@ _needsStyleProperties: function () {
2560
2675
  },
2561
2676
  _computeStyleProperties: function () {
2562
2677
  return this._styleProperties;
2678
+ },
2679
+ updateStyles: function () {
2680
+ this._styleCache.clear();
2681
+ for (var i = 0, s; i < this._styles.length; i++) {
2682
+ s = this._styles[i];
2683
+ s = s.__importElement || s;
2684
+ s._apply();
2685
+ }
2563
2686
  }
2564
2687
  };
2565
2688
  return api;
@@ -2607,6 +2730,7 @@ return true;
2607
2730
  };
2608
2731
  }());
2609
2732
  (function () {
2733
+ 'use strict';
2610
2734
  var serializeValueToAttribute = Polymer.Base.serializeValueToAttribute;
2611
2735
  var propertyUtils = Polymer.StyleProperties;
2612
2736
  var styleTransformer = Polymer.StyleTransformer;
@@ -2646,7 +2770,7 @@ if (!scopeCached) {
2646
2770
  info = styleCache.retrieve(this.is, this._ownStyleProperties, this._styles);
2647
2771
  }
2648
2772
  var globalCached = Boolean(info) && !scopeCached;
2649
- style = this._applyStyleProperties(info);
2773
+ var style = this._applyStyleProperties(info);
2650
2774
  if (!scopeCached) {
2651
2775
  var cacheableStyle = style;
2652
2776
  if (nativeShadow) {
@@ -2689,7 +2813,7 @@ _scopeCount: 0,
2689
2813
  _applyStyleProperties: function (info) {
2690
2814
  var oldScopeSelector = this._scopeSelector;
2691
2815
  this._scopeSelector = info ? info._scopeSelector : this.is + '-' + this.__proto__._scopeCount++;
2692
- style = propertyUtils.applyElementStyle(this, this._styleProperties, this._scopeSelector, info && info.style);
2816
+ var style = propertyUtils.applyElementStyle(this, this._styleProperties, this._scopeSelector, info && info.style);
2693
2817
  if ((style || oldScopeSelector) && !nativeShadow) {
2694
2818
  propertyUtils.applyElementScopeSelector(this, this._scopeSelector, oldScopeSelector, this._scopeCssViaAttr);
2695
2819
  }
@@ -2738,7 +2862,7 @@ c.updateStyles();
2738
2862
  }
2739
2863
  });
2740
2864
  Polymer.updateStyles = function () {
2741
- styleDefaults._styleCache.clear();
2865
+ styleDefaults.updateStyles();
2742
2866
  Polymer.Base._updateRootStyles(document);
2743
2867
  };
2744
2868
  var styleCache = new Polymer.StyleCache();
@@ -2790,48 +2914,47 @@ var nativeShadow = Polymer.Settings.useNativeShadow;
2790
2914
  var propertyUtils = Polymer.StyleProperties;
2791
2915
  var styleUtil = Polymer.StyleUtil;
2792
2916
  var styleDefaults = Polymer.StyleDefaults;
2917
+ var styleTransformer = Polymer.StyleTransformer;
2793
2918
  Polymer({
2794
2919
  is: 'custom-style',
2795
2920
  extends: 'style',
2796
2921
  created: function () {
2797
- this._appliesToDocument = this.parentNode.localName !== 'dom-module';
2798
- if (this._appliesToDocument) {
2922
+ this._tryApply();
2923
+ },
2924
+ attached: function () {
2925
+ this._tryApply();
2926
+ },
2927
+ _tryApply: function () {
2928
+ if (!this._appliesToDocument) {
2929
+ if (this.parentNode && this.parentNode.localName !== 'dom-module') {
2930
+ this._appliesToDocument = true;
2799
2931
  var e = this.__appliedElement || this;
2800
- var rules = styleUtil.rulesForStyle(e);
2801
- propertyUtils.decorateStyles([e]);
2802
- this._rulesToDefaultProperties(rules);
2803
- this.async(this._applyStyle);
2932
+ styleDefaults.addStyle(e);
2933
+ if (e.textContent) {
2934
+ this._apply();
2935
+ } else {
2936
+ var observer = new MutationObserver(function () {
2937
+ observer.disconnect();
2938
+ this._apply();
2939
+ }.bind(this));
2940
+ observer.observe(e, { childList: true });
2941
+ }
2942
+ }
2804
2943
  }
2805
2944
  },
2806
- _applyStyle: function () {
2945
+ _apply: function () {
2807
2946
  var e = this.__appliedElement || this;
2808
2947
  this._computeStyleProperties();
2809
2948
  var props = this._styleProperties;
2810
2949
  var self = this;
2811
2950
  e.textContent = styleUtil.toCssText(styleUtil.rulesForStyle(e), function (rule) {
2812
- if (rule.selector === ':root') {
2813
- rule.selector = 'body';
2814
- }
2815
2951
  var css = rule.cssText = rule.parsedCssText;
2816
2952
  if (rule.propertyInfo && rule.propertyInfo.cssText) {
2817
2953
  css = css.replace(propertyUtils.rx.VAR_ASSIGN, '');
2818
2954
  rule.cssText = propertyUtils.valueForProperties(css, props);
2819
2955
  }
2820
- if (!nativeShadow) {
2821
- Polymer.StyleTransformer.rootRule(rule);
2822
- }
2956
+ styleTransformer.documentRule(rule);
2823
2957
  });
2824
- },
2825
- _rulesToDefaultProperties: function (rules) {
2826
- styleUtil.forEachStyleRule(rules, function (rule) {
2827
- if (!rule.propertyInfo.properties) {
2828
- rule.cssText = '';
2829
- }
2830
- });
2831
- var cssText = styleUtil.parser.stringify(rules, true);
2832
- if (cssText) {
2833
- styleDefaults.applyCss(cssText);
2834
- }
2835
2958
  }
2836
2959
  });
2837
2960
  }());
@@ -3109,7 +3232,7 @@ items.push(store[key]);
3109
3232
  }
3110
3233
  return items;
3111
3234
  },
3112
- applySplices: function (splices) {
3235
+ _applySplices: function (splices) {
3113
3236
  var keySplices = [];
3114
3237
  for (var i = 0; i < splices.length; i++) {
3115
3238
  var j, o, key, s = splices[i];
@@ -3138,6 +3261,10 @@ return keySplices;
3138
3261
  Polymer.Collection.get = function (userArray) {
3139
3262
  return Polymer._collections.get(userArray) || new Polymer.Collection(userArray);
3140
3263
  };
3264
+ Polymer.Collection.applySplices = function (userArray, splices) {
3265
+ var coll = Polymer._collections.get(userArray);
3266
+ return coll ? coll._applySplices(splices) : null;
3267
+ };
3141
3268
  Polymer({
3142
3269
  is: 'dom-repeat',
3143
3270
  extends: 'template',
@@ -3567,8 +3694,10 @@ if (this.multi) {
3567
3694
  var scol = Polymer.Collection.get(this.selected);
3568
3695
  var skey = scol.getKey(item);
3569
3696
  if (skey >= 0) {
3697
+ if (this.toggle) {
3570
3698
  this.deselect(item);
3571
- } else if (this.toggle) {
3699
+ }
3700
+ } else {
3572
3701
  this.push('selected', item);
3573
3702
  this.async(function () {
3574
3703
  skey = scol.getKey(item);