mirror of
https://github.com/servo/servo.git
synced 2025-08-06 06:00:15 +01:00
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:
commit
39d2c0cb2c
5 changed files with 42 additions and 31 deletions
|
@ -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() {
|
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() {
|
match self.get_attribute(Null, "id").root() {
|
||||||
Some(attr) => {
|
Some(attr) => {
|
||||||
let doc = document_from_node(self).root();
|
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() {
|
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() {
|
match self.get_attribute(Null, "id").root() {
|
||||||
Some(attr) => {
|
Some(attr) => {
|
||||||
let doc = document_from_node(self).root();
|
let doc = document_from_node(self).root();
|
||||||
|
|
|
@ -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() {
|
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() {
|
match self.get_url() {
|
||||||
Some(url) => {
|
Some(url) => {
|
||||||
let sandboxed = if self.is_sandboxed() {
|
let sandboxed = if self.is_sandboxed() {
|
||||||
|
|
|
@ -50,10 +50,7 @@ pub trait StyleElementHelpers {
|
||||||
impl<'a> StyleElementHelpers for JSRef<'a, HTMLStyleElement> {
|
impl<'a> StyleElementHelpers for JSRef<'a, HTMLStyleElement> {
|
||||||
fn parse_own_css(&self) {
|
fn parse_own_css(&self) {
|
||||||
let node: &JSRef<Node> = NodeCast::from_ref(self);
|
let node: &JSRef<Node> = NodeCast::from_ref(self);
|
||||||
|
assert!(node.is_in_doc());
|
||||||
if !node.is_in_doc() {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let win = window_from_node(node).root();
|
let win = window_from_node(node).root();
|
||||||
let url = win.deref().page().get_url();
|
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),
|
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() {
|
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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -233,7 +233,7 @@ pub enum NodeTypeId {
|
||||||
|
|
||||||
trait PrivateNodeHelpers {
|
trait PrivateNodeHelpers {
|
||||||
fn node_inserted(&self);
|
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 add_child(&self, new_child: &JSRef<Node>, before: Option<JSRef<Node>>);
|
||||||
fn remove_child(&self, child: &JSRef<Node>);
|
fn remove_child(&self, child: &JSRef<Node>);
|
||||||
}
|
}
|
||||||
|
@ -243,11 +243,10 @@ impl<'a> PrivateNodeHelpers for JSRef<'a, Node> {
|
||||||
fn node_inserted(&self) {
|
fn node_inserted(&self) {
|
||||||
assert!(self.parent_node().is_some());
|
assert!(self.parent_node().is_some());
|
||||||
let document = document_from_node(self).root();
|
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() {
|
||||||
for node in self.traverse_preorder() {
|
vtable_for(&node).bind_to_tree(is_in_doc);
|
||||||
vtable_for(&node).bind_to_tree();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let parent = self.parent_node().root();
|
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
|
// 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());
|
assert!(self.parent_node().is_none());
|
||||||
let document = document_from_node(self).root();
|
let document = document_from_node(self).root();
|
||||||
|
|
||||||
for node in self.traverse_preorder() {
|
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(parent_in_doc);
|
||||||
vtable_for(&node).unbind_from_tree();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
document.deref().content_changed();
|
document.deref().content_changed();
|
||||||
|
@ -1187,8 +1185,9 @@ impl Node {
|
||||||
// Step 6: mutation records.
|
// Step 6: mutation records.
|
||||||
|
|
||||||
// Step 7.
|
// Step 7.
|
||||||
|
let parent_in_doc = parent.is_in_doc();
|
||||||
for removedNode in removedNodes.iter() {
|
for removedNode in removedNodes.iter() {
|
||||||
removedNode.node_removed();
|
removedNode.node_removed(parent_in_doc);
|
||||||
}
|
}
|
||||||
for addedNode in addedNodes.iter() {
|
for addedNode in addedNodes.iter() {
|
||||||
addedNode.node_inserted();
|
addedNode.node_inserted();
|
||||||
|
@ -1224,7 +1223,7 @@ impl Node {
|
||||||
// Step 9.
|
// Step 9.
|
||||||
match suppress_observers {
|
match suppress_observers {
|
||||||
Suppressed => (),
|
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 12-14.
|
||||||
// Step 13: mutation records.
|
// Step 13: mutation records.
|
||||||
child.node_removed();
|
child.node_removed(self.is_in_doc());
|
||||||
if node.type_id() == DocumentFragmentNodeTypeId {
|
if node.type_id() == DocumentFragmentNodeTypeId {
|
||||||
for child_node in node.children() {
|
for child_node in node.children() {
|
||||||
child_node.node_inserted();
|
child_node.node_inserted();
|
||||||
|
|
|
@ -60,18 +60,20 @@ pub trait VirtualMethods {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Called when a Node is appended to a tree that is part of a Document.
|
/// Called when a Node is appended to a tree, where 'tree_in_doc' indicates
|
||||||
fn bind_to_tree(&self) {
|
/// whether the tree is part of a Document.
|
||||||
|
fn bind_to_tree(&self, tree_in_doc: bool) {
|
||||||
match self.super_type() {
|
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.
|
/// Called when a Node is removed from a tree, where 'tree_in_doc'
|
||||||
fn unbind_from_tree(&self) {
|
/// indicates whether the tree is part of a Document.
|
||||||
|
fn unbind_from_tree(&self, tree_in_doc: bool) {
|
||||||
match self.super_type() {
|
match self.super_type() {
|
||||||
Some(ref s) => s.unbind_from_tree(),
|
Some(ref s) => s.unbind_from_tree(tree_in_doc),
|
||||||
_ => (),
|
_ => (),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue