Index: third_party/pkg/angular/lib/core_dom/dom_util.dart |
diff --git a/third_party/pkg/angular/lib/core_dom/dom_util.dart b/third_party/pkg/angular/lib/core_dom/dom_util.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..027cd0194d1078ff29c9a09d403af8736cd68b71 |
--- /dev/null |
+++ b/third_party/pkg/angular/lib/core_dom/dom_util.dart |
@@ -0,0 +1,122 @@ |
+library angular.dom.util; |
+ |
+import 'dart:html' as dom; |
+ |
+Iterable<dom.Element> getElements(Iterable<dom.Node> nodes) => |
+ nodes.where((el) => el.nodeType == dom.Node.ELEMENT_NODE); |
+ |
+void domRemove(List<dom.Node> nodes) { |
+ // Not every element is sequential if the list of nodes only |
+ // includes the elements. Removing a view also includes |
+ // removing non-element nodes in-between. |
+ for (var j = 0; j < nodes.length; j++) { |
+ dom.Node current = nodes[j]; |
+ dom.Node next = j + 1 < nodes.length ? nodes[j + 1] : null; |
+ |
+ while (next != null && current.nextNode != next) { |
+ current.nextNode.remove(); |
+ } |
+ nodes[j].remove(); |
+ } |
+} |
+ |
+void domInsert(Iterable<dom.Node> nodes, dom.Node parent, |
+ { dom.Node insertBefore }) { |
+ parent.insertAllBefore(nodes, insertBefore); |
+} |
+ |
+void domMove(Iterable<dom.Node> nodes, dom.Node parent, |
+ { dom.Node insertBefore }) { |
+ nodes.forEach((n) { |
+ if (n.parentNode == null) n.remove(); |
+ parent.insertBefore(n, insertBefore); |
+ }); |
+} |
+ |
+List<dom.Node> allNodesBetween(List<dom.Node> nodes) { |
+ var result = []; |
+ // Not every element is sequential if the list of nodes only |
+ // includes the elements. Removing a view also includes |
+ // removing non-element nodes in-between. |
+ for (var j = 0, jj = nodes.length; j < jj; j++) { |
+ dom.Node current = nodes[j]; |
+ dom.Node next = j + 1 < nodes.length ? nodes[j + 1] : null; |
+ |
+ while (next != null && current.nextNode != next) { |
+ result.add(current.nextNode); |
+ current = current.nextNode; |
+ } |
+ result.add(nodes[j]); |
+ } |
+ return result; |
+} |
+ |
+/** |
+ * Computes and returns the longest css transition or keyframe animation from |
+ * a computed style in milliseconds. |
+ */ |
+num computeLongestTransition(style) { |
+ double longestTransitionSeconds = 0.0; |
+ |
+ if (style.transitionDuration.length > 0) { |
+ // Parse transitions |
+ List<num> durations = _parseDurationList(style.transitionDuration) |
+ .toList(growable: false); |
+ List<num> delays = _parseDurationList(style.transitionDelay) |
+ .toList(growable: false); |
+ |
+ assert(durations.length == delays.length); |
+ |
+ for (int i = 0; i < durations.length; i++) { |
+ var total = _computeTotalDurationSeconds(delays[i], durations[i]); |
+ if (total > longestTransitionSeconds) longestTransitionSeconds = total; |
+ } |
+ } |
+ |
+ if (style.animationDuration.length > 0) { |
+ // Parse and add animation duration properties. |
+ List<num> animationDurations = |
+ _parseDurationList(style.animationDuration).toList(growable: false); |
+ // Note that animation iteration count only affects duration NOT delay. |
+ List<num> animationDelays = |
+ _parseDurationList(style.animationDelay).toList(growable: false); |
+ |
+ List<num> iterationCounts = _parseIterationCounts( |
+ style.animationIterationCount).toList(growable: false); |
+ |
+ assert(animationDurations.length == animationDelays.length); |
+ |
+ for (int i = 0; i < animationDurations.length; i++) { |
+ var total = _computeTotalDurationSeconds( |
+ animationDelays[i], animationDurations[i], |
+ iterations: iterationCounts[i]); |
+ if (total > longestTransitionSeconds) longestTransitionSeconds = total; |
+ } |
+ } |
+ |
+ // transition time in milliseconds. |
+ return longestTransitionSeconds * 1000; |
+} |
+ |
+Iterable<num> _parseIterationCounts(String iterationCounts) => iterationCounts |
+ .split(", ") |
+ .map((x) => x == "infinite" ? -1 : double.parse(x)); |
+ |
+/// This expects a string in the form "0s, 3.234s, 10s" and will return a list |
+/// of doubles of (0, 3.234, 10). |
+Iterable<num> _parseDurationList(String durations) => durations |
+ .split(", ") |
+ .map((x) => _parseCssDuration(x)); |
+ |
+/// This expects a string in the form of '0.234s' or '4s' and will return |
+/// a parsed double. |
+num _parseCssDuration(String cssDuration) => |
+ double.parse(cssDuration.substring(0, cssDuration.length - 1)); |
+ |
+num _computeTotalDurationSeconds(num delay, num duration, |
+ {num iterations: 1}) { |
+ if (iterations == 0) return 0.0; |
+ if (iterations < 0) iterations = 1; // infinite |
+ |
+ return (duration * iterations) + delay; |
+} |