| OLD | NEW |
| (Empty) |
| 1 <!-- | |
| 2 Copyright 2013 Google Inc. All Rights Reserved. | |
| 3 | |
| 4 Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 you may not use this file except in compliance with the License. | |
| 6 You may obtain a copy of the License at | |
| 7 | |
| 8 http://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | |
| 10 Unless required by applicable law or agreed to in writing, software | |
| 11 distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 See the License for the specific language governing permissions and | |
| 14 limitations under the License. | |
| 15 --> | |
| 16 | |
| 17 <!DOCTYPE html><meta charset="UTF-8"> | |
| 18 <style> | |
| 19 div.anim { | |
| 20 left: 100px; | |
| 21 top: 200px; | |
| 22 } | |
| 23 </style> | |
| 24 | |
| 25 <div id="elem"></div> | |
| 26 | |
| 27 <div id="anim0" class="anim"></div> | |
| 28 <div id="anim1" class="anim"></div> | |
| 29 <div id="anim2" class="anim"></div> | |
| 30 <div id="anim3" class="anim"></div> | |
| 31 <div id="anim4" class="anim"></div> | |
| 32 <div id="anim5" class="anim"></div> | |
| 33 <div id="anim6" class="anim"></div> | |
| 34 <div id="anim7" class="anim"></div> | |
| 35 <div id="anim8" class="anim"></div> | |
| 36 <div id="anim9" class="anim"></div> | |
| 37 <div id="anim10" class="anim"></div> | |
| 38 <div id="anim11" class="anim"></div> | |
| 39 | |
| 40 <script src="../bootstrap.js"></script> | |
| 41 <script> | |
| 42 "use strict"; | |
| 43 | |
| 44 var keyframes = [{left: "200px"}, {left: "300px"}]; | |
| 45 | |
| 46 test(function() { | |
| 47 assert_true(new Animation(document.getElementById("elem"), keyframes).effect | |
| 48 instanceof KeyframeEffect); | |
| 49 }, "Animation.effect should be an instance of KeyframeEffect when " + | |
| 50 "created with a keyframe dictionary"); | |
| 51 | |
| 52 test(function() { | |
| 53 assert_equals(new KeyframeEffect(keyframes).composite, "replace"); | |
| 54 }, "KeyframeEffect.composite should default to 'replace'"); | |
| 55 | |
| 56 test(function() { | |
| 57 var effect = new KeyframeEffect(keyframes); | |
| 58 effect.composite = "foo"; | |
| 59 assert_equals(effect.composite, "replace"); | |
| 60 effect.composite = 42; | |
| 61 assert_equals(effect.composite, "replace"); | |
| 62 effect.composite = "add"; | |
| 63 assert_equals(effect.composite, "add"); | |
| 64 }, "KeyframeEffect.composite should only accept valid values"); | |
| 65 | |
| 66 timing_test(function() { | |
| 67 var animation = new Animation(document.getElementById("anim1"), keyframes, 1); | |
| 68 document.timeline.play(animation); | |
| 69 at(0.5, function() { | |
| 70 assert_styles("#anim1", {left: "250px"}); | |
| 71 animation.effect.composite = "add"; | |
| 72 assert_styles("#anim1", {left: "350px"}); | |
| 73 }); | |
| 74 }, "Setting KeyframeEffect.composite should cause immediate update"); | |
| 75 | |
| 76 test(function() { | |
| 77 var frames = new KeyframeEffect( | |
| 78 [{left: "100px"}, {top: "200px"}]).getFrames(); | |
| 79 assert_equals(frames.length, 2); | |
| 80 assert_equals(frames[0].left, "100px"); | |
| 81 assert_equals(frames[1].top, "200px"); | |
| 82 }, "KeyframeEffect.getFrames() should return the specified keyframes"); | |
| 83 | |
| 84 test(function() { | |
| 85 var frames = new KeyframeEffect({left: "100px"}).getFrames(); | |
| 86 assert_equals(frames.length, 1); | |
| 87 assert_equals(frames[0].left, "100px"); | |
| 88 }, "KeyframeEffect should handle a single keyframe"); | |
| 89 | |
| 90 test(function() { | |
| 91 var frames = new KeyframeEffect({}).getFrames(); | |
| 92 assert_equals(frames.length, 1); | |
| 93 assert_equals(typeof frames[0], "object"); | |
| 94 }, "KeyframeEffect should handle an empty keyframe"); | |
| 95 | |
| 96 test(function() { | |
| 97 var frames = new KeyframeEffect().getFrames(); | |
| 98 assert_equals(frames.length, 1); | |
| 99 assert_equals(typeof frames[0], "object"); | |
| 100 }, "KeyframeEffect should handle no input for keyframe dictionary"); | |
| 101 | |
| 102 test(function() { | |
| 103 var frames = new KeyframeEffect(42).getFrames(); | |
| 104 assert_equals(frames.length, 1); | |
| 105 assert_equals(typeof frames[0], "object"); | |
| 106 }, "KeyframeEffect should handle non-objects for keyframe dictionary"); | |
| 107 | |
| 108 test(function() { | |
| 109 assert_false( | |
| 110 new KeyframeEffect(keyframes).getFrames() === keyframes); | |
| 111 }, "KeyframeEffect.getFrames() should not return the original " + | |
| 112 "keyframe dictionary"); | |
| 113 | |
| 114 test(function() { | |
| 115 var effect = new KeyframeEffect({left: "100px"}); | |
| 116 effect.getFrames().push({top: "200px"}); | |
| 117 var frames = effect.getFrames(); | |
| 118 assert_equals(frames.length, 1); | |
| 119 assert_equals(frames[0].left, "100px"); | |
| 120 assert_equals(frames[0].top, undefined); | |
| 121 }, "KeyframeEffect.getFrames() should not allow internal state to " + | |
| 122 "be modified"); | |
| 123 | |
| 124 test(function() { | |
| 125 assert_equals(new KeyframeEffect(keyframes).getFrames()[0].offset, | |
| 126 null); | |
| 127 }, "Default keyframe offset should be null"); | |
| 128 | |
| 129 test(function() { | |
| 130 assert_equals( | |
| 131 new KeyframeEffect({offset: "foo"}).getFrames()[0].offset, null); | |
| 132 assert_equals(new KeyframeEffect({offset: 42}).getFrames()[0].offset, | |
| 133 42); | |
| 134 }, "Keyframes should only accept valid values for offset"); | |
| 135 | |
| 136 test(function() { | |
| 137 assert_equals(new KeyframeEffect(keyframes).getFrames()[0].composite, | |
| 138 null); | |
| 139 }, "Default keyframe composite should be null"); | |
| 140 | |
| 141 test(function() { | |
| 142 assert_equals( | |
| 143 new KeyframeEffect({composite: "foo"}).getFrames()[0].composite, | |
| 144 null); | |
| 145 assert_equals( | |
| 146 new KeyframeEffect({composite: 42}).getFrames()[0].composite, | |
| 147 null); | |
| 148 assert_equals( | |
| 149 new KeyframeEffect({composite: "add"}).getFrames()[0].composite, | |
| 150 "add"); | |
| 151 assert_equals(new KeyframeEffect( | |
| 152 {composite: "replace"}).getFrames()[0].composite, | |
| 153 "replace"); | |
| 154 }, "Keyframes should only accept valid values for composite"); | |
| 155 | |
| 156 test(function() { | |
| 157 assert_equals(new KeyframeEffect({left: null}).getFrames()[0].left, | |
| 158 ""); | |
| 159 }, "Keyframe should handle null property values"); | |
| 160 | |
| 161 test(function() { | |
| 162 assert_equals( | |
| 163 typeof new KeyframeEffect({left: 42}).getFrames()[0].left, | |
| 164 "string"); | |
| 165 assert_equals(new KeyframeEffect({left: 42}).getFrames()[0].left, | |
| 166 "42"); | |
| 167 var obj = { toString: function() { return "toString() called"; } }; | |
| 168 assert_equals(new KeyframeEffect({left: obj}).getFrames()[0].left, | |
| 169 obj.toString()); | |
| 170 }, "Keyframe property values should be stringified"); | |
| 171 | |
| 172 timing_test(function() { | |
| 173 document.timeline.play(new Animation( | |
| 174 document.getElementById("anim2"), {left: null, top: ''}, 1)); | |
| 175 at(1.0, function() { | |
| 176 assert_styles("#anim2", {left: "100px"}); | |
| 177 assert_styles("#anim2", {top: "200px"}); | |
| 178 }); | |
| 179 }, "Invalid keyframe property values should be ignored"); | |
| 180 | |
| 181 test(function() { | |
| 182 var effect = new KeyframeEffect(keyframes); | |
| 183 effect.setFrames({top: "200px"}); | |
| 184 var frames = effect.getFrames(); | |
| 185 assert_equals(frames[0].left, undefined); | |
| 186 assert_equals(frames[0].top, "200px"); | |
| 187 }, "KeyframeEffect.setFrames() should replace exisiting keyframes"); | |
| 188 | |
| 189 timing_test(function() { | |
| 190 var animation = new Animation(document.getElementById("anim3"), keyframes, 1); | |
| 191 document.timeline.play(animation); | |
| 192 at(0.5, function() { | |
| 193 assert_styles("#anim3", {left: "250px"}); | |
| 194 animation.effect.setFrames([{left: "300px"}, {left: "400px"}]); | |
| 195 assert_styles("#anim3", {left: "350px"}); | |
| 196 }); | |
| 197 }, "KeyframeEffect.setFrames() should immediately update its target"); | |
| 198 timing_test(function() { | |
| 199 document.timeline.play(new Animation(document.getElementById("anim10"), [ | |
| 200 {left: "100px"}, | |
| 201 {left: "200px"}, | |
| 202 {left: "100px"}, | |
| 203 {left: "300px"}, | |
| 204 {left: "100px"}, | |
| 205 ], 1)); | |
| 206 at(0.0, function() { | |
| 207 assert_styles("#anim10", {left: "100px"}); | |
| 208 }); | |
| 209 at(0.25, function() { | |
| 210 assert_styles("#anim10", {left: "200px"}); | |
| 211 }); | |
| 212 at(0.5, function() { | |
| 213 assert_styles("#anim10", {left: "100px"}); | |
| 214 }); | |
| 215 at(0.75, function() { | |
| 216 assert_styles("#anim10", {left: "300px"}); | |
| 217 }); | |
| 218 at(1.0, function() { | |
| 219 assert_styles("#anim10", {left: "100px"}); | |
| 220 }); | |
| 221 }, "Keyframes should be distributed evenly between offsets 0 and 1"); | |
| 222 | |
| 223 timing_test(function() { | |
| 224 document.timeline.play(new Animation(document.getElementById("anim11"), [ | |
| 225 {left: "100px", offset: 0.0}, | |
| 226 {left: "200px", offset: 0.7}, | |
| 227 {left: "100px"}, | |
| 228 {left: "300px"}, | |
| 229 {left: "100px", offset: 1.0}, | |
| 230 ], 1)); | |
| 231 at(0.0, function() { | |
| 232 assert_styles("#anim11", {left: "100px"}); | |
| 233 }); | |
| 234 at(0.7, function() { | |
| 235 assert_styles("#anim11", {left: "200px"}); | |
| 236 }); | |
| 237 at(0.8, function() { | |
| 238 assert_styles("#anim11", {left: "100px"}); | |
| 239 }); | |
| 240 at(0.9, function() { | |
| 241 assert_styles("#anim11", {left: "300px"}); | |
| 242 }); | |
| 243 at(1.0, function() { | |
| 244 assert_styles("#anim11", {left: "100px"}); | |
| 245 }); | |
| 246 }, "Keyframes should be distributed evenly between keyframes with offsets"); | |
| 247 | |
| 248 </script> | |
| OLD | NEW |