OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 /* | 5 /* |
6 Exported function: | 6 Exported function: |
7 assertResponsive | 7 assertResponsive |
8 | 8 |
9 Call signature: | 9 Call signature: |
10 assertResponsive({ | 10 assertResponsive({ |
11 property: <CSS Property>, | 11 property: <CSS Property>, |
12 from: ?<CSS Value>, | 12 ?from: <CSS Value>, |
13 to: ?<CSS Value>, | 13 ?to: <CSS Value>, |
14 configurations: [{ | 14 configurations: [{ |
15 state: { | 15 state: { |
16 ?underlying: <CSS Value>, | 16 ?underlying: <CSS Value>, |
17 ?inherited: <CSS Value>, | 17 ?inherited: <CSS Value>, |
18 }, | 18 }, |
19 expect: [ | 19 expect: [ |
20 { at: <Float>, is: <CSS Value> } | 20 { at: <Float>, is: <CSS Value> } |
21 ], | 21 ], |
22 }], | 22 }], |
23 }) | 23 }) |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
83 console.assert(targets.every(function(target) { return target.parentElement
=== parent; })); | 83 console.assert(targets.every(function(target) { return target.parentElement
=== parent; })); |
84 parent.style[property] = state.inherited; | 84 parent.style[property] = state.inherited; |
85 } | 85 } |
86 if (state.underlying) { | 86 if (state.underlying) { |
87 for (var target of targets) { | 87 for (var target of targets) { |
88 target.style[property] = state.underlying; | 88 target.style[property] = state.underlying; |
89 } | 89 } |
90 } | 90 } |
91 } | 91 } |
92 | 92 |
93 function createKeyframes(property, from, to) { | 93 function keyframeText(options, keyframeName) { |
94 return [ | 94 return (keyframeName in options) ? `[${options[keyframeName]}]` : 'neutral'; |
95 {[property]: from}, | 95 } |
96 {[property]: to}, | 96 |
97 ]; | 97 function createKeyframes(options) { |
| 98 var keyframes = []; |
| 99 if ('from' in options) { |
| 100 keyframes.push({ |
| 101 offset: 0, |
| 102 [options.property]: options.from, |
| 103 }); |
| 104 } |
| 105 if ('to' in options) { |
| 106 keyframes.push({ |
| 107 offset: 1, |
| 108 [options.property]: options.to, |
| 109 }); |
| 110 } |
| 111 return keyframes; |
98 } | 112 } |
99 | 113 |
100 function startPausedAnimations(targets, keyframes, fractions) { | 114 function startPausedAnimations(targets, keyframes, fractions) { |
101 console.assert(targets.length == fractions.length); | 115 console.assert(targets.length == fractions.length); |
102 for (var i = 0; i < targets.length; i++) { | 116 for (var i = 0; i < targets.length; i++) { |
103 var target = targets[i]; | 117 var target = targets[i]; |
104 var fraction = fractions[i]; | 118 var fraction = fractions[i]; |
105 console.assert(fraction >= 0 && fraction < 1); | 119 console.assert(fraction >= 0 && fraction < 1); |
106 var animation = target.animate(keyframes, 1); | 120 var animation = target.animate(keyframes, 1); |
107 animation.currentTime = fraction; | 121 animation.currentTime = fraction; |
108 animation.pause(); | 122 animation.pause(); |
109 } | 123 } |
110 } | 124 } |
111 | 125 |
112 function runPendingResponsiveTests() { | 126 function runPendingResponsiveTests() { |
113 var stateTransitionTests = []; | 127 var stateTransitionTests = []; |
114 pendingResponsiveTests.forEach(function(options) { | 128 pendingResponsiveTests.forEach(function(options) { |
115 var property = options.property; | 129 var property = options.property; |
116 var from = options.from; | 130 var from = options.from; |
117 var to = options.to; | 131 var to = options.to; |
118 var keyframes = createKeyframes(property, from, to); | 132 var keyframes = createKeyframes(options); |
| 133 var fromText = keyframeText(options, 'from'); |
| 134 var toText = keyframeText(options, 'to'); |
119 | 135 |
120 var stateTransitions = createStateTransitions(options.configurations); | 136 var stateTransitions = createStateTransitions(options.configurations); |
121 stateTransitions.forEach(function(stateTransition) { | 137 stateTransitions.forEach(function(stateTransition) { |
122 var before = stateTransition.before; | 138 var before = stateTransition.before; |
123 var after = stateTransition.after; | 139 var after = stateTransition.after; |
124 var container = createElement('div', document.body); | 140 var container = createElement('div', document.body); |
125 var targets = createTargets(after.expect.length, container); | 141 var targets = createTargets(after.expect.length, container); |
126 | 142 |
127 setState(targets, property, before.state); | 143 setState(targets, property, before.state); |
128 startPausedAnimations(targets, keyframes, after.expect.map(function(expect
ation) { return expectation.at; })); | 144 startPausedAnimations(targets, keyframes, after.expect.map(function(expect
ation) { return expectation.at; })); |
129 stateTransitionTests.push({ | 145 stateTransitionTests.push({ |
130 applyStateTransition() { | 146 applyStateTransition() { |
131 setState(targets, property, after.state); | 147 setState(targets, property, after.state); |
132 }, | 148 }, |
133 assert() { | 149 assert() { |
134 for (var i = 0; i < targets.length; i++) { | 150 for (var i = 0; i < targets.length; i++) { |
135 var target = targets[i]; | 151 var target = targets[i]; |
136 var expectation = after.expect[i]; | 152 var expectation = after.expect[i]; |
137 var actual = getComputedStyle(target)[property]; | 153 var actual = getComputedStyle(target)[property]; |
138 test(function() { | 154 test(function() { |
139 assert_equals(actual, expectation.is); | 155 assert_equals(actual, expectation.is); |
140 }, `Animation on property <${property}> from [${from}] to [${to}] wi
th ${JSON.stringify(before.state)} changed to ${JSON.stringify(after.state)} at
(${expectation.at}) is [${expectation.is}]`); | 156 }, `Animation on property <${property}> from ${fromText} to ${toText
} with ${JSON.stringify(before.state)} changed to ${JSON.stringify(after.state)}
at (${expectation.at}) is [${expectation.is}]`); |
141 } | 157 } |
142 }, | 158 }, |
143 }); | 159 }); |
144 }); | 160 }); |
145 }); | 161 }); |
146 | 162 |
147 // Separate style modification from measurement as different phases to avoid a
style recalc storm. | 163 // Separate style modification from measurement as different phases to avoid a
style recalc storm. |
148 for (var stateTransitionTest of stateTransitionTests) { | 164 for (var stateTransitionTest of stateTransitionTests) { |
149 stateTransitionTest.applyStateTransition(); | 165 stateTransitionTest.applyStateTransition(); |
150 } | 166 } |
(...skipping 18 matching lines...) Expand all Loading... |
169 requestAnimationFrame(function() { | 185 requestAnimationFrame(function() { |
170 runPendingResponsiveTests(); | 186 runPendingResponsiveTests(); |
171 asyncHandle.done() | 187 asyncHandle.done() |
172 }); | 188 }); |
173 }); | 189 }); |
174 | 190 |
175 | 191 |
176 window.assertResponsive = assertResponsive; | 192 window.assertResponsive = assertResponsive; |
177 | 193 |
178 })(); | 194 })(); |
OLD | NEW |