diff options
-rw-r--r-- | components/script/dom/element.rs | 10 | ||||
-rw-r--r-- | components/script/dom/htmlbaseelement.rs | 8 | ||||
-rw-r--r-- | components/script/dom/htmlbuttonelement.rs | 8 | ||||
-rw-r--r-- | components/script/dom/htmliframeelement.rs | 8 | ||||
-rw-r--r-- | components/script/dom/htmlinputelement.rs | 8 | ||||
-rw-r--r-- | components/script/dom/htmloptionelement.rs | 8 | ||||
-rw-r--r-- | components/script/dom/htmlselectelement.rs | 8 | ||||
-rw-r--r-- | components/script/dom/htmltextareaelement.rs | 8 | ||||
-rw-r--r-- | components/script/dom/node.rs | 14 | ||||
-rw-r--r-- | components/script/dom/virtualmethods.rs | 6 |
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); } } |