angularjs-rails 1.5.8 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/angularjs-rails/engine.rb +1 -1
- data/lib/angularjs-rails/version.rb +1 -1
- data/vendor/assets/javascripts/angular-animate.js +75 -60
- data/vendor/assets/javascripts/angular-aria.js +29 -32
- data/vendor/assets/javascripts/angular-cookies.js +19 -11
- data/vendor/assets/javascripts/angular-loader.js +9 -8
- data/vendor/assets/javascripts/angular-message-format.js +61 -70
- data/vendor/assets/javascripts/angular-messages.js +10 -8
- data/vendor/assets/javascripts/angular-mocks.js +392 -114
- data/vendor/assets/javascripts/angular-parse-ext.js +3 -1
- data/vendor/assets/javascripts/angular-resource.js +79 -95
- data/vendor/assets/javascripts/angular-route.js +219 -72
- data/vendor/assets/javascripts/angular-sanitize.js +52 -51
- data/vendor/assets/javascripts/angular-scenario.js +3421 -2491
- data/vendor/assets/javascripts/angular-touch.js +31 -19
- data/vendor/assets/javascripts/angular.js +3332 -2205
- metadata +2 -2
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.
|
2
|
+
* @license AngularJS v1.6.0
|
3
3
|
* (c) 2010-2016 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -69,7 +69,7 @@ var jqLite;
|
|
69
69
|
* By default, `ngMessages` will only display one message for a particular key/value collection at any time. If more
|
70
70
|
* than one message (or error) key is currently true, then which message is shown is determined by the order of messages
|
71
71
|
* in the HTML template code (messages declared first are prioritised). This mechanism means the developer does not have
|
72
|
-
* to
|
72
|
+
* to prioritize messages using custom JavaScript code.
|
73
73
|
*
|
74
74
|
* Given the following error object for our example (which informs us that the field `myField` currently has both the
|
75
75
|
* `required` and `email` errors):
|
@@ -352,7 +352,7 @@ angular.module('ngMessages', [], function initAngularHelpers() {
|
|
352
352
|
return {
|
353
353
|
require: 'ngMessages',
|
354
354
|
restrict: 'AE',
|
355
|
-
controller: ['$element', '$scope', '$attrs', function($element, $scope, $attrs) {
|
355
|
+
controller: ['$element', '$scope', '$attrs', function NgMessagesCtrl($element, $scope, $attrs) {
|
356
356
|
var ctrl = this;
|
357
357
|
var latestKey = 0;
|
358
358
|
var nextAttachId = 0;
|
@@ -412,9 +412,11 @@ angular.module('ngMessages', [], function initAngularHelpers() {
|
|
412
412
|
messageCtrl.detach();
|
413
413
|
});
|
414
414
|
|
415
|
-
unmatchedMessages.length !== totalMessages
|
416
|
-
|
417
|
-
|
415
|
+
if (unmatchedMessages.length !== totalMessages) {
|
416
|
+
$animate.setClass($element, ACTIVE_CLASS, INACTIVE_CLASS);
|
417
|
+
} else {
|
418
|
+
$animate.setClass($element, INACTIVE_CLASS, ACTIVE_CLASS);
|
419
|
+
}
|
418
420
|
};
|
419
421
|
|
420
422
|
$scope.$watchCollection($attrs.ngMessages || $attrs['for'], ctrl.render);
|
@@ -430,8 +432,8 @@ angular.module('ngMessages', [], function initAngularHelpers() {
|
|
430
432
|
if (!renderLater) {
|
431
433
|
renderLater = true;
|
432
434
|
$scope.$evalAsync(function() {
|
433
|
-
if (renderLater) {
|
434
|
-
|
435
|
+
if (renderLater && cachedCollection) {
|
436
|
+
ctrl.render(cachedCollection);
|
435
437
|
}
|
436
438
|
});
|
437
439
|
}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.
|
2
|
+
* @license AngularJS v1.6.0
|
3
3
|
* (c) 2010-2016 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -40,7 +40,7 @@ angular.mock.$Browser = function() {
|
|
40
40
|
var self = this;
|
41
41
|
|
42
42
|
this.isMock = true;
|
43
|
-
self.$$url =
|
43
|
+
self.$$url = 'http://server/';
|
44
44
|
self.$$lastUrl = self.$$url; // used by url polling fn
|
45
45
|
self.pollFns = [];
|
46
46
|
|
@@ -252,19 +252,19 @@ angular.mock.$ExceptionHandlerProvider = function() {
|
|
252
252
|
case 'rethrow':
|
253
253
|
var errors = [];
|
254
254
|
handler = function(e) {
|
255
|
-
if (arguments.length
|
255
|
+
if (arguments.length === 1) {
|
256
256
|
errors.push(e);
|
257
257
|
} else {
|
258
258
|
errors.push([].slice.call(arguments, 0));
|
259
259
|
}
|
260
|
-
if (mode ===
|
260
|
+
if (mode === 'rethrow') {
|
261
261
|
throw e;
|
262
262
|
}
|
263
263
|
};
|
264
264
|
handler.errors = errors;
|
265
265
|
break;
|
266
266
|
default:
|
267
|
-
throw new Error(
|
267
|
+
throw new Error('Unknown mode \'' + mode + '\', only \'log\'/\'rethrow\' modes are allowed!');
|
268
268
|
}
|
269
269
|
};
|
270
270
|
|
@@ -414,8 +414,8 @@ angular.mock.$LogProvider = function() {
|
|
414
414
|
});
|
415
415
|
});
|
416
416
|
if (errors.length) {
|
417
|
-
errors.unshift(
|
418
|
-
|
417
|
+
errors.unshift('Expected $log to be empty! Either a message was logged unexpectedly, or ' +
|
418
|
+
'an expected log message was not checked and removed:');
|
419
419
|
errors.push('');
|
420
420
|
throw new Error(errors.join('\n---------\n'));
|
421
421
|
}
|
@@ -463,7 +463,7 @@ angular.mock.$IntervalProvider = function() {
|
|
463
463
|
promise = deferred.promise;
|
464
464
|
|
465
465
|
count = (angular.isDefined(count)) ? count : 0;
|
466
|
-
promise.then(null,
|
466
|
+
promise.then(null, function() {}, (!hasParams) ? fn : function() {
|
467
467
|
fn.apply(null, args);
|
468
468
|
});
|
469
469
|
|
@@ -523,6 +523,7 @@ angular.mock.$IntervalProvider = function() {
|
|
523
523
|
});
|
524
524
|
|
525
525
|
if (angular.isDefined(fnIndex)) {
|
526
|
+
repeatFns[fnIndex].deferred.promise.then(undefined, function() {});
|
526
527
|
repeatFns[fnIndex].deferred.reject('canceled');
|
527
528
|
repeatFns.splice(fnIndex, 1);
|
528
529
|
return true;
|
@@ -558,16 +559,13 @@ angular.mock.$IntervalProvider = function() {
|
|
558
559
|
};
|
559
560
|
|
560
561
|
|
561
|
-
/* jshint -W101 */
|
562
|
-
/* The R_ISO8061_STR regex is never going to fit into the 100 char limit!
|
563
|
-
* This directive should go inside the anonymous function but a bug in JSHint means that it would
|
564
|
-
* not be enacted early enough to prevent the warning.
|
565
|
-
*/
|
566
|
-
var R_ISO8061_STR = /^(-?\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?:\:?(\d\d)(?:\:?(\d\d)(?:\.(\d{3}))?)?)?(Z|([+-])(\d\d):?(\d\d)))?$/;
|
567
|
-
|
568
562
|
function jsonStringToDate(string) {
|
563
|
+
// The R_ISO8061_STR regex is never going to fit into the 100 char limit!
|
564
|
+
// eslit-disable-next-line max-len
|
565
|
+
var R_ISO8061_STR = /^(-?\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d{3}))?)?)?(Z|([+-])(\d\d):?(\d\d)))?$/;
|
566
|
+
|
569
567
|
var match;
|
570
|
-
if (match = string.match(R_ISO8061_STR)) {
|
568
|
+
if ((match = string.match(R_ISO8061_STR))) {
|
571
569
|
var date = new Date(0),
|
572
570
|
tzHour = 0,
|
573
571
|
tzMin = 0;
|
@@ -650,9 +648,10 @@ angular.mock.TzDate = function(offset, timestamp) {
|
|
650
648
|
|
651
649
|
timestamp = self.origDate.getTime();
|
652
650
|
if (isNaN(timestamp)) {
|
651
|
+
// eslint-disable-next-line no-throw-literal
|
653
652
|
throw {
|
654
|
-
name:
|
655
|
-
message:
|
653
|
+
name: 'Illegal Argument',
|
654
|
+
message: 'Arg \'' + tsStr + '\' passed into TzDate constructor is not a valid date string'
|
656
655
|
};
|
657
656
|
}
|
658
657
|
} else {
|
@@ -758,7 +757,7 @@ angular.mock.TzDate = function(offset, timestamp) {
|
|
758
757
|
|
759
758
|
angular.forEach(unimplementedMethods, function(methodName) {
|
760
759
|
self[methodName] = function() {
|
761
|
-
throw new Error(
|
760
|
+
throw new Error('Method \'' + methodName + '\' is not implemented in the TzDate mock');
|
762
761
|
};
|
763
762
|
});
|
764
763
|
|
@@ -767,7 +766,6 @@ angular.mock.TzDate = function(offset, timestamp) {
|
|
767
766
|
|
768
767
|
//make "tzDateInstance instanceof Date" return true
|
769
768
|
angular.mock.TzDate.prototype = Date.prototype;
|
770
|
-
/* jshint +W101 */
|
771
769
|
|
772
770
|
|
773
771
|
/**
|
@@ -1215,7 +1213,7 @@ angular.mock.dump = function(object) {
|
|
1215
1213
|
$httpBackend.expectPOST('/add-msg.py', undefined, function(headers) {
|
1216
1214
|
// check if the header was sent, if it wasn't the expectation won't
|
1217
1215
|
// match the request and the test will fail
|
1218
|
-
return headers['Authorization']
|
1216
|
+
return headers['Authorization'] === 'xxx';
|
1219
1217
|
}).respond(201, '');
|
1220
1218
|
|
1221
1219
|
$rootScope.saveMessage('whatever');
|
@@ -1357,7 +1355,11 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1357
1355
|
|
1358
1356
|
function wrapResponse(wrapped) {
|
1359
1357
|
if (!$browser && timeout) {
|
1360
|
-
|
1358
|
+
if (timeout.then) {
|
1359
|
+
timeout.then(handleTimeout);
|
1360
|
+
} else {
|
1361
|
+
$timeout(handleTimeout, timeout);
|
1362
|
+
}
|
1361
1363
|
}
|
1362
1364
|
|
1363
1365
|
return handleResponse;
|
@@ -1426,7 +1428,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1426
1428
|
* Creates a new backend definition.
|
1427
1429
|
*
|
1428
1430
|
* @param {string} method HTTP method.
|
1429
|
-
* @param {string|RegExp|function(string)} url HTTP url or function that receives a url
|
1431
|
+
* @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
|
1430
1432
|
* and returns true if the url matches the current definition.
|
1431
1433
|
* @param {(string|RegExp|function(string))=} data HTTP request body or function that receives
|
1432
1434
|
* data string and returns true if the data is as expected.
|
@@ -1448,6 +1450,9 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1448
1450
|
* the `requestHandler` object for possible overrides.
|
1449
1451
|
*/
|
1450
1452
|
$httpBackend.when = function(method, url, data, headers, keys) {
|
1453
|
+
|
1454
|
+
assertArgDefined(arguments, 1, 'url');
|
1455
|
+
|
1451
1456
|
var definition = new MockHttpExpectation(method, url, data, headers, keys),
|
1452
1457
|
chain = {
|
1453
1458
|
respond: function(status, data, headers, statusText) {
|
@@ -1475,7 +1480,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1475
1480
|
* @description
|
1476
1481
|
* Creates a new backend definition for GET requests. For more info see `when()`.
|
1477
1482
|
*
|
1478
|
-
* @param {string|RegExp|function(string)} url HTTP url or function that receives a url
|
1483
|
+
* @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
|
1479
1484
|
* and returns true if the url matches the current definition.
|
1480
1485
|
* @param {(Object|function(Object))=} headers HTTP headers.
|
1481
1486
|
* @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
|
@@ -1490,7 +1495,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1490
1495
|
* @description
|
1491
1496
|
* Creates a new backend definition for HEAD requests. For more info see `when()`.
|
1492
1497
|
*
|
1493
|
-
* @param {string|RegExp|function(string)} url HTTP url or function that receives a url
|
1498
|
+
* @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
|
1494
1499
|
* and returns true if the url matches the current definition.
|
1495
1500
|
* @param {(Object|function(Object))=} headers HTTP headers.
|
1496
1501
|
* @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
|
@@ -1505,7 +1510,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1505
1510
|
* @description
|
1506
1511
|
* Creates a new backend definition for DELETE requests. For more info see `when()`.
|
1507
1512
|
*
|
1508
|
-
* @param {string|RegExp|function(string)} url HTTP url or function that receives a url
|
1513
|
+
* @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
|
1509
1514
|
* and returns true if the url matches the current definition.
|
1510
1515
|
* @param {(Object|function(Object))=} headers HTTP headers.
|
1511
1516
|
* @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
|
@@ -1520,7 +1525,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1520
1525
|
* @description
|
1521
1526
|
* Creates a new backend definition for POST requests. For more info see `when()`.
|
1522
1527
|
*
|
1523
|
-
* @param {string|RegExp|function(string)} url HTTP url or function that receives a url
|
1528
|
+
* @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
|
1524
1529
|
* and returns true if the url matches the current definition.
|
1525
1530
|
* @param {(string|RegExp|function(string))=} data HTTP request body or function that receives
|
1526
1531
|
* data string and returns true if the data is as expected.
|
@@ -1537,7 +1542,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1537
1542
|
* @description
|
1538
1543
|
* Creates a new backend definition for PUT requests. For more info see `when()`.
|
1539
1544
|
*
|
1540
|
-
* @param {string|RegExp|function(string)} url HTTP url or function that receives a url
|
1545
|
+
* @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
|
1541
1546
|
* and returns true if the url matches the current definition.
|
1542
1547
|
* @param {(string|RegExp|function(string))=} data HTTP request body or function that receives
|
1543
1548
|
* data string and returns true if the data is as expected.
|
@@ -1554,7 +1559,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1554
1559
|
* @description
|
1555
1560
|
* Creates a new backend definition for JSONP requests. For more info see `when()`.
|
1556
1561
|
*
|
1557
|
-
* @param {string|RegExp|function(string)} url HTTP url or function that receives a url
|
1562
|
+
* @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
|
1558
1563
|
* and returns true if the url matches the current definition.
|
1559
1564
|
* @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
|
1560
1565
|
* @returns {requestHandler} Returns an object with `respond` method that controls how a matched
|
@@ -1590,7 +1595,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1590
1595
|
|
1591
1596
|
url = url
|
1592
1597
|
.replace(/([().])/g, '\\$1')
|
1593
|
-
.replace(/(\/)?:(\w+)([
|
1598
|
+
.replace(/(\/)?:(\w+)([?*])?/g, function(_, slash, key, option) {
|
1594
1599
|
var optional = option === '?' ? option : null;
|
1595
1600
|
var star = option === '*' ? option : null;
|
1596
1601
|
keys.push({ name: key, optional: !!optional });
|
@@ -1604,7 +1609,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1604
1609
|
+ ')'
|
1605
1610
|
+ (optional || '');
|
1606
1611
|
})
|
1607
|
-
.replace(/([
|
1612
|
+
.replace(/([/$*])/g, '\\$1');
|
1608
1613
|
|
1609
1614
|
ret.regexp = new RegExp('^' + url, 'i');
|
1610
1615
|
return ret;
|
@@ -1617,7 +1622,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1617
1622
|
* Creates a new request expectation.
|
1618
1623
|
*
|
1619
1624
|
* @param {string} method HTTP method.
|
1620
|
-
* @param {string|RegExp|function(string)} url HTTP url or function that receives a url
|
1625
|
+
* @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
|
1621
1626
|
* and returns true if the url matches the current definition.
|
1622
1627
|
* @param {(string|RegExp|function(string)|Object)=} data HTTP request body or function that
|
1623
1628
|
* receives data string and returns true if the data is as expected, or Object if request body
|
@@ -1640,6 +1645,9 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1640
1645
|
* the `requestHandler` object for possible overrides.
|
1641
1646
|
*/
|
1642
1647
|
$httpBackend.expect = function(method, url, data, headers, keys) {
|
1648
|
+
|
1649
|
+
assertArgDefined(arguments, 1, 'url');
|
1650
|
+
|
1643
1651
|
var expectation = new MockHttpExpectation(method, url, data, headers, keys),
|
1644
1652
|
chain = {
|
1645
1653
|
respond: function(status, data, headers, statusText) {
|
@@ -1658,7 +1666,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1658
1666
|
* @description
|
1659
1667
|
* Creates a new request expectation for GET requests. For more info see `expect()`.
|
1660
1668
|
*
|
1661
|
-
* @param {string|RegExp|function(string)} url HTTP url or function that receives a url
|
1669
|
+
* @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
|
1662
1670
|
* and returns true if the url matches the current definition.
|
1663
1671
|
* @param {Object=} headers HTTP headers.
|
1664
1672
|
* @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
|
@@ -1673,7 +1681,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1673
1681
|
* @description
|
1674
1682
|
* Creates a new request expectation for HEAD requests. For more info see `expect()`.
|
1675
1683
|
*
|
1676
|
-
* @param {string|RegExp|function(string)} url HTTP url or function that receives a url
|
1684
|
+
* @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
|
1677
1685
|
* and returns true if the url matches the current definition.
|
1678
1686
|
* @param {Object=} headers HTTP headers.
|
1679
1687
|
* @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
|
@@ -1688,7 +1696,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1688
1696
|
* @description
|
1689
1697
|
* Creates a new request expectation for DELETE requests. For more info see `expect()`.
|
1690
1698
|
*
|
1691
|
-
* @param {string|RegExp|function(string)} url HTTP url or function that receives a url
|
1699
|
+
* @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
|
1692
1700
|
* and returns true if the url matches the current definition.
|
1693
1701
|
* @param {Object=} headers HTTP headers.
|
1694
1702
|
* @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
|
@@ -1703,7 +1711,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1703
1711
|
* @description
|
1704
1712
|
* Creates a new request expectation for POST requests. For more info see `expect()`.
|
1705
1713
|
*
|
1706
|
-
* @param {string|RegExp|function(string)} url HTTP url or function that receives a url
|
1714
|
+
* @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
|
1707
1715
|
* and returns true if the url matches the current definition.
|
1708
1716
|
* @param {(string|RegExp|function(string)|Object)=} data HTTP request body or function that
|
1709
1717
|
* receives data string and returns true if the data is as expected, or Object if request body
|
@@ -1721,7 +1729,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1721
1729
|
* @description
|
1722
1730
|
* Creates a new request expectation for PUT requests. For more info see `expect()`.
|
1723
1731
|
*
|
1724
|
-
* @param {string|RegExp|function(string)} url HTTP url or function that receives a url
|
1732
|
+
* @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
|
1725
1733
|
* and returns true if the url matches the current definition.
|
1726
1734
|
* @param {(string|RegExp|function(string)|Object)=} data HTTP request body or function that
|
1727
1735
|
* receives data string and returns true if the data is as expected, or Object if request body
|
@@ -1739,7 +1747,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1739
1747
|
* @description
|
1740
1748
|
* Creates a new request expectation for PATCH requests. For more info see `expect()`.
|
1741
1749
|
*
|
1742
|
-
* @param {string|RegExp|function(string)} url HTTP url or function that receives a url
|
1750
|
+
* @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
|
1743
1751
|
* and returns true if the url matches the current definition.
|
1744
1752
|
* @param {(string|RegExp|function(string)|Object)=} data HTTP request body or function that
|
1745
1753
|
* receives data string and returns true if the data is as expected, or Object if request body
|
@@ -1757,7 +1765,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1757
1765
|
* @description
|
1758
1766
|
* Creates a new request expectation for JSONP requests. For more info see `expect()`.
|
1759
1767
|
*
|
1760
|
-
* @param {string|RegExp|function(string)} url HTTP url or function that receives an url
|
1768
|
+
* @param {string|RegExp|function(string)=} url HTTP url or function that receives an url
|
1761
1769
|
* and returns true if the url matches the current definition.
|
1762
1770
|
* @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
|
1763
1771
|
* @returns {requestHandler} Returns an object with `respond` method that controls how a matched
|
@@ -1788,24 +1796,34 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1788
1796
|
* @ngdoc method
|
1789
1797
|
* @name $httpBackend#flush
|
1790
1798
|
* @description
|
1791
|
-
* Flushes
|
1792
|
-
*
|
1793
|
-
*
|
1794
|
-
*
|
1795
|
-
*
|
1799
|
+
* Flushes pending requests using the trained responses. Requests are flushed in the order they
|
1800
|
+
* were made, but it is also possible to skip one or more requests (for example to have them
|
1801
|
+
* flushed later). This is useful for simulating scenarios where responses arrive from the server
|
1802
|
+
* in any order.
|
1803
|
+
*
|
1804
|
+
* If there are no pending requests to flush when the method is called, an exception is thrown (as
|
1805
|
+
* this is typically a sign of programming error).
|
1806
|
+
*
|
1807
|
+
* @param {number=} count - Number of responses to flush. If undefined/null, all pending requests
|
1808
|
+
* (starting after `skip`) will be flushed.
|
1809
|
+
* @param {number=} [skip=0] - Number of pending requests to skip. For example, a value of `5`
|
1810
|
+
* would skip the first 5 pending requests and start flushing from the 6th onwards.
|
1796
1811
|
*/
|
1797
|
-
$httpBackend.flush = function(count, digest) {
|
1812
|
+
$httpBackend.flush = function(count, skip, digest) {
|
1798
1813
|
if (digest !== false) $rootScope.$digest();
|
1799
|
-
|
1814
|
+
|
1815
|
+
skip = skip || 0;
|
1816
|
+
if (skip >= responses.length) throw new Error('No pending request to flush !');
|
1800
1817
|
|
1801
1818
|
if (angular.isDefined(count) && count !== null) {
|
1802
1819
|
while (count--) {
|
1803
|
-
|
1804
|
-
|
1820
|
+
var part = responses.splice(skip, 1);
|
1821
|
+
if (!part.length) throw new Error('No more pending request to flush !');
|
1822
|
+
part[0]();
|
1805
1823
|
}
|
1806
1824
|
} else {
|
1807
|
-
while (responses.length) {
|
1808
|
-
responses.
|
1825
|
+
while (responses.length > skip) {
|
1826
|
+
responses.splice(skip, 1)[0]();
|
1809
1827
|
}
|
1810
1828
|
}
|
1811
1829
|
$httpBackend.verifyNoOutstandingExpectation(digest);
|
@@ -1847,7 +1865,8 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1847
1865
|
* afterEach($httpBackend.verifyNoOutstandingRequest);
|
1848
1866
|
* ```
|
1849
1867
|
*/
|
1850
|
-
$httpBackend.verifyNoOutstandingRequest = function() {
|
1868
|
+
$httpBackend.verifyNoOutstandingRequest = function(digest) {
|
1869
|
+
if (digest !== false) $rootScope.$digest();
|
1851
1870
|
if (responses.length) {
|
1852
1871
|
throw new Error('Unflushed requests: ' + responses.length);
|
1853
1872
|
}
|
@@ -1873,18 +1892,35 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1873
1892
|
function createShortMethods(prefix) {
|
1874
1893
|
angular.forEach(['GET', 'DELETE', 'JSONP', 'HEAD'], function(method) {
|
1875
1894
|
$httpBackend[prefix + method] = function(url, headers, keys) {
|
1895
|
+
assertArgDefined(arguments, 0, 'url');
|
1896
|
+
|
1897
|
+
// Change url to `null` if `undefined` to stop it throwing an exception further down
|
1898
|
+
if (angular.isUndefined(url)) url = null;
|
1899
|
+
|
1876
1900
|
return $httpBackend[prefix](method, url, undefined, headers, keys);
|
1877
1901
|
};
|
1878
1902
|
});
|
1879
1903
|
|
1880
1904
|
angular.forEach(['PUT', 'POST', 'PATCH'], function(method) {
|
1881
1905
|
$httpBackend[prefix + method] = function(url, data, headers, keys) {
|
1906
|
+
assertArgDefined(arguments, 0, 'url');
|
1907
|
+
|
1908
|
+
// Change url to `null` if `undefined` to stop it throwing an exception further down
|
1909
|
+
if (angular.isUndefined(url)) url = null;
|
1910
|
+
|
1882
1911
|
return $httpBackend[prefix](method, url, data, headers, keys);
|
1883
1912
|
};
|
1884
1913
|
});
|
1885
1914
|
}
|
1886
1915
|
}
|
1887
1916
|
|
1917
|
+
function assertArgDefined(args, index, name) {
|
1918
|
+
if (args.length > index && angular.isUndefined(args[index])) {
|
1919
|
+
throw new Error('Undefined argument `' + name + '`; the argument is provided but not defined');
|
1920
|
+
}
|
1921
|
+
}
|
1922
|
+
|
1923
|
+
|
1888
1924
|
function MockHttpExpectation(method, url, data, headers, keys) {
|
1889
1925
|
|
1890
1926
|
function getUrlParams(u) {
|
@@ -1893,14 +1929,15 @@ function MockHttpExpectation(method, url, data, headers, keys) {
|
|
1893
1929
|
}
|
1894
1930
|
|
1895
1931
|
function compareUrl(u) {
|
1896
|
-
return (url.slice(0, url.indexOf('?'))
|
1932
|
+
return (url.slice(0, url.indexOf('?')) === u.slice(0, u.indexOf('?')) &&
|
1933
|
+
getUrlParams(url).join() === getUrlParams(u).join());
|
1897
1934
|
}
|
1898
1935
|
|
1899
1936
|
this.data = data;
|
1900
1937
|
this.headers = headers;
|
1901
1938
|
|
1902
1939
|
this.match = function(m, u, d, h) {
|
1903
|
-
if (method
|
1940
|
+
if (method !== m) return false;
|
1904
1941
|
if (!this.matchUrl(u)) return false;
|
1905
1942
|
if (angular.isDefined(d) && !this.matchData(d)) return false;
|
1906
1943
|
if (angular.isDefined(h) && !this.matchHeaders(h)) return false;
|
@@ -1911,7 +1948,7 @@ function MockHttpExpectation(method, url, data, headers, keys) {
|
|
1911
1948
|
if (!url) return true;
|
1912
1949
|
if (angular.isFunction(url.test)) return url.test(u);
|
1913
1950
|
if (angular.isFunction(url)) return url(u);
|
1914
|
-
return (url
|
1951
|
+
return (url === u || compareUrl(u));
|
1915
1952
|
};
|
1916
1953
|
|
1917
1954
|
this.matchHeaders = function(h) {
|
@@ -1927,6 +1964,7 @@ function MockHttpExpectation(method, url, data, headers, keys) {
|
|
1927
1964
|
if (data && !angular.isString(data)) {
|
1928
1965
|
return angular.equals(angular.fromJson(angular.toJson(data)), angular.fromJson(d));
|
1929
1966
|
}
|
1967
|
+
// eslint-disable-next-line eqeqeq
|
1930
1968
|
return data == d;
|
1931
1969
|
};
|
1932
1970
|
|
@@ -1958,7 +1996,7 @@ function MockHttpExpectation(method, url, data, headers, keys) {
|
|
1958
1996
|
var obj = {}, key_value, key,
|
1959
1997
|
queryStr = u.indexOf('?') > -1
|
1960
1998
|
? u.substring(u.indexOf('?') + 1)
|
1961
|
-
:
|
1999
|
+
: '';
|
1962
2000
|
|
1963
2001
|
angular.forEach(queryStr.split('&'), function(keyValue) {
|
1964
2002
|
if (keyValue) {
|
@@ -2025,7 +2063,7 @@ function MockXhr() {
|
|
2025
2063
|
|
2026
2064
|
header = undefined;
|
2027
2065
|
angular.forEach(this.$$respHeaders, function(headerVal, headerName) {
|
2028
|
-
if (!header && angular.lowercase(headerName)
|
2066
|
+
if (!header && angular.lowercase(headerName) === name) header = headerVal;
|
2029
2067
|
});
|
2030
2068
|
return header;
|
2031
2069
|
};
|
@@ -2098,7 +2136,7 @@ angular.mock.$TimeoutDecorator = ['$delegate', '$browser', function($delegate, $
|
|
2098
2136
|
function formatPendingTasksAsString(tasks) {
|
2099
2137
|
var result = [];
|
2100
2138
|
angular.forEach(tasks, function(task) {
|
2101
|
-
result.push('{id: ' + task.id + ',
|
2139
|
+
result.push('{id: ' + task.id + ', time: ' + task.time + '}');
|
2102
2140
|
});
|
2103
2141
|
|
2104
2142
|
return result.join(', ');
|
@@ -2153,6 +2191,10 @@ angular.mock.$RootElementProvider = function() {
|
|
2153
2191
|
* A decorator for {@link ng.$controller} with additional `bindings` parameter, useful when testing
|
2154
2192
|
* controllers of directives that use {@link $compile#-bindtocontroller- `bindToController`}.
|
2155
2193
|
*
|
2194
|
+
* Depending on the value of
|
2195
|
+
* {@link ng.$compileProvider#preAssignBindingsEnabled `preAssignBindingsEnabled()`}, the properties
|
2196
|
+
* will be bound before or after invoking the constructor.
|
2197
|
+
*
|
2156
2198
|
*
|
2157
2199
|
* ## Example
|
2158
2200
|
*
|
@@ -2171,18 +2213,24 @@ angular.mock.$RootElementProvider = function() {
|
|
2171
2213
|
* // Controller definition ...
|
2172
2214
|
*
|
2173
2215
|
* myMod.controller('MyDirectiveController', ['$log', function($log) {
|
2174
|
-
*
|
2216
|
+
* this.log = function() {
|
2217
|
+
* $log.info(this.name);
|
2218
|
+
* };
|
2175
2219
|
* }]);
|
2176
2220
|
*
|
2177
2221
|
*
|
2178
2222
|
* // In a test ...
|
2179
2223
|
*
|
2180
2224
|
* describe('myDirectiveController', function() {
|
2181
|
-
*
|
2182
|
-
*
|
2183
|
-
*
|
2184
|
-
*
|
2185
|
-
*
|
2225
|
+
* describe('log()', function() {
|
2226
|
+
* it('should write the bound name to the log', inject(function($controller, $log) {
|
2227
|
+
* var ctrl = $controller('MyDirectiveController', { /* no locals */ }, { name: 'Clark Kent' });
|
2228
|
+
* ctrl.log();
|
2229
|
+
*
|
2230
|
+
* expect(ctrl.name).toEqual('Clark Kent');
|
2231
|
+
* expect($log.info.logs).toEqual(['Clark Kent']);
|
2232
|
+
* }));
|
2233
|
+
* });
|
2186
2234
|
* });
|
2187
2235
|
*
|
2188
2236
|
* ```
|
@@ -2194,44 +2242,61 @@ angular.mock.$RootElementProvider = function() {
|
|
2194
2242
|
* * check if a controller with given name is registered via `$controllerProvider`
|
2195
2243
|
* * check if evaluating the string on the current scope returns a constructor
|
2196
2244
|
* * if $controllerProvider#allowGlobals, check `window[constructor]` on the global
|
2197
|
-
* `window` object (not recommended)
|
2245
|
+
* `window` object (deprecated, not recommended)
|
2198
2246
|
*
|
2199
2247
|
* The string can use the `controller as property` syntax, where the controller instance is published
|
2200
2248
|
* as the specified property on the `scope`; the `scope` must be injected into `locals` param for this
|
2201
2249
|
* to work correctly.
|
2202
2250
|
*
|
2203
2251
|
* @param {Object} locals Injection locals for Controller.
|
2204
|
-
* @param {Object=} bindings Properties to add to the controller
|
2205
|
-
*
|
2252
|
+
* @param {Object=} bindings Properties to add to the controller instance. This is used to simulate
|
2253
|
+
* the `bindToController` feature and simplify certain kinds of tests.
|
2206
2254
|
* @return {Object} Instance of given controller.
|
2207
2255
|
*/
|
2208
|
-
|
2209
|
-
|
2210
|
-
|
2211
|
-
|
2212
|
-
|
2213
|
-
|
2214
|
-
|
2215
|
-
|
2216
|
-
|
2256
|
+
function createControllerDecorator(compileProvider) {
|
2257
|
+
angular.mock.$ControllerDecorator = ['$delegate', function($delegate) {
|
2258
|
+
return function(expression, locals, later, ident) {
|
2259
|
+
if (later && typeof later === 'object') {
|
2260
|
+
var preAssignBindingsEnabled = compileProvider.preAssignBindingsEnabled();
|
2261
|
+
|
2262
|
+
var instantiate = $delegate(expression, locals, true, ident);
|
2263
|
+
if (preAssignBindingsEnabled) {
|
2264
|
+
angular.extend(instantiate.instance, later);
|
2265
|
+
}
|
2266
|
+
|
2267
|
+
var instance = instantiate();
|
2268
|
+
if (!preAssignBindingsEnabled || instance !== instantiate.instance) {
|
2269
|
+
angular.extend(instance, later);
|
2270
|
+
}
|
2271
|
+
|
2272
|
+
return instance;
|
2217
2273
|
}
|
2274
|
+
return $delegate(expression, locals, later, ident);
|
2275
|
+
};
|
2276
|
+
}];
|
2218
2277
|
|
2219
|
-
|
2220
|
-
|
2221
|
-
return $delegate(expression, locals, later, ident);
|
2222
|
-
};
|
2223
|
-
}];
|
2278
|
+
return angular.mock.$ControllerDecorator;
|
2279
|
+
}
|
2224
2280
|
|
2225
2281
|
/**
|
2226
2282
|
* @ngdoc service
|
2227
2283
|
* @name $componentController
|
2228
2284
|
* @description
|
2229
|
-
* A service that can be used to create instances of component controllers.
|
2230
|
-
*
|
2285
|
+
* A service that can be used to create instances of component controllers. Useful for unit-testing.
|
2286
|
+
*
|
2231
2287
|
* Be aware that the controller will be instantiated and attached to the scope as specified in
|
2232
2288
|
* the component definition object. If you do not provide a `$scope` object in the `locals` param
|
2233
2289
|
* then the helper will create a new isolated scope as a child of `$rootScope`.
|
2234
|
-
*
|
2290
|
+
*
|
2291
|
+
* If you are using `$element` or `$attrs` in the controller, make sure to provide them as `locals`.
|
2292
|
+
* The `$element` must be a jqLite-wrapped DOM element, and `$attrs` should be an object that
|
2293
|
+
* has all properties / functions that you are using in the controller. If this is getting too complex,
|
2294
|
+
* you should compile the component instead and access the component's controller via the
|
2295
|
+
* {@link angular.element#methods `controller`} function.
|
2296
|
+
*
|
2297
|
+
* See also the section on {@link guide/component#unit-testing-component-controllers unit-testing component controllers}
|
2298
|
+
* in the guide.
|
2299
|
+
*
|
2235
2300
|
* @param {string} componentName the name of the component whose controller we want to instantiate
|
2236
2301
|
* @param {Object} locals Injection locals for Controller.
|
2237
2302
|
* @param {Object=} bindings Properties to add to the controller before invoking the constructor. This is used
|
@@ -2239,7 +2304,8 @@ angular.mock.$ControllerDecorator = ['$delegate', function($delegate) {
|
|
2239
2304
|
* @param {string=} ident Override the property name to use when attaching the controller to the scope.
|
2240
2305
|
* @return {Object} Instance of requested controller.
|
2241
2306
|
*/
|
2242
|
-
angular.mock.$ComponentControllerProvider = ['$compileProvider',
|
2307
|
+
angular.mock.$ComponentControllerProvider = ['$compileProvider',
|
2308
|
+
function ComponentControllerProvider($compileProvider) {
|
2243
2309
|
this.$get = ['$controller','$injector', '$rootScope', function($controller, $injector, $rootScope) {
|
2244
2310
|
return function $componentController(componentName, locals, bindings, ident) {
|
2245
2311
|
// get all directives associated to the component name
|
@@ -2288,6 +2354,7 @@ angular.mock.$ComponentControllerProvider = ['$compileProvider', function($compi
|
|
2288
2354
|
* * [Google CDN](https://developers.google.com/speed/libraries/devguide#angularjs) e.g.
|
2289
2355
|
* `"//ajax.googleapis.com/ajax/libs/angularjs/X.Y.Z/angular-mocks.js"`
|
2290
2356
|
* * [NPM](https://www.npmjs.com/) e.g. `npm install angular-mocks@X.Y.Z`
|
2357
|
+
* * [Yarn](https://yarnpkg.com) e.g. `yarn add angular-mocks@X.Y.Z`
|
2291
2358
|
* * [Bower](http://bower.io) e.g. `bower install angular-mocks#X.Y.Z`
|
2292
2359
|
* * [code.angularjs.org](https://code.angularjs.org/) (discouraged for production use) e.g.
|
2293
2360
|
* `"//code.angularjs.org/X.Y.Z/angular-mocks.js"`
|
@@ -2319,11 +2386,11 @@ angular.module('ngMock', ['ng']).provider({
|
|
2319
2386
|
$httpBackend: angular.mock.$HttpBackendProvider,
|
2320
2387
|
$rootElement: angular.mock.$RootElementProvider,
|
2321
2388
|
$componentController: angular.mock.$ComponentControllerProvider
|
2322
|
-
}).config(['$provide', function($provide) {
|
2389
|
+
}).config(['$provide', '$compileProvider', function($provide, $compileProvider) {
|
2323
2390
|
$provide.decorator('$timeout', angular.mock.$TimeoutDecorator);
|
2324
2391
|
$provide.decorator('$$rAF', angular.mock.$RAFDecorator);
|
2325
2392
|
$provide.decorator('$rootScope', angular.mock.$RootScopeDecorator);
|
2326
|
-
$provide.decorator('$controller',
|
2393
|
+
$provide.decorator('$controller', createControllerDecorator($compileProvider));
|
2327
2394
|
}]);
|
2328
2395
|
|
2329
2396
|
/**
|
@@ -2387,7 +2454,7 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
|
|
2387
2454
|
* phones.push(phone);
|
2388
2455
|
* return [200, phone, {}];
|
2389
2456
|
* });
|
2390
|
-
* $httpBackend.whenGET(/^\/templates\//).passThrough(); // Requests for
|
2457
|
+
* $httpBackend.whenGET(/^\/templates\//).passThrough(); // Requests for templates are handled by the real server
|
2391
2458
|
* //...
|
2392
2459
|
* });
|
2393
2460
|
* ```
|
@@ -2399,7 +2466,7 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
|
|
2399
2466
|
* <file name="app.js">
|
2400
2467
|
* var myApp = angular.module('myApp', []);
|
2401
2468
|
*
|
2402
|
-
* myApp.controller('
|
2469
|
+
* myApp.controller('MainCtrl', function MainCtrl($http) {
|
2403
2470
|
* var ctrl = this;
|
2404
2471
|
*
|
2405
2472
|
* ctrl.phones = [];
|
@@ -2441,7 +2508,7 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
|
|
2441
2508
|
* });
|
2442
2509
|
* </file>
|
2443
2510
|
* <file name="index.html">
|
2444
|
-
* <div ng-controller="
|
2511
|
+
* <div ng-controller="MainCtrl as $ctrl">
|
2445
2512
|
* <form name="newPhoneForm" ng-submit="$ctrl.addPhone($ctrl.newPhone)">
|
2446
2513
|
* <input type="text" ng-model="$ctrl.newPhone.name">
|
2447
2514
|
* <input type="submit" value="Add Phone">
|
@@ -2465,7 +2532,7 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
|
|
2465
2532
|
* Creates a new backend definition.
|
2466
2533
|
*
|
2467
2534
|
* @param {string} method HTTP method.
|
2468
|
-
* @param {string|RegExp|function(string)} url HTTP url or function that receives a url
|
2535
|
+
* @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
|
2469
2536
|
* and returns true if the url matches the current definition.
|
2470
2537
|
* @param {(string|RegExp)=} data HTTP request body.
|
2471
2538
|
* @param {(Object|function(Object))=} headers HTTP headers or function that receives http header
|
@@ -2497,7 +2564,7 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
|
|
2497
2564
|
* @description
|
2498
2565
|
* Creates a new backend definition for GET requests. For more info see `when()`.
|
2499
2566
|
*
|
2500
|
-
* @param {string|RegExp|function(string)} url HTTP url or function that receives a url
|
2567
|
+
* @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
|
2501
2568
|
* and returns true if the url matches the current definition.
|
2502
2569
|
* @param {(Object|function(Object))=} headers HTTP headers.
|
2503
2570
|
* @param {(Array)=} keys Array of keys to assign to regex matches in request url described on
|
@@ -2514,7 +2581,7 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
|
|
2514
2581
|
* @description
|
2515
2582
|
* Creates a new backend definition for HEAD requests. For more info see `when()`.
|
2516
2583
|
*
|
2517
|
-
* @param {string|RegExp|function(string)} url HTTP url or function that receives a url
|
2584
|
+
* @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
|
2518
2585
|
* and returns true if the url matches the current definition.
|
2519
2586
|
* @param {(Object|function(Object))=} headers HTTP headers.
|
2520
2587
|
* @param {(Array)=} keys Array of keys to assign to regex matches in request url described on
|
@@ -2531,7 +2598,7 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
|
|
2531
2598
|
* @description
|
2532
2599
|
* Creates a new backend definition for DELETE requests. For more info see `when()`.
|
2533
2600
|
*
|
2534
|
-
* @param {string|RegExp|function(string)} url HTTP url or function that receives a url
|
2601
|
+
* @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
|
2535
2602
|
* and returns true if the url matches the current definition.
|
2536
2603
|
* @param {(Object|function(Object))=} headers HTTP headers.
|
2537
2604
|
* @param {(Array)=} keys Array of keys to assign to regex matches in request url described on
|
@@ -2548,7 +2615,7 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
|
|
2548
2615
|
* @description
|
2549
2616
|
* Creates a new backend definition for POST requests. For more info see `when()`.
|
2550
2617
|
*
|
2551
|
-
* @param {string|RegExp|function(string)} url HTTP url or function that receives a url
|
2618
|
+
* @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
|
2552
2619
|
* and returns true if the url matches the current definition.
|
2553
2620
|
* @param {(string|RegExp)=} data HTTP request body.
|
2554
2621
|
* @param {(Object|function(Object))=} headers HTTP headers.
|
@@ -2566,7 +2633,7 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
|
|
2566
2633
|
* @description
|
2567
2634
|
* Creates a new backend definition for PUT requests. For more info see `when()`.
|
2568
2635
|
*
|
2569
|
-
* @param {string|RegExp|function(string)} url HTTP url or function that receives a url
|
2636
|
+
* @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
|
2570
2637
|
* and returns true if the url matches the current definition.
|
2571
2638
|
* @param {(string|RegExp)=} data HTTP request body.
|
2572
2639
|
* @param {(Object|function(Object))=} headers HTTP headers.
|
@@ -2584,7 +2651,7 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
|
|
2584
2651
|
* @description
|
2585
2652
|
* Creates a new backend definition for PATCH requests. For more info see `when()`.
|
2586
2653
|
*
|
2587
|
-
* @param {string|RegExp|function(string)} url HTTP url or function that receives a url
|
2654
|
+
* @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
|
2588
2655
|
* and returns true if the url matches the current definition.
|
2589
2656
|
* @param {(string|RegExp)=} data HTTP request body.
|
2590
2657
|
* @param {(Object|function(Object))=} headers HTTP headers.
|
@@ -2602,7 +2669,7 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
|
|
2602
2669
|
* @description
|
2603
2670
|
* Creates a new backend definition for JSONP requests. For more info see `when()`.
|
2604
2671
|
*
|
2605
|
-
* @param {string|RegExp|function(string)} url HTTP url or function that receives a url
|
2672
|
+
* @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
|
2606
2673
|
* and returns true if the url matches the current definition.
|
2607
2674
|
* @param {(Array)=} keys Array of keys to assign to regex matches in request url described on
|
2608
2675
|
* {@link ngMock.$httpBackend $httpBackend mock}.
|
@@ -2654,6 +2721,7 @@ angular.mock.$RootScopeDecorator = ['$delegate', function($delegate) {
|
|
2654
2721
|
* @ngdoc method
|
2655
2722
|
* @name $rootScope.Scope#$countChildScopes
|
2656
2723
|
* @module ngMock
|
2724
|
+
* @this $rootScope.Scope
|
2657
2725
|
* @description
|
2658
2726
|
* Counts all the direct and indirect child scopes of the current scope.
|
2659
2727
|
*
|
@@ -2662,7 +2730,6 @@ angular.mock.$RootScopeDecorator = ['$delegate', function($delegate) {
|
|
2662
2730
|
* @returns {number} Total number of child scopes.
|
2663
2731
|
*/
|
2664
2732
|
function countChildScopes() {
|
2665
|
-
// jshint validthis: true
|
2666
2733
|
var count = 0; // exclude the current scope
|
2667
2734
|
var pendingChildHeads = [this.$$childHead];
|
2668
2735
|
var currentScope;
|
@@ -2684,6 +2751,7 @@ angular.mock.$RootScopeDecorator = ['$delegate', function($delegate) {
|
|
2684
2751
|
/**
|
2685
2752
|
* @ngdoc method
|
2686
2753
|
* @name $rootScope.Scope#$countWatchers
|
2754
|
+
* @this $rootScope.Scope
|
2687
2755
|
* @module ngMock
|
2688
2756
|
* @description
|
2689
2757
|
* Counts all the watchers of direct and indirect child scopes of the current scope.
|
@@ -2694,7 +2762,6 @@ angular.mock.$RootScopeDecorator = ['$delegate', function($delegate) {
|
|
2694
2762
|
* @returns {number} Total number of watchers.
|
2695
2763
|
*/
|
2696
2764
|
function countWatchers() {
|
2697
|
-
// jshint validthis: true
|
2698
2765
|
var count = this.$$watchers ? this.$$watchers.length : 0; // include the current scope
|
2699
2766
|
var pendingChildHeads = [this.$$childHead];
|
2700
2767
|
var currentScope;
|
@@ -2714,7 +2781,7 @@ angular.mock.$RootScopeDecorator = ['$delegate', function($delegate) {
|
|
2714
2781
|
}];
|
2715
2782
|
|
2716
2783
|
|
2717
|
-
|
2784
|
+
(function(jasmineOrMocha) {
|
2718
2785
|
|
2719
2786
|
if (!jasmineOrMocha) {
|
2720
2787
|
return;
|
@@ -2809,7 +2876,7 @@ angular.mock.$RootScopeDecorator = ['$delegate', function($delegate) {
|
|
2809
2876
|
*
|
2810
2877
|
* You cannot call `sharedInjector()` from within a context already using `sharedInjector()`.
|
2811
2878
|
*
|
2812
|
-
* ##
|
2879
|
+
* ## Example
|
2813
2880
|
*
|
2814
2881
|
* Typically beforeAll is used to make many assertions about a single operation. This can
|
2815
2882
|
* cut down test run-time as the test setup doesn't need to be re-run, and enabling focussed
|
@@ -2847,14 +2914,14 @@ angular.mock.$RootScopeDecorator = ['$delegate', function($delegate) {
|
|
2847
2914
|
*/
|
2848
2915
|
module.sharedInjector = function() {
|
2849
2916
|
if (!(module.$$beforeAllHook && module.$$afterAllHook)) {
|
2850
|
-
throw Error(
|
2917
|
+
throw Error('sharedInjector() cannot be used unless your test runner defines beforeAll/afterAll');
|
2851
2918
|
}
|
2852
2919
|
|
2853
2920
|
var initialized = false;
|
2854
2921
|
|
2855
|
-
module.$$beforeAllHook(function() {
|
2922
|
+
module.$$beforeAllHook(/** @this */ function() {
|
2856
2923
|
if (injectorState.shared) {
|
2857
|
-
injectorState.sharedError = Error(
|
2924
|
+
injectorState.sharedError = Error('sharedInjector() cannot be called inside a context that has already called sharedInjector()');
|
2858
2925
|
throw injectorState.sharedError;
|
2859
2926
|
}
|
2860
2927
|
initialized = true;
|
@@ -2873,10 +2940,10 @@ angular.mock.$RootScopeDecorator = ['$delegate', function($delegate) {
|
|
2873
2940
|
};
|
2874
2941
|
|
2875
2942
|
module.$$beforeEach = function() {
|
2876
|
-
if (injectorState.shared && currentSpec && currentSpec
|
2943
|
+
if (injectorState.shared && currentSpec && currentSpec !== this) {
|
2877
2944
|
var state = currentSpec;
|
2878
2945
|
currentSpec = this;
|
2879
|
-
angular.forEach([
|
2946
|
+
angular.forEach(['$injector','$modules','$providerInjector', '$injectorStrict'], function(k) {
|
2880
2947
|
currentSpec[k] = state[k];
|
2881
2948
|
state[k] = null;
|
2882
2949
|
});
|
@@ -2967,7 +3034,7 @@ angular.mock.$RootScopeDecorator = ['$delegate', function($delegate) {
|
|
2967
3034
|
* These are ignored by the injector when the reference name is resolved.
|
2968
3035
|
*
|
2969
3036
|
* For example, the parameter `_myService_` would be resolved as the reference `myService`.
|
2970
|
-
* Since it is available in the function body as _myService_
|
3037
|
+
* Since it is available in the function body as `_myService_`, we can then assign it to a variable
|
2971
3038
|
* defined in an outer scope.
|
2972
3039
|
*
|
2973
3040
|
* ```
|
@@ -3031,7 +3098,7 @@ angular.mock.$RootScopeDecorator = ['$delegate', function($delegate) {
|
|
3031
3098
|
|
3032
3099
|
|
3033
3100
|
|
3034
|
-
var ErrorAddingDeclarationLocationStack = function(e, errorForStack) {
|
3101
|
+
var ErrorAddingDeclarationLocationStack = function ErrorAddingDeclarationLocationStack(e, errorForStack) {
|
3035
3102
|
this.message = e.message;
|
3036
3103
|
this.name = e.name;
|
3037
3104
|
if (e.line) this.line = e.line;
|
@@ -3049,11 +3116,11 @@ angular.mock.$RootScopeDecorator = ['$delegate', function($delegate) {
|
|
3049
3116
|
if (!errorForStack.stack) {
|
3050
3117
|
try {
|
3051
3118
|
throw errorForStack;
|
3052
|
-
} catch (e) {}
|
3119
|
+
} catch (e) { /* empty */ }
|
3053
3120
|
}
|
3054
|
-
return wasInjectorCreated() ?
|
3121
|
+
return wasInjectorCreated() ? WorkFn.call(currentSpec) : WorkFn;
|
3055
3122
|
/////////////////////
|
3056
|
-
function
|
3123
|
+
function WorkFn() {
|
3057
3124
|
var modules = currentSpec.$modules || [];
|
3058
3125
|
var strictDi = !!currentSpec.$injectorStrict;
|
3059
3126
|
modules.unshift(['$injector', function($injector) {
|
@@ -3066,7 +3133,7 @@ angular.mock.$RootScopeDecorator = ['$delegate', function($delegate) {
|
|
3066
3133
|
if (strictDi) {
|
3067
3134
|
// If strictDi is enabled, annotate the providerInjector blocks
|
3068
3135
|
angular.forEach(modules, function(moduleFn) {
|
3069
|
-
if (typeof moduleFn ===
|
3136
|
+
if (typeof moduleFn === 'function') {
|
3070
3137
|
angular.injector.$$annotate(moduleFn);
|
3071
3138
|
}
|
3072
3139
|
});
|
@@ -3081,9 +3148,7 @@ angular.mock.$RootScopeDecorator = ['$delegate', function($delegate) {
|
|
3081
3148
|
injector.annotate(blockFns[i]);
|
3082
3149
|
}
|
3083
3150
|
try {
|
3084
|
-
/* jshint -W040 *//* Jasmine explicitly provides a `this` object when calling functions */
|
3085
3151
|
injector.invoke(blockFns[i] || angular.noop, this);
|
3086
|
-
/* jshint +W040 */
|
3087
3152
|
} catch (e) {
|
3088
3153
|
if (e.stack && errorForStack) {
|
3089
3154
|
throw new ErrorAddingDeclarationLocationStack(e, errorForStack);
|
@@ -3122,5 +3187,218 @@ angular.mock.$RootScopeDecorator = ['$delegate', function($delegate) {
|
|
3122
3187
|
}
|
3123
3188
|
})(window.jasmine || window.mocha);
|
3124
3189
|
|
3190
|
+
'use strict';
|
3191
|
+
|
3192
|
+
(function() {
|
3193
|
+
/**
|
3194
|
+
* Triggers a browser event. Attempts to choose the right event if one is
|
3195
|
+
* not specified.
|
3196
|
+
*
|
3197
|
+
* @param {Object} element Either a wrapped jQuery/jqLite node or a DOMElement
|
3198
|
+
* @param {string} eventType Optional event type
|
3199
|
+
* @param {Object=} eventData An optional object which contains additional event data (such as x,y
|
3200
|
+
* coordinates, keys, etc...) that are passed into the event when triggered
|
3201
|
+
*/
|
3202
|
+
window.browserTrigger = function browserTrigger(element, eventType, eventData) {
|
3203
|
+
if (element && !element.nodeName) element = element[0];
|
3204
|
+
if (!element) return;
|
3205
|
+
|
3206
|
+
eventData = eventData || {};
|
3207
|
+
var relatedTarget = eventData.relatedTarget || element;
|
3208
|
+
var keys = eventData.keys;
|
3209
|
+
var x = eventData.x;
|
3210
|
+
var y = eventData.y;
|
3211
|
+
|
3212
|
+
var inputType = (element.type) ? element.type.toLowerCase() : null,
|
3213
|
+
nodeName = element.nodeName.toLowerCase();
|
3214
|
+
if (!eventType) {
|
3215
|
+
eventType = {
|
3216
|
+
'text': 'change',
|
3217
|
+
'textarea': 'change',
|
3218
|
+
'hidden': 'change',
|
3219
|
+
'password': 'change',
|
3220
|
+
'button': 'click',
|
3221
|
+
'submit': 'click',
|
3222
|
+
'reset': 'click',
|
3223
|
+
'image': 'click',
|
3224
|
+
'checkbox': 'click',
|
3225
|
+
'radio': 'click',
|
3226
|
+
'select-one': 'change',
|
3227
|
+
'select-multiple': 'change',
|
3228
|
+
'_default_': 'click'
|
3229
|
+
}[inputType || '_default_'];
|
3230
|
+
}
|
3231
|
+
|
3232
|
+
if (nodeName === 'option') {
|
3233
|
+
element.parentNode.value = element.value;
|
3234
|
+
element = element.parentNode;
|
3235
|
+
eventType = 'change';
|
3236
|
+
}
|
3237
|
+
|
3238
|
+
keys = keys || [];
|
3239
|
+
function pressed(key) {
|
3240
|
+
return keys.indexOf(key) !== -1;
|
3241
|
+
}
|
3242
|
+
|
3243
|
+
var evnt;
|
3244
|
+
if (/transitionend/.test(eventType)) {
|
3245
|
+
if (window.WebKitTransitionEvent) {
|
3246
|
+
evnt = new window.WebKitTransitionEvent(eventType, eventData);
|
3247
|
+
evnt.initEvent(eventType, false, true);
|
3248
|
+
} else {
|
3249
|
+
try {
|
3250
|
+
evnt = new window.TransitionEvent(eventType, eventData);
|
3251
|
+
} catch (e) {
|
3252
|
+
evnt = window.document.createEvent('TransitionEvent');
|
3253
|
+
evnt.initTransitionEvent(eventType, null, null, null, eventData.elapsedTime || 0);
|
3254
|
+
}
|
3255
|
+
}
|
3256
|
+
} else if (/animationend/.test(eventType)) {
|
3257
|
+
if (window.WebKitAnimationEvent) {
|
3258
|
+
evnt = new window.WebKitAnimationEvent(eventType, eventData);
|
3259
|
+
evnt.initEvent(eventType, false, true);
|
3260
|
+
} else {
|
3261
|
+
try {
|
3262
|
+
evnt = new window.AnimationEvent(eventType, eventData);
|
3263
|
+
} catch (e) {
|
3264
|
+
evnt = window.document.createEvent('AnimationEvent');
|
3265
|
+
evnt.initAnimationEvent(eventType, null, null, null, eventData.elapsedTime || 0);
|
3266
|
+
}
|
3267
|
+
}
|
3268
|
+
} else if (/touch/.test(eventType) && supportsTouchEvents()) {
|
3269
|
+
evnt = createTouchEvent(element, eventType, x, y);
|
3270
|
+
} else if (/key/.test(eventType)) {
|
3271
|
+
evnt = window.document.createEvent('Events');
|
3272
|
+
evnt.initEvent(eventType, eventData.bubbles, eventData.cancelable);
|
3273
|
+
evnt.view = window;
|
3274
|
+
evnt.ctrlKey = pressed('ctrl');
|
3275
|
+
evnt.altKey = pressed('alt');
|
3276
|
+
evnt.shiftKey = pressed('shift');
|
3277
|
+
evnt.metaKey = pressed('meta');
|
3278
|
+
evnt.keyCode = eventData.keyCode;
|
3279
|
+
evnt.charCode = eventData.charCode;
|
3280
|
+
evnt.which = eventData.which;
|
3281
|
+
} else {
|
3282
|
+
evnt = window.document.createEvent('MouseEvents');
|
3283
|
+
x = x || 0;
|
3284
|
+
y = y || 0;
|
3285
|
+
evnt.initMouseEvent(eventType, true, true, window, 0, x, y, x, y, pressed('ctrl'),
|
3286
|
+
pressed('alt'), pressed('shift'), pressed('meta'), 0, relatedTarget);
|
3287
|
+
}
|
3288
|
+
|
3289
|
+
/* we're unable to change the timeStamp value directly so this
|
3290
|
+
* is only here to allow for testing where the timeStamp value is
|
3291
|
+
* read */
|
3292
|
+
evnt.$manualTimeStamp = eventData.timeStamp;
|
3293
|
+
|
3294
|
+
if (!evnt) return;
|
3295
|
+
|
3296
|
+
var originalPreventDefault = evnt.preventDefault,
|
3297
|
+
appWindow = element.ownerDocument.defaultView,
|
3298
|
+
fakeProcessDefault = true,
|
3299
|
+
finalProcessDefault,
|
3300
|
+
angular = appWindow.angular || {};
|
3301
|
+
|
3302
|
+
// igor: temporary fix for https://bugzilla.mozilla.org/show_bug.cgi?id=684208
|
3303
|
+
angular['ff-684208-preventDefault'] = false;
|
3304
|
+
evnt.preventDefault = function() {
|
3305
|
+
fakeProcessDefault = false;
|
3306
|
+
return originalPreventDefault.apply(evnt, arguments);
|
3307
|
+
};
|
3308
|
+
|
3309
|
+
if (!eventData.bubbles || supportsEventBubblingInDetachedTree() || isAttachedToDocument(element)) {
|
3310
|
+
element.dispatchEvent(evnt);
|
3311
|
+
} else {
|
3312
|
+
triggerForPath(element, evnt);
|
3313
|
+
}
|
3314
|
+
|
3315
|
+
finalProcessDefault = !(angular['ff-684208-preventDefault'] || !fakeProcessDefault);
|
3316
|
+
|
3317
|
+
delete angular['ff-684208-preventDefault'];
|
3318
|
+
|
3319
|
+
return finalProcessDefault;
|
3320
|
+
};
|
3321
|
+
|
3322
|
+
function supportsTouchEvents() {
|
3323
|
+
if ('_cached' in supportsTouchEvents) {
|
3324
|
+
return supportsTouchEvents._cached;
|
3325
|
+
}
|
3326
|
+
if (!window.document.createTouch || !window.document.createTouchList) {
|
3327
|
+
supportsTouchEvents._cached = false;
|
3328
|
+
return false;
|
3329
|
+
}
|
3330
|
+
try {
|
3331
|
+
window.document.createEvent('TouchEvent');
|
3332
|
+
} catch (e) {
|
3333
|
+
supportsTouchEvents._cached = false;
|
3334
|
+
return false;
|
3335
|
+
}
|
3336
|
+
supportsTouchEvents._cached = true;
|
3337
|
+
return true;
|
3338
|
+
}
|
3339
|
+
|
3340
|
+
function createTouchEvent(element, eventType, x, y) {
|
3341
|
+
var evnt = new window.Event(eventType);
|
3342
|
+
x = x || 0;
|
3343
|
+
y = y || 0;
|
3344
|
+
|
3345
|
+
var touch = window.document.createTouch(window, element, Date.now(), x, y, x, y);
|
3346
|
+
var touches = window.document.createTouchList(touch);
|
3347
|
+
|
3348
|
+
evnt.touches = touches;
|
3349
|
+
|
3350
|
+
return evnt;
|
3351
|
+
}
|
3352
|
+
|
3353
|
+
function supportsEventBubblingInDetachedTree() {
|
3354
|
+
if ('_cached' in supportsEventBubblingInDetachedTree) {
|
3355
|
+
return supportsEventBubblingInDetachedTree._cached;
|
3356
|
+
}
|
3357
|
+
supportsEventBubblingInDetachedTree._cached = false;
|
3358
|
+
var doc = window.document;
|
3359
|
+
if (doc) {
|
3360
|
+
var parent = doc.createElement('div'),
|
3361
|
+
child = parent.cloneNode();
|
3362
|
+
parent.appendChild(child);
|
3363
|
+
parent.addEventListener('e', function() {
|
3364
|
+
supportsEventBubblingInDetachedTree._cached = true;
|
3365
|
+
});
|
3366
|
+
var evnt = window.document.createEvent('Events');
|
3367
|
+
evnt.initEvent('e', true, true);
|
3368
|
+
child.dispatchEvent(evnt);
|
3369
|
+
}
|
3370
|
+
return supportsEventBubblingInDetachedTree._cached;
|
3371
|
+
}
|
3372
|
+
|
3373
|
+
function triggerForPath(element, evnt) {
|
3374
|
+
var stop = false;
|
3375
|
+
|
3376
|
+
var _stopPropagation = evnt.stopPropagation;
|
3377
|
+
evnt.stopPropagation = function() {
|
3378
|
+
stop = true;
|
3379
|
+
_stopPropagation.apply(evnt, arguments);
|
3380
|
+
};
|
3381
|
+
patchEventTargetForBubbling(evnt, element);
|
3382
|
+
do {
|
3383
|
+
element.dispatchEvent(evnt);
|
3384
|
+
// eslint-disable-next-line no-unmodified-loop-condition
|
3385
|
+
} while (!stop && (element = element.parentNode));
|
3386
|
+
}
|
3387
|
+
|
3388
|
+
function patchEventTargetForBubbling(event, target) {
|
3389
|
+
event._target = target;
|
3390
|
+
Object.defineProperty(event, 'target', {get: function() { return this._target;}});
|
3391
|
+
}
|
3392
|
+
|
3393
|
+
function isAttachedToDocument(element) {
|
3394
|
+
while ((element = element.parentNode)) {
|
3395
|
+
if (element === window) {
|
3396
|
+
return true;
|
3397
|
+
}
|
3398
|
+
}
|
3399
|
+
return false;
|
3400
|
+
}
|
3401
|
+
})();
|
3402
|
+
|
3125
3403
|
|
3126
3404
|
})(window, window.angular);
|