зеркало из https://github.com/mozilla/gecko-dev.git
servo: Merge #8202 - Allow retrieving width/height for non-positioned elements (from dzbarsky:getComputedStyle); r=pcwalton
This was causing a bunch of tests in tests/wpt/web-platform-tests/html/semantics/embedded-content/the-canvas-element/size.attributes* to fail. They were returning "auto" instead of the correct size. They still fail because the returned size is off by a few pixels, not sure why yet. But this is more correct and may fix other failing tests. Source-Repo: https://github.com/servo/servo Source-Revision: b6850853da5fc677ecfa15d273159371a909ac6c
This commit is contained in:
Родитель
ed7fd17b12
Коммит
075284e51a
|
@ -931,6 +931,40 @@ impl LayoutTask {
|
|||
// There are probably other quirks.
|
||||
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.
|
||||
// Firefox returns blank strings for the computed value of shorthands,
|
||||
// so this should be web-compatible.
|
||||
|
@ -964,37 +998,16 @@ impl LayoutTask {
|
|||
},
|
||||
|
||||
atom!("bottom") | atom!("top") | atom!("right") |
|
||||
atom!("left") | atom!("width") | atom!("height")
|
||||
atom!("left")
|
||||
if applies && positioned && style.get_box().display !=
|
||||
display::computed_value::T::none => {
|
||||
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 search parents until we find node with a flow ref.
|
||||
_ => 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())
|
||||
},
|
||||
used_value_for_position_property(layout_node, layout_root, requested_node, property)
|
||||
}
|
||||
atom!("width") | atom!("height")
|
||||
if applies && style.get_box().display !=
|
||||
display::computed_value::T::none => {
|
||||
used_value_for_position_property(layout_node, layout_root, requested_node, property)
|
||||
}
|
||||
// FIXME: implement used value computation for line-height
|
||||
ref property => {
|
||||
style.computed_value_to_string(property.as_slice()).ok()
|
||||
|
|
|
@ -221,13 +221,14 @@ impl 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 =
|
||||
Some(match self.property {
|
||||
PositionProperty::Left => self.position.x,
|
||||
PositionProperty::Top => self.position.y,
|
||||
PositionProperty::Width => border_box.size.width,
|
||||
PositionProperty::Height => border_box.size.height,
|
||||
PositionProperty::Width => border_box.size.width - border_padding.horizontal(),
|
||||
PositionProperty::Height => border_box.size.height - border_padding.vertical(),
|
||||
// TODO: the following 2 calculations are completely wrong.
|
||||
// They should return the difference between the parent's and this
|
||||
// fragment's border boxes.
|
||||
|
|
Загрузка…
Ссылка в новой задаче