@@ -4,9 +4,15 @@ suite('apply-preserving-inline-style', function() {
44 ensureStyleIsPatched ( this . element ) ;
55 this . style = this . element . style ;
66 document . documentElement . appendChild ( this . element ) ;
7+ this . svgContainer = document . createElementNS (
8+ 'http://www.w3.org/2000/svg' , 'svg' ) ;
9+ document . documentElement . appendChild ( this . svgContainer ) ;
10+ delete window . _webAnimationsUpdateSvgTransformAttr ;
711 } ) ;
812 teardown ( function ( ) {
913 document . documentElement . removeChild ( this . element ) ;
14+ document . documentElement . removeChild ( this . svgContainer ) ;
15+ delete window . _webAnimationsUpdateSvgTransformAttr ;
1016 } ) ;
1117
1218 test ( 'Style is patched' , function ( ) {
@@ -69,4 +75,119 @@ suite('apply-preserving-inline-style', function() {
6975 this . style . cssText = 'top: 0px' ;
7076 assert . equal ( this . style . length , 1 ) ;
7177 } ) ;
78+ test ( 'Detect SVG transform compatibility' , function ( ) {
79+ var element = document . createElement ( 'div' ) ;
80+ var svgElement = document . createElementNS ( 'http://www.w3.org/2000/svg' , 'rect' ) ;
81+ function check ( userAgent , shouldUpdateSvgTransformAttr ) {
82+ var win = { navigator : { userAgent : userAgent } } ;
83+ // Non-SVG element is never updated.
84+ assert . equal ( updateSvgTransformAttr ( win , element ) , false ) ;
85+ // SVG element may be updated as tested.
86+ assert . equal ( updateSvgTransformAttr ( win , svgElement ) ,
87+ shouldUpdateSvgTransformAttr ) ;
88+ }
89+ // Unknown data: assume that transforms supported.
90+ check ( '' , false ) ;
91+ // Chrome: transforms supported.
92+ check ( 'Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E)' +
93+ ' AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.20' +
94+ ' Mobile Safari/537.36' ,
95+ false ) ;
96+ // Safari: transforms supported.
97+ check ( 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) ' +
98+ 'AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 ' +
99+ 'Safari/7046A194A' ,
100+ false ) ;
101+ // Firefox: transforms supported.
102+ check ( 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) ' +
103+ 'Gecko/20100101 Firefox/40.1' ,
104+ false ) ;
105+ // IE: transforms are NOT supported.
106+ check ( 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 7.0;' +
107+ ' InfoPath.3; .NET CLR 3.1.40767; Trident/6.0; en-IN)' ,
108+ true ) ;
109+ // Edge: transforms are NOT supported.
110+ check ( 'Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36' +
111+ ' (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36' +
112+ ' Edge/12.10136' ,
113+ true ) ;
114+ // ICS Android: transforms are NOT supported.
115+ check ( 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; MZ604 Build/I.7.1-45)' +
116+ ' AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' ,
117+ true ) ;
118+ } ) ;
119+ test ( 'Set and clear transform' , function ( ) {
120+ // This is not an SVG element, so CSS transform support is not consulted.
121+ window . _webAnimationsUpdateSvgTransformAttr = true ;
122+ // Set.
123+ this . element . style . _set ( 'transform' , 'translate(10px, 10px) scale(2)' ) ;
124+ assert . equal ( getComputedStyle ( this . element ) . transform ,
125+ 'matrix(2, 0, 0, 2, 10, 10)' ) ;
126+ assert . equal ( this . element . hasAttribute ( 'transform' ) , false ) ;
127+ // Clear.
128+ this . element . style . _clear ( 'transform' ) ;
129+ assert . equal ( getComputedStyle ( this . element ) . transform , 'none' ) ;
130+ assert . equal ( this . element . hasAttribute ( 'transform' ) , false ) ;
131+ } ) ;
132+ test ( 'Set and clear supported transform on SVG element' , function ( ) {
133+ window . _webAnimationsUpdateSvgTransformAttr = false ;
134+ var svgElement = document . createElementNS ( 'http://www.w3.org/2000/svg' , 'rect' ) ;
135+ ensureStyleIsPatched ( svgElement ) ;
136+ this . svgContainer . appendChild ( svgElement ) ;
137+ // Set.
138+ svgElement . style . _set ( 'transform' , 'translate(10px, 10px) scale(2)' ) ;
139+ assert . equal ( getComputedStyle ( svgElement ) . transform ,
140+ 'matrix(2, 0, 0, 2, 10, 10)' ) ;
141+ assert . equal ( svgElement . hasAttribute ( 'transform' ) , false ) ;
142+ // Clear.
143+ svgElement . style . _clear ( 'transform' ) ;
144+ assert . equal ( getComputedStyle ( svgElement ) . transform , 'none' ) ;
145+ assert . equal ( svgElement . hasAttribute ( 'transform' ) , false ) ;
146+ } ) ;
147+ test ( 'Set and clear transform CSS property not supported on SVG element' , function ( ) {
148+ window . _webAnimationsUpdateSvgTransformAttr = true ;
149+ var svgElement = document . createElementNS ( 'http://www.w3.org/2000/svg' , 'rect' ) ;
150+ ensureStyleIsPatched ( svgElement ) ;
151+ this . svgContainer . appendChild ( svgElement ) ;
152+ // Set.
153+ svgElement . style . _set ( 'transform' , 'translate(10px, 10px) scale(2)' ) ;
154+ assert . equal ( getComputedStyle ( svgElement ) . transform ,
155+ 'matrix(2, 0, 0, 2, 10, 10)' ) ;
156+ assert . equal ( svgElement . getAttribute ( 'transform' ) ,
157+ 'matrix(2 0 0 2 10 10)' ) ;
158+ // Clear.
159+ svgElement . style . _clear ( 'transform' ) ;
160+ assert . equal ( getComputedStyle ( svgElement ) . transform , 'none' ) ;
161+ assert . equal ( svgElement . getAttribute ( 'transform' ) , null ) ;
162+ } ) ;
163+ test ( 'Set and clear prefixed transform CSS property not supported on SVG element' , function ( ) {
164+ window . _webAnimationsUpdateSvgTransformAttr = true ;
165+ var svgElement = document . createElementNS ( 'http://www.w3.org/2000/svg' , 'rect' ) ;
166+ ensureStyleIsPatched ( svgElement ) ;
167+ this . svgContainer . appendChild ( svgElement ) ;
168+ // Set.
169+ svgElement . style . _set ( 'msTransform' , 'translate(10px, 10px) scale(2)' ) ;
170+ assert . equal ( svgElement . getAttribute ( 'transform' ) ,
171+ 'matrix(2 0 0 2 10 10)' ) ;
172+ // Clear.
173+ svgElement . style . _clear ( 'msTransform' ) ;
174+ assert . equal ( svgElement . getAttribute ( 'transform' ) , null ) ;
175+ } ) ;
176+ test ( 'Restore transform CSS property not supported on SVG element' , function ( ) {
177+ window . _webAnimationsUpdateSvgTransformAttr = true ;
178+ var svgElement = document . createElementNS ( 'http://www.w3.org/2000/svg' , 'rect' ) ;
179+ svgElement . setAttribute ( 'transform' , 'matrix(2 0 0 2 0 0)' ) ;
180+ ensureStyleIsPatched ( svgElement ) ;
181+ this . svgContainer . appendChild ( svgElement ) ;
182+ // Set.
183+ svgElement . style . _set ( 'transform' , 'translate(10px, 10px) scale(2)' ) ;
184+ assert . equal ( getComputedStyle ( svgElement ) . transform ,
185+ 'matrix(2, 0, 0, 2, 10, 10)' ) ;
186+ assert . equal ( svgElement . getAttribute ( 'transform' ) ,
187+ 'matrix(2 0 0 2 10 10)' ) ;
188+ // Clear.
189+ svgElement . style . _clear ( 'transform' ) ;
190+ assert . equal ( getComputedStyle ( svgElement ) . transform , 'none' ) ;
191+ assert . equal ( svgElement . getAttribute ( 'transform' ) , 'matrix(2 0 0 2 0 0)' ) ;
192+ } ) ;
72193} ) ;
0 commit comments