diff options
author | eri <epazos@igalia.com> | 2024-10-29 22:42:22 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-29 22:42:22 +0000 |
commit | 01820e2a8a28bcf3b8e1b17863984d8f729ca79b (patch) | |
tree | 99df04833606ca839535daff4b0e75488556a18a /components/script/dom/element.rs | |
parent | 43d1601016e03fe83fe9b8a526357de1d5fc4122 (diff) | |
download | servo-01820e2a8a28bcf3b8e1b17863984d8f729ca79b.tar.gz servo-01820e2a8a28bcf3b8e1b17863984d8f729ca79b.zip |
Improve how intrinsic sizes work for videos (#31746)
* feat: patch for video layout sizes
added rebase from main 2024/10/05
Co-authored-by: Josh Matthews <josh@joshmatthews.net>
Signed-off-by: eri <epazos@igalia.com>
* feat: take width and height parameters if provided
Signed-off-by: eri <epazos@igalia.com>
* chore: tidy the code and update test expectations
Signed-off-by: eri <epazos@igalia.com>
* feat: handle removing poster
Signed-off-by: eri <epazos@igalia.com>
* chore: update test expectations and remove debug code
Signed-off-by: eri <epazos@igalia.com>
* fix: issues after rebasing to main
Signed-off-by: eri <epazos@igalia.com>
* feat: pass src remove test and tidy
Signed-off-by: eri <epazos@igalia.com>
* chore: clippy fixes
Signed-off-by: eri <epazos@igalia.com>
* chore: update passing test expectations
Signed-off-by: eri <epazos@igalia.com>
* fix object-position-svg test
Signed-off-by: eri <epazos@igalia.com>
* fix unintentional override of video size and resize events
Signed-off-by: eri <epazos@igalia.com>
* change how resize events are sent to better match the spec
Signed-off-by: eri <epazos@igalia.com>
* simplify poster mutation handling
Co-authored-by: Oriol Brufau <obrufau@igalia.com>
Signed-off-by: eri <eri@inventati.org>
* improved handling of intrinsic sizes
- differentiate between natural size and css size
- presentational attributes
- fallback ratio for video element
- handle more cases where the src/poster are added/removed
- aspect ratio hints
Signed-off-by: eri <epazos@igalia.com>
* update test expectations
Signed-off-by: eri <epazos@igalia.com>
* fix cleaning current frame
Signed-off-by: eri <epazos@igalia.com>
* update test expectations
Signed-off-by: eri <epazos@igalia.com>
* Apply suggestions from code review
Co-authored-by: Oriol Brufau <obrufau@igalia.com>
Signed-off-by: eri <eri@inventati.org>
* More code review suggestions
Signed-off-by: eri <epazos@igalia.com>
* Prevent aspect-ratio:auto from pulling the ratio from the default object size
As resolved in https://github.com/w3c/csswg-drafts/issues/7524#issuecomment-1204462924
Signed-off-by: Oriol Brufau <obrufau@igalia.com>
---------
Signed-off-by: eri <epazos@igalia.com>
Signed-off-by: eri <eri@inventati.org>
Signed-off-by: Oriol Brufau <obrufau@igalia.com>
Co-authored-by: Josh Matthews <josh@joshmatthews.net>
Co-authored-by: Oriol Brufau <obrufau@igalia.com>
Diffstat (limited to 'components/script/dom/element.rs')
-rw-r--r-- | components/script/dom/element.rs | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index d7478dd21c2..bc09d5f8fb7 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -55,6 +55,8 @@ use style::selector_parser::{ use style::shared_lock::{Locked, SharedRwLock}; use style::stylesheets::layer_rule::LayerOrder; use style::stylesheets::{CssRuleType, UrlExtraData}; +use style::values::generics::position::PreferredRatio; +use style::values::generics::ratio::Ratio; use style::values::generics::NonNegative; use style::values::{computed, specified, AtomIdent, AtomString, CSSFloat}; use style::{dom_apis, thread_state, ArcSlice, CaseSensitivityExt}; @@ -132,6 +134,7 @@ use crate::dom::htmltablesectionelement::{ }; use crate::dom::htmltemplateelement::HTMLTemplateElement; use crate::dom::htmltextareaelement::{HTMLTextAreaElement, LayoutHTMLTextAreaElementHelpers}; +use crate::dom::htmlvideoelement::{HTMLVideoElement, LayoutHTMLVideoElementHelpers}; use crate::dom::mutationobserver::{Mutation, MutationObserver}; use crate::dom::namednodemap::NamedNodeMap; use crate::dom::node::{ @@ -849,6 +852,8 @@ impl<'dom> LayoutElementHelpers<'dom> for LayoutDom<'dom, Element> { this.get_width() } else if let Some(this) = self.downcast::<HTMLImageElement>() { this.get_width() + } else if let Some(this) = self.downcast::<HTMLVideoElement>() { + this.get_width() } else if let Some(this) = self.downcast::<HTMLTableElement>() { this.get_width() } else if let Some(this) = self.downcast::<HTMLTableCellElement>() { @@ -891,6 +896,8 @@ impl<'dom> LayoutElementHelpers<'dom> for LayoutDom<'dom, Element> { this.get_height() } else if let Some(this) = self.downcast::<HTMLImageElement>() { this.get_height() + } else if let Some(this) = self.downcast::<HTMLVideoElement>() { + this.get_height() } else if let Some(this) = self.downcast::<HTMLTableElement>() { this.get_height() } else if let Some(this) = self.downcast::<HTMLTableCellElement>() { @@ -927,6 +934,27 @@ impl<'dom> LayoutElementHelpers<'dom> for LayoutDom<'dom, Element> { }, } + // Aspect ratio when providing both width and height. + // https://html.spec.whatwg.org/multipage/#attributes-for-embedded-content-and-images + if self.downcast::<HTMLImageElement>().is_some() || + self.downcast::<HTMLVideoElement>().is_some() + { + if let LengthOrPercentageOrAuto::Length(width) = width { + if let LengthOrPercentageOrAuto::Length(height) = height { + let width_value = NonNegative(specified::Number::new(width.to_f32_px())); + let height_value = NonNegative(specified::Number::new(height.to_f32_px())); + let aspect_ratio = specified::position::AspectRatio { + auto: true, + ratio: PreferredRatio::Ratio(Ratio(width_value, height_value)), + }; + hints.push(from_declaration( + shared_lock, + PropertyDeclaration::AspectRatio(aspect_ratio), + )); + } + } + } + let cols = if let Some(this) = self.downcast::<HTMLTextAreaElement>() { match this.get_cols() { 0 => None, |