| 
									
										
										
										
											2015-05-27 10:22:30 +02:00
										 |  |  | import { | 
					
						
							|  |  |  |   describe, | 
					
						
							|  |  |  |   beforeEach, | 
					
						
							|  |  |  |   it, | 
					
						
							|  |  |  |   expect, | 
					
						
							|  |  |  |   ddescribe, | 
					
						
							|  |  |  |   iit, | 
					
						
							|  |  |  |   SpyObject, | 
					
						
							|  |  |  |   el, | 
					
						
							|  |  |  |   normalizeCSS | 
					
						
							|  |  |  | } from 'angular2/test_lib'; | 
					
						
							| 
									
										
										
										
											2015-07-24 15:28:44 -07:00
										 |  |  | import {ShadowCss} from 'angular2/src/render/dom/compiler/shadow_css'; | 
					
						
							| 
									
										
										
										
											2015-03-23 14:10:55 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-02 14:59:35 +02:00
										 |  |  | import {RegExpWrapper, StringWrapper, isPresent} from 'angular2/src/facade/lang'; | 
					
						
							| 
									
										
										
										
											2015-05-27 10:22:30 +02:00
										 |  |  | import {DOM} from 'angular2/src/dom/dom_adapter'; | 
					
						
							| 
									
										
										
										
											2015-03-23 14:10:55 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | export function main() { | 
					
						
							|  |  |  |   describe('ShadowCss', function() { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-26 09:25:39 -07:00
										 |  |  |     function s(css: string, contentAttr: string, hostAttr: string = '') { | 
					
						
							| 
									
										
										
										
											2015-03-23 14:10:55 -07:00
										 |  |  |       var shadowCss = new ShadowCss(); | 
					
						
							|  |  |  |       var shim = shadowCss.shimCssText(css, contentAttr, hostAttr); | 
					
						
							| 
									
										
										
										
											2015-06-23 12:46:38 +02:00
										 |  |  |       var nlRegexp = /\n/g; | 
					
						
							| 
									
										
										
										
											2015-05-27 10:22:30 +02:00
										 |  |  |       return normalizeCSS(StringWrapper.replaceAll(shim, nlRegexp, '')); | 
					
						
							| 
									
										
										
										
											2015-03-23 14:10:55 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-26 09:25:39 -07:00
										 |  |  |     it('should handle empty string', () => { expect(s('', 'a')).toEqual(''); }); | 
					
						
							| 
									
										
										
										
											2015-03-23 14:10:55 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     it('should add an attribute to every rule', () => { | 
					
						
							|  |  |  |       var css = 'one {color: red;}two {color: red;}'; | 
					
						
							| 
									
										
										
										
											2015-05-27 10:22:30 +02:00
										 |  |  |       var expected = 'one[a] {color:red;}two[a] {color:red;}'; | 
					
						
							| 
									
										
										
										
											2015-03-23 14:10:55 -07:00
										 |  |  |       expect(s(css, 'a')).toEqual(expected); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should hanlde invalid css', () => { | 
					
						
							|  |  |  |       var css = 'one {color: red;}garbage'; | 
					
						
							| 
									
										
										
										
											2015-05-27 10:22:30 +02:00
										 |  |  |       var expected = 'one[a] {color:red;}'; | 
					
						
							| 
									
										
										
										
											2015-03-23 14:10:55 -07:00
										 |  |  |       expect(s(css, 'a')).toEqual(expected); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should add an attribute to every selector', () => { | 
					
						
							|  |  |  |       var css = 'one, two {color: red;}'; | 
					
						
							| 
									
										
										
										
											2015-05-27 10:22:30 +02:00
										 |  |  |       var expected = 'one[a], two[a] {color:red;}'; | 
					
						
							| 
									
										
										
										
											2015-03-23 14:10:55 -07:00
										 |  |  |       expect(s(css, 'a')).toEqual(expected); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should handle media rules', () => { | 
					
						
							| 
									
										
										
										
											2015-05-27 10:22:30 +02:00
										 |  |  |       var css = '@media screen and (max-width:800px) {div {font-size:50px;}}'; | 
					
						
							|  |  |  |       var expected = '@media screen and (max-width:800px) {div[a] {font-size:50px;}}'; | 
					
						
							| 
									
										
										
										
											2015-03-23 14:10:55 -07:00
										 |  |  |       expect(s(css, 'a')).toEqual(expected); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should handle media rules with simple rules', () => { | 
					
						
							|  |  |  |       var css = '@media screen and (max-width: 800px) {div {font-size: 50px;}} div {}'; | 
					
						
							| 
									
										
										
										
											2015-05-27 10:22:30 +02:00
										 |  |  |       var expected = '@media screen and (max-width:800px) {div[a] {font-size:50px;}}div[a] {}'; | 
					
						
							| 
									
										
										
										
											2015-03-23 14:10:55 -07:00
										 |  |  |       expect(s(css, 'a')).toEqual(expected); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-02 14:59:35 +02:00
										 |  |  |     // Check that the browser supports unprefixed CSS animation
 | 
					
						
							|  |  |  |     if (isPresent(DOM.defaultDoc().body.style) && | 
					
						
							|  |  |  |         isPresent(DOM.defaultDoc().body.style.animationName)) { | 
					
						
							|  |  |  |       it('should handle keyframes rules', () => { | 
					
						
							|  |  |  |         var css = '@keyframes foo {0% {transform: translate(-50%) scaleX(0);}}'; | 
					
						
							| 
									
										
										
										
											2015-06-23 12:46:38 +02:00
										 |  |  |         var passRe = /@keyframes foo {\s*0% {\s*transform:translate\(-50%\) scaleX\(0\);\s*}\s*}/g; | 
					
						
							| 
									
										
										
										
											2015-06-02 14:59:35 +02:00
										 |  |  |         expect(RegExpWrapper.test(passRe, s(css, 'a'))).toEqual(true); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-05-26 12:30:06 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-16 01:30:18 +02:00
										 |  |  |     if (DOM.getUserAgent().indexOf('AppleWebKit') > -1 && | 
					
						
							|  |  |  |         DOM.getUserAgent().indexOf('Edge') == -1) { | 
					
						
							| 
									
										
										
										
											2015-05-27 10:22:30 +02:00
										 |  |  |       it('should handle -webkit-keyframes rules', () => { | 
					
						
							| 
									
										
										
										
											2015-06-02 14:59:35 +02:00
										 |  |  |         var css = '@-webkit-keyframes foo {0% {-webkit-transform: translate(-50%) scaleX(0);}}'; | 
					
						
							| 
									
										
										
										
											2015-06-23 12:46:38 +02:00
										 |  |  |         var passRe = | 
					
						
							|  |  |  |             /@-webkit-keyframes foo {\s*0% {\s*(-webkit-)*transform:translate\(-50%\) scaleX\(0\);\s*}}/g; | 
					
						
							| 
									
										
										
										
											2015-05-27 10:22:30 +02:00
										 |  |  |         expect(RegExpWrapper.test(passRe, s(css, 'a'))).toEqual(true); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-05-26 12:30:06 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-23 14:10:55 -07:00
										 |  |  |     it('should handle complicated selectors', () => { | 
					
						
							|  |  |  |       expect(s('one::before {}', 'a')).toEqual('one[a]::before {}'); | 
					
						
							|  |  |  |       expect(s('one two {}', 'a')).toEqual('one[a] two[a] {}'); | 
					
						
							|  |  |  |       expect(s('one>two {}', 'a')).toEqual('one[a] > two[a] {}'); | 
					
						
							|  |  |  |       expect(s('one+two {}', 'a')).toEqual('one[a] + two[a] {}'); | 
					
						
							|  |  |  |       expect(s('one~two {}', 'a')).toEqual('one[a] ~ two[a] {}'); | 
					
						
							| 
									
										
										
										
											2015-05-27 10:22:30 +02:00
										 |  |  |       var res = s('.one.two > three {}', 'a');  // IE swap classes
 | 
					
						
							|  |  |  |       expect(res == '.one.two[a] > three[a] {}' || res == '.two.one[a] > three[a] {}') | 
					
						
							|  |  |  |           .toEqual(true); | 
					
						
							| 
									
										
										
										
											2015-03-23 14:10:55 -07:00
										 |  |  |       expect(s('one[attr="value"] {}', 'a')).toEqual('one[attr="value"][a] {}'); | 
					
						
							|  |  |  |       expect(s('one[attr=value] {}', 'a')).toEqual('one[attr="value"][a] {}'); | 
					
						
							|  |  |  |       expect(s('one[attr^="value"] {}', 'a')).toEqual('one[attr^="value"][a] {}'); | 
					
						
							|  |  |  |       expect(s('one[attr$="value"] {}', 'a')).toEqual('one[attr$="value"][a] {}'); | 
					
						
							|  |  |  |       expect(s('one[attr*="value"] {}', 'a')).toEqual('one[attr*="value"][a] {}'); | 
					
						
							|  |  |  |       expect(s('one[attr|="value"] {}', 'a')).toEqual('one[attr|="value"][a] {}'); | 
					
						
							|  |  |  |       expect(s('one[attr] {}', 'a')).toEqual('one[attr][a] {}'); | 
					
						
							|  |  |  |       expect(s('[is="one"] {}', 'a')).toEqual('[is="one"][a] {}'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should handle :host', () => { | 
					
						
							|  |  |  |       expect(s(':host {}', 'a', 'a-host')).toEqual('[a-host] {}'); | 
					
						
							|  |  |  |       expect(s(':host(.x,.y) {}', 'a', 'a-host')).toEqual('[a-host].x, [a-host].y {}'); | 
					
						
							| 
									
										
										
										
											2015-05-26 09:25:39 -07:00
										 |  |  |       expect(s(':host(.x,.y) > .z {}', 'a', 'a-host')) | 
					
						
							|  |  |  |           .toEqual('[a-host].x > .z, [a-host].y > .z {}'); | 
					
						
							| 
									
										
										
										
											2015-03-23 14:10:55 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should handle :host-context', () => { | 
					
						
							|  |  |  |       expect(s(':host-context(.x) {}', 'a', 'a-host')).toEqual('[a-host].x, .x [a-host] {}'); | 
					
						
							| 
									
										
										
										
											2015-05-26 09:25:39 -07:00
										 |  |  |       expect(s(':host-context(.x) > .y {}', 'a', 'a-host')) | 
					
						
							|  |  |  |           .toEqual('[a-host].x > .y, .x [a-host] > .y {}'); | 
					
						
							| 
									
										
										
										
											2015-03-23 14:10:55 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should support polyfill-next-selector', () => { | 
					
						
							|  |  |  |       var css = s("polyfill-next-selector {content: 'x > y'} z {}", 'a'); | 
					
						
							|  |  |  |       expect(css).toEqual('x[a] > y[a] {}'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       css = s('polyfill-next-selector {content: "x > y"} z {}', 'a'); | 
					
						
							|  |  |  |       expect(css).toEqual('x[a] > y[a] {}'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should support polyfill-unscoped-rule', () => { | 
					
						
							| 
									
										
										
										
											2015-05-21 17:12:10 +02:00
										 |  |  |       var css = s("polyfill-unscoped-rule {content: '#menu > .bar';color: blue;}", 'a'); | 
					
						
							| 
									
										
										
										
											2015-05-27 10:22:30 +02:00
										 |  |  |       expect(StringWrapper.contains(css, '#menu > .bar {;color:blue;}')).toBeTruthy(); | 
					
						
							| 
									
										
										
										
											2015-03-23 14:10:55 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-21 17:12:10 +02:00
										 |  |  |       css = s('polyfill-unscoped-rule {content: "#menu > .bar";color: blue;}', 'a'); | 
					
						
							| 
									
										
										
										
											2015-05-27 10:22:30 +02:00
										 |  |  |       expect(StringWrapper.contains(css, '#menu > .bar {;color:blue;}')).toBeTruthy(); | 
					
						
							| 
									
										
										
										
											2015-03-23 14:10:55 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-10 10:38:24 -07:00
										 |  |  |     it('should support multiple instances polyfill-unscoped-rule', () => { | 
					
						
							|  |  |  |       var css = s("polyfill-unscoped-rule {content: 'foo';color: blue;}" + | 
					
						
							|  |  |  |                       "polyfill-unscoped-rule {content: 'bar';color: blue;}", | 
					
						
							|  |  |  |                   'a'); | 
					
						
							|  |  |  |       expect(StringWrapper.contains(css, 'foo {;color:blue;}')).toBeTruthy(); | 
					
						
							|  |  |  |       expect(StringWrapper.contains(css, 'bar {;color:blue;}')).toBeTruthy(); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-23 14:10:55 -07:00
										 |  |  |     it('should support polyfill-rule', () => { | 
					
						
							| 
									
										
										
										
											2015-05-21 17:12:10 +02:00
										 |  |  |       var css = s("polyfill-rule {content: ':host.foo .bar';color: blue;}", 'a', 'a-host'); | 
					
						
							| 
									
										
										
										
											2015-05-27 10:22:30 +02:00
										 |  |  |       expect(css).toEqual('[a-host].foo .bar {color:blue;}'); | 
					
						
							| 
									
										
										
										
											2015-03-23 14:10:55 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-27 10:22:30 +02:00
										 |  |  |       css = s('polyfill-rule {content: ":host.foo .bar";color:blue;}', 'a', 'a-host'); | 
					
						
							|  |  |  |       expect(css).toEqual('[a-host].foo .bar {color:blue;}'); | 
					
						
							| 
									
										
										
										
											2015-03-23 14:10:55 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should handle ::shadow', () => { | 
					
						
							|  |  |  |       var css = s('x::shadow > y {}', 'a'); | 
					
						
							|  |  |  |       expect(css).toEqual('x[a] > y[a] {}'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should handle /deep/', () => { | 
					
						
							|  |  |  |       var css = s('x /deep/ y {}', 'a'); | 
					
						
							|  |  |  |       expect(css).toEqual('x[a] y[a] {}'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should handle >>>', () => { | 
					
						
							|  |  |  |       var css = s('x >>> y {}', 'a'); | 
					
						
							|  |  |  |       expect(css).toEqual('x[a] y[a] {}'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | } |