angularjs-rails 1.0.4 → 1.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/angularjs-rails/version.rb +1 -1
- data/vendor/assets/javascripts/angular-bootstrap-prettify.js +5 -5
- data/vendor/assets/javascripts/angular-bootstrap.js +1 -1
- data/vendor/assets/javascripts/angular-cookies.js +13 -1
- data/vendor/assets/javascripts/angular-loader.js +1 -1
- data/vendor/assets/javascripts/angular-mocks.js +1 -1
- data/vendor/assets/javascripts/angular-resource.js +8 -8
- data/vendor/assets/javascripts/angular-sanitize.js +1 -1
- data/vendor/assets/javascripts/angular-scenario.js +194 -65
- data/vendor/assets/javascripts/angular.js +193 -64
- metadata +1 -1
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.0.
|
2
|
+
* @license AngularJS v1.0.5
|
3
3
|
* (c) 2010-2012 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -10,10 +10,10 @@ var directive = {};
|
|
10
10
|
var service = { value: {} };
|
11
11
|
|
12
12
|
var DEPENDENCIES = {
|
13
|
-
'angular.js': 'http://code.angularjs.org/' + angular.version.full + 'angular.min.js',
|
14
|
-
'angular-resource.js': 'http://code.angularjs.org/' + angular.version.full + 'angular-resource.min.js',
|
15
|
-
'angular-sanitize.js': 'http://code.angularjs.org/' + angular.version.full + 'angular-sanitize.min.js',
|
16
|
-
'angular-cookies.js': 'http://code.angularjs.org/' + angular.version.full + 'angular-cookies.min.js'
|
13
|
+
'angular.js': 'http://code.angularjs.org/' + angular.version.full + '/angular.min.js',
|
14
|
+
'angular-resource.js': 'http://code.angularjs.org/' + angular.version.full + '/angular-resource.min.js',
|
15
|
+
'angular-sanitize.js': 'http://code.angularjs.org/' + angular.version.full + '/angular-sanitize.min.js',
|
16
|
+
'angular-cookies.js': 'http://code.angularjs.org/' + angular.version.full + '/angular-cookies.min.js'
|
17
17
|
};
|
18
18
|
|
19
19
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.0.
|
2
|
+
* @license AngularJS v1.0.5
|
3
3
|
* (c) 2010-2012 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -25,6 +25,18 @@ angular.module('ngCookies', ['ng']).
|
|
25
25
|
* this object, new cookies are created/deleted at the end of current $eval.
|
26
26
|
*
|
27
27
|
* @example
|
28
|
+
<doc:example>
|
29
|
+
<doc:source>
|
30
|
+
<script>
|
31
|
+
function ExampleController($cookies) {
|
32
|
+
// Retrieving a cookie
|
33
|
+
var favoriteCookie = $cookies.myFavorite;
|
34
|
+
// Setting a cookie
|
35
|
+
$cookies.myFavorite = 'oatmeal';
|
36
|
+
}
|
37
|
+
</script>
|
38
|
+
</doc:source>
|
39
|
+
</doc:example>
|
28
40
|
*/
|
29
41
|
factory('$cookies', ['$rootScope', '$browser', function ($rootScope, $browser) {
|
30
42
|
var cookies = {},
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.0.
|
2
|
+
* @license AngularJS v1.0.5
|
3
3
|
* (c) 2010-2012 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -69,9 +69,9 @@
|
|
69
69
|
*
|
70
70
|
* Calling these methods invoke an {@link ng.$http} with the specified http method,
|
71
71
|
* destination and parameters. When the data is returned from the server then the object is an
|
72
|
-
* instance of the resource class `save`, `remove` and `delete`
|
73
|
-
* methods with the `$` prefix. This allows you to easily perform CRUD operations (create,
|
74
|
-
* update, delete) on server-side data like this:
|
72
|
+
* instance of the resource class. The actions `save`, `remove` and `delete` are available on it
|
73
|
+
* as methods with the `$` prefix. This allows you to easily perform CRUD operations (create,
|
74
|
+
* read, update, delete) on server-side data like this:
|
75
75
|
* <pre>
|
76
76
|
var User = $resource('/user/:userId', {userId:'@id'});
|
77
77
|
var user = User.get({userId:123}, function() {
|
@@ -151,9 +151,9 @@
|
|
151
151
|
});
|
152
152
|
</pre>
|
153
153
|
*
|
154
|
-
*
|
155
|
-
*
|
156
|
-
*
|
154
|
+
* It's worth noting that the success callback for `get`, `query` and other method gets passed
|
155
|
+
* in the response that came from the server as well as $http header getter function, so one
|
156
|
+
* could rewrite the above example and get access to http headers as:
|
157
157
|
*
|
158
158
|
<pre>
|
159
159
|
var User = $resource('/user/:userId', {userId:'@id'});
|
@@ -276,7 +276,7 @@ angular.module('ngResource', ['ng']).
|
|
276
276
|
this.defaults = defaults || {};
|
277
277
|
var urlParams = this.urlParams = {};
|
278
278
|
forEach(template.split(/\W/), function(param){
|
279
|
-
if (param &&
|
279
|
+
if (param && (new RegExp("(^|[^\\\\]):" + param + "\\W").test(template))) {
|
280
280
|
urlParams[param] = true;
|
281
281
|
}
|
282
282
|
});
|
@@ -9404,7 +9404,7 @@ if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
|
|
9404
9404
|
|
9405
9405
|
})( window );
|
9406
9406
|
/**
|
9407
|
-
* @license AngularJS v1.0.
|
9407
|
+
* @license AngularJS v1.0.5
|
9408
9408
|
* (c) 2010-2012 Google, Inc. http://angularjs.org
|
9409
9409
|
* License: MIT
|
9410
9410
|
*/
|
@@ -9460,8 +9460,7 @@ if ('i' !== 'I'.toLowerCase()) {
|
|
9460
9460
|
function fromCharCode(code) {return String.fromCharCode(code);}
|
9461
9461
|
|
9462
9462
|
|
9463
|
-
var
|
9464
|
-
/** holds major version number for IE or NaN for real browsers */
|
9463
|
+
var /** holds major version number for IE or NaN for real browsers */
|
9465
9464
|
msie = int((/msie (\d+)/.exec(lowercase(navigator.userAgent)) || [])[1]),
|
9466
9465
|
jqLite, // delay binding since jQuery could be loaded after us.
|
9467
9466
|
jQuery, // delay binding
|
@@ -9502,6 +9501,30 @@ var Error = window.Error,
|
|
9502
9501
|
* @param {Object=} context Object to become context (`this`) for the iterator function.
|
9503
9502
|
* @returns {Object|Array} Reference to `obj`.
|
9504
9503
|
*/
|
9504
|
+
|
9505
|
+
|
9506
|
+
/**
|
9507
|
+
* @private
|
9508
|
+
* @param {*} obj
|
9509
|
+
* @return {boolean} Returns true if `obj` is an array or array-like object (NodeList, Arguments, ...)
|
9510
|
+
*/
|
9511
|
+
function isArrayLike(obj) {
|
9512
|
+
if (!obj || (typeof obj.length !== 'number')) return false;
|
9513
|
+
|
9514
|
+
// We have on object which has length property. Should we treat it as array?
|
9515
|
+
if (typeof obj.hasOwnProperty != 'function' &&
|
9516
|
+
typeof obj.constructor != 'function') {
|
9517
|
+
// This is here for IE8: it is a bogus object treat it as array;
|
9518
|
+
return true;
|
9519
|
+
} else {
|
9520
|
+
return obj instanceof JQLite || // JQLite
|
9521
|
+
(jQuery && obj instanceof jQuery) || // jQuery
|
9522
|
+
toString.call(obj) !== '[object Object]' || // some browser native object
|
9523
|
+
typeof obj.callee === 'function'; // arguments (on IE8 looks like regular obj)
|
9524
|
+
}
|
9525
|
+
}
|
9526
|
+
|
9527
|
+
|
9505
9528
|
function forEach(obj, iterator, context) {
|
9506
9529
|
var key;
|
9507
9530
|
if (obj) {
|
@@ -9513,7 +9536,7 @@ function forEach(obj, iterator, context) {
|
|
9513
9536
|
}
|
9514
9537
|
} else if (obj.forEach && obj.forEach !== forEach) {
|
9515
9538
|
obj.forEach(iterator, context);
|
9516
|
-
} else if (
|
9539
|
+
} else if (isArrayLike(obj)) {
|
9517
9540
|
for (key = 0; key < obj.length; key++)
|
9518
9541
|
iterator.call(context, obj[key], key);
|
9519
9542
|
} else {
|
@@ -9558,7 +9581,7 @@ function reverseParams(iteratorFn) {
|
|
9558
9581
|
/**
|
9559
9582
|
* A consistent way of creating unique IDs in angular. The ID is a sequence of alpha numeric
|
9560
9583
|
* characters such as '012ABC'. The reason why we are not using simply a number counter is that
|
9561
|
-
* the number string gets longer over time, and it can also overflow, where as the
|
9584
|
+
* the number string gets longer over time, and it can also overflow, where as the nextId
|
9562
9585
|
* will grow much slower, it is a string, and it will never overflow.
|
9563
9586
|
*
|
9564
9587
|
* @returns an unique alpha-numeric string
|
@@ -9954,9 +9977,7 @@ function copy(source, destination){
|
|
9954
9977
|
} else {
|
9955
9978
|
if (source === destination) throw Error("Can't copy equivalent objects or arrays");
|
9956
9979
|
if (isArray(source)) {
|
9957
|
-
|
9958
|
-
destination.pop();
|
9959
|
-
}
|
9980
|
+
destination.length = 0;
|
9960
9981
|
for ( var i = 0; i < source.length; i++) {
|
9961
9982
|
destination.push(copy(source[i]));
|
9962
9983
|
}
|
@@ -10167,9 +10188,18 @@ function startingTag(element) {
|
|
10167
10188
|
// are not allowed to have children. So we just ignore it.
|
10168
10189
|
element.html('');
|
10169
10190
|
} catch(e) {}
|
10170
|
-
|
10171
|
-
|
10172
|
-
|
10191
|
+
// As Per DOM Standards
|
10192
|
+
var TEXT_NODE = 3;
|
10193
|
+
var elemHtml = jqLite('<div>').append(element).html();
|
10194
|
+
try {
|
10195
|
+
return element[0].nodeType === TEXT_NODE ? lowercase(elemHtml) :
|
10196
|
+
elemHtml.
|
10197
|
+
match(/^(<[^>]+>)/)[1].
|
10198
|
+
replace(/^<([\w\-]+)/, function(match, nodeName) { return '<' + lowercase(nodeName); });
|
10199
|
+
} catch(e) {
|
10200
|
+
return lowercase(elemHtml);
|
10201
|
+
}
|
10202
|
+
|
10173
10203
|
}
|
10174
10204
|
|
10175
10205
|
|
@@ -10253,7 +10283,7 @@ function encodeUriQuery(val, pctEncodeSpaces) {
|
|
10253
10283
|
* Use this directive to auto-bootstrap on application. Only
|
10254
10284
|
* one directive can be used per HTML document. The directive
|
10255
10285
|
* designates the root of the application and is typically placed
|
10256
|
-
*
|
10286
|
+
* at the root of the page.
|
10257
10287
|
*
|
10258
10288
|
* In the example below if the `ngApp` directive would not be placed
|
10259
10289
|
* on the `html` element then the document would not be compiled
|
@@ -10654,11 +10684,11 @@ function setupModuleLoader(window) {
|
|
10654
10684
|
* - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
|
10655
10685
|
*/
|
10656
10686
|
var version = {
|
10657
|
-
full: '1.0.
|
10687
|
+
full: '1.0.5', // all of these placeholder strings will be replaced by rake's
|
10658
10688
|
major: 1, // compile task
|
10659
10689
|
minor: 0,
|
10660
|
-
dot:
|
10661
|
-
codeName: '
|
10690
|
+
dot: 5,
|
10691
|
+
codeName: 'flatulent-propulsion'
|
10662
10692
|
};
|
10663
10693
|
|
10664
10694
|
|
@@ -11835,7 +11865,7 @@ function annotate(fn) {
|
|
11835
11865
|
* This method does not work with code minfication / obfuscation. For this reason the following annotation strategies
|
11836
11866
|
* are supported.
|
11837
11867
|
*
|
11838
|
-
* # The `$
|
11868
|
+
* # The `$inject` property
|
11839
11869
|
*
|
11840
11870
|
* If a function has an `$inject` property and its value is an array of strings, then the strings represent names of
|
11841
11871
|
* services to be injected into the function.
|
@@ -12549,7 +12579,7 @@ function Browser(window, document, $log, $sniffer) {
|
|
12549
12579
|
*/
|
12550
12580
|
self.baseHref = function() {
|
12551
12581
|
var href = baseElement.attr('href');
|
12552
|
-
return href ? href.replace(/^https?\:\/\/[^\/]*/, '') :
|
12582
|
+
return href ? href.replace(/^https?\:\/\/[^\/]*/, '') : '';
|
12553
12583
|
};
|
12554
12584
|
|
12555
12585
|
//////////////////////////////////////////////////////////////
|
@@ -12999,7 +13029,8 @@ function $CompileProvider($provide) {
|
|
12999
13029
|
Suffix = 'Directive',
|
13000
13030
|
COMMENT_DIRECTIVE_REGEXP = /^\s*directive\:\s*([\d\w\-_]+)\s+(.*)$/,
|
13001
13031
|
CLASS_DIRECTIVE_REGEXP = /(([\d\w\-_]+)(?:\:([^;]+))?;?)/,
|
13002
|
-
MULTI_ROOT_TEMPLATE_ERROR = 'Template must have exactly one root element. was: '
|
13032
|
+
MULTI_ROOT_TEMPLATE_ERROR = 'Template must have exactly one root element. was: ',
|
13033
|
+
urlSanitizationWhitelist = /^\s*(https?|ftp|mailto):/;
|
13003
13034
|
|
13004
13035
|
|
13005
13036
|
/**
|
@@ -13053,11 +13084,41 @@ function $CompileProvider($provide) {
|
|
13053
13084
|
};
|
13054
13085
|
|
13055
13086
|
|
13087
|
+
/**
|
13088
|
+
* @ngdoc function
|
13089
|
+
* @name ng.$compileProvider#urlSanitizationWhitelist
|
13090
|
+
* @methodOf ng.$compileProvider
|
13091
|
+
* @function
|
13092
|
+
*
|
13093
|
+
* @description
|
13094
|
+
* Retrieves or overrides the default regular expression that is used for whitelisting of safe
|
13095
|
+
* urls during a[href] sanitization.
|
13096
|
+
*
|
13097
|
+
* The sanitization is a security measure aimed at prevent XSS attacks via html links.
|
13098
|
+
*
|
13099
|
+
* Any url about to be assigned to a[href] via data-binding is first normalized and turned into an
|
13100
|
+
* absolute url. Afterwards the url is matched against the `urlSanitizationWhitelist` regular
|
13101
|
+
* expression. If a match is found the original url is written into the dom. Otherwise the
|
13102
|
+
* absolute url is prefixed with `'unsafe:'` string and only then it is written into the DOM.
|
13103
|
+
*
|
13104
|
+
* @param {RegExp=} regexp New regexp to whitelist urls with.
|
13105
|
+
* @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for
|
13106
|
+
* chaining otherwise.
|
13107
|
+
*/
|
13108
|
+
this.urlSanitizationWhitelist = function(regexp) {
|
13109
|
+
if (isDefined(regexp)) {
|
13110
|
+
urlSanitizationWhitelist = regexp;
|
13111
|
+
return this;
|
13112
|
+
}
|
13113
|
+
return urlSanitizationWhitelist;
|
13114
|
+
};
|
13115
|
+
|
13116
|
+
|
13056
13117
|
this.$get = [
|
13057
13118
|
'$injector', '$interpolate', '$exceptionHandler', '$http', '$templateCache', '$parse',
|
13058
|
-
'$controller', '$rootScope',
|
13119
|
+
'$controller', '$rootScope', '$document',
|
13059
13120
|
function($injector, $interpolate, $exceptionHandler, $http, $templateCache, $parse,
|
13060
|
-
$controller, $rootScope) {
|
13121
|
+
$controller, $rootScope, $document) {
|
13061
13122
|
|
13062
13123
|
var Attributes = function(element, attr) {
|
13063
13124
|
this.$$element = element;
|
@@ -13079,7 +13140,8 @@ function $CompileProvider($provide) {
|
|
13079
13140
|
*/
|
13080
13141
|
$set: function(key, value, writeAttr, attrName) {
|
13081
13142
|
var booleanKey = getBooleanAttrName(this.$$element[0], key),
|
13082
|
-
$$observers = this.$$observers
|
13143
|
+
$$observers = this.$$observers,
|
13144
|
+
normalizedVal;
|
13083
13145
|
|
13084
13146
|
if (booleanKey) {
|
13085
13147
|
this.$$element.prop(key, value);
|
@@ -13098,6 +13160,19 @@ function $CompileProvider($provide) {
|
|
13098
13160
|
}
|
13099
13161
|
}
|
13100
13162
|
|
13163
|
+
|
13164
|
+
// sanitize a[href] values
|
13165
|
+
if (nodeName_(this.$$element[0]) === 'A' && key === 'href') {
|
13166
|
+
urlSanitizationNode.setAttribute('href', value);
|
13167
|
+
|
13168
|
+
// href property always returns normalized absolute url, so we can match against that
|
13169
|
+
normalizedVal = urlSanitizationNode.href;
|
13170
|
+
if (!normalizedVal.match(urlSanitizationWhitelist)) {
|
13171
|
+
this[key] = value = 'unsafe:' + normalizedVal;
|
13172
|
+
}
|
13173
|
+
}
|
13174
|
+
|
13175
|
+
|
13101
13176
|
if (writeAttr !== false) {
|
13102
13177
|
if (value === null || value === undefined) {
|
13103
13178
|
this.$$element.removeAttr(attrName);
|
@@ -13141,7 +13216,8 @@ function $CompileProvider($provide) {
|
|
13141
13216
|
}
|
13142
13217
|
};
|
13143
13218
|
|
13144
|
-
var
|
13219
|
+
var urlSanitizationNode = $document[0].createElement('a'),
|
13220
|
+
startSymbol = $interpolate.startSymbol(),
|
13145
13221
|
endSymbol = $interpolate.endSymbol(),
|
13146
13222
|
denormalizeTemplate = (startSymbol == '{{' || endSymbol == '}}')
|
13147
13223
|
? identity
|
@@ -13174,7 +13250,14 @@ function $CompileProvider($provide) {
|
|
13174
13250
|
var $linkNode = cloneConnectFn
|
13175
13251
|
? JQLitePrototype.clone.call($compileNodes) // IMPORTANT!!!
|
13176
13252
|
: $compileNodes;
|
13177
|
-
|
13253
|
+
|
13254
|
+
// Attach scope only to non-text nodes.
|
13255
|
+
for(var i = 0, ii = $linkNode.length; i<ii; i++) {
|
13256
|
+
var node = $linkNode[i];
|
13257
|
+
if (node.nodeType == 1 /* element */ || node.nodeType == 9 /* document */) {
|
13258
|
+
$linkNode.eq(i).data('$scope', scope);
|
13259
|
+
}
|
13260
|
+
}
|
13178
13261
|
safeAddClass($linkNode, 'ng-scope');
|
13179
13262
|
if (cloneConnectFn) cloneConnectFn($linkNode, scope);
|
13180
13263
|
if (compositeLinkFn) compositeLinkFn(scope, $linkNode, $linkNode);
|
@@ -13264,6 +13347,7 @@ function $CompileProvider($provide) {
|
|
13264
13347
|
(function(transcludeFn) {
|
13265
13348
|
return function(cloneFn) {
|
13266
13349
|
var transcludeScope = scope.$new();
|
13350
|
+
transcludeScope.$$transcluded = true;
|
13267
13351
|
|
13268
13352
|
return transcludeFn(transcludeScope, cloneFn).
|
13269
13353
|
bind('$destroy', bind(transcludeScope, transcludeScope.$destroy));
|
@@ -13569,6 +13653,8 @@ function $CompileProvider($provide) {
|
|
13569
13653
|
lastValue,
|
13570
13654
|
parentGet, parentSet;
|
13571
13655
|
|
13656
|
+
scope.$$isolateBindings[scopeName] = mode + attrName;
|
13657
|
+
|
13572
13658
|
switch (mode) {
|
13573
13659
|
|
13574
13660
|
case '@': {
|
@@ -13779,7 +13865,7 @@ function $CompileProvider($provide) {
|
|
13779
13865
|
}
|
13780
13866
|
|
13781
13867
|
directives.unshift(derivedSyncDirective);
|
13782
|
-
afterTemplateNodeLinkFn = applyDirectivesToNode(directives,
|
13868
|
+
afterTemplateNodeLinkFn = applyDirectivesToNode(directives, compileNode, tAttrs, childTranscludeFn);
|
13783
13869
|
afterTemplateChildLinkFn = compileNodes($compileNode.contents(), childTranscludeFn);
|
13784
13870
|
|
13785
13871
|
|
@@ -13859,10 +13945,10 @@ function $CompileProvider($provide) {
|
|
13859
13945
|
function addAttrInterpolateDirective(node, directives, value, name) {
|
13860
13946
|
var interpolateFn = $interpolate(value, true);
|
13861
13947
|
|
13862
|
-
|
13863
13948
|
// no interpolation found -> ignore
|
13864
13949
|
if (!interpolateFn) return;
|
13865
13950
|
|
13951
|
+
|
13866
13952
|
directives.push({
|
13867
13953
|
priority: 100,
|
13868
13954
|
compile: valueFn(function attrInterpolateLinkFn(scope, element, attr) {
|
@@ -15856,9 +15942,10 @@ function getterFn(path, csp) {
|
|
15856
15942
|
* @param {string} expression String expression to compile.
|
15857
15943
|
* @returns {function(context, locals)} a function which represents the compiled expression:
|
15858
15944
|
*
|
15859
|
-
* * `context
|
15860
|
-
* against (
|
15861
|
-
* * `locals
|
15945
|
+
* * `context` – `{object}` – an object against which any expressions embedded in the strings
|
15946
|
+
* are evaluated against (tipically a scope object).
|
15947
|
+
* * `locals` – `{object=}` – local variables context object, useful for overriding values in
|
15948
|
+
* `context`.
|
15862
15949
|
*
|
15863
15950
|
* The return function also has an `assign` property, if the expression is assignable, which
|
15864
15951
|
* allows one to set values to expressions.
|
@@ -15894,7 +15981,7 @@ function $ParseProvider() {
|
|
15894
15981
|
* interface for interacting with an object that represents the result of an action that is
|
15895
15982
|
* performed asynchronously, and may or may not be finished at any given point in time.
|
15896
15983
|
*
|
15897
|
-
* From the perspective of dealing with error handling, deferred and promise
|
15984
|
+
* From the perspective of dealing with error handling, deferred and promise APIs are to
|
15898
15985
|
* asynchronous programming what `try`, `catch` and `throw` keywords are to synchronous programming.
|
15899
15986
|
*
|
15900
15987
|
* <pre>
|
@@ -15929,7 +16016,7 @@ function $ParseProvider() {
|
|
15929
16016
|
*
|
15930
16017
|
* At first it might not be obvious why this extra complexity is worth the trouble. The payoff
|
15931
16018
|
* comes in the way of
|
15932
|
-
* [guarantees that promise and deferred
|
16019
|
+
* [guarantees that promise and deferred APIs make](https://github.com/kriskowal/uncommonjs/blob/master/promises/specification.md).
|
15933
16020
|
*
|
15934
16021
|
* Additionally the promise api allows for composition that is very hard to do with the
|
15935
16022
|
* traditional callback ([CPS](http://en.wikipedia.org/wiki/Continuation-passing_style)) approach.
|
@@ -15941,7 +16028,7 @@ function $ParseProvider() {
|
|
15941
16028
|
*
|
15942
16029
|
* A new instance of deferred is constructed by calling `$q.defer()`.
|
15943
16030
|
*
|
15944
|
-
* The purpose of the deferred object is to expose the associated Promise instance as well as
|
16031
|
+
* The purpose of the deferred object is to expose the associated Promise instance as well as APIs
|
15945
16032
|
* that can be used for signaling the successful or unsuccessful completion of the task.
|
15946
16033
|
*
|
15947
16034
|
* **Methods**
|
@@ -15984,7 +16071,7 @@ function $ParseProvider() {
|
|
15984
16071
|
* return result + 1;
|
15985
16072
|
* });
|
15986
16073
|
*
|
15987
|
-
* // promiseB will be resolved immediately after promiseA is resolved and
|
16074
|
+
* // promiseB will be resolved immediately after promiseA is resolved and its value will be
|
15988
16075
|
* // the result of promiseA incremented by 1
|
15989
16076
|
* </pre>
|
15990
16077
|
*
|
@@ -16009,7 +16096,7 @@ function $ParseProvider() {
|
|
16009
16096
|
* # Testing
|
16010
16097
|
*
|
16011
16098
|
* <pre>
|
16012
|
-
* it('should simulate promise', inject(function($q, $
|
16099
|
+
* it('should simulate promise', inject(function($q, $rootScope) {
|
16013
16100
|
* var deferred = $q.defer();
|
16014
16101
|
* var promise = deferred.promise;
|
16015
16102
|
* var resolvedValue;
|
@@ -16018,7 +16105,7 @@ function $ParseProvider() {
|
|
16018
16105
|
* expect(resolvedValue).toBeUndefined();
|
16019
16106
|
*
|
16020
16107
|
* // Simulate resolving of promise
|
16021
|
-
*
|
16108
|
+
* deferred.resolve(123);
|
16022
16109
|
* // Note that the 'then' function does not get called synchronously.
|
16023
16110
|
* // This is because we want the promise API to always be async, whether or not
|
16024
16111
|
* // it got called synchronously or asynchronously.
|
@@ -16194,12 +16281,12 @@ function qFactory(nextTick, exceptionHandler) {
|
|
16194
16281
|
* @methodOf ng.$q
|
16195
16282
|
* @description
|
16196
16283
|
* Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise.
|
16197
|
-
* This is useful when you are dealing with
|
16284
|
+
* This is useful when you are dealing with an object that might or might not be a promise, or if
|
16198
16285
|
* the promise comes from a source that can't be trusted.
|
16199
16286
|
*
|
16200
16287
|
* @param {*} value Value or a promise
|
16201
16288
|
* @returns {Promise} Returns a single promise that will be resolved with an array of values,
|
16202
|
-
* each value
|
16289
|
+
* each value corresponding to the promise at the same index in the `promises` array. If any of
|
16203
16290
|
* the promises is resolved with a rejection, this resulting promise will be resolved with the
|
16204
16291
|
* same rejection.
|
16205
16292
|
*/
|
@@ -16261,7 +16348,7 @@ function qFactory(nextTick, exceptionHandler) {
|
|
16261
16348
|
*
|
16262
16349
|
* @param {Array.<Promise>} promises An array of promises.
|
16263
16350
|
* @returns {Promise} Returns a single promise that will be resolved with an array of values,
|
16264
|
-
* each value
|
16351
|
+
* each value corresponding to the promise at the same index in the `promises` array. If any of
|
16265
16352
|
* the promises is resolved with a rejection, this resulting promise will be resolved with the
|
16266
16353
|
* same rejection.
|
16267
16354
|
*/
|
@@ -16930,6 +17017,7 @@ function $RootScopeProvider(){
|
|
16930
17017
|
this.$$destroyed = false;
|
16931
17018
|
this.$$asyncQueue = [];
|
16932
17019
|
this.$$listeners = {};
|
17020
|
+
this.$$isolateBindings = {};
|
16933
17021
|
}
|
16934
17022
|
|
16935
17023
|
/**
|
@@ -17411,10 +17499,6 @@ function $RootScopeProvider(){
|
|
17411
17499
|
* Listens on events of a given type. See {@link ng.$rootScope.Scope#$emit $emit} for discussion of
|
17412
17500
|
* event life cycle.
|
17413
17501
|
*
|
17414
|
-
* @param {string} name Event name to listen on.
|
17415
|
-
* @param {function(event)} listener Function to call when the event is emitted.
|
17416
|
-
* @returns {function()} Returns a deregistration function for this listener.
|
17417
|
-
*
|
17418
17502
|
* The event listener function format is: `function(event, args...)`. The `event` object
|
17419
17503
|
* passed into the listener has the following attributes:
|
17420
17504
|
*
|
@@ -17425,6 +17509,10 @@ function $RootScopeProvider(){
|
|
17425
17509
|
* propagation (available only for events that were `$emit`-ed).
|
17426
17510
|
* - `preventDefault` - `{function}`: calling `preventDefault` sets `defaultPrevented` flag to true.
|
17427
17511
|
* - `defaultPrevented` - `{boolean}`: true if `preventDefault` was called.
|
17512
|
+
*
|
17513
|
+
* @param {string} name Event name to listen on.
|
17514
|
+
* @param {function(event, args...)} listener Function to call when the event is emitted.
|
17515
|
+
* @returns {function()} Returns a deregistration function for this listener.
|
17428
17516
|
*/
|
17429
17517
|
$on: function(name, listener) {
|
17430
17518
|
var namedListeners = this.$$listeners[name];
|
@@ -17602,7 +17690,7 @@ function $RootScopeProvider(){
|
|
17602
17690
|
|
17603
17691
|
/**
|
17604
17692
|
* function used as an initial value for watchers.
|
17605
|
-
* because it's
|
17693
|
+
* because it's unique we can easily tell it apart from other values
|
17606
17694
|
*/
|
17607
17695
|
function initWatchVal() {}
|
17608
17696
|
}];
|
@@ -18513,8 +18601,30 @@ function createHttpBackend($browser, XHR, $browserDefer, callbacks, rawDocument,
|
|
18513
18601
|
// always async
|
18514
18602
|
xhr.onreadystatechange = function() {
|
18515
18603
|
if (xhr.readyState == 4) {
|
18516
|
-
|
18517
|
-
|
18604
|
+
var responseHeaders = xhr.getAllResponseHeaders();
|
18605
|
+
|
18606
|
+
// TODO(vojta): remove once Firefox 21 gets released.
|
18607
|
+
// begin: workaround to overcome Firefox CORS http response headers bug
|
18608
|
+
// https://bugzilla.mozilla.org/show_bug.cgi?id=608735
|
18609
|
+
// Firefox already patched in nightly. Should land in Firefox 21.
|
18610
|
+
|
18611
|
+
// CORS "simple response headers" http://www.w3.org/TR/cors/
|
18612
|
+
var value,
|
18613
|
+
simpleHeaders = ["Cache-Control", "Content-Language", "Content-Type",
|
18614
|
+
"Expires", "Last-Modified", "Pragma"];
|
18615
|
+
if (!responseHeaders) {
|
18616
|
+
responseHeaders = "";
|
18617
|
+
forEach(simpleHeaders, function (header) {
|
18618
|
+
var value = xhr.getResponseHeader(header);
|
18619
|
+
if (value) {
|
18620
|
+
responseHeaders += header + ": " + value + "\n";
|
18621
|
+
}
|
18622
|
+
});
|
18623
|
+
}
|
18624
|
+
// end of the workaround.
|
18625
|
+
|
18626
|
+
completeRequest(callback, status || xhr.status, xhr.responseText,
|
18627
|
+
responseHeaders);
|
18518
18628
|
}
|
18519
18629
|
};
|
18520
18630
|
|
@@ -18913,7 +19023,7 @@ function $FilterProvider($provide) {
|
|
18913
19023
|
*/
|
18914
19024
|
function filterFilter() {
|
18915
19025
|
return function(array, expression) {
|
18916
|
-
if (!(array
|
19026
|
+
if (!isArray(array)) return array;
|
18917
19027
|
var predicates = [];
|
18918
19028
|
predicates.check = function(value) {
|
18919
19029
|
for (var j = 0; j < predicates.length; j++) {
|
@@ -19162,7 +19272,7 @@ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
|
|
19162
19272
|
fraction += '0';
|
19163
19273
|
}
|
19164
19274
|
|
19165
|
-
if (fractionSize) formatedText += decimalSep + fraction.substr(0, fractionSize);
|
19275
|
+
if (fractionSize && fractionSize !== "0") formatedText += decimalSep + fraction.substr(0, fractionSize);
|
19166
19276
|
}
|
19167
19277
|
|
19168
19278
|
parts.push(isNegative ? pattern.negPre : pattern.posPre);
|
@@ -19205,8 +19315,12 @@ function dateStrGetter(name, shortForm) {
|
|
19205
19315
|
}
|
19206
19316
|
|
19207
19317
|
function timeZoneGetter(date) {
|
19208
|
-
var
|
19209
|
-
|
19318
|
+
var zone = -1 * date.getTimezoneOffset();
|
19319
|
+
var paddedZone = (zone >= 0) ? "+" : "";
|
19320
|
+
|
19321
|
+
paddedZone += padNumber(zone / 60, 2) + padNumber(Math.abs(zone % 60), 2);
|
19322
|
+
|
19323
|
+
return paddedZone;
|
19210
19324
|
}
|
19211
19325
|
|
19212
19326
|
function ampmGetter(date, formats) {
|
@@ -19292,7 +19406,8 @@ var DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+
|
|
19292
19406
|
*
|
19293
19407
|
* @param {(Date|number|string)} date Date to format either as Date object, milliseconds (string or
|
19294
19408
|
* number) or various ISO 8601 datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.SSSZ and it's
|
19295
|
-
* shorter versions like yyyy-MM-ddTHH:mmZ, yyyy-MM-dd or yyyyMMddTHHmmssZ).
|
19409
|
+
* shorter versions like yyyy-MM-ddTHH:mmZ, yyyy-MM-dd or yyyyMMddTHHmmssZ). If no timezone is
|
19410
|
+
* specified in the string input, the time is considered to be in the local timezone.
|
19296
19411
|
* @param {string=} format Formatting rules (see Description). If not specified,
|
19297
19412
|
* `mediumDate` is used.
|
19298
19413
|
* @returns {string} Formatted string or the input if input is not recognized as date/millis.
|
@@ -19312,7 +19427,7 @@ var DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+
|
|
19312
19427
|
expect(binding("1288323623006 | date:'medium'")).
|
19313
19428
|
toMatch(/Oct 2\d, 2010 \d{1,2}:\d{2}:\d{2} (AM|PM)/);
|
19314
19429
|
expect(binding("1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'")).
|
19315
|
-
toMatch(/2010\-10\-2\d \d{2}:\d{2}:\d{2}
|
19430
|
+
toMatch(/2010\-10\-2\d \d{2}:\d{2}:\d{2} (\-|\+)?\d{4}/);
|
19316
19431
|
expect(binding("'1288323623006' | date:'MM/dd/yyyy @ h:mma'")).
|
19317
19432
|
toMatch(/10\/2\d\/2010 @ \d{1,2}:\d{2}(AM|PM)/);
|
19318
19433
|
});
|
@@ -19618,7 +19733,7 @@ function limitToFilter(){
|
|
19618
19733
|
orderByFilter.$inject = ['$parse'];
|
19619
19734
|
function orderByFilter($parse){
|
19620
19735
|
return function(array, sortPredicate, reverseOrder) {
|
19621
|
-
if (!(array
|
19736
|
+
if (!isArray(array)) return array;
|
19622
19737
|
if (!sortPredicate) return array;
|
19623
19738
|
sortPredicate = isArray(sortPredicate) ? sortPredicate: [sortPredicate];
|
19624
19739
|
sortPredicate = map(sortPredicate, function(predicate){
|
@@ -19686,15 +19801,25 @@ function ngDirective(directive) {
|
|
19686
19801
|
*
|
19687
19802
|
* The reasoning for this change is to allow easy creation of action links with `ngClick` directive
|
19688
19803
|
* without changing the location or causing page reloads, e.g.:
|
19689
|
-
*
|
19804
|
+
* `<a href="" ng-click="model.$save()">Save</a>`
|
19690
19805
|
*/
|
19691
19806
|
var htmlAnchorDirective = valueFn({
|
19692
19807
|
restrict: 'E',
|
19693
19808
|
compile: function(element, attr) {
|
19694
|
-
|
19695
|
-
|
19696
|
-
|
19697
|
-
|
19809
|
+
|
19810
|
+
if (msie <= 8) {
|
19811
|
+
|
19812
|
+
// turn <a href ng-click="..">link</a> into a stylable link in IE
|
19813
|
+
// but only if it doesn't have name attribute, in which case it's an anchor
|
19814
|
+
if (!attr.href && !attr.name) {
|
19815
|
+
attr.$set('href', '');
|
19816
|
+
}
|
19817
|
+
|
19818
|
+
// add a comment node to anchors to workaround IE bug that causes element content to be reset
|
19819
|
+
// to new attribute content if attribute is updated with value containing @ and element also
|
19820
|
+
// contains value with @
|
19821
|
+
// see issue #1949
|
19822
|
+
element.append(document.createComment('IE fix'));
|
19698
19823
|
}
|
19699
19824
|
|
19700
19825
|
return function(scope, element) {
|
@@ -19774,7 +19899,7 @@ var htmlAnchorDirective = valueFn({
|
|
19774
19899
|
it('should execute ng-click but not reload when no href but name specified', function() {
|
19775
19900
|
element('#link-5').click();
|
19776
19901
|
expect(input('value').val()).toEqual('5');
|
19777
|
-
expect(element('#link-5').attr('href')).toBe(
|
19902
|
+
expect(element('#link-5').attr('href')).toBe(undefined);
|
19778
19903
|
});
|
19779
19904
|
|
19780
19905
|
it('should only change url when only ng-href', function() {
|
@@ -20017,8 +20142,9 @@ forEach(['src', 'href'], function(attrName) {
|
|
20017
20142
|
|
20018
20143
|
// on IE, if "ng:src" directive declaration is used and "src" attribute doesn't exist
|
20019
20144
|
// then calling element.setAttribute('src', 'foo') doesn't do anything, so we need
|
20020
|
-
// to set the property as well to achieve the desired effect
|
20021
|
-
|
20145
|
+
// to set the property as well to achieve the desired effect.
|
20146
|
+
// we use attr[attrName] value since $set can sanitize the url.
|
20147
|
+
if (msie) element.prop(attrName, attr[attrName]);
|
20022
20148
|
});
|
20023
20149
|
}
|
20024
20150
|
};
|
@@ -21723,6 +21849,7 @@ var ngBindHtmlUnsafeDirective = [function() {
|
|
21723
21849
|
function classDirective(name, selector) {
|
21724
21850
|
name = 'ngClass' + name;
|
21725
21851
|
return ngDirective(function(scope, element, attr) {
|
21852
|
+
var oldVal = undefined;
|
21726
21853
|
|
21727
21854
|
scope.$watch(attr[name], ngClassWatchAction, true);
|
21728
21855
|
|
@@ -21746,13 +21873,14 @@ function classDirective(name, selector) {
|
|
21746
21873
|
}
|
21747
21874
|
|
21748
21875
|
|
21749
|
-
function ngClassWatchAction(newVal
|
21876
|
+
function ngClassWatchAction(newVal) {
|
21750
21877
|
if (selector === true || scope.$index % 2 === selector) {
|
21751
21878
|
if (oldVal && (newVal !== oldVal)) {
|
21752
21879
|
removeClass(oldVal);
|
21753
21880
|
}
|
21754
21881
|
addClass(newVal);
|
21755
21882
|
}
|
21883
|
+
oldVal = newVal;
|
21756
21884
|
}
|
21757
21885
|
|
21758
21886
|
|
@@ -21785,7 +21913,7 @@ function classDirective(name, selector) {
|
|
21785
21913
|
*
|
21786
21914
|
* The directive won't add duplicate classes if a particular class was already set.
|
21787
21915
|
*
|
21788
|
-
* When the expression changes, the previously added classes are removed and only then the
|
21916
|
+
* When the expression changes, the previously added classes are removed and only then the
|
21789
21917
|
* new classes are added.
|
21790
21918
|
*
|
21791
21919
|
* @element ANY
|
@@ -23109,9 +23237,10 @@ var NG_SWITCH = 'ng-switch';
|
|
23109
23237
|
var ngSwitchDirective = valueFn({
|
23110
23238
|
restrict: 'EA',
|
23111
23239
|
require: 'ngSwitch',
|
23112
|
-
|
23240
|
+
// asks for $scope to fool the BC controller module
|
23241
|
+
controller: ['$scope', function ngSwitchController() {
|
23113
23242
|
this.cases = {};
|
23114
|
-
},
|
23243
|
+
}],
|
23115
23244
|
link: function(scope, element, attr, ctrl) {
|
23116
23245
|
var watchExpr = attr.ngSwitch || attr.on,
|
23117
23246
|
selectedTransclude,
|
@@ -23362,7 +23491,7 @@ var ngViewDirective = ['$http', '$templateCache', '$route', '$anchorScroll', '$c
|
|
23362
23491
|
if (current.controller) {
|
23363
23492
|
locals.$scope = lastScope;
|
23364
23493
|
controller = $controller(current.controller, locals);
|
23365
|
-
element.
|
23494
|
+
element.children().data('$ngControllerController', controller);
|
23366
23495
|
}
|
23367
23496
|
|
23368
23497
|
link(lastScope);
|
@@ -26027,7 +26156,7 @@ angular.scenario.output('xml', function(context, runner, model) {
|
|
26027
26156
|
if (step.error) {
|
26028
26157
|
var error = $('<error></error>');
|
26029
26158
|
stepContext.append(error);
|
26030
|
-
error.text(formatException(
|
26159
|
+
error.text(formatException(step.error));
|
26031
26160
|
}
|
26032
26161
|
});
|
26033
26162
|
});
|