angularjs-rails 1.2.10 → 1.2.12
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/angularjs-rails.rb +4 -1
- data/lib/angularjs-rails/engine.rb +6 -0
- data/lib/angularjs-rails/sprockets.rb +3 -0
- data/lib/angularjs-rails/version.rb +1 -1
- data/vendor/assets/javascripts/angular-animate.js +1 -1
- data/vendor/assets/javascripts/angular-cookies.js +1 -1
- data/vendor/assets/javascripts/angular-loader.js +2 -2
- data/vendor/assets/javascripts/angular-mocks.js +25 -55
- data/vendor/assets/javascripts/angular-resource.js +5 -3
- data/vendor/assets/javascripts/angular-route.js +13 -12
- data/vendor/assets/javascripts/angular-sanitize.js +34 -31
- data/vendor/assets/javascripts/angular-scenario.js +740 -536
- data/vendor/assets/javascripts/angular-touch.js +1 -1
- data/vendor/assets/javascripts/angular.js +740 -536
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 92587005a7d7c3164f3314a4e29ca15c51b84ebf
|
4
|
+
data.tar.gz: 3fdf694bdaffcca1cdd72714e824228014ba8481
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8338f7f2d5977c6a06e44d43722ada3d49474ff3bb2da6b93d666fac30e6ffe6d2df06f0e01d000c4d7fcc0745180c3e652ae91ab9a06075721d369ac29fc863
|
7
|
+
data.tar.gz: ffc9456c71545a2ab6c6091b4167b9fac7fcd0e6996401991a207f17c1985a205ccd08df42ab14a6fdef5e81248f7ec9de0ba8e452f5c45eb80a5a0c2218f35e
|
data/lib/angularjs-rails.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.2.
|
2
|
+
* @license AngularJS v1.2.12
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -69,7 +69,7 @@ function minErr(module) {
|
|
69
69
|
return match;
|
70
70
|
});
|
71
71
|
|
72
|
-
message = message + '\nhttp://errors.angularjs.org/1.2.
|
72
|
+
message = message + '\nhttp://errors.angularjs.org/1.2.12/' +
|
73
73
|
(module ? module + '/' : '') + code;
|
74
74
|
for (i = 2; i < arguments.length; i++) {
|
75
75
|
message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.2.
|
2
|
+
* @license AngularJS v1.2.12
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -511,6 +511,7 @@ angular.mock.$IntervalProvider = function() {
|
|
511
511
|
};
|
512
512
|
|
513
513
|
$interval.cancel = function(promise) {
|
514
|
+
if(!promise) return false;
|
514
515
|
var fnIndex;
|
515
516
|
|
516
517
|
angular.forEach(repeatFns, function(fn, index) {
|
@@ -763,70 +764,39 @@ angular.mock.TzDate = function (offset, timestamp) {
|
|
763
764
|
angular.mock.TzDate.prototype = Date.prototype;
|
764
765
|
/* jshint +W101 */
|
765
766
|
|
766
|
-
|
767
|
-
// presence of a registered module
|
768
|
-
var animateLoaded;
|
769
|
-
try {
|
770
|
-
angular.module('ngAnimate');
|
771
|
-
animateLoaded = true;
|
772
|
-
} catch(e) {}
|
767
|
+
angular.mock.animate = angular.module('ngAnimateMock', ['ng'])
|
773
768
|
|
774
|
-
|
775
|
-
angular.module('ngAnimate').config(['$provide', function($provide) {
|
769
|
+
.config(['$provide', function($provide) {
|
776
770
|
var reflowQueue = [];
|
771
|
+
|
777
772
|
$provide.value('$$animateReflow', function(fn) {
|
778
773
|
reflowQueue.push(fn);
|
779
774
|
return angular.noop;
|
780
775
|
});
|
781
|
-
$provide.decorator('$animate', function($delegate) {
|
782
|
-
$delegate.triggerReflow = function() {
|
783
|
-
if(reflowQueue.length === 0) {
|
784
|
-
throw new Error('No animation reflows present');
|
785
|
-
}
|
786
|
-
angular.forEach(reflowQueue, function(fn) {
|
787
|
-
fn();
|
788
|
-
});
|
789
|
-
reflowQueue = [];
|
790
|
-
};
|
791
|
-
return $delegate;
|
792
|
-
});
|
793
|
-
}]);
|
794
|
-
}
|
795
|
-
|
796
|
-
angular.mock.animate = angular.module('mock.animate', ['ng'])
|
797
|
-
|
798
|
-
.config(['$provide', function($provide) {
|
799
776
|
|
800
777
|
$provide.decorator('$animate', function($delegate) {
|
801
778
|
var animate = {
|
802
779
|
queue : [],
|
803
780
|
enabled : $delegate.enabled,
|
804
|
-
|
805
|
-
|
806
|
-
|
807
|
-
if (!tick) throw new Error('No animation to be flushed');
|
808
|
-
if(tick.method !== name) {
|
809
|
-
throw new Error('The next animation is not "' + name +
|
810
|
-
'", but is "' + tick.method + '"');
|
781
|
+
triggerReflow : function() {
|
782
|
+
if(reflowQueue.length === 0) {
|
783
|
+
throw new Error('No animation reflows present');
|
811
784
|
}
|
812
|
-
|
813
|
-
|
785
|
+
angular.forEach(reflowQueue, function(fn) {
|
786
|
+
fn();
|
787
|
+
});
|
788
|
+
reflowQueue = [];
|
814
789
|
}
|
815
790
|
};
|
816
791
|
|
817
792
|
angular.forEach(['enter','leave','move','addClass','removeClass'], function(method) {
|
818
793
|
animate[method] = function() {
|
819
|
-
var params = arguments;
|
820
794
|
animate.queue.push({
|
821
|
-
|
822
|
-
|
823
|
-
|
824
|
-
parent : angular.isElement(params[1]) && params[1],
|
825
|
-
after : angular.isElement(params[2]) && params[2],
|
826
|
-
fn : function() {
|
827
|
-
$delegate[method].apply($delegate, params);
|
828
|
-
}
|
795
|
+
event : method,
|
796
|
+
element : arguments[0],
|
797
|
+
args : arguments
|
829
798
|
});
|
799
|
+
$delegate[method].apply($delegate, arguments);
|
830
800
|
};
|
831
801
|
});
|
832
802
|
|
@@ -996,18 +966,18 @@ angular.mock.dump = function(object) {
|
|
996
966
|
*
|
997
967
|
* # Flushing HTTP requests
|
998
968
|
*
|
999
|
-
* The $httpBackend used in production
|
1000
|
-
* If we preserved this behavior in unit testing
|
1001
|
-
* hard to write,
|
969
|
+
* The $httpBackend used in production always responds to requests with responses asynchronously.
|
970
|
+
* If we preserved this behavior in unit testing we'd have to create async unit tests, which are
|
971
|
+
* hard to write, understand, and maintain. However, the testing mock can't respond
|
1002
972
|
* synchronously because that would change the execution of the code under test. For this reason the
|
1003
973
|
* mock $httpBackend has a `flush()` method, which allows the test to explicitly flush pending
|
1004
|
-
* requests and thus
|
974
|
+
* requests and thus preserve the async api of the backend while allowing the test to execute
|
1005
975
|
* synchronously.
|
1006
976
|
*
|
1007
977
|
*
|
1008
978
|
* # Unit testing with mock $httpBackend
|
1009
|
-
* The following code shows how to setup and use the mock backend
|
1010
|
-
* First we create the controller under test
|
979
|
+
* The following code shows how to setup and use the mock backend when unit testing a controller.
|
980
|
+
* First we create the controller under test:
|
1011
981
|
*
|
1012
982
|
<pre>
|
1013
983
|
// The controller code
|
@@ -1032,7 +1002,7 @@ angular.mock.dump = function(object) {
|
|
1032
1002
|
}
|
1033
1003
|
</pre>
|
1034
1004
|
*
|
1035
|
-
* Now we setup the mock backend and create the test specs
|
1005
|
+
* Now we setup the mock backend and create the test specs:
|
1036
1006
|
*
|
1037
1007
|
<pre>
|
1038
1008
|
// testing controller
|
@@ -1954,7 +1924,7 @@ if(window.jasmine || window.mocha) {
|
|
1954
1924
|
|
1955
1925
|
var currentSpec = null,
|
1956
1926
|
isSpecRunning = function() {
|
1957
|
-
return currentSpec
|
1927
|
+
return !!currentSpec;
|
1958
1928
|
};
|
1959
1929
|
|
1960
1930
|
|
@@ -2132,7 +2102,7 @@ if(window.jasmine || window.mocha) {
|
|
2132
2102
|
window.inject = angular.mock.inject = function() {
|
2133
2103
|
var blockFns = Array.prototype.slice.call(arguments, 0);
|
2134
2104
|
var errorForStack = new Error('Declaration Location');
|
2135
|
-
return isSpecRunning() ? workFn() : workFn;
|
2105
|
+
return isSpecRunning() ? workFn.call(currentSpec) : workFn;
|
2136
2106
|
/////////////////////
|
2137
2107
|
function workFn() {
|
2138
2108
|
var modules = currentSpec.$modules || [];
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.2.
|
2
|
+
* @license AngularJS v1.2.12
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -40,7 +40,7 @@ function shallowClearAndCopy(src, dst) {
|
|
40
40
|
});
|
41
41
|
|
42
42
|
for (var key in src) {
|
43
|
-
if (src.hasOwnProperty(key) && key.charAt(0)
|
43
|
+
if (src.hasOwnProperty(key) && !(key.charAt(0) === '$' && key.charAt(1) === '$')) {
|
44
44
|
dst[key] = src[key];
|
45
45
|
}
|
46
46
|
}
|
@@ -392,7 +392,9 @@ angular.module('ngResource', ['ng']).
|
|
392
392
|
val = params.hasOwnProperty(urlParam) ? params[urlParam] : self.defaults[urlParam];
|
393
393
|
if (angular.isDefined(val) && val !== null) {
|
394
394
|
encodedVal = encodeUriSegment(val);
|
395
|
-
url = url.replace(new RegExp(":" + urlParam + "(\\W|$)", "g"),
|
395
|
+
url = url.replace(new RegExp(":" + urlParam + "(\\W|$)", "g"), function(match, p1) {
|
396
|
+
return encodedVal + p1;
|
397
|
+
});
|
396
398
|
} else {
|
397
399
|
url = url.replace(new RegExp("(\/?):" + urlParam + "(\\W|$)", "g"), function(match,
|
398
400
|
leadingSlashes, tail) {
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.2.
|
2
|
+
* @license AngularJS v1.2.12
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -350,17 +350,17 @@ function $RouteProvider(){
|
|
350
350
|
}
|
351
351
|
</file>
|
352
352
|
|
353
|
-
<file name="
|
353
|
+
<file name="protractorTest.js">
|
354
354
|
it('should load and compile correct template', function() {
|
355
|
-
element('
|
356
|
-
var content = element('.doc-example-live [ng-view]').
|
355
|
+
element(by.linkText('Moby: Ch1')).click();
|
356
|
+
var content = element(by.css('.doc-example-live [ng-view]')).getText();
|
357
357
|
expect(content).toMatch(/controller\: ChapterCntl/);
|
358
358
|
expect(content).toMatch(/Book Id\: Moby/);
|
359
359
|
expect(content).toMatch(/Chapter Id\: 1/);
|
360
360
|
|
361
|
-
element('
|
362
|
-
|
363
|
-
content = element('.doc-example-live [ng-view]').
|
361
|
+
element(by.partialLinkText('Scarlet')).click();
|
362
|
+
|
363
|
+
content = element(by.css('.doc-example-live [ng-view]')).getText();
|
364
364
|
expect(content).toMatch(/controller\: BookCntl/);
|
365
365
|
expect(content).toMatch(/Book Id\: Scarlet/);
|
366
366
|
});
|
@@ -794,16 +794,17 @@ ngRouteModule.directive('ngView', ngViewFillContentFactory);
|
|
794
794
|
}
|
795
795
|
</file>
|
796
796
|
|
797
|
-
<file name="
|
797
|
+
<file name="protractorTest.js">
|
798
798
|
it('should load and compile correct template', function() {
|
799
|
-
element('
|
800
|
-
var content = element('.doc-example-live [ng-view]').
|
799
|
+
element(by.linkText('Moby: Ch1')).click();
|
800
|
+
var content = element(by.css('.doc-example-live [ng-view]')).getText();
|
801
801
|
expect(content).toMatch(/controller\: ChapterCntl/);
|
802
802
|
expect(content).toMatch(/Book Id\: Moby/);
|
803
803
|
expect(content).toMatch(/Chapter Id\: 1/);
|
804
804
|
|
805
|
-
element('
|
806
|
-
|
805
|
+
element(by.partialLinkText('Scarlet')).click();
|
806
|
+
|
807
|
+
content = element(by.css('.doc-example-live [ng-view]')).getText();
|
807
808
|
expect(content).toMatch(/controller\: BookCntl/);
|
808
809
|
expect(content).toMatch(/Book Id\: Scarlet/);
|
809
810
|
});
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.2.
|
2
|
+
* @license AngularJS v1.2.12
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -104,35 +104,37 @@ var $sanitizeMinErr = angular.$$minErr('$sanitize');
|
|
104
104
|
</table>
|
105
105
|
</div>
|
106
106
|
</doc:source>
|
107
|
-
<doc:
|
107
|
+
<doc:protractor>
|
108
108
|
it('should sanitize the html snippet by default', function() {
|
109
|
-
expect(
|
109
|
+
expect(element(by.css('#bind-html-with-sanitize div')).getInnerHtml()).
|
110
110
|
toBe('<p>an html\n<em>click here</em>\nsnippet</p>');
|
111
111
|
});
|
112
112
|
|
113
113
|
it('should inline raw snippet if bound to a trusted value', function() {
|
114
|
-
expect(
|
114
|
+
expect(element(by.css('#bind-html-with-trust div')).getInnerHtml()).
|
115
115
|
toBe("<p style=\"color:blue\">an html\n" +
|
116
116
|
"<em onmouseover=\"this.textContent='PWN3D!'\">click here</em>\n" +
|
117
117
|
"snippet</p>");
|
118
118
|
});
|
119
119
|
|
120
120
|
it('should escape snippet without any filter', function() {
|
121
|
-
expect(
|
121
|
+
expect(element(by.css('#bind-default div')).getInnerHtml()).
|
122
122
|
toBe("<p style=\"color:blue\">an html\n" +
|
123
123
|
"<em onmouseover=\"this.textContent='PWN3D!'\">click here</em>\n" +
|
124
124
|
"snippet</p>");
|
125
125
|
});
|
126
126
|
|
127
127
|
it('should update', function() {
|
128
|
-
|
129
|
-
|
130
|
-
expect(
|
128
|
+
element(by.model('snippet')).clear();
|
129
|
+
element(by.model('snippet')).sendKeys('new <b onclick="alert(1)">text</b>');
|
130
|
+
expect(element(by.css('#bind-html-with-sanitize div')).getInnerHtml()).
|
131
|
+
toBe('new <b>text</b>');
|
132
|
+
expect(element(by.css('#bind-html-with-trust div')).getInnerHtml()).toBe(
|
131
133
|
'new <b onclick="alert(1)">text</b>');
|
132
|
-
expect(
|
134
|
+
expect(element(by.css('#bind-default div')).getInnerHtml()).toBe(
|
133
135
|
"new <b onclick=\"alert(1)\">text</b>");
|
134
136
|
});
|
135
|
-
</doc:
|
137
|
+
</doc:protractor>
|
136
138
|
</doc:example>
|
137
139
|
*/
|
138
140
|
function $SanitizeProvider() {
|
@@ -537,37 +539,38 @@ angular.module('ngSanitize', []).provider('$sanitize', $SanitizeProvider);
|
|
537
539
|
</tr>
|
538
540
|
</table>
|
539
541
|
</doc:source>
|
540
|
-
<doc:
|
542
|
+
<doc:protractor>
|
541
543
|
it('should linkify the snippet with urls', function() {
|
542
|
-
expect(
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
'<a href="mailto:another@somewhere.org">another@somewhere.org</a>, ' +
|
547
|
-
'and one more: <a href="ftp://127.0.0.1/">ftp://127.0.0.1/</a>.');
|
544
|
+
expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()).
|
545
|
+
toBe('Pretty text with some links: http://angularjs.org/, us@somewhere.org, ' +
|
546
|
+
'another@somewhere.org, and one more: ftp://127.0.0.1/.');
|
547
|
+
expect(element.all(by.css('#linky-filter a')).count()).toEqual(4);
|
548
548
|
});
|
549
549
|
|
550
|
-
it
|
551
|
-
expect(
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
"another@somewhere.org,\n" +
|
556
|
-
"and one more: ftp://127.0.0.1/.");
|
550
|
+
it('should not linkify snippet without the linky filter', function() {
|
551
|
+
expect(element(by.id('escaped-html')).element(by.binding('snippet')).getText()).
|
552
|
+
toBe('Pretty text with some links: http://angularjs.org/, mailto:us@somewhere.org, ' +
|
553
|
+
'another@somewhere.org, and one more: ftp://127.0.0.1/.');
|
554
|
+
expect(element.all(by.css('#escaped-html a')).count()).toEqual(0);
|
557
555
|
});
|
558
556
|
|
559
557
|
it('should update', function() {
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
558
|
+
element(by.model('snippet')).clear();
|
559
|
+
element(by.model('snippet')).sendKeys('new http://link.');
|
560
|
+
expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()).
|
561
|
+
toBe('new http://link.');
|
562
|
+
expect(element.all(by.css('#linky-filter a')).count()).toEqual(1);
|
563
|
+
expect(element(by.id('escaped-html')).element(by.binding('snippet')).getText())
|
564
|
+
.toBe('new http://link.');
|
564
565
|
});
|
565
566
|
|
566
567
|
it('should work with the target property', function() {
|
567
|
-
expect(
|
568
|
-
|
568
|
+
expect(element(by.id('linky-target')).
|
569
|
+
element(by.binding("snippetWithTarget | linky:'_blank'")).getText()).
|
570
|
+
toBe('http://angularjs.org/');
|
571
|
+
expect(element(by.css('#linky-target a')).getAttribute('target')).toEqual('_blank');
|
569
572
|
});
|
570
|
-
</doc:
|
573
|
+
</doc:protractor>
|
571
574
|
</doc:example>
|
572
575
|
*/
|
573
576
|
angular.module('ngSanitize').filter('linky', ['$sanitize', function($sanitize) {
|
@@ -9790,7 +9790,7 @@ if ( typeof module === "object" && module && typeof module.exports === "object"
|
|
9790
9790
|
})( window );
|
9791
9791
|
|
9792
9792
|
/**
|
9793
|
-
* @license AngularJS v1.2.
|
9793
|
+
* @license AngularJS v1.2.12
|
9794
9794
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
9795
9795
|
* License: MIT
|
9796
9796
|
*/
|
@@ -9860,7 +9860,7 @@ function minErr(module) {
|
|
9860
9860
|
return match;
|
9861
9861
|
});
|
9862
9862
|
|
9863
|
-
message = message + '\nhttp://errors.angularjs.org/1.2.
|
9863
|
+
message = message + '\nhttp://errors.angularjs.org/1.2.12/' +
|
9864
9864
|
(module ? module + '/' : '') + code;
|
9865
9865
|
for (i = 2; i < arguments.length; i++) {
|
9866
9866
|
message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
|
@@ -10063,7 +10063,7 @@ function isArrayLike(obj) {
|
|
10063
10063
|
* is the value of an object property or an array element and `key` is the object property key or
|
10064
10064
|
* array element index. Specifying a `context` for the function is optional.
|
10065
10065
|
*
|
10066
|
-
* It is worth
|
10066
|
+
* It is worth noting that `.forEach` does not iterate over inherited properties because it filters
|
10067
10067
|
* using the `hasOwnProperty` method.
|
10068
10068
|
*
|
10069
10069
|
<pre>
|
@@ -10072,7 +10072,7 @@ function isArrayLike(obj) {
|
|
10072
10072
|
angular.forEach(values, function(value, key){
|
10073
10073
|
this.push(key + ': ' + value);
|
10074
10074
|
}, log);
|
10075
|
-
expect(log).toEqual(['name: misko', 'gender:male']);
|
10075
|
+
expect(log).toEqual(['name: misko', 'gender: male']);
|
10076
10076
|
</pre>
|
10077
10077
|
*
|
10078
10078
|
* @param {Object|Array} obj Object to iterate over.
|
@@ -10643,7 +10643,7 @@ function shallowCopy(src, dst) {
|
|
10643
10643
|
for(var key in src) {
|
10644
10644
|
// shallowCopy is only ever called by $compile nodeLinkFn, which has control over src
|
10645
10645
|
// so we don't need to worry about using our custom hasOwnProperty here
|
10646
|
-
if (src.hasOwnProperty(key) && key.charAt(0)
|
10646
|
+
if (src.hasOwnProperty(key) && !(key.charAt(0) === '$' && key.charAt(1) === '$')) {
|
10647
10647
|
dst[key] = src[key];
|
10648
10648
|
}
|
10649
10649
|
}
|
@@ -11626,11 +11626,11 @@ function setupModuleLoader(window) {
|
|
11626
11626
|
* - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
|
11627
11627
|
*/
|
11628
11628
|
var version = {
|
11629
|
-
full: '1.2.
|
11629
|
+
full: '1.2.12', // all of these placeholder strings will be replaced by grunt's
|
11630
11630
|
major: 1, // package task
|
11631
11631
|
minor: 2,
|
11632
|
-
dot:
|
11633
|
-
codeName: '
|
11632
|
+
dot: 12,
|
11633
|
+
codeName: 'cauliflower-eradication'
|
11634
11634
|
};
|
11635
11635
|
|
11636
11636
|
|
@@ -11927,6 +11927,9 @@ function JQLite(element) {
|
|
11927
11927
|
if (element instanceof JQLite) {
|
11928
11928
|
return element;
|
11929
11929
|
}
|
11930
|
+
if (isString(element)) {
|
11931
|
+
element = trim(element);
|
11932
|
+
}
|
11930
11933
|
if (!(this instanceof JQLite)) {
|
11931
11934
|
if (isString(element) && element.charAt(0) != '<') {
|
11932
11935
|
throw jqLiteMinErr('nosel', 'Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element');
|
@@ -13200,17 +13203,16 @@ function annotate(fn) {
|
|
13200
13203
|
* Here is an example of registering a service using
|
13201
13204
|
* {@link AUTO.$provide#methods_service $provide.service(class)}.
|
13202
13205
|
* <pre>
|
13203
|
-
*
|
13204
|
-
*
|
13205
|
-
*
|
13206
|
-
*
|
13207
|
-
*
|
13208
|
-
* Ping.prototype.send = function() {
|
13209
|
-
* return this.$http.get('/ping');
|
13210
|
-
* };
|
13206
|
+
* var Ping = function($http) {
|
13207
|
+
* this.$http = $http;
|
13208
|
+
* };
|
13209
|
+
*
|
13210
|
+
* Ping.$inject = ['$http'];
|
13211
13211
|
*
|
13212
|
-
*
|
13213
|
-
*
|
13212
|
+
* Ping.prototype.send = function() {
|
13213
|
+
* return this.$http.get('/ping');
|
13214
|
+
* };
|
13215
|
+
* $provide.service('ping', Ping);
|
13214
13216
|
* </pre>
|
13215
13217
|
* You would then inject and use this service like this:
|
13216
13218
|
* <pre>
|
@@ -13308,7 +13310,7 @@ function annotate(fn) {
|
|
13308
13310
|
* Here we decorate the {@link ng.$log $log} service to convert warnings to errors by intercepting
|
13309
13311
|
* calls to {@link ng.$log#error $log.warn()}.
|
13310
13312
|
* <pre>
|
13311
|
-
* $
|
13313
|
+
* $provide.decorator('$log', ['$delegate', function($delegate) {
|
13312
13314
|
* $delegate.warn = $delegate.error;
|
13313
13315
|
* return $delegate;
|
13314
13316
|
* }]);
|
@@ -14911,13 +14913,17 @@ function $TemplateCacheProvider() {
|
|
14911
14913
|
<div compile="html"></div>
|
14912
14914
|
</div>
|
14913
14915
|
</doc:source>
|
14914
|
-
<doc:
|
14916
|
+
<doc:protractor>
|
14915
14917
|
it('should auto compile', function() {
|
14916
|
-
|
14917
|
-
|
14918
|
-
|
14918
|
+
var textarea = $('textarea');
|
14919
|
+
var output = $('div[compile]');
|
14920
|
+
// The initial state reads 'Hello Angular'.
|
14921
|
+
expect(output.getText()).toBe('Hello Angular');
|
14922
|
+
textarea.clear();
|
14923
|
+
textarea.sendKeys('{{name}}!');
|
14924
|
+
expect(output.getText()).toBe('Angular!');
|
14919
14925
|
});
|
14920
|
-
</doc:
|
14926
|
+
</doc:protractor>
|
14921
14927
|
</doc:example>
|
14922
14928
|
|
14923
14929
|
*
|
@@ -15679,7 +15685,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
15679
15685
|
hasTranscludeDirective = true;
|
15680
15686
|
|
15681
15687
|
// Special case ngIf and ngRepeat so that we don't complain about duplicate transclusion.
|
15682
|
-
// This option should only be used by directives that know how to
|
15688
|
+
// This option should only be used by directives that know how to safely handle element transclusion,
|
15683
15689
|
// where the transcluded nodes are added or replaced after linking.
|
15684
15690
|
if (!directive.$$tlb) {
|
15685
15691
|
assertNoDuplicate('transclusion', nonTlbTranscludeDirective, directive, $compileNode);
|
@@ -16194,9 +16200,13 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16194
16200
|
linkNode = $compileNode[0];
|
16195
16201
|
|
16196
16202
|
if (beforeTemplateLinkNode !== beforeTemplateCompileNode) {
|
16203
|
+
var oldClasses = beforeTemplateLinkNode.className;
|
16197
16204
|
// it was cloned therefore we have to clone as well.
|
16198
16205
|
linkNode = jqLiteClone(compileNode);
|
16199
16206
|
replaceWith(linkRootElement, jqLite(beforeTemplateLinkNode), linkNode);
|
16207
|
+
|
16208
|
+
// Copy in CSS classes from original node
|
16209
|
+
safeAddClass(jqLite(linkNode), oldClasses);
|
16200
16210
|
}
|
16201
16211
|
if (afterTemplateNodeLinkFn.transclude) {
|
16202
16212
|
childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude);
|
@@ -17217,14 +17227,14 @@ function $HttpProvider() {
|
|
17217
17227
|
<option>JSONP</option>
|
17218
17228
|
</select>
|
17219
17229
|
<input type="text" ng-model="url" size="80"/>
|
17220
|
-
<button ng-click="fetch()">fetch</button><br>
|
17221
|
-
<button ng-click="updateModel('GET', 'http-hello.html')">Sample GET</button>
|
17222
|
-
<button
|
17230
|
+
<button id="fetchbtn" ng-click="fetch()">fetch</button><br>
|
17231
|
+
<button id="samplegetbtn" ng-click="updateModel('GET', 'http-hello.html')">Sample GET</button>
|
17232
|
+
<button id="samplejsonpbtn"
|
17223
17233
|
ng-click="updateModel('JSONP',
|
17224
17234
|
'http://angularjs.org/greet.php?callback=JSON_CALLBACK&name=Super%20Hero')">
|
17225
17235
|
Sample JSONP
|
17226
17236
|
</button>
|
17227
|
-
<button
|
17237
|
+
<button id="invalidjsonpbtn"
|
17228
17238
|
ng-click="updateModel('JSONP', 'http://angularjs.org/doesntexist&callback=JSON_CALLBACK')">
|
17229
17239
|
Invalid JSONP
|
17230
17240
|
</button>
|
@@ -17261,27 +17271,34 @@ function $HttpProvider() {
|
|
17261
17271
|
<file name="http-hello.html">
|
17262
17272
|
Hello, $http!
|
17263
17273
|
</file>
|
17264
|
-
<file name="
|
17274
|
+
<file name="protractorTest.js">
|
17275
|
+
var status = element(by.binding('status'));
|
17276
|
+
var data = element(by.binding('data'));
|
17277
|
+
var fetchBtn = element(by.id('fetchbtn'));
|
17278
|
+
var sampleGetBtn = element(by.id('samplegetbtn'));
|
17279
|
+
var sampleJsonpBtn = element(by.id('samplejsonpbtn'));
|
17280
|
+
var invalidJsonpBtn = element(by.id('invalidjsonpbtn'));
|
17281
|
+
|
17265
17282
|
it('should make an xhr GET request', function() {
|
17266
|
-
|
17267
|
-
|
17268
|
-
expect(
|
17269
|
-
expect(
|
17283
|
+
sampleGetBtn.click();
|
17284
|
+
fetchBtn.click();
|
17285
|
+
expect(status.getText()).toMatch('200');
|
17286
|
+
expect(data.getText()).toMatch(/Hello, \$http!/)
|
17270
17287
|
});
|
17271
17288
|
|
17272
17289
|
it('should make a JSONP request to angularjs.org', function() {
|
17273
|
-
|
17274
|
-
|
17275
|
-
expect(
|
17276
|
-
expect(
|
17290
|
+
sampleJsonpBtn.click();
|
17291
|
+
fetchBtn.click();
|
17292
|
+
expect(status.getText()).toMatch('200');
|
17293
|
+
expect(data.getText()).toMatch(/Super Hero!/);
|
17277
17294
|
});
|
17278
17295
|
|
17279
17296
|
it('should make JSONP request to invalid URL and invoke the error handler',
|
17280
17297
|
function() {
|
17281
|
-
|
17282
|
-
|
17283
|
-
expect(
|
17284
|
-
expect(
|
17298
|
+
invalidJsonpBtn.click();
|
17299
|
+
fetchBtn.click();
|
17300
|
+
expect(status.getText()).toMatch('0');
|
17301
|
+
expect(data.getText()).toMatch('Request failed');
|
17285
17302
|
});
|
17286
17303
|
</file>
|
17287
17304
|
</example>
|
@@ -17663,13 +17680,18 @@ function $HttpProvider() {
|
|
17663
17680
|
}
|
17664
17681
|
|
17665
17682
|
function createXhr(method) {
|
17666
|
-
|
17667
|
-
|
17668
|
-
|
17669
|
-
|
17670
|
-
|
17671
|
-
|
17683
|
+
//if IE and the method is not RFC2616 compliant, or if XMLHttpRequest
|
17684
|
+
//is not available, try getting an ActiveXObject. Otherwise, use XMLHttpRequest
|
17685
|
+
//if it is available
|
17686
|
+
if (msie <= 8 && (!method.match(/^(get|post|head|put|delete|options)$/i) ||
|
17687
|
+
!window.XMLHttpRequest)) {
|
17688
|
+
return new window.ActiveXObject("Microsoft.XMLHTTP");
|
17689
|
+
} else if (window.XMLHttpRequest) {
|
17690
|
+
return new window.XMLHttpRequest();
|
17691
|
+
}
|
17672
17692
|
|
17693
|
+
throw minErr('$httpBackend')('noxhr', "This browser does not support XMLHttpRequest.");
|
17694
|
+
}
|
17673
17695
|
|
17674
17696
|
/**
|
17675
17697
|
* @ngdoc object
|
@@ -17764,7 +17786,20 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc
|
|
17764
17786
|
}
|
17765
17787
|
|
17766
17788
|
if (responseType) {
|
17767
|
-
|
17789
|
+
try {
|
17790
|
+
xhr.responseType = responseType;
|
17791
|
+
} catch (e) {
|
17792
|
+
// WebKit added support for the json responseType value on 09/03/2013
|
17793
|
+
// https://bugs.webkit.org/show_bug.cgi?id=73648. Versions of Safari prior to 7 are
|
17794
|
+
// known to throw when setting the value "json" as the response type. Other older
|
17795
|
+
// browsers implementing the responseType
|
17796
|
+
//
|
17797
|
+
// The json response type can be ignored if not supported, because JSON payloads are
|
17798
|
+
// parsed on the client-side regardless.
|
17799
|
+
if (responseType !== 'json') {
|
17800
|
+
throw e;
|
17801
|
+
}
|
17802
|
+
}
|
17768
17803
|
}
|
17769
17804
|
|
17770
17805
|
xhr.send(post || null);
|
@@ -17863,11 +17898,11 @@ var $interpolateMinErr = minErr('$interpolate');
|
|
17863
17898
|
//demo.label//
|
17864
17899
|
</div>
|
17865
17900
|
</doc:source>
|
17866
|
-
<doc:
|
17867
|
-
|
17868
|
-
|
17869
|
-
|
17870
|
-
</doc:
|
17901
|
+
<doc:protractor>
|
17902
|
+
it('should interpolate binding with custom symbols', function() {
|
17903
|
+
expect(element(by.binding('demo.label')).getText()).toBe('This binding is brought you by // interpolation symbols.');
|
17904
|
+
});
|
17905
|
+
</doc:protractor>
|
17871
17906
|
</doc:example>
|
17872
17907
|
*/
|
17873
17908
|
function $InterpolateProvider() {
|
@@ -19086,7 +19121,7 @@ function $LogProvider(){
|
|
19086
19121
|
* @name ng.$logProvider#debugEnabled
|
19087
19122
|
* @methodOf ng.$logProvider
|
19088
19123
|
* @description
|
19089
|
-
* @param {
|
19124
|
+
* @param {boolean=} flag enable or disable debug level messages
|
19090
19125
|
* @returns {*} current value if used as getter or itself (chaining) if used as setter
|
19091
19126
|
*/
|
19092
19127
|
this.debugEnabled = function(flag) {
|
@@ -20542,7 +20577,7 @@ function $ParseProvider() {
|
|
20542
20577
|
* constructed via `$q.reject`, the promise will be rejected instead.
|
20543
20578
|
* - `reject(reason)` – rejects the derived promise with the `reason`. This is equivalent to
|
20544
20579
|
* resolving it with a rejection constructed via `$q.reject`.
|
20545
|
-
* - `notify(value)` - provides updates on the status of the
|
20580
|
+
* - `notify(value)` - provides updates on the status of the promise's execution. This may be called
|
20546
20581
|
* multiple times before the promise is either resolved or rejected.
|
20547
20582
|
*
|
20548
20583
|
* **Properties**
|
@@ -20692,7 +20727,7 @@ function qFactory(nextTick, exceptionHandler) {
|
|
20692
20727
|
|
20693
20728
|
|
20694
20729
|
reject: function(reason) {
|
20695
|
-
deferred.resolve(
|
20730
|
+
deferred.resolve(createInternalRejectedPromise(reason));
|
20696
20731
|
},
|
20697
20732
|
|
20698
20733
|
|
@@ -20849,6 +20884,12 @@ function qFactory(nextTick, exceptionHandler) {
|
|
20849
20884
|
* @returns {Promise} Returns a promise that was already resolved as rejected with the `reason`.
|
20850
20885
|
*/
|
20851
20886
|
var reject = function(reason) {
|
20887
|
+
var result = defer();
|
20888
|
+
result.reject(reason);
|
20889
|
+
return result.promise;
|
20890
|
+
};
|
20891
|
+
|
20892
|
+
var createInternalRejectedPromise = function(reason) {
|
20852
20893
|
return {
|
20853
20894
|
then: function(callback, errback) {
|
20854
20895
|
var result = defer();
|
@@ -21909,7 +21950,7 @@ function $RootScopeProvider(){
|
|
21909
21950
|
* onto the {@link ng.$exceptionHandler $exceptionHandler} service.
|
21910
21951
|
*
|
21911
21952
|
* @param {string} name Event name to emit.
|
21912
|
-
* @param {...*} args Optional
|
21953
|
+
* @param {...*} args Optional one or more arguments which will be passed onto the event listeners.
|
21913
21954
|
* @return {Object} Event object (see {@link ng.$rootScope.Scope#methods_$on}).
|
21914
21955
|
*/
|
21915
21956
|
$emit: function(name, args) {
|
@@ -21977,7 +22018,7 @@ function $RootScopeProvider(){
|
|
21977
22018
|
* onto the {@link ng.$exceptionHandler $exceptionHandler} service.
|
21978
22019
|
*
|
21979
22020
|
* @param {string} name Event name to broadcast.
|
21980
|
-
* @param {...*} args Optional
|
22021
|
+
* @param {...*} args Optional one or more arguments which will be passed onto the event listeners.
|
21981
22022
|
* @return {Object} Event object, see {@link ng.$rootScope.Scope#methods_$on}
|
21982
22023
|
*/
|
21983
22024
|
$broadcast: function(name, args) {
|
@@ -22769,13 +22810,15 @@ function $SceDelegateProvider() {
|
|
22769
22810
|
]
|
22770
22811
|
</file>
|
22771
22812
|
|
22772
|
-
<file name="
|
22813
|
+
<file name="protractorTest.js">
|
22773
22814
|
describe('SCE doc demo', function() {
|
22774
22815
|
it('should sanitize untrusted values', function() {
|
22775
|
-
expect(element('.htmlComment').
|
22816
|
+
expect(element(by.css('.htmlComment')).getInnerHtml())
|
22817
|
+
.toBe('<span>Is <i>anyone</i> reading this?</span>');
|
22776
22818
|
});
|
22819
|
+
|
22777
22820
|
it('should NOT sanitize explicitly trusted values', function() {
|
22778
|
-
expect(element('
|
22821
|
+
expect(element(by.id('explicitlyTrustedHtml')).getInnerHtml()).toBe(
|
22779
22822
|
'<span onmouseover="this.textContent="Explicitly trusted HTML bypasses ' +
|
22780
22823
|
'sanitization."">Hover over this text.</span>');
|
22781
22824
|
});
|
@@ -23534,13 +23577,13 @@ function urlIsSameOrigin(requestUrl) {
|
|
23534
23577
|
<button ng-click="doGreeting(greeting)">ALERT</button>
|
23535
23578
|
</div>
|
23536
23579
|
</doc:source>
|
23537
|
-
<doc:
|
23580
|
+
<doc:protractor>
|
23538
23581
|
it('should display the greeting in the input box', function() {
|
23539
|
-
|
23582
|
+
element(by.model('greeting')).sendKeys('Hello, E2E Tests');
|
23540
23583
|
// If we click the button it will block the test runner
|
23541
23584
|
// element(':button').click();
|
23542
23585
|
});
|
23543
|
-
</doc:
|
23586
|
+
</doc:protractor>
|
23544
23587
|
</doc:example>
|
23545
23588
|
*/
|
23546
23589
|
function $WindowProvider(){
|
@@ -23749,35 +23792,47 @@ function $FilterProvider($provide) {
|
|
23749
23792
|
Equality <input type="checkbox" ng-model="strict"><br>
|
23750
23793
|
<table id="searchObjResults">
|
23751
23794
|
<tr><th>Name</th><th>Phone</th></tr>
|
23752
|
-
<tr ng-repeat="
|
23753
|
-
<td>{{
|
23754
|
-
<td>{{
|
23795
|
+
<tr ng-repeat="friendObj in friends | filter:search:strict">
|
23796
|
+
<td>{{friendObj.name}}</td>
|
23797
|
+
<td>{{friendObj.phone}}</td>
|
23755
23798
|
</tr>
|
23756
23799
|
</table>
|
23757
23800
|
</doc:source>
|
23758
|
-
<doc:
|
23759
|
-
|
23760
|
-
|
23761
|
-
|
23762
|
-
|
23801
|
+
<doc:protractor>
|
23802
|
+
var expectFriendNames = function(expectedNames, key) {
|
23803
|
+
element.all(by.repeater(key + ' in friends').column(key + '.name')).then(function(arr) {
|
23804
|
+
arr.forEach(function(wd, i) {
|
23805
|
+
expect(wd.getText()).toMatch(expectedNames[i]);
|
23806
|
+
});
|
23807
|
+
});
|
23808
|
+
};
|
23763
23809
|
|
23764
|
-
|
23765
|
-
|
23766
|
-
|
23810
|
+
it('should search across all fields when filtering with a string', function() {
|
23811
|
+
var searchText = element(by.model('searchText'));
|
23812
|
+
searchText.clear();
|
23813
|
+
searchText.sendKeys('m');
|
23814
|
+
expectFriendNames(['Mary', 'Mike', 'Adam'], 'friend');
|
23815
|
+
|
23816
|
+
searchText.clear();
|
23817
|
+
searchText.sendKeys('76');
|
23818
|
+
expectFriendNames(['John', 'Julie'], 'friend');
|
23767
23819
|
});
|
23768
23820
|
|
23769
23821
|
it('should search in specific fields when filtering with a predicate object', function() {
|
23770
|
-
|
23771
|
-
|
23772
|
-
|
23822
|
+
var searchAny = element(by.model('search.$'));
|
23823
|
+
searchAny.clear();
|
23824
|
+
searchAny.sendKeys('i');
|
23825
|
+
expectFriendNames(['Mary', 'Mike', 'Julie', 'Juliette'], 'friendObj');
|
23773
23826
|
});
|
23774
23827
|
it('should use a equal comparison when comparator is true', function() {
|
23775
|
-
|
23776
|
-
|
23777
|
-
|
23778
|
-
|
23828
|
+
var searchName = element(by.model('search.name'));
|
23829
|
+
var strict = element(by.model('strict'));
|
23830
|
+
searchName.clear();
|
23831
|
+
searchName.sendKeys('Julie');
|
23832
|
+
strict.click();
|
23833
|
+
expectFriendNames(['Julie'], 'friendObj');
|
23779
23834
|
});
|
23780
|
-
</doc:
|
23835
|
+
</doc:protractor>
|
23781
23836
|
</doc:example>
|
23782
23837
|
*/
|
23783
23838
|
function filterFilter() {
|
@@ -23855,7 +23910,7 @@ function filterFilter() {
|
|
23855
23910
|
(function(path) {
|
23856
23911
|
if (typeof expression[path] == 'undefined') return;
|
23857
23912
|
predicates.push(function(value) {
|
23858
|
-
return search(path == '$' ? value :
|
23913
|
+
return search(path == '$' ? value : (value && value[path]), expression[path]);
|
23859
23914
|
});
|
23860
23915
|
})(key);
|
23861
23916
|
}
|
@@ -23901,21 +23956,26 @@ function filterFilter() {
|
|
23901
23956
|
</script>
|
23902
23957
|
<div ng-controller="Ctrl">
|
23903
23958
|
<input type="number" ng-model="amount"> <br>
|
23904
|
-
default currency symbol ($): {{amount | currency}}
|
23905
|
-
custom currency identifier (USD$): {{amount | currency:"USD$"}}
|
23959
|
+
default currency symbol ($): <span id="currency-default">{{amount | currency}}</span><br>
|
23960
|
+
custom currency identifier (USD$): <span>{{amount | currency:"USD$"}}</span>
|
23906
23961
|
</div>
|
23907
23962
|
</doc:source>
|
23908
|
-
<doc:
|
23963
|
+
<doc:protractor>
|
23909
23964
|
it('should init with 1234.56', function() {
|
23910
|
-
expect(
|
23911
|
-
expect(binding('amount | currency:"USD$"')).toBe('USD$1,234.56');
|
23965
|
+
expect(element(by.id('currency-default')).getText()).toBe('$1,234.56');
|
23966
|
+
expect(element(by.binding('amount | currency:"USD$"')).getText()).toBe('USD$1,234.56');
|
23912
23967
|
});
|
23913
23968
|
it('should update', function() {
|
23914
|
-
|
23915
|
-
|
23916
|
-
|
23969
|
+
if (browser.params.browser == 'safari') {
|
23970
|
+
// Safari does not understand the minus key. See
|
23971
|
+
// https://github.com/angular/protractor/issues/481
|
23972
|
+
return;
|
23973
|
+
}
|
23974
|
+
element(by.model('amount')).clear();
|
23975
|
+
element(by.model('amount')).sendKeys('-1234'); expect(element(by.id('currency-default')).getText()).toBe('($1,234.00)');
|
23976
|
+
expect(element(by.binding('amount | currency:"USD$"')).getText()).toBe('(USD$1,234.00)');
|
23917
23977
|
});
|
23918
|
-
</doc:
|
23978
|
+
</doc:protractor>
|
23919
23979
|
</doc:example>
|
23920
23980
|
*/
|
23921
23981
|
currencyFilter.$inject = ['$locale'];
|
@@ -23954,25 +24014,26 @@ function currencyFilter($locale) {
|
|
23954
24014
|
</script>
|
23955
24015
|
<div ng-controller="Ctrl">
|
23956
24016
|
Enter number: <input ng-model='val'><br>
|
23957
|
-
Default formatting: {{val | number}}
|
23958
|
-
No fractions: {{val | number:0}}
|
23959
|
-
Negative number: {{-val | number:4}}
|
24017
|
+
Default formatting: <span id='number-default'>{{val | number}}</span><br>
|
24018
|
+
No fractions: <span>{{val | number:0}}</span><br>
|
24019
|
+
Negative number: <span>{{-val | number:4}}</span>
|
23960
24020
|
</div>
|
23961
24021
|
</doc:source>
|
23962
|
-
<doc:
|
24022
|
+
<doc:protractor>
|
23963
24023
|
it('should format numbers', function() {
|
23964
|
-
expect(
|
23965
|
-
expect(binding('val | number:0')).toBe('1,235');
|
23966
|
-
expect(binding('-val | number:4')).toBe('-1,234.5679');
|
24024
|
+
expect(element(by.id('number-default')).getText()).toBe('1,234.568');
|
24025
|
+
expect(element(by.binding('val | number:0')).getText()).toBe('1,235');
|
24026
|
+
expect(element(by.binding('-val | number:4')).getText()).toBe('-1,234.5679');
|
23967
24027
|
});
|
23968
24028
|
|
23969
24029
|
it('should update', function() {
|
23970
|
-
|
23971
|
-
|
23972
|
-
expect(
|
23973
|
-
expect(binding('
|
23974
|
-
|
23975
|
-
|
24030
|
+
element(by.model('val')).clear();
|
24031
|
+
element(by.model('val')).sendKeys('3374.333');
|
24032
|
+
expect(element(by.id('number-default')).getText()).toBe('3,374.333');
|
24033
|
+
expect(element(by.binding('val | number:0')).getText()).toBe('3,374');
|
24034
|
+
expect(element(by.binding('-val | number:4')).getText()).toBe('-3,374.3330');
|
24035
|
+
});
|
24036
|
+
</doc:protractor>
|
23976
24037
|
</doc:example>
|
23977
24038
|
*/
|
23978
24039
|
|
@@ -24202,22 +24263,22 @@ var DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+
|
|
24202
24263
|
<doc:example>
|
24203
24264
|
<doc:source>
|
24204
24265
|
<span ng-non-bindable>{{1288323623006 | date:'medium'}}</span>:
|
24205
|
-
{{1288323623006 | date:'medium'}}
|
24266
|
+
<span>{{1288323623006 | date:'medium'}}</span><br>
|
24206
24267
|
<span ng-non-bindable>{{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}</span>:
|
24207
|
-
{{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}
|
24268
|
+
<span>{{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}</span><br>
|
24208
24269
|
<span ng-non-bindable>{{1288323623006 | date:'MM/dd/yyyy @ h:mma'}}</span>:
|
24209
|
-
{{'1288323623006' | date:'MM/dd/yyyy @ h:mma'}}
|
24270
|
+
<span>{{'1288323623006' | date:'MM/dd/yyyy @ h:mma'}}</span><br>
|
24210
24271
|
</doc:source>
|
24211
|
-
<doc:
|
24272
|
+
<doc:protractor>
|
24212
24273
|
it('should format date', function() {
|
24213
|
-
expect(binding("1288323623006 | date:'medium'")).
|
24274
|
+
expect(element(by.binding("1288323623006 | date:'medium'")).getText()).
|
24214
24275
|
toMatch(/Oct 2\d, 2010 \d{1,2}:\d{2}:\d{2} (AM|PM)/);
|
24215
|
-
expect(binding("1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'")).
|
24276
|
+
expect(element(by.binding("1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'")).getText()).
|
24216
24277
|
toMatch(/2010\-10\-2\d \d{2}:\d{2}:\d{2} (\-|\+)?\d{4}/);
|
24217
|
-
expect(binding("'1288323623006' | date:'MM/dd/yyyy @ h:mma'")).
|
24278
|
+
expect(element(by.binding("'1288323623006' | date:'MM/dd/yyyy @ h:mma'")).getText()).
|
24218
24279
|
toMatch(/10\/2\d\/2010 @ \d{1,2}:\d{2}(AM|PM)/);
|
24219
24280
|
});
|
24220
|
-
</doc:
|
24281
|
+
</doc:protractor>
|
24221
24282
|
</doc:example>
|
24222
24283
|
*/
|
24223
24284
|
dateFilter.$inject = ['$locale'];
|
@@ -24316,11 +24377,11 @@ function dateFilter($locale) {
|
|
24316
24377
|
<doc:source>
|
24317
24378
|
<pre>{{ {'name':'value'} | json }}</pre>
|
24318
24379
|
</doc:source>
|
24319
|
-
<doc:
|
24380
|
+
<doc:protractor>
|
24320
24381
|
it('should jsonify filtered objects', function() {
|
24321
|
-
expect(binding("{'name':'value'}")).toMatch(/\{\n "name": ?"value"\n}/);
|
24382
|
+
expect(element(by.binding("{'name':'value'}")).getText()).toMatch(/\{\n "name": ?"value"\n}/);
|
24322
24383
|
});
|
24323
|
-
</doc:
|
24384
|
+
</doc:protractor>
|
24324
24385
|
</doc:example>
|
24325
24386
|
*
|
24326
24387
|
*/
|
@@ -24388,28 +24449,37 @@ var uppercaseFilter = valueFn(uppercase);
|
|
24388
24449
|
<p>Output letters: {{ letters | limitTo:letterLimit }}</p>
|
24389
24450
|
</div>
|
24390
24451
|
</doc:source>
|
24391
|
-
<doc:
|
24452
|
+
<doc:protractor>
|
24453
|
+
var numLimitInput = element(by.model('numLimit'));
|
24454
|
+
var letterLimitInput = element(by.model('letterLimit'));
|
24455
|
+
var limitedNumbers = element(by.binding('numbers | limitTo:numLimit'));
|
24456
|
+
var limitedLetters = element(by.binding('letters | limitTo:letterLimit'));
|
24457
|
+
|
24392
24458
|
it('should limit the number array to first three items', function() {
|
24393
|
-
expect(
|
24394
|
-
expect(
|
24395
|
-
expect(
|
24396
|
-
expect(
|
24459
|
+
expect(numLimitInput.getAttribute('value')).toBe('3');
|
24460
|
+
expect(letterLimitInput.getAttribute('value')).toBe('3');
|
24461
|
+
expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3]');
|
24462
|
+
expect(limitedLetters.getText()).toEqual('Output letters: abc');
|
24397
24463
|
});
|
24398
24464
|
|
24399
24465
|
it('should update the output when -3 is entered', function() {
|
24400
|
-
|
24401
|
-
|
24402
|
-
|
24403
|
-
|
24466
|
+
numLimitInput.clear();
|
24467
|
+
numLimitInput.sendKeys('-3');
|
24468
|
+
letterLimitInput.clear();
|
24469
|
+
letterLimitInput.sendKeys('-3');
|
24470
|
+
expect(limitedNumbers.getText()).toEqual('Output numbers: [7,8,9]');
|
24471
|
+
expect(limitedLetters.getText()).toEqual('Output letters: ghi');
|
24404
24472
|
});
|
24405
24473
|
|
24406
24474
|
it('should not exceed the maximum size of input array', function() {
|
24407
|
-
|
24408
|
-
|
24409
|
-
|
24410
|
-
|
24475
|
+
numLimitInput.clear();
|
24476
|
+
numLimitInput.sendKeys('100');
|
24477
|
+
letterLimitInput.clear();
|
24478
|
+
letterLimitInput.sendKeys('100');
|
24479
|
+
expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3,4,5,6,7,8,9]');
|
24480
|
+
expect(limitedLetters.getText()).toEqual('Output letters: abcdefghi');
|
24411
24481
|
});
|
24412
|
-
</doc:
|
24482
|
+
</doc:protractor>
|
24413
24483
|
</doc:example>
|
24414
24484
|
*/
|
24415
24485
|
function limitToFilter(){
|
@@ -24510,29 +24580,6 @@ function limitToFilter(){
|
|
24510
24580
|
</table>
|
24511
24581
|
</div>
|
24512
24582
|
</doc:source>
|
24513
|
-
<doc:scenario>
|
24514
|
-
it('should be reverse ordered by aged', function() {
|
24515
|
-
expect(binding('predicate')).toBe('-age');
|
24516
|
-
expect(repeater('table.friend', 'friend in friends').column('friend.age')).
|
24517
|
-
toEqual(['35', '29', '21', '19', '10']);
|
24518
|
-
expect(repeater('table.friend', 'friend in friends').column('friend.name')).
|
24519
|
-
toEqual(['Adam', 'Julie', 'Mike', 'Mary', 'John']);
|
24520
|
-
});
|
24521
|
-
|
24522
|
-
it('should reorder the table when user selects different predicate', function() {
|
24523
|
-
element('.doc-example-live a:contains("Name")').click();
|
24524
|
-
expect(repeater('table.friend', 'friend in friends').column('friend.name')).
|
24525
|
-
toEqual(['Adam', 'John', 'Julie', 'Mary', 'Mike']);
|
24526
|
-
expect(repeater('table.friend', 'friend in friends').column('friend.age')).
|
24527
|
-
toEqual(['35', '10', '29', '19', '21']);
|
24528
|
-
|
24529
|
-
element('.doc-example-live a:contains("Phone")').click();
|
24530
|
-
expect(repeater('table.friend', 'friend in friends').column('friend.phone')).
|
24531
|
-
toEqual(['555-9876', '555-8765', '555-5678', '555-4321', '555-1212']);
|
24532
|
-
expect(repeater('table.friend', 'friend in friends').column('friend.name')).
|
24533
|
-
toEqual(['Mary', 'Julie', 'Adam', 'Mike', 'John']);
|
24534
|
-
});
|
24535
|
-
</doc:scenario>
|
24536
24583
|
</doc:example>
|
24537
24584
|
*/
|
24538
24585
|
orderByFilter.$inject = ['$parse'];
|
@@ -24686,46 +24733,55 @@ var htmlAnchorDirective = valueFn({
|
|
24686
24733
|
<a id="link-5" name="xxx" ng-click="value = 5">anchor</a> (no link)<br />
|
24687
24734
|
<a id="link-6" ng-href="{{value}}">link</a> (link, change location)
|
24688
24735
|
</doc:source>
|
24689
|
-
<doc:
|
24736
|
+
<doc:protractor>
|
24690
24737
|
it('should execute ng-click but not reload when href without value', function() {
|
24691
|
-
element('
|
24692
|
-
expect(
|
24693
|
-
expect(element('
|
24738
|
+
element(by.id('link-1')).click();
|
24739
|
+
expect(element(by.model('value')).getAttribute('value')).toEqual('1');
|
24740
|
+
expect(element(by.id('link-1')).getAttribute('href')).toBe('');
|
24694
24741
|
});
|
24695
24742
|
|
24696
24743
|
it('should execute ng-click but not reload when href empty string', function() {
|
24697
|
-
element('
|
24698
|
-
expect(
|
24699
|
-
expect(element('
|
24744
|
+
element(by.id('link-2')).click();
|
24745
|
+
expect(element(by.model('value')).getAttribute('value')).toEqual('2');
|
24746
|
+
expect(element(by.id('link-2')).getAttribute('href')).toBe('');
|
24700
24747
|
});
|
24701
24748
|
|
24702
24749
|
it('should execute ng-click and change url when ng-href specified', function() {
|
24703
|
-
expect(element('
|
24750
|
+
expect(element(by.id('link-3')).getAttribute('href')).toMatch(/\/123$/);
|
24751
|
+
|
24752
|
+
element(by.id('link-3')).click();
|
24753
|
+
|
24754
|
+
// At this point, we navigate away from an Angular page, so we need
|
24755
|
+
// to use browser.driver to get the base webdriver.
|
24704
24756
|
|
24705
|
-
|
24706
|
-
|
24757
|
+
browser.wait(function() {
|
24758
|
+
return browser.driver.getCurrentUrl().then(function(url) {
|
24759
|
+
return url.match(/\/123$/);
|
24760
|
+
});
|
24761
|
+
}, 1000, 'page should navigate to /123');
|
24707
24762
|
});
|
24708
24763
|
|
24709
24764
|
it('should execute ng-click but not reload when href empty string and name specified', function() {
|
24710
|
-
element('
|
24711
|
-
expect(
|
24712
|
-
expect(element('
|
24765
|
+
element(by.id('link-4')).click();
|
24766
|
+
expect(element(by.model('value')).getAttribute('value')).toEqual('4');
|
24767
|
+
expect(element(by.id('link-4')).getAttribute('href')).toBe('');
|
24713
24768
|
});
|
24714
24769
|
|
24715
24770
|
it('should execute ng-click but not reload when no href but name specified', function() {
|
24716
|
-
element('
|
24717
|
-
expect(
|
24718
|
-
expect(element('
|
24771
|
+
element(by.id('link-5')).click();
|
24772
|
+
expect(element(by.model('value')).getAttribute('value')).toEqual('5');
|
24773
|
+
expect(element(by.id('link-5')).getAttribute('href')).toBe(null);
|
24719
24774
|
});
|
24720
24775
|
|
24721
24776
|
it('should only change url when only ng-href', function() {
|
24722
|
-
|
24723
|
-
|
24777
|
+
element(by.model('value')).clear();
|
24778
|
+
element(by.model('value')).sendKeys('6');
|
24779
|
+
expect(element(by.id('link-6')).getAttribute('href')).toMatch(/\/6$/);
|
24724
24780
|
|
24725
|
-
element('
|
24726
|
-
expect(browser
|
24781
|
+
element(by.id('link-6')).click();
|
24782
|
+
expect(browser.getCurrentUrl()).toMatch(/\/6$/);
|
24727
24783
|
});
|
24728
|
-
</doc:
|
24784
|
+
</doc:protractor>
|
24729
24785
|
</doc:example>
|
24730
24786
|
*/
|
24731
24787
|
|
@@ -24810,13 +24866,13 @@ var htmlAnchorDirective = valueFn({
|
|
24810
24866
|
Click me to toggle: <input type="checkbox" ng-model="checked"><br/>
|
24811
24867
|
<button ng-model="button" ng-disabled="checked">Button</button>
|
24812
24868
|
</doc:source>
|
24813
|
-
<doc:
|
24869
|
+
<doc:protractor>
|
24814
24870
|
it('should toggle button', function() {
|
24815
|
-
expect(element('.doc-example-live
|
24816
|
-
|
24817
|
-
expect(element('.doc-example-live
|
24871
|
+
expect(element(by.css('.doc-example-live button')).getAttribute('disabled')).toBeFalsy();
|
24872
|
+
element(by.model('checked')).click();
|
24873
|
+
expect(element(by.css('.doc-example-live button')).getAttribute('disabled')).toBeTruthy();
|
24818
24874
|
});
|
24819
|
-
</doc:
|
24875
|
+
</doc:protractor>
|
24820
24876
|
</doc:example>
|
24821
24877
|
*
|
24822
24878
|
* @element INPUT
|
@@ -24845,13 +24901,13 @@ var htmlAnchorDirective = valueFn({
|
|
24845
24901
|
Check me to check both: <input type="checkbox" ng-model="master"><br/>
|
24846
24902
|
<input id="checkSlave" type="checkbox" ng-checked="master">
|
24847
24903
|
</doc:source>
|
24848
|
-
<doc:
|
24904
|
+
<doc:protractor>
|
24849
24905
|
it('should check both checkBoxes', function() {
|
24850
|
-
expect(element('
|
24851
|
-
|
24852
|
-
expect(element('
|
24906
|
+
expect(element(by.id('checkSlave')).getAttribute('checked')).toBeFalsy();
|
24907
|
+
element(by.model('master')).click();
|
24908
|
+
expect(element(by.id('checkSlave')).getAttribute('checked')).toBeTruthy();
|
24853
24909
|
});
|
24854
|
-
</doc:
|
24910
|
+
</doc:protractor>
|
24855
24911
|
</doc:example>
|
24856
24912
|
*
|
24857
24913
|
* @element INPUT
|
@@ -24880,13 +24936,13 @@ var htmlAnchorDirective = valueFn({
|
|
24880
24936
|
Check me to make text readonly: <input type="checkbox" ng-model="checked"><br/>
|
24881
24937
|
<input type="text" ng-readonly="checked" value="I'm Angular"/>
|
24882
24938
|
</doc:source>
|
24883
|
-
<doc:
|
24939
|
+
<doc:protractor>
|
24884
24940
|
it('should toggle readonly attr', function() {
|
24885
|
-
expect(element('.doc-example-live
|
24886
|
-
|
24887
|
-
expect(element('.doc-example-live
|
24941
|
+
expect(element(by.css('.doc-example-live [type="text"]')).getAttribute('readonly')).toBeFalsy();
|
24942
|
+
element(by.model('checked')).click();
|
24943
|
+
expect(element(by.css('.doc-example-live [type="text"]')).getAttribute('readonly')).toBeTruthy();
|
24888
24944
|
});
|
24889
|
-
</doc:
|
24945
|
+
</doc:protractor>
|
24890
24946
|
</doc:example>
|
24891
24947
|
*
|
24892
24948
|
* @element INPUT
|
@@ -24919,13 +24975,13 @@ var htmlAnchorDirective = valueFn({
|
|
24919
24975
|
<option id="greet" ng-selected="selected">Greetings!</option>
|
24920
24976
|
</select>
|
24921
24977
|
</doc:source>
|
24922
|
-
<doc:
|
24978
|
+
<doc:protractor>
|
24923
24979
|
it('should select Greetings!', function() {
|
24924
|
-
expect(element('
|
24925
|
-
|
24926
|
-
expect(element('
|
24980
|
+
expect(element(by.id('greet')).getAttribute('selected')).toBeFalsy();
|
24981
|
+
element(by.model('selected')).click();
|
24982
|
+
expect(element(by.id('greet')).getAttribute('selected')).toBeTruthy();
|
24927
24983
|
});
|
24928
|
-
</doc:
|
24984
|
+
</doc:protractor>
|
24929
24985
|
</doc:example>
|
24930
24986
|
*
|
24931
24987
|
* @element OPTION
|
@@ -24955,13 +25011,13 @@ var htmlAnchorDirective = valueFn({
|
|
24955
25011
|
<summary>Show/Hide me</summary>
|
24956
25012
|
</details>
|
24957
25013
|
</doc:source>
|
24958
|
-
<doc:
|
25014
|
+
<doc:protractor>
|
24959
25015
|
it('should toggle open', function() {
|
24960
|
-
expect(element('
|
24961
|
-
|
24962
|
-
expect(element('
|
25016
|
+
expect(element(by.id('details')).getAttribute('open')).toBeFalsy();
|
25017
|
+
element(by.model('open')).click();
|
25018
|
+
expect(element(by.id('details')).getAttribute('open')).toBeTruthy();
|
24963
25019
|
});
|
24964
|
-
</doc:
|
25020
|
+
</doc:protractor>
|
24965
25021
|
</doc:example>
|
24966
25022
|
*
|
24967
25023
|
* @element DETAILS
|
@@ -25320,18 +25376,27 @@ function FormController(element, attrs) {
|
|
25320
25376
|
<tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br>
|
25321
25377
|
</form>
|
25322
25378
|
</doc:source>
|
25323
|
-
<doc:
|
25379
|
+
<doc:protractor>
|
25324
25380
|
it('should initialize to model', function() {
|
25325
|
-
|
25326
|
-
|
25381
|
+
var userType = element(by.binding('userType'));
|
25382
|
+
var valid = element(by.binding('myForm.input.$valid'));
|
25383
|
+
|
25384
|
+
expect(userType.getText()).toContain('guest');
|
25385
|
+
expect(valid.getText()).toContain('true');
|
25327
25386
|
});
|
25328
25387
|
|
25329
25388
|
it('should be invalid if empty', function() {
|
25330
|
-
|
25331
|
-
|
25332
|
-
|
25389
|
+
var userType = element(by.binding('userType'));
|
25390
|
+
var valid = element(by.binding('myForm.input.$valid'));
|
25391
|
+
var userInput = element(by.model('userType'));
|
25392
|
+
|
25393
|
+
userInput.clear();
|
25394
|
+
userInput.sendKeys('');
|
25395
|
+
|
25396
|
+
expect(userType.getText()).toEqual('userType =');
|
25397
|
+
expect(valid.getText()).toContain('false');
|
25333
25398
|
});
|
25334
|
-
</doc:
|
25399
|
+
</doc:protractor>
|
25335
25400
|
</doc:example>
|
25336
25401
|
*/
|
25337
25402
|
var formDirectiveFactory = function(isNgForm) {
|
@@ -25456,29 +25521,31 @@ var inputType = {
|
|
25456
25521
|
<tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
|
25457
25522
|
</form>
|
25458
25523
|
</doc:source>
|
25459
|
-
<doc:
|
25524
|
+
<doc:protractor>
|
25525
|
+
var text = element(by.binding('text'));
|
25526
|
+
var valid = element(by.binding('myForm.input.$valid'));
|
25527
|
+
var input = element(by.model('text'));
|
25528
|
+
|
25460
25529
|
it('should initialize to model', function() {
|
25461
|
-
expect(
|
25462
|
-
expect(
|
25530
|
+
expect(text.getText()).toContain('guest');
|
25531
|
+
expect(valid.getText()).toContain('true');
|
25463
25532
|
});
|
25464
25533
|
|
25465
25534
|
it('should be invalid if empty', function() {
|
25466
|
-
input
|
25467
|
-
|
25468
|
-
|
25535
|
+
input.clear();
|
25536
|
+
input.sendKeys('');
|
25537
|
+
|
25538
|
+
expect(text.getText()).toEqual('text =');
|
25539
|
+
expect(valid.getText()).toContain('false');
|
25469
25540
|
});
|
25470
25541
|
|
25471
25542
|
it('should be invalid if multi word', function() {
|
25472
|
-
input
|
25473
|
-
|
25474
|
-
});
|
25543
|
+
input.clear();
|
25544
|
+
input.sendKeys('hello world');
|
25475
25545
|
|
25476
|
-
|
25477
|
-
input('text').enter('untrimmed ');
|
25478
|
-
expect(binding('text')).toEqual('untrimmed ');
|
25479
|
-
expect(binding('myForm.input.$valid')).toEqual('true');
|
25546
|
+
expect(valid.getText()).toContain('false');
|
25480
25547
|
});
|
25481
|
-
</doc:
|
25548
|
+
</doc:protractor>
|
25482
25549
|
</doc:example>
|
25483
25550
|
*/
|
25484
25551
|
'text': textInputType,
|
@@ -25532,24 +25599,30 @@ var inputType = {
|
|
25532
25599
|
<tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
|
25533
25600
|
</form>
|
25534
25601
|
</doc:source>
|
25535
|
-
<doc:
|
25602
|
+
<doc:protractor>
|
25603
|
+
var value = element(by.binding('value'));
|
25604
|
+
var valid = element(by.binding('myForm.input.$valid'));
|
25605
|
+
var input = element(by.model('value'));
|
25606
|
+
|
25536
25607
|
it('should initialize to model', function() {
|
25537
|
-
|
25538
|
-
|
25608
|
+
expect(value.getText()).toContain('12');
|
25609
|
+
expect(valid.getText()).toContain('true');
|
25539
25610
|
});
|
25540
25611
|
|
25541
25612
|
it('should be invalid if empty', function() {
|
25542
|
-
|
25543
|
-
|
25544
|
-
|
25613
|
+
input.clear();
|
25614
|
+
input.sendKeys('');
|
25615
|
+
expect(value.getText()).toEqual('value =');
|
25616
|
+
expect(valid.getText()).toContain('false');
|
25545
25617
|
});
|
25546
25618
|
|
25547
25619
|
it('should be invalid if over max', function() {
|
25548
|
-
|
25549
|
-
|
25550
|
-
|
25620
|
+
input.clear();
|
25621
|
+
input.sendKeys('123');
|
25622
|
+
expect(value.getText()).toEqual('value =');
|
25623
|
+
expect(valid.getText()).toContain('false');
|
25551
25624
|
});
|
25552
|
-
</doc:
|
25625
|
+
</doc:protractor>
|
25553
25626
|
</doc:example>
|
25554
25627
|
*/
|
25555
25628
|
'number': numberInputType,
|
@@ -25601,23 +25674,31 @@ var inputType = {
|
|
25601
25674
|
<tt>myForm.$error.url = {{!!myForm.$error.url}}</tt><br/>
|
25602
25675
|
</form>
|
25603
25676
|
</doc:source>
|
25604
|
-
<doc:
|
25677
|
+
<doc:protractor>
|
25678
|
+
var text = element(by.binding('text'));
|
25679
|
+
var valid = element(by.binding('myForm.input.$valid'));
|
25680
|
+
var input = element(by.model('text'));
|
25681
|
+
|
25605
25682
|
it('should initialize to model', function() {
|
25606
|
-
expect(
|
25607
|
-
expect(
|
25683
|
+
expect(text.getText()).toContain('http://google.com');
|
25684
|
+
expect(valid.getText()).toContain('true');
|
25608
25685
|
});
|
25609
25686
|
|
25610
25687
|
it('should be invalid if empty', function() {
|
25611
|
-
input
|
25612
|
-
|
25613
|
-
|
25688
|
+
input.clear();
|
25689
|
+
input.sendKeys('');
|
25690
|
+
|
25691
|
+
expect(text.getText()).toEqual('text =');
|
25692
|
+
expect(valid.getText()).toContain('false');
|
25614
25693
|
});
|
25615
25694
|
|
25616
25695
|
it('should be invalid if not url', function() {
|
25617
|
-
input
|
25618
|
-
|
25696
|
+
input.clear();
|
25697
|
+
input.sendKeys('box');
|
25698
|
+
|
25699
|
+
expect(valid.getText()).toContain('false');
|
25619
25700
|
});
|
25620
|
-
</doc:
|
25701
|
+
</doc:protractor>
|
25621
25702
|
</doc:example>
|
25622
25703
|
*/
|
25623
25704
|
'url': urlInputType,
|
@@ -25669,23 +25750,30 @@ var inputType = {
|
|
25669
25750
|
<tt>myForm.$error.email = {{!!myForm.$error.email}}</tt><br/>
|
25670
25751
|
</form>
|
25671
25752
|
</doc:source>
|
25672
|
-
<doc:
|
25753
|
+
<doc:protractor>
|
25754
|
+
var text = element(by.binding('text'));
|
25755
|
+
var valid = element(by.binding('myForm.input.$valid'));
|
25756
|
+
var input = element(by.model('text'));
|
25757
|
+
|
25673
25758
|
it('should initialize to model', function() {
|
25674
|
-
expect(
|
25675
|
-
expect(
|
25759
|
+
expect(text.getText()).toContain('me@example.com');
|
25760
|
+
expect(valid.getText()).toContain('true');
|
25676
25761
|
});
|
25677
25762
|
|
25678
25763
|
it('should be invalid if empty', function() {
|
25679
|
-
input
|
25680
|
-
|
25681
|
-
expect(
|
25764
|
+
input.clear();
|
25765
|
+
input.sendKeys('');
|
25766
|
+
expect(text.getText()).toEqual('text =');
|
25767
|
+
expect(valid.getText()).toContain('false');
|
25682
25768
|
});
|
25683
25769
|
|
25684
25770
|
it('should be invalid if not email', function() {
|
25685
|
-
input
|
25686
|
-
|
25771
|
+
input.clear();
|
25772
|
+
input.sendKeys('xxx');
|
25773
|
+
|
25774
|
+
expect(valid.getText()).toContain('false');
|
25687
25775
|
});
|
25688
|
-
</doc:
|
25776
|
+
</doc:protractor>
|
25689
25777
|
</doc:example>
|
25690
25778
|
*/
|
25691
25779
|
'email': emailInputType,
|
@@ -25726,14 +25814,17 @@ var inputType = {
|
|
25726
25814
|
</form>
|
25727
25815
|
Note that `ng-value="specialValue"` sets radio item's value to be the value of `$scope.specialValue`.
|
25728
25816
|
</doc:source>
|
25729
|
-
<doc:
|
25817
|
+
<doc:protractor>
|
25730
25818
|
it('should change state', function() {
|
25731
|
-
|
25819
|
+
var color = element(by.binding('color'));
|
25820
|
+
|
25821
|
+
expect(color.getText()).toContain('blue');
|
25732
25822
|
|
25733
|
-
|
25734
|
-
|
25823
|
+
element.all(by.model('color')).get(0).click();
|
25824
|
+
|
25825
|
+
expect(color.getText()).toContain('red');
|
25735
25826
|
});
|
25736
|
-
</doc:
|
25827
|
+
</doc:protractor>
|
25737
25828
|
</doc:example>
|
25738
25829
|
*/
|
25739
25830
|
'radio': radioInputType,
|
@@ -25770,17 +25861,21 @@ var inputType = {
|
|
25770
25861
|
<tt>value2 = {{value2}}</tt><br/>
|
25771
25862
|
</form>
|
25772
25863
|
</doc:source>
|
25773
|
-
<doc:
|
25864
|
+
<doc:protractor>
|
25774
25865
|
it('should change state', function() {
|
25775
|
-
|
25776
|
-
|
25866
|
+
var value1 = element(by.binding('value1'));
|
25867
|
+
var value2 = element(by.binding('value2'));
|
25868
|
+
|
25869
|
+
expect(value1.getText()).toContain('true');
|
25870
|
+
expect(value2.getText()).toContain('YES');
|
25871
|
+
|
25872
|
+
element(by.model('value1')).click();
|
25873
|
+
element(by.model('value2')).click();
|
25777
25874
|
|
25778
|
-
|
25779
|
-
|
25780
|
-
expect(binding('value1')).toEqual('false');
|
25781
|
-
expect(binding('value2')).toEqual('NO');
|
25875
|
+
expect(value1.getText()).toContain('false');
|
25876
|
+
expect(value2.getText()).toContain('NO');
|
25782
25877
|
});
|
25783
|
-
</doc:
|
25878
|
+
</doc:protractor>
|
25784
25879
|
</doc:example>
|
25785
25880
|
*/
|
25786
25881
|
'checkbox': checkboxInputType,
|
@@ -26133,44 +26228,59 @@ function checkboxInputType(scope, element, attr, ctrl) {
|
|
26133
26228
|
<tt>myForm.$error.maxlength = {{!!myForm.$error.maxlength}}</tt><br>
|
26134
26229
|
</div>
|
26135
26230
|
</doc:source>
|
26136
|
-
<doc:
|
26231
|
+
<doc:protractor>
|
26232
|
+
var user = element(by.binding('{{user}}'));
|
26233
|
+
var userNameValid = element(by.binding('myForm.userName.$valid'));
|
26234
|
+
var lastNameValid = element(by.binding('myForm.lastName.$valid'));
|
26235
|
+
var lastNameError = element(by.binding('myForm.lastName.$error'));
|
26236
|
+
var formValid = element(by.binding('myForm.$valid'));
|
26237
|
+
var userNameInput = element(by.model('user.name'));
|
26238
|
+
var userLastInput = element(by.model('user.last'));
|
26239
|
+
|
26137
26240
|
it('should initialize to model', function() {
|
26138
|
-
expect(
|
26139
|
-
expect(
|
26140
|
-
expect(
|
26241
|
+
expect(user.getText()).toContain('{"name":"guest","last":"visitor"}');
|
26242
|
+
expect(userNameValid.getText()).toContain('true');
|
26243
|
+
expect(formValid.getText()).toContain('true');
|
26141
26244
|
});
|
26142
26245
|
|
26143
26246
|
it('should be invalid if empty when required', function() {
|
26144
|
-
|
26145
|
-
|
26146
|
-
|
26147
|
-
expect(
|
26247
|
+
userNameInput.clear();
|
26248
|
+
userNameInput.sendKeys('');
|
26249
|
+
|
26250
|
+
expect(user.getText()).toContain('{"last":"visitor"}');
|
26251
|
+
expect(userNameValid.getText()).toContain('false');
|
26252
|
+
expect(formValid.getText()).toContain('false');
|
26148
26253
|
});
|
26149
26254
|
|
26150
26255
|
it('should be valid if empty when min length is set', function() {
|
26151
|
-
|
26152
|
-
|
26153
|
-
|
26154
|
-
expect(
|
26256
|
+
userLastInput.clear();
|
26257
|
+
userLastInput.sendKeys('');
|
26258
|
+
|
26259
|
+
expect(user.getText()).toContain('{"name":"guest","last":""}');
|
26260
|
+
expect(lastNameValid.getText()).toContain('true');
|
26261
|
+
expect(formValid.getText()).toContain('true');
|
26155
26262
|
});
|
26156
26263
|
|
26157
26264
|
it('should be invalid if less than required min length', function() {
|
26158
|
-
|
26159
|
-
|
26160
|
-
|
26161
|
-
expect(
|
26162
|
-
expect(
|
26265
|
+
userLastInput.clear();
|
26266
|
+
userLastInput.sendKeys('xx');
|
26267
|
+
|
26268
|
+
expect(user.getText()).toContain('{"name":"guest"}');
|
26269
|
+
expect(lastNameValid.getText()).toContain('false');
|
26270
|
+
expect(lastNameError.getText()).toContain('minlength');
|
26271
|
+
expect(formValid.getText()).toContain('false');
|
26163
26272
|
});
|
26164
26273
|
|
26165
26274
|
it('should be invalid if longer than max length', function() {
|
26166
|
-
|
26167
|
-
|
26168
|
-
|
26169
|
-
expect(
|
26170
|
-
expect(
|
26171
|
-
expect(
|
26275
|
+
userLastInput.clear();
|
26276
|
+
userLastInput.sendKeys('some ridiculously long name');
|
26277
|
+
|
26278
|
+
expect(user.getText()).toContain('{"name":"guest"}');
|
26279
|
+
expect(lastNameValid.getText()).toContain('false');
|
26280
|
+
expect(lastNameError.getText()).toContain('maxlength');
|
26281
|
+
expect(formValid.getText()).toContain('false');
|
26172
26282
|
});
|
26173
|
-
</doc:
|
26283
|
+
</doc:protractor>
|
26174
26284
|
</doc:example>
|
26175
26285
|
*/
|
26176
26286
|
var inputDirective = ['$browser', '$sniffer', function($browser, $sniffer) {
|
@@ -26302,14 +26412,23 @@ var VALID_CLASS = 'ng-valid',
|
|
26302
26412
|
<textarea ng-model="userContent"></textarea>
|
26303
26413
|
</form>
|
26304
26414
|
</file>
|
26305
|
-
<file name="
|
26415
|
+
<file name="protractorTest.js">
|
26306
26416
|
it('should data-bind and become invalid', function() {
|
26307
|
-
|
26417
|
+
if (browser.params.browser = 'safari') {
|
26418
|
+
// SafariDriver can't handle contenteditable.
|
26419
|
+
return;
|
26420
|
+
};
|
26421
|
+
var contentEditable = element(by.css('.doc-example-live [contenteditable]'));
|
26308
26422
|
|
26309
|
-
expect(contentEditable.
|
26310
|
-
|
26311
|
-
|
26312
|
-
|
26423
|
+
expect(contentEditable.getText()).toEqual('Change me!');
|
26424
|
+
|
26425
|
+
// Firefox driver doesn't trigger the proper events on 'clear', so do this hack
|
26426
|
+
contentEditable.click();
|
26427
|
+
contentEditable.sendKeys(protractor.Key.chord(protractor.Key.COMMAND, "a"));
|
26428
|
+
contentEditable.sendKeys(protractor.Key.BACK_SPACE);
|
26429
|
+
|
26430
|
+
expect(contentEditable.getText()).toEqual('');
|
26431
|
+
expect(contentEditable.getAttribute('class')).toMatch(/ng-invalid-required/);
|
26313
26432
|
});
|
26314
26433
|
</file>
|
26315
26434
|
* </example>
|
@@ -26616,24 +26735,30 @@ var ngModelDirective = function() {
|
|
26616
26735
|
* <input type="checkbox" ng-model="confirmed" ng-change="change()" id="ng-change-example1" />
|
26617
26736
|
* <input type="checkbox" ng-model="confirmed" id="ng-change-example2" />
|
26618
26737
|
* <label for="ng-change-example2">Confirmed</label><br />
|
26619
|
-
* debug = {{confirmed}}
|
26620
|
-
* counter = {{counter}}
|
26738
|
+
* <tt>debug = {{confirmed}}</tt><br/>
|
26739
|
+
* <tt>counter = {{counter}}</tt><br/>
|
26621
26740
|
* </div>
|
26622
26741
|
* </doc:source>
|
26623
|
-
* <doc:
|
26742
|
+
* <doc:protractor>
|
26743
|
+
* var counter = element(by.binding('counter'));
|
26744
|
+
* var debug = element(by.binding('confirmed'));
|
26745
|
+
*
|
26624
26746
|
* it('should evaluate the expression if changing from view', function() {
|
26625
|
-
* expect(
|
26626
|
-
*
|
26627
|
-
*
|
26628
|
-
*
|
26747
|
+
* expect(counter.getText()).toContain('0');
|
26748
|
+
*
|
26749
|
+
* element(by.id('ng-change-example1')).click();
|
26750
|
+
*
|
26751
|
+
* expect(counter.getText()).toContain('1');
|
26752
|
+
* expect(debug.getText()).toContain('true');
|
26629
26753
|
* });
|
26630
26754
|
*
|
26631
26755
|
* it('should not evaluate the expression if changing from model', function() {
|
26632
|
-
* element('
|
26633
|
-
|
26634
|
-
* expect(
|
26756
|
+
* element(by.id('ng-change-example2')).click();
|
26757
|
+
|
26758
|
+
* expect(counter.getText()).toContain('0');
|
26759
|
+
* expect(debug.getText()).toContain('true');
|
26635
26760
|
* });
|
26636
|
-
* </doc:
|
26761
|
+
* </doc:protractor>
|
26637
26762
|
* </doc:example>
|
26638
26763
|
*/
|
26639
26764
|
var ngChangeDirective = valueFn({
|
@@ -26706,20 +26831,26 @@ var requiredDirective = function() {
|
|
26706
26831
|
<tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
|
26707
26832
|
</form>
|
26708
26833
|
</doc:source>
|
26709
|
-
<doc:
|
26834
|
+
<doc:protractor>
|
26835
|
+
var listInput = element(by.model('names'));
|
26836
|
+
var names = element(by.binding('{{names}}'));
|
26837
|
+
var valid = element(by.binding('myForm.namesInput.$valid'));
|
26838
|
+
var error = element(by.css('span.error'));
|
26839
|
+
|
26710
26840
|
it('should initialize to model', function() {
|
26711
|
-
expect(
|
26712
|
-
expect(
|
26713
|
-
expect(
|
26841
|
+
expect(names.getText()).toContain('["igor","misko","vojta"]');
|
26842
|
+
expect(valid.getText()).toContain('true');
|
26843
|
+
expect(error.getCssValue('display')).toBe('none');
|
26714
26844
|
});
|
26715
26845
|
|
26716
26846
|
it('should be invalid if empty', function() {
|
26717
|
-
|
26718
|
-
|
26719
|
-
|
26720
|
-
expect(
|
26721
|
-
|
26722
|
-
|
26847
|
+
listInput.clear();
|
26848
|
+
listInput.sendKeys('');
|
26849
|
+
|
26850
|
+
expect(names.getText()).toContain('');
|
26851
|
+
expect(valid.getText()).toContain('false');
|
26852
|
+
expect(error.getCssValue('display')).not.toBe('none'); });
|
26853
|
+
</doc:protractor>
|
26723
26854
|
</doc:example>
|
26724
26855
|
*/
|
26725
26856
|
var ngListDirective = function() {
|
@@ -26801,15 +26932,17 @@ var CONSTANT_VALUE_REGEXP = /^(true|false|\d+)$/;
|
|
26801
26932
|
<div>You chose {{my.favorite}}</div>
|
26802
26933
|
</form>
|
26803
26934
|
</doc:source>
|
26804
|
-
<doc:
|
26935
|
+
<doc:protractor>
|
26936
|
+
var favorite = element(by.binding('my.favorite'));
|
26937
|
+
|
26805
26938
|
it('should initialize to model', function() {
|
26806
|
-
expect(
|
26939
|
+
expect(favorite.getText()).toContain('unicorns');
|
26807
26940
|
});
|
26808
26941
|
it('should bind the values to the inputs', function() {
|
26809
|
-
|
26810
|
-
expect(
|
26942
|
+
element.all(by.model('my.favorite')).get(0).click();
|
26943
|
+
expect(favorite.getText()).toContain('pizza');
|
26811
26944
|
});
|
26812
|
-
</doc:
|
26945
|
+
</doc:protractor>
|
26813
26946
|
</doc:example>
|
26814
26947
|
*/
|
26815
26948
|
var ngValueDirective = function() {
|
@@ -26869,13 +27002,17 @@ var ngValueDirective = function() {
|
|
26869
27002
|
Hello <span ng-bind="name"></span>!
|
26870
27003
|
</div>
|
26871
27004
|
</doc:source>
|
26872
|
-
<doc:
|
27005
|
+
<doc:protractor>
|
26873
27006
|
it('should check ng-bind', function() {
|
26874
|
-
|
26875
|
-
|
26876
|
-
|
27007
|
+
var exampleContainer = $('.doc-example-live');
|
27008
|
+
var nameInput = element(by.model('name'));
|
27009
|
+
|
27010
|
+
expect(exampleContainer.findElement(by.binding('name')).getText()).toBe('Whirled');
|
27011
|
+
nameInput.clear();
|
27012
|
+
nameInput.sendKeys('world');
|
27013
|
+
expect(exampleContainer.findElement(by.binding('name')).getText()).toBe('world');
|
26877
27014
|
});
|
26878
|
-
</doc:
|
27015
|
+
</doc:protractor>
|
26879
27016
|
</doc:example>
|
26880
27017
|
*/
|
26881
27018
|
var ngBindDirective = ngDirective(function(scope, element, attr) {
|
@@ -26921,20 +27058,22 @@ var ngBindDirective = ngDirective(function(scope, element, attr) {
|
|
26921
27058
|
<pre ng-bind-template="{{salutation}} {{name}}!"></pre>
|
26922
27059
|
</div>
|
26923
27060
|
</doc:source>
|
26924
|
-
<doc:
|
27061
|
+
<doc:protractor>
|
26925
27062
|
it('should check ng-bind', function() {
|
26926
|
-
|
26927
|
-
|
26928
|
-
|
26929
|
-
|
26930
|
-
|
26931
|
-
|
26932
|
-
|
26933
|
-
|
26934
|
-
|
26935
|
-
|
27063
|
+
var salutationElem = element(by.binding('salutation'));
|
27064
|
+
var salutationInput = element(by.model('salutation'));
|
27065
|
+
var nameInput = element(by.model('name'));
|
27066
|
+
|
27067
|
+
expect(salutationElem.getText()).toBe('Hello World!');
|
27068
|
+
|
27069
|
+
salutationInput.clear();
|
27070
|
+
salutationInput.sendKeys('Greetings');
|
27071
|
+
nameInput.clear();
|
27072
|
+
nameInput.sendKeys('user');
|
27073
|
+
|
27074
|
+
expect(salutationElem.getText()).toBe('Greetings user!');
|
26936
27075
|
});
|
26937
|
-
</doc:
|
27076
|
+
</doc:protractor>
|
26938
27077
|
</doc:example>
|
26939
27078
|
*/
|
26940
27079
|
var ngBindTemplateDirective = ['$interpolate', function($interpolate) {
|
@@ -26987,12 +27126,10 @@ var ngBindTemplateDirective = ['$interpolate', function($interpolate) {
|
|
26987
27126
|
}]);
|
26988
27127
|
</file>
|
26989
27128
|
|
26990
|
-
<file name="
|
27129
|
+
<file name="protractorTest.js">
|
26991
27130
|
it('should check ng-bind-html', function() {
|
26992
|
-
expect(
|
26993
|
-
|
26994
|
-
'I am an <code>HTML</code>string with <a href="#">links!</a> and other <em>stuff</em>'
|
26995
|
-
);
|
27131
|
+
expect(element(by.binding('myHTML')).getText()).toBe(
|
27132
|
+
'I am an HTMLstring with links! and other stuff');
|
26996
27133
|
});
|
26997
27134
|
</file>
|
26998
27135
|
</example>
|
@@ -27124,31 +27261,34 @@ function classDirective(name, selector) {
|
|
27124
27261
|
color: red;
|
27125
27262
|
}
|
27126
27263
|
</file>
|
27127
|
-
<file name="
|
27264
|
+
<file name="protractorTest.js">
|
27265
|
+
var ps = element.all(by.css('.doc-example-live p'));
|
27266
|
+
|
27128
27267
|
it('should let you toggle the class', function() {
|
27129
27268
|
|
27130
|
-
expect(
|
27131
|
-
expect(
|
27269
|
+
expect(ps.first().getAttribute('class')).not.toMatch(/bold/);
|
27270
|
+
expect(ps.first().getAttribute('class')).not.toMatch(/red/);
|
27132
27271
|
|
27133
|
-
|
27134
|
-
expect(
|
27272
|
+
element(by.model('important')).click();
|
27273
|
+
expect(ps.first().getAttribute('class')).toMatch(/bold/);
|
27135
27274
|
|
27136
|
-
|
27137
|
-
expect(
|
27275
|
+
element(by.model('error')).click();
|
27276
|
+
expect(ps.first().getAttribute('class')).toMatch(/red/);
|
27138
27277
|
});
|
27139
27278
|
|
27140
27279
|
it('should let you toggle string example', function() {
|
27141
|
-
expect(
|
27142
|
-
|
27143
|
-
|
27280
|
+
expect(ps.get(1).getAttribute('class')).toBe('');
|
27281
|
+
element(by.model('style')).clear();
|
27282
|
+
element(by.model('style')).sendKeys('red');
|
27283
|
+
expect(ps.get(1).getAttribute('class')).toBe('red');
|
27144
27284
|
});
|
27145
27285
|
|
27146
27286
|
it('array example should have 3 classes', function() {
|
27147
|
-
expect(
|
27148
|
-
|
27149
|
-
|
27150
|
-
|
27151
|
-
expect(
|
27287
|
+
expect(ps.last().getAttribute('class')).toBe('');
|
27288
|
+
element(by.model('style1')).sendKeys('bold');
|
27289
|
+
element(by.model('style2')).sendKeys('strike');
|
27290
|
+
element(by.model('style3')).sendKeys('red');
|
27291
|
+
expect(ps.last().getAttribute('class')).toBe('bold strike red');
|
27152
27292
|
});
|
27153
27293
|
</file>
|
27154
27294
|
</example>
|
@@ -27159,8 +27299,8 @@ function classDirective(name, selector) {
|
|
27159
27299
|
|
27160
27300
|
<example animations="true">
|
27161
27301
|
<file name="index.html">
|
27162
|
-
<input type="button" value="set" ng-click="myVar='my-class'">
|
27163
|
-
<input type="button" value="clear" ng-click="myVar=''">
|
27302
|
+
<input id="setbtn" type="button" value="set" ng-click="myVar='my-class'">
|
27303
|
+
<input id="clearbtn" type="button" value="clear" ng-click="myVar=''">
|
27164
27304
|
<br>
|
27165
27305
|
<span class="base-class" ng-class="myVar">Sample Text</span>
|
27166
27306
|
</file>
|
@@ -27175,19 +27315,19 @@ function classDirective(name, selector) {
|
|
27175
27315
|
font-size:3em;
|
27176
27316
|
}
|
27177
27317
|
</file>
|
27178
|
-
<file name="
|
27318
|
+
<file name="protractorTest.js">
|
27179
27319
|
it('should check ng-class', function() {
|
27180
|
-
expect(element('.
|
27320
|
+
expect(element(by.css('.base-class')).getAttribute('class')).not.
|
27181
27321
|
toMatch(/my-class/);
|
27182
27322
|
|
27183
|
-
|
27323
|
+
element(by.id('setbtn')).click();
|
27184
27324
|
|
27185
|
-
expect(element('.
|
27325
|
+
expect(element(by.css('.base-class')).getAttribute('class')).
|
27186
27326
|
toMatch(/my-class/);
|
27187
27327
|
|
27188
|
-
|
27328
|
+
element(by.id('clearbtn')).click();
|
27189
27329
|
|
27190
|
-
expect(element('.
|
27330
|
+
expect(element(by.css('.base-class')).getAttribute('class')).not.
|
27191
27331
|
toMatch(/my-class/);
|
27192
27332
|
});
|
27193
27333
|
</file>
|
@@ -27239,11 +27379,11 @@ var ngClassDirective = classDirective('', true);
|
|
27239
27379
|
color: blue;
|
27240
27380
|
}
|
27241
27381
|
</file>
|
27242
|
-
<file name="
|
27382
|
+
<file name="protractorTest.js">
|
27243
27383
|
it('should check ng-class-odd and ng-class-even', function() {
|
27244
|
-
expect(element('
|
27384
|
+
expect(element(by.repeater('name in names').row(0).column('name')).getAttribute('class')).
|
27245
27385
|
toMatch(/odd/);
|
27246
|
-
expect(element('
|
27386
|
+
expect(element(by.repeater('name in names').row(1).column('name')).getAttribute('class')).
|
27247
27387
|
toMatch(/even/);
|
27248
27388
|
});
|
27249
27389
|
</file>
|
@@ -27287,11 +27427,11 @@ var ngClassOddDirective = classDirective('Odd', 0);
|
|
27287
27427
|
color: blue;
|
27288
27428
|
}
|
27289
27429
|
</file>
|
27290
|
-
<file name="
|
27430
|
+
<file name="protractorTest.js">
|
27291
27431
|
it('should check ng-class-odd and ng-class-even', function() {
|
27292
|
-
expect(element('
|
27432
|
+
expect(element(by.repeater('name in names').row(0).column('name')).getAttribute('class')).
|
27293
27433
|
toMatch(/odd/);
|
27294
|
-
expect(element('
|
27434
|
+
expect(element(by.repeater('name in names').row(1).column('name')).getAttribute('class')).
|
27295
27435
|
toMatch(/even/);
|
27296
27436
|
});
|
27297
27437
|
</file>
|
@@ -27344,14 +27484,14 @@ var ngClassEvenDirective = classDirective('Even', 1);
|
|
27344
27484
|
<div id="template1" ng-cloak>{{ 'hello' }}</div>
|
27345
27485
|
<div id="template2" ng-cloak class="ng-cloak">{{ 'hello IE7' }}</div>
|
27346
27486
|
</doc:source>
|
27347
|
-
<doc:
|
27487
|
+
<doc:protractor>
|
27348
27488
|
it('should remove the template directive and css class', function() {
|
27349
|
-
expect(
|
27350
|
-
|
27351
|
-
expect(
|
27352
|
-
|
27489
|
+
expect($('.doc-example-live #template1').getAttribute('ng-cloak')).
|
27490
|
+
toBeNull();
|
27491
|
+
expect($('.doc-example-live #template2').getAttribute('ng-cloak')).
|
27492
|
+
toBeNull();
|
27353
27493
|
});
|
27354
|
-
</doc:
|
27494
|
+
</doc:protractor>
|
27355
27495
|
</doc:example>
|
27356
27496
|
*
|
27357
27497
|
*/
|
@@ -27444,22 +27584,36 @@ var ngCloakDirective = ngDirective({
|
|
27444
27584
|
</ul>
|
27445
27585
|
</div>
|
27446
27586
|
</doc:source>
|
27447
|
-
<doc:
|
27587
|
+
<doc:protractor>
|
27448
27588
|
it('should check controller as', function() {
|
27449
|
-
|
27450
|
-
|
27451
|
-
|
27452
|
-
|
27453
|
-
|
27454
|
-
|
27455
|
-
|
27456
|
-
|
27457
|
-
|
27458
|
-
|
27459
|
-
expect(
|
27460
|
-
|
27589
|
+
var container = element(by.id('ctrl-as-exmpl'));
|
27590
|
+
|
27591
|
+
expect(container.findElement(by.model('settings.name'))
|
27592
|
+
.getAttribute('value')).toBe('John Smith');
|
27593
|
+
|
27594
|
+
var firstRepeat =
|
27595
|
+
container.findElement(by.repeater('contact in settings.contacts').row(0));
|
27596
|
+
var secondRepeat =
|
27597
|
+
container.findElement(by.repeater('contact in settings.contacts').row(1));
|
27598
|
+
|
27599
|
+
expect(firstRepeat.findElement(by.model('contact.value')).getAttribute('value'))
|
27600
|
+
.toBe('408 555 1212');
|
27601
|
+
expect(secondRepeat.findElement(by.model('contact.value')).getAttribute('value'))
|
27602
|
+
.toBe('john.smith@example.org');
|
27603
|
+
|
27604
|
+
firstRepeat.findElement(by.linkText('clear')).click()
|
27605
|
+
|
27606
|
+
expect(firstRepeat.findElement(by.model('contact.value')).getAttribute('value'))
|
27607
|
+
.toBe('');
|
27608
|
+
|
27609
|
+
container.findElement(by.linkText('add')).click();
|
27610
|
+
|
27611
|
+
expect(container.findElement(by.repeater('contact in settings.contacts').row(2))
|
27612
|
+
.findElement(by.model('contact.value'))
|
27613
|
+
.getAttribute('value'))
|
27614
|
+
.toBe('yourname@example.org');
|
27461
27615
|
});
|
27462
|
-
</doc:
|
27616
|
+
</doc:protractor>
|
27463
27617
|
</doc:example>
|
27464
27618
|
<doc:example>
|
27465
27619
|
<doc:source>
|
@@ -27507,22 +27661,36 @@ var ngCloakDirective = ngDirective({
|
|
27507
27661
|
</ul>
|
27508
27662
|
</div>
|
27509
27663
|
</doc:source>
|
27510
|
-
<doc:
|
27664
|
+
<doc:protractor>
|
27511
27665
|
it('should check controller', function() {
|
27512
|
-
|
27513
|
-
|
27514
|
-
|
27515
|
-
|
27516
|
-
|
27517
|
-
|
27518
|
-
|
27519
|
-
|
27520
|
-
|
27521
|
-
|
27522
|
-
expect(
|
27523
|
-
|
27666
|
+
var container = element(by.id('ctrl-exmpl'));
|
27667
|
+
|
27668
|
+
expect(container.findElement(by.model('name'))
|
27669
|
+
.getAttribute('value')).toBe('John Smith');
|
27670
|
+
|
27671
|
+
var firstRepeat =
|
27672
|
+
container.findElement(by.repeater('contact in contacts').row(0));
|
27673
|
+
var secondRepeat =
|
27674
|
+
container.findElement(by.repeater('contact in contacts').row(1));
|
27675
|
+
|
27676
|
+
expect(firstRepeat.findElement(by.model('contact.value')).getAttribute('value'))
|
27677
|
+
.toBe('408 555 1212');
|
27678
|
+
expect(secondRepeat.findElement(by.model('contact.value')).getAttribute('value'))
|
27679
|
+
.toBe('john.smith@example.org');
|
27680
|
+
|
27681
|
+
firstRepeat.findElement(by.linkText('clear')).click()
|
27682
|
+
|
27683
|
+
expect(firstRepeat.findElement(by.model('contact.value')).getAttribute('value'))
|
27684
|
+
.toBe('');
|
27685
|
+
|
27686
|
+
container.findElement(by.linkText('add')).click();
|
27687
|
+
|
27688
|
+
expect(container.findElement(by.repeater('contact in contacts').row(2))
|
27689
|
+
.findElement(by.model('contact.value'))
|
27690
|
+
.getAttribute('value'))
|
27691
|
+
.toBe('yourname@example.org');
|
27524
27692
|
});
|
27525
|
-
</doc:
|
27693
|
+
</doc:protractor>
|
27526
27694
|
</doc:example>
|
27527
27695
|
|
27528
27696
|
*/
|
@@ -27903,20 +28071,20 @@ forEach(
|
|
27903
28071
|
<pre>list={{list}}</pre>
|
27904
28072
|
</form>
|
27905
28073
|
</doc:source>
|
27906
|
-
<doc:
|
28074
|
+
<doc:protractor>
|
27907
28075
|
it('should check ng-submit', function() {
|
27908
|
-
expect(binding('list')).toBe('[]');
|
27909
|
-
element('.doc-example-live #submit').click();
|
27910
|
-
expect(binding('list')).
|
27911
|
-
expect(input('text').
|
28076
|
+
expect(element(by.binding('list')).getText()).toBe('list=[]');
|
28077
|
+
element(by.css('.doc-example-live #submit')).click();
|
28078
|
+
expect(element(by.binding('list')).getText()).toContain('hello');
|
28079
|
+
expect(element(by.input('text')).getAttribute('value')).toBe('');
|
27912
28080
|
});
|
27913
28081
|
it('should ignore empty strings', function() {
|
27914
|
-
expect(binding('list')).toBe('[]');
|
27915
|
-
element('.doc-example-live #submit').click();
|
27916
|
-
element('.doc-example-live #submit').click();
|
27917
|
-
expect(binding('list')).
|
27918
|
-
|
27919
|
-
</doc:
|
28082
|
+
expect(element(by.binding('list')).getText()).toBe('list=[]');
|
28083
|
+
element(by.css('.doc-example-live #submit')).click();
|
28084
|
+
element(by.css('.doc-example-live #submit')).click();
|
28085
|
+
expect(element(by.binding('list')).getText()).toContain('hello');
|
28086
|
+
});
|
28087
|
+
</doc:protractor>
|
27920
28088
|
</doc:example>
|
27921
28089
|
*/
|
27922
28090
|
|
@@ -28243,19 +28411,33 @@ var ngIfDirective = ['$animate', function($animate) {
|
|
28243
28411
|
top:50px;
|
28244
28412
|
}
|
28245
28413
|
</file>
|
28246
|
-
<file name="
|
28414
|
+
<file name="protractorTest.js">
|
28415
|
+
var templateSelect = element(by.model('template'));
|
28416
|
+
var includeElem = element(by.css('.doc-example-live [ng-include]'));
|
28417
|
+
|
28247
28418
|
it('should load template1.html', function() {
|
28248
|
-
|
28249
|
-
toMatch(/Content of template1.html/);
|
28419
|
+
expect(includeElem.getText()).toMatch(/Content of template1.html/);
|
28250
28420
|
});
|
28421
|
+
|
28251
28422
|
it('should load template2.html', function() {
|
28252
|
-
|
28253
|
-
|
28254
|
-
|
28423
|
+
if (browser.params.browser == 'firefox') {
|
28424
|
+
// Firefox can't handle using selects
|
28425
|
+
// See https://github.com/angular/protractor/issues/480
|
28426
|
+
return;
|
28427
|
+
}
|
28428
|
+
templateSelect.click();
|
28429
|
+
templateSelect.element.all(by.css('option')).get(2).click();
|
28430
|
+
expect(includeElem.getText()).toMatch(/Content of template2.html/);
|
28255
28431
|
});
|
28432
|
+
|
28256
28433
|
it('should change to blank', function() {
|
28257
|
-
|
28258
|
-
|
28434
|
+
if (browser.params.browser == 'firefox') {
|
28435
|
+
// Firefox can't handle using selects
|
28436
|
+
return;
|
28437
|
+
}
|
28438
|
+
templateSelect.click();
|
28439
|
+
templateSelect.element.all(by.css('option')).get(0).click();
|
28440
|
+
expect(includeElem.isPresent()).toBe(false);
|
28259
28441
|
});
|
28260
28442
|
</file>
|
28261
28443
|
</example>
|
@@ -28415,15 +28597,15 @@ var ngIncludeFillContentDirective = ['$compile',
|
|
28415
28597
|
</div>
|
28416
28598
|
</div>
|
28417
28599
|
</doc:source>
|
28418
|
-
<doc:
|
28600
|
+
<doc:protractor>
|
28419
28601
|
it('should alias index positions', function() {
|
28420
|
-
|
28421
|
-
|
28422
|
-
|
28423
|
-
|
28424
|
-
|
28602
|
+
var elements = element.all(by.css('.example-init'));
|
28603
|
+
expect(elements.get(0).getText()).toBe('list[ 0 ][ 0 ] = a;');
|
28604
|
+
expect(elements.get(1).getText()).toBe('list[ 0 ][ 1 ] = b;');
|
28605
|
+
expect(elements.get(2).getText()).toBe('list[ 1 ][ 0 ] = c;');
|
28606
|
+
expect(elements.get(3).getText()).toBe('list[ 1 ][ 1 ] = d;');
|
28425
28607
|
});
|
28426
|
-
</doc:
|
28608
|
+
</doc:protractor>
|
28427
28609
|
</doc:example>
|
28428
28610
|
*/
|
28429
28611
|
var ngInitDirective = ngDirective({
|
@@ -28461,13 +28643,12 @@ var ngInitDirective = ngDirective({
|
|
28461
28643
|
<div>Normal: {{1 + 2}}</div>
|
28462
28644
|
<div ng-non-bindable>Ignored: {{1 + 2}}</div>
|
28463
28645
|
</doc:source>
|
28464
|
-
<doc:
|
28646
|
+
<doc:protractor>
|
28465
28647
|
it('should check ng-non-bindable', function() {
|
28466
|
-
expect(
|
28467
|
-
expect(
|
28468
|
-
toMatch(/1 \+ 2/);
|
28648
|
+
expect(element(by.binding('1 + 2')).getText()).toContain('3');
|
28649
|
+
expect(element.all(by.css('.doc-example-live div')).last().getText()).toMatch(/1 \+ 2/);
|
28469
28650
|
});
|
28470
|
-
</doc:
|
28651
|
+
</doc:protractor>
|
28471
28652
|
</doc:example>
|
28472
28653
|
*/
|
28473
28654
|
var ngNonBindableDirective = ngDirective({ terminal: true, priority: 1000 });
|
@@ -28595,49 +28776,53 @@ var ngNonBindableDirective = ngDirective({ terminal: true, priority: 1000 });
|
|
28595
28776
|
</ng-pluralize>
|
28596
28777
|
</div>
|
28597
28778
|
</doc:source>
|
28598
|
-
<doc:
|
28779
|
+
<doc:protractor>
|
28599
28780
|
it('should show correct pluralized string', function() {
|
28600
|
-
|
28601
|
-
|
28602
|
-
|
28603
|
-
|
28604
|
-
|
28605
|
-
|
28606
|
-
|
28607
|
-
|
28608
|
-
|
28609
|
-
toBe('Nobody is viewing.');
|
28610
|
-
|
28611
|
-
using('.doc-example-live').input('personCount').enter('2');
|
28612
|
-
expect(element('.doc-example-live ng-pluralize:first').text()).
|
28613
|
-
toBe('2 people are viewing.');
|
28614
|
-
expect(element('.doc-example-live ng-pluralize:last').text()).
|
28615
|
-
toBe('Igor and Misko are viewing.');
|
28616
|
-
|
28617
|
-
using('.doc-example-live').input('personCount').enter('3');
|
28618
|
-
expect(element('.doc-example-live ng-pluralize:first').text()).
|
28619
|
-
toBe('3 people are viewing.');
|
28620
|
-
expect(element('.doc-example-live ng-pluralize:last').text()).
|
28621
|
-
toBe('Igor, Misko and one other person are viewing.');
|
28622
|
-
|
28623
|
-
using('.doc-example-live').input('personCount').enter('4');
|
28624
|
-
expect(element('.doc-example-live ng-pluralize:first').text()).
|
28625
|
-
toBe('4 people are viewing.');
|
28626
|
-
expect(element('.doc-example-live ng-pluralize:last').text()).
|
28627
|
-
toBe('Igor, Misko and 2 other people are viewing.');
|
28628
|
-
});
|
28781
|
+
var withoutOffset = element.all(by.css('ng-pluralize')).get(0);
|
28782
|
+
var withOffset = element.all(by.css('ng-pluralize')).get(1);
|
28783
|
+
var countInput = element(by.model('personCount'));
|
28784
|
+
|
28785
|
+
expect(withoutOffset.getText()).toEqual('1 person is viewing.');
|
28786
|
+
expect(withOffset.getText()).toEqual('Igor is viewing.');
|
28787
|
+
|
28788
|
+
countInput.clear();
|
28789
|
+
countInput.sendKeys('0');
|
28629
28790
|
|
28630
|
-
|
28631
|
-
|
28632
|
-
expect(element('.doc-example-live ng-pluralize:last').text()).
|
28633
|
-
toBe('Igor, Misko and 2 other people are viewing.');
|
28791
|
+
expect(withoutOffset.getText()).toEqual('Nobody is viewing.');
|
28792
|
+
expect(withOffset.getText()).toEqual('Nobody is viewing.');
|
28634
28793
|
|
28635
|
-
|
28636
|
-
|
28637
|
-
|
28638
|
-
|
28794
|
+
countInput.clear();
|
28795
|
+
countInput.sendKeys('2');
|
28796
|
+
|
28797
|
+
expect(withoutOffset.getText()).toEqual('2 people are viewing.');
|
28798
|
+
expect(withOffset.getText()).toEqual('Igor and Misko are viewing.');
|
28799
|
+
|
28800
|
+
countInput.clear();
|
28801
|
+
countInput.sendKeys('3');
|
28802
|
+
|
28803
|
+
expect(withoutOffset.getText()).toEqual('3 people are viewing.');
|
28804
|
+
expect(withOffset.getText()).toEqual('Igor, Misko and one other person are viewing.');
|
28805
|
+
|
28806
|
+
countInput.clear();
|
28807
|
+
countInput.sendKeys('4');
|
28808
|
+
|
28809
|
+
expect(withoutOffset.getText()).toEqual('4 people are viewing.');
|
28810
|
+
expect(withOffset.getText()).toEqual('Igor, Misko and 2 other people are viewing.');
|
28639
28811
|
});
|
28640
|
-
|
28812
|
+
it('should show data-bound names', function() {
|
28813
|
+
var withOffset = element.all(by.css('ng-pluralize')).get(1);
|
28814
|
+
var personCount = element(by.model('personCount'));
|
28815
|
+
var person1 = element(by.model('person1'));
|
28816
|
+
var person2 = element(by.model('person2'));
|
28817
|
+
personCount.clear();
|
28818
|
+
personCount.sendKeys('4');
|
28819
|
+
person1.clear();
|
28820
|
+
person1.sendKeys('Di');
|
28821
|
+
person2.clear();
|
28822
|
+
person2.sendKeys('Vojta');
|
28823
|
+
expect(withOffset.getText()).toEqual('Di, Vojta and 2 other people are viewing.');
|
28824
|
+
});
|
28825
|
+
</doc:protractor>
|
28641
28826
|
</doc:example>
|
28642
28827
|
*/
|
28643
28828
|
var ngPluralizeDirective = ['$locale', '$interpolate', function($locale, $interpolate) {
|
@@ -28856,25 +29041,27 @@ var ngPluralizeDirective = ['$locale', '$interpolate', function($locale, $interp
|
|
28856
29041
|
max-height:40px;
|
28857
29042
|
}
|
28858
29043
|
</file>
|
28859
|
-
<file name="
|
28860
|
-
|
28861
|
-
|
28862
|
-
|
28863
|
-
|
28864
|
-
|
28865
|
-
|
28866
|
-
|
28867
|
-
|
29044
|
+
<file name="protractorTest.js">
|
29045
|
+
var friends = element(by.css('.doc-example-live'))
|
29046
|
+
.element.all(by.repeater('friend in friends'));
|
29047
|
+
|
29048
|
+
it('should render initial data set', function() {
|
29049
|
+
expect(friends.count()).toBe(10);
|
29050
|
+
expect(friends.get(0).getText()).toEqual('[1] John who is 25 years old.');
|
29051
|
+
expect(friends.get(1).getText()).toEqual('[2] Jessie who is 30 years old.');
|
29052
|
+
expect(friends.last().getText()).toEqual('[10] Samantha who is 60 years old.');
|
29053
|
+
expect(element(by.binding('friends.length')).getText())
|
29054
|
+
.toMatch("I have 10 friends. They are:");
|
29055
|
+
});
|
28868
29056
|
|
28869
29057
|
it('should update repeater when filter predicate changes', function() {
|
28870
|
-
|
28871
|
-
expect(r.count()).toBe(10);
|
29058
|
+
expect(friends.count()).toBe(10);
|
28872
29059
|
|
28873
|
-
|
29060
|
+
element(by.css('.doc-example-live')).element(by.model('q')).sendKeys('ma');
|
28874
29061
|
|
28875
|
-
expect(
|
28876
|
-
expect(
|
28877
|
-
expect(
|
29062
|
+
expect(friends.count()).toBe(2);
|
29063
|
+
expect(friends.get(0).getText()).toEqual('[1] Mary who is 28 years old.');
|
29064
|
+
expect(friends.last().getText()).toEqual('[2] Samantha who is 60 years old.');
|
28878
29065
|
});
|
28879
29066
|
</file>
|
28880
29067
|
</example>
|
@@ -29208,16 +29395,19 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
|
|
29208
29395
|
background:white;
|
29209
29396
|
}
|
29210
29397
|
</file>
|
29211
|
-
<file name="
|
29212
|
-
|
29213
|
-
|
29214
|
-
expect(element('.doc-example-live span:last:visible').count()).toEqual(1);
|
29398
|
+
<file name="protractorTest.js">
|
29399
|
+
var thumbsUp = element(by.css('.doc-example-live span.icon-thumbs-up'));
|
29400
|
+
var thumbsDown = element(by.css('.doc-example-live span.icon-thumbs-down'));
|
29215
29401
|
|
29216
|
-
|
29402
|
+
it('should check ng-show / ng-hide', function() {
|
29403
|
+
expect(thumbsUp.isDisplayed()).toBeFalsy();
|
29404
|
+
expect(thumbsDown.isDisplayed()).toBeTruthy();
|
29217
29405
|
|
29218
|
-
|
29219
|
-
|
29220
|
-
|
29406
|
+
element(by.model('checked')).click();
|
29407
|
+
|
29408
|
+
expect(thumbsUp.isDisplayed()).toBeTruthy();
|
29409
|
+
expect(thumbsDown.isDisplayed()).toBeFalsy();
|
29410
|
+
});
|
29221
29411
|
</file>
|
29222
29412
|
</example>
|
29223
29413
|
*/
|
@@ -29362,16 +29552,19 @@ var ngShowDirective = ['$animate', function($animate) {
|
|
29362
29552
|
background:white;
|
29363
29553
|
}
|
29364
29554
|
</file>
|
29365
|
-
<file name="
|
29366
|
-
|
29367
|
-
|
29368
|
-
expect(element('.doc-example-live .check-element:last:visible').count()).toEqual(1);
|
29555
|
+
<file name="protractorTest.js">
|
29556
|
+
var thumbsUp = element(by.css('.doc-example-live span.icon-thumbs-up'));
|
29557
|
+
var thumbsDown = element(by.css('.doc-example-live span.icon-thumbs-down'));
|
29369
29558
|
|
29370
|
-
|
29559
|
+
it('should check ng-show / ng-hide', function() {
|
29560
|
+
expect(thumbsUp.isDisplayed()).toBeFalsy();
|
29561
|
+
expect(thumbsDown.isDisplayed()).toBeTruthy();
|
29371
29562
|
|
29372
|
-
|
29373
|
-
|
29374
|
-
|
29563
|
+
element(by.model('checked')).click();
|
29564
|
+
|
29565
|
+
expect(thumbsUp.isDisplayed()).toBeTruthy();
|
29566
|
+
expect(thumbsDown.isDisplayed()).toBeFalsy();
|
29567
|
+
});
|
29375
29568
|
</file>
|
29376
29569
|
</example>
|
29377
29570
|
*/
|
@@ -29410,13 +29603,15 @@ var ngHideDirective = ['$animate', function($animate) {
|
|
29410
29603
|
color: black;
|
29411
29604
|
}
|
29412
29605
|
</file>
|
29413
|
-
<file name="
|
29606
|
+
<file name="protractorTest.js">
|
29607
|
+
var colorSpan = element(by.css('.doc-example-live span'));
|
29608
|
+
|
29414
29609
|
it('should check ng-style', function() {
|
29415
|
-
expect(
|
29416
|
-
element('.doc-example-live
|
29417
|
-
expect(
|
29418
|
-
element('.doc-example-live
|
29419
|
-
expect(
|
29610
|
+
expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)');
|
29611
|
+
element(by.css('.doc-example-live input[value=set]')).click();
|
29612
|
+
expect(colorSpan.getCssValue('color')).toBe('rgba(255, 0, 0, 1)');
|
29613
|
+
element(by.css('.doc-example-live input[value=clear]')).click();
|
29614
|
+
expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)');
|
29420
29615
|
});
|
29421
29616
|
</file>
|
29422
29617
|
</example>
|
@@ -29441,7 +29636,7 @@ var ngStyleDirective = ngDirective(function(scope, element, attr) {
|
|
29441
29636
|
* as specified in the template.
|
29442
29637
|
*
|
29443
29638
|
* The directive itself works similar to ngInclude, however, instead of downloading template code (or loading it
|
29444
|
-
* from the template cache), `ngSwitch` simply
|
29639
|
+
* from the template cache), `ngSwitch` simply chooses one of the nested elements and makes it visible based on which element
|
29445
29640
|
* matches the value obtained from the evaluated expression. In other words, you define a container element
|
29446
29641
|
* (where you place the directive), place an expression on the **`on="..."` attribute**
|
29447
29642
|
* (or the **`ng-switch="..."` attribute**), define any inner elements inside of the directive and place
|
@@ -29537,17 +29732,20 @@ var ngStyleDirective = ngDirective(function(scope, element, attr) {
|
|
29537
29732
|
top:0;
|
29538
29733
|
}
|
29539
29734
|
</file>
|
29540
|
-
<file name="
|
29735
|
+
<file name="protractorTest.js">
|
29736
|
+
var switchElem = element(by.css('.doc-example-live [ng-switch]'));
|
29737
|
+
var select = element(by.model('selection'));
|
29738
|
+
|
29541
29739
|
it('should start in settings', function() {
|
29542
|
-
expect(
|
29740
|
+
expect(switchElem.getText()).toMatch(/Settings Div/);
|
29543
29741
|
});
|
29544
29742
|
it('should change to home', function() {
|
29545
|
-
select('
|
29546
|
-
expect(
|
29743
|
+
select.element.all(by.css('option')).get(1).click();
|
29744
|
+
expect(switchElem.getText()).toMatch(/Home Span/);
|
29547
29745
|
});
|
29548
29746
|
it('should select default', function() {
|
29549
|
-
select('
|
29550
|
-
expect(
|
29747
|
+
select.element.all(by.css('option')).get(2).click();
|
29748
|
+
expect(switchElem.getText()).toMatch(/default/);
|
29551
29749
|
});
|
29552
29750
|
</file>
|
29553
29751
|
</example>
|
@@ -29654,14 +29852,18 @@ var ngSwitchDefaultDirective = ngDirective({
|
|
29654
29852
|
<pane title="{{title}}">{{text}}</pane>
|
29655
29853
|
</div>
|
29656
29854
|
</doc:source>
|
29657
|
-
<doc:
|
29855
|
+
<doc:protractor>
|
29658
29856
|
it('should have transcluded', function() {
|
29659
|
-
|
29660
|
-
|
29661
|
-
|
29662
|
-
|
29857
|
+
var titleElement = element(by.model('title'));
|
29858
|
+
titleElement.clear();
|
29859
|
+
titleElement.sendKeys('TITLE');
|
29860
|
+
var textElement = element(by.model('text'));
|
29861
|
+
textElement.clear();
|
29862
|
+
textElement.sendKeys('TEXT');
|
29863
|
+
expect(element(by.binding('title')).getText()).toEqual('TITLE');
|
29864
|
+
expect(element(by.binding('text')).getText()).toEqual('TEXT');
|
29663
29865
|
});
|
29664
|
-
</doc:
|
29866
|
+
</doc:protractor>
|
29665
29867
|
</doc:example>
|
29666
29868
|
*
|
29667
29869
|
*/
|
@@ -29714,12 +29916,12 @@ var ngTranscludeDirective = ngDirective({
|
|
29714
29916
|
<a ng-click="currentTpl='/tpl.html'" id="tpl-link">Load inlined template</a>
|
29715
29917
|
<div id="tpl-content" ng-include src="currentTpl"></div>
|
29716
29918
|
</doc:source>
|
29717
|
-
<doc:
|
29919
|
+
<doc:protractor>
|
29718
29920
|
it('should load template defined inside script tag', function() {
|
29719
|
-
element('#tpl-link').click();
|
29720
|
-
expect(element('#tpl-content').
|
29921
|
+
element(by.css('#tpl-link')).click();
|
29922
|
+
expect(element(by.css('#tpl-content')).getText()).toMatch(/Content of the template/);
|
29721
29923
|
});
|
29722
|
-
</doc:
|
29924
|
+
</doc:protractor>
|
29723
29925
|
</doc:example>
|
29724
29926
|
*/
|
29725
29927
|
var scriptDirective = ['$templateCache', function($templateCache) {
|
@@ -29767,7 +29969,7 @@ var ngOptionsMinErr = minErr('ngOptions');
|
|
29767
29969
|
* option. See example below for demonstration.
|
29768
29970
|
*
|
29769
29971
|
* <div class="alert alert-warning">
|
29770
|
-
* **Note:** `ngOptions` provides iterator facility for `<option>` element which should be used instead
|
29972
|
+
* **Note:** `ngOptions` provides an iterator facility for the `<option>` element which should be used instead
|
29771
29973
|
* of {@link ng.directive:ngRepeat ngRepeat} when you want the
|
29772
29974
|
* `select` model to be bound to a non-string value. This is because an option element can only
|
29773
29975
|
* be bound to string values at present.
|
@@ -29858,15 +30060,17 @@ var ngOptionsMinErr = minErr('ngOptions');
|
|
29858
30060
|
</div>
|
29859
30061
|
</div>
|
29860
30062
|
</doc:source>
|
29861
|
-
<doc:
|
30063
|
+
<doc:protractor>
|
29862
30064
|
it('should check ng-options', function() {
|
29863
|
-
expect(binding('{selected_color:color}')).toMatch('red');
|
29864
|
-
select('color').
|
29865
|
-
|
29866
|
-
|
29867
|
-
|
30065
|
+
expect(element(by.binding('{selected_color:color}')).getText()).toMatch('red');
|
30066
|
+
element.all(by.select('color')).first().click();
|
30067
|
+
element.all(by.css('select[ng-model="color"] option')).first().click();
|
30068
|
+
expect(element(by.binding('{selected_color:color}')).getText()).toMatch('black');
|
30069
|
+
element(by.css('.nullable select[ng-model="color"]')).click();
|
30070
|
+
element.all(by.css('.nullable select[ng-model="color"] option')).first().click();
|
30071
|
+
expect(element(by.binding('{selected_color:color}')).getText()).toMatch('null');
|
29868
30072
|
});
|
29869
|
-
</doc:
|
30073
|
+
</doc:protractor>
|
29870
30074
|
</doc:example>
|
29871
30075
|
*/
|
29872
30076
|
|