angular-rails-engine 1.2.3.0 → 1.2.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.3
2
+ * @license AngularJS v1.2.5
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -57,13 +57,13 @@ function $RouteProvider(){
57
57
  * `$location.path` will be updated to add or drop the trailing slash to exactly match the
58
58
  * route definition.
59
59
  *
60
- * * `path` can contain named groups starting with a colon (`:name`). All characters up
60
+ * * `path` can contain named groups starting with a colon: e.g. `:name`. All characters up
61
61
  * to the next slash are matched and stored in `$routeParams` under the given `name`
62
62
  * when the route matches.
63
- * * `path` can contain named groups starting with a colon and ending with a star (`:name*`).
64
- * All characters are eagerly stored in `$routeParams` under the given `name`
63
+ * * `path` can contain named groups starting with a colon and ending with a star:
64
+ * e.g.`:name*`. All characters are eagerly stored in `$routeParams` under the given `name`
65
65
  * when the route matches.
66
- * * `path` can contain optional named groups with a question mark (`:name?`).
66
+ * * `path` can contain optional named groups with a question mark: e.g.`:name?`.
67
67
  *
68
68
  * For example, routes like `/color/:color/largecode/:largecode*\/edit` will match
69
69
  * `/color/brown/largecode/code/with/slashs/edit` and extract:
@@ -644,6 +644,8 @@ function $RouteParamsProvider() {
644
644
  }
645
645
 
646
646
  ngRouteModule.directive('ngView', ngViewFactory);
647
+ ngRouteModule.directive('ngView', ngViewFillContentFactory);
648
+
647
649
 
648
650
  /**
649
651
  * @ngdoc directive
@@ -809,8 +811,8 @@ ngRouteModule.directive('ngView', ngViewFactory);
809
811
  * @description
810
812
  * Emitted every time the ngView content is reloaded.
811
813
  */
812
- ngViewFactory.$inject = ['$route', '$anchorScroll', '$compile', '$controller', '$animate'];
813
- function ngViewFactory( $route, $anchorScroll, $compile, $controller, $animate) {
814
+ ngViewFactory.$inject = ['$route', '$anchorScroll', '$animate'];
815
+ function ngViewFactory( $route, $anchorScroll, $animate) {
814
816
  return {
815
817
  restrict: 'ECA',
816
818
  terminal: true,
@@ -842,6 +844,7 @@ function ngViewFactory( $route, $anchorScroll, $compile, $controller,
842
844
 
843
845
  if (template) {
844
846
  var newScope = scope.$new();
847
+ var current = $route.current;
845
848
 
846
849
  // Note: This will also link all children of ng-view that were contained in the original
847
850
  // html. If that content contains controllers, ... they could pollute/change the scope.
@@ -849,34 +852,18 @@ function ngViewFactory( $route, $anchorScroll, $compile, $controller,
849
852
  // Note: We can't remove them in the cloneAttchFn of $transclude as that
850
853
  // function is called before linking the content, which would apply child
851
854
  // directives to non existing elements.
852
- var clone = $transclude(newScope, angular.noop);
853
- clone.html(template);
854
- $animate.enter(clone, null, currentElement || $element, function onNgViewEnter () {
855
- if (angular.isDefined(autoScrollExp)
856
- && (!autoScrollExp || scope.$eval(autoScrollExp))) {
857
- $anchorScroll();
858
- }
855
+ var clone = $transclude(newScope, function(clone) {
856
+ $animate.enter(clone, null, currentElement || $element, function onNgViewEnter () {
857
+ if (angular.isDefined(autoScrollExp)
858
+ && (!autoScrollExp || scope.$eval(autoScrollExp))) {
859
+ $anchorScroll();
860
+ }
861
+ });
862
+ cleanupLastView();
859
863
  });
860
864
 
861
- cleanupLastView();
862
-
863
- var link = $compile(clone.contents()),
864
- current = $route.current;
865
-
866
- currentScope = current.scope = newScope;
867
865
  currentElement = clone;
868
-
869
- if (current.controller) {
870
- locals.$scope = currentScope;
871
- var controller = $controller(current.controller, locals);
872
- if (current.controllerAs) {
873
- currentScope[current.controllerAs] = controller;
874
- }
875
- clone.data('$ngControllerController', controller);
876
- clone.children().data('$ngControllerController', controller);
877
- }
878
-
879
- link(currentScope);
866
+ currentScope = current.scope = newScope;
880
867
  currentScope.$emit('$viewContentLoaded');
881
868
  currentScope.$eval(onloadExp);
882
869
  } else {
@@ -887,5 +874,38 @@ function ngViewFactory( $route, $anchorScroll, $compile, $controller,
887
874
  };
888
875
  }
889
876
 
877
+ // This directive is called during the $transclude call of the first `ngView` directive.
878
+ // It will replace and compile the content of the element with the loaded template.
879
+ // We need this directive so that the element content is already filled when
880
+ // the link function of another directive on the same element as ngView
881
+ // is called.
882
+ ngViewFillContentFactory.$inject = ['$compile', '$controller', '$route'];
883
+ function ngViewFillContentFactory($compile, $controller, $route) {
884
+ return {
885
+ restrict: 'ECA',
886
+ priority: -400,
887
+ link: function(scope, $element) {
888
+ var current = $route.current,
889
+ locals = current.locals;
890
+
891
+ $element.html(locals.$template);
892
+
893
+ var link = $compile($element.contents());
894
+
895
+ if (current.controller) {
896
+ locals.$scope = scope;
897
+ var controller = $controller(current.controller, locals);
898
+ if (current.controllerAs) {
899
+ scope[current.controllerAs] = controller;
900
+ }
901
+ $element.data('$ngControllerController', controller);
902
+ $element.children().data('$ngControllerController', controller);
903
+ }
904
+
905
+ link(scope);
906
+ }
907
+ };
908
+ }
909
+
890
910
 
891
911
  })(window, window.angular);
@@ -1,14 +1,13 @@
1
1
  /*
2
- AngularJS v1.2.3
2
+ AngularJS v1.2.5
3
3
  (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  License: MIT
5
5
  */
6
- (function(t,c,A){'use strict';function x(r,m,d,b,h){return{restrict:"ECA",terminal:!0,priority:400,transclude:"element",link:function(l,z,k,B,w){function v(){g&&(g.$destroy(),g=null);q&&(h.leave(q),q=null)}function u(){var a=r.current&&r.current.locals,e=a&&a.$template;if(e){var y=l.$new(),s=w(y,c.noop);s.html(e);h.enter(s,null,q||z,function(){!c.isDefined(n)||n&&!l.$eval(n)||m()});v();var e=d(s.contents()),f=r.current;g=f.scope=y;q=s;f.controller&&(a.$scope=g,a=b(f.controller,a),f.controllerAs&&
7
- (g[f.controllerAs]=a),s.data("$ngControllerController",a),s.children().data("$ngControllerController",a));e(g);g.$emit("$viewContentLoaded");g.$eval(p)}else v()}var g,q,n=k.autoscroll,p=k.onload||"";l.$on("$routeChangeSuccess",u);u()}}}t=c.module("ngRoute",["ng"]).provider("$route",function(){function r(b,h){return c.extend(new (c.extend(function(){},{prototype:b})),h)}function m(b,c){var l=c.caseInsensitiveMatch,d={originalPath:b,regexp:b},k=d.keys=[];b=b.replace(/([().])/g,"\\$1").replace(/(\/)?:(\w+)([\?|\*])?/g,
8
- function(b,c,h,d){b="?"===d?d:null;d="*"===d?d:null;k.push({name:h,optional:!!b});c=c||"";return""+(b?"":c)+"(?:"+(b?c:"")+(d&&"(.+?)"||"([^/]+)")+(b||"")+")"+(b||"")}).replace(/([\/$\*])/g,"\\$1");d.regexp=RegExp("^"+b+"$",l?"i":"");return d}var d={};this.when=function(b,h){d[b]=c.extend({reloadOnSearch:!0},h,b&&m(b,h));if(b){var l="/"==b[b.length-1]?b.substr(0,b.length-1):b+"/";d[l]=c.extend({redirectTo:b},m(l,h))}return this};this.otherwise=function(b){this.when(null,b);return this};this.$get=
9
- ["$rootScope","$location","$routeParams","$q","$injector","$http","$templateCache","$sce",function(b,h,l,m,k,t,w,v){function u(){var a=g(),e=p.current;if(a&&e&&a.$$route===e.$$route&&c.equals(a.pathParams,e.pathParams)&&!a.reloadOnSearch&&!n)e.params=a.params,c.copy(e.params,l),b.$broadcast("$routeUpdate",e);else if(a||e)n=!1,b.$broadcast("$routeChangeStart",a,e),(p.current=a)&&a.redirectTo&&(c.isString(a.redirectTo)?h.path(q(a.redirectTo,a.params)).search(a.params).replace():h.url(a.redirectTo(a.pathParams,
10
- h.path(),h.search())).replace()),m.when(a).then(function(){if(a){var b=c.extend({},a.resolve),e,f;c.forEach(b,function(a,e){b[e]=c.isString(a)?k.get(a):k.invoke(a)});c.isDefined(e=a.template)?c.isFunction(e)&&(e=e(a.params)):c.isDefined(f=a.templateUrl)&&(c.isFunction(f)&&(f=f(a.params)),f=v.getTrustedResourceUrl(f),c.isDefined(f)&&(a.loadedTemplateUrl=f,e=t.get(f,{cache:w}).then(function(a){return a.data})));c.isDefined(e)&&(b.$template=e);return m.all(b)}}).then(function(d){a==p.current&&(a&&(a.locals=
11
- d,c.copy(a.params,l)),b.$broadcast("$routeChangeSuccess",a,e))},function(c){a==p.current&&b.$broadcast("$routeChangeError",a,e,c)})}function g(){var a,b;c.forEach(d,function(d,l){var f;if(f=!b){var g=h.path();f=d.keys;var m={};if(d.regexp)if(g=d.regexp.exec(g)){for(var k=1,q=g.length;k<q;++k){var n=f[k-1],p="string"==typeof g[k]?decodeURIComponent(g[k]):g[k];n&&p&&(m[n.name]=p)}f=m}else f=null;else f=null;f=a=f}f&&(b=r(d,{params:c.extend({},h.search(),a),pathParams:a}),b.$$route=d)});return b||d[null]&&
12
- r(d[null],{params:{},pathParams:{}})}function q(a,b){var d=[];c.forEach((a||"").split(":"),function(a,c){if(0===c)d.push(a);else{var g=a.match(/(\w+)(.*)/),h=g[1];d.push(b[h]);d.push(g[2]||"");delete b[h]}});return d.join("")}var n=!1,p={routes:d,reload:function(){n=!0;b.$evalAsync(u)}};b.$on("$locationChangeSuccess",u);return p}]});t.provider("$routeParams",function(){this.$get=function(){return{}}});t.directive("ngView",x);x.$inject=["$route","$anchorScroll","$compile","$controller","$animate"]})(window,
13
- window.angular);
14
- //# sourceMappingURL=angular-route.min.js.map
6
+ (function(h,e,A){'use strict';function u(w,q,k){return{restrict:"ECA",terminal:!0,priority:400,transclude:"element",link:function(a,c,b,f,n){function y(){l&&(l.$destroy(),l=null);g&&(k.leave(g),g=null)}function v(){var b=w.current&&w.current.locals;if(b&&b.$template){var b=a.$new(),f=w.current;g=n(b,function(d){k.enter(d,null,g||c,function(){!e.isDefined(t)||t&&!a.$eval(t)||q()});y()});l=f.scope=b;l.$emit("$viewContentLoaded");l.$eval(h)}else y()}var l,g,t=b.autoscroll,h=b.onload||"";a.$on("$routeChangeSuccess",
7
+ v);v()}}}function z(e,h,k){return{restrict:"ECA",priority:-400,link:function(a,c){var b=k.current,f=b.locals;c.html(f.$template);var n=e(c.contents());b.controller&&(f.$scope=a,f=h(b.controller,f),b.controllerAs&&(a[b.controllerAs]=f),c.data("$ngControllerController",f),c.children().data("$ngControllerController",f));n(a)}}}h=e.module("ngRoute",["ng"]).provider("$route",function(){function h(a,c){return e.extend(new (e.extend(function(){},{prototype:a})),c)}function q(a,e){var b=e.caseInsensitiveMatch,
8
+ f={originalPath:a,regexp:a},h=f.keys=[];a=a.replace(/([().])/g,"\\$1").replace(/(\/)?:(\w+)([\?|\*])?/g,function(a,e,b,c){a="?"===c?c:null;c="*"===c?c:null;h.push({name:b,optional:!!a});e=e||"";return""+(a?"":e)+"(?:"+(a?e:"")+(c&&"(.+?)"||"([^/]+)")+(a||"")+")"+(a||"")}).replace(/([\/$\*])/g,"\\$1");f.regexp=RegExp("^"+a+"$",b?"i":"");return f}var k={};this.when=function(a,c){k[a]=e.extend({reloadOnSearch:!0},c,a&&q(a,c));if(a){var b="/"==a[a.length-1]?a.substr(0,a.length-1):a+"/";k[b]=e.extend({redirectTo:a},
9
+ q(b,c))}return this};this.otherwise=function(a){this.when(null,a);return this};this.$get=["$rootScope","$location","$routeParams","$q","$injector","$http","$templateCache","$sce",function(a,c,b,f,n,q,v,l){function g(){var d=t(),m=r.current;if(d&&m&&d.$$route===m.$$route&&e.equals(d.pathParams,m.pathParams)&&!d.reloadOnSearch&&!x)m.params=d.params,e.copy(m.params,b),a.$broadcast("$routeUpdate",m);else if(d||m)x=!1,a.$broadcast("$routeChangeStart",d,m),(r.current=d)&&d.redirectTo&&(e.isString(d.redirectTo)?
10
+ c.path(u(d.redirectTo,d.params)).search(d.params).replace():c.url(d.redirectTo(d.pathParams,c.path(),c.search())).replace()),f.when(d).then(function(){if(d){var a=e.extend({},d.resolve),c,b;e.forEach(a,function(d,c){a[c]=e.isString(d)?n.get(d):n.invoke(d)});e.isDefined(c=d.template)?e.isFunction(c)&&(c=c(d.params)):e.isDefined(b=d.templateUrl)&&(e.isFunction(b)&&(b=b(d.params)),b=l.getTrustedResourceUrl(b),e.isDefined(b)&&(d.loadedTemplateUrl=b,c=q.get(b,{cache:v}).then(function(a){return a.data})));
11
+ e.isDefined(c)&&(a.$template=c);return f.all(a)}}).then(function(c){d==r.current&&(d&&(d.locals=c,e.copy(d.params,b)),a.$broadcast("$routeChangeSuccess",d,m))},function(c){d==r.current&&a.$broadcast("$routeChangeError",d,m,c)})}function t(){var a,b;e.forEach(k,function(f,k){var p;if(p=!b){var s=c.path();p=f.keys;var l={};if(f.regexp)if(s=f.regexp.exec(s)){for(var g=1,q=s.length;g<q;++g){var n=p[g-1],r="string"==typeof s[g]?decodeURIComponent(s[g]):s[g];n&&r&&(l[n.name]=r)}p=l}else p=null;else p=null;
12
+ p=a=p}p&&(b=h(f,{params:e.extend({},c.search(),a),pathParams:a}),b.$$route=f)});return b||k[null]&&h(k[null],{params:{},pathParams:{}})}function u(a,c){var b=[];e.forEach((a||"").split(":"),function(a,d){if(0===d)b.push(a);else{var e=a.match(/(\w+)(.*)/),f=e[1];b.push(c[f]);b.push(e[2]||"");delete c[f]}});return b.join("")}var x=!1,r={routes:k,reload:function(){x=!0;a.$evalAsync(g)}};a.$on("$locationChangeSuccess",g);return r}]});h.provider("$routeParams",function(){this.$get=function(){return{}}});
13
+ h.directive("ngView",u);h.directive("ngView",z);u.$inject=["$route","$anchorScroll","$animate"];z.$inject=["$compile","$controller","$route"]})(window,window.angular);
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.3
2
+ * @license AngularJS v1.2.5
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -365,25 +365,32 @@ function htmlParser( html, handler ) {
365
365
  }
366
366
  }
367
367
 
368
+ var hiddenPre=document.createElement("pre");
369
+ var spaceRe = /^(\s*)([\s\S]*?)(\s*)$/;
368
370
  /**
369
371
  * decodes all entities into regular string
370
372
  * @param value
371
373
  * @returns {string} A string with decoded entities.
372
374
  */
373
- var hiddenPre=document.createElement("pre");
374
375
  function decodeEntities(value) {
375
- if (!value) {
376
- return '';
377
- }
376
+ if (!value) { return ''; }
377
+
378
378
  // Note: IE8 does not preserve spaces at the start/end of innerHTML
379
- var spaceRe = /^(\s*)([\s\S]*?)(\s*)$/;
379
+ // so we must capture them and reattach them afterward
380
380
  var parts = spaceRe.exec(value);
381
- parts[0] = '';
382
- if (parts[2]) {
383
- hiddenPre.innerHTML=parts[2].replace(/</g,"&lt;");
384
- parts[2] = hiddenPre.innerText || hiddenPre.textContent;
381
+ var spaceBefore = parts[1];
382
+ var spaceAfter = parts[3];
383
+ var content = parts[2];
384
+ if (content) {
385
+ hiddenPre.innerHTML=content.replace(/</g,"&lt;");
386
+ // innerText depends on styling as it doesn't display hidden elements.
387
+ // Therefore, it's better to use textContent not to cause unnecessary
388
+ // reflows. However, IE<9 don't support textContent so the innerText
389
+ // fallback is necessary.
390
+ content = 'textContent' in hiddenPre ?
391
+ hiddenPre.textContent : hiddenPre.innerText;
385
392
  }
386
- return parts.join('');
393
+ return spaceBefore + content + spaceAfter;
387
394
  }
388
395
 
389
396
  /**
@@ -1,14 +1,13 @@
1
1
  /*
2
- AngularJS v1.2.3
2
+ AngularJS v1.2.5
3
3
  (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  License: MIT
5
5
  */
6
- (function(n,h,q){'use strict';function F(a){var e=[];t(e,h.noop).chars(a);return e.join("")}function k(a){var e={};a=a.split(",");var d;for(d=0;d<a.length;d++)e[a[d]]=!0;return e}function G(a,e){function d(a,b,d,g){b=h.lowercase(b);if(u[b])for(;f.last()&&v[f.last()];)c("",f.last());w[b]&&f.last()==b&&c("",b);(g=x[b]||!!g)||f.push(b);var l={};d.replace(H,function(a,b,e,c,m){l[b]=r(e||c||m||"")});e.start&&e.start(b,l,g)}function c(a,b){var c=0,d;if(b=h.lowercase(b))for(c=f.length-1;0<=c&&f[c]!=b;c--);
7
- if(0<=c){for(d=f.length-1;d>=c;d--)e.end&&e.end(f[d]);f.length=c}}var b,g,f=[],l=a;for(f.last=function(){return f[f.length-1]};a;){g=!0;if(f.last()&&y[f.last()])a=a.replace(RegExp("(.*)<\\s*\\/\\s*"+f.last()+"[^>]*>","i"),function(a,b){b=b.replace(I,"$1").replace(J,"$1");e.chars&&e.chars(r(b));return""}),c("",f.last());else{if(0===a.indexOf("\x3c!--"))b=a.indexOf("--",4),0<=b&&a.lastIndexOf("--\x3e",b)===b&&(e.comment&&e.comment(a.substring(4,b)),a=a.substring(b+3),g=!1);else if(z.test(a)){if(b=a.match(z))a=
8
- a.replace(b[0],""),g=!1}else if(K.test(a)){if(b=a.match(A))a=a.substring(b[0].length),b[0].replace(A,c),g=!1}else L.test(a)&&(b=a.match(B))&&(a=a.substring(b[0].length),b[0].replace(B,d),g=!1);g&&(b=a.indexOf("<"),g=0>b?a:a.substring(0,b),a=0>b?"":a.substring(b),e.chars&&e.chars(r(g)))}if(a==l)throw M("badparse",a);l=a}c()}function r(a){if(!a)return"";a=/^(\s*)([\s\S]*?)(\s*)$/.exec(a);a[0]="";a[2]&&(s.innerHTML=a[2].replace(/</g,"&lt;"),a[2]=s.innerText||s.textContent);return a.join("")}function C(a){return a.replace(/&/g,
9
- "&amp;").replace(N,function(a){return"&#"+a.charCodeAt(0)+";"}).replace(/</g,"&lt;").replace(/>/g,"&gt;")}function t(a,e){var d=!1,c=h.bind(a,a.push);return{start:function(a,g,f){a=h.lowercase(a);!d&&y[a]&&(d=a);d||!0!==D[a]||(c("<"),c(a),h.forEach(g,function(d,f){var g=h.lowercase(f),k="img"===a&&"src"===g||"background"===g;!0!==O[g]||!0===E[g]&&!e(d,k)||(c(" "),c(f),c('="'),c(C(d)),c('"'))}),c(f?"/>":">"))},end:function(a){a=h.lowercase(a);d||!0!==D[a]||(c("</"),c(a),c(">"));a==d&&(d=!1)},chars:function(a){d||
10
- c(C(a))}}}var M=h.$$minErr("$sanitize"),B=/^<\s*([\w:-]+)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*>/,A=/^<\s*\/\s*([\w:-]+)[^>]*>/,H=/([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g,L=/^</,K=/^<\s*\//,I=/\x3c!--(.*?)--\x3e/g,z=/<!DOCTYPE([^>]*?)>/i,J=/<!\[CDATA\[(.*?)]]\x3e/g,N=/([^\#-~| |!])/g,x=k("area,br,col,hr,img,wbr");n=k("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr");q=k("rp,rt");var w=h.extend({},q,n),u=h.extend({},n,k("address,article,aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,script,section,table,ul")),
11
- v=h.extend({},q,k("a,abbr,acronym,b,bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s,samp,small,span,strike,strong,sub,sup,time,tt,u,var")),y=k("script,style"),D=h.extend({},x,u,v,w),E=k("background,cite,href,longdesc,src,usemap"),O=h.extend({},E,k("abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,scope,scrolling,shape,span,start,summary,target,title,type,valign,value,vspace,width")),
12
- s=document.createElement("pre");h.module("ngSanitize",[]).provider("$sanitize",function(){this.$get=["$$sanitizeUri",function(a){return function(e){var d=[];G(e,t(d,function(c,b){return!/^unsafe/.test(a(c,b))}));return d.join("")}}]});h.module("ngSanitize").filter("linky",["$sanitize",function(a){var e=/((ftp|https?):\/\/|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>]/,d=/^mailto:/;return function(c,b){function g(a){a&&m.push(F(a))}function f(a,c){m.push("<a ");h.isDefined(b)&&(m.push('target="'),
13
- m.push(b),m.push('" '));m.push('href="');m.push(a);m.push('">');g(c);m.push("</a>")}if(!c)return c;for(var l,k=c,m=[],p,n;l=k.match(e);)p=l[0],l[2]==l[3]&&(p="mailto:"+p),n=l.index,g(k.substr(0,n)),f(p,l[0].replace(d,"")),k=k.substring(n+l[0].length);g(k);return a(m.join(""))}}])})(window,window.angular);
14
- //# sourceMappingURL=angular-sanitize.min.js.map
6
+ (function(p,h,q){'use strict';function E(a){var e=[];s(e,h.noop).chars(a);return e.join("")}function k(a){var e={};a=a.split(",");var d;for(d=0;d<a.length;d++)e[a[d]]=!0;return e}function F(a,e){function d(a,b,d,g){b=h.lowercase(b);if(t[b])for(;f.last()&&u[f.last()];)c("",f.last());v[b]&&f.last()==b&&c("",b);(g=w[b]||!!g)||f.push(b);var l={};d.replace(G,function(a,b,e,c,d){l[b]=r(e||c||d||"")});e.start&&e.start(b,l,g)}function c(a,b){var c=0,d;if(b=h.lowercase(b))for(c=f.length-1;0<=c&&f[c]!=b;c--);
7
+ if(0<=c){for(d=f.length-1;d>=c;d--)e.end&&e.end(f[d]);f.length=c}}var b,g,f=[],l=a;for(f.last=function(){return f[f.length-1]};a;){g=!0;if(f.last()&&x[f.last()])a=a.replace(RegExp("(.*)<\\s*\\/\\s*"+f.last()+"[^>]*>","i"),function(b,a){a=a.replace(H,"$1").replace(I,"$1");e.chars&&e.chars(r(a));return""}),c("",f.last());else{if(0===a.indexOf("\x3c!--"))b=a.indexOf("--",4),0<=b&&a.lastIndexOf("--\x3e",b)===b&&(e.comment&&e.comment(a.substring(4,b)),a=a.substring(b+3),g=!1);else if(y.test(a)){if(b=a.match(y))a=
8
+ a.replace(b[0],""),g=!1}else if(J.test(a)){if(b=a.match(z))a=a.substring(b[0].length),b[0].replace(z,c),g=!1}else K.test(a)&&(b=a.match(A))&&(a=a.substring(b[0].length),b[0].replace(A,d),g=!1);g&&(b=a.indexOf("<"),g=0>b?a:a.substring(0,b),a=0>b?"":a.substring(b),e.chars&&e.chars(r(g)))}if(a==l)throw L("badparse",a);l=a}c()}function r(a){if(!a)return"";var e=M.exec(a);a=e[1];var d=e[3];if(e=e[2])n.innerHTML=e.replace(/</g,"&lt;"),e="textContent"in n?n.textContent:n.innerText;return a+e+d}function B(a){return a.replace(/&/g,
9
+ "&amp;").replace(N,function(a){return"&#"+a.charCodeAt(0)+";"}).replace(/</g,"&lt;").replace(/>/g,"&gt;")}function s(a,e){var d=!1,c=h.bind(a,a.push);return{start:function(a,g,f){a=h.lowercase(a);!d&&x[a]&&(d=a);d||!0!==C[a]||(c("<"),c(a),h.forEach(g,function(d,f){var g=h.lowercase(f),k="img"===a&&"src"===g||"background"===g;!0!==O[g]||!0===D[g]&&!e(d,k)||(c(" "),c(f),c('="'),c(B(d)),c('"'))}),c(f?"/>":">"))},end:function(a){a=h.lowercase(a);d||!0!==C[a]||(c("</"),c(a),c(">"));a==d&&(d=!1)},chars:function(a){d||
10
+ c(B(a))}}}var L=h.$$minErr("$sanitize"),A=/^<\s*([\w:-]+)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*>/,z=/^<\s*\/\s*([\w:-]+)[^>]*>/,G=/([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g,K=/^</,J=/^<\s*\//,H=/\x3c!--(.*?)--\x3e/g,y=/<!DOCTYPE([^>]*?)>/i,I=/<!\[CDATA\[(.*?)]]\x3e/g,N=/([^\#-~| |!])/g,w=k("area,br,col,hr,img,wbr");p=k("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr");q=k("rp,rt");var v=h.extend({},q,p),t=h.extend({},p,k("address,article,aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,script,section,table,ul")),
11
+ u=h.extend({},q,k("a,abbr,acronym,b,bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s,samp,small,span,strike,strong,sub,sup,time,tt,u,var")),x=k("script,style"),C=h.extend({},w,t,u,v),D=k("background,cite,href,longdesc,src,usemap"),O=h.extend({},D,k("abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,scope,scrolling,shape,span,start,summary,target,title,type,valign,value,vspace,width")),
12
+ n=document.createElement("pre"),M=/^(\s*)([\s\S]*?)(\s*)$/;h.module("ngSanitize",[]).provider("$sanitize",function(){this.$get=["$$sanitizeUri",function(a){return function(e){var d=[];F(e,s(d,function(c,b){return!/^unsafe/.test(a(c,b))}));return d.join("")}}]});h.module("ngSanitize").filter("linky",["$sanitize",function(a){var e=/((ftp|https?):\/\/|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>]/,d=/^mailto:/;return function(c,b){function g(a){a&&m.push(E(a))}function f(a,c){m.push("<a ");h.isDefined(b)&&
13
+ (m.push('target="'),m.push(b),m.push('" '));m.push('href="');m.push(a);m.push('">');g(c);m.push("</a>")}if(!c)return c;for(var l,k=c,m=[],n,p;l=k.match(e);)n=l[0],l[2]==l[3]&&(n="mailto:"+n),p=l.index,g(k.substr(0,p)),f(n,l[0].replace(d,"")),k=k.substring(p+l[0].length);g(k);return a(m.join(""))}}])})(window,window.angular);
@@ -9790,7 +9790,7 @@ if ( typeof module === "object" && module && typeof module.exports === "object"
9790
9790
  })( window );
9791
9791
 
9792
9792
  /**
9793
- * @license AngularJS v1.2.3
9793
+ * @license AngularJS v1.2.5
9794
9794
  * (c) 2010-2014 Google, Inc. http://angularjs.org
9795
9795
  * License: MIT
9796
9796
  */
@@ -9860,7 +9860,7 @@ function minErr(module) {
9860
9860
  return match;
9861
9861
  });
9862
9862
 
9863
- message = message + '\nhttp://errors.angularjs.org/1.2.3/' +
9863
+ message = message + '\nhttp://errors.angularjs.org/1.2.5/' +
9864
9864
  (module ? module + '/' : '') + code;
9865
9865
  for (i = 2; i < arguments.length; i++) {
9866
9866
  message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
@@ -10264,7 +10264,7 @@ function valueFn(value) {return function() {return value;};}
10264
10264
  * @param {*} value Reference to check.
10265
10265
  * @returns {boolean} True if `value` is undefined.
10266
10266
  */
10267
- function isUndefined(value){return typeof value == 'undefined';}
10267
+ function isUndefined(value){return typeof value === 'undefined';}
10268
10268
 
10269
10269
 
10270
10270
  /**
@@ -10278,7 +10278,7 @@ function isUndefined(value){return typeof value == 'undefined';}
10278
10278
  * @param {*} value Reference to check.
10279
10279
  * @returns {boolean} True if `value` is defined.
10280
10280
  */
10281
- function isDefined(value){return typeof value != 'undefined';}
10281
+ function isDefined(value){return typeof value !== 'undefined';}
10282
10282
 
10283
10283
 
10284
10284
  /**
@@ -10293,7 +10293,7 @@ function isDefined(value){return typeof value != 'undefined';}
10293
10293
  * @param {*} value Reference to check.
10294
10294
  * @returns {boolean} True if `value` is an `Object` but not `null`.
10295
10295
  */
10296
- function isObject(value){return value != null && typeof value == 'object';}
10296
+ function isObject(value){return value != null && typeof value === 'object';}
10297
10297
 
10298
10298
 
10299
10299
  /**
@@ -10307,7 +10307,7 @@ function isObject(value){return value != null && typeof value == 'object';}
10307
10307
  * @param {*} value Reference to check.
10308
10308
  * @returns {boolean} True if `value` is a `String`.
10309
10309
  */
10310
- function isString(value){return typeof value == 'string';}
10310
+ function isString(value){return typeof value === 'string';}
10311
10311
 
10312
10312
 
10313
10313
  /**
@@ -10321,7 +10321,7 @@ function isString(value){return typeof value == 'string';}
10321
10321
  * @param {*} value Reference to check.
10322
10322
  * @returns {boolean} True if `value` is a `Number`.
10323
10323
  */
10324
- function isNumber(value){return typeof value == 'number';}
10324
+ function isNumber(value){return typeof value === 'number';}
10325
10325
 
10326
10326
 
10327
10327
  /**
@@ -10336,7 +10336,7 @@ function isNumber(value){return typeof value == 'number';}
10336
10336
  * @returns {boolean} True if `value` is a `Date`.
10337
10337
  */
10338
10338
  function isDate(value){
10339
- return toString.apply(value) == '[object Date]';
10339
+ return toString.call(value) === '[object Date]';
10340
10340
  }
10341
10341
 
10342
10342
 
@@ -10352,7 +10352,7 @@ function isDate(value){
10352
10352
  * @returns {boolean} True if `value` is an `Array`.
10353
10353
  */
10354
10354
  function isArray(value) {
10355
- return toString.apply(value) == '[object Array]';
10355
+ return toString.call(value) === '[object Array]';
10356
10356
  }
10357
10357
 
10358
10358
 
@@ -10367,7 +10367,7 @@ function isArray(value) {
10367
10367
  * @param {*} value Reference to check.
10368
10368
  * @returns {boolean} True if `value` is a `Function`.
10369
10369
  */
10370
- function isFunction(value){return typeof value == 'function';}
10370
+ function isFunction(value){return typeof value === 'function';}
10371
10371
 
10372
10372
 
10373
10373
  /**
@@ -10378,7 +10378,7 @@ function isFunction(value){return typeof value == 'function';}
10378
10378
  * @returns {boolean} True if `value` is a `RegExp`.
10379
10379
  */
10380
10380
  function isRegExp(value) {
10381
- return toString.apply(value) == '[object RegExp]';
10381
+ return toString.call(value) === '[object RegExp]';
10382
10382
  }
10383
10383
 
10384
10384
 
@@ -10400,12 +10400,12 @@ function isScope(obj) {
10400
10400
 
10401
10401
 
10402
10402
  function isFile(obj) {
10403
- return toString.apply(obj) === '[object File]';
10403
+ return toString.call(obj) === '[object File]';
10404
10404
  }
10405
10405
 
10406
10406
 
10407
10407
  function isBoolean(value) {
10408
- return typeof value == 'boolean';
10408
+ return typeof value === 'boolean';
10409
10409
  }
10410
10410
 
10411
10411
 
@@ -10436,9 +10436,9 @@ var trim = (function() {
10436
10436
  * @returns {boolean} True if `value` is a DOM element (or wrapped jQuery element).
10437
10437
  */
10438
10438
  function isElement(node) {
10439
- return node &&
10439
+ return !!(node &&
10440
10440
  (node.nodeName // we are a direct element
10441
- || (node.on && node.find)); // we have an on and find method part of jQuery API
10441
+ || (node.on && node.find))); // we have an on and find method part of jQuery API
10442
10442
  }
10443
10443
 
10444
10444
  /**
@@ -10509,7 +10509,7 @@ function includes(array, obj) {
10509
10509
  function indexOf(array, obj) {
10510
10510
  if (array.indexOf) return array.indexOf(obj);
10511
10511
 
10512
- for ( var i = 0; i < array.length; i++) {
10512
+ for (var i = 0; i < array.length; i++) {
10513
10513
  if (obj === array[i]) return i;
10514
10514
  }
10515
10515
  return -1;
@@ -10639,7 +10639,7 @@ function shallowCopy(src, dst) {
10639
10639
 
10640
10640
  for(var key in src) {
10641
10641
  // shallowCopy is only ever called by $compile nodeLinkFn, which has control over src
10642
- // so we don't need to worry hasOwnProperty here
10642
+ // so we don't need to worry about using our custom hasOwnProperty here
10643
10643
  if (src.hasOwnProperty(key) && key.substr(0, 2) !== '$$') {
10644
10644
  dst[key] = src[key];
10645
10645
  }
@@ -10845,7 +10845,7 @@ function startingTag(element) {
10845
10845
  try {
10846
10846
  // turns out IE does not let you set .html() on elements which
10847
10847
  // are not allowed to have children. So we just ignore it.
10848
- element.html('');
10848
+ element.empty();
10849
10849
  } catch(e) {}
10850
10850
  // As Per DOM Standards
10851
10851
  var TEXT_NODE = 3;
@@ -11201,23 +11201,25 @@ function getter(obj, path, bindFnToScope) {
11201
11201
  }
11202
11202
 
11203
11203
  /**
11204
- * Return the siblings between `startNode` and `endNode`, inclusive
11205
- * @param {Object} object with `startNode` and `endNode` properties
11204
+ * Return the DOM siblings between the first and last node in the given array.
11205
+ * @param {Array} array like object
11206
11206
  * @returns jQlite object containing the elements
11207
11207
  */
11208
- function getBlockElements(block) {
11209
- if (block.startNode === block.endNode) {
11210
- return jqLite(block.startNode);
11208
+ function getBlockElements(nodes) {
11209
+ var startNode = nodes[0],
11210
+ endNode = nodes[nodes.length - 1];
11211
+ if (startNode === endNode) {
11212
+ return jqLite(startNode);
11211
11213
  }
11212
11214
 
11213
- var element = block.startNode;
11215
+ var element = startNode;
11214
11216
  var elements = [element];
11215
11217
 
11216
11218
  do {
11217
11219
  element = element.nextSibling;
11218
11220
  if (!element) break;
11219
11221
  elements.push(element);
11220
- } while (element !== block.endNode);
11222
+ } while (element !== endNode);
11221
11223
 
11222
11224
  return jqLite(elements);
11223
11225
  }
@@ -11557,6 +11559,7 @@ function setupModuleLoader(window) {
11557
11559
  ngHideDirective,
11558
11560
  ngIfDirective,
11559
11561
  ngIncludeDirective,
11562
+ ngIncludeFillContentDirective,
11560
11563
  ngInitDirective,
11561
11564
  ngNonBindableDirective,
11562
11565
  ngPluralizeDirective,
@@ -11618,11 +11621,11 @@ function setupModuleLoader(window) {
11618
11621
  * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
11619
11622
  */
11620
11623
  var version = {
11621
- full: '1.2.3', // all of these placeholder strings will be replaced by grunt's
11624
+ full: '1.2.5', // all of these placeholder strings will be replaced by grunt's
11622
11625
  major: 1, // package task
11623
11626
  minor: 2,
11624
- dot: 3,
11625
- codeName: 'unicorn-zapper'
11627
+ dot: 5,
11628
+ codeName: 'singularity-expansion'
11626
11629
  };
11627
11630
 
11628
11631
 
@@ -11710,6 +11713,9 @@ function publishExternalAPI(angular){
11710
11713
  ngRequired: requiredDirective,
11711
11714
  ngValue: ngValueDirective
11712
11715
  }).
11716
+ directive({
11717
+ ngInclude: ngIncludeFillContentDirective
11718
+ }).
11713
11719
  directive(ngAttributeAliasDirectives).
11714
11720
  directive(ngEventDirectives);
11715
11721
  $provide.provider({
@@ -11787,6 +11793,7 @@ function publishExternalAPI(angular){
11787
11793
  * - [`contents()`](http://api.jquery.com/contents/)
11788
11794
  * - [`css()`](http://api.jquery.com/css/)
11789
11795
  * - [`data()`](http://api.jquery.com/data/)
11796
+ * - [`empty()`](http://api.jquery.com/empty/)
11790
11797
  * - [`eq()`](http://api.jquery.com/eq/)
11791
11798
  * - [`find()`](http://api.jquery.com/find/) - Limited to lookups by tag name
11792
11799
  * - [`hasClass()`](http://api.jquery.com/hasClass/)
@@ -12099,6 +12106,15 @@ function jqLiteInheritedData(element, name, value) {
12099
12106
  }
12100
12107
  }
12101
12108
 
12109
+ function jqLiteEmpty(element) {
12110
+ for (var i = 0, childNodes = element.childNodes; i < childNodes.length; i++) {
12111
+ jqLiteDealoc(childNodes[i]);
12112
+ }
12113
+ while (element.firstChild) {
12114
+ element.removeChild(element.firstChild);
12115
+ }
12116
+ }
12117
+
12102
12118
  //////////////////////////////////////////
12103
12119
  // Functions which are declared directly.
12104
12120
  //////////////////////////////////////////
@@ -12293,7 +12309,9 @@ forEach({
12293
12309
  jqLiteDealoc(childNodes[i]);
12294
12310
  }
12295
12311
  element.innerHTML = value;
12296
- }
12312
+ },
12313
+
12314
+ empty: jqLiteEmpty
12297
12315
  }, function(fn, name){
12298
12316
  /**
12299
12317
  * Properties: writes return selection, reads return first value
@@ -12303,11 +12321,13 @@ forEach({
12303
12321
 
12304
12322
  // jqLiteHasClass has only two arguments, but is a getter-only fn, so we need to special-case it
12305
12323
  // in a way that survives minification.
12306
- if (((fn.length == 2 && (fn !== jqLiteHasClass && fn !== jqLiteController)) ? arg1 : arg2) === undefined) {
12324
+ // jqLiteEmpty takes no arguments but is a setter.
12325
+ if (fn !== jqLiteEmpty &&
12326
+ (((fn.length == 2 && (fn !== jqLiteHasClass && fn !== jqLiteController)) ? arg1 : arg2) === undefined)) {
12307
12327
  if (isObject(arg1)) {
12308
12328
 
12309
12329
  // we are a write, but the object properties are the key/values
12310
- for(i=0; i < this.length; i++) {
12330
+ for (i = 0; i < this.length; i++) {
12311
12331
  if (fn === jqLiteData) {
12312
12332
  // data() takes the whole object in jQuery
12313
12333
  fn(this[i], arg1);
@@ -12332,7 +12352,7 @@ forEach({
12332
12352
  }
12333
12353
  } else {
12334
12354
  // we are a write, so apply to all children
12335
- for(i=0; i < this.length; i++) {
12355
+ for (i = 0; i < this.length; i++) {
12336
12356
  fn(this[i], arg1, arg2);
12337
12357
  }
12338
12358
  // return self for chaining
@@ -12563,7 +12583,11 @@ forEach({
12563
12583
  },
12564
12584
 
12565
12585
  find: function(element, selector) {
12566
- return element.getElementsByTagName(selector);
12586
+ if (element.getElementsByTagName) {
12587
+ return element.getElementsByTagName(selector);
12588
+ } else {
12589
+ return [];
12590
+ }
12567
12591
  },
12568
12592
 
12569
12593
  clone: jqLiteClone,
@@ -12699,6 +12723,28 @@ HashMap.prototype = {
12699
12723
  * $rootScope.$digest();
12700
12724
  * });
12701
12725
  * </pre>
12726
+ *
12727
+ * Sometimes you want to get access to the injector of a currently running Angular app
12728
+ * from outside Angular. Perhaps, you want to inject and compile some markup after the
12729
+ * application has been bootstrapped. You can do this using extra `injector()` added
12730
+ * to JQuery/jqLite elements. See {@link angular.element}.
12731
+ *
12732
+ * *This is fairly rare but could be the case if a third party library is injecting the
12733
+ * markup.*
12734
+ *
12735
+ * In the following example a new block of HTML containing a `ng-controller`
12736
+ * directive is added to the end of the document body by JQuery. We then compile and link
12737
+ * it into the current AngularJS scope.
12738
+ *
12739
+ * <pre>
12740
+ * var $div = $('<div ng-controller="MyCtrl">{{content.label}}</div>');
12741
+ * $(document.body).append($div);
12742
+ *
12743
+ * angular.element(document).injector().invoke(function($compile) {
12744
+ * var scope = angular.element($div).scope();
12745
+ * $compile($div)(scope);
12746
+ * });
12747
+ * </pre>
12702
12748
  */
12703
12749
 
12704
12750
 
@@ -12893,7 +12939,7 @@ function annotate(fn) {
12893
12939
  * // ...
12894
12940
  * }
12895
12941
  * // Define function dependencies
12896
- * MyController.$inject = ['$scope', '$route'];
12942
+ * MyController['$inject'] = ['$scope', '$route'];
12897
12943
  *
12898
12944
  * // Then
12899
12945
  * expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);
@@ -13419,24 +13465,9 @@ function createInjector(modulesToLoad) {
13419
13465
  fn = fn[length];
13420
13466
  }
13421
13467
 
13422
-
13423
- // Performance optimization: http://jsperf.com/apply-vs-call-vs-invoke
13424
- switch (self ? -1 : args.length) {
13425
- case 0: return fn();
13426
- case 1: return fn(args[0]);
13427
- case 2: return fn(args[0], args[1]);
13428
- case 3: return fn(args[0], args[1], args[2]);
13429
- case 4: return fn(args[0], args[1], args[2], args[3]);
13430
- case 5: return fn(args[0], args[1], args[2], args[3], args[4]);
13431
- case 6: return fn(args[0], args[1], args[2], args[3], args[4], args[5]);
13432
- case 7: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
13433
- case 8: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7]);
13434
- case 9: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7],
13435
- args[8]);
13436
- case 10: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7],
13437
- args[8], args[9]);
13438
- default: return fn.apply(self, args);
13439
- }
13468
+ // http://jsperf.com/angularjs-invoke-apply-vs-switch
13469
+ // #5388
13470
+ return fn.apply(self, args);
13440
13471
  }
13441
13472
 
13442
13473
  function instantiate(Type, locals) {
@@ -14595,7 +14626,7 @@ function $TemplateCacheProvider() {
14595
14626
  * * (no prefix) - Locate the required controller on the current element. Throw an error if not found.
14596
14627
  * * `?` - Attempt to locate the required controller or pass `null` to the `link` fn if not found.
14597
14628
  * * `^` - Locate the required controller by searching the element's parents. Throw an error if not found.
14598
- * * `?^` - Attempt to locate the required controller by searching the element's parentsor pass `null` to the
14629
+ * * `?^` - Attempt to locate the required controller by searching the element's parents or pass `null` to the
14599
14630
  * `link` fn if not found.
14600
14631
  *
14601
14632
  *
@@ -15334,7 +15365,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
15334
15365
  createBoundTranscludeFn(scope, childTranscludeFn || transcludeFn)
15335
15366
  );
15336
15367
  } else {
15337
- nodeLinkFn(childLinkFn, childScope, node, undefined, boundTranscludeFn);
15368
+ nodeLinkFn(childLinkFn, childScope, node, $rootElement, boundTranscludeFn);
15338
15369
  }
15339
15370
  } else if (childLinkFn) {
15340
15371
  childLinkFn(scope, node.childNodes, undefined, boundTranscludeFn);
@@ -15622,7 +15653,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
15622
15653
  });
15623
15654
  } else {
15624
15655
  $template = jqLite(jqLiteClone(compileNode)).contents();
15625
- $compileNode.html(''); // clear contents
15656
+ $compileNode.empty(); // clear contents
15626
15657
  childTranscludeFn = compile($template, transcludeFn);
15627
15658
  }
15628
15659
  }
@@ -15803,7 +15834,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
15803
15834
  optional = (match[2] == '?'),
15804
15835
  mode = match[1], // @, =, or &
15805
15836
  lastValue,
15806
- parentGet, parentSet;
15837
+ parentGet, parentSet, compare;
15807
15838
 
15808
15839
  isolateScope.$$isolateBindings[scopeName] = mode + attrName;
15809
15840
 
@@ -15826,6 +15857,11 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
15826
15857
  return;
15827
15858
  }
15828
15859
  parentGet = $parse(attrs[attrName]);
15860
+ if (parentGet.literal) {
15861
+ compare = equals;
15862
+ } else {
15863
+ compare = function(a,b) { return a === b; };
15864
+ }
15829
15865
  parentSet = parentGet.assign || function() {
15830
15866
  // reset the change, or we will throw this exception on every $digest
15831
15867
  lastValue = isolateScope[scopeName] = parentGet(scope);
@@ -15836,19 +15872,18 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
15836
15872
  lastValue = isolateScope[scopeName] = parentGet(scope);
15837
15873
  isolateScope.$watch(function parentValueWatch() {
15838
15874
  var parentValue = parentGet(scope);
15839
-
15840
- if (parentValue !== isolateScope[scopeName]) {
15875
+ if (!compare(parentValue, isolateScope[scopeName])) {
15841
15876
  // we are out of sync and need to copy
15842
- if (parentValue !== lastValue) {
15877
+ if (!compare(parentValue, lastValue)) {
15843
15878
  // parent changed and it has precedence
15844
- lastValue = isolateScope[scopeName] = parentValue;
15879
+ isolateScope[scopeName] = parentValue;
15845
15880
  } else {
15846
15881
  // if the parent can be assigned then do so
15847
- parentSet(scope, parentValue = lastValue = isolateScope[scopeName]);
15882
+ parentSet(scope, parentValue = isolateScope[scopeName]);
15848
15883
  }
15849
15884
  }
15850
- return parentValue;
15851
- });
15885
+ return lastValue = parentValue;
15886
+ }, null, parentGet.literal);
15852
15887
  break;
15853
15888
 
15854
15889
  case '&':
@@ -16050,7 +16085,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
16050
16085
  ? origAsyncDirective.templateUrl($compileNode, tAttrs)
16051
16086
  : origAsyncDirective.templateUrl;
16052
16087
 
16053
- $compileNode.html('');
16088
+ $compileNode.empty();
16054
16089
 
16055
16090
  $http.get($sce.getTrustedResourceUrl(templateUrl), {cache: $templateCache}).
16056
16091
  success(function(content) {
@@ -17840,8 +17875,8 @@ function $InterpolateProvider() {
17840
17875
  *
17841
17876
  <pre>
17842
17877
  var $interpolate = ...; // injected
17843
- var exp = $interpolate('Hello {{name}}!');
17844
- expect(exp({name:'Angular'}).toEqual('Hello Angular!');
17878
+ var exp = $interpolate('Hello {{name | uppercase}}!');
17879
+ expect(exp({name:'Angular'}).toEqual('Hello ANGULAR!');
17845
17880
  </pre>
17846
17881
  *
17847
17882
  *
@@ -19039,23 +19074,24 @@ function ensureSafeMemberName(name, fullExpression) {
19039
19074
 
19040
19075
  function ensureSafeObject(obj, fullExpression) {
19041
19076
  // nifty check if obj is Function that is fast and works across iframes and other contexts
19042
- if (obj && obj.constructor === obj) {
19043
- throw $parseMinErr('isecfn',
19044
- 'Referencing Function in Angular expressions is disallowed! Expression: {0}',
19045
- fullExpression);
19046
- } else if (// isWindow(obj)
19047
- obj && obj.document && obj.location && obj.alert && obj.setInterval) {
19048
- throw $parseMinErr('isecwindow',
19049
- 'Referencing the Window in Angular expressions is disallowed! Expression: {0}',
19050
- fullExpression);
19051
- } else if (// isElement(obj)
19052
- obj && (obj.nodeName || (obj.on && obj.find))) {
19053
- throw $parseMinErr('isecdom',
19054
- 'Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}',
19055
- fullExpression);
19056
- } else {
19057
- return obj;
19077
+ if (obj) {
19078
+ if (obj.constructor === obj) {
19079
+ throw $parseMinErr('isecfn',
19080
+ 'Referencing Function in Angular expressions is disallowed! Expression: {0}',
19081
+ fullExpression);
19082
+ } else if (// isWindow(obj)
19083
+ obj.document && obj.location && obj.alert && obj.setInterval) {
19084
+ throw $parseMinErr('isecwindow',
19085
+ 'Referencing the Window in Angular expressions is disallowed! Expression: {0}',
19086
+ fullExpression);
19087
+ } else if (// isElement(obj)
19088
+ obj.children && (obj.nodeName || (obj.on && obj.find))) {
19089
+ throw $parseMinErr('isecdom',
19090
+ 'Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}',
19091
+ fullExpression);
19092
+ }
19058
19093
  }
19094
+ return obj;
19059
19095
  }
19060
19096
 
19061
19097
  var OPERATORS = {
@@ -20364,7 +20400,7 @@ function $ParseProvider() {
20364
20400
  *
20365
20401
  * # Differences between Kris Kowal's Q and $q
20366
20402
  *
20367
- * There are three main differences:
20403
+ * There are two main differences:
20368
20404
  *
20369
20405
  * - $q is integrated with the {@link ng.$rootScope.Scope} Scope model observation
20370
20406
  * mechanism in angular, which means faster propagation of resolution or rejection into your
@@ -20813,6 +20849,7 @@ function qFactory(nextTick, exceptionHandler) {
20813
20849
  function $RootScopeProvider(){
20814
20850
  var TTL = 10;
20815
20851
  var $rootScopeMinErr = minErr('$rootScope');
20852
+ var lastDirtyWatch = null;
20816
20853
 
20817
20854
  this.digestTtl = function(value) {
20818
20855
  if (arguments.length) {
@@ -20897,11 +20934,11 @@ function $RootScopeProvider(){
20897
20934
  * @description
20898
20935
  * Creates a new child {@link ng.$rootScope.Scope scope}.
20899
20936
  *
20900
- * The parent scope will propagate the {@link ng.$rootScope.Scope#$digest $digest()} and
20901
- * {@link ng.$rootScope.Scope#$digest $digest()} events. The scope can be removed from the
20902
- * scope hierarchy using {@link ng.$rootScope.Scope#$destroy $destroy()}.
20937
+ * The parent scope will propagate the {@link ng.$rootScope.Scope#methods_$digest $digest()} and
20938
+ * {@link ng.$rootScope.Scope#methods_$digest $digest()} events. The scope can be removed from the
20939
+ * scope hierarchy using {@link ng.$rootScope.Scope#methods_$destroy $destroy()}.
20903
20940
  *
20904
- * {@link ng.$rootScope.Scope#$destroy $destroy()} must be called on a scope when it is
20941
+ * {@link ng.$rootScope.Scope#methods_$destroy $destroy()} must be called on a scope when it is
20905
20942
  * desired for the scope and its child scopes to be permanently detached from the parent and
20906
20943
  * thus stop participating in model change detection and listener notification by invoking.
20907
20944
  *
@@ -20914,7 +20951,7 @@ function $RootScopeProvider(){
20914
20951
  *
20915
20952
  */
20916
20953
  $new: function(isolate) {
20917
- var Child,
20954
+ var ChildScope,
20918
20955
  child;
20919
20956
 
20920
20957
  if (isolate) {
@@ -20924,11 +20961,11 @@ function $RootScopeProvider(){
20924
20961
  child.$$asyncQueue = this.$$asyncQueue;
20925
20962
  child.$$postDigestQueue = this.$$postDigestQueue;
20926
20963
  } else {
20927
- Child = function() {}; // should be anonymous; This is so that when the minifier munges
20964
+ ChildScope = function() {}; // should be anonymous; This is so that when the minifier munges
20928
20965
  // the name it does not become random set of chars. This will then show up as class
20929
20966
  // name in the debugger.
20930
- Child.prototype = this;
20931
- child = new Child();
20967
+ ChildScope.prototype = this;
20968
+ child = new ChildScope();
20932
20969
  child.$id = nextUid();
20933
20970
  }
20934
20971
  child['this'] = child;
@@ -20954,11 +20991,11 @@ function $RootScopeProvider(){
20954
20991
  * @description
20955
20992
  * Registers a `listener` callback to be executed whenever the `watchExpression` changes.
20956
20993
  *
20957
- * - The `watchExpression` is called on every call to {@link ng.$rootScope.Scope#$digest
20994
+ * - The `watchExpression` is called on every call to {@link ng.$rootScope.Scope#methods_$digest
20958
20995
  * $digest()} and should return the value that will be watched. (Since
20959
- * {@link ng.$rootScope.Scope#$digest $digest()} reruns when it detects changes the
20996
+ * {@link ng.$rootScope.Scope#methods_$digest $digest()} reruns when it detects changes the
20960
20997
  * `watchExpression` can execute multiple times per
20961
- * {@link ng.$rootScope.Scope#$digest $digest()} and should be idempotent.)
20998
+ * {@link ng.$rootScope.Scope#methods_$digest $digest()} and should be idempotent.)
20962
20999
  * - The `listener` is called only when the value from the current `watchExpression` and the
20963
21000
  * previous call to `watchExpression` are not equal (with the exception of the initial run,
20964
21001
  * see below). The inequality is determined according to
@@ -20970,13 +21007,13 @@ function $RootScopeProvider(){
20970
21007
  * iteration limit is 10 to prevent an infinite loop deadlock.
20971
21008
  *
20972
21009
  *
20973
- * If you want to be notified whenever {@link ng.$rootScope.Scope#$digest $digest} is called,
21010
+ * If you want to be notified whenever {@link ng.$rootScope.Scope#methods_$digest $digest} is called,
20974
21011
  * you can register a `watchExpression` function with no `listener`. (Since `watchExpression`
20975
- * can execute multiple times per {@link ng.$rootScope.Scope#$digest $digest} cycle when a
21012
+ * can execute multiple times per {@link ng.$rootScope.Scope#methods_$digest $digest} cycle when a
20976
21013
  * change is detected, be prepared for multiple calls to your listener.)
20977
21014
  *
20978
21015
  * After a watcher is registered with the scope, the `listener` fn is called asynchronously
20979
- * (via {@link ng.$rootScope.Scope#$evalAsync $evalAsync}) to initialize the
21016
+ * (via {@link ng.$rootScope.Scope#methods_$evalAsync $evalAsync}) to initialize the
20980
21017
  * watcher. In rare cases, this is undesirable because the listener is called when the result
20981
21018
  * of `watchExpression` didn't change. To detect this scenario within the `listener` fn, you
20982
21019
  * can compare the `newVal` and `oldVal`. If these two values are identical (`===`) then the
@@ -21008,7 +21045,7 @@ function $RootScopeProvider(){
21008
21045
 
21009
21046
 
21010
21047
 
21011
- // Using a listener function
21048
+ // Using a listener function
21012
21049
  var food;
21013
21050
  scope.foodCounter = 0;
21014
21051
  expect(scope.foodCounter).toEqual(0);
@@ -21033,14 +21070,14 @@ function $RootScopeProvider(){
21033
21070
  // Update food and run digest. Now the counter will increment
21034
21071
  food = 'cheeseburger';
21035
21072
  scope.$digest();
21036
- expect(scope.foodCounter).toEqual(1);
21073
+ expect(scope.foodCounter).toEqual(1);
21037
21074
 
21038
21075
  * </pre>
21039
21076
  *
21040
21077
  *
21041
21078
  *
21042
21079
  * @param {(function()|string)} watchExpression Expression that is evaluated on each
21043
- * {@link ng.$rootScope.Scope#$digest $digest} cycle. A change in the return value triggers
21080
+ * {@link ng.$rootScope.Scope#methods_$digest $digest} cycle. A change in the return value triggers
21044
21081
  * a call to the `listener`.
21045
21082
  *
21046
21083
  * - `string`: Evaluated as {@link guide/expression expression}
@@ -21067,6 +21104,8 @@ function $RootScopeProvider(){
21067
21104
  eq: !!objectEquality
21068
21105
  };
21069
21106
 
21107
+ lastDirtyWatch = null;
21108
+
21070
21109
  // in the case user pass string, we need to compile it, do we really need this ?
21071
21110
  if (!isFunction(listener)) {
21072
21111
  var listenFn = compileToFn(listener || noop, 'listener');
@@ -21136,7 +21175,7 @@ function $RootScopeProvider(){
21136
21175
  *
21137
21176
  * @param {string|Function(scope)} obj Evaluated as {@link guide/expression expression}. The
21138
21177
  * expression value should evaluate to an object or an array which is observed on each
21139
- * {@link ng.$rootScope.Scope#$digest $digest} cycle. Any shallow change within the
21178
+ * {@link ng.$rootScope.Scope#methods_$digest $digest} cycle. Any shallow change within the
21140
21179
  * collection will trigger a call to the `listener`.
21141
21180
  *
21142
21181
  * @param {function(newCollection, oldCollection, scope)} listener a callback function that is
@@ -21241,9 +21280,9 @@ function $RootScopeProvider(){
21241
21280
  * @function
21242
21281
  *
21243
21282
  * @description
21244
- * Processes all of the {@link ng.$rootScope.Scope#$watch watchers} of the current scope and
21245
- * its children. Because a {@link ng.$rootScope.Scope#$watch watcher}'s listener can change
21246
- * the model, the `$digest()` keeps calling the {@link ng.$rootScope.Scope#$watch watchers}
21283
+ * Processes all of the {@link ng.$rootScope.Scope#methods_$watch watchers} of the current scope and
21284
+ * its children. Because a {@link ng.$rootScope.Scope#methods_$watch watcher}'s listener can change
21285
+ * the model, the `$digest()` keeps calling the {@link ng.$rootScope.Scope#methods_$watch watchers}
21247
21286
  * until no more listeners are firing. This means that it is possible to get into an infinite
21248
21287
  * loop. This function will throw `'Maximum iteration limit exceeded.'` if the number of
21249
21288
  * iterations exceeds 10.
@@ -21251,12 +21290,12 @@ function $RootScopeProvider(){
21251
21290
  * Usually, you don't call `$digest()` directly in
21252
21291
  * {@link ng.directive:ngController controllers} or in
21253
21292
  * {@link ng.$compileProvider#methods_directive directives}.
21254
- * Instead, you should call {@link ng.$rootScope.Scope#$apply $apply()} (typically from within
21293
+ * Instead, you should call {@link ng.$rootScope.Scope#methods_$apply $apply()} (typically from within
21255
21294
  * a {@link ng.$compileProvider#methods_directive directives}), which will force a `$digest()`.
21256
21295
  *
21257
21296
  * If you want to be notified whenever `$digest()` is called,
21258
21297
  * you can register a `watchExpression` function with
21259
- * {@link ng.$rootScope.Scope#$watch $watch()} with no `listener`.
21298
+ * {@link ng.$rootScope.Scope#methods_$watch $watch()} with no `listener`.
21260
21299
  *
21261
21300
  * In unit tests, you may need to call `$digest()` to simulate the scope life cycle.
21262
21301
  *
@@ -21295,6 +21334,8 @@ function $RootScopeProvider(){
21295
21334
 
21296
21335
  beginPhase('$digest');
21297
21336
 
21337
+ lastDirtyWatch = null;
21338
+
21298
21339
  do { // "while dirty" loop
21299
21340
  dirty = false;
21300
21341
  current = target;
@@ -21304,10 +21345,13 @@ function $RootScopeProvider(){
21304
21345
  asyncTask = asyncQueue.shift();
21305
21346
  asyncTask.scope.$eval(asyncTask.expression);
21306
21347
  } catch (e) {
21348
+ clearPhase();
21307
21349
  $exceptionHandler(e);
21308
21350
  }
21351
+ lastDirtyWatch = null;
21309
21352
  }
21310
21353
 
21354
+ traverseScopesLoop:
21311
21355
  do { // "traverse the scopes" loop
21312
21356
  if ((watchers = current.$$watchers)) {
21313
21357
  // process our watches
@@ -21317,25 +21361,34 @@ function $RootScopeProvider(){
21317
21361
  watch = watchers[length];
21318
21362
  // Most common watches are on primitives, in which case we can short
21319
21363
  // circuit it with === operator, only when === fails do we use .equals
21320
- if (watch && (value = watch.get(current)) !== (last = watch.last) &&
21321
- !(watch.eq
21322
- ? equals(value, last)
21323
- : (typeof value == 'number' && typeof last == 'number'
21324
- && isNaN(value) && isNaN(last)))) {
21325
- dirty = true;
21326
- watch.last = watch.eq ? copy(value) : value;
21327
- watch.fn(value, ((last === initWatchVal) ? value : last), current);
21328
- if (ttl < 5) {
21329
- logIdx = 4 - ttl;
21330
- if (!watchLog[logIdx]) watchLog[logIdx] = [];
21331
- logMsg = (isFunction(watch.exp))
21332
- ? 'fn: ' + (watch.exp.name || watch.exp.toString())
21333
- : watch.exp;
21334
- logMsg += '; newVal: ' + toJson(value) + '; oldVal: ' + toJson(last);
21335
- watchLog[logIdx].push(logMsg);
21364
+ if (watch) {
21365
+ if ((value = watch.get(current)) !== (last = watch.last) &&
21366
+ !(watch.eq
21367
+ ? equals(value, last)
21368
+ : (typeof value == 'number' && typeof last == 'number'
21369
+ && isNaN(value) && isNaN(last)))) {
21370
+ dirty = true;
21371
+ lastDirtyWatch = watch;
21372
+ watch.last = watch.eq ? copy(value) : value;
21373
+ watch.fn(value, ((last === initWatchVal) ? value : last), current);
21374
+ if (ttl < 5) {
21375
+ logIdx = 4 - ttl;
21376
+ if (!watchLog[logIdx]) watchLog[logIdx] = [];
21377
+ logMsg = (isFunction(watch.exp))
21378
+ ? 'fn: ' + (watch.exp.name || watch.exp.toString())
21379
+ : watch.exp;
21380
+ logMsg += '; newVal: ' + toJson(value) + '; oldVal: ' + toJson(last);
21381
+ watchLog[logIdx].push(logMsg);
21382
+ }
21383
+ } else if (watch === lastDirtyWatch) {
21384
+ // If the most recently dirty watcher is now clean, short circuit since the remaining watchers
21385
+ // have already been tested.
21386
+ dirty = false;
21387
+ break traverseScopesLoop;
21336
21388
  }
21337
21389
  }
21338
21390
  } catch (e) {
21391
+ clearPhase();
21339
21392
  $exceptionHandler(e);
21340
21393
  }
21341
21394
  }
@@ -21344,13 +21397,16 @@ function $RootScopeProvider(){
21344
21397
  // Insanity Warning: scope depth-first traversal
21345
21398
  // yes, this code is a bit crazy, but it works and we have tests to prove it!
21346
21399
  // this piece should be kept in sync with the traversal in $broadcast
21347
- if (!(next = (current.$$childHead || (current !== target && current.$$nextSibling)))) {
21400
+ if (!(next = (current.$$childHead ||
21401
+ (current !== target && current.$$nextSibling)))) {
21348
21402
  while(current !== target && !(next = current.$$nextSibling)) {
21349
21403
  current = current.$parent;
21350
21404
  }
21351
21405
  }
21352
21406
  } while ((current = next));
21353
21407
 
21408
+ // `break traverseScopesLoop;` takes us to here
21409
+
21354
21410
  if(dirty && !(ttl--)) {
21355
21411
  clearPhase();
21356
21412
  throw $rootScopeMinErr('infdig',
@@ -21358,6 +21414,7 @@ function $RootScopeProvider(){
21358
21414
  'Watchers fired in the last 5 iterations: {1}',
21359
21415
  TTL, toJson(watchLog));
21360
21416
  }
21417
+
21361
21418
  } while (dirty || asyncQueue.length);
21362
21419
 
21363
21420
  clearPhase();
@@ -21393,7 +21450,7 @@ function $RootScopeProvider(){
21393
21450
  *
21394
21451
  * @description
21395
21452
  * Removes the current scope (and all of its children) from the parent scope. Removal implies
21396
- * that calls to {@link ng.$rootScope.Scope#$digest $digest()} will no longer
21453
+ * that calls to {@link ng.$rootScope.Scope#methods_$digest $digest()} will no longer
21397
21454
  * propagate to the current scope and its children. Removal also implies that the current
21398
21455
  * scope is eligible for garbage collection.
21399
21456
  *
@@ -21410,11 +21467,12 @@ function $RootScopeProvider(){
21410
21467
  */
21411
21468
  $destroy: function() {
21412
21469
  // we can't destroy the root scope or a scope that has been already destroyed
21413
- if ($rootScope == this || this.$$destroyed) return;
21470
+ if (this.$$destroyed) return;
21414
21471
  var parent = this.$parent;
21415
21472
 
21416
21473
  this.$broadcast('$destroy');
21417
21474
  this.$$destroyed = true;
21475
+ if (this === $rootScope) return;
21418
21476
 
21419
21477
  if (parent.$$childHead == this) parent.$$childHead = this.$$nextSibling;
21420
21478
  if (parent.$$childTail == this) parent.$$childTail = this.$$prevSibling;
@@ -21452,7 +21510,7 @@ function $RootScopeProvider(){
21452
21510
  *
21453
21511
  * - `string`: execute using the rules as defined in {@link guide/expression expression}.
21454
21512
  * - `function(scope)`: execute the function with the current `scope` parameter.
21455
- *
21513
+ *
21456
21514
  * @param {(object)=} locals Local variables object, useful for overriding values in scope.
21457
21515
  * @returns {*} The result of evaluating the expression.
21458
21516
  */
@@ -21474,7 +21532,7 @@ function $RootScopeProvider(){
21474
21532
  *
21475
21533
  * - it will execute after the function that scheduled the evaluation (preferably before DOM
21476
21534
  * rendering).
21477
- * - at least one {@link ng.$rootScope.Scope#$digest $digest cycle} will be performed after
21535
+ * - at least one {@link ng.$rootScope.Scope#methods_$digest $digest cycle} will be performed after
21478
21536
  * `expression` execution.
21479
21537
  *
21480
21538
  * Any exceptions from the execution of the expression are forwarded to the
@@ -21519,7 +21577,7 @@ function $RootScopeProvider(){
21519
21577
  * framework. (For example from browser DOM events, setTimeout, XHR or third party libraries).
21520
21578
  * Because we are calling into the angular framework we need to perform proper scope life
21521
21579
  * cycle of {@link ng.$exceptionHandler exception handling},
21522
- * {@link ng.$rootScope.Scope#$digest executing watches}.
21580
+ * {@link ng.$rootScope.Scope#methods_$digest executing watches}.
21523
21581
  *
21524
21582
  * ## Life cycle
21525
21583
  *
@@ -21540,11 +21598,11 @@ function $RootScopeProvider(){
21540
21598
  * Scope's `$apply()` method transitions through the following stages:
21541
21599
  *
21542
21600
  * 1. The {@link guide/expression expression} is executed using the
21543
- * {@link ng.$rootScope.Scope#$eval $eval()} method.
21601
+ * {@link ng.$rootScope.Scope#methods_$eval $eval()} method.
21544
21602
  * 2. Any exceptions from the execution of the expression are forwarded to the
21545
21603
  * {@link ng.$exceptionHandler $exceptionHandler} service.
21546
- * 3. The {@link ng.$rootScope.Scope#$watch watch} listeners are fired immediately after the
21547
- * expression was executed using the {@link ng.$rootScope.Scope#$digest $digest()} method.
21604
+ * 3. The {@link ng.$rootScope.Scope#methods_$watch watch} listeners are fired immediately after the
21605
+ * expression was executed using the {@link ng.$rootScope.Scope#methods_$digest $digest()} method.
21548
21606
  *
21549
21607
  *
21550
21608
  * @param {(string|function())=} exp An angular expression to be executed.
@@ -21578,7 +21636,7 @@ function $RootScopeProvider(){
21578
21636
  * @function
21579
21637
  *
21580
21638
  * @description
21581
- * Listens on events of a given type. See {@link ng.$rootScope.Scope#$emit $emit} for
21639
+ * Listens on events of a given type. See {@link ng.$rootScope.Scope#methods_$emit $emit} for
21582
21640
  * discussion of event life cycle.
21583
21641
  *
21584
21642
  * The event listener function format is: `function(event, args...)`. The `event` object
@@ -21619,20 +21677,20 @@ function $RootScopeProvider(){
21619
21677
  *
21620
21678
  * @description
21621
21679
  * Dispatches an event `name` upwards through the scope hierarchy notifying the
21622
- * registered {@link ng.$rootScope.Scope#$on} listeners.
21680
+ * registered {@link ng.$rootScope.Scope#methods_$on} listeners.
21623
21681
  *
21624
21682
  * The event life cycle starts at the scope on which `$emit` was called. All
21625
- * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get
21683
+ * {@link ng.$rootScope.Scope#methods_$on listeners} listening for `name` event on this scope get
21626
21684
  * notified. Afterwards, the event traverses upwards toward the root scope and calls all
21627
21685
  * registered listeners along the way. The event will stop propagating if one of the listeners
21628
21686
  * cancels it.
21629
21687
  *
21630
- * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed
21688
+ * Any exception emitted from the {@link ng.$rootScope.Scope#methods_$on listeners} will be passed
21631
21689
  * onto the {@link ng.$exceptionHandler $exceptionHandler} service.
21632
21690
  *
21633
21691
  * @param {string} name Event name to emit.
21634
21692
  * @param {...*} args Optional set of arguments which will be passed onto the event listeners.
21635
- * @return {Object} Event object (see {@link ng.$rootScope.Scope#$on}).
21693
+ * @return {Object} Event object (see {@link ng.$rootScope.Scope#methods_$on}).
21636
21694
  */
21637
21695
  $emit: function(name, args) {
21638
21696
  var empty = [],
@@ -21688,19 +21746,19 @@ function $RootScopeProvider(){
21688
21746
  *
21689
21747
  * @description
21690
21748
  * Dispatches an event `name` downwards to all child scopes (and their children) notifying the
21691
- * registered {@link ng.$rootScope.Scope#$on} listeners.
21749
+ * registered {@link ng.$rootScope.Scope#methods_$on} listeners.
21692
21750
  *
21693
21751
  * The event life cycle starts at the scope on which `$broadcast` was called. All
21694
- * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get
21752
+ * {@link ng.$rootScope.Scope#methods_$on listeners} listening for `name` event on this scope get
21695
21753
  * notified. Afterwards, the event propagates to all direct and indirect scopes of the current
21696
21754
  * scope and calls all registered listeners along the way. The event cannot be canceled.
21697
21755
  *
21698
- * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed
21756
+ * Any exception emitted from the {@link ng.$rootScope.Scope#methods_$on listeners} will be passed
21699
21757
  * onto the {@link ng.$exceptionHandler $exceptionHandler} service.
21700
21758
  *
21701
21759
  * @param {string} name Event name to broadcast.
21702
21760
  * @param {...*} args Optional set of arguments which will be passed onto the event listeners.
21703
- * @return {Object} Event object, see {@link ng.$rootScope.Scope#$on}
21761
+ * @return {Object} Event object, see {@link ng.$rootScope.Scope#methods_$on}
21704
21762
  */
21705
21763
  $broadcast: function(name, args) {
21706
21764
  var target = this,
@@ -23320,13 +23378,15 @@ function urlIsSameOrigin(requestUrl) {
23320
23378
  <doc:source>
23321
23379
  <script>
23322
23380
  function Ctrl($scope, $window) {
23323
- $scope.$window = $window;
23324
23381
  $scope.greeting = 'Hello, World!';
23382
+ $scope.doGreeting = function(greeting) {
23383
+ $window.alert(greeting);
23384
+ };
23325
23385
  }
23326
23386
  </script>
23327
23387
  <div ng-controller="Ctrl">
23328
23388
  <input type="text" ng-model="greeting" />
23329
- <button ng-click="$window.alert(greeting)">ALERT</button>
23389
+ <button ng-click="doGreeting(greeting)">ALERT</button>
23330
23390
  </div>
23331
23391
  </doc:source>
23332
23392
  <doc:scenario>
@@ -24435,14 +24495,16 @@ var htmlAnchorDirective = valueFn({
24435
24495
  element.append(document.createComment('IE fix'));
24436
24496
  }
24437
24497
 
24438
- return function(scope, element) {
24439
- element.on('click', function(event){
24440
- // if we have no href url, then don't navigate anywhere.
24441
- if (!element.attr('href')) {
24442
- event.preventDefault();
24443
- }
24444
- });
24445
- };
24498
+ if (!attr.href && !attr.name) {
24499
+ return function(scope, element) {
24500
+ element.on('click', function(event){
24501
+ // if we have no href url, then don't navigate anywhere.
24502
+ if (!element.attr('href')) {
24503
+ event.preventDefault();
24504
+ }
24505
+ });
24506
+ };
24507
+ }
24446
24508
  }
24447
24509
  });
24448
24510
 
@@ -24833,9 +24895,22 @@ var nullFormCtrl = {
24833
24895
  * @property {Object} $error Is an object hash, containing references to all invalid controls or
24834
24896
  * forms, where:
24835
24897
  *
24836
- * - keys are validation tokens (error names) — such as `required`, `url` or `email`,
24837
- * - values are arrays of controls or forms that are invalid with given error.
24898
+ * - keys are validation tokens (error names),
24899
+ * - values are arrays of controls or forms that are invalid for given error name.
24838
24900
  *
24901
+ *
24902
+ * Built-in validation tokens:
24903
+ *
24904
+ * - `email`
24905
+ * - `max`
24906
+ * - `maxlength`
24907
+ * - `min`
24908
+ * - `minlength`
24909
+ * - `number`
24910
+ * - `pattern`
24911
+ * - `required`
24912
+ * - `url`
24913
+ *
24839
24914
  * @description
24840
24915
  * `FormController` keeps track of all its controls and nested forms as well as state of them,
24841
24916
  * such as being valid/invalid or dirty/pristine.
@@ -26129,39 +26204,6 @@ var VALID_CLASS = 'ng-valid',
26129
26204
  </file>
26130
26205
  * </example>
26131
26206
  *
26132
- * ## Isolated Scope Pitfall
26133
- *
26134
- * Note that if you have a directive with an isolated scope, you cannot require `ngModel`
26135
- * since the model value will be looked up on the isolated scope rather than the outer scope.
26136
- * When the directive updates the model value, calling `ngModel.$setViewValue()` the property
26137
- * on the outer scope will not be updated. However you can get around this by using $parent.
26138
- *
26139
- * Here is an example of this situation. You'll notice that the first div is not updating the input.
26140
- * However the second div can update the input properly.
26141
- *
26142
- * <example module="badIsolatedDirective">
26143
- <file name="script.js">
26144
- angular.module('badIsolatedDirective', []).directive('isolate', function() {
26145
- return {
26146
- require: 'ngModel',
26147
- scope: { },
26148
- template: '<input ng-model="innerModel">',
26149
- link: function(scope, element, attrs, ngModel) {
26150
- scope.$watch('innerModel', function(value) {
26151
- console.log(value);
26152
- ngModel.$setViewValue(value);
26153
- });
26154
- }
26155
- };
26156
- });
26157
- </file>
26158
- <file name="index.html">
26159
- <input ng-model="someModel"/>
26160
- <div isolate ng-model="someModel"></div>
26161
- <div isolate ng-model="$parent.someModel"></div>
26162
- </file>
26163
- * </example>
26164
- *
26165
26207
  *
26166
26208
  */
26167
26209
  var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$parse',
@@ -26308,7 +26350,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
26308
26350
  * It will update the $viewValue, then pass this value through each of the functions in `$parsers`,
26309
26351
  * which includes any validators. The value that comes out of this `$parsers` pipeline, be applied to
26310
26352
  * `$modelValue` and the **expression** specified in the `ng-model` attribute.
26311
- *
26353
+ *
26312
26354
  * Lastly, all the registered change listeners, in the `$viewChangeListeners` list, are called.
26313
26355
  *
26314
26356
  * Note that calling this function does not trigger a `$digest`.
@@ -26365,6 +26407,8 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
26365
26407
  ctrl.$render();
26366
26408
  }
26367
26409
  }
26410
+
26411
+ return value;
26368
26412
  });
26369
26413
  }];
26370
26414
 
@@ -26641,7 +26685,6 @@ var CONSTANT_VALUE_REGEXP = /^(true|false|\d+)$/;
26641
26685
  id="{{name}}"
26642
26686
  name="favorite">
26643
26687
  </label>
26644
- </span>
26645
26688
  <div>You chose {{my.favorite}}</div>
26646
26689
  </form>
26647
26690
  </doc:source>
@@ -27858,9 +27901,12 @@ var ngIfDirective = ['$animate', function($animate) {
27858
27901
  if (!childScope) {
27859
27902
  childScope = $scope.$new();
27860
27903
  $transclude(childScope, function (clone) {
27904
+ clone[clone.length++] = document.createComment(' end ngIf: ' + $attr.ngIf + ' ');
27905
+ // Note: We only need the first/last node of the cloned nodes.
27906
+ // However, we need to keep the reference to the jqlite wrapper as it might be changed later
27907
+ // by a directive with templateUrl when it's template arrives.
27861
27908
  block = {
27862
- startNode: clone[0],
27863
- endNode: clone[clone.length++] = document.createComment(' end ngIf: ' + $attr.ngIf + ' ')
27909
+ clone: clone
27864
27910
  };
27865
27911
  $animate.enter(clone, $element.parent(), $element);
27866
27912
  });
@@ -27873,7 +27919,7 @@ var ngIfDirective = ['$animate', function($animate) {
27873
27919
  }
27874
27920
 
27875
27921
  if (block) {
27876
- $animate.leave(getBlockElements(block));
27922
+ $animate.leave(getBlockElements(block.clone));
27877
27923
  block = null;
27878
27924
  }
27879
27925
  }
@@ -28029,13 +28075,14 @@ var ngIfDirective = ['$animate', function($animate) {
28029
28075
  * @description
28030
28076
  * Emitted every time the ngInclude content is reloaded.
28031
28077
  */
28032
- var ngIncludeDirective = ['$http', '$templateCache', '$anchorScroll', '$compile', '$animate', '$sce',
28033
- function($http, $templateCache, $anchorScroll, $compile, $animate, $sce) {
28078
+ var ngIncludeDirective = ['$http', '$templateCache', '$anchorScroll', '$animate', '$sce',
28079
+ function($http, $templateCache, $anchorScroll, $animate, $sce) {
28034
28080
  return {
28035
28081
  restrict: 'ECA',
28036
28082
  priority: 400,
28037
28083
  terminal: true,
28038
28084
  transclude: 'element',
28085
+ controller: angular.noop,
28039
28086
  compile: function(element, attr) {
28040
28087
  var srcExp = attr.ngInclude || attr.src,
28041
28088
  onloadExp = attr.onload || '',
@@ -28069,6 +28116,7 @@ var ngIncludeDirective = ['$http', '$templateCache', '$anchorScroll', '$compile'
28069
28116
  $http.get(src, {cache: $templateCache}).success(function(response) {
28070
28117
  if (thisChangeId !== changeCounter) return;
28071
28118
  var newScope = scope.$new();
28119
+ ctrl.template = response;
28072
28120
 
28073
28121
  // Note: This will also link all children of ng-include that were contained in the original
28074
28122
  // html. If that content contains controllers, ... they could pollute/change the scope.
@@ -28076,15 +28124,14 @@ var ngIncludeDirective = ['$http', '$templateCache', '$anchorScroll', '$compile'
28076
28124
  // Note: We can't remove them in the cloneAttchFn of $transclude as that
28077
28125
  // function is called before linking the content, which would apply child
28078
28126
  // directives to non existing elements.
28079
- var clone = $transclude(newScope, noop);
28080
- cleanupLastIncludeContent();
28127
+ var clone = $transclude(newScope, function(clone) {
28128
+ cleanupLastIncludeContent();
28129
+ $animate.enter(clone, null, $element, afterAnimation);
28130
+ });
28081
28131
 
28082
28132
  currentScope = newScope;
28083
28133
  currentElement = clone;
28084
28134
 
28085
- currentElement.html(response);
28086
- $animate.enter(currentElement, null, $element, afterAnimation);
28087
- $compile(currentElement.contents())(currentScope);
28088
28135
  currentScope.$emit('$includeContentLoaded');
28089
28136
  scope.$eval(onloadExp);
28090
28137
  }).error(function() {
@@ -28093,6 +28140,7 @@ var ngIncludeDirective = ['$http', '$templateCache', '$anchorScroll', '$compile'
28093
28140
  scope.$emit('$includeContentRequested');
28094
28141
  } else {
28095
28142
  cleanupLastIncludeContent();
28143
+ ctrl.template = null;
28096
28144
  }
28097
28145
  });
28098
28146
  };
@@ -28100,6 +28148,24 @@ var ngIncludeDirective = ['$http', '$templateCache', '$anchorScroll', '$compile'
28100
28148
  };
28101
28149
  }];
28102
28150
 
28151
+ // This directive is called during the $transclude call of the first `ngInclude` directive.
28152
+ // It will replace and compile the content of the element with the loaded template.
28153
+ // We need this directive so that the element content is already filled when
28154
+ // the link function of another directive on the same element as ngInclude
28155
+ // is called.
28156
+ var ngIncludeFillContentDirective = ['$compile',
28157
+ function($compile) {
28158
+ return {
28159
+ restrict: 'ECA',
28160
+ priority: -400,
28161
+ require: 'ngInclude',
28162
+ link: function(scope, $element, $attr, ctrl) {
28163
+ $element.html(ctrl.template);
28164
+ $compile($element.contents())(scope);
28165
+ }
28166
+ };
28167
+ }];
28168
+
28103
28169
  /**
28104
28170
  * @ngdoc directive
28105
28171
  * @name ng.directive:ngInit
@@ -28116,6 +28182,8 @@ var ngIncludeDirective = ['$http', '$templateCache', '$anchorScroll', '$compile'
28116
28182
  * to initialize values on a scope.
28117
28183
  * </div>
28118
28184
  *
28185
+ * @priority 450
28186
+ *
28119
28187
  * @element ANY
28120
28188
  * @param {expression} ngInit {@link guide/expression Expression} to eval.
28121
28189
  *
@@ -28147,6 +28215,7 @@ var ngIncludeDirective = ['$http', '$templateCache', '$anchorScroll', '$compile'
28147
28215
  </doc:example>
28148
28216
  */
28149
28217
  var ngInitDirective = ngDirective({
28218
+ priority: 450,
28150
28219
  compile: function() {
28151
28220
  return {
28152
28221
  pre: function(scope, element, attrs) {
@@ -28704,7 +28773,7 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
28704
28773
  } else if (nextBlockMap.hasOwnProperty(trackById)) {
28705
28774
  // restore lastBlockMap
28706
28775
  forEach(nextBlockOrder, function(block) {
28707
- if (block && block.startNode) lastBlockMap[block.id] = block;
28776
+ if (block && block.scope) lastBlockMap[block.id] = block;
28708
28777
  });
28709
28778
  // This is a duplicate and we need to throw an error
28710
28779
  throw ngRepeatMinErr('dupes', "Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}",
@@ -28721,7 +28790,7 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
28721
28790
  // lastBlockMap is our own object so we don't need to use special hasOwnPropertyFn
28722
28791
  if (lastBlockMap.hasOwnProperty(key)) {
28723
28792
  block = lastBlockMap[key];
28724
- elementsToRemove = getBlockElements(block);
28793
+ elementsToRemove = getBlockElements(block.clone);
28725
28794
  $animate.leave(elementsToRemove);
28726
28795
  forEach(elementsToRemove, function(element) { element[NG_REMOVED] = true; });
28727
28796
  block.scope.$destroy();
@@ -28733,9 +28802,9 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
28733
28802
  key = (collection === collectionKeys) ? index : collectionKeys[index];
28734
28803
  value = collection[key];
28735
28804
  block = nextBlockOrder[index];
28736
- if (nextBlockOrder[index - 1]) previousNode = nextBlockOrder[index - 1].endNode;
28805
+ if (nextBlockOrder[index - 1]) previousNode = getBlockEnd(nextBlockOrder[index - 1]);
28737
28806
 
28738
- if (block.startNode) {
28807
+ if (block.scope) {
28739
28808
  // if we have already seen this object, then we need to reuse the
28740
28809
  // associated scope/element
28741
28810
  childScope = block.scope;
@@ -28745,11 +28814,11 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
28745
28814
  nextNode = nextNode.nextSibling;
28746
28815
  } while(nextNode && nextNode[NG_REMOVED]);
28747
28816
 
28748
- if (block.startNode != nextNode) {
28817
+ if (getBlockStart(block) != nextNode) {
28749
28818
  // existing item which got moved
28750
- $animate.move(getBlockElements(block), null, jqLite(previousNode));
28819
+ $animate.move(getBlockElements(block.clone), null, jqLite(previousNode));
28751
28820
  }
28752
- previousNode = block.endNode;
28821
+ previousNode = getBlockEnd(block);
28753
28822
  } else {
28754
28823
  // new item which we don't know about
28755
28824
  childScope = $scope.$new();
@@ -28765,14 +28834,16 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
28765
28834
  childScope.$odd = !(childScope.$even = (index&1) === 0);
28766
28835
  // jshint bitwise: true
28767
28836
 
28768
- if (!block.startNode) {
28837
+ if (!block.scope) {
28769
28838
  $transclude(childScope, function(clone) {
28770
28839
  clone[clone.length++] = document.createComment(' end ngRepeat: ' + expression + ' ');
28771
28840
  $animate.enter(clone, null, jqLite(previousNode));
28772
28841
  previousNode = clone;
28773
28842
  block.scope = childScope;
28774
- block.startNode = previousNode && previousNode.endNode ? previousNode.endNode : clone[0];
28775
- block.endNode = clone[clone.length - 1];
28843
+ // Note: We only need the first/last node of the cloned nodes.
28844
+ // However, we need to keep the reference to the jqlite wrapper as it might be changed later
28845
+ // by a directive with templateUrl when it's template arrives.
28846
+ block.clone = clone;
28776
28847
  nextBlockMap[block.id] = block;
28777
28848
  });
28778
28849
  }
@@ -28781,6 +28852,14 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
28781
28852
  });
28782
28853
  }
28783
28854
  };
28855
+
28856
+ function getBlockStart(block) {
28857
+ return block.clone[0];
28858
+ }
28859
+
28860
+ function getBlockEnd(block) {
28861
+ return block.clone[block.clone.length - 1];
28862
+ }
28784
28863
  }];
28785
28864
 
28786
28865
  /**
@@ -29133,19 +29212,26 @@ var ngStyleDirective = ngDirective(function(scope, element, attr) {
29133
29212
  * @restrict EA
29134
29213
  *
29135
29214
  * @description
29136
- * The ngSwitch directive is used to conditionally swap DOM structure on your template based on a scope expression.
29137
- * Elements within ngSwitch but without ngSwitchWhen or ngSwitchDefault directives will be preserved at the location
29215
+ * The `ngSwitch` directive is used to conditionally swap DOM structure on your template based on a scope expression.
29216
+ * Elements within `ngSwitch` but without `ngSwitchWhen` or `ngSwitchDefault` directives will be preserved at the location
29138
29217
  * as specified in the template.
29139
29218
  *
29140
29219
  * The directive itself works similar to ngInclude, however, instead of downloading template code (or loading it
29141
- * from the template cache), ngSwitch simply choses one of the nested elements and makes it visible based on which element
29220
+ * from the template cache), `ngSwitch` simply choses one of the nested elements and makes it visible based on which element
29142
29221
  * matches the value obtained from the evaluated expression. In other words, you define a container element
29143
- * (where you place the directive), place an expression on the **on="..." attribute**
29144
- * (or the **ng-switch="..." attribute**), define any inner elements inside of the directive and place
29222
+ * (where you place the directive), place an expression on the **`on="..."` attribute**
29223
+ * (or the **`ng-switch="..."` attribute**), define any inner elements inside of the directive and place
29145
29224
  * a when attribute per element. The when attribute is used to inform ngSwitch which element to display when the on
29146
29225
  * expression is evaluated. If a matching expression is not found via a when attribute then an element with the default
29147
29226
  * attribute is displayed.
29148
29227
  *
29228
+ * <div class="alert alert-info">
29229
+ * Be aware that the attribute values to match against cannot be expressions. They are interpreted
29230
+ * as literal string values to match against.
29231
+ * For example, **`ng-switch-when="someVal"`** will match against the string `"someVal"` not against the
29232
+ * value of the expression `$scope.someVal`.
29233
+ * </div>
29234
+
29149
29235
  * @animations
29150
29236
  * enter - happens after the ngSwitch contents change and the matched child element is placed inside the container
29151
29237
  * leave - happens just after the ngSwitch contents change and just before the former contents are removed from the DOM
@@ -29157,6 +29243,7 @@ var ngStyleDirective = ngDirective(function(scope, element, attr) {
29157
29243
  * <ANY ng-switch-default>...</ANY>
29158
29244
  * </ANY>
29159
29245
  *
29246
+ *
29160
29247
  * @scope
29161
29248
  * @priority 800
29162
29249
  * @param {*} ngSwitch|on expression to match against <tt>ng-switch-when</tt>.
@@ -29374,7 +29461,7 @@ var ngTranscludeDirective = ngDirective({
29374
29461
 
29375
29462
  link: function($scope, $element, $attrs, controller) {
29376
29463
  controller.$transclude(function(clone) {
29377
- $element.html('');
29464
+ $element.empty();
29378
29465
  $element.append(clone);
29379
29466
  });
29380
29467
  }
@@ -29758,13 +29845,13 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
29758
29845
  // becomes the compilation root
29759
29846
  nullOption.removeClass('ng-scope');
29760
29847
 
29761
- // we need to remove it before calling selectElement.html('') because otherwise IE will
29848
+ // we need to remove it before calling selectElement.empty() because otherwise IE will
29762
29849
  // remove the label from the element. wtf?
29763
29850
  nullOption.remove();
29764
29851
  }
29765
29852
 
29766
29853
  // clear contents, we'll add what's needed based on the model
29767
- selectElement.html('');
29854
+ selectElement.empty();
29768
29855
 
29769
29856
  selectElement.on('change', function() {
29770
29857
  scope.$apply(function() {