@@ -4,9 +4,15 @@ suite('apply-preserving-inline-style', function() {
4
4
ensureStyleIsPatched ( this . element ) ;
5
5
this . style = this . element . style ;
6
6
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 ;
7
11
} ) ;
8
12
teardown ( function ( ) {
9
13
document . documentElement . removeChild ( this . element ) ;
14
+ document . documentElement . removeChild ( this . svgContainer ) ;
15
+ delete window . _webAnimationsUpdateSvgTransformAttr ;
10
16
} ) ;
11
17
12
18
test ( 'Style is patched' , function ( ) {
@@ -69,4 +75,119 @@ suite('apply-preserving-inline-style', function() {
69
75
this . style . cssText = 'top: 0px' ;
70
76
assert . equal ( this . style . length , 1 ) ;
71
77
} ) ;
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
+ } ) ;
72
193
} ) ;
0 commit comments