Fix clamping of scroll position in window.scrollBy

For rightward and downward overflow the spec says:

Let x be max(0, min(x, viewport scrolling area width - viewport width)).
Let y be max(0, min(y, viewport scrolling area height - viewport height)).

Previously, those operations were reversed, which created negative
overflow even when the overflow direction was downward. This change
ensures that Servo matches spec behavior.
This commit is contained in:
Martin Robinson 2017-05-11 10:13:53 +02:00
parent 0040160b38
commit b13cf11505
3 changed files with 38 additions and 2 deletions

View file

@ -1066,8 +1066,8 @@ impl Window {
let content_size = e.upcast::<Node>().bounding_content_box_or_zero();
let content_height = content_size.size.height.to_f64_px();
let content_width = content_size.size.width.to_f64_px();
(xfinite.max(0.0f64).min(content_width - width),
yfinite.max(0.0f64).min(content_height - height))
(xfinite.min(content_width - width).max(0.0f64),
yfinite.min(content_height - height).max(0.0f64))
},
None => {
(xfinite.max(0.0f64), yfinite.max(0.0f64))

View file

@ -19783,6 +19783,12 @@
{}
]
],
"mozilla/scrollBy.html": [
[
"/_mozilla/mozilla/scrollBy.html",
{}
]
],
"mozilla/scrollTo.html": [
[
"/_mozilla/mozilla/scrollTo.html",
@ -31354,6 +31360,10 @@
"b247e3a0ba733c1a8b129ce2994b862d8ed3a423",
"testharness"
],
"mozilla/scrollBy.html": [
"0243d584bc615a73ea1667fc35f5d73b5165d19f",
"testharness"
],
"mozilla/scrollTo.html": [
"b9917be5fed364dbc46264f641f54f275b5c054a",
"testharness"

View file

@ -0,0 +1,26 @@
<!doctype html>
<meta charset="utf-8">
<title>Ensure that the window.scrollBy function affects scroll position as expected</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<body>
<a id="link" href="http://mozilla.org">This is some link text.</a>
<div style="width: 10000px; height: 10000px; background: pink; z-index: -1;"></div>
<script>
test(function() {
scrollBy(0, 5000);
assert_equals(scrollX, 0);
assert_equals(pageXOffset, 0);
assert_equals(scrollY, 5000);
assert_equals(pageYOffset, 5000);
scrollTo(0, 0);
var link = document.getElementById("link");
var linkRect = link.getBoundingClientRect();
assert_equals(link, document.elementFromPoint(linkRect.left, linkRect.top));
window.scrollBy(0, 1);
assert_equals(link, document.elementFromPoint(linkRect.left, linkRect.top - 1));
});
</script>
</body>