test_composite.html (4873B)
1 <!doctype html> 2 <meta charset=utf-8> 3 <script src="/resources/testharness.js"></script> 4 <script src="/resources/testharnessreport.js"></script> 5 <script src="../testcommon.js"></script> 6 <script src="/tests/SimpleTest/paint_listener.js"></script> 7 <style> 8 div { 9 /* Element needs geometry to be eligible for layerization */ 10 width: 20px; 11 height: 20px; 12 background-color: white; 13 } 14 </style> 15 <body> 16 <div id="log"></div> 17 <script> 18 'use strict'; 19 20 if (!SpecialPowers.DOMWindowUtils.layerManagerRemote || 21 !SpecialPowers.getBoolPref( 22 'layers.offmainthreadcomposition.async-animations')) { 23 // If OMTA is disabled, nothing to run. 24 done(); 25 } 26 27 function waitForPaintsFlushed() { 28 return new Promise(function(resolve, reject) { 29 waitForAllPaintsFlushed(resolve); 30 }); 31 } 32 33 promise_test(t => { 34 // Without this, the first test case fails on Android. 35 return waitForDocumentLoad(); 36 }, 'Ensure document has been loaded'); 37 38 promise_test(t => { 39 var div; 40 return useTestRefreshMode(t).then(() => { 41 div = addDiv(t, { style: 'transform: translateX(100px)' }); 42 div.animate({ transform: ['translateX(0px)', 'translateX(200px)'], 43 composite: 'accumulate' }, 44 100 * MS_PER_SEC); 45 46 return waitForPaintsFlushed(); 47 }).then(() => { 48 SpecialPowers.DOMWindowUtils.advanceTimeAndRefresh(50 * MS_PER_SEC); 49 var transform = 50 SpecialPowers.DOMWindowUtils.getOMTAStyle(div, 'transform'); 51 assert_matrix_equals(transform, 'matrix(1, 0, 0, 1, 200, 0)', 52 'Transform value at 50%'); 53 }); 54 }, 'Accumulate onto the base value'); 55 56 promise_test(t => { 57 var div; 58 return useTestRefreshMode(t).then(() => { 59 div = addDiv(t); 60 div.animate({ transform: ['translateX(100px)', 'translateX(200px)'], 61 composite: 'replace' }, 62 100 * MS_PER_SEC); 63 div.animate({ transform: ['translateX(0px)', 'translateX(100px)'], 64 composite: 'accumulate' }, 65 100 * MS_PER_SEC); 66 67 return waitForPaintsFlushed(); 68 }).then(() => { 69 SpecialPowers.DOMWindowUtils.advanceTimeAndRefresh(50 * MS_PER_SEC); 70 var transform = 71 SpecialPowers.DOMWindowUtils.getOMTAStyle(div, 'transform'); 72 assert_matrix_equals(transform, 'matrix(1, 0, 0, 1, 200, 0)', 73 'Transform value at 50%'); 74 }); 75 }, 'Accumulate onto an underlying animation value'); 76 77 promise_test(t => { 78 var div; 79 return useTestRefreshMode(t).then(() => { 80 div = addDiv(t, { style: 'transform: translateX(100px)' }); 81 div.animate([{ transform: 'translateX(100px)', composite: 'accumulate' }, 82 { transform: 'translateX(300px)', composite: 'replace' }], 83 100 * MS_PER_SEC); 84 85 return waitForPaintsFlushed(); 86 }).then(() => { 87 SpecialPowers.DOMWindowUtils.advanceTimeAndRefresh(50 * MS_PER_SEC); 88 var transform = 89 SpecialPowers.DOMWindowUtils.getOMTAStyle(div, 'transform'); 90 assert_matrix_equals(transform, 'matrix(1, 0, 0, 1, 250, 0)', 91 'Transform value at 50s'); 92 }); 93 }, 'Composite when mixing accumulate and replace'); 94 95 promise_test(t => { 96 var div; 97 return useTestRefreshMode(t).then(() => { 98 div = addDiv(t, { style: 'transform: translateX(100px)' }); 99 div.animate([{ transform: 'translateX(100px)', composite: 'replace' }, 100 { transform: 'translateX(300px)' }], 101 { duration: 100 * MS_PER_SEC, composite: 'accumulate' }); 102 return waitForPaintsFlushed(); 103 }).then(() => { 104 SpecialPowers.DOMWindowUtils.advanceTimeAndRefresh(50 * MS_PER_SEC); 105 var transform = 106 SpecialPowers.DOMWindowUtils.getOMTAStyle(div, 'transform'); 107 assert_matrix_equals(transform, 'matrix(1, 0, 0, 1, 250, 0)', 108 'Transform value at 50%'); 109 }); 110 }, 'Composite specified on a keyframe overrides the composite mode of the ' + 111 'effect'); 112 113 promise_test(t => { 114 var div; 115 var anim; 116 return useTestRefreshMode(t).then(() => { 117 div = addDiv(t); 118 div.animate({ transform: [ 'scale(2)', 'scale(2)' ] }, 100 * MS_PER_SEC); 119 anim = div.animate({ transform: [ 'scale(4)', 'scale(4)' ] }, 120 { duration: 100 * MS_PER_SEC, composite: 'add' }); 121 122 return waitForPaintsFlushed(); 123 }).then(() => { 124 var transform = 125 SpecialPowers.DOMWindowUtils.getOMTAStyle(div, 'transform'); 126 assert_matrix_equals(transform, 'matrix(8, 0, 0, 8, 0, 0)', 127 'The additive scale value should be scale(8)'); // scale(2) scale(4) 128 129 anim.effect.composite = 'accumulate'; 130 return waitForPaintsFlushed(); 131 }).then(() => { 132 SpecialPowers.DOMWindowUtils.advanceTimeAndRefresh(1); 133 var transform = 134 SpecialPowers.DOMWindowUtils.getOMTAStyle(div, 'transform'); 135 assert_matrix_equals(transform, 'matrix(5, 0, 0, 5, 0, 0)', 136 // (scale(2 - 1) + scale(4 - 1) + scale(1)) 137 'The accumulate scale value should be scale(5)'); 138 }); 139 }, 'Composite operation change'); 140 141 </script> 142 </body>