aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/script/script_task.rs
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2014-01-13 21:00:18 -0800
committerPatrick Walton <pcwalton@mimiga.net>2014-01-14 21:51:24 -0800
commit7d447dbc062429b97d75bebd6fdea7878fbd049d (patch)
tree5903ac1ee64a8a9edf6cf4308daad8a96b5186cf /src/components/script/script_task.rs
parent563d6ef91a43a4ebefb87281db7e4813d2afcee6 (diff)
downloadservo-7d447dbc062429b97d75bebd6fdea7878fbd049d.tar.gz
servo-7d447dbc062429b97d75bebd6fdea7878fbd049d.zip
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.
Diffstat (limited to 'src/components/script/script_task.rs')
-rw-r--r--src/components/script/script_task.rs44
1 files changed, 22 insertions, 22 deletions
diff --git a/src/components/script/script_task.rs b/src/components/script/script_task.rs
index faec6d8031b..9ca9af2f8a6 100644
--- a/src/components/script/script_task.rs
+++ b/src/components/script/script_task.rs
@@ -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(..) => {}