diff --git a/components/layout/layout_task.rs b/components/layout/layout_task.rs index 42dcddb57a4e..c86ecdedaff7 100644 --- a/components/layout/layout_task.rs +++ b/components/layout/layout_task.rs @@ -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 { + 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() diff --git a/components/layout/query.rs b/components/layout/query.rs index d50e150d0aee..562e8f93aef8 100644 --- a/components/layout/query.rs +++ b/components/layout/query.rs @@ -221,13 +221,14 @@ impl PositionRetrievingFragmentBorderBoxIterator { } impl FragmentBorderBoxIterator for PositionRetrievingFragmentBorderBoxIterator { - fn process(&mut self, _: &Fragment, _: i32, border_box: &Rect) { + fn process(&mut self, fragment: &Fragment, _: i32, border_box: &Rect) { + 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. diff --git a/tests/wpt/metadata-css/cssom-1_dev/html/computed-style-001.htm.ini b/tests/wpt/metadata-css/cssom-1_dev/html/computed-style-001.htm.ini index e46e756e46c2..778339718e4f 100644 --- a/tests/wpt/metadata-css/cssom-1_dev/html/computed-style-001.htm.ini +++ b/tests/wpt/metadata-css/cssom-1_dev/html/computed-style-001.htm.ini @@ -3,6 +3,3 @@ [read_only] expected: FAIL - [relative_property_values] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.decimal.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.decimal.html.ini deleted file mode 100644 index de2ec6fd2026..000000000000 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.decimal.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[size.attributes.parse.decimal.html] - type: testharness - [Parsing of non-negative integers] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.em.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.em.html.ini deleted file mode 100644 index 62e28aaeef3d..000000000000 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.em.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[size.attributes.parse.em.html] - type: testharness - [Parsing of non-negative integers] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.exp.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.exp.html.ini deleted file mode 100644 index a87aea62b534..000000000000 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.exp.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[size.attributes.parse.exp.html] - type: testharness - [Parsing of non-negative integers] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.hex.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.hex.html.ini deleted file mode 100644 index dcab0563e16c..000000000000 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.hex.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[size.attributes.parse.hex.html] - type: testharness - [Parsing of non-negative integers] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.octal.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.octal.html.ini deleted file mode 100644 index 5ce2b73adb93..000000000000 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.octal.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[size.attributes.parse.octal.html] - type: testharness - [Parsing of non-negative integers] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.percent.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.percent.html.ini deleted file mode 100644 index d23086fbf07f..000000000000 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.percent.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[size.attributes.parse.percent.html] - type: testharness - [Parsing of non-negative integers] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.plus.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.plus.html.ini deleted file mode 100644 index 4a8b458c7b34..000000000000 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.plus.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[size.attributes.parse.plus.html] - type: testharness - [Parsing of non-negative integers] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.space.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.space.html.ini deleted file mode 100644 index ac1c317fd474..000000000000 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.space.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[size.attributes.parse.space.html] - type: testharness - [Parsing of non-negative integers] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.trailingjunk.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.trailingjunk.html.ini deleted file mode 100644 index e3d8aad4ca70..000000000000 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.trailingjunk.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[size.attributes.parse.trailingjunk.html] - type: testharness - [Parsing of non-negative integers] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.whitespace.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.whitespace.html.ini deleted file mode 100644 index a178e4b39c26..000000000000 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.whitespace.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[size.attributes.parse.whitespace.html] - type: testharness - [Parsing of non-negative integers] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.zero.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.zero.html.ini deleted file mode 100644 index fcd86f0e2283..000000000000 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.zero.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[size.attributes.parse.zero.html] - type: testharness - [Parsing of non-negative integers] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.decimal.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.decimal.html.ini deleted file mode 100644 index bc02c56db8a3..000000000000 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.decimal.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[size.attributes.setAttribute.decimal.html] - type: testharness - [Parsing of non-negative integers in setAttribute] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.em.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.em.html.ini deleted file mode 100644 index 66b55181be98..000000000000 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.em.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[size.attributes.setAttribute.em.html] - type: testharness - [Parsing of non-negative integers in setAttribute] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.exp.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.exp.html.ini deleted file mode 100644 index 3c04907550b5..000000000000 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.exp.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[size.attributes.setAttribute.exp.html] - type: testharness - [Parsing of non-negative integers in setAttribute] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.hex.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.hex.html.ini deleted file mode 100644 index 4f85588ef18d..000000000000 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.hex.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[size.attributes.setAttribute.hex.html] - type: testharness - [Parsing of non-negative integers in setAttribute] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.octal.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.octal.html.ini deleted file mode 100644 index 12b5db414ac5..000000000000 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.octal.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[size.attributes.setAttribute.octal.html] - type: testharness - [Parsing of non-negative integers in setAttribute] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.percent.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.percent.html.ini deleted file mode 100644 index 14a148d8fd72..000000000000 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.percent.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[size.attributes.setAttribute.percent.html] - type: testharness - [Parsing of non-negative integers in setAttribute] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.plus.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.plus.html.ini deleted file mode 100644 index b483d9ec82df..000000000000 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.plus.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[size.attributes.setAttribute.plus.html] - type: testharness - [Parsing of non-negative integers in setAttribute] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.space.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.space.html.ini deleted file mode 100644 index c0e7f6c50004..000000000000 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.space.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[size.attributes.setAttribute.space.html] - type: testharness - [Parsing of non-negative integers in setAttribute] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.trailingjunk.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.trailingjunk.html.ini deleted file mode 100644 index 329c8a3e7526..000000000000 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.trailingjunk.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[size.attributes.setAttribute.trailingjunk.html] - type: testharness - [Parsing of non-negative integers in setAttribute] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.whitespace.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.whitespace.html.ini deleted file mode 100644 index 144ede158b17..000000000000 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.whitespace.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[size.attributes.setAttribute.whitespace.html] - type: testharness - [Parsing of non-negative integers in setAttribute] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.zero.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.zero.html.ini deleted file mode 100644 index 05375afff423..000000000000 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.zero.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[size.attributes.setAttribute.zero.html] - type: testharness - [Parsing of non-negative integers in setAttribute] - expected: FAIL - diff --git a/tests/wpt/mozilla/meta/mozilla/calc.html.ini b/tests/wpt/mozilla/meta/mozilla/calc.html.ini index e365575ac70b..df460ab31dc1 100644 --- a/tests/wpt/mozilla/meta/mozilla/calc.html.ini +++ b/tests/wpt/mozilla/meta/mozilla/calc.html.ini @@ -1,11 +1,5 @@ [calc.html] 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] expected: FAIL @@ -15,6 +9,3 @@ [calc for column-count] expected: FAIL - [calc(0ch + 0px + 0pt + 0pc + 0in + 0cm + 0mm + 0rem + 0em + 0ex + 0% + 0vw + 0vh + 0vmin + 0vmax)] - expected: FAIL - diff --git a/tests/wpt/mozilla/meta/mozilla/getComputedStyle.html.ini b/tests/wpt/mozilla/meta/mozilla/getComputedStyle.html.ini new file mode 100644 index 000000000000..00808895a253 --- /dev/null +++ b/tests/wpt/mozilla/meta/mozilla/getComputedStyle.html.ini @@ -0,0 +1,5 @@ +[getComputedStyle.html] + type: testharness + [getComputedStyle work for elements not in a document] + expected: FAIL + diff --git a/tests/wpt/mozilla/tests/mozilla/getComputedStyle.html b/tests/wpt/mozilla/tests/mozilla/getComputedStyle.html index b3b3a3c81122..5f4dc5d28761 100644 --- a/tests/wpt/mozilla/tests/mozilla/getComputedStyle.html +++ b/tests/wpt/mozilla/tests/mozilla/getComputedStyle.html @@ -24,7 +24,7 @@ assert_equals(cs.getPropertyValue("top"), "auto"); assert_equals(cs.getPropertyValue("bottom"), "auto"); 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)"); }, "Element's resolved values"); @@ -43,8 +43,8 @@ test(function() { var div = document.createElement("div"); div.id = "foo"; - assert_equals(getComputedStyle(div).getPropertyValue("width"), ""); - }, "Blank style for elements not in a document"); + assert_equals(getComputedStyle(div).getPropertyValue("width"), "50px"); + }, "getComputedStyle work for elements not in a document");