Merge pull request #2835 from brunoabinader/bind_to_tree_fix

Added 'parent is/was in tree' param to bind_to_tree/unbind_from_tree; r=Ms2ger
This commit is contained in:
Ms2ger 2014-07-16 15:55:36 +02:00
commit 39d2c0cb2c
5 changed files with 42 additions and 31 deletions

View file

@ -836,12 +836,14 @@ impl<'a> VirtualMethods for JSRef<'a, Element> {
}
}
fn bind_to_tree(&self) {
fn bind_to_tree(&self, tree_in_doc: bool) {
match self.super_type() {
Some(ref s) => s.bind_to_tree(),
Some(ref s) => s.bind_to_tree(tree_in_doc),
_ => (),
}
if !tree_in_doc { return; }
match self.get_attribute(Null, "id").root() {
Some(attr) => {
let doc = document_from_node(self).root();
@ -851,12 +853,14 @@ impl<'a> VirtualMethods for JSRef<'a, Element> {
}
}
fn unbind_from_tree(&self) {
fn unbind_from_tree(&self, tree_in_doc: bool) {
match self.super_type() {
Some(ref s) => s.unbind_from_tree(),
Some(ref s) => s.unbind_from_tree(tree_in_doc),
_ => (),
}
if !tree_in_doc { return; }
match self.get_attribute(Null, "id").root() {
Some(attr) => {
let doc = document_from_node(self).root();

View file

@ -176,12 +176,14 @@ impl<'a> VirtualMethods for JSRef<'a, HTMLIFrameElement> {
}
}
fn bind_to_tree(&self) {
fn bind_to_tree(&self, tree_in_doc: bool) {
match self.super_type() {
Some(ref s) => s.bind_to_tree(),
Some(ref s) => s.bind_to_tree(tree_in_doc),
_ => (),
}
if !tree_in_doc { return; }
match self.get_url() {
Some(url) => {
let sandboxed = if self.is_sandboxed() {

View file

@ -50,10 +50,7 @@ pub trait StyleElementHelpers {
impl<'a> StyleElementHelpers for JSRef<'a, HTMLStyleElement> {
fn parse_own_css(&self) {
let node: &JSRef<Node> = NodeCast::from_ref(self);
if !node.is_in_doc() {
return;
}
assert!(node.is_in_doc());
let win = window_from_node(node).root();
let url = win.deref().page().get_url();
@ -76,15 +73,22 @@ impl<'a> VirtualMethods for JSRef<'a, HTMLStyleElement> {
Some(ref s) => s.child_inserted(child),
_ => (),
}
self.parse_own_css();
let node: &JSRef<Node> = NodeCast::from_ref(self);
if node.is_in_doc() {
self.parse_own_css();
}
}
fn bind_to_tree(&self) {
fn bind_to_tree(&self, tree_in_doc: bool) {
match self.super_type() {
Some(ref s) => s.bind_to_tree(),
Some(ref s) => s.bind_to_tree(tree_in_doc),
_ => ()
}
self.parse_own_css();
if tree_in_doc {
self.parse_own_css();
}
}
}

View file

@ -233,7 +233,7 @@ pub enum NodeTypeId {
trait PrivateNodeHelpers {
fn node_inserted(&self);
fn node_removed(&self);
fn node_removed(&self, parent_in_doc: bool);
fn add_child(&self, new_child: &JSRef<Node>, before: Option<JSRef<Node>>);
fn remove_child(&self, child: &JSRef<Node>);
}
@ -243,11 +243,10 @@ impl<'a> PrivateNodeHelpers for JSRef<'a, Node> {
fn node_inserted(&self) {
assert!(self.parent_node().is_some());
let document = document_from_node(self).root();
let is_in_doc = self.is_in_doc();
if self.is_in_doc() {
for node in self.traverse_preorder() {
vtable_for(&node).bind_to_tree();
}
for node in self.traverse_preorder() {
vtable_for(&node).bind_to_tree(is_in_doc);
}
let parent = self.parent_node().root();
@ -257,13 +256,12 @@ impl<'a> PrivateNodeHelpers for JSRef<'a, Node> {
}
// http://dom.spec.whatwg.org/#node-is-removed
fn node_removed(&self) {
fn node_removed(&self, parent_in_doc: bool) {
assert!(self.parent_node().is_none());
let document = document_from_node(self).root();
for node in self.traverse_preorder() {
// XXX how about if the node wasn't in the tree in the first place?
vtable_for(&node).unbind_from_tree();
vtable_for(&node).unbind_from_tree(parent_in_doc);
}
document.deref().content_changed();
@ -1187,8 +1185,9 @@ impl Node {
// Step 6: mutation records.
// Step 7.
let parent_in_doc = parent.is_in_doc();
for removedNode in removedNodes.iter() {
removedNode.node_removed();
removedNode.node_removed(parent_in_doc);
}
for addedNode in addedNodes.iter() {
addedNode.node_inserted();
@ -1224,7 +1223,7 @@ impl Node {
// Step 9.
match suppress_observers {
Suppressed => (),
Unsuppressed => node.node_removed(),
Unsuppressed => node.node_removed(parent.is_in_doc()),
}
}
@ -1713,7 +1712,7 @@ impl<'a> NodeMethods for JSRef<'a, Node> {
// Step 12-14.
// Step 13: mutation records.
child.node_removed();
child.node_removed(self.is_in_doc());
if node.type_id() == DocumentFragmentNodeTypeId {
for child_node in node.children() {
child_node.node_inserted();

View file

@ -60,18 +60,20 @@ pub trait VirtualMethods {
}
}
/// Called when a Node is appended to a tree that is part of a Document.
fn bind_to_tree(&self) {
/// Called when a Node is appended to a tree, where 'tree_in_doc' indicates
/// whether the tree is part of a Document.
fn bind_to_tree(&self, tree_in_doc: bool) {
match self.super_type() {
Some(ref s) => s.bind_to_tree(),
Some(ref s) => s.bind_to_tree(tree_in_doc),
_ => (),
}
}
/// Called when a Node is removed from a tree that is part of a Document.
fn unbind_from_tree(&self) {
/// Called when a Node is removed from a tree, where 'tree_in_doc'
/// indicates whether the tree is part of a Document.
fn unbind_from_tree(&self, tree_in_doc: bool) {
match self.super_type() {
Some(ref s) => s.unbind_from_tree(),
Some(ref s) => s.unbind_from_tree(tree_in_doc),
_ => (),
}
}