diff --git a/frontend_tests/node_tests/stream_list.js b/frontend_tests/node_tests/stream_list.js index a8a6d2ccc6..f3f3295be6 100644 --- a/frontend_tests/node_tests/stream_list.js +++ b/frontend_tests/node_tests/stream_list.js @@ -481,6 +481,12 @@ function initialize_stream_data() { container_height: 10, })); + assert.equal(0, stream_list.scroll_delta({ + elem_top: -5, + elem_bottom: 15, + container_height: 10, + })); + // The top is offscreen. assert.equal(-3, stream_list.scroll_delta({ elem_top: -3, @@ -494,6 +500,12 @@ function initialize_stream_data() { container_height: 10, })); + assert.equal(-11, stream_list.scroll_delta({ + elem_top: -150, + elem_bottom: -1, + container_height: 10, + })); + // The bottom is offscreen. assert.equal(3, stream_list.scroll_delta({ elem_top: 7, @@ -507,4 +519,10 @@ function initialize_stream_data() { container_height: 10, })); + assert.equal(11, stream_list.scroll_delta({ + elem_top: 11, + elem_bottom: 99, + container_height: 10, + })); + }()); diff --git a/static/js/stream_list.js b/static/js/stream_list.js index 989917cb51..198abbd6c7 100644 --- a/static/js/stream_list.js +++ b/static/js/stream_list.js @@ -616,10 +616,18 @@ exports.scroll_delta = function (opts) { var delta = 0; if (elem_top < 0) { - delta = elem_top; + delta = Math.max( + elem_top, + elem_bottom - container_height + ); + delta = Math.min(0, delta); } else { if (elem_bottom > container_height) { - delta = elem_bottom - container_height; + delta = Math.min( + elem_top, + elem_bottom - container_height + ); + delta = Math.max(0, delta); } }