aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/script/dom/element.rs10
-rw-r--r--components/script/dom/htmlbaseelement.rs8
-rw-r--r--components/script/dom/htmlbuttonelement.rs8
-rw-r--r--components/script/dom/htmliframeelement.rs8
-rw-r--r--components/script/dom/htmlinputelement.rs8
-rw-r--r--components/script/dom/htmloptionelement.rs8
-rw-r--r--components/script/dom/htmlselectelement.rs8
-rw-r--r--components/script/dom/htmltextareaelement.rs8
-rw-r--r--components/script/dom/node.rs14
-rw-r--r--components/script/dom/virtualmethods.rs6
10 files changed, 41 insertions, 45 deletions
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs
index e47879051e7..673fcacec32 100644
--- a/components/script/dom/element.rs
+++ b/components/script/dom/element.rs
@@ -53,7 +53,7 @@ use dom::htmltemplateelement::HTMLTemplateElement;
use dom::htmltextareaelement::{HTMLTextAreaElement, RawLayoutHTMLTextAreaElementHelpers};
use dom::namednodemap::NamedNodeMap;
use dom::node::{CLICK_IN_PROGRESS, LayoutNodeHelpers, Node};
-use dom::node::{NodeDamage, SEQUENTIALLY_FOCUSABLE};
+use dom::node::{NodeDamage, SEQUENTIALLY_FOCUSABLE, UnbindContext};
use dom::node::{document_from_node, window_from_node};
use dom::nodelist::NodeList;
use dom::text::Text;
@@ -1616,12 +1616,10 @@ impl VirtualMethods for Element {
}
}
- fn unbind_from_tree(&self, tree_in_doc: bool) {
- if let Some(ref s) = self.super_type() {
- s.unbind_from_tree(tree_in_doc);
- }
+ fn unbind_from_tree(&self, context: &UnbindContext) {
+ self.super_type().unwrap().unbind_from_tree(context);
- if !tree_in_doc {
+ if !context.tree_in_doc {
return;
}
diff --git a/components/script/dom/htmlbaseelement.rs b/components/script/dom/htmlbaseelement.rs
index e35469d5038..07b316b4e2e 100644
--- a/components/script/dom/htmlbaseelement.rs
+++ b/components/script/dom/htmlbaseelement.rs
@@ -9,7 +9,7 @@ use dom::bindings::js::Root;
use dom::document::Document;
use dom::element::{AttributeMutation, Element};
use dom::htmlelement::HTMLElement;
-use dom::node::{Node, document_from_node};
+use dom::node::{Node, UnbindContext, document_from_node};
use dom::virtualmethods::VirtualMethods;
use string_cache::Atom;
use url::{Url, UrlParser};
@@ -77,8 +77,8 @@ impl VirtualMethods for HTMLBaseElement {
self.bind_unbind(tree_in_doc);
}
- fn unbind_from_tree(&self, tree_in_doc: bool) {
- self.super_type().unwrap().unbind_from_tree(tree_in_doc);
- self.bind_unbind(tree_in_doc);
+ fn unbind_from_tree(&self, context: &UnbindContext) {
+ self.super_type().unwrap().unbind_from_tree(context);
+ self.bind_unbind(context.tree_in_doc);
}
}
diff --git a/components/script/dom/htmlbuttonelement.rs b/components/script/dom/htmlbuttonelement.rs
index 356f094f052..5fe391c8d33 100644
--- a/components/script/dom/htmlbuttonelement.rs
+++ b/components/script/dom/htmlbuttonelement.rs
@@ -16,7 +16,7 @@ use dom::htmlelement::HTMLElement;
use dom::htmlfieldsetelement::HTMLFieldSetElement;
use dom::htmlformelement::{FormControl, FormSubmitter};
use dom::htmlformelement::{SubmittedFrom, HTMLFormElement};
-use dom::node::{Node, document_from_node, window_from_node};
+use dom::node::{Node, UnbindContext, document_from_node, window_from_node};
use dom::nodelist::NodeList;
use dom::validitystate::ValidityState;
use dom::virtualmethods::VirtualMethods;
@@ -168,10 +168,8 @@ impl VirtualMethods for HTMLButtonElement {
self.upcast::<Element>().check_ancestors_disabled_state_for_form_control();
}
- fn unbind_from_tree(&self, tree_in_doc: bool) {
- if let Some(ref s) = self.super_type() {
- s.unbind_from_tree(tree_in_doc);
- }
+ fn unbind_from_tree(&self, context: &UnbindContext) {
+ self.super_type().unwrap().unbind_from_tree(context);
let node = self.upcast::<Node>();
let el = self.upcast::<Element>();
diff --git a/components/script/dom/htmliframeelement.rs b/components/script/dom/htmliframeelement.rs
index 72a38ce8c89..72be063c954 100644
--- a/components/script/dom/htmliframeelement.rs
+++ b/components/script/dom/htmliframeelement.rs
@@ -18,7 +18,7 @@ use dom::document::Document;
use dom::element::{AttributeMutation, Element, RawLayoutElementHelpers};
use dom::event::{Event, EventBubbles, EventCancelable};
use dom::htmlelement::HTMLElement;
-use dom::node::{Node, window_from_node};
+use dom::node::{Node, UnbindContext, window_from_node};
use dom::urlhelper::UrlHelper;
use dom::virtualmethods::VirtualMethods;
use dom::window::Window;
@@ -471,10 +471,8 @@ impl VirtualMethods for HTMLIFrameElement {
}
}
- fn unbind_from_tree(&self, tree_in_doc: bool) {
- if let Some(ref s) = self.super_type() {
- s.unbind_from_tree(tree_in_doc);
- }
+ fn unbind_from_tree(&self, context: &UnbindContext) {
+ self.super_type().unwrap().unbind_from_tree(context);
// https://html.spec.whatwg.org/multipage/#a-browsing-context-is-discarded
if let Some(pipeline_id) = self.pipeline_id.get() {
diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs
index 13af224bef1..42af9130303 100644
--- a/components/script/dom/htmlinputelement.rs
+++ b/components/script/dom/htmlinputelement.rs
@@ -23,7 +23,7 @@ use dom::htmlfieldsetelement::HTMLFieldSetElement;
use dom::htmlformelement::{FormControl, FormDatum, FormSubmitter, HTMLFormElement};
use dom::htmlformelement::{ResetFrom, SubmittedFrom};
use dom::keyboardevent::KeyboardEvent;
-use dom::node::{Node, NodeDamage};
+use dom::node::{Node, NodeDamage, UnbindContext};
use dom::node::{document_from_node, window_from_node};
use dom::nodelist::NodeList;
use dom::virtualmethods::VirtualMethods;
@@ -634,10 +634,8 @@ impl VirtualMethods for HTMLInputElement {
self.upcast::<Element>().check_ancestors_disabled_state_for_form_control();
}
- fn unbind_from_tree(&self, tree_in_doc: bool) {
- if let Some(ref s) = self.super_type() {
- s.unbind_from_tree(tree_in_doc);
- }
+ fn unbind_from_tree(&self, context: &UnbindContext) {
+ self.super_type().unwrap().unbind_from_tree(context);
let node = self.upcast::<Node>();
let el = self.upcast::<Element>();
diff --git a/components/script/dom/htmloptionelement.rs b/components/script/dom/htmloptionelement.rs
index 67e58b3d46e..3aff70c70f7 100644
--- a/components/script/dom/htmloptionelement.rs
+++ b/components/script/dom/htmloptionelement.rs
@@ -15,7 +15,7 @@ use dom::element::{AttributeMutation, Element};
use dom::htmlelement::HTMLElement;
use dom::htmlscriptelement::HTMLScriptElement;
use dom::htmlselectelement::HTMLSelectElement;
-use dom::node::Node;
+use dom::node::{Node, UnbindContext};
use dom::text::Text;
use dom::virtualmethods::VirtualMethods;
use selectors::states::*;
@@ -207,10 +207,8 @@ impl VirtualMethods for HTMLOptionElement {
self.pick_if_selected_and_reset();
}
- fn unbind_from_tree(&self, tree_in_doc: bool) {
- if let Some(ref s) = self.super_type() {
- s.unbind_from_tree(tree_in_doc);
- }
+ fn unbind_from_tree(&self, context: &UnbindContext) {
+ self.super_type().unwrap().unbind_from_tree(context);
let node = self.upcast::<Node>();
let el = self.upcast::<Element>();
diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs
index a9310997851..daf4d6f9ba5 100644
--- a/components/script/dom/htmlselectelement.rs
+++ b/components/script/dom/htmlselectelement.rs
@@ -16,7 +16,7 @@ use dom::htmlelement::HTMLElement;
use dom::htmlfieldsetelement::HTMLFieldSetElement;
use dom::htmlformelement::{FormControl, HTMLFormElement};
use dom::htmloptionelement::HTMLOptionElement;
-use dom::node::{Node, window_from_node};
+use dom::node::{Node, UnbindContext, window_from_node};
use dom::nodelist::NodeList;
use dom::validitystate::ValidityState;
use dom::virtualmethods::VirtualMethods;
@@ -196,10 +196,8 @@ impl VirtualMethods for HTMLSelectElement {
self.upcast::<Element>().check_ancestors_disabled_state_for_form_control();
}
- fn unbind_from_tree(&self, tree_in_doc: bool) {
- if let Some(ref s) = self.super_type() {
- s.unbind_from_tree(tree_in_doc);
- }
+ fn unbind_from_tree(&self, context: &UnbindContext) {
+ self.super_type().unwrap().unbind_from_tree(context);
let node = self.upcast::<Node>();
let el = self.upcast::<Element>();
diff --git a/components/script/dom/htmltextareaelement.rs b/components/script/dom/htmltextareaelement.rs
index 386d52f591d..8d856ff6b80 100644
--- a/components/script/dom/htmltextareaelement.rs
+++ b/components/script/dom/htmltextareaelement.rs
@@ -20,7 +20,7 @@ use dom::htmlelement::HTMLElement;
use dom::htmlfieldsetelement::HTMLFieldSetElement;
use dom::htmlformelement::{FormControl, HTMLFormElement};
use dom::keyboardevent::KeyboardEvent;
-use dom::node::{ChildrenMutation, Node, NodeDamage};
+use dom::node::{ChildrenMutation, Node, NodeDamage, UnbindContext};
use dom::node::{document_from_node, window_from_node};
use dom::nodelist::NodeList;
use dom::virtualmethods::VirtualMethods;
@@ -300,10 +300,8 @@ impl VirtualMethods for HTMLTextAreaElement {
}
}
- fn unbind_from_tree(&self, tree_in_doc: bool) {
- if let Some(ref s) = self.super_type() {
- s.unbind_from_tree(tree_in_doc);
- }
+ fn unbind_from_tree(&self, context: &UnbindContext) {
+ self.super_type().unwrap().unbind_from_tree(context);
let node = self.upcast::<Node>();
let el = self.upcast::<Element>();
diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs
index 4bf0a299cb5..2d5605e47c4 100644
--- a/components/script/dom/node.rs
+++ b/components/script/dom/node.rs
@@ -318,15 +318,18 @@ impl Node {
}
}
+ let context = UnbindContext {
+ tree_in_doc: child.is_in_doc(),
+ };
+
child.prev_sibling.set(None);
child.next_sibling.set(None);
child.parent_node.set(None);
self.children_count.set(self.children_count.get() - 1);
- let parent_in_doc = self.is_in_doc();
for node in child.traverse_preorder() {
node.set_flag(IS_IN_DOC, false);
- vtable_for(&&*node).unbind_from_tree(parent_in_doc);
+ vtable_for(&&*node).unbind_from_tree(&context);
node.layout_data.dispose(&node);
}
@@ -2420,3 +2423,10 @@ impl<'a> ChildrenMutation<'a> {
ChildrenMutation::ReplaceAll { removed: removed, added: added }
}
}
+
+/// The context of the unbinding from a tree of a node when one of its
+/// inclusive ancestors is removed.
+pub struct UnbindContext {
+ /// Whether the tree is in a document.
+ pub tree_in_doc: bool,
+}
diff --git a/components/script/dom/virtualmethods.rs b/components/script/dom/virtualmethods.rs
index d2a436606d7..3540fbddf0f 100644
--- a/components/script/dom/virtualmethods.rs
+++ b/components/script/dom/virtualmethods.rs
@@ -42,7 +42,7 @@ use dom::htmltablesectionelement::HTMLTableSectionElement;
use dom::htmltemplateelement::HTMLTemplateElement;
use dom::htmltextareaelement::HTMLTextAreaElement;
use dom::htmltitleelement::HTMLTitleElement;
-use dom::node::{ChildrenMutation, CloneChildrenFlag, Node};
+use dom::node::{ChildrenMutation, CloneChildrenFlag, Node, UnbindContext};
use string_cache::Atom;
use util::str::DOMString;
@@ -82,9 +82,9 @@ pub trait VirtualMethods {
/// 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) {
+ fn unbind_from_tree(&self, context: &UnbindContext) {
if let Some(ref s) = self.super_type() {
- s.unbind_from_tree(tree_in_doc);
+ s.unbind_from_tree(context);
}
}