aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/element.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/element.rs')
-rw-r--r--components/script/dom/element.rs95
1 files changed, 94 insertions, 1 deletions
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs
index e14e1af0d97..8fa454c0e73 100644
--- a/components/script/dom/element.rs
+++ b/components/script/dom/element.rs
@@ -19,6 +19,7 @@ use dom::bindings::codegen::Bindings::EventBinding::EventMethods;
use dom::bindings::codegen::Bindings::HTMLInputElementBinding::HTMLInputElementMethods;
use dom::bindings::codegen::Bindings::HTMLTemplateElementBinding::HTMLTemplateElementMethods;
use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods;
+use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
use dom::bindings::codegen::UnionTypes::NodeOrString;
use dom::bindings::error::{Error, ErrorResult, Fallible};
use dom::bindings::global::GlobalRef;
@@ -39,6 +40,7 @@ use dom::htmlanchorelement::HTMLAnchorElement;
use dom::htmlbodyelement::{HTMLBodyElement, HTMLBodyElementLayoutHelpers};
use dom::htmlbuttonelement::HTMLButtonElement;
use dom::htmlcollection::HTMLCollection;
+use dom::htmlelement::HTMLElement;
use dom::htmlfieldsetelement::HTMLFieldSetElement;
use dom::htmlfontelement::{HTMLFontElement, HTMLFontElementLayoutHelpers};
use dom::htmlhrelement::{HTMLHRElement, HTMLHRLayoutHelpers};
@@ -86,7 +88,7 @@ use string_cache::{Atom, Namespace, QualName};
use style::element_state::*;
use style::error_reporting::ParseErrorReporter;
use style::properties::DeclaredValue;
-use style::properties::longhands::{self, background_image, border_spacing, font_family, font_size};
+use style::properties::longhands::{self, background_image, border_spacing, font_family, overflow_x, font_size};
use style::properties::{PropertyDeclaration, PropertyDeclarationBlock, parse_style_attribute};
use style::selector_impl::{NonTSPseudoClass, ServoSelectorImpl};
use style::values::CSSFloat;
@@ -164,6 +166,35 @@ impl Element {
document,
ElementBinding::Wrap)
}
+
+ // https://drafts.csswg.org/cssom-view/#css-layout-box
+ // Elements that have a computed value of the display property
+ // that is table-column or table-column-group
+ // FIXME: Currently, it is assumed to be true always
+ fn has_css_layout_box(&self) -> bool {
+ true
+ }
+
+ // https://drafts.csswg.org/cssom-view/#potentially-scrollable
+ fn potentially_scrollable(&self) -> bool {
+ self.has_css_layout_box() &&
+ !self.overflow_x_is_visible() &&
+ !self.overflow_y_is_visible()
+ }
+
+ // used value of overflow-x is "visible"
+ fn overflow_x_is_visible(&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::visible
+ }
+
+ // used value of overflow-y is "visible"
+ fn overflow_y_is_visible(&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_x::computed_value::T::visible
+ }
}
#[allow(unsafe_code)]
@@ -1452,6 +1483,68 @@ impl ElementMethods for Element {
rect.size.height.to_f64_px())
}
+ // https://drafts.csswg.org/cssom-view/#dom-element-scrolltop
+ fn ScrollTop(&self) -> f64 {
+ let node = self.upcast::<Node>();
+
+ // 1. Let document be the element’s node document.
+ let doc = node.owner_doc();
+
+ // 2. If the document is not the active document, return zero and terminate these steps.
+ if !doc.is_fully_active() {
+ return 0.0;
+ } else {
+ // 3. Let window be the value of document’s defaultView attribute.
+ let win = doc.DefaultView();
+
+ // 5. If the element is the root element and document is in quirks mode,
+ // return zero and terminate these steps.
+ if *self.root_element() == *self {
+ if doc.quirks_mode() == Quirks {
+ return 0.0;
+ }
+
+ // 6. If the element is the root element return the value of scrollY on window.
+ return (*win).ScrollY() as f64;
+ }
+
+ // 7. If the element is the HTML body element, document is in quirks mode,
+ // and the element is not potentially scrollable, return the value of scrollY on window.
+ if doc.GetBody().r() == self.downcast::<HTMLElement>() &&
+ doc.quirks_mode() == Quirks &&
+ !self.potentially_scrollable() {
+ return (*win).ScrollY() as f64;
+ }
+
+
+ // 8. If the element does not have any associated CSS layout box, return zero and terminate these steps.
+ if !self.has_css_layout_box() {
+ return 0.0;
+ }
+
+ // 9. Return the y-coordinate of the scrolling area at the alignment point
+ // with the top of the padding edge of the element.
+ let point = node.scroll_offset();
+ return -point.y as f64;
+ }
+ }
+
+ // https://drafts.csswg.org/cssom-view/#dom-element-scrolltop
+ fn SetScrollTop(&self, _scroll_top: f64) {
+ unimplemented!()
+ }
+
+ // https://drafts.csswg.org/cssom-view/#dom-element-scrollleft
+ fn ScrollLeft(&self) -> f64 {
+ let point = self.upcast::<Node>().scroll_offset();
+ return -point.x as f64;
+ }
+
+ // https://drafts.csswg.org/cssom-view/#dom-element-scrollleft
+ fn SetScrollLeft(&self, _scroll_left: f64) {
+ unimplemented!()
+ }
+
// https://drafts.csswg.org/cssom-view/#dom-element-scrollwidth
fn ScrollWidth(&self) -> i32 {
self.upcast::<Node>().scroll_area().size.width