diff --git a/snapshot/angular-1.4.0-build.4009+sha.3545abf.zip b/snapshot/angular-1.4.0-build.4010+sha.213c2a7.zip
similarity index 88%
rename from snapshot/angular-1.4.0-build.4009+sha.3545abf.zip
rename to snapshot/angular-1.4.0-build.4010+sha.213c2a7.zip
index b67168bec..bde38c776 100644
Binary files a/snapshot/angular-1.4.0-build.4009+sha.3545abf.zip and b/snapshot/angular-1.4.0-build.4010+sha.213c2a7.zip differ
diff --git a/snapshot/angular-animate.js b/snapshot/angular-animate.js
index 80ffe4dc0..4e540cac6 100644
--- a/snapshot/angular-animate.js
+++ b/snapshot/angular-animate.js
@@ -1,5 +1,5 @@
/**
- * @license AngularJS v1.4.0-build.4009+sha.3545abf
+ * @license AngularJS v1.4.0-build.4010+sha.213c2a7
* (c) 2010-2015 Google, Inc. http://angularjs.org
* License: MIT
*/
@@ -256,6 +256,64 @@ function getDomNode(element) {
return (element instanceof angular.element) ? element[0] : element;
}
+var $$rAFSchedulerFactory = ['$$rAF', function($$rAF) {
+ var tickQueue = [];
+ var cancelFn;
+
+ function scheduler(tasks) {
+ // we make a copy since RAFScheduler mutates the state
+ // of the passed in array variable and this would be difficult
+ // to track down on the outside code
+ tickQueue.push([].concat(tasks));
+ nextTick();
+ }
+
+ /* waitUntilQuiet does two things:
+ * 1. It will run the FINAL `fn` value only when an uncancelled RAF has passed through
+ * 2. It will delay the next wave of tasks from running until the quiet `fn` has run.
+ *
+ * The motivation here is that animation code can request more time from the scheduler
+ * before the next wave runs. This allows for certain DOM properties such as classes to
+ * be resolved in time for the next animation to run.
+ */
+ scheduler.waitUntilQuiet = function(fn) {
+ if (cancelFn) cancelFn();
+
+ cancelFn = $$rAF(function() {
+ cancelFn = null;
+ fn();
+ nextTick();
+ });
+ };
+
+ return scheduler;
+
+ function nextTick() {
+ if (!tickQueue.length) return;
+
+ var updatedQueue = [];
+ for (var i = 0; i < tickQueue.length; i++) {
+ var innerQueue = tickQueue[i];
+ runNextTask(innerQueue);
+ if (innerQueue.length) {
+ updatedQueue.push(innerQueue);
+ }
+ }
+ tickQueue = updatedQueue;
+
+ if (!cancelFn) {
+ $$rAF(function() {
+ if (!cancelFn) nextTick();
+ });
+ }
+ }
+
+ function runNextTask(tasks) {
+ var nextTask = tasks.shift();
+ nextTask();
+ }
+}];
+
var $$AnimateChildrenDirective = [function() {
return function(scope, element, attrs) {
var val = attrs.ngAnimateChildren;
@@ -662,9 +720,9 @@ var $AnimateCssProvider = ['$animateProvider', function($animateProvider) {
var gcsStaggerLookup = createLocalCacheLookup();
this.$get = ['$window', '$$jqLite', '$$AnimateRunner', '$timeout',
- '$document', '$sniffer', '$$rAF',
+ '$document', '$sniffer', '$$rAFScheduler',
function($window, $$jqLite, $$AnimateRunner, $timeout,
- $document, $sniffer, $$rAF) {
+ $document, $sniffer, $$rAFScheduler) {
var applyAnimationClasses = applyAnimationClassesFactory($$jqLite);
@@ -722,15 +780,10 @@ var $AnimateCssProvider = ['$animateProvider', function($animateProvider) {
}
var bod = getDomNode($document).body;
- var cancelLastRAFRequest;
var rafWaitQueue = [];
function waitUntilQuiet(callback) {
- if (cancelLastRAFRequest) {
- cancelLastRAFRequest(); //cancels the request
- }
rafWaitQueue.push(callback);
- cancelLastRAFRequest = $$rAF(function() {
- cancelLastRAFRequest = null;
+ $$rAFScheduler.waitUntilQuiet(function() {
gcsLookup.flush();
gcsStaggerLookup.flush();
@@ -2160,7 +2213,9 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
return runner;
}
- closeParentClassBasedAnimations(parent);
+ if (isStructural) {
+ closeParentClassBasedAnimations(parent);
+ }
// the counter keeps track of cancelled animations
var counter = (existingAnimation.counter || 0) + 1;
@@ -2219,7 +2274,9 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
? 'setClass'
: animationDetails.event;
- closeParentClassBasedAnimations(parentElement);
+ if (animationDetails.structural) {
+ closeParentClassBasedAnimations(parentElement);
+ }
markElementAnimationState(element, RUNNING_STATE);
var realRunner = $$animation(element, event, animationDetails.options);
@@ -2561,12 +2618,16 @@ var $$AnimationProvider = ['$animateProvider', function($animateProvider) {
return element.data(RUNNER_STORAGE_KEY);
}
- this.$get = ['$$jqLite', '$rootScope', '$injector', '$$AnimateRunner',
- function($$jqLite, $rootScope, $injector, $$AnimateRunner) {
+ this.$get = ['$$jqLite', '$rootScope', '$injector', '$$AnimateRunner', '$$rAFScheduler',
+ function($$jqLite, $rootScope, $injector, $$AnimateRunner, $$rAFScheduler) {
var animationQueue = [];
var applyAnimationClasses = applyAnimationClassesFactory($$jqLite);
+ var totalPendingClassBasedAnimations = 0;
+ var totalActiveClassBasedAnimations = 0;
+ var classBasedAnimationsQueue = [];
+
// TODO(matsko): document the signature in a better way
return function(element, event, options) {
options = prepareAnimationOptions(options);
@@ -2595,12 +2656,19 @@ var $$AnimationProvider = ['$animateProvider', function($animateProvider) {
options.tempClasses = null;
}
+ var classBasedIndex;
+ if (!isStructural) {
+ classBasedIndex = totalPendingClassBasedAnimations;
+ totalPendingClassBasedAnimations += 1;
+ }
+
animationQueue.push({
// this data is used by the postDigest code and passed into
// the driver step function
element: element,
classes: classes,
event: event,
+ classBasedIndex: classBasedIndex,
structural: isStructural,
options: options,
beforeStart: beforeStart,
@@ -2615,6 +2683,10 @@ var $$AnimationProvider = ['$animateProvider', function($animateProvider) {
if (animationQueue.length > 1) return runner;
$rootScope.$$postDigest(function() {
+ totalActiveClassBasedAnimations = totalPendingClassBasedAnimations;
+ totalPendingClassBasedAnimations = 0;
+ classBasedAnimationsQueue.length = 0;
+
var animations = [];
forEach(animationQueue, function(entry) {
// the element was destroyed early on which removed the runner
@@ -2629,23 +2701,58 @@ var $$AnimationProvider = ['$animateProvider', function($animateProvider) {
animationQueue.length = 0;
forEach(groupAnimations(animations), function(animationEntry) {
- // it's important that we apply the `ng-animate` CSS class and the
- // temporary classes before we do any driver invoking since these
- // CSS classes may be required for proper CSS detection.
- animationEntry.beforeStart();
-
- var operation = invokeFirstDriver(animationEntry);
- var triggerAnimationStart = operation && operation.start; /// TODO(matsko): only recognize operation.start()
-
- var closeFn = animationEntry.close;
- if (!triggerAnimationStart) {
- closeFn();
+ if (animationEntry.structural) {
+ triggerAnimationStart();
} else {
- var animationRunner = triggerAnimationStart();
- animationRunner.done(function(status) {
- closeFn(!status);
+ classBasedAnimationsQueue.push({
+ node: getDomNode(animationEntry.element),
+ fn: triggerAnimationStart
});
- updateAnimationRunners(animationEntry, animationRunner);
+
+ if (animationEntry.classBasedIndex === totalActiveClassBasedAnimations - 1) {
+ // we need to sort each of the animations in order of parent to child
+ // relationships. This ensures that the child classes are applied at the
+ // right time.
+ classBasedAnimationsQueue = classBasedAnimationsQueue.sort(function(a,b) {
+ return b.node.contains(a.node);
+ }).map(function(entry) {
+ return entry.fn;
+ });
+
+ $$rAFScheduler(classBasedAnimationsQueue);
+ }
+ }
+
+ function triggerAnimationStart() {
+ // it's important that we apply the `ng-animate` CSS class and the
+ // temporary classes before we do any driver invoking since these
+ // CSS classes may be required for proper CSS detection.
+ animationEntry.beforeStart();
+
+ var startAnimationFn, closeFn = animationEntry.close;
+
+ // in the event that the element was removed before the digest runs or
+ // during the RAF sequencing then we should not trigger the animation.
+ var targetElement = animationEntry.anchors
+ ? (animationEntry.from.element || animationEntry.to.element)
+ : animationEntry.element;
+
+ if (getRunner(targetElement)) {
+ var operation = invokeFirstDriver(animationEntry);
+ if (operation) {
+ startAnimationFn = operation.start;
+ }
+ }
+
+ if (!startAnimationFn) {
+ closeFn();
+ } else {
+ var animationRunner = startAnimationFn();
+ animationRunner.done(function(status) {
+ closeFn(!status);
+ });
+ updateAnimationRunners(animationEntry, animationRunner);
+ }
}
});
});
@@ -2717,7 +2824,7 @@ var $$AnimationProvider = ['$animateProvider', function($animateProvider) {
var lookupKey = from.animationID.toString();
if (!anchorGroups[lookupKey]) {
var group = anchorGroups[lookupKey] = {
- // TODO(matsko): double-check this code
+ structural: true,
beforeStart: function() {
fromAnimation.beforeStart();
toAnimation.beforeStart();
@@ -2835,6 +2942,7 @@ var $$AnimationProvider = ['$animateProvider', function($animateProvider) {
/* global angularAnimateModule: true,
$$rAFMutexFactory,
+ $$rAFSchedulerFactory,
$$AnimateChildrenDirective,
$$AnimateRunnerFactory,
$$AnimateQueueProvider,
@@ -3574,6 +3682,7 @@ angular.module('ngAnimate', [])
.directive('ngAnimateChildren', $$AnimateChildrenDirective)
.factory('$$rAFMutex', $$rAFMutexFactory)
+ .factory('$$rAFScheduler', $$rAFSchedulerFactory)
.factory('$$AnimateRunner', $$AnimateRunnerFactory)
diff --git a/snapshot/angular-animate.min.js b/snapshot/angular-animate.min.js
index 0b316f9b6..9319de0f2 100644
--- a/snapshot/angular-animate.min.js
+++ b/snapshot/angular-animate.min.js
@@ -1,50 +1,52 @@
/*
- AngularJS v1.4.0-build.4009+sha.3545abf
+ AngularJS v1.4.0-build.4010+sha.213c2a7
(c) 2010-2015 Google, Inc. http://angularjs.org
License: MIT
*/
-(function(A,s,W){'use strict';function ta(a,b,c){if(!a)throw ngMinErr("areq",b||"?",c||"required");return a}function ua(a,b){if(!a&&!b)return"";if(!a)return b;if(!b)return a;X(a)&&(a=a.join(" "));X(b)&&(b=b.join(" "));return a+" "+b}function Ca(a){var b={};a&&(a.to||a.from)&&(b.to=a.to,b.from=a.from);return b}function ba(a,b,c){var d="";a=X(a)?a:a&&T(a)&&a.length?a.split(/\s+/):[];m(a,function(a,t){a&&0","
"],col:[2,"
"],tr:[2,"","
"],td:[3,"
"],_default:[0,"",""]};ma.optgroup=ma.option;ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead;ma.th=ma.td;var Oa=R.prototype={ready:function(b){function a(){c||
(c=!0,b())}var c=!1;"complete"===W.readyState?setTimeout(a):(this.on("DOMContentLoaded",a),R(N).on("load",a))},toString:function(){var b=[];n(this,function(a){b.push(""+a)});return"["+b.join(", ")+"]"},eq:function(b){return 0<=b?z(this[b]):z(this[this.length+b])},length:0,push:jg,sort:[].sort,splice:[].splice},zb={};n("multiple selected checked disabled readOnly required open".split(" "),function(b){zb[F(b)]=b});var Tc={};n("input select option textarea button form details".split(" "),function(b){Tc[b]=
!0});var Uc={ngMinlength:"minlength",ngMaxlength:"maxlength",ngMin:"min",ngMax:"max",ngPattern:"pattern"};n({data:Wb,removeData:sb},function(b,a){R[a]=b});n({data:Wb,inheritedData:yb,scope:function(b){return z.data(b,"$scope")||yb(b.parentNode||b,["$isolateScope","$scope"])},isolateScope:function(b){return z.data(b,"$isolateScope")||z.data(b,"$isolateScopeNoTemplate")},controller:Qc,injector:function(b){return yb(b,"$injector")},removeAttr:function(b,a){b.removeAttribute(a)},hasClass:vb,css:function(b,
diff --git a/snapshot/angular.min.js.gzip b/snapshot/angular.min.js.gzip
index 7fe1d6cbf..f709859f0 100644
Binary files a/snapshot/angular.min.js.gzip and b/snapshot/angular.min.js.gzip differ
diff --git a/snapshot/docs/js/versions-data.js b/snapshot/docs/js/versions-data.js
index 0e7cfa93a..ca8e65acf 100644
--- a/snapshot/docs/js/versions-data.js
+++ b/snapshot/docs/js/versions-data.js
@@ -7,13 +7,13 @@ angular.module('versionsData', [])
"patch": 0,
"prerelease": [
"build",
- "4009"
+ "4010"
],
- "build": "sha.3545abf",
- "version": "1.4.0-build.4009",
+ "build": "sha.213c2a7",
+ "version": "1.4.0-build.4010",
"codeName": "snapshot",
"isSnapshot": true,
- "full": "1.4.0-build.4009+sha.3545abf",
+ "full": "1.4.0-build.4010+sha.213c2a7",
"branch": "master"
})
.value('NG_VERSIONS', [
@@ -24,13 +24,13 @@ angular.module('versionsData', [])
"patch": 0,
"prerelease": [
"build",
- "4009"
+ "4010"
],
- "build": "sha.3545abf",
- "version": "1.4.0-build.4009",
+ "build": "sha.213c2a7",
+ "version": "1.4.0-build.4010",
"codeName": "snapshot",
"isSnapshot": true,
- "full": "1.4.0-build.4009+sha.3545abf",
+ "full": "1.4.0-build.4010+sha.213c2a7",
"branch": "master"
},
{
diff --git a/snapshot/docs/partials/api/ngAnimate.html b/snapshot/docs/partials/api/ngAnimate.html
index 2a8dc78eb..159dea5f9 100644
--- a/snapshot/docs/partials/api/ngAnimate.html
+++ b/snapshot/docs/partials/api/ngAnimate.html
@@ -1,4 +1,4 @@
- Improve this Doc
+ Improve this Doc
","
diff --git a/snapshot/docs/partials/api/ngAnimate/service/$animate.html b/snapshot/docs/partials/api/ngAnimate/service/$animate.html
index 7bccaea73..c03b2aa16 100644
--- a/snapshot/docs/partials/api/ngAnimate/service/$animate.html
+++ b/snapshot/docs/partials/api/ngAnimate/service/$animate.html
@@ -1,8 +1,8 @@
- Improve this Doc
+ Improve this Doc
-
+
View Source
diff --git a/snapshot/docs/partials/misc/faq.html b/snapshot/docs/partials/misc/faq.html
index e5692147e..c0c5b4e34 100644
--- a/snapshot/docs/partials/misc/faq.html
+++ b/snapshot/docs/partials/misc/faq.html
@@ -95,7 +95,7 @@
How can I get some AngularJS schwa
make our schwag will be happy to do a custom run for you, based on our existing template. By using the design they have on file,
they'll waive the setup costs, and you can order any quantity you need.
Stickers -For orders of 250 stickers or more within Canada or the United States, contact Tom Witting (or anyone in sales) via email at tom@stickergiant.com, and tell him you want to order some AngularJS +For orders of 250 stickers or more within Canada or the United States, contact Tom Witting (or anyone in sales) via email at tom@stickergiant.com, and tell him you want to order some AngularJS stickers just like the ones in job #42711. You'll have to give them your own info for billing and shipping.
As long as the design stays exactly the same, StickerGiant will give you a reorder discount.
For a smaller order, or for other countries, we suggest downloading the logo artwork and making your own.
diff --git a/snapshot/errors.json b/snapshot/errors.json index 7460627ab..cc0d8e9d9 100644 --- a/snapshot/errors.json +++ b/snapshot/errors.json @@ -1 +1 @@ -{"id":"ng","generated":"Thu May 21 2015 12:40:32 GMT-0700 (PDT)","errors":{"ng":{"areq":"Argument '{0}' is {1}","cpta":"Can't copy! TypedArray destination cannot be mutated.","test":"no injector found for element argument to getTestability","cpws":"Can't copy! Making copies of Window or Scope instances is not supported.","btstrpd":"App Already Bootstrapped with this Element '{0}'","cpi":"Can't copy! Source and destination are identical.","badname":"hasOwnProperty is not a valid {0} name"},"$http":{"badreq":"Http request configuration must be an object. Received: {0}"},"ngRepeat":{"badident":"alias '{0}' is invalid --- must be a valid JS identifier which is not a reserved name.","iexp":"Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.","dupes":"Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}, Duplicate value: {2}","iidexp":"'_item_' in '_item_ in _collection_' should be an identifier or '(_key_, _value_)' expression, but got '{0}'."},"$sce":{"imatcher":"Matchers may only be \"self\", string patterns or RegExp objects","icontext":"Attempted to trust a value in invalid context. Context: {0}; Value: {1}","iwcard":"Illegal sequence *** in string matcher. String: {0}","insecurl":"Blocked loading resource from url not allowed by $sceDelegate policy. URL: {0}","iequirks":"Strict Contextual Escaping does not support Internet Explorer version < 11 in quirks mode. You can fix this by adding the text to the top of your HTML document. See http://docs.angularjs.org/api/ng.$sce for more information.","unsafe":"Attempting to use an unsafe value in a safe context.","itype":"Attempted to trust a non-string value in a content requiring a string: Context: {0}"},"ngPattern":{"noregexp":"Expected {0} to be a RegExp but was {1}. Element: {2}"},"$controller":{"ctrlfmt":"Badly formed controller string '{0}'. Must match `__name__ as __id__` or `__name__`.","noscp":"Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`."},"$ngModel":{"nonassign":"Expression '{0}' is non-assignable. Element: {1}","datefmt":"Expected `{0}` to be a date","$asyncValidators":"Expected asynchronous validator to return a promise but got '{0}' instead.","numfmt":"Expected `{0}` to be a number"},"$parse":{"isecfn":"Referencing Function in Angular expressions is disallowed! Expression: {0}","isecwindow":"Referencing the Window in Angular expressions is disallowed! Expression: {0}","ueoe":"Unexpected end of expression: {0}","isecdom":"Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}","lexerr":"Lexer Error: {0} at column{1} in expression [{2}].","esc":"IMPOSSIBLE","isecobj":"Referencing Object in Angular expressions is disallowed! Expression: {0}","lval":"Trying to assing a value to a non l-value","isecff":"Referencing call, apply or bind in Angular expressions is disallowed! Expression: {0}","syntax":"Syntax Error: Token '{0}' {1} at column {2} of the expression [{3}] starting at [{4}].","isecfld":"Attempting to access a disallowed field in Angular expressions! Expression: {0}"},"jqLite":{"offargs":"jqLite#off() does not support the `selector` argument","onargs":"jqLite#on() does not support the `selector` or `eventData` parameters","nosel":"Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element"},"$animate":{"notcsel":"Expecting class selector starting with '.' got '{0}'.","nocb":"Do not pass a callback to animate methods","nongcls":"$animateProvider.classNameFilter(regex) prohibits accepting a regex value which matches/contains the \"{0}\" CSS class."},"$q":{"norslvr":"Expected resolverFn, got '{0}'","qcycle":"Expected promise to be resolved with value other than itself '{0}'"},"$injector":{"pget":"Provider '{0}' must define $get factory method.","cdep":"Circular dependency found: {0}","nomod":"Module '{0}' is not available! You either misspelled the module name or forgot to load it. If registering a module ensure that you specify the dependencies as the second argument.","strictdi":"{0} is not using explicit annotation and cannot be invoked in strict mode","modulerr":"Failed to instantiate module {0} due to:\n{1}","undef":"Provider '{0}' must return a value from $get factory method.","unpr":"Unknown provider: {0}","itkn":"Incorrect injection token! Expected service name as string, got {0}"},"filter":{"notarray":"Expected array but received: {0}"},"ngTransclude":{"orphan":"Illegal use of ngTransclude directive in the template! No parent directive that requires a transclusion found. Element: {0}"},"ngModel":{"constexpr":"Expected constant expression for `{0}`, but saw `{1}`."},"$location":{"nostate":"History API state support is available only in HTML5 mode and only in browsers supporting HTML5 History API","ipthprfx":"Invalid url \"{0}\", missing path prefix \"{1}\".","isrcharg":"The first argument of the `$location#search()` call must be a string or an object.","nobase":"$location in HTML5 mode requires a