mirror of
https://github.com/servo/servo.git
synced 2025-06-21 15:49:04 +01:00
Allow retrieving width/height for non-positioned elements
This commit is contained in:
parent
ca56ebbb09
commit
d95ca55f26
28 changed files with 54 additions and 157 deletions
|
@ -931,6 +931,40 @@ impl LayoutTask {
|
||||||
// There are probably other quirks.
|
// There are probably other quirks.
|
||||||
let applies = true;
|
let applies = true;
|
||||||
|
|
||||||
|
fn used_value_for_position_property(layout_node: ThreadSafeLayoutNode,
|
||||||
|
layout_root: &mut FlowRef,
|
||||||
|
requested_node: TrustedNodeAddress,
|
||||||
|
property: &Atom) -> Option<String> {
|
||||||
|
let layout_data = layout_node.borrow_layout_data();
|
||||||
|
let position = layout_data.as_ref().map(|layout_data| {
|
||||||
|
match layout_data.data.flow_construction_result {
|
||||||
|
ConstructionResult::Flow(ref flow_ref, _) =>
|
||||||
|
flow::base(flow_ref.deref()).stacking_relative_position,
|
||||||
|
// TODO(dzbarsky) search parents until we find node with a flow ref.
|
||||||
|
// https://github.com/servo/servo/issues/8307
|
||||||
|
_ => ZERO_POINT
|
||||||
|
}
|
||||||
|
}).unwrap_or(ZERO_POINT);
|
||||||
|
let property = match *property {
|
||||||
|
atom!("bottom") => PositionProperty::Bottom,
|
||||||
|
atom!("top") => PositionProperty::Top,
|
||||||
|
atom!("left") => PositionProperty::Left,
|
||||||
|
atom!("right") => PositionProperty::Right,
|
||||||
|
atom!("width") => PositionProperty::Width,
|
||||||
|
atom!("height") => PositionProperty::Height,
|
||||||
|
_ => unreachable!()
|
||||||
|
};
|
||||||
|
let requested_node: OpaqueNode =
|
||||||
|
OpaqueNodeMethods::from_script_node(requested_node);
|
||||||
|
let mut iterator =
|
||||||
|
PositionRetrievingFragmentBorderBoxIterator::new(requested_node,
|
||||||
|
property,
|
||||||
|
position);
|
||||||
|
sequential::iterate_through_flow_tree_fragment_border_boxes(layout_root,
|
||||||
|
&mut iterator);
|
||||||
|
iterator.result.map(|r| r.to_css_string())
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: we will return neither the computed nor used value for margin and padding.
|
// TODO: we will return neither the computed nor used value for margin and padding.
|
||||||
// Firefox returns blank strings for the computed value of shorthands,
|
// Firefox returns blank strings for the computed value of shorthands,
|
||||||
// so this should be web-compatible.
|
// so this should be web-compatible.
|
||||||
|
@ -964,37 +998,16 @@ impl LayoutTask {
|
||||||
},
|
},
|
||||||
|
|
||||||
atom!("bottom") | atom!("top") | atom!("right") |
|
atom!("bottom") | atom!("top") | atom!("right") |
|
||||||
atom!("left") | atom!("width") | atom!("height")
|
atom!("left")
|
||||||
if applies && positioned && style.get_box().display !=
|
if applies && positioned && style.get_box().display !=
|
||||||
display::computed_value::T::none => {
|
display::computed_value::T::none => {
|
||||||
let layout_data = layout_node.borrow_layout_data();
|
used_value_for_position_property(layout_node, layout_root, requested_node, property)
|
||||||
let position = layout_data.as_ref().map(|layout_data| {
|
}
|
||||||
match layout_data.data.flow_construction_result {
|
atom!("width") | atom!("height")
|
||||||
ConstructionResult::Flow(ref flow_ref, _) =>
|
if applies && style.get_box().display !=
|
||||||
flow::base(flow_ref.deref()).stacking_relative_position,
|
display::computed_value::T::none => {
|
||||||
// TODO search parents until we find node with a flow ref.
|
used_value_for_position_property(layout_node, layout_root, requested_node, property)
|
||||||
_ => ZERO_POINT
|
|
||||||
}
|
}
|
||||||
}).unwrap_or(ZERO_POINT);
|
|
||||||
let property = match *property {
|
|
||||||
atom!("bottom") => PositionProperty::Bottom,
|
|
||||||
atom!("top") => PositionProperty::Top,
|
|
||||||
atom!("left") => PositionProperty::Left,
|
|
||||||
atom!("right") => PositionProperty::Right,
|
|
||||||
atom!("width") => PositionProperty::Width,
|
|
||||||
atom!("height") => PositionProperty::Height,
|
|
||||||
_ => unreachable!()
|
|
||||||
};
|
|
||||||
let requested_node: OpaqueNode =
|
|
||||||
OpaqueNodeMethods::from_script_node(requested_node);
|
|
||||||
let mut iterator =
|
|
||||||
PositionRetrievingFragmentBorderBoxIterator::new(requested_node,
|
|
||||||
property,
|
|
||||||
position);
|
|
||||||
sequential::iterate_through_flow_tree_fragment_border_boxes(layout_root,
|
|
||||||
&mut iterator);
|
|
||||||
iterator.result.map(|r| r.to_css_string())
|
|
||||||
},
|
|
||||||
// FIXME: implement used value computation for line-height
|
// FIXME: implement used value computation for line-height
|
||||||
ref property => {
|
ref property => {
|
||||||
style.computed_value_to_string(property.as_slice()).ok()
|
style.computed_value_to_string(property.as_slice()).ok()
|
||||||
|
|
|
@ -221,13 +221,14 @@ impl PositionRetrievingFragmentBorderBoxIterator {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FragmentBorderBoxIterator for PositionRetrievingFragmentBorderBoxIterator {
|
impl FragmentBorderBoxIterator for PositionRetrievingFragmentBorderBoxIterator {
|
||||||
fn process(&mut self, _: &Fragment, _: i32, border_box: &Rect<Au>) {
|
fn process(&mut self, fragment: &Fragment, _: i32, border_box: &Rect<Au>) {
|
||||||
|
let border_padding = fragment.border_padding.to_physical(fragment.style.writing_mode);
|
||||||
self.result =
|
self.result =
|
||||||
Some(match self.property {
|
Some(match self.property {
|
||||||
PositionProperty::Left => self.position.x,
|
PositionProperty::Left => self.position.x,
|
||||||
PositionProperty::Top => self.position.y,
|
PositionProperty::Top => self.position.y,
|
||||||
PositionProperty::Width => border_box.size.width,
|
PositionProperty::Width => border_box.size.width - border_padding.horizontal(),
|
||||||
PositionProperty::Height => border_box.size.height,
|
PositionProperty::Height => border_box.size.height - border_padding.vertical(),
|
||||||
// TODO: the following 2 calculations are completely wrong.
|
// TODO: the following 2 calculations are completely wrong.
|
||||||
// They should return the difference between the parent's and this
|
// They should return the difference between the parent's and this
|
||||||
// fragment's border boxes.
|
// fragment's border boxes.
|
||||||
|
|
|
@ -3,6 +3,3 @@
|
||||||
[read_only]
|
[read_only]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[relative_property_values]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[size.attributes.parse.decimal.html]
|
|
||||||
type: testharness
|
|
||||||
[Parsing of non-negative integers]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[size.attributes.parse.em.html]
|
|
||||||
type: testharness
|
|
||||||
[Parsing of non-negative integers]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[size.attributes.parse.exp.html]
|
|
||||||
type: testharness
|
|
||||||
[Parsing of non-negative integers]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[size.attributes.parse.hex.html]
|
|
||||||
type: testharness
|
|
||||||
[Parsing of non-negative integers]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[size.attributes.parse.octal.html]
|
|
||||||
type: testharness
|
|
||||||
[Parsing of non-negative integers]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[size.attributes.parse.percent.html]
|
|
||||||
type: testharness
|
|
||||||
[Parsing of non-negative integers]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[size.attributes.parse.plus.html]
|
|
||||||
type: testharness
|
|
||||||
[Parsing of non-negative integers]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[size.attributes.parse.space.html]
|
|
||||||
type: testharness
|
|
||||||
[Parsing of non-negative integers]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[size.attributes.parse.trailingjunk.html]
|
|
||||||
type: testharness
|
|
||||||
[Parsing of non-negative integers]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[size.attributes.parse.whitespace.html]
|
|
||||||
type: testharness
|
|
||||||
[Parsing of non-negative integers]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[size.attributes.parse.zero.html]
|
|
||||||
type: testharness
|
|
||||||
[Parsing of non-negative integers]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[size.attributes.setAttribute.decimal.html]
|
|
||||||
type: testharness
|
|
||||||
[Parsing of non-negative integers in setAttribute]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[size.attributes.setAttribute.em.html]
|
|
||||||
type: testharness
|
|
||||||
[Parsing of non-negative integers in setAttribute]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[size.attributes.setAttribute.exp.html]
|
|
||||||
type: testharness
|
|
||||||
[Parsing of non-negative integers in setAttribute]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[size.attributes.setAttribute.hex.html]
|
|
||||||
type: testharness
|
|
||||||
[Parsing of non-negative integers in setAttribute]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[size.attributes.setAttribute.octal.html]
|
|
||||||
type: testharness
|
|
||||||
[Parsing of non-negative integers in setAttribute]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[size.attributes.setAttribute.percent.html]
|
|
||||||
type: testharness
|
|
||||||
[Parsing of non-negative integers in setAttribute]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[size.attributes.setAttribute.plus.html]
|
|
||||||
type: testharness
|
|
||||||
[Parsing of non-negative integers in setAttribute]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[size.attributes.setAttribute.space.html]
|
|
||||||
type: testharness
|
|
||||||
[Parsing of non-negative integers in setAttribute]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[size.attributes.setAttribute.trailingjunk.html]
|
|
||||||
type: testharness
|
|
||||||
[Parsing of non-negative integers in setAttribute]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[size.attributes.setAttribute.whitespace.html]
|
|
||||||
type: testharness
|
|
||||||
[Parsing of non-negative integers in setAttribute]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[size.attributes.setAttribute.zero.html]
|
|
||||||
type: testharness
|
|
||||||
[Parsing of non-negative integers in setAttribute]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,11 +1,5 @@
|
||||||
[calc.html]
|
[calc.html]
|
||||||
type: testharness
|
type: testharness
|
||||||
[calc(1px + 1pt + 1pc + 1in + 1cm + 1mm)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[calc(0px + 0pt + 0pc + 0in + 0cm + 0mm + 0rem + 0em + 0ex + 0% + 0vw + 0vh + 0vmin + 0vmax)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[calc for column-width]
|
[calc for column-width]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
@ -15,6 +9,3 @@
|
||||||
[calc for column-count]
|
[calc for column-count]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[calc(0ch + 0px + 0pt + 0pc + 0in + 0cm + 0mm + 0rem + 0em + 0ex + 0% + 0vw + 0vh + 0vmin + 0vmax)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
|
|
5
tests/wpt/mozilla/meta/mozilla/getComputedStyle.html.ini
Normal file
5
tests/wpt/mozilla/meta/mozilla/getComputedStyle.html.ini
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
[getComputedStyle.html]
|
||||||
|
type: testharness
|
||||||
|
[getComputedStyle work for elements not in a document]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
assert_equals(cs.getPropertyValue("top"), "auto");
|
assert_equals(cs.getPropertyValue("top"), "auto");
|
||||||
assert_equals(cs.getPropertyValue("bottom"), "auto");
|
assert_equals(cs.getPropertyValue("bottom"), "auto");
|
||||||
assert_equals(cs.getPropertyValue("width"), "50px");
|
assert_equals(cs.getPropertyValue("width"), "50px");
|
||||||
assert_equals(cs.getPropertyValue("height"), "auto");
|
assert_equals(cs.getPropertyValue("height"), "0px");
|
||||||
assert_equals(cs.getPropertyValue("color"), "rgb(0, 0, 0)");
|
assert_equals(cs.getPropertyValue("color"), "rgb(0, 0, 0)");
|
||||||
}, "Element's resolved values");
|
}, "Element's resolved values");
|
||||||
|
|
||||||
|
@ -43,8 +43,8 @@
|
||||||
test(function() {
|
test(function() {
|
||||||
var div = document.createElement("div");
|
var div = document.createElement("div");
|
||||||
div.id = "foo";
|
div.id = "foo";
|
||||||
assert_equals(getComputedStyle(div).getPropertyValue("width"), "");
|
assert_equals(getComputedStyle(div).getPropertyValue("width"), "50px");
|
||||||
}, "Blank style for elements not in a document");
|
}, "getComputedStyle work for elements not in a document");
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue