diff options
Diffstat (limited to 'components/script/dom/node.rs')
-rw-r--r-- | components/script/dom/node.rs | 54 |
1 files changed, 29 insertions, 25 deletions
diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index 4758c28717d..d360ee3694f 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -16,7 +16,7 @@ use app_units::Au; use bitflags::bitflags; use devtools_traits::NodeInfo; use dom_struct::dom_struct; -use euclid::default::{Point2D, Rect, Size2D, Vector2D}; +use euclid::default::{Rect, Size2D, Vector2D}; use html5ever::{namespace_url, ns, Namespace, Prefix, QualName}; use js::jsapi::JSObject; use js::rust::HandleObject; @@ -808,38 +808,42 @@ impl Node { // https://drafts.csswg.org/cssom-view/#dom-element-scrollwidth // https://drafts.csswg.org/cssom-view/#dom-element-scrollheight pub fn scroll_area(&self) -> Rect<i32> { - // Step 1 + // "1. Let document be the element’s node document."" let document = self.owner_doc(); - // Step 3 - let window = document.window(); - let html_element = document.GetDocumentElement(); + // "2. If document is not the active document, return zero and terminate these steps."" + if !document.is_active() { + return Rect::zero(); + } + + // "3. Let viewport width/height be the width of the viewport excluding the width/height of the + // scroll bar, if any, or zero if there is no viewport." + let window = document.window(); + let viewport = Size2D::new(window.InnerWidth(), window.InnerHeight()); + let in_quirks_mode = document.quirks_mode() == QuirksMode::Quirks; + let is_root = self.downcast::<Element>().map_or(false, |e| e.is_root()); let is_body_element = self .downcast::<HTMLBodyElement>() .map_or(false, |e| e.is_the_html_body_element()); - let scroll_area = window.scroll_area_query(self); - - match ( - document != window.Document(), - is_body_element, - document.quirks_mode(), - html_element.as_deref() == self.downcast::<Element>(), - ) { - // Step 2 && Step 5 - (true, _, _, _) | (_, false, QuirksMode::Quirks, true) => Rect::zero(), - // Step 6 && Step 7 - (false, false, _, true) | (false, true, QuirksMode::Quirks, _) => Rect::new( - Point2D::new(window.ScrollX(), window.ScrollY()), - Size2D::new( - cmp::max(window.InnerWidth(), scroll_area.size.width), - cmp::max(window.InnerHeight(), scroll_area.size.height), - ), - ), - // Step 9 - _ => scroll_area, + // "4. If the element is the root element and document is not in quirks mode + // return max(viewport scrolling area width/height, viewport width/height)." + // "5. If the element is the body element, document is in quirks mode and the + // element is not potentially scrollable, return max(viewport scrolling area + // width, viewport width)." + if (is_root && !in_quirks_mode) || (is_body_element && in_quirks_mode) { + let viewport_scrolling_area = window.scrolling_area_query(None); + return Rect::new( + viewport_scrolling_area.origin, + viewport_scrolling_area.size.max(viewport), + ); } + + // "6. If the element does not have any associated box return zero and terminate + // these steps." + // "7. Return the width of the element’s scrolling area." + window.scrolling_area_query(Some(self)) } pub fn scroll_offset(&self) -> Vector2D<f32> { |