From 982dd0c0f037ae0077fbdf322852b4d8cfce7bba Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Wed, 22 May 2013 14:14:33 -0400 Subject: [PATCH] Add document teardown operation to safely remove rooting for DOM tree and prevent leaks. --- src/components/servo/dom/document.rs | 21 ++++++++----------- src/components/servo/scripting/script_task.rs | 4 ++++ src/test/test_hammer_layout.js | 3 ++- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/components/servo/dom/document.rs b/src/components/servo/dom/document.rs index 8933ba9095b..3dc72981f62 100644 --- a/src/components/servo/dom/document.rs +++ b/src/components/servo/dom/document.rs @@ -34,18 +34,6 @@ pub fn Document(root: AbstractNode, window: Option<@mut Window>) -> @mut Documen doc } -#[unsafe_destructor] -impl Drop for Document { - fn finalize(&self) { - let compartment = global_script_context().js_compartment; - do self.root.with_base |base| { - assert!(base.wrapper.get_wrapper().is_not_null()); - let rootable = base.wrapper.get_rootable(); - JS_RemoveObjectRoot(compartment.cx.ptr, rootable); - } - } -} - pub impl Document { fn getElementsByTagName(&self, tag: DOMString) -> Option<@mut HTMLCollection> { let mut elements = ~[]; @@ -67,5 +55,14 @@ pub impl Document { window.content_changed() } } + + fn teardown(&self) { + let compartment = global_script_context().js_compartment; + do self.root.with_base |node| { + assert!(node.wrapper.get_wrapper().is_not_null()); + let rootable = node.wrapper.get_rootable(); + JS_RemoveObjectRoot(compartment.cx.ptr, rootable); + } + } } diff --git a/src/components/servo/scripting/script_task.rs b/src/components/servo/scripting/script_task.rs index 456e9985787..68697b6d82e 100644 --- a/src/components/servo/scripting/script_task.rs +++ b/src/components/servo/scripting/script_task.rs @@ -285,6 +285,10 @@ impl ScriptContext { /// Handles a request to exit the script task and shut down layout. fn handle_exit_msg(&mut self) { + self.join_layout(); + for self.root_frame.each |frame| { + frame.document.teardown(); + } self.layout_task.send(layout_task::ExitMsg) } diff --git a/src/test/test_hammer_layout.js b/src/test/test_hammer_layout.js index e5c1d51b92d..8312d8a439e 100644 --- a/src/test/test_hammer_layout.js +++ b/src/test/test_hammer_layout.js @@ -5,7 +5,8 @@ var count = 1000000; var start = new Date(); for (var i = 0; i < count; i++) { div.setAttribute('id', 'styled'); - div.getBoundingClientRect(); + //div.getBoundingClientRect(); } var stop = new Date(); window.alert((stop - start) / count * 1e6); +window.close(); \ No newline at end of file