mirror of
https://github.com/servo/servo.git
synced 2025-06-21 23:59:00 +01:00
Fixed ParentOffsetBorderBoxIterator's keeping track of parents
This commit is contained in:
parent
014ad76b97
commit
0a5218dc75
1 changed files with 7 additions and 7 deletions
|
@ -447,7 +447,6 @@ struct ParentBorderBoxInfo {
|
||||||
|
|
||||||
struct ParentOffsetBorderBoxIterator {
|
struct ParentOffsetBorderBoxIterator {
|
||||||
node_address: OpaqueNode,
|
node_address: OpaqueNode,
|
||||||
last_level: i32,
|
|
||||||
has_found_node: bool,
|
has_found_node: bool,
|
||||||
node_border_box: Rect<Au>,
|
node_border_box: Rect<Au>,
|
||||||
parent_nodes: Vec<Option<ParentBorderBoxInfo>>,
|
parent_nodes: Vec<Option<ParentBorderBoxInfo>>,
|
||||||
|
@ -457,7 +456,6 @@ impl ParentOffsetBorderBoxIterator {
|
||||||
fn new(node_address: OpaqueNode) -> ParentOffsetBorderBoxIterator {
|
fn new(node_address: OpaqueNode) -> ParentOffsetBorderBoxIterator {
|
||||||
ParentOffsetBorderBoxIterator {
|
ParentOffsetBorderBoxIterator {
|
||||||
node_address: node_address,
|
node_address: node_address,
|
||||||
last_level: -1,
|
|
||||||
has_found_node: false,
|
has_found_node: false,
|
||||||
node_border_box: Rect::zero(),
|
node_border_box: Rect::zero(),
|
||||||
parent_nodes: Vec::new(),
|
parent_nodes: Vec::new(),
|
||||||
|
@ -536,6 +534,10 @@ impl FragmentBorderBoxIterator for UnioningFragmentScrollAreaIterator {
|
||||||
// https://drafts.csswg.org/cssom-view/#extensions-to-the-htmlelement-interface
|
// https://drafts.csswg.org/cssom-view/#extensions-to-the-htmlelement-interface
|
||||||
impl FragmentBorderBoxIterator for ParentOffsetBorderBoxIterator {
|
impl FragmentBorderBoxIterator for ParentOffsetBorderBoxIterator {
|
||||||
fn process(&mut self, fragment: &Fragment, level: i32, border_box: &Rect<Au>) {
|
fn process(&mut self, fragment: &Fragment, level: i32, border_box: &Rect<Au>) {
|
||||||
|
// 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 {
|
if fragment.node == self.node_address {
|
||||||
// Found the fragment in the flow tree that matches the
|
// Found the fragment in the flow tree that matches the
|
||||||
// DOM node being looked for.
|
// DOM node being looked for.
|
||||||
|
@ -546,11 +548,11 @@ impl FragmentBorderBoxIterator for ParentOffsetBorderBoxIterator {
|
||||||
if fragment.style.get_box().position == computed_values::position::T::fixed {
|
if fragment.style.get_box().position == computed_values::position::T::fixed {
|
||||||
self.parent_nodes.clear();
|
self.parent_nodes.clear();
|
||||||
}
|
}
|
||||||
} else if level > self.last_level {
|
} else {
|
||||||
// TODO(gw): Is there a less fragile way of checking whether this
|
// TODO(gw): Is there a less fragile way of checking whether this
|
||||||
// fragment is the body element, rather than just checking that
|
// fragment is the body element, rather than just checking that
|
||||||
// the parent nodes stack contains the root node only?
|
// it's at level 1 (above the root node)?
|
||||||
let is_body_element = self.parent_nodes.len() == 1;
|
let is_body_element = level == 1;
|
||||||
|
|
||||||
let is_valid_parent = match (is_body_element,
|
let is_valid_parent = match (is_body_element,
|
||||||
fragment.style.get_box().position,
|
fragment.style.get_box().position,
|
||||||
|
@ -580,8 +582,6 @@ impl FragmentBorderBoxIterator for ParentOffsetBorderBoxIterator {
|
||||||
};
|
};
|
||||||
|
|
||||||
self.parent_nodes.push(parent_info);
|
self.parent_nodes.push(parent_info);
|
||||||
} else if level < self.last_level {
|
|
||||||
self.parent_nodes.pop();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue