view-timeline-source.tentative.html (2228B)
1 <!DOCTYPE html> 2 <html id="top"> 3 <meta charset="utf-8"> 4 <title>View timeline source</title> 5 <link rel="help" href="https://drafts.csswg.org/scroll-animations-1/#viewtimeline-interface"> 6 <script src="/resources/testharness.js"></script> 7 <script src="/resources/testharnessreport.js"></script> 8 <script src="/web-animations/testcommon.js"></script> 9 <style> 10 #outer { 11 height: 400px; 12 width: 400px; 13 overflow: clip; 14 } 15 16 #inner { 17 height: 300px; 18 width: 300px; 19 overflow: clip; 20 } 21 22 #outer.scroller, 23 #inner.scroller { 24 overflow: scroll; 25 } 26 27 #spacer { 28 height: 1000px; 29 } 30 31 #target { 32 background: green; 33 height: 40px; 34 width: 40px; 35 } 36 </style> 37 <body> 38 <div id="outer" class="scroller"> 39 <div id="inner" class="scroller"> 40 <div id="target"></div> 41 <div id="spacer"></div> 42 </div> 43 </div> 44 </body> 45 <script> 46 'use strict'; 47 48 function resetScrollers() { 49 inner.classList.add('scroller'); 50 outer.classList.add('scroller'); 51 } 52 53 function assert_source_id(viewTimeline, expected) { 54 const source = viewTimeline.source; 55 assert_true(!!source, 'No source'); 56 assert_equals(source.id, expected); 57 } 58 59 promise_test(async t => { 60 t.add_cleanup(resetScrollers); 61 const viewTimeline = new ViewTimeline({ subject: target }); 62 assert_equals(viewTimeline.subject, target); 63 assert_source_id(viewTimeline, 'inner'); 64 65 inner.classList.remove('scroller'); 66 assert_source_id(viewTimeline, 'outer'); 67 68 outer.classList.remove('scroller'); 69 assert_source_id(viewTimeline, 'top'); 70 }, 'Default source for a View timeline is the nearest scroll ' + 71 'ancestor to the subject'); 72 73 promise_test(async t => { 74 t.add_cleanup(resetScrollers); 75 const viewTimeline = 76 new ViewTimeline({ source: outer, subject: target }); 77 assert_equals(viewTimeline.subject, target); 78 assert_source_id(viewTimeline, 'inner'); 79 }, 'View timeline ignores explicitly set source'); 80 81 promise_test(async t => { 82 t.add_cleanup(resetScrollers); 83 const viewTimeline = 84 new ViewTimeline({ subject: target }); 85 assert_equals(viewTimeline.subject, target); 86 assert_source_id(viewTimeline, 'inner'); 87 88 target.style = "display: none"; 89 assert_equals(viewTimeline.source, null); 90 91 }, 'View timeline source is null when display:none'); 92 93 </script> 94 </html>