mirror of
https://github.com/servo/servo.git
synced 2025-06-25 17:44:33 +01:00
script: Stop trusting pointers to DOM nodes that layout provides.
Pointers to DOM nodes from layout could go stale if incremental reflow does not correctly destroy dead nodes. Therefore, we ask the JavaScript garbage collector to verify that each DOM node is indeed a valid pointer before calling event handlers on it, and fail otherwise.
This commit is contained in:
parent
563d6ef91a
commit
7d447dbc06
8 changed files with 78 additions and 48 deletions
|
@ -850,31 +850,31 @@ impl ScriptTask {
|
|||
}
|
||||
let (port, chan) = Chan::new();
|
||||
match page.query_layout(HitTestQuery(root.unwrap(), point, chan), port) {
|
||||
Ok(node) => match node {
|
||||
HitTestResponse(node) => {
|
||||
debug!("clicked on {:s}", node.debug_str());
|
||||
let mut node = node;
|
||||
// traverse node generations until a node that is an element is found
|
||||
while !node.is_element() {
|
||||
match node.parent_node() {
|
||||
Some(parent) => {
|
||||
node = parent;
|
||||
}
|
||||
None => break
|
||||
}
|
||||
}
|
||||
if node.is_element() {
|
||||
node.with_imm_element(|element| {
|
||||
if "a" == element.tag_name {
|
||||
self.load_url_from_element(page, element)
|
||||
}
|
||||
})
|
||||
Ok(HitTestResponse(node_address)) => {
|
||||
debug!("node address is {:?}", node_address);
|
||||
let mut node = AbstractNode::from_untrusted_node_address(self.js_runtime
|
||||
.ptr,
|
||||
node_address);
|
||||
debug!("clicked on {:s}", node.debug_str());
|
||||
|
||||
// Traverse node generations until a node that is an element is
|
||||
// found.
|
||||
while !node.is_element() {
|
||||
match node.parent_node() {
|
||||
Some(parent) => node = parent,
|
||||
None => break,
|
||||
}
|
||||
}
|
||||
|
||||
if node.is_element() {
|
||||
node.with_imm_element(|element| {
|
||||
if "a" == element.tag_name {
|
||||
self.load_url_from_element(page, element)
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
Err(()) => {
|
||||
debug!("layout query error");
|
||||
}
|
||||
Err(()) => debug!("layout query error"),
|
||||
}
|
||||
}
|
||||
MouseDownEvent(..) => {}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue