Auto merge of #29677 - mrobinson:resolved-insets, r=delan

Better implement getComputedStyle() for positioned insets

The specification dictates quite quite idiosyncratic return values when
querying insets of positioned elements via `getComputedStyle()`. These
depend on whether or not the element's size was overconstrained. This
change adds a better implementation of that in preparation for returning
proper values for `position: sticky`.

There are two changes here:
- The containing block used in `FragmentTree::find` is properly computed using the `ContainingBlockManager` data structure. This data structure is now updated during traversal through the fragment tree in `Fragment::find`.
- We now take into account whether or not a absolute elements are overconstrained when calculating their resolved insets. For absolutely positioned elements, this happens during absolute positioning. For relatively positioned elements, we can determine this when a `BoxFragment` is constructed.

---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `___` with appropriate data: -->
- [x] `./mach build -d` does not report any errors
- [x] `./mach test-tidy` does not report any errors
- [x] There are tests for these changes

<!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.-->

<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->
This commit is contained in:
bors-servo 2023-05-09 12:09:51 +02:00 committed by GitHub
commit 818ee77d9d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
26 changed files with 801 additions and 1318 deletions

View file

@ -5,6 +5,7 @@
use crate::cell::ArcRefCell; use crate::cell::ArcRefCell;
use crate::display_list::conversions::ToWebRender; use crate::display_list::conversions::ToWebRender;
use crate::display_list::DisplayListBuilder; use crate::display_list::DisplayListBuilder;
use crate::fragment_tree::ContainingBlockManager;
use crate::fragments::{AnonymousFragment, BoxFragment, Fragment}; use crate::fragments::{AnonymousFragment, BoxFragment, Fragment};
use crate::geom::PhysicalRect; use crate::geom::PhysicalRect;
use crate::style_ext::ComputedValuesExt; use crate::style_ext::ComputedValuesExt;
@ -51,96 +52,6 @@ impl ContainingBlock {
} }
} }
#[derive(Clone)]
pub(crate) struct ContainingBlockManager<'a, T> {
// The containing block for all non-absolute descendants. "...if the element's
// position is 'relative' or 'static', the containing block is formed by the
// content edge of the nearest block container ancestor box." This is also
// the case for 'position: sticky' elements.
// https://www.w3.org/TR/CSS2/visudet.html#containing-block-details
pub for_non_absolute_descendants: &'a T,
// The containing block for absolute descendants. "If the element has
// 'position: absolute', the containing block is
// established by the nearest ancestor with a 'position' of 'absolute',
// 'relative' or 'fixed', in the following way:
// 1. In the case that the ancestor is an inline element, the containing
// block is the bounding box around the padding boxes of the first and the
// last inline boxes generated for that element. In CSS 2.1, if the inline
// element is split across multiple lines, the containing block is
// undefined.
// 2. Otherwise, the containing block is formed by the padding edge of the
// ancestor."
// https://www.w3.org/TR/CSS2/visudet.html#containing-block-details
// If the ancestor forms a containing block for all descendants (see below),
// this value will be None and absolute descendants will use the containing
// block for fixed descendants.
pub for_absolute_descendants: Option<&'a T>,
// The containing block for fixed and absolute descendants.
// "For elements whose layout is governed by the CSS box model, any value
// other than none for the transform property also causes the element to
// establish a containing block for all descendants. Its padding box will be
// used to layout for all of its absolute-position descendants,
// fixed-position descendants, and descendant fixed background attachments."
// https://w3c.github.io/csswg-drafts/css-transforms-1/#containing-block-for-all-descendants
// See `ComputedValues::establishes_containing_block_for_all_descendants`
// for a list of conditions where an element forms a containing block for
// all descendants.
pub for_absolute_and_fixed_descendants: &'a T,
}
impl<'a, T> ContainingBlockManager<'a, T> {
fn get_containing_block_for_fragment(&self, fragment: &Fragment) -> &T {
if let Fragment::Box(box_fragment) = fragment {
match box_fragment.style.clone_position() {
ComputedPosition::Fixed => self.for_absolute_and_fixed_descendants,
ComputedPosition::Absolute => self
.for_absolute_descendants
.unwrap_or(self.for_absolute_and_fixed_descendants),
_ => self.for_non_absolute_descendants,
}
} else {
self.for_non_absolute_descendants
}
}
pub(crate) fn new_for_non_absolute_descendants(
&self,
for_non_absolute_descendants: &'a T,
) -> Self {
return ContainingBlockManager {
for_non_absolute_descendants,
for_absolute_descendants: self.for_absolute_descendants,
for_absolute_and_fixed_descendants: self.for_absolute_and_fixed_descendants,
};
}
pub(crate) fn new_for_absolute_descendants(
&self,
for_non_absolute_descendants: &'a T,
for_absolute_descendants: &'a T,
) -> Self {
return ContainingBlockManager {
for_non_absolute_descendants,
for_absolute_descendants: Some(for_absolute_descendants),
for_absolute_and_fixed_descendants: self.for_absolute_and_fixed_descendants,
};
}
pub(crate) fn new_for_absolute_and_fixed_descendants(
&self,
for_non_absolute_descendants: &'a T,
for_absolute_and_fixed_descendants: &'a T,
) -> Self {
return ContainingBlockManager {
for_non_absolute_descendants,
for_absolute_descendants: None,
for_absolute_and_fixed_descendants,
};
}
}
pub(crate) type ContainingBlockInfo<'a> = ContainingBlockManager<'a, ContainingBlock>; pub(crate) type ContainingBlockInfo<'a> = ContainingBlockManager<'a, ContainingBlock>;
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)] #[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]

View file

@ -15,7 +15,7 @@ use crate::flow::float::FloatBox;
use crate::flow::inline::InlineLevelBox; use crate::flow::inline::InlineLevelBox;
use crate::flow::{BlockContainer, BlockFormattingContext, BlockLevelBox}; use crate::flow::{BlockContainer, BlockFormattingContext, BlockLevelBox};
use crate::formatting_contexts::IndependentFormattingContext; use crate::formatting_contexts::IndependentFormattingContext;
use crate::fragment_tree::Tag; use crate::fragment_tree::{ContainingBlockManager, Tag};
use crate::fragments::Fragment; use crate::fragments::Fragment;
use crate::geom::flow_relative::Vec2; use crate::geom::flow_relative::Vec2;
use crate::geom::{PhysicalPoint, PhysicalRect, PhysicalSize}; use crate::geom::{PhysicalPoint, PhysicalRect, PhysicalSize};
@ -457,11 +457,14 @@ impl FragmentTree {
&self, &self,
mut process_func: impl FnMut(&Fragment, usize, &PhysicalRect<Length>) -> Option<T>, mut process_func: impl FnMut(&Fragment, usize, &PhysicalRect<Length>) -> Option<T>,
) -> Option<T> { ) -> Option<T> {
self.root_fragments.iter().find_map(|child| { let info = ContainingBlockManager {
child for_non_absolute_descendants: &self.initial_containing_block,
.borrow() for_absolute_descendants: None,
.find(&self.initial_containing_block, 0, &mut process_func) for_absolute_and_fixed_descendants: &self.initial_containing_block,
}) };
self.root_fragments
.iter()
.find_map(|child| child.borrow().find(&info, 0, &mut process_func))
} }
pub fn remove_nodes_in_fragment_tree_from_set(&self, set: &mut FxHashSet<AnimationSetKey>) { pub fn remove_nodes_in_fragment_tree_from_set(&self, set: &mut FxHashSet<AnimationSetKey>) {

View file

@ -0,0 +1,99 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
use crate::fragments::Fragment;
use style::computed_values::position::T as ComputedPosition;
/// A data structure used to track the containing block when recursing
/// through the Fragment tree. It tracks the three types of containing
/// blocks (for all descendants, for absolute and fixed position
/// descendants, and for fixed position descendants).
pub(crate) struct ContainingBlockManager<'a, T> {
// The containing block for all non-absolute descendants. "...if the element's
// position is 'relative' or 'static', the containing block is formed by the
// content edge of the nearest block container ancestor box." This is also
// the case for 'position: sticky' elements.
// https://www.w3.org/TR/CSS2/visudet.html#containing-block-details
pub for_non_absolute_descendants: &'a T,
// The containing block for absolute descendants. "If the element has
// 'position: absolute', the containing block is
// established by the nearest ancestor with a 'position' of 'absolute',
// 'relative' or 'fixed', in the following way:
// 1. In the case that the ancestor is an inline element, the containing
// block is the bounding box around the padding boxes of the first and the
// last inline boxes generated for that element. In CSS 2.1, if the inline
// element is split across multiple lines, the containing block is
// undefined.
// 2. Otherwise, the containing block is formed by the padding edge of the
// ancestor."
// https://www.w3.org/TR/CSS2/visudet.html#containing-block-details
// If the ancestor forms a containing block for all descendants (see below),
// this value will be None and absolute descendants will use the containing
// block for fixed descendants.
pub for_absolute_descendants: Option<&'a T>,
// The containing block for fixed and absolute descendants.
// "For elements whose layout is governed by the CSS box model, any value
// other than none for the transform property also causes the element to
// establish a containing block for all descendants. Its padding box will be
// used to layout for all of its absolute-position descendants,
// fixed-position descendants, and descendant fixed background attachments."
// https://w3c.github.io/csswg-drafts/css-transforms-1/#containing-block-for-all-descendants
// See `ComputedValues::establishes_containing_block_for_all_descendants`
// for a list of conditions where an element forms a containing block for
// all descendants.
pub for_absolute_and_fixed_descendants: &'a T,
}
impl<'a, T> ContainingBlockManager<'a, T> {
pub(crate) fn get_containing_block_for_fragment(&self, fragment: &Fragment) -> &T {
if let Fragment::Box(box_fragment) = fragment {
match box_fragment.style.clone_position() {
ComputedPosition::Fixed => self.for_absolute_and_fixed_descendants,
ComputedPosition::Absolute => self
.for_absolute_descendants
.unwrap_or(self.for_absolute_and_fixed_descendants),
_ => self.for_non_absolute_descendants,
}
} else {
self.for_non_absolute_descendants
}
}
pub(crate) fn new_for_non_absolute_descendants(
&self,
for_non_absolute_descendants: &'a T,
) -> Self {
return ContainingBlockManager {
for_non_absolute_descendants,
for_absolute_descendants: self.for_absolute_descendants,
for_absolute_and_fixed_descendants: self.for_absolute_and_fixed_descendants,
};
}
pub(crate) fn new_for_absolute_descendants(
&self,
for_non_absolute_descendants: &'a T,
for_absolute_descendants: &'a T,
) -> Self {
return ContainingBlockManager {
for_non_absolute_descendants,
for_absolute_descendants: Some(for_absolute_descendants),
for_absolute_and_fixed_descendants: self.for_absolute_and_fixed_descendants,
};
}
pub(crate) fn new_for_absolute_and_fixed_descendants(
&self,
for_non_absolute_descendants: &'a T,
for_absolute_and_fixed_descendants: &'a T,
) -> Self {
return ContainingBlockManager {
for_non_absolute_descendants,
for_absolute_descendants: None,
for_absolute_and_fixed_descendants,
};
}
}

View file

@ -3,5 +3,7 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
mod base; mod base;
mod containing_block;
pub(crate) use base::*; pub(crate) use base::*;
pub(crate) use containing_block::*;

View file

@ -3,10 +3,11 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
use crate::cell::ArcRefCell; use crate::cell::ArcRefCell;
use crate::fragment_tree::{BaseFragment, BaseFragmentInfo, Tag}; use crate::fragment_tree::{BaseFragment, BaseFragmentInfo, ContainingBlockManager, Tag};
use crate::geom::flow_relative::{Rect, Sides}; use crate::geom::flow_relative::{Rect, Sides};
use crate::geom::{PhysicalPoint, PhysicalRect}; use crate::geom::{PhysicalPoint, PhysicalRect, PhysicalSides, PhysicalSize};
use crate::positioned::HoistedSharedFragment; use crate::positioned::HoistedSharedFragment;
use crate::style_ext::ComputedValuesExt;
use gfx::font::FontMetrics as GfxFontMetrics; use gfx::font::FontMetrics as GfxFontMetrics;
use gfx::text::glyph::GlyphStore; use gfx::text::glyph::GlyphStore;
use gfx_traits::print_tree::PrintTree; use gfx_traits::print_tree::PrintTree;
@ -14,9 +15,10 @@ use msg::constellation_msg::{BrowsingContextId, PipelineId};
use servo_arc::Arc as ServoArc; use servo_arc::Arc as ServoArc;
use std::sync::Arc; use std::sync::Arc;
use style::computed_values::overflow_x::T as ComputedOverflow; use style::computed_values::overflow_x::T as ComputedOverflow;
use style::computed_values::position::T as ComputedPosition;
use style::logical_geometry::WritingMode; use style::logical_geometry::WritingMode;
use style::properties::ComputedValues; use style::properties::ComputedValues;
use style::values::computed::Length; use style::values::computed::{CSSPixelLength, Length, LengthPercentage, LengthPercentageOrAuto};
use style::values::specified::text::TextDecorationLine; use style::values::specified::text::TextDecorationLine;
use style::Zero; use style::Zero;
use webrender_api::{FontInstanceKey, ImageKey}; use webrender_api::{FontInstanceKey, ImageKey};
@ -59,6 +61,9 @@ pub(crate) struct BoxFragment {
/// The scrollable overflow of this box fragment. /// The scrollable overflow of this box fragment.
pub scrollable_overflow_from_children: PhysicalRect<Length>, pub scrollable_overflow_from_children: PhysicalRect<Length>,
/// Whether or not this box was overconstrained in the given dimension.
overconstrained: PhysicalSize<bool>,
} }
#[derive(Serialize)] #[derive(Serialize)]
@ -207,36 +212,54 @@ impl Fragment {
pub(crate) fn find<T>( pub(crate) fn find<T>(
&self, &self,
containing_block: &PhysicalRect<Length>, manager: &ContainingBlockManager<PhysicalRect<Length>>,
level: usize, level: usize,
process_func: &mut impl FnMut(&Fragment, usize, &PhysicalRect<Length>) -> Option<T>, process_func: &mut impl FnMut(&Fragment, usize, &PhysicalRect<Length>) -> Option<T>,
) -> Option<T> { ) -> Option<T> {
let containing_block = manager.get_containing_block_for_fragment(self);
if let Some(result) = process_func(self, level, containing_block) { if let Some(result) = process_func(self, level, containing_block) {
return Some(result); return Some(result);
} }
match self { match self {
Fragment::Box(fragment) => { Fragment::Box(fragment) => {
let new_containing_block = fragment let content_rect = fragment
.content_rect .content_rect
.to_physical(fragment.style.writing_mode, containing_block) .to_physical(fragment.style.writing_mode, containing_block)
.translate(containing_block.origin.to_vector()); .translate(containing_block.origin.to_vector());
fragment.children.iter().find_map(|child| { let padding_rect = fragment
child .padding_rect()
.borrow() .to_physical(fragment.style.writing_mode, containing_block)
.find(&new_containing_block, level + 1, process_func) .translate(containing_block.origin.to_vector());
}) let new_manager = if fragment
.style
.establishes_containing_block_for_all_descendants()
{
manager.new_for_absolute_and_fixed_descendants(&content_rect, &padding_rect)
} else if fragment
.style
.establishes_containing_block_for_absolute_descendants()
{
manager.new_for_absolute_descendants(&content_rect, &padding_rect)
} else {
manager.new_for_non_absolute_descendants(&content_rect)
};
fragment
.children
.iter()
.find_map(|child| child.borrow().find(&new_manager, level + 1, process_func))
}, },
Fragment::Anonymous(fragment) => { Fragment::Anonymous(fragment) => {
let new_containing_block = fragment let content_rect = fragment
.rect .rect
.to_physical(fragment.mode, containing_block) .to_physical(fragment.mode, containing_block)
.translate(containing_block.origin.to_vector()); .translate(containing_block.origin.to_vector());
fragment.children.iter().find_map(|child| { let new_manager = manager.new_for_non_absolute_descendants(&content_rect);
child fragment
.borrow() .children
.find(&new_containing_block, level + 1, process_func) .iter()
}) .find_map(|child| child.borrow().find(&new_manager, level + 1, process_func))
}, },
_ => None, _ => None,
} }
@ -303,6 +326,39 @@ impl BoxFragment {
border: Sides<Length>, border: Sides<Length>,
margin: Sides<Length>, margin: Sides<Length>,
block_margins_collapsed_with_children: CollapsedBlockMargins, block_margins_collapsed_with_children: CollapsedBlockMargins,
) -> BoxFragment {
let position = style.get_box().position;
let insets = style.get_position();
let width_overconstrained = position == ComputedPosition::Relative &&
!insets.left.is_auto() &&
!insets.right.is_auto();
let height_overconstrained = position == ComputedPosition::Relative &&
!insets.left.is_auto() &&
!insets.bottom.is_auto();
Self::new_with_overconstrained(
base_fragment_info,
style,
children,
content_rect,
padding,
border,
margin,
block_margins_collapsed_with_children,
PhysicalSize::new(width_overconstrained, height_overconstrained),
)
}
pub fn new_with_overconstrained(
base_fragment_info: BaseFragmentInfo,
style: ServoArc<ComputedValues>,
children: Vec<Fragment>,
content_rect: Rect<Length>,
padding: Sides<Length>,
border: Sides<Length>,
margin: Sides<Length>,
block_margins_collapsed_with_children: CollapsedBlockMargins,
overconstrained: PhysicalSize<bool>,
) -> BoxFragment { ) -> BoxFragment {
// FIXME(mrobinson, bug 25564): We should be using the containing block // FIXME(mrobinson, bug 25564): We should be using the containing block
// here to properly convert scrollable overflow to physical geometry. // here to properly convert scrollable overflow to physical geometry.
@ -311,6 +367,7 @@ impl BoxFragment {
children.iter().fold(PhysicalRect::zero(), |acc, child| { children.iter().fold(PhysicalRect::zero(), |acc, child| {
acc.union(&child.scrollable_overflow(&containing_block)) acc.union(&child.scrollable_overflow(&containing_block))
}); });
BoxFragment { BoxFragment {
base: base_fragment_info.into(), base: base_fragment_info.into(),
style, style,
@ -324,6 +381,7 @@ impl BoxFragment {
margin, margin,
block_margins_collapsed_with_children, block_margins_collapsed_with_children,
scrollable_overflow_from_children, scrollable_overflow_from_children,
overconstrained,
} }
} }
@ -363,6 +421,7 @@ impl BoxFragment {
\nborder rect={:?}\ \nborder rect={:?}\
\nscrollable_overflow={:?}\ \nscrollable_overflow={:?}\
\noverflow={:?} / {:?}\ \noverflow={:?} / {:?}\
\noverconstrained={:?}
\nstyle={:p}", \nstyle={:p}",
self.base, self.base,
self.content_rect, self.content_rect,
@ -371,6 +430,7 @@ impl BoxFragment {
self.scrollable_overflow(&PhysicalRect::zero()), self.scrollable_overflow(&PhysicalRect::zero()),
self.style.get_box().overflow_x, self.style.get_box().overflow_x,
self.style.get_box().overflow_y, self.style.get_box().overflow_y,
self.overconstrained,
self.style, self.style,
)); ));
@ -414,6 +474,81 @@ impl BoxFragment {
overflow overflow
} }
pub(crate) fn calculate_resolved_insets_if_positioned(
&self,
containing_block: &PhysicalRect<CSSPixelLength>,
) -> PhysicalSides<CSSPixelLength> {
let position = self.style.get_box().position;
debug_assert_ne!(
position,
ComputedPosition::Static,
"Should not call this method on statically positioned box."
);
let (cb_width, cb_height) = (containing_block.width(), containing_block.height());
let content_rect = self
.content_rect
.to_physical(self.style.writing_mode, &containing_block);
// "A resolved value special case property like top defined in another
// specification If the property applies to a positioned element and the
// resolved value of the display property is not none or contents, and
// the property is not over-constrained, then the resolved value is the
// used value. Otherwise the resolved value is the computed value."
// https://drafts.csswg.org/cssom/#resolved-values
let insets = self.style.get_position();
if position == ComputedPosition::Relative {
let get_resolved_axis =
|start: &LengthPercentageOrAuto,
end: &LengthPercentageOrAuto,
container_length: CSSPixelLength| {
let start = start.map(|v| v.percentage_relative_to(container_length));
let end = end.map(|v| v.percentage_relative_to(container_length));
match (start.non_auto(), end.non_auto()) {
(None, None) => (Length::zero(), Length::zero()),
(None, Some(end)) => (-end, end),
(Some(start), None) => (start, -start),
// This is the overconstrained case, for which the resolved insets will
// simply be the computed insets.
(Some(start), Some(end)) => (start, end),
}
};
let (left, right) = get_resolved_axis(&insets.left, &insets.right, cb_width);
let (top, bottom) = get_resolved_axis(&insets.top, &insets.bottom, cb_height);
return PhysicalSides::new(top, right, bottom, left);
}
debug_assert!(
position == ComputedPosition::Fixed || position == ComputedPosition::Absolute,
"Got unknown position."
);
let resolve = |value: &LengthPercentageOrAuto, container_length| {
value
.auto_is(LengthPercentage::zero)
.percentage_relative_to(container_length)
};
let (top, bottom) = if self.overconstrained.height {
(
resolve(&insets.top, cb_height),
resolve(&insets.bottom, cb_height),
)
} else {
(content_rect.origin.y, cb_height - content_rect.max_y())
};
let (left, right) = if self.overconstrained.width {
(
resolve(&insets.left, cb_width),
resolve(&insets.right, cb_width),
)
} else {
(content_rect.origin.x, cb_width - content_rect.max_x())
};
PhysicalSides::new(top, right, bottom, left)
}
} }
impl TextFragment { impl TextFragment {

View file

@ -93,6 +93,13 @@ pub(crate) enum AbsoluteBoxOffsets {
} }
impl AbsoluteBoxOffsets { impl AbsoluteBoxOffsets {
fn both_specified(&self) -> bool {
match self {
AbsoluteBoxOffsets::Both { .. } => return true,
_ => return false,
}
}
fn adjust_offset(&mut self, new_offset: Length) { fn adjust_offset(&mut self, new_offset: Length) {
match *self { match *self {
AbsoluteBoxOffsets::StaticStart { ref mut start } => *start = new_offset, AbsoluteBoxOffsets::StaticStart { ref mut start } => *start = new_offset,
@ -444,32 +451,30 @@ impl HoistedAbsolutelyPositionedBox {
}; };
let shared_fragment = self.fragment.borrow(); let shared_fragment = self.fragment.borrow();
let inline_axis_solver = AbsoluteAxisSolver {
let solve_inline_axis = |computed_size| { containing_size: cbis,
solve_axis( padding_border_sum: pbm.padding_border_sums.inline,
cbis, computed_margin_start: pbm.margin.inline_start,
pbm.padding_border_sums.inline, computed_margin_end: pbm.margin.inline_end,
pbm.margin.inline_start, avoid_negative_margin_start: true,
pbm.margin.inline_end, box_offsets: &shared_fragment.box_offsets.inline,
/* avoid_negative_margin_start */ true,
&shared_fragment.box_offsets.inline,
computed_size,
)
};
let solve_block_axis = |computed_size| {
solve_axis(
cbbs,
pbm.padding_border_sums.block,
pbm.margin.block_start,
pbm.margin.block_end,
/* avoid_negative_margin_start */ false,
&shared_fragment.box_offsets.block,
computed_size,
)
}; };
let mut inline_axis = solve_inline_axis(computed_size.inline); let block_axis_solver = AbsoluteAxisSolver {
let mut block_axis = solve_block_axis(computed_size.block); containing_size: cbbs,
padding_border_sum: pbm.padding_border_sums.block,
computed_margin_start: pbm.margin.block_start,
computed_margin_end: pbm.margin.block_end,
avoid_negative_margin_start: false,
box_offsets: &shared_fragment.box_offsets.block,
};
let overconstrained = Vec2 {
inline: inline_axis_solver.is_overconstrained_for_size(computed_size.inline),
block: block_axis_solver.is_overconstrained_for_size(computed_size.block),
};
let mut inline_axis = inline_axis_solver.solve_for_size(computed_size.inline);
let mut block_axis = block_axis_solver.solve_for_size(computed_size.block);
let mut positioning_context = let mut positioning_context =
PositioningContext::new_for_style(absolutely_positioned_box.context.style()).unwrap(); PositioningContext::new_for_style(absolutely_positioned_box.context.style()).unwrap();
@ -519,7 +524,8 @@ impl HoistedAbsolutelyPositionedBox {
// https://drafts.csswg.org/css2/#min-max-widths (step 2) // https://drafts.csswg.org/css2/#min-max-widths (step 2)
if let Some(max) = max_size.inline { if let Some(max) = max_size.inline {
if inline_size > max { if inline_size > max {
inline_axis = solve_inline_axis(LengthOrAuto::LengthPercentage(max)); inline_axis = inline_axis_solver
.solve_for_size(LengthOrAuto::LengthPercentage(max));
inline_size = inline_axis.size.auto_is(|| unreachable!()); inline_size = inline_axis.size.auto_is(|| unreachable!());
} }
} }
@ -530,8 +536,8 @@ impl HoistedAbsolutelyPositionedBox {
// because a non-auto computed inline-size always becomes the used value. // because a non-auto computed inline-size always becomes the used value.
// https://drafts.csswg.org/css2/#min-max-widths (step 3) // https://drafts.csswg.org/css2/#min-max-widths (step 3)
if inline_size < min_size.inline { if inline_size < min_size.inline {
inline_axis = inline_axis = inline_axis_solver
solve_inline_axis(LengthOrAuto::LengthPercentage(min_size.inline)); .solve_for_size(LengthOrAuto::LengthPercentage(min_size.inline));
inline_size = inline_axis.size.auto_is(|| unreachable!()); inline_size = inline_axis.size.auto_is(|| unreachable!());
} }
@ -581,7 +587,8 @@ impl HoistedAbsolutelyPositionedBox {
// https://drafts.csswg.org/css2/#min-max-heights (step 2) // https://drafts.csswg.org/css2/#min-max-heights (step 2)
if let Some(max) = max_size.block { if let Some(max) = max_size.block {
if result.content_size.block > max { if result.content_size.block > max {
block_axis = solve_block_axis(LengthOrAuto::LengthPercentage(max)); block_axis = block_axis_solver
.solve_for_size(LengthOrAuto::LengthPercentage(max));
result = try_layout(LengthOrAuto::LengthPercentage(max)); result = try_layout(LengthOrAuto::LengthPercentage(max));
} }
} }
@ -592,8 +599,8 @@ impl HoistedAbsolutelyPositionedBox {
// because a non-auto computed block-size always becomes the used value. // because a non-auto computed block-size always becomes the used value.
// https://drafts.csswg.org/css2/#min-max-heights (step 3) // https://drafts.csswg.org/css2/#min-max-heights (step 3)
if result.content_size.block < min_size.block { if result.content_size.block < min_size.block {
block_axis = block_axis = block_axis_solver
solve_block_axis(LengthOrAuto::LengthPercentage(min_size.block)); .solve_for_size(LengthOrAuto::LengthPercentage(min_size.block));
result = try_layout(LengthOrAuto::LengthPercentage(min_size.block)); result = try_layout(LengthOrAuto::LengthPercentage(min_size.block));
} }
@ -631,7 +638,10 @@ impl HoistedAbsolutelyPositionedBox {
size: content_size, size: content_size,
}; };
BoxFragment::new( let physical_overconstrained =
overconstrained.to_physical(containing_block.style.writing_mode);
BoxFragment::new_with_overconstrained(
absolutely_positioned_box.context.base_fragment_info(), absolutely_positioned_box.context.base_fragment_info(),
absolutely_positioned_box.context.style().clone(), absolutely_positioned_box.context.style().clone(),
fragments, fragments,
@ -640,6 +650,7 @@ impl HoistedAbsolutelyPositionedBox {
pbm.border, pbm.border,
margin, margin,
CollapsedBlockMargins::zero(), CollapsedBlockMargins::zero(),
physical_overconstrained,
) )
}; };
positioning_context.layout_collected_children(layout_context, &mut new_fragment); positioning_context.layout_collected_children(layout_context, &mut new_fragment);
@ -661,6 +672,16 @@ struct AxisResult {
margin_end: Length, margin_end: Length,
} }
struct AbsoluteAxisSolver<'a> {
containing_size: Length,
padding_border_sum: Length,
computed_margin_start: LengthOrAuto,
computed_margin_end: LengthOrAuto,
avoid_negative_margin_start: bool,
box_offsets: &'a AbsoluteBoxOffsets,
}
impl<'a> AbsoluteAxisSolver<'a> {
/// This unifies some of the parts in common in: /// This unifies some of the parts in common in:
/// ///
/// * https://drafts.csswg.org/css2/visudet.html#abs-non-replaced-width /// * https://drafts.csswg.org/css2/visudet.html#abs-non-replaced-width
@ -672,47 +693,39 @@ struct AxisResult {
/// * https://drafts.csswg.org/css2/visudet.html#abs-replaced-height /// * https://drafts.csswg.org/css2/visudet.html#abs-replaced-height
/// ///
/// In the replaced case, `size` is never `Auto`. /// In the replaced case, `size` is never `Auto`.
fn solve_axis( fn solve_for_size(&self, computed_size: LengthOrAuto) -> AxisResult {
containing_size: Length, match self.box_offsets {
padding_border_sum: Length,
computed_margin_start: LengthOrAuto,
computed_margin_end: LengthOrAuto,
avoid_negative_margin_start: bool,
box_offsets: &AbsoluteBoxOffsets,
computed_size: LengthOrAuto,
) -> AxisResult {
match box_offsets {
AbsoluteBoxOffsets::StaticStart { start } => AxisResult { AbsoluteBoxOffsets::StaticStart { start } => AxisResult {
anchor: Anchor::Start(*start), anchor: Anchor::Start(*start),
size: computed_size, size: computed_size,
margin_start: computed_margin_start.auto_is(Length::zero), margin_start: self.computed_margin_start.auto_is(Length::zero),
margin_end: computed_margin_end.auto_is(Length::zero), margin_end: self.computed_margin_end.auto_is(Length::zero),
}, },
AbsoluteBoxOffsets::Start { start } => AxisResult { AbsoluteBoxOffsets::Start { start } => AxisResult {
anchor: Anchor::Start(start.percentage_relative_to(containing_size)), anchor: Anchor::Start(start.percentage_relative_to(self.containing_size)),
size: computed_size, size: computed_size,
margin_start: computed_margin_start.auto_is(Length::zero), margin_start: self.computed_margin_start.auto_is(Length::zero),
margin_end: computed_margin_end.auto_is(Length::zero), margin_end: self.computed_margin_end.auto_is(Length::zero),
}, },
AbsoluteBoxOffsets::End { end } => AxisResult { AbsoluteBoxOffsets::End { end } => AxisResult {
anchor: Anchor::End(end.percentage_relative_to(containing_size)), anchor: Anchor::End(end.percentage_relative_to(self.containing_size)),
size: computed_size, size: computed_size,
margin_start: computed_margin_start.auto_is(Length::zero), margin_start: self.computed_margin_start.auto_is(Length::zero),
margin_end: computed_margin_end.auto_is(Length::zero), margin_end: self.computed_margin_end.auto_is(Length::zero),
}, },
AbsoluteBoxOffsets::Both { start, end } => { AbsoluteBoxOffsets::Both { start, end } => {
let start = start.percentage_relative_to(containing_size); let start = start.percentage_relative_to(self.containing_size);
let end = end.percentage_relative_to(containing_size); let end = end.percentage_relative_to(self.containing_size);
let margin_start; let margin_start;
let margin_end; let margin_end;
let used_size; let used_size;
if let LengthOrAuto::LengthPercentage(s) = computed_size { if let LengthOrAuto::LengthPercentage(s) = computed_size {
used_size = s; used_size = s;
let margins = containing_size - start - end - padding_border_sum - s; let margins = self.containing_size - start - end - self.padding_border_sum - s;
match (computed_margin_start, computed_margin_end) { match (self.computed_margin_start, self.computed_margin_end) {
(LengthOrAuto::Auto, LengthOrAuto::Auto) => { (LengthOrAuto::Auto, LengthOrAuto::Auto) => {
if avoid_negative_margin_start && margins < Length::zero() { if self.avoid_negative_margin_start && margins < Length::zero() {
margin_start = Length::zero(); margin_start = Length::zero();
margin_end = margins; margin_end = margins;
} else { } else {
@ -737,13 +750,17 @@ fn solve_axis(
}, },
} }
} else { } else {
margin_start = computed_margin_start.auto_is(Length::zero); margin_start = self.computed_margin_start.auto_is(Length::zero);
margin_end = computed_margin_end.auto_is(Length::zero); margin_end = self.computed_margin_end.auto_is(Length::zero);
// This may be negative, but the caller will later effectively // This may be negative, but the caller will later effectively
// clamp it to min-inline-size or min-block-size. // clamp it to min-inline-size or min-block-size.
used_size = used_size = self.containing_size -
containing_size - start - end - padding_border_sum - margin_start - margin_end start -
end -
self.padding_border_sum -
margin_start -
margin_end;
}; };
AxisResult { AxisResult {
anchor: Anchor::Start(start), anchor: Anchor::Start(start),
@ -755,6 +772,14 @@ fn solve_axis(
} }
} }
fn is_overconstrained_for_size(&self, computed_size: LengthOrAuto) -> bool {
!computed_size.is_auto() &&
self.box_offsets.both_specified() &&
!self.computed_margin_start.is_auto() &&
!self.computed_margin_end.is_auto()
}
}
fn adjust_static_positions( fn adjust_static_positions(
absolutely_positioned_fragments: &mut [HoistedAbsolutelyPositionedBox], absolutely_positioned_fragments: &mut [HoistedAbsolutelyPositionedBox],
child_fragments: &[Fragment], child_fragments: &[Fragment],
@ -796,6 +821,10 @@ pub(crate) fn relative_adjustement(
style: &ComputedValues, style: &ComputedValues,
containing_block: &ContainingBlock, containing_block: &ContainingBlock,
) -> Vec2<Length> { ) -> Vec2<Length> {
// "If the height of the containing block is not specified explicitly (i.e.,
// it depends on content height), and this element is not absolutely
// positioned, the value computes to 'auto'.""
// https://www.w3.org/TR/CSS2/visudet.html#the-height-property
let cbis = containing_block.inline_size; let cbis = containing_block.inline_size;
let cbbs = containing_block.block_size.auto_is(Length::zero); let cbbs = containing_block.block_size.auto_is(Length::zero);
let box_offsets = style let box_offsets = style

View file

@ -306,7 +306,18 @@ pub fn process_resolved_style_request<'dom>(
_ => return None, _ => return None,
}; };
let positioned = style.get_box().position != Position::Static; if style.get_box().position != Position::Static {
let resolved_insets =
|| box_fragment.calculate_resolved_insets_if_positioned(containing_block);
match longhand_id {
LonghandId::Top => return Some(resolved_insets().top.to_css_string()),
LonghandId::Right => return Some(resolved_insets().right.to_css_string()),
LonghandId::Bottom => return Some(resolved_insets().bottom.to_css_string()),
LonghandId::Left => return Some(resolved_insets().left.to_css_string()),
_ => {},
}
}
let content_rect = box_fragment let content_rect = box_fragment
.content_rect .content_rect
.to_physical(box_fragment.style.writing_mode, &containing_block); .to_physical(box_fragment.style.writing_mode, &containing_block);
@ -327,13 +338,6 @@ pub fn process_resolved_style_request<'dom>(
LonghandId::PaddingTop => Some(padding.top), LonghandId::PaddingTop => Some(padding.top),
LonghandId::PaddingLeft => Some(padding.left), LonghandId::PaddingLeft => Some(padding.left),
LonghandId::PaddingRight => Some(padding.right), LonghandId::PaddingRight => Some(padding.right),
// TODO(mrobinson): These following values are often wrong, because these are not
// exactly the "used value" for the positional properties. The real used values are
// lost by the time the Fragment tree is constructed, so we may need to record them in
// the tree to properly answer this query. That said, we can return an okayish value
// sometimes simply by using the calculated position in the containing block.
LonghandId::Top if positioned => Some(content_rect.origin.y),
LonghandId::Left if positioned => Some(content_rect.origin.x),
_ => None, _ => None,
} }
.map(|value| value.to_css_string()) .map(|value| value.to_css_string())

View file

@ -34,3 +34,39 @@
[.container > div 24] [.container > div 24]
expected: FAIL expected: FAIL
[.container > div 2]
expected: FAIL
[.container > div 3]
expected: FAIL
[.container > div 4]
expected: FAIL
[.container > div 7]
expected: FAIL
[.container > div 9]
expected: FAIL
[.container > div 11]
expected: FAIL
[.container > div 14]
expected: FAIL
[.container > div 15]
expected: FAIL
[.container > div 16]
expected: FAIL
[.container > div 19]
expected: FAIL
[.container > div 21]
expected: FAIL
[.container > div 23]
expected: FAIL

View file

@ -46,3 +46,27 @@
[.container > div 23] [.container > div 23]
expected: FAIL expected: FAIL
[.container > div 4]
expected: FAIL
[.container > div 7]
expected: FAIL
[.container > div 9]
expected: FAIL
[.container > div 12]
expected: FAIL
[.container > div 16]
expected: FAIL
[.container > div 19]
expected: FAIL
[.container > div 21]
expected: FAIL
[.container > div 24]
expected: FAIL

View file

@ -34,3 +34,39 @@
[.container > div 24] [.container > div 24]
expected: FAIL expected: FAIL
[.container > div 2]
expected: FAIL
[.container > div 3]
expected: FAIL
[.container > div 4]
expected: FAIL
[.container > div 7]
expected: FAIL
[.container > div 9]
expected: FAIL
[.container > div 11]
expected: FAIL
[.container > div 14]
expected: FAIL
[.container > div 15]
expected: FAIL
[.container > div 16]
expected: FAIL
[.container > div 19]
expected: FAIL
[.container > div 21]
expected: FAIL
[.container > div 23]
expected: FAIL

View file

@ -46,3 +46,27 @@
[.container > div 23] [.container > div 23]
expected: FAIL expected: FAIL
[.container > div 4]
expected: FAIL
[.container > div 7]
expected: FAIL
[.container > div 9]
expected: FAIL
[.container > div 12]
expected: FAIL
[.container > div 16]
expected: FAIL
[.container > div 19]
expected: FAIL
[.container > div 21]
expected: FAIL
[.container > div 24]
expected: FAIL

View file

@ -46,3 +46,27 @@
[.container > div 23] [.container > div 23]
expected: FAIL expected: FAIL
[.container > div 5]
expected: FAIL
[.container > div 8]
expected: FAIL
[.container > div 10]
expected: FAIL
[.container > div 12]
expected: FAIL
[.container > div 17]
expected: FAIL
[.container > div 20]
expected: FAIL
[.container > div 22]
expected: FAIL
[.container > div 24]
expected: FAIL

View file

@ -46,3 +46,27 @@
[.container > div 23] [.container > div 23]
expected: FAIL expected: FAIL
[.container > div 5]
expected: FAIL
[.container > div 8]
expected: FAIL
[.container > div 9]
expected: FAIL
[.container > div 12]
expected: FAIL
[.container > div 17]
expected: FAIL
[.container > div 20]
expected: FAIL
[.container > div 21]
expected: FAIL
[.container > div 24]
expected: FAIL

View file

@ -58,3 +58,27 @@
[.container > div 28] [.container > div 28]
expected: FAIL expected: FAIL
[.container > div 5]
expected: FAIL
[.container > div 8]
expected: FAIL
[.container > div 10]
expected: FAIL
[.container > div 12]
expected: FAIL
[.container > div 19]
expected: FAIL
[.container > div 22]
expected: FAIL
[.container > div 24]
expected: FAIL
[.container > div 26]
expected: FAIL

View file

@ -58,3 +58,27 @@
[.container > div 28] [.container > div 28]
expected: FAIL expected: FAIL
[.container > div 5]
expected: FAIL
[.container > div 8]
expected: FAIL
[.container > div 9]
expected: FAIL
[.container > div 12]
expected: FAIL
[.container > div 19]
expected: FAIL
[.container > div 22]
expected: FAIL
[.container > div 23]
expected: FAIL
[.container > div 26]
expected: FAIL

View file

@ -34,3 +34,39 @@
[.container > div 24] [.container > div 24]
expected: FAIL expected: FAIL
[.container > div 1]
expected: FAIL
[.container > div 2]
expected: FAIL
[.container > div 5]
expected: FAIL
[.container > div 7]
expected: FAIL
[.container > div 9]
expected: FAIL
[.container > div 11]
expected: FAIL
[.container > div 13]
expected: FAIL
[.container > div 14]
expected: FAIL
[.container > div 17]
expected: FAIL
[.container > div 19]
expected: FAIL
[.container > div 21]
expected: FAIL
[.container > div 23]
expected: FAIL

View file

@ -52,3 +52,21 @@
[.container > div 24] [.container > div 24]
expected: FAIL expected: FAIL
[.container > div 7]
expected: FAIL
[.container > div 10]
expected: FAIL
[.container > div 11]
expected: FAIL
[.container > div 19]
expected: FAIL
[.container > div 22]
expected: FAIL
[.container > div 23]
expected: FAIL

View file

@ -28,3 +28,45 @@
[.container > div 22] [.container > div 22]
expected: FAIL expected: FAIL
[.container > div 1]
expected: FAIL
[.container > div 2]
expected: FAIL
[.container > div 5]
expected: FAIL
[.container > div 7]
expected: FAIL
[.container > div 9]
expected: FAIL
[.container > div 11]
expected: FAIL
[.container > div 12]
expected: FAIL
[.container > div 13]
expected: FAIL
[.container > div 14]
expected: FAIL
[.container > div 17]
expected: FAIL
[.container > div 19]
expected: FAIL
[.container > div 21]
expected: FAIL
[.container > div 23]
expected: FAIL
[.container > div 24]
expected: FAIL

View file

@ -46,3 +46,27 @@
[.container > div 21] [.container > div 21]
expected: FAIL expected: FAIL
[.container > div 7]
expected: FAIL
[.container > div 10]
expected: FAIL
[.container > div 11]
expected: FAIL
[.container > div 12]
expected: FAIL
[.container > div 19]
expected: FAIL
[.container > div 22]
expected: FAIL
[.container > div 23]
expected: FAIL
[.container > div 24]
expected: FAIL

View file

@ -52,3 +52,21 @@
[.container > div 24] [.container > div 24]
expected: FAIL expected: FAIL
[.container > div 8]
expected: FAIL
[.container > div 10]
expected: FAIL
[.container > div 11]
expected: FAIL
[.container > div 20]
expected: FAIL
[.container > div 22]
expected: FAIL
[.container > div 23]
expected: FAIL

View file

@ -52,3 +52,21 @@
[.container > div 24] [.container > div 24]
expected: FAIL expected: FAIL
[.container > div 8]
expected: FAIL
[.container > div 10]
expected: FAIL
[.container > div 11]
expected: FAIL
[.container > div 20]
expected: FAIL
[.container > div 22]
expected: FAIL
[.container > div 23]
expected: FAIL

View file

@ -22,3 +22,15 @@
[.rect 16] [.rect 16]
expected: FAIL expected: FAIL
[.rect 1]
expected: FAIL
[.rect 2]
expected: FAIL
[.rect 3]
expected: FAIL
[.rect 4]
expected: FAIL

View file

@ -1,7 +1,3 @@
[computed-style-005.html] [computed-style-005.html]
[relative_computed_left_and_right]
expected: FAIL
[absolute_computed_left_and_right] [absolute_computed_left_and_right]
expected: FAIL expected: FAIL

View file

@ -2,75 +2,18 @@
[vertical-lr ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value] [vertical-lr ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-rl ltr inside vertical-rl rtl - Percentages are absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside horizontal-tb rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside vertical-rl rtl - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[horizontal-tb rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[horizontal-tb rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained] [horizontal-tb rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-lr ltr inside horizontal-tb rtl - Percentages are absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained] [horizontal-tb ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-rl ltr inside vertical-lr ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained] [vertical-rl rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-rl ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr ltr inside vertical-lr ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr rtl inside horizontal-tb ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside horizontal-tb ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr ltr inside vertical-lr rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr rtl inside vertical-rl ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr ltr inside horizontal-tb rtl - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside vertical-lr rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value] [vertical-lr rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[horizontal-tb rtl inside horizontal-tb rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained] [vertical-lr rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
@ -83,222 +26,90 @@
[vertical-lr rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value] [vertical-lr rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-lr rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained] [vertical-rl rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-rl ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[horizontal-tb ltr inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained] [horizontal-tb ltr inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[horizontal-tb ltr inside horizontal-tb ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside horizontal-tb rtl - Percentages are absolutized into pixels]
expected: FAIL
[horizontal-tb rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value] [horizontal-tb rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-lr ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained] [vertical-lr rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[horizontal-tb ltr inside vertical-rl rtl - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside vertical-rl ltr - Percentages are absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value] [horizontal-tb ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[horizontal-tb rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained] [horizontal-tb rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-lr rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value] [vertical-rl ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-lr rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value] [vertical-lr rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-lr ltr inside vertical-rl rtl - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside horizontal-tb rtl - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value] [vertical-rl ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-lr ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained] [vertical-lr ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-lr ltr inside vertical-lr rtl - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value] [vertical-rl rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[horizontal-tb rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained] [vertical-lr ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[horizontal-tb ltr inside vertical-lr ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value] [vertical-lr ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[horizontal-tb ltr inside horizontal-tb ltr - Percentages are absolutized into pixels]
expected: FAIL
[horizontal-tb rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained] [vertical-rl ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-lr rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl rtl inside vertical-lr ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained] [vertical-rl ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-rl ltr inside vertical-lr ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr ltr inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained] [vertical-lr ltr inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-lr rtl inside vertical-rl ltr - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb rtl inside vertical-rl ltr - Percentages are absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value] [horizontal-tb ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-lr rtl inside vertical-rl rtl - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value] [horizontal-tb ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-rl ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained] [vertical-rl ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-lr rtl inside vertical-rl rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value] [vertical-rl ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-rl ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value] [vertical-rl ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[horizontal-tb rtl inside vertical-rl rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside vertical-lr rtl - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value] [horizontal-tb rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[horizontal-tb ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr rtl inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained] [vertical-lr rtl inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[horizontal-tb rtl inside vertical-lr ltr - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb rtl inside vertical-lr ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value] [vertical-rl ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[horizontal-tb ltr inside vertical-rl ltr - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb rtl inside horizontal-tb ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside horizontal-tb rtl - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained] [vertical-rl ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[horizontal-tb rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value] [horizontal-tb rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-rl rtl inside vertical-lr ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside horizontal-tb ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside vertical-rl ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-lr rtl inside vertical-lr ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-lr ltr inside horizontal-tb ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside vertical-rl rtl - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value] [horizontal-tb rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-rl rtl inside vertical-rl rtl - Percentages are absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr rtl inside vertical-lr rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained] [vertical-rl rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-rl rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained] [vertical-lr ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
@ -308,66 +119,27 @@
[vertical-lr ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained] [vertical-lr ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-lr rtl inside horizontal-tb rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr rtl inside vertical-lr ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value] [vertical-lr ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-rl rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained] [vertical-rl rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-rl rtl inside vertical-rl ltr - Percentages are absolutized into pixels]
expected: FAIL
[horizontal-tb rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained] [vertical-rl rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[horizontal-tb rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained] [horizontal-tb rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-rl rtl inside horizontal-tb ltr - Percentages are absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr rtl inside horizontal-tb rtl - calc() is absolutized into pixels]
expected: FAIL
[vertical-lr ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value] [vertical-lr ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-rl ltr inside vertical-lr rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value] [vertical-lr rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[horizontal-tb rtl inside vertical-rl ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-lr ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained] [vertical-lr rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-lr ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained] [vertical-rl ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
@ -377,42 +149,21 @@
[horizontal-tb rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value] [horizontal-tb rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[horizontal-tb rtl inside vertical-lr rtl - calc() is absolutized into pixels]
expected: FAIL
[vertical-lr rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value] [vertical-lr rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-rl ltr inside horizontal-tb rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[horizontal-tb ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained] [horizontal-tb ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-lr ltr inside horizontal-tb ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value] [vertical-rl rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-lr ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained] [vertical-lr ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-rl ltr inside horizontal-tb ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-lr rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained] [vertical-lr rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[horizontal-tb rtl inside vertical-lr rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value] [vertical-rl rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
@ -422,42 +173,21 @@
[vertical-lr ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value] [vertical-lr ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-rl rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[horizontal-tb rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[horizontal-tb ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value] [horizontal-tb ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-lr rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained] [vertical-lr rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[horizontal-tb ltr inside vertical-rl rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr rtl inside vertical-lr rtl - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value] [vertical-rl ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[horizontal-tb ltr inside vertical-lr ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-lr rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value] [vertical-lr rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[horizontal-tb rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained] [horizontal-tb rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[horizontal-tb ltr inside vertical-lr rtl - calc() is absolutized into pixels]
expected: FAIL
[vertical-lr ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[horizontal-tb ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained] [horizontal-tb ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
@ -467,74 +197,20 @@
[horizontal-tb rtl inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained] [horizontal-tb rtl inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[horizontal-tb rtl inside vertical-rl rtl - calc() is absolutized into pixels]
expected: FAIL
[vertical-lr ltr inside vertical-rl ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value] [vertical-rl rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-rl ltr inside horizontal-tb rtl - calc() is absolutized into pixels]
expected: FAIL
[vertical-lr ltr inside vertical-rl ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside vertical-lr rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr ltr inside vertical-rl rtl - Percentages are absolutized into pixels]
expected: FAIL
[horizontal-tb rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[horizontal-tb rtl inside horizontal-tb rtl - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl ltr inside vertical-lr rtl - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside vertical-rl ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value] [vertical-rl rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-lr ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[horizontal-tb ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[horizontal-tb rtl inside horizontal-tb ltr - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained] [horizontal-tb ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[horizontal-tb rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained] [horizontal-tb rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-lr ltr inside vertical-lr ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside vertical-rl ltr - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value] [horizontal-tb rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[horizontal-tb ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained] [horizontal-tb ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-lr rtl inside horizontal-tb ltr - Percentages are absolutized into pixels]
expected: FAIL

View file

@ -2,75 +2,18 @@
[vertical-lr ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value] [vertical-lr ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-rl ltr inside vertical-rl rtl - Percentages are absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside horizontal-tb rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside vertical-rl rtl - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[horizontal-tb rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[horizontal-tb rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained] [horizontal-tb rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-lr ltr inside horizontal-tb rtl - Percentages are absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained] [horizontal-tb ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-rl ltr inside vertical-lr ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained] [vertical-rl rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-rl ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr ltr inside vertical-lr ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr rtl inside horizontal-tb ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside horizontal-tb ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr ltr inside vertical-lr rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr rtl inside vertical-rl ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr ltr inside horizontal-tb rtl - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside vertical-lr rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value] [vertical-lr rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[horizontal-tb rtl inside horizontal-tb rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained] [vertical-lr rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
@ -83,222 +26,90 @@
[vertical-lr rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value] [vertical-lr rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-lr rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained] [vertical-rl rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-rl ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[horizontal-tb ltr inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained] [horizontal-tb ltr inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[horizontal-tb ltr inside horizontal-tb ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside horizontal-tb rtl - Percentages are absolutized into pixels]
expected: FAIL
[horizontal-tb rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value] [horizontal-tb rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-lr ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained] [vertical-lr rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[horizontal-tb ltr inside vertical-rl rtl - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside vertical-rl ltr - Percentages are absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value] [horizontal-tb ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[horizontal-tb rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained] [horizontal-tb rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-lr rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value] [vertical-rl ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-lr rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value] [vertical-lr rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-lr ltr inside vertical-rl rtl - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside horizontal-tb rtl - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value] [vertical-rl ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-lr ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained] [vertical-lr ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-lr ltr inside vertical-lr rtl - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value] [vertical-rl rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[horizontal-tb rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained] [vertical-lr ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[horizontal-tb ltr inside vertical-lr ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value] [vertical-lr ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[horizontal-tb ltr inside horizontal-tb ltr - Percentages are absolutized into pixels]
expected: FAIL
[horizontal-tb rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained] [vertical-rl ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-lr rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl rtl inside vertical-lr ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained] [vertical-rl ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-rl ltr inside vertical-lr ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr ltr inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained] [vertical-lr ltr inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-lr rtl inside vertical-rl ltr - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb rtl inside vertical-rl ltr - Percentages are absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value] [horizontal-tb ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-lr rtl inside vertical-rl rtl - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value] [horizontal-tb ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-rl ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained] [vertical-rl ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-lr rtl inside vertical-rl rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value] [vertical-rl ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-rl ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value] [vertical-rl ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[horizontal-tb rtl inside vertical-rl rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside vertical-lr rtl - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value] [horizontal-tb rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[horizontal-tb ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr rtl inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained] [vertical-lr rtl inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[horizontal-tb rtl inside vertical-lr ltr - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb rtl inside vertical-lr ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value] [vertical-rl ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[horizontal-tb ltr inside vertical-rl ltr - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb rtl inside horizontal-tb ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside horizontal-tb rtl - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained] [vertical-rl ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[horizontal-tb rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value] [horizontal-tb rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-rl rtl inside vertical-lr ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside horizontal-tb ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside vertical-rl ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-lr rtl inside vertical-lr ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-lr ltr inside horizontal-tb ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside vertical-rl rtl - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value] [horizontal-tb rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-rl rtl inside vertical-rl rtl - Percentages are absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr rtl inside vertical-lr rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained] [vertical-rl rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-rl rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained] [vertical-lr ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
@ -308,66 +119,27 @@
[vertical-lr ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained] [vertical-lr ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-lr rtl inside horizontal-tb rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr rtl inside vertical-lr ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value] [vertical-lr ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-rl rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained] [vertical-rl rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-rl rtl inside vertical-rl ltr - Percentages are absolutized into pixels]
expected: FAIL
[horizontal-tb rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained] [vertical-rl rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[horizontal-tb rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained] [horizontal-tb rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-rl rtl inside horizontal-tb ltr - Percentages are absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr rtl inside horizontal-tb rtl - calc() is absolutized into pixels]
expected: FAIL
[vertical-lr ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value] [vertical-lr ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-rl ltr inside vertical-lr rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value] [vertical-lr rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[horizontal-tb rtl inside vertical-rl ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-lr ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained] [vertical-lr rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-lr ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained] [vertical-rl ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
@ -377,42 +149,21 @@
[horizontal-tb rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value] [horizontal-tb rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[horizontal-tb rtl inside vertical-lr rtl - calc() is absolutized into pixels]
expected: FAIL
[vertical-lr rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value] [vertical-lr rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-rl ltr inside horizontal-tb rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[horizontal-tb ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained] [horizontal-tb ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-lr ltr inside horizontal-tb ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value] [vertical-rl rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-lr ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained] [vertical-lr ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-rl ltr inside horizontal-tb ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-lr rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained] [vertical-lr rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[horizontal-tb rtl inside vertical-lr rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value] [vertical-rl rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
@ -422,42 +173,21 @@
[vertical-lr ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value] [vertical-lr ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-rl rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[horizontal-tb rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[horizontal-tb ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value] [horizontal-tb ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-lr rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained] [vertical-lr rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[horizontal-tb ltr inside vertical-rl rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr rtl inside vertical-lr rtl - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value] [vertical-rl ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[horizontal-tb ltr inside vertical-lr ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-lr rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value] [vertical-lr rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[horizontal-tb rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained] [horizontal-tb rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[horizontal-tb ltr inside vertical-lr rtl - calc() is absolutized into pixels]
expected: FAIL
[vertical-lr ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[horizontal-tb ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained] [horizontal-tb ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
@ -467,74 +197,20 @@
[horizontal-tb rtl inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained] [horizontal-tb rtl inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[horizontal-tb rtl inside vertical-rl rtl - calc() is absolutized into pixels]
expected: FAIL
[vertical-lr ltr inside vertical-rl ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value] [vertical-rl rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-rl ltr inside horizontal-tb rtl - calc() is absolutized into pixels]
expected: FAIL
[vertical-lr ltr inside vertical-rl ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside vertical-lr rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr ltr inside vertical-rl rtl - Percentages are absolutized into pixels]
expected: FAIL
[horizontal-tb rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[horizontal-tb rtl inside horizontal-tb rtl - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl ltr inside vertical-lr rtl - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside vertical-rl ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value] [vertical-rl rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[vertical-lr ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[horizontal-tb ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[horizontal-tb rtl inside horizontal-tb ltr - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained] [horizontal-tb ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[horizontal-tb rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained] [horizontal-tb rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-lr ltr inside vertical-lr ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside vertical-rl ltr - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value] [horizontal-tb rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL expected: FAIL
[horizontal-tb ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained] [horizontal-tb ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
expected: FAIL expected: FAIL
[vertical-lr rtl inside horizontal-tb ltr - Percentages are absolutized into pixels]
expected: FAIL

View file

@ -1,432 +0,0 @@
[getComputedStyle-insets-relative.html]
[vertical-lr ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[vertical-rl ltr inside vertical-rl rtl - Percentages are absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside horizontal-tb rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside vertical-rl rtl - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[horizontal-tb rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr ltr inside horizontal-tb rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr ltr inside vertical-lr ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr rtl inside horizontal-tb ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside horizontal-tb ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr ltr inside vertical-lr rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[vertical-lr ltr inside horizontal-tb rtl - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside vertical-lr rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[horizontal-tb rtl inside horizontal-tb rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[vertical-lr rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr ltr inside vertical-rl ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[horizontal-tb ltr inside horizontal-tb ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside horizontal-tb rtl - Percentages are absolutized into pixels]
expected: FAIL
[horizontal-tb rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[vertical-lr ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[horizontal-tb ltr inside vertical-rl rtl - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside vertical-rl ltr - Percentages are absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[vertical-rl rtl inside horizontal-tb ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-lr rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[vertical-lr rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[vertical-lr ltr inside vertical-rl rtl - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside horizontal-tb rtl - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[vertical-lr ltr inside vertical-lr rtl - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[horizontal-tb ltr inside vertical-lr ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[horizontal-tb ltr inside horizontal-tb ltr - Percentages are absolutized into pixels]
expected: FAIL
[horizontal-tb rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl ltr inside vertical-lr ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr rtl inside vertical-rl ltr - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb rtl inside vertical-rl ltr - Percentages are absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[vertical-lr rtl inside vertical-rl rtl - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[vertical-lr rtl inside vertical-rl rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[horizontal-tb rtl inside vertical-rl ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[horizontal-tb rtl inside vertical-rl rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside vertical-lr rtl - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[horizontal-tb ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[horizontal-tb rtl inside vertical-lr ltr - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb rtl inside vertical-lr ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[horizontal-tb ltr inside vertical-rl ltr - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb rtl inside horizontal-tb ltr - Percentages are absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[horizontal-tb rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[vertical-rl rtl inside vertical-lr ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside vertical-rl ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-lr rtl inside vertical-lr ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-lr ltr inside horizontal-tb ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside vertical-rl rtl - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[vertical-rl rtl inside vertical-rl rtl - Percentages are absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr rtl inside vertical-lr rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[horizontal-tb ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[vertical-rl ltr inside horizontal-tb rtl - calc() is absolutized into pixels]
expected: FAIL
[vertical-lr rtl inside horizontal-tb rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr rtl inside vertical-lr ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[vertical-rl rtl inside vertical-rl ltr - Percentages are absolutized into pixels]
expected: FAIL
[horizontal-tb rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr ltr inside horizontal-tb ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside horizontal-tb ltr - Percentages are absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr rtl inside horizontal-tb rtl - calc() is absolutized into pixels]
expected: FAIL
[vertical-lr ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[vertical-rl ltr inside vertical-lr rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[vertical-lr ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[horizontal-tb rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[vertical-lr rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[vertical-rl ltr inside horizontal-tb rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-lr rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl rtl inside vertical-lr ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside vertical-lr ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[vertical-rl ltr inside horizontal-tb ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside horizontal-tb rtl - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb rtl inside vertical-lr rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[vertical-lr ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[horizontal-tb rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[horizontal-tb ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[horizontal-tb ltr inside vertical-rl rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr rtl inside vertical-lr rtl - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[horizontal-tb ltr inside vertical-lr ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-lr rtl inside vertical-rl ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[vertical-lr rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[horizontal-tb ltr inside vertical-lr rtl - calc() is absolutized into pixels]
expected: FAIL
[vertical-lr ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[horizontal-tb ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[vertical-rl ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[horizontal-tb rtl inside vertical-rl rtl - calc() is absolutized into pixels]
expected: FAIL
[vertical-lr ltr inside vertical-rl ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[vertical-rl rtl inside vertical-lr rtl - Percentages are absolutized into pixels]
expected: FAIL
[vertical-lr ltr inside vertical-rl rtl - Percentages are absolutized into pixels]
expected: FAIL
[horizontal-tb rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[horizontal-tb rtl inside horizontal-tb rtl - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[vertical-rl ltr inside vertical-lr rtl - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl ltr inside vertical-rl ltr - Percentages are absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[vertical-lr ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[horizontal-tb ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
expected: FAIL
[horizontal-tb rtl inside horizontal-tb ltr - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb rtl inside vertical-lr rtl - calc() is absolutized into pixels]
expected: FAIL
[vertical-rl rtl inside vertical-rl ltr - calc() is absolutized into pixels]
expected: FAIL
[horizontal-tb rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value]
expected: FAIL
[vertical-lr ltr inside vertical-lr ltr - calc() is absolutized into pixels]
expected: FAIL
[vertical-lr rtl inside horizontal-tb ltr - Percentages are absolutized into pixels]
expected: FAIL