(effectInput)
| 218 | }; |
| 219 | |
| 220 | function normalizeKeyframes(effectInput) { |
| 221 | if (effectInput == null) { |
| 222 | return []; |
| 223 | } |
| 224 | |
| 225 | if (window.Symbol && Symbol.iterator && Array.prototype.from && effectInput[Symbol.iterator]) { |
| 226 | // Handle custom iterables in most browsers by converting to an array |
| 227 | effectInput = Array.from(effectInput); |
| 228 | } |
| 229 | |
| 230 | if (!Array.isArray(effectInput)) { |
| 231 | effectInput = convertToArrayForm(effectInput); |
| 232 | } |
| 233 | |
| 234 | var keyframes = effectInput.map(function(originalKeyframe) { |
| 235 | var keyframe = {}; |
| 236 | for (var member in originalKeyframe) { |
| 237 | var memberValue = originalKeyframe[member]; |
| 238 | if (member == 'offset') { |
| 239 | if (memberValue != null) { |
| 240 | memberValue = Number(memberValue); |
| 241 | if (!isFinite(memberValue)) |
| 242 | throw new TypeError('Keyframe offsets must be numbers.'); |
| 243 | if (memberValue < 0 || memberValue > 1) |
| 244 | throw new TypeError('Keyframe offsets must be between 0 and 1.'); |
| 245 | } |
| 246 | } else if (member == 'composite') { |
| 247 | if (memberValue == 'add' || memberValue == 'accumulate') { |
| 248 | throw { |
| 249 | type: DOMException.NOT_SUPPORTED_ERR, |
| 250 | name: 'NotSupportedError', |
| 251 | message: 'add compositing is not supported' |
| 252 | }; |
| 253 | } else if (memberValue != 'replace') { |
| 254 | throw new TypeError('Invalid composite mode ' + memberValue + '.'); |
| 255 | } |
| 256 | } else if (member == 'easing') { |
| 257 | memberValue = shared.normalizeEasing(memberValue); |
| 258 | } else { |
| 259 | memberValue = '' + memberValue; |
| 260 | } |
| 261 | expandShorthandAndAntiAlias(member, memberValue, keyframe); |
| 262 | } |
| 263 | if (keyframe.offset == undefined) |
| 264 | keyframe.offset = null; |
| 265 | if (keyframe.easing == undefined) |
| 266 | keyframe.easing = 'linear'; |
| 267 | return keyframe; |
| 268 | }); |
| 269 | |
| 270 | var everyFrameHasOffset = true; |
| 271 | var looselySortedByOffset = true; |
| 272 | var previousOffset = -Infinity; |
| 273 | for (var i = 0; i < keyframes.length; i++) { |
| 274 | var offset = keyframes[i].offset; |
| 275 | if (offset != null) { |
| 276 | if (offset < previousOffset) { |
| 277 | throw new TypeError('Keyframes are not loosely sorted by offset. Sort or specify offsets.'); |
no test coverage detected
searching dependent graphs…