| <!DOCTYPE html> |
| <style> |
| .scroller { |
| height: 100px; |
| width: 100px; |
| overflow: scroll; |
| } |
| |
| .content { |
| height: 500px; |
| width: 500px; |
| } |
| </style> |
| |
| <script src='../../../resources/testharness.js'></script> |
| <script src='../../../resources/testharnessreport.js'></script> |
| |
| <div class='scroller'> |
| <div class='content'></div> |
| </div> |
| <script> |
| const gValidScrollOffsetValues = [ |
| 'auto', |
| 0, |
| 'calc(100% - 80px)', |
| ]; |
| |
| const gValidScrollOffsetSuffixes = [ |
| // Relative lengths. |
| 'em', |
| 'ex', |
| 'ch', |
| 'rem', |
| 'vw', |
| 'vh', |
| 'vmin', |
| 'vmax', |
| // Absolute lengths. |
| 'cm', |
| 'mm', |
| 'q', |
| 'in', |
| 'pc', |
| 'pt', |
| 'px', |
| // Percentage. |
| '%', |
| ]; |
| |
| // These are deliberately incomplete, just a random sampling of invalid |
| // values/units. |
| const gInvalidScrollOffsetValues = [ |
| '', |
| 'calc(360deg / 4)', |
| 'left', |
| '#ff0000', |
| 'rgb(0, 128, 0)', |
| 'url("http://www.example.com/pinkish.gif")', |
| 'this_is_garbage', |
| // Multiple valid values. |
| '100px 5%', |
| ]; |
| |
| const gInvalidScrollOffsetSuffixes = [ |
| 'deg', |
| 's', |
| 'Hz', |
| 'dpi', |
| ]; |
| |
| // Positive tests. |
| |
| for (let offset of gValidScrollOffsetValues) { |
| test(function() { |
| const scroller = document.querySelector('.scroller'); |
| const scrollTimeline = new ScrollTimeline( |
| { scrollSource: scroller, timeRange: 100, |
| startScrollOffset: offset, endScrollOffset: offset }); |
| |
| // Special case for 0; this is a valid value, but like computed style will |
| // be output as '0px' when queried. |
| if (offset == 0) |
| offset = '0px'; |
| |
| assert_equals(scrollTimeline.startScrollOffset, offset); |
| assert_equals(scrollTimeline.endScrollOffset, offset); |
| }, '\'' + offset + '\' is a valid scroll offset value'); |
| } |
| |
| for (const suffix of gValidScrollOffsetSuffixes) { |
| test(function() { |
| const offset = '75' + suffix; |
| const scroller = document.querySelector('.scroller'); |
| const scrollTimeline = new ScrollTimeline( |
| { scrollSource: scroller, timeRange: 100, |
| startScrollOffset: offset, endScrollOffset: offset }); |
| |
| assert_equals(scrollTimeline.startScrollOffset, offset); |
| assert_equals(scrollTimeline.endScrollOffset, offset); |
| }, '\'' + suffix + '\' is a valid scroll offset unit'); |
| } |
| |
| // Negative tests. |
| |
| for (const offset of gInvalidScrollOffsetValues) { |
| test(function() { |
| const scroller = document.querySelector('.scroller'); |
| const constructorFunc = function() { new ScrollTimeline( |
| { scrollSource: scroller, timeRange: 100, |
| startScrollOffset: offset, endScrollOffset: offset }) }; |
| assert_throws(new TypeError(), constructorFunc); |
| }, '\'' + offset + '\' is an invalid scroll offset value'); |
| } |
| |
| for (const suffix of gInvalidScrollOffsetSuffixes) { |
| test(function() { |
| const offset = '75' + suffix; |
| const scroller = document.querySelector('.scroller'); |
| const constructorFunc = function() { new ScrollTimeline( |
| { scrollSource: scroller, timeRange: 100, |
| startScrollOffset: offset, endScrollOffset: offset }) }; |
| assert_throws(new TypeError(), constructorFunc); |
| }, '\'' + suffix + '\' is an invalid scroll offset unit'); |
| } |
| </script> |