From 014ad76b97707b7b88a5525edeef6c8497d949ae Mon Sep 17 00:00:00 2001 From: Permutator Date: Thu, 25 Aug 2016 23:58:29 -0700 Subject: [PATCH 01/22] Added assertion to process_offset_parent_query --- components/layout/query.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/components/layout/query.rs b/components/layout/query.rs index 4068c3230bf..e25d76b3b46 100644 --- a/components/layout/query.rs +++ b/components/layout/query.rs @@ -807,6 +807,8 @@ pub fn process_offset_parent_query(requested_node: N, layout_root -> OffsetParentResponse { let mut iterator = ParentOffsetBorderBoxIterator::new(requested_node.opaque()); sequential::iterate_through_flow_tree_fragment_border_boxes(layout_root, &mut iterator); + assert!(iterator.has_found_node); + let parent_info_index = iterator.parent_nodes.iter().rposition(|info| info.is_some()); match parent_info_index { Some(parent_info_index) => { From 0a5218dc757841b8ed6eaf1925d3c56bbf59d30c Mon Sep 17 00:00:00 2001 From: Permutator Date: Tue, 30 Aug 2016 13:09:30 -0700 Subject: [PATCH 02/22] Fixed ParentOffsetBorderBoxIterator's keeping track of parents --- components/layout/query.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/components/layout/query.rs b/components/layout/query.rs index e25d76b3b46..1707d4569b6 100644 --- a/components/layout/query.rs +++ b/components/layout/query.rs @@ -447,7 +447,6 @@ struct ParentBorderBoxInfo { struct ParentOffsetBorderBoxIterator { node_address: OpaqueNode, - last_level: i32, has_found_node: bool, node_border_box: Rect, parent_nodes: Vec>, @@ -457,7 +456,6 @@ impl ParentOffsetBorderBoxIterator { fn new(node_address: OpaqueNode) -> ParentOffsetBorderBoxIterator { ParentOffsetBorderBoxIterator { node_address: node_address, - last_level: -1, has_found_node: false, node_border_box: Rect::zero(), parent_nodes: Vec::new(), @@ -536,6 +534,10 @@ impl FragmentBorderBoxIterator for UnioningFragmentScrollAreaIterator { // https://drafts.csswg.org/cssom-view/#extensions-to-the-htmlelement-interface impl FragmentBorderBoxIterator for ParentOffsetBorderBoxIterator { fn process(&mut self, fragment: &Fragment, level: i32, border_box: &Rect) { + // Remove all nodes at this level or higher, as they can't be parents of this node. + self.parent_nodes.truncate(level as usize); + assert!(self.parent_nodes.len() == level as usize); + if fragment.node == self.node_address { // Found the fragment in the flow tree that matches the // DOM node being looked for. @@ -546,11 +548,11 @@ impl FragmentBorderBoxIterator for ParentOffsetBorderBoxIterator { if fragment.style.get_box().position == computed_values::position::T::fixed { self.parent_nodes.clear(); } - } else if level > self.last_level { + } else { // TODO(gw): Is there a less fragile way of checking whether this // fragment is the body element, rather than just checking that - // the parent nodes stack contains the root node only? - let is_body_element = self.parent_nodes.len() == 1; + // it's at level 1 (above the root node)? + let is_body_element = level == 1; let is_valid_parent = match (is_body_element, fragment.style.get_box().position, @@ -580,8 +582,6 @@ impl FragmentBorderBoxIterator for ParentOffsetBorderBoxIterator { }; self.parent_nodes.push(parent_info); - } else if level < self.last_level { - self.parent_nodes.pop(); } } From 66235837e72873f15376131f651d510688d424ab Mon Sep 17 00:00:00 2001 From: Permutator Date: Mon, 26 Sep 2016 21:28:19 -0700 Subject: [PATCH 03/22] offsetParent queries now basically work on inline nodes. --- components/layout/query.rs | 65 ++++++++++++++++++++++++++++++-------- 1 file changed, 52 insertions(+), 13 deletions(-) diff --git a/components/layout/query.rs b/components/layout/query.rs index 1707d4569b6..5c7d993e14e 100644 --- a/components/layout/query.rs +++ b/components/layout/query.rs @@ -440,6 +440,11 @@ impl UnioningFragmentScrollAreaIterator { } } +struct NodeOffsetBoxInfo { + offset: Point2D, + rectangle: Rect, +} + struct ParentBorderBoxInfo { node_address: OpaqueNode, border_box: Rect, @@ -447,8 +452,8 @@ struct ParentBorderBoxInfo { struct ParentOffsetBorderBoxIterator { node_address: OpaqueNode, - has_found_node: bool, - node_border_box: Rect, + has_processed_node: bool, + node_offset_box: Option, parent_nodes: Vec>, } @@ -456,8 +461,8 @@ impl ParentOffsetBorderBoxIterator { fn new(node_address: OpaqueNode) -> ParentOffsetBorderBoxIterator { ParentOffsetBorderBoxIterator { node_address: node_address, - has_found_node: false, - node_border_box: Rect::zero(), + has_processed_node: false, + node_offset_box: None, parent_nodes: Vec::new(), } } @@ -534,20 +539,53 @@ impl FragmentBorderBoxIterator for UnioningFragmentScrollAreaIterator { // https://drafts.csswg.org/cssom-view/#extensions-to-the-htmlelement-interface impl FragmentBorderBoxIterator for ParentOffsetBorderBoxIterator { fn process(&mut self, fragment: &Fragment, level: i32, border_box: &Rect) { - // Remove all nodes at this level or higher, as they can't be parents of this node. - self.parent_nodes.truncate(level as usize); - assert!(self.parent_nodes.len() == level as usize); + match self.node_offset_box { + Some(_) => { }, // We've already found the node, so we already have its parent. + None => { + // Remove all nodes at this level or higher, as they can't be parents of this node. + self.parent_nodes.truncate(level as usize); + assert!(self.parent_nodes.len() == level as usize); + }, + } if fragment.node == self.node_address { // Found the fragment in the flow tree that matches the // DOM node being looked for. - self.has_found_node = true; - self.node_border_box = *border_box; + self.has_processed_node = true; + self.node_offset_box = Some(NodeOffsetBoxInfo { + offset: border_box.origin, + rectangle: *border_box, + }); // offsetParent returns null if the node is fixed. if fragment.style.get_box().position == computed_values::position::T::fixed { self.parent_nodes.clear(); } + } else if fragment.contains_node(self.node_address) { + // Found a fragment in the flow tree that matches a child + // of the DOM node being looked for. + // Since we haven't found an exact match, the node must be + // inline. Hopefully. + match self.node_offset_box { + Some(NodeOffsetBoxInfo { ref mut rectangle, .. }) => { + *rectangle = rectangle.union(border_box); + }, + None => { + self.node_offset_box = Some(NodeOffsetBoxInfo { + offset: border_box.origin, + rectangle: *border_box, + }); + }, + } + + // TODO: `position: fixed` on inline elements doesn't seem to work + // as of Sep 25, 2016, so I don't know how one will check if an + // inline element has it when it does. + } else if let Some(_) = self.node_offset_box { + // We've been processing fragments within the node, but now + // we've found one outside it. That means we're done. + // Hopefully. + self.has_processed_node = true; } else { // TODO(gw): Is there a less fragile way of checking whether this // fragment is the body element, rather than just checking that @@ -586,7 +624,7 @@ impl FragmentBorderBoxIterator for ParentOffsetBorderBoxIterator { } fn should_process(&mut self, _: &Fragment) -> bool { - !self.has_found_node + !self.has_processed_node } } @@ -807,14 +845,15 @@ pub fn process_offset_parent_query(requested_node: N, layout_root -> OffsetParentResponse { let mut iterator = ParentOffsetBorderBoxIterator::new(requested_node.opaque()); sequential::iterate_through_flow_tree_fragment_border_boxes(layout_root, &mut iterator); - assert!(iterator.has_found_node); + // If we didn't find the node, something went wrong. Unwrap it. + let node_offset_box = iterator.node_offset_box.unwrap(); let parent_info_index = iterator.parent_nodes.iter().rposition(|info| info.is_some()); match parent_info_index { Some(parent_info_index) => { let parent = iterator.parent_nodes[parent_info_index].as_ref().unwrap(); - let origin = iterator.node_border_box.origin - parent.border_box.origin; - let size = iterator.node_border_box.size; + let origin = node_offset_box.offset - parent.border_box.origin; + let size = node_offset_box.rectangle.size; OffsetParentResponse { node_address: Some(parent.node_address.to_untrusted_node_address()), rect: Rect::new(origin, size), From 18793af44de90e6e91890dee1249838b3bda8677 Mon Sep 17 00:00:00 2001 From: Permutator Date: Tue, 3 Jan 2017 18:13:42 -0800 Subject: [PATCH 04/22] Don't crash when offset parent querying an element not in the document --- components/layout/query.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/components/layout/query.rs b/components/layout/query.rs index 5c7d993e14e..b28260160f9 100644 --- a/components/layout/query.rs +++ b/components/layout/query.rs @@ -845,12 +845,11 @@ pub fn process_offset_parent_query(requested_node: N, layout_root -> OffsetParentResponse { let mut iterator = ParentOffsetBorderBoxIterator::new(requested_node.opaque()); sequential::iterate_through_flow_tree_fragment_border_boxes(layout_root, &mut iterator); - // If we didn't find the node, something went wrong. Unwrap it. - let node_offset_box = iterator.node_offset_box.unwrap(); + let node_offset_box = iterator.node_offset_box; let parent_info_index = iterator.parent_nodes.iter().rposition(|info| info.is_some()); - match parent_info_index { - Some(parent_info_index) => { + match (node_offset_box, parent_info_index) { + (Some(node_offset_box), Some(parent_info_index)) => { let parent = iterator.parent_nodes[parent_info_index].as_ref().unwrap(); let origin = node_offset_box.offset - parent.border_box.origin; let size = node_offset_box.rectangle.size; @@ -859,7 +858,7 @@ pub fn process_offset_parent_query(requested_node: N, layout_root rect: Rect::new(origin, size), } } - None => { + _ => { OffsetParentResponse::empty() } } From a61a263291bae9587d8e4395f531e0149a042f7a Mon Sep 17 00:00:00 2001 From: Permutator Date: Wed, 4 Jan 2017 00:20:28 -0800 Subject: [PATCH 05/22] Added tests/wpt/web-platform-tests/cssom-view/offsetPropertiesInline.html --- tests/wpt/metadata/MANIFEST.json | 4 + .../cssom-view/offsetPropertiesInline.html | 80 +++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 tests/wpt/web-platform-tests/cssom-view/offsetPropertiesInline.html diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index 2653ba15068..765287ea29e 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -15831,6 +15831,10 @@ "path": "cssom-view/negativeMargins.html", "url": "/cssom-view/negativeMargins.html" }, + { + "path": "cssom-view/offsetPropertiesInline.html", + "url": "/cssom-view/offsetPropertiesInline.html" + }, { "path": "cssom-view/scrolling-no-browsing-context.html", "url": "/cssom-view/scrolling-no-browsing-context.html" diff --git a/tests/wpt/web-platform-tests/cssom-view/offsetPropertiesInline.html b/tests/wpt/web-platform-tests/cssom-view/offsetPropertiesInline.html new file mode 100644 index 00000000000..e234e574987 --- /dev/null +++ b/tests/wpt/web-platform-tests/cssom-view/offsetPropertiesInline.html @@ -0,0 +1,80 @@ + + +cssom-view - offsetParent, offsetTop, offsetLeft, offsetWidth, and offsetHeight on inline elements + + + + +
+ ABC + ABC
ABC
+ ABC +
+
+ + From 6a7652510793078daf93d2b405da02c68e3ef88e Mon Sep 17 00:00:00 2001 From: Permutator Date: Wed, 4 Jan 2017 15:37:16 -0800 Subject: [PATCH 06/22] Replaced trivial pattern matching with is_none() and is_some() --- components/layout/query.rs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/components/layout/query.rs b/components/layout/query.rs index b28260160f9..21c1c37d0ae 100644 --- a/components/layout/query.rs +++ b/components/layout/query.rs @@ -539,13 +539,11 @@ impl FragmentBorderBoxIterator for UnioningFragmentScrollAreaIterator { // https://drafts.csswg.org/cssom-view/#extensions-to-the-htmlelement-interface impl FragmentBorderBoxIterator for ParentOffsetBorderBoxIterator { fn process(&mut self, fragment: &Fragment, level: i32, border_box: &Rect) { - match self.node_offset_box { - Some(_) => { }, // We've already found the node, so we already have its parent. - None => { - // Remove all nodes at this level or higher, as they can't be parents of this node. - self.parent_nodes.truncate(level as usize); - assert!(self.parent_nodes.len() == level as usize); - }, + if self.node_offset_box.is_none() { + // We haven't found the node yet, so we're still looking for its parent. + // Remove all nodes at this level or higher, as they can't be parents of this node. + self.parent_nodes.truncate(level as usize); + assert!(self.parent_nodes.len() == level as usize); } if fragment.node == self.node_address { @@ -581,7 +579,7 @@ impl FragmentBorderBoxIterator for ParentOffsetBorderBoxIterator { // TODO: `position: fixed` on inline elements doesn't seem to work // as of Sep 25, 2016, so I don't know how one will check if an // inline element has it when it does. - } else if let Some(_) = self.node_offset_box { + } else if self.node_offset_box.is_some() { // We've been processing fragments within the node, but now // we've found one outside it. That means we're done. // Hopefully. From fa0cb7c8da1a71b388ba94fe876a87af6d39cad0 Mon Sep 17 00:00:00 2001 From: Permutator Date: Wed, 4 Jan 2017 15:46:48 -0800 Subject: [PATCH 07/22] Assert self.node_offset_box is None if fragment.node == self.node_address --- components/layout/query.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/components/layout/query.rs b/components/layout/query.rs index 21c1c37d0ae..39aeb1cef71 100644 --- a/components/layout/query.rs +++ b/components/layout/query.rs @@ -549,6 +549,10 @@ impl FragmentBorderBoxIterator for ParentOffsetBorderBoxIterator { if fragment.node == self.node_address { // Found the fragment in the flow tree that matches the // DOM node being looked for. + + // If self.node_offset_box is Some, we were treating this as an inline node! + assert!(self.node_offset_box.is_none()); + self.has_processed_node = true; self.node_offset_box = Some(NodeOffsetBoxInfo { offset: border_box.origin, From 699fc4b216f8331063ca479e0c6fec38a831d3ff Mon Sep 17 00:00:00 2001 From: Permutator Date: Wed, 4 Jan 2017 17:12:58 -0800 Subject: [PATCH 08/22] Use InlineFragmentNodeFlags in ParentOffsetBorderBoxIterator --- components/layout/query.rs | 39 +++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/components/layout/query.rs b/components/layout/query.rs index 39aeb1cef71..63575044e73 100644 --- a/components/layout/query.rs +++ b/components/layout/query.rs @@ -14,6 +14,7 @@ use flow::{self, Flow}; use fragment::{Fragment, FragmentBorderBoxIterator, SpecificFragmentInfo}; use gfx::display_list::{DisplayItemMetadata, DisplayList, OpaqueNode, ScrollOffsetMap}; use gfx_traits::ScrollRootId; +use inline::LAST_FRAGMENT_OF_ELEMENT; use ipc_channel::ipc::IpcSender; use opaque_node::OpaqueNodeMethods; use script_layout_interface::rpc::{ContentBoxResponse, ContentBoxesResponse}; @@ -563,16 +564,33 @@ impl FragmentBorderBoxIterator for ParentOffsetBorderBoxIterator { if fragment.style.get_box().position == computed_values::position::T::fixed { self.parent_nodes.clear(); } - } else if fragment.contains_node(self.node_address) { - // Found a fragment in the flow tree that matches a child - // of the DOM node being looked for. - // Since we haven't found an exact match, the node must be - // inline. Hopefully. + } else if let Some((inline_context, node_position)) = fragment.inline_context.as_ref().and_then(|inline_context| { + inline_context.nodes.iter().position(|node| node.address == self.node_address).map(|node_position| { + (inline_context, node_position) + }) + }) { + // TODO: Handle cases where the `offsetParent` is an inline + // element. This will likely be impossible until + // https://github.com/servo/servo/issues/13982 is fixed. It would + // have been much easier to just use find() instead of position(), + // but node_position will be needed later in order to handle those + // cases. + + let node = &inline_context.nodes[node_position]; + + // Found a fragment in the flow tree whose inline context contains + // the DOM node we're looking for, i.e. the node is inline and + // contains this fragment. match self.node_offset_box { Some(NodeOffsetBoxInfo { ref mut rectangle, .. }) => { *rectangle = rectangle.union(border_box); }, None => { + // https://github.com/servo/servo/issues/13982 will cause + // this assertion to fail sometimes, so it's commented out + // for now. + //assert!(node.flags.contains(FIRST_FRAGMENT_OF_ELEMENT)); + self.node_offset_box = Some(NodeOffsetBoxInfo { offset: border_box.origin, rectangle: *border_box, @@ -580,15 +598,14 @@ impl FragmentBorderBoxIterator for ParentOffsetBorderBoxIterator { }, } + if node.flags.contains(LAST_FRAGMENT_OF_ELEMENT) { + self.has_processed_node = true; + } + // TODO: `position: fixed` on inline elements doesn't seem to work // as of Sep 25, 2016, so I don't know how one will check if an // inline element has it when it does. - } else if self.node_offset_box.is_some() { - // We've been processing fragments within the node, but now - // we've found one outside it. That means we're done. - // Hopefully. - self.has_processed_node = true; - } else { + } else if self.node_offset_box.is_none() { // TODO(gw): Is there a less fragile way of checking whether this // fragment is the body element, rather than just checking that // it's at level 1 (above the root node)? From 923ecba91acf005cf81499f773ee8c23599d9f97 Mon Sep 17 00:00:00 2001 From: Permutator Date: Wed, 4 Jan 2017 17:56:07 -0800 Subject: [PATCH 09/22] Updated expectations for passing tests --- .../css-text-3_dev/html/word-break-break-all-000.htm.ini | 3 --- .../css-text-3_dev/html/word-break-break-all-001.htm.ini | 3 --- .../css-text-3_dev/html/word-break-break-all-002.htm.ini | 3 --- .../css-text-3_dev/html/word-break-break-all-003.htm.ini | 3 --- .../css-text-3_dev/html/word-break-break-all-005.htm.ini | 3 --- .../css-text-3_dev/html/word-break-keep-all-000.htm.ini | 3 --- .../css-text-3_dev/html/word-break-keep-all-001.htm.ini | 3 --- .../css-text-3_dev/html/word-break-keep-all-002.htm.ini | 3 --- .../css-text-3_dev/html/word-break-normal-001.htm.ini | 3 --- .../css-text-3_dev/html/word-break-normal-bo-000.htm.ini | 3 --- .../css-text-3_dev/html/word-break-normal-en-000.htm.ini | 3 --- .../css-text-3_dev/html/word-break-normal-hi-000.htm.ini | 3 --- .../css-text-3_dev/html/word-break-normal-ja-000.htm.ini | 3 --- .../css-text-3_dev/html/word-break-normal-ja-001.htm.ini | 3 --- .../css-text-3_dev/html/word-break-normal-ja-002.htm.ini | 3 --- .../css-text-3_dev/html/word-break-normal-ja-004.htm.ini | 3 --- .../css-text-3_dev/html/word-break-normal-ko-000.htm.ini | 3 --- .../css-text-3_dev/html/word-break-normal-zh-000.htm.ini | 3 --- 18 files changed, 54 deletions(-) delete mode 100644 tests/wpt/metadata-css/css-text-3_dev/html/word-break-break-all-000.htm.ini delete mode 100644 tests/wpt/metadata-css/css-text-3_dev/html/word-break-break-all-001.htm.ini delete mode 100644 tests/wpt/metadata-css/css-text-3_dev/html/word-break-break-all-002.htm.ini delete mode 100644 tests/wpt/metadata-css/css-text-3_dev/html/word-break-break-all-003.htm.ini delete mode 100644 tests/wpt/metadata-css/css-text-3_dev/html/word-break-break-all-005.htm.ini delete mode 100644 tests/wpt/metadata-css/css-text-3_dev/html/word-break-keep-all-000.htm.ini delete mode 100644 tests/wpt/metadata-css/css-text-3_dev/html/word-break-keep-all-001.htm.ini delete mode 100644 tests/wpt/metadata-css/css-text-3_dev/html/word-break-keep-all-002.htm.ini delete mode 100644 tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-001.htm.ini delete mode 100644 tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-bo-000.htm.ini delete mode 100644 tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-en-000.htm.ini delete mode 100644 tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-hi-000.htm.ini delete mode 100644 tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-ja-000.htm.ini delete mode 100644 tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-ja-001.htm.ini delete mode 100644 tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-ja-002.htm.ini delete mode 100644 tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-ja-004.htm.ini delete mode 100644 tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-ko-000.htm.ini delete mode 100644 tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-zh-000.htm.ini diff --git a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-break-all-000.htm.ini b/tests/wpt/metadata-css/css-text-3_dev/html/word-break-break-all-000.htm.ini deleted file mode 100644 index 6791b9dc852..00000000000 --- a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-break-all-000.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[word-break-break-all-000.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-break-all-001.htm.ini b/tests/wpt/metadata-css/css-text-3_dev/html/word-break-break-all-001.htm.ini deleted file mode 100644 index f3614c22d24..00000000000 --- a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-break-all-001.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[word-break-break-all-001.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-break-all-002.htm.ini b/tests/wpt/metadata-css/css-text-3_dev/html/word-break-break-all-002.htm.ini deleted file mode 100644 index 0ecba6c9ff6..00000000000 --- a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-break-all-002.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[word-break-break-all-002.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-break-all-003.htm.ini b/tests/wpt/metadata-css/css-text-3_dev/html/word-break-break-all-003.htm.ini deleted file mode 100644 index 702492d69b5..00000000000 --- a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-break-all-003.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[word-break-break-all-003.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-break-all-005.htm.ini b/tests/wpt/metadata-css/css-text-3_dev/html/word-break-break-all-005.htm.ini deleted file mode 100644 index 41a4c4f8769..00000000000 --- a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-break-all-005.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[word-break-break-all-005.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-keep-all-000.htm.ini b/tests/wpt/metadata-css/css-text-3_dev/html/word-break-keep-all-000.htm.ini deleted file mode 100644 index 37cf6325fa5..00000000000 --- a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-keep-all-000.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[word-break-keep-all-000.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-keep-all-001.htm.ini b/tests/wpt/metadata-css/css-text-3_dev/html/word-break-keep-all-001.htm.ini deleted file mode 100644 index 42b40a9663a..00000000000 --- a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-keep-all-001.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[word-break-keep-all-001.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-keep-all-002.htm.ini b/tests/wpt/metadata-css/css-text-3_dev/html/word-break-keep-all-002.htm.ini deleted file mode 100644 index ea759eb186f..00000000000 --- a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-keep-all-002.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[word-break-keep-all-002.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-001.htm.ini b/tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-001.htm.ini deleted file mode 100644 index 1351d775750..00000000000 --- a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-001.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[word-break-normal-001.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-bo-000.htm.ini b/tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-bo-000.htm.ini deleted file mode 100644 index 2b2af21d60d..00000000000 --- a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-bo-000.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[word-break-normal-bo-000.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-en-000.htm.ini b/tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-en-000.htm.ini deleted file mode 100644 index 30ace8ddc84..00000000000 --- a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-en-000.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[word-break-normal-en-000.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-hi-000.htm.ini b/tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-hi-000.htm.ini deleted file mode 100644 index f325fa6949a..00000000000 --- a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-hi-000.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[word-break-normal-hi-000.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-ja-000.htm.ini b/tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-ja-000.htm.ini deleted file mode 100644 index dfa0f8fc076..00000000000 --- a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-ja-000.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[word-break-normal-ja-000.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-ja-001.htm.ini b/tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-ja-001.htm.ini deleted file mode 100644 index 0b6a8e5be42..00000000000 --- a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-ja-001.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[word-break-normal-ja-001.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-ja-002.htm.ini b/tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-ja-002.htm.ini deleted file mode 100644 index 4cdf1c684b4..00000000000 --- a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-ja-002.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[word-break-normal-ja-002.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-ja-004.htm.ini b/tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-ja-004.htm.ini deleted file mode 100644 index 41f09527230..00000000000 --- a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-ja-004.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[word-break-normal-ja-004.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-ko-000.htm.ini b/tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-ko-000.htm.ini deleted file mode 100644 index 156d02d97f5..00000000000 --- a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-ko-000.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[word-break-normal-ko-000.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-zh-000.htm.ini b/tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-zh-000.htm.ini deleted file mode 100644 index 89776256c31..00000000000 --- a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-zh-000.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[word-break-normal-zh-000.htm] - type: reftest - expected: FAIL From db5da15e79d9e4081368b1448a4912b465454941 Mon Sep 17 00:00:00 2001 From: Permutator Date: Wed, 4 Jan 2017 18:01:03 -0800 Subject: [PATCH 10/22] Updated expectations for failing tests that were passing erroneously --- .../html/seg-break-transformation-001.htm.ini | 20 ++++++++++ .../html/seg-break-transformation-002.htm.ini | 20 ++++++++++ .../html/seg-break-transformation-003.htm.ini | 20 ++++++++++ .../html/seg-break-transformation-004.htm.ini | 38 +++++++++++++++++++ .../html/seg-break-transformation-006.htm.ini | 5 +++ .../html/seg-break-transformation-008.htm.ini | 20 ++++++++++ .../html/seg-break-transformation-009.htm.ini | 20 ++++++++++ .../html/seg-break-transformation-016.htm.ini | 20 ++++++++++ .../html/seg-break-transformation-017.htm.ini | 20 ++++++++++ .../html/word-break-break-all-007.htm.ini | 3 ++ 10 files changed, 186 insertions(+) create mode 100644 tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-001.htm.ini create mode 100644 tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-002.htm.ini create mode 100644 tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-003.htm.ini create mode 100644 tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-004.htm.ini create mode 100644 tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-006.htm.ini create mode 100644 tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-008.htm.ini create mode 100644 tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-009.htm.ini create mode 100644 tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-016.htm.ini create mode 100644 tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-017.htm.ini create mode 100644 tests/wpt/metadata-css/css-text-3_dev/html/word-break-break-all-007.htm.ini diff --git a/tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-001.htm.ini b/tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-001.htm.ini new file mode 100644 index 00000000000..3f6e6065d1c --- /dev/null +++ b/tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-001.htm.ini @@ -0,0 +1,20 @@ +[seg-break-transformation-001.htm] + type: testharness + [linebreak only] + expected: FAIL + + [spaces linebreak] + expected: FAIL + + [linebreak spaces] + expected: FAIL + + [spaces linebreak spaces] + expected: FAIL + + [multiple linebreaks] + expected: FAIL + + [multiple linebreaks + spaces] + expected: FAIL + diff --git a/tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-002.htm.ini b/tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-002.htm.ini new file mode 100644 index 00000000000..84355512269 --- /dev/null +++ b/tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-002.htm.ini @@ -0,0 +1,20 @@ +[seg-break-transformation-002.htm] + type: testharness + [linebreak only] + expected: FAIL + + [spaces linebreak] + expected: FAIL + + [linebreak spaces] + expected: FAIL + + [spaces linebreak spaces] + expected: FAIL + + [multiple linebreaks] + expected: FAIL + + [multiple linebreaks + spaces] + expected: FAIL + diff --git a/tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-003.htm.ini b/tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-003.htm.ini new file mode 100644 index 00000000000..8bfcbbd9b31 --- /dev/null +++ b/tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-003.htm.ini @@ -0,0 +1,20 @@ +[seg-break-transformation-003.htm] + type: testharness + [linebreak only] + expected: FAIL + + [spaces linebreak] + expected: FAIL + + [linebreak spaces] + expected: FAIL + + [spaces linebreak spaces] + expected: FAIL + + [multiple linebreaks] + expected: FAIL + + [multiple linebreaks + spaces] + expected: FAIL + diff --git a/tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-004.htm.ini b/tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-004.htm.ini new file mode 100644 index 00000000000..1e9bac0f56d --- /dev/null +++ b/tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-004.htm.ini @@ -0,0 +1,38 @@ +[seg-break-transformation-004.htm] + type: testharness + [linebreak only ₩24] + expected: FAIL + + [spaces linebreak ₩24] + expected: FAIL + + [linebreak spaces ₩24] + expected: FAIL + + [spaces linebreak spaces ₩24] + expected: FAIL + + [multiple linebreaks ₩24] + expected: FAIL + + [multiple linebreaks + spaces ₩24] + expected: FAIL + + [linebreak only 24₩] + expected: FAIL + + [spaces linebreak 24₩] + expected: FAIL + + [linebreak spaces 24₩] + expected: FAIL + + [spaces linebreak spaces 24₩] + expected: FAIL + + [multiple linebreaks 24₩] + expected: FAIL + + [multiple linebreaks + spaces 24₩] + expected: FAIL + diff --git a/tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-006.htm.ini b/tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-006.htm.ini new file mode 100644 index 00000000000..7fbc15c654f --- /dev/null +++ b/tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-006.htm.ini @@ -0,0 +1,5 @@ +[seg-break-transformation-006.htm] + type: testharness + [spaces linebreak] + expected: FAIL + diff --git a/tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-008.htm.ini b/tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-008.htm.ini new file mode 100644 index 00000000000..248d1c2ca3e --- /dev/null +++ b/tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-008.htm.ini @@ -0,0 +1,20 @@ +[seg-break-transformation-008.htm] + type: testharness + [linebreak only] + expected: FAIL + + [spaces linebreak] + expected: FAIL + + [linebreak spaces] + expected: FAIL + + [spaces linebreak spaces] + expected: FAIL + + [multiple linebreaks] + expected: FAIL + + [multiple linebreaks + spaces] + expected: FAIL + diff --git a/tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-009.htm.ini b/tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-009.htm.ini new file mode 100644 index 00000000000..1c80bf143a2 --- /dev/null +++ b/tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-009.htm.ini @@ -0,0 +1,20 @@ +[seg-break-transformation-009.htm] + type: testharness + [linebreak only] + expected: FAIL + + [spaces linebreak] + expected: FAIL + + [linebreak spaces] + expected: FAIL + + [spaces linebreak spaces] + expected: FAIL + + [multiple linebreaks] + expected: FAIL + + [multiple linebreaks + spaces] + expected: FAIL + diff --git a/tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-016.htm.ini b/tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-016.htm.ini new file mode 100644 index 00000000000..1acaa955d11 --- /dev/null +++ b/tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-016.htm.ini @@ -0,0 +1,20 @@ +[seg-break-transformation-016.htm] + type: testharness + [linebreak only] + expected: FAIL + + [spaces linebreak] + expected: FAIL + + [linebreak spaces] + expected: FAIL + + [spaces linebreak spaces] + expected: FAIL + + [multiple linebreaks] + expected: FAIL + + [multiple linebreaks + spaces] + expected: FAIL + diff --git a/tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-017.htm.ini b/tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-017.htm.ini new file mode 100644 index 00000000000..7345d4e7e47 --- /dev/null +++ b/tests/wpt/metadata-css/css-text-3_dev/html/seg-break-transformation-017.htm.ini @@ -0,0 +1,20 @@ +[seg-break-transformation-017.htm] + type: testharness + [linebreak only] + expected: FAIL + + [spaces linebreak] + expected: FAIL + + [linebreak spaces] + expected: FAIL + + [spaces linebreak spaces] + expected: FAIL + + [multiple linebreaks] + expected: FAIL + + [multiple linebreaks + spaces] + expected: FAIL + diff --git a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-break-all-007.htm.ini b/tests/wpt/metadata-css/css-text-3_dev/html/word-break-break-all-007.htm.ini new file mode 100644 index 00000000000..b2b3212943b --- /dev/null +++ b/tests/wpt/metadata-css/css-text-3_dev/html/word-break-break-all-007.htm.ini @@ -0,0 +1,3 @@ +[word-break-break-all-007.htm] + type: reftest + expected: FAIL From 4825169fb0e2432bbd2a6972a8fad87973e5d7e1 Mon Sep 17 00:00:00 2001 From: Permutator Date: Wed, 4 Jan 2017 18:03:30 -0800 Subject: [PATCH 11/22] Split 123-character line --- components/layout/query.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/components/layout/query.rs b/components/layout/query.rs index 63575044e73..5c21af4bd1d 100644 --- a/components/layout/query.rs +++ b/components/layout/query.rs @@ -564,11 +564,12 @@ impl FragmentBorderBoxIterator for ParentOffsetBorderBoxIterator { if fragment.style.get_box().position == computed_values::position::T::fixed { self.parent_nodes.clear(); } - } else if let Some((inline_context, node_position)) = fragment.inline_context.as_ref().and_then(|inline_context| { - inline_context.nodes.iter().position(|node| node.address == self.node_address).map(|node_position| { - (inline_context, node_position) - }) - }) { + } else if let Some((inline_context, node_position)) = + fragment.inline_context.as_ref().and_then(|inline_context| { + inline_context.nodes.iter().position(|node| node.address == self.node_address).map(|node_position| { + (inline_context, node_position) + }) + }) { // TODO: Handle cases where the `offsetParent` is an inline // element. This will likely be impossible until // https://github.com/servo/servo/issues/13982 is fixed. It would From defa7d99a6d352b52d7f9c34f210761ed8ea1801 Mon Sep 17 00:00:00 2001 From: Permutator Date: Thu, 5 Jan 2017 01:23:06 -0800 Subject: [PATCH 12/22] Actually, node_position probably won't be needed later. This is why you shouldn't make assumptions about what you'll need later! --- components/layout/query.rs | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/components/layout/query.rs b/components/layout/query.rs index 5c21af4bd1d..f2b833f9c8a 100644 --- a/components/layout/query.rs +++ b/components/layout/query.rs @@ -564,20 +564,12 @@ impl FragmentBorderBoxIterator for ParentOffsetBorderBoxIterator { if fragment.style.get_box().position == computed_values::position::T::fixed { self.parent_nodes.clear(); } - } else if let Some((inline_context, node_position)) = - fragment.inline_context.as_ref().and_then(|inline_context| { - inline_context.nodes.iter().position(|node| node.address == self.node_address).map(|node_position| { - (inline_context, node_position) - }) - }) { + } else if let Some(node) = fragment.inline_context.as_ref().and_then(|inline_context| { + inline_context.nodes.iter().find(|node| node.address == self.node_address) + }) { // TODO: Handle cases where the `offsetParent` is an inline // element. This will likely be impossible until - // https://github.com/servo/servo/issues/13982 is fixed. It would - // have been much easier to just use find() instead of position(), - // but node_position will be needed later in order to handle those - // cases. - - let node = &inline_context.nodes[node_position]; + // https://github.com/servo/servo/issues/13982 is fixed. // Found a fragment in the flow tree whose inline context contains // the DOM node we're looking for, i.e. the node is inline and From b75dcc0f88ce272723fd256aeea22ac05bb31738 Mon Sep 17 00:00:00 2001 From: Permutator Date: Thu, 5 Jan 2017 16:08:34 -0800 Subject: [PATCH 13/22] Made assertions more helpful --- components/layout/query.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/components/layout/query.rs b/components/layout/query.rs index f2b833f9c8a..1ee183d629a 100644 --- a/components/layout/query.rs +++ b/components/layout/query.rs @@ -544,15 +544,16 @@ impl FragmentBorderBoxIterator for ParentOffsetBorderBoxIterator { // We haven't found the node yet, so we're still looking for its parent. // Remove all nodes at this level or higher, as they can't be parents of this node. self.parent_nodes.truncate(level as usize); - assert!(self.parent_nodes.len() == level as usize); + assert_eq!(self.parent_nodes.len(), level as usize, + "Skipped at least one level in the flow tree!"); } if fragment.node == self.node_address { // Found the fragment in the flow tree that matches the // DOM node being looked for. - // If self.node_offset_box is Some, we were treating this as an inline node! - assert!(self.node_offset_box.is_none()); + assert!(self.node_offset_box.is_none(), + "Node was being treated as inline, but it has an associated fragment!"); self.has_processed_node = true; self.node_offset_box = Some(NodeOffsetBoxInfo { @@ -582,7 +583,8 @@ impl FragmentBorderBoxIterator for ParentOffsetBorderBoxIterator { // https://github.com/servo/servo/issues/13982 will cause // this assertion to fail sometimes, so it's commented out // for now. - //assert!(node.flags.contains(FIRST_FRAGMENT_OF_ELEMENT)); + /*assert!(node.flags.contains(FIRST_FRAGMENT_OF_ELEMENT), + "First fragment of inline node found wasn't its first fragment!");*/ self.node_offset_box = Some(NodeOffsetBoxInfo { offset: border_box.origin, From 5be187998f1b68ffb26aea8fece735b0e7d5709c Mon Sep 17 00:00:00 2001 From: Permutator Date: Thu, 5 Jan 2017 16:09:14 -0800 Subject: [PATCH 14/22] "above the root node" -> "below the root node" --- components/layout/query.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/layout/query.rs b/components/layout/query.rs index 1ee183d629a..f663ca1f0e8 100644 --- a/components/layout/query.rs +++ b/components/layout/query.rs @@ -603,7 +603,7 @@ impl FragmentBorderBoxIterator for ParentOffsetBorderBoxIterator { } else if self.node_offset_box.is_none() { // TODO(gw): Is there a less fragile way of checking whether this // fragment is the body element, rather than just checking that - // it's at level 1 (above the root node)? + // it's at level 1 (below the root node)? let is_body_element = level == 1; let is_valid_parent = match (is_body_element, From 290ebab87ec938e6d38ce07125d25c2d4a5b6bd3 Mon Sep 17 00:00:00 2001 From: Permutator Date: Thu, 5 Jan 2017 16:31:29 -0800 Subject: [PATCH 15/22] Moved and adjusted offset_properties_inline test --- tests/wpt/metadata/MANIFEST.json | 4 - tests/wpt/mozilla/meta/MANIFEST.json | 6 ++ .../tests/css/offset_properties_inline.html | 83 +++++++++++++++++++ .../cssom-view/offsetPropertiesInline.html | 80 ------------------ 4 files changed, 89 insertions(+), 84 deletions(-) create mode 100644 tests/wpt/mozilla/tests/css/offset_properties_inline.html delete mode 100644 tests/wpt/web-platform-tests/cssom-view/offsetPropertiesInline.html diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index 765287ea29e..2653ba15068 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -15831,10 +15831,6 @@ "path": "cssom-view/negativeMargins.html", "url": "/cssom-view/negativeMargins.html" }, - { - "path": "cssom-view/offsetPropertiesInline.html", - "url": "/cssom-view/offsetPropertiesInline.html" - }, { "path": "cssom-view/scrolling-no-browsing-context.html", "url": "/cssom-view/scrolling-no-browsing-context.html" diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json index 794a743fe62..bf4c3cf275e 100644 --- a/tests/wpt/mozilla/meta/MANIFEST.json +++ b/tests/wpt/mozilla/meta/MANIFEST.json @@ -6722,6 +6722,12 @@ "url": "/_mozilla/css/meta_viewport_resize.html" } ], + "css/offset_properties_inline.html": [ + { + "path": "css/offset_properties_inline.html", + "url": "/_mozilla/css/offset_properties_inline.html" + } + ], "css/test_variable_legal_values.html": [ { "path": "css/test_variable_legal_values.html", diff --git a/tests/wpt/mozilla/tests/css/offset_properties_inline.html b/tests/wpt/mozilla/tests/css/offset_properties_inline.html new file mode 100644 index 00000000000..cb88fa3a246 --- /dev/null +++ b/tests/wpt/mozilla/tests/css/offset_properties_inline.html @@ -0,0 +1,83 @@ + + +cssom-view - offsetParent, offsetTop, offsetLeft, offsetWidth, and offsetHeight on inline elements + + + + +
+ ABC + ABC
ABC
+ ABC +
+
+ +
+ + diff --git a/tests/wpt/web-platform-tests/cssom-view/offsetPropertiesInline.html b/tests/wpt/web-platform-tests/cssom-view/offsetPropertiesInline.html deleted file mode 100644 index e234e574987..00000000000 --- a/tests/wpt/web-platform-tests/cssom-view/offsetPropertiesInline.html +++ /dev/null @@ -1,80 +0,0 @@ - - -cssom-view - offsetParent, offsetTop, offsetLeft, offsetWidth, and offsetHeight on inline elements - - - - -
- ABC - ABC
ABC
- ABC -
-
- - From 5ef7a0a4d856251a0a621c939c1ecd9c1f881849 Mon Sep 17 00:00:00 2001 From: Permutator Date: Fri, 6 Jan 2017 16:58:37 -0800 Subject: [PATCH 16/22] Don't store the offset parent's dimensions --- components/layout/query.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/layout/query.rs b/components/layout/query.rs index f663ca1f0e8..f604c561152 100644 --- a/components/layout/query.rs +++ b/components/layout/query.rs @@ -448,7 +448,7 @@ struct NodeOffsetBoxInfo { struct ParentBorderBoxInfo { node_address: OpaqueNode, - border_box: Rect, + origin: Point2D, } struct ParentOffsetBorderBoxIterator { @@ -626,8 +626,8 @@ impl FragmentBorderBoxIterator for ParentOffsetBorderBoxIterator { let parent_info = if is_valid_parent { Some(ParentBorderBoxInfo { - border_box: *border_box, node_address: fragment.node, + origin: border_box.origin, }) } else { None @@ -865,7 +865,7 @@ pub fn process_offset_parent_query(requested_node: N, layout_root match (node_offset_box, parent_info_index) { (Some(node_offset_box), Some(parent_info_index)) => { let parent = iterator.parent_nodes[parent_info_index].as_ref().unwrap(); - let origin = node_offset_box.offset - parent.border_box.origin; + let origin = node_offset_box.offset - parent.origin; let size = node_offset_box.rectangle.size; OffsetParentResponse { node_address: Some(parent.node_address.to_untrusted_node_address()), From 686d2f85094d89d23227564965df33930958fcb4 Mon Sep 17 00:00:00 2001 From: Permutator Date: Fri, 6 Jan 2017 17:41:34 -0800 Subject: [PATCH 17/22] Don't use rposition() and unwrap() to find parent info --- components/layout/query.rs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/components/layout/query.rs b/components/layout/query.rs index f604c561152..aaf59b47d4b 100644 --- a/components/layout/query.rs +++ b/components/layout/query.rs @@ -861,14 +861,13 @@ pub fn process_offset_parent_query(requested_node: N, layout_root sequential::iterate_through_flow_tree_fragment_border_boxes(layout_root, &mut iterator); let node_offset_box = iterator.node_offset_box; - let parent_info_index = iterator.parent_nodes.iter().rposition(|info| info.is_some()); - match (node_offset_box, parent_info_index) { - (Some(node_offset_box), Some(parent_info_index)) => { - let parent = iterator.parent_nodes[parent_info_index].as_ref().unwrap(); - let origin = node_offset_box.offset - parent.origin; + let parent_info = iterator.parent_nodes.into_iter().rev().filter_map(|info| info).next(); + match (node_offset_box, parent_info) { + (Some(node_offset_box), Some(parent_info)) => { + let origin = node_offset_box.offset - parent_info.origin; let size = node_offset_box.rectangle.size; OffsetParentResponse { - node_address: Some(parent.node_address.to_untrusted_node_address()), + node_address: Some(parent_info.node_address.to_untrusted_node_address()), rect: Rect::new(origin, size), } } From 74e34d69f09c546eb98beb37218086fc4e36096c Mon Sep 17 00:00:00 2001 From: Permutator Date: Fri, 13 Jan 2017 11:00:15 -0800 Subject: [PATCH 18/22] Handle hypothetical fragments --- components/layout/query.rs | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/components/layout/query.rs b/components/layout/query.rs index aaf59b47d4b..449b0713dfd 100644 --- a/components/layout/query.rs +++ b/components/layout/query.rs @@ -548,6 +548,20 @@ impl FragmentBorderBoxIterator for ParentOffsetBorderBoxIterator { "Skipped at least one level in the flow tree!"); } + if fragment.is_hypothetical() { + // We're not interested in hypothetical fragments. The + // corresponding block will show up later if this fragment + // corresponds to the node we're looking for. + + if self.node_offset_box.is_none() { + // If this is the only fragment in the flow, we need to + // do this to avoid failing the above assertion. + self.parent_nodes.push(None); + } + + return; + } + if fragment.node == self.node_address { // Found the fragment in the flow tree that matches the // DOM node being looked for. @@ -596,10 +610,6 @@ impl FragmentBorderBoxIterator for ParentOffsetBorderBoxIterator { if node.flags.contains(LAST_FRAGMENT_OF_ELEMENT) { self.has_processed_node = true; } - - // TODO: `position: fixed` on inline elements doesn't seem to work - // as of Sep 25, 2016, so I don't know how one will check if an - // inline element has it when it does. } else if self.node_offset_box.is_none() { // TODO(gw): Is there a less fragile way of checking whether this // fragment is the body element, rather than just checking that From cb0d43a9930b443f4f5e9c026ceed644c28daf6c Mon Sep 17 00:00:00 2001 From: Permutator Date: Fri, 13 Jan 2017 11:12:05 -0800 Subject: [PATCH 19/22] Broke up some comment lines that were a bit too long --- components/layout/query.rs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/components/layout/query.rs b/components/layout/query.rs index 449b0713dfd..502e533a9c2 100644 --- a/components/layout/query.rs +++ b/components/layout/query.rs @@ -541,8 +541,9 @@ impl FragmentBorderBoxIterator for UnioningFragmentScrollAreaIterator { impl FragmentBorderBoxIterator for ParentOffsetBorderBoxIterator { fn process(&mut self, fragment: &Fragment, level: i32, border_box: &Rect) { if self.node_offset_box.is_none() { - // We haven't found the node yet, so we're still looking for its parent. - // Remove all nodes at this level or higher, as they can't be parents of this node. + // We haven't found the node yet, so we're still looking + // for its parent. Remove all nodes at this level or + // higher, as they can't be parents of this node. self.parent_nodes.truncate(level as usize); assert_eq!(self.parent_nodes.len(), level as usize, "Skipped at least one level in the flow tree!"); @@ -586,17 +587,17 @@ impl FragmentBorderBoxIterator for ParentOffsetBorderBoxIterator { // element. This will likely be impossible until // https://github.com/servo/servo/issues/13982 is fixed. - // Found a fragment in the flow tree whose inline context contains - // the DOM node we're looking for, i.e. the node is inline and - // contains this fragment. + // Found a fragment in the flow tree whose inline context + // contains the DOM node we're looking for, i.e. the node + // is inline and contains this fragment. match self.node_offset_box { Some(NodeOffsetBoxInfo { ref mut rectangle, .. }) => { *rectangle = rectangle.union(border_box); }, None => { - // https://github.com/servo/servo/issues/13982 will cause - // this assertion to fail sometimes, so it's commented out - // for now. + // https://github.com/servo/servo/issues/13982 will + // cause this assertion to fail sometimes, so it's + // commented out for now. /*assert!(node.flags.contains(FIRST_FRAGMENT_OF_ELEMENT), "First fragment of inline node found wasn't its first fragment!");*/ From af633b277816e6ee54b5763e50de3d02760d68f1 Mon Sep 17 00:00:00 2001 From: Permutator Date: Fri, 13 Jan 2017 14:17:48 -0800 Subject: [PATCH 20/22] Use parent padding box, not border box --- components/layout/query.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/components/layout/query.rs b/components/layout/query.rs index 502e533a9c2..5bc3f552236 100644 --- a/components/layout/query.rs +++ b/components/layout/query.rs @@ -636,9 +636,11 @@ impl FragmentBorderBoxIterator for ParentOffsetBorderBoxIterator { }; let parent_info = if is_valid_parent { + let border_width = fragment.border_width().to_physical(fragment.style.writing_mode); + Some(ParentBorderBoxInfo { node_address: fragment.node, - origin: border_box.origin, + origin: border_box.origin + Point2D::new(border_width.left, border_width.top), }) } else { None From 2cd538494dd419ad925dc41ad95993ba2149d980 Mon Sep 17 00:00:00 2001 From: Permutator Date: Fri, 13 Jan 2017 14:35:50 -0800 Subject: [PATCH 21/22] Don't take measurements from non-primary fragments --- components/layout/query.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/components/layout/query.rs b/components/layout/query.rs index 5bc3f552236..244b00590b1 100644 --- a/components/layout/query.rs +++ b/components/layout/query.rs @@ -549,10 +549,9 @@ impl FragmentBorderBoxIterator for ParentOffsetBorderBoxIterator { "Skipped at least one level in the flow tree!"); } - if fragment.is_hypothetical() { - // We're not interested in hypothetical fragments. The - // corresponding block will show up later if this fragment - // corresponds to the node we're looking for. + if !fragment.is_primary_fragment() { + // This fragment doesn't correspond to anything worth + // taking measurements from. if self.node_offset_box.is_none() { // If this is the only fragment in the flow, we need to From 400a267cf0de912e24e333b3c7dcfdb1792e2348 Mon Sep 17 00:00:00 2001 From: Permutator Date: Wed, 18 Jan 2017 08:44:11 -0800 Subject: [PATCH 22/22] /css-text-3_dev/html/word-break-normal-zh-000.htm fails on Mac --- .../css-text-3_dev/html/word-break-normal-zh-000.htm.ini | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-zh-000.htm.ini diff --git a/tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-zh-000.htm.ini b/tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-zh-000.htm.ini new file mode 100644 index 00000000000..b042003870b --- /dev/null +++ b/tests/wpt/metadata-css/css-text-3_dev/html/word-break-normal-zh-000.htm.ini @@ -0,0 +1,4 @@ +[word-break-normal-zh-000.htm] + type: reftest + expected: + if os == "mac": FAIL