New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
scroll, SetScrollTop, SetScrollLeft in `element.rs` #19127
Changes from all commits
File filter...
Jump to…
scroll, SetScrollTop, SetScrollLeft in `dom-element-scroll` with test
- Loading branch information
| @@ -363,6 +363,19 @@ impl Element { | ||
| !self.overflow_y_is_visible() | ||
| } | ||
|
|
||
| // https://drafts.csswg.org/cssom-view/#scrolling-box | ||
| fn has_scrolling_box(&self) -> bool { | ||
| // TODO: scrolling mechanism, such as scrollbar (We don't have scrollbar yet) | ||
| // self.has_scrolling_mechanism() | ||
| self.overflow_x_is_hidden() || | ||
tigercosmos
Author
Collaborator
|
||
| self.overflow_y_is_hidden() | ||
| } | ||
|
|
||
| fn has_overflow(&self) -> bool { | ||
emilio
Member
|
||
| self.ScrollHeight() > self.ClientHeight() || | ||
| self.ScrollWidth() > self.ClientWidth() | ||
| } | ||
|
|
||
| // used value of overflow-x is "visible" | ||
| fn overflow_x_is_visible(&self) -> bool { | ||
| let window = window_from_node(self); | ||
| @@ -376,6 +389,20 @@ impl Element { | ||
| let overflow_pair = window.overflow_query(self.upcast::<Node>().to_trusted_node_address()); | ||
| overflow_pair.y == overflow_y::computed_value::T::visible | ||
| } | ||
|
|
||
| // used value of overflow-x is "hidden" | ||
| fn overflow_x_is_hidden(&self) -> bool { | ||
| let window = window_from_node(self); | ||
| let overflow_pair = window.overflow_query(self.upcast::<Node>().to_trusted_node_address()); | ||
| overflow_pair.x == overflow_x::computed_value::T::hidden | ||
| } | ||
|
|
||
| // used value of overflow-y is "hidden" | ||
| fn overflow_y_is_hidden(&self) -> bool { | ||
| let window = window_from_node(self); | ||
| let overflow_pair = window.overflow_query(self.upcast::<Node>().to_trusted_node_address()); | ||
| overflow_pair.y == overflow_y::computed_value::T::hidden | ||
| } | ||
| } | ||
|
|
||
| #[allow(unsafe_code)] | ||
| @@ -1471,7 +1498,13 @@ impl Element { | ||
| return; | ||
| } | ||
|
|
||
| // Step 10 (TODO) | ||
| // Step 10 | ||
| if !self.has_css_layout_box() || | ||
| !self.has_scrolling_box() || | ||
| !self.has_overflow() | ||
| { | ||
| return; | ||
| } | ||
|
|
||
| // Step 11 | ||
| win.scroll_node(node, x, y, behavior); | ||
| @@ -1927,7 +1960,13 @@ impl ElementMethods for Element { | ||
| return; | ||
| } | ||
|
|
||
| // Step 10 (TODO) | ||
| // Step 10 | ||
| if !self.has_css_layout_box() || | ||
| !self.has_scrolling_box() || | ||
| !self.has_overflow() | ||
| { | ||
| return; | ||
| } | ||
|
|
||
| // Step 11 | ||
| win.scroll_node(node, self.ScrollLeft(), y, behavior); | ||
| @@ -2020,7 +2059,13 @@ impl ElementMethods for Element { | ||
| return; | ||
| } | ||
|
|
||
| // Step 10 (TODO) | ||
| // Step 10 | ||
| if !self.has_css_layout_box() || | ||
| !self.has_scrolling_box() || | ||
| !self.has_overflow() | ||
| { | ||
| return; | ||
| } | ||
|
|
||
| // Step 11 | ||
| win.scroll_node(node, x, self.ScrollTop(), behavior); | ||
This file was deleted.
| @@ -0,0 +1,99 @@ | ||
| <!doctype html> | ||
| <meta charset="utf-8"> | ||
| <title>dom-element-scroll tests</title> | ||
| <script src="/resources/testharness.js"></script> | ||
| <script src="/resources/testharnessreport.js"></script> | ||
| <style> | ||
| #section1 { | ||
| width: 300px; | ||
| height: 500px; | ||
| top: 16px; | ||
| left: 16px; | ||
| border: inset gray 3px; | ||
| background: white; | ||
| } | ||
|
|
||
| #scrollable { | ||
| width: 400px; | ||
| height: 700px; | ||
| background: linear-gradient(135deg, red, blue); | ||
| } | ||
|
|
||
| #section2 { | ||
| width: 300px; | ||
| height: 500px; | ||
| top: 16px; | ||
| left: 16px; | ||
| border: inset gray 3px; | ||
| background: white; | ||
| } | ||
|
|
||
| #unscrollable { | ||
| width: 200px; | ||
| height: 300px; | ||
| background: linear-gradient(135deg, red, blue); | ||
| } | ||
| </style> | ||
| <section id="section1"> | ||
| <div id="scrollable"></div> | ||
| </section> | ||
| <section id="section2"> | ||
| <div id="unscrollable"></div> | ||
| </section> | ||
| <script> | ||
| var section1 = document.getElementById("section1"); | ||
| var section2 = document.getElementById("section2"); | ||
|
|
||
| test(function () { | ||
| // let it be "hidden" to have scrolling box | ||
| section1.style.overflow = "hidden"; | ||
|
|
||
| section1.scroll(50, 60); | ||
| assert_equals(section1.scrollLeft, 50, "changed scrollLeft should be 50"); | ||
| assert_equals(section1.scrollTop, 60, "changed scrollTop should be 60"); | ||
|
|
||
| section1.scroll(0, 0); // back to the origin | ||
| }, "Element test for having scrolling box"); | ||
|
|
||
| test(function () { | ||
| section1.scroll(10, 20); | ||
| assert_equals(section1.scrollLeft, 10, "changed scrollLeft should be 10"); | ||
| assert_equals(section1.scrollTop, 20, "changed scrollTop should be 20"); | ||
|
|
||
| section1.scroll(0, 0); // back to the origin | ||
| }, "Element test for having overflow"); | ||
|
|
||
| test(function () { | ||
| // make it not "hidden" to not have scrolling box | ||
| section1.style.overflow = "visible"; | ||
|
|
||
| section1.scroll(50, 0); | ||
| assert_equals(section1.scrollLeft, 0, "changed scrollLeft should be 0"); | ||
| assert_equals(section1.scrollTop, 0, "changed scrollTop should be 0"); | ||
|
|
||
| section1.scroll(0, 60); | ||
| assert_equals(section1.scrollLeft, 0, "changed scrollLeft should be 0"); | ||
| assert_equals(section1.scrollTop, 0, "changed scrollTop should be 0"); | ||
|
|
||
| section1.scroll(50, 60); | ||
| assert_equals(section1.scrollLeft, 0, "changed scrollLeft should be 0"); | ||
| assert_equals(section1.scrollTop, 0, "changed scrollTop should be 0"); | ||
|
|
||
| section1.scroll(0, 0); // back to the origin | ||
| }, "Element test for not having scrolling box"); | ||
|
|
||
| test(function () { | ||
| section2.scroll(0, 20); | ||
| assert_equals(section2.scrollLeft, 0, "changed scrollLeft should be 0"); | ||
| assert_equals(section2.scrollTop, 0, "changed scrollTop should be 0"); | ||
|
|
||
| section2.scroll(10, 0); | ||
| assert_equals(section2.scrollLeft, 0, "changed scrollLeft should be 0"); | ||
| assert_equals(section2.scrollTop, 0, "changed scrollTop should be 0"); | ||
|
|
||
| section2.scroll(10, 20); | ||
| assert_equals(section2.scrollLeft, 0, "changed scrollLeft should be 0"); | ||
| assert_equals(section2.scrollTop, 0, "changed scrollTop should be 0"); | ||
| }, "Element test for not having overflow"); | ||
|
|
||
| </script> |
Hmm, there's a big condition that is missing here, which is:
So, is there something missing here? If not, where does it get handled? If nowhere, should it? Or should at least be a
TODOhere?