diff options
author | Fernando Jiménez Moreno <ferjmoreno@gmail.com> | 2019-03-05 18:01:59 +0100 |
---|---|---|
committer | Fernando Jiménez Moreno <ferjmoreno@gmail.com> | 2019-04-26 11:31:18 +0200 |
commit | 813b242419d41505641b433c3b38b0d0542c559d (patch) | |
tree | b0620df09b19e2a271e9d09994520349ba1e9a53 | |
parent | 740aae06bad9e5ff864c914117cab1e74a727614 (diff) | |
download | servo-813b242419d41505641b433c3b38b0d0542c559d.tar.gz servo-813b242419d41505641b433c3b38b0d0542c559d.zip |
Introduce BindContext with in_doc and connected flags
Fix some is_in_doc -> is_connected mistakes
21 files changed, 105 insertions, 84 deletions
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 610df336541..9ba5f7c21a2 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -72,8 +72,8 @@ use crate::dom::htmltextareaelement::{HTMLTextAreaElement, LayoutHTMLTextAreaEle use crate::dom::mutationobserver::{Mutation, MutationObserver}; use crate::dom::namednodemap::NamedNodeMap; use crate::dom::node::{document_from_node, window_from_node}; +use crate::dom::node::{BindContext, NodeDamage, NodeFlags, UnbindContext}; use crate::dom::node::{ChildrenMutation, LayoutNodeHelpers, Node}; -use crate::dom::node::{NodeDamage, NodeFlags, UnbindContext}; use crate::dom::nodelist::NodeList; use crate::dom::promise::Promise; use crate::dom::servoparser::ServoParser; @@ -2800,28 +2800,28 @@ impl VirtualMethods for Element { } } - fn bind_to_tree(&self, tree_connected: bool) { + fn bind_to_tree(&self, context: &BindContext) { if let Some(ref s) = self.super_type() { - s.bind_to_tree(tree_connected); + s.bind_to_tree(context); } if let Some(f) = self.as_maybe_form_control() { f.bind_form_control_to_tree(); } - if !tree_connected { - return; - } - if let Some(shadow_root) = self.upcast::<Node>().owner_shadow_root() { let shadow_root = shadow_root.upcast::<Node>(); - shadow_root.set_flag(NodeFlags::IS_CONNECTED, tree_connected); + shadow_root.set_flag(NodeFlags::IS_CONNECTED, context.tree_connected); for node in shadow_root.children() { - node.set_flag(NodeFlags::IS_CONNECTED, tree_connected); - node.bind_to_tree(tree_connected); + node.set_flag(NodeFlags::IS_CONNECTED, context.tree_connected); + node.bind_to_tree(context); } } + if !context.tree_connected { + return; + } + let doc = document_from_node(self); if let Some(ref value) = *self.id_attribute.borrow() { if let Some(shadow_root) = self.upcast::<Node>().owner_shadow_root() { @@ -2847,8 +2847,7 @@ impl VirtualMethods for Element { let doc = document_from_node(self); - if self.is_shadow_host() { - let shadow_root = self.shadow_root.get().unwrap(); + if let Some(shadow_root) = self.shadow_root.get() { doc.unregister_shadow_root(&shadow_root); let shadow_root = shadow_root.upcast::<Node>(); shadow_root.set_flag(NodeFlags::IS_CONNECTED, false); diff --git a/components/script/dom/htmlbaseelement.rs b/components/script/dom/htmlbaseelement.rs index a08f3ba9c88..fc20091302d 100644 --- a/components/script/dom/htmlbaseelement.rs +++ b/components/script/dom/htmlbaseelement.rs @@ -11,7 +11,7 @@ use crate::dom::bindings::str::DOMString; use crate::dom::document::Document; use crate::dom::element::{AttributeMutation, Element}; use crate::dom::htmlelement::HTMLElement; -use crate::dom::node::{document_from_node, Node, UnbindContext}; +use crate::dom::node::{document_from_node, BindContext, Node, UnbindContext}; use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; @@ -63,8 +63,8 @@ impl HTMLBaseElement { /// Update the cached base element in response to binding or unbinding from /// a tree. - pub fn bind_unbind(&self, tree_connected: bool) { - if !tree_connected { + pub fn bind_unbind(&self, tree_in_doc: bool) { + if !tree_in_doc || self.upcast::<Node>().owner_shadow_root().is_some() { return; } @@ -119,13 +119,13 @@ impl VirtualMethods for HTMLBaseElement { } } - fn bind_to_tree(&self, tree_connected: bool) { - self.super_type().unwrap().bind_to_tree(tree_connected); - self.bind_unbind(tree_connected); + fn bind_to_tree(&self, context: &BindContext) { + self.super_type().unwrap().bind_to_tree(context); + self.bind_unbind(context.tree_in_doc); } fn unbind_from_tree(&self, context: &UnbindContext) { self.super_type().unwrap().unbind_from_tree(context); - self.bind_unbind(context.tree_connected); + self.bind_unbind(context.tree_in_doc); } } diff --git a/components/script/dom/htmlbodyelement.rs b/components/script/dom/htmlbodyelement.rs index ccef81f2cd8..f59d163d163 100644 --- a/components/script/dom/htmlbodyelement.rs +++ b/components/script/dom/htmlbodyelement.rs @@ -14,7 +14,7 @@ use crate::dom::document::Document; use crate::dom::element::{AttributeMutation, Element, RawLayoutElementHelpers}; use crate::dom::eventtarget::EventTarget; use crate::dom::htmlelement::HTMLElement; -use crate::dom::node::{document_from_node, window_from_node, Node}; +use crate::dom::node::{document_from_node, window_from_node, BindContext, Node}; use crate::dom::virtualmethods::VirtualMethods; use cssparser::RGBA; use dom_struct::dom_struct; @@ -149,12 +149,12 @@ impl VirtualMethods for HTMLBodyElement { .attribute_affects_presentational_hints(attr) } - fn bind_to_tree(&self, tree_connected: bool) { + fn bind_to_tree(&self, context: &BindContext) { if let Some(ref s) = self.super_type() { - s.bind_to_tree(tree_connected); + s.bind_to_tree(context); } - if !tree_connected { + if !context.tree_in_doc { return; } diff --git a/components/script/dom/htmlbuttonelement.rs b/components/script/dom/htmlbuttonelement.rs index 85bb5e2ea56..a7b8dacd060 100755 --- a/components/script/dom/htmlbuttonelement.rs +++ b/components/script/dom/htmlbuttonelement.rs @@ -18,7 +18,7 @@ use crate::dom::htmlfieldsetelement::HTMLFieldSetElement; use crate::dom::htmlformelement::HTMLFormElement; use crate::dom::htmlformelement::{FormControl, FormDatum, FormDatumValue}; use crate::dom::htmlformelement::{FormSubmitter, ResetFrom, SubmittedFrom}; -use crate::dom::node::{document_from_node, window_from_node, Node, UnbindContext}; +use crate::dom::node::{document_from_node, window_from_node, BindContext, Node, UnbindContext}; use crate::dom::nodelist::NodeList; use crate::dom::validation::Validatable; use crate::dom::validitystate::{ValidationFlags, ValidityState}; @@ -232,9 +232,9 @@ impl VirtualMethods for HTMLButtonElement { } } - fn bind_to_tree(&self, tree_connected: bool) { + fn bind_to_tree(&self, context: &BindContext) { if let Some(ref s) = self.super_type() { - s.bind_to_tree(tree_connected); + s.bind_to_tree(context); } self.upcast::<Element>() diff --git a/components/script/dom/htmlelement.rs b/components/script/dom/htmlelement.rs index 4bbbfd14cb7..95ac9918996 100644 --- a/components/script/dom/htmlelement.rs +++ b/components/script/dom/htmlelement.rs @@ -28,7 +28,7 @@ use crate::dom::htmlhtmlelement::HTMLHtmlElement; use crate::dom::htmlinputelement::{HTMLInputElement, InputType}; use crate::dom::htmllabelelement::HTMLLabelElement; use crate::dom::node::{document_from_node, window_from_node}; -use crate::dom::node::{Node, NodeFlags, ShadowIncluding}; +use crate::dom::node::{BindContext, Node, NodeFlags, ShadowIncluding}; use crate::dom::nodelist::NodeList; use crate::dom::text::Text; use crate::dom::virtualmethods::VirtualMethods; @@ -740,9 +740,9 @@ impl VirtualMethods for HTMLElement { } } - fn bind_to_tree(&self, tree_in_doc: bool) { + fn bind_to_tree(&self, context: &BindContext) { if let Some(ref s) = self.super_type() { - s.bind_to_tree(tree_in_doc); + s.bind_to_tree(context); } self.update_sequentially_focusable_status(); } diff --git a/components/script/dom/htmlheadelement.rs b/components/script/dom/htmlheadelement.rs index 0cea69dff5e..0389ff9b43b 100644 --- a/components/script/dom/htmlheadelement.rs +++ b/components/script/dom/htmlheadelement.rs @@ -10,7 +10,7 @@ use crate::dom::document::{determine_policy_for_token, Document}; use crate::dom::element::Element; use crate::dom::htmlelement::HTMLElement; use crate::dom::htmlmetaelement::HTMLMetaElement; -use crate::dom::node::{document_from_node, Node, ShadowIncluding}; +use crate::dom::node::{document_from_node, BindContext, Node, ShadowIncluding}; use crate::dom::userscripts::load_script; use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; @@ -81,9 +81,9 @@ impl VirtualMethods for HTMLHeadElement { fn super_type(&self) -> Option<&dyn VirtualMethods> { Some(self.upcast::<HTMLElement>() as &dyn VirtualMethods) } - fn bind_to_tree(&self, tree_connected: bool) { + fn bind_to_tree(&self, context: &BindContext) { if let Some(ref s) = self.super_type() { - s.bind_to_tree(tree_connected); + s.bind_to_tree(context); } load_script(self); } diff --git a/components/script/dom/htmliframeelement.rs b/components/script/dom/htmliframeelement.rs index a1afa73bddc..a85b9bfa915 100644 --- a/components/script/dom/htmliframeelement.rs +++ b/components/script/dom/htmliframeelement.rs @@ -19,7 +19,9 @@ use crate::dom::element::{AttributeMutation, Element, RawLayoutElementHelpers}; use crate::dom::eventtarget::EventTarget; use crate::dom::globalscope::GlobalScope; use crate::dom::htmlelement::HTMLElement; -use crate::dom::node::{document_from_node, window_from_node, Node, NodeDamage, UnbindContext}; +use crate::dom::node::{ + document_from_node, window_from_node, BindContext, Node, NodeDamage, UnbindContext, +}; use crate::dom::virtualmethods::VirtualMethods; use crate::dom::window::ReflowReason; use crate::dom::windowproxy::WindowProxy; @@ -610,11 +612,12 @@ impl VirtualMethods for HTMLIFrameElement { } } - fn bind_to_tree(&self, tree_connected: bool) { + fn bind_to_tree(&self, context: &BindContext) { if let Some(ref s) = self.super_type() { - s.bind_to_tree(tree_connected); + s.bind_to_tree(context); } + let tree_connected = context.tree_connected; let iframe = Trusted::new(self); document_from_node(self).add_delayed_task(task!(IFrameDelayedInitialize: move || { let this = iframe.root(); diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs index efb372770b1..62a369579a1 100644 --- a/components/script/dom/htmlimageelement.rs +++ b/components/script/dom/htmlimageelement.rs @@ -33,7 +33,9 @@ use crate::dom::htmlpictureelement::HTMLPictureElement; use crate::dom::htmlsourceelement::HTMLSourceElement; use crate::dom::mouseevent::MouseEvent; use crate::dom::node::UnbindContext; -use crate::dom::node::{document_from_node, window_from_node, Node, NodeDamage, ShadowIncluding}; +use crate::dom::node::{ + document_from_node, window_from_node, BindContext, Node, NodeDamage, ShadowIncluding, +}; use crate::dom::performanceresourcetiming::InitiatorType; use crate::dom::progressevent::ProgressEvent; use crate::dom::values::UNSIGNED_LONG_MAX; @@ -1646,12 +1648,12 @@ impl VirtualMethods for HTMLImageElement { } } - fn bind_to_tree(&self, tree_connected: bool) { + fn bind_to_tree(&self, context: &BindContext) { if let Some(ref s) = self.super_type() { - s.bind_to_tree(tree_connected); + s.bind_to_tree(context); } let document = document_from_node(self); - if tree_connected { + if context.tree_connected { document.register_responsive_image(self); } diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs index 7adda0a1cae..e9a3923b5d0 100755 --- a/components/script/dom/htmlinputelement.rs +++ b/components/script/dom/htmlinputelement.rs @@ -35,7 +35,7 @@ use crate::dom::htmlformelement::{ResetFrom, SubmittedFrom}; use crate::dom::keyboardevent::KeyboardEvent; use crate::dom::mouseevent::MouseEvent; use crate::dom::node::{document_from_node, window_from_node}; -use crate::dom::node::{Node, NodeDamage, UnbindContext}; +use crate::dom::node::{BindContext, Node, NodeDamage, UnbindContext}; use crate::dom::nodelist::NodeList; use crate::dom::textcontrol::{TextControlElement, TextControlSelection}; use crate::dom::validation::Validatable; @@ -1422,9 +1422,9 @@ impl VirtualMethods for HTMLInputElement { } } - fn bind_to_tree(&self, tree_connected: bool) { + fn bind_to_tree(&self, context: &BindContext) { if let Some(ref s) = self.super_type() { - s.bind_to_tree(tree_connected); + s.bind_to_tree(context); } self.upcast::<Element>() .check_ancestors_disabled_state_for_form_control(); diff --git a/components/script/dom/htmllegendelement.rs b/components/script/dom/htmllegendelement.rs index a623eb5cd79..41cf7d3d8ff 100644 --- a/components/script/dom/htmllegendelement.rs +++ b/components/script/dom/htmllegendelement.rs @@ -12,7 +12,7 @@ use crate::dom::element::Element; use crate::dom::htmlelement::HTMLElement; use crate::dom::htmlfieldsetelement::HTMLFieldSetElement; use crate::dom::htmlformelement::{FormControl, HTMLFormElement}; -use crate::dom::node::{Node, UnbindContext}; +use crate::dom::node::{BindContext, Node, UnbindContext}; use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; @@ -56,9 +56,9 @@ impl VirtualMethods for HTMLLegendElement { Some(self.upcast::<HTMLElement>() as &dyn VirtualMethods) } - fn bind_to_tree(&self, tree_connected: bool) { + fn bind_to_tree(&self, context: &BindContext) { if let Some(ref s) = self.super_type() { - s.bind_to_tree(tree_connected); + s.bind_to_tree(context); } self.upcast::<Element>() diff --git a/components/script/dom/htmllinkelement.rs b/components/script/dom/htmllinkelement.rs index d47d9343e53..8dd50c11441 100644 --- a/components/script/dom/htmllinkelement.rs +++ b/components/script/dom/htmllinkelement.rs @@ -19,7 +19,8 @@ use crate::dom::element::{ use crate::dom::element::{AttributeMutation, Element, ElementCreator}; use crate::dom::htmlelement::HTMLElement; use crate::dom::node::{ - document_from_node, stylesheets_owner_from_node, window_from_node, Node, UnbindContext, + document_from_node, stylesheets_owner_from_node, window_from_node, BindContext, Node, + UnbindContext, }; use crate::dom::stylesheet::StyleSheet as DOMStyleSheet; use crate::dom::virtualmethods::VirtualMethods; @@ -225,12 +226,12 @@ impl VirtualMethods for HTMLLinkElement { } } - fn bind_to_tree(&self, tree_connected: bool) { + fn bind_to_tree(&self, context: &BindContext) { if let Some(ref s) = self.super_type() { - s.bind_to_tree(tree_connected); + s.bind_to_tree(context); } - if tree_connected { + if context.tree_connected { let element = self.upcast(); let rel = get_attr(element, &local_name!("rel")); diff --git a/components/script/dom/htmlmetaelement.rs b/components/script/dom/htmlmetaelement.rs index ffaf30e89f7..11b5706516d 100644 --- a/components/script/dom/htmlmetaelement.rs +++ b/components/script/dom/htmlmetaelement.rs @@ -16,7 +16,8 @@ use crate::dom::element::{AttributeMutation, Element}; use crate::dom::htmlelement::HTMLElement; use crate::dom::htmlheadelement::HTMLHeadElement; use crate::dom::node::{ - document_from_node, stylesheets_owner_from_node, window_from_node, Node, UnbindContext, + document_from_node, stylesheets_owner_from_node, window_from_node, BindContext, Node, + UnbindContext, }; use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; @@ -175,12 +176,12 @@ impl VirtualMethods for HTMLMetaElement { Some(self.upcast::<HTMLElement>() as &dyn VirtualMethods) } - fn bind_to_tree(&self, tree_connected: bool) { + fn bind_to_tree(&self, context: &BindContext) { if let Some(ref s) = self.super_type() { - s.bind_to_tree(tree_connected); + s.bind_to_tree(context); } - if tree_connected { + if context.tree_connected { self.process_attributes(); } } diff --git a/components/script/dom/htmloptionelement.rs b/components/script/dom/htmloptionelement.rs index e232aa63712..e9e2ce89c28 100644 --- a/components/script/dom/htmloptionelement.rs +++ b/components/script/dom/htmloptionelement.rs @@ -19,7 +19,7 @@ use crate::dom::htmlformelement::HTMLFormElement; use crate::dom::htmloptgroupelement::HTMLOptGroupElement; use crate::dom::htmlscriptelement::HTMLScriptElement; use crate::dom::htmlselectelement::HTMLSelectElement; -use crate::dom::node::{Node, UnbindContext}; +use crate::dom::node::{BindContext, Node, UnbindContext}; use crate::dom::text::Text; use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; @@ -235,9 +235,9 @@ impl VirtualMethods for HTMLOptionElement { } } - fn bind_to_tree(&self, tree_connected: bool) { + fn bind_to_tree(&self, context: &BindContext) { if let Some(ref s) = self.super_type() { - s.bind_to_tree(tree_connected); + s.bind_to_tree(context); } self.upcast::<Element>() diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 299c66a04d8..8d44c4b9ffd 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -22,7 +22,7 @@ use crate::dom::event::{Event, EventBubbles, EventCancelable, EventStatus}; use crate::dom::globalscope::GlobalScope; use crate::dom::htmlelement::HTMLElement; use crate::dom::node::{document_from_node, window_from_node}; -use crate::dom::node::{ChildrenMutation, CloneChildrenFlag, Node}; +use crate::dom::node::{BindContext, ChildrenMutation, CloneChildrenFlag, Node}; use crate::dom::performanceresourcetiming::InitiatorType; use crate::dom::virtualmethods::VirtualMethods; use crate::network_listener::{self, NetworkListener, PreInvoke, ResourceTimingListener}; @@ -778,12 +778,12 @@ impl VirtualMethods for HTMLScriptElement { } } - fn bind_to_tree(&self, is_connected: bool) { + fn bind_to_tree(&self, context: &BindContext) { if let Some(ref s) = self.super_type() { - s.bind_to_tree(is_connected); + s.bind_to_tree(context); } - if is_connected && !self.parser_inserted.get() { + if context.tree_connected && !self.parser_inserted.get() { let script = Trusted::new(self); document_from_node(self).add_delayed_task(task!(ScriptDelayedInitialize: move || { script.root().prepare(); diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index 4bcdcc85160..c71a5442e73 100755 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -12,7 +12,6 @@ use crate::dom::bindings::codegen::Bindings::HTMLSelectElementBinding::HTMLSelec use crate::dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; use crate::dom::bindings::codegen::UnionTypes::HTMLElementOrLong; use crate::dom::bindings::codegen::UnionTypes::HTMLOptionElementOrHTMLOptGroupElement; -//use dom::bindings::error::ErrorResult; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::root::{DomRoot, MutNullableDom}; use crate::dom::bindings::str::DOMString; @@ -25,7 +24,7 @@ use crate::dom::htmlformelement::{FormControl, FormDatum, FormDatumValue, HTMLFo use crate::dom::htmloptgroupelement::HTMLOptGroupElement; use crate::dom::htmloptionelement::HTMLOptionElement; use crate::dom::htmloptionscollection::HTMLOptionsCollection; -use crate::dom::node::{window_from_node, Node, UnbindContext}; +use crate::dom::node::{window_from_node, BindContext, Node, UnbindContext}; use crate::dom::nodelist::NodeList; use crate::dom::validation::Validatable; use crate::dom::validitystate::{ValidationFlags, ValidityState}; @@ -382,9 +381,9 @@ impl VirtualMethods for HTMLSelectElement { } } - fn bind_to_tree(&self, tree_connected: bool) { + fn bind_to_tree(&self, context: &BindContext) { if let Some(ref s) = self.super_type() { - s.bind_to_tree(tree_connected); + s.bind_to_tree(context); } self.upcast::<Element>() diff --git a/components/script/dom/htmlsourceelement.rs b/components/script/dom/htmlsourceelement.rs index 22a03f5ae6c..f93de93599d 100644 --- a/components/script/dom/htmlsourceelement.rs +++ b/components/script/dom/htmlsourceelement.rs @@ -15,7 +15,7 @@ use crate::dom::element::AttributeMutation; use crate::dom::htmlelement::HTMLElement; use crate::dom::htmlimageelement::HTMLImageElement; use crate::dom::htmlmediaelement::HTMLMediaElement; -use crate::dom::node::{Node, UnbindContext}; +use crate::dom::node::{BindContext, Node, UnbindContext}; use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; @@ -82,8 +82,8 @@ impl VirtualMethods for HTMLSourceElement { } /// <https://html.spec.whatwg.org/multipage/#the-source-element:nodes-are-inserted> - fn bind_to_tree(&self, tree_connected: bool) { - self.super_type().unwrap().bind_to_tree(tree_connected); + fn bind_to_tree(&self, context: &BindContext) { + self.super_type().unwrap().bind_to_tree(context); let parent = self.upcast::<Node>().GetParentNode().unwrap(); if let Some(media) = parent.downcast::<HTMLMediaElement>() { media.handle_source_child_insertion(); diff --git a/components/script/dom/htmlstyleelement.rs b/components/script/dom/htmlstyleelement.rs index 4c2d934a892..e483453252a 100644 --- a/components/script/dom/htmlstyleelement.rs +++ b/components/script/dom/htmlstyleelement.rs @@ -13,8 +13,8 @@ use crate::dom::document::Document; use crate::dom::element::{Element, ElementCreator}; use crate::dom::htmlelement::HTMLElement; use crate::dom::node::{ - document_from_node, stylesheets_owner_from_node, window_from_node, ChildrenMutation, Node, - UnbindContext, + document_from_node, stylesheets_owner_from_node, window_from_node, BindContext, + ChildrenMutation, Node, UnbindContext, }; use crate::dom::stylesheet::StyleSheet as DOMStyleSheet; use crate::dom::virtualmethods::VirtualMethods; @@ -187,14 +187,14 @@ impl VirtualMethods for HTMLStyleElement { } } - fn bind_to_tree(&self, tree_connected: bool) { - self.super_type().unwrap().bind_to_tree(tree_connected); + fn bind_to_tree(&self, context: &BindContext) { + self.super_type().unwrap().bind_to_tree(context); // https://html.spec.whatwg.org/multipage/#update-a-style-block // Handles the case when: // "The element is not on the stack of open elements of an HTML parser or XML parser, // and it becomes connected or disconnected." - if tree_connected && !self.in_stack_of_open_elements.get() { + if context.tree_connected && !self.in_stack_of_open_elements.get() { self.parse_own_css(); } } diff --git a/components/script/dom/htmltextareaelement.rs b/components/script/dom/htmltextareaelement.rs index 39057da6347..34dd94b7a36 100755 --- a/components/script/dom/htmltextareaelement.rs +++ b/components/script/dom/htmltextareaelement.rs @@ -24,7 +24,9 @@ use crate::dom::htmlfieldsetelement::HTMLFieldSetElement; use crate::dom::htmlformelement::{FormControl, HTMLFormElement}; use crate::dom::keyboardevent::KeyboardEvent; use crate::dom::node::{document_from_node, window_from_node}; -use crate::dom::node::{ChildrenMutation, CloneChildrenFlag, Node, NodeDamage, UnbindContext}; +use crate::dom::node::{ + BindContext, ChildrenMutation, CloneChildrenFlag, Node, NodeDamage, UnbindContext, +}; use crate::dom::nodelist::NodeList; use crate::dom::textcontrol::{TextControlElement, TextControlSelection}; use crate::dom::validation::Validatable; @@ -466,9 +468,9 @@ impl VirtualMethods for HTMLTextAreaElement { } } - fn bind_to_tree(&self, tree_connected: bool) { + fn bind_to_tree(&self, context: &BindContext) { if let Some(ref s) = self.super_type() { - s.bind_to_tree(tree_connected); + s.bind_to_tree(context); } self.upcast::<Element>() diff --git a/components/script/dom/htmltitleelement.rs b/components/script/dom/htmltitleelement.rs index 1c26580eec5..a1e543d34e2 100644 --- a/components/script/dom/htmltitleelement.rs +++ b/components/script/dom/htmltitleelement.rs @@ -10,7 +10,7 @@ use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::document::Document; use crate::dom::htmlelement::HTMLElement; -use crate::dom::node::{ChildrenMutation, Node}; +use crate::dom::node::{BindContext, ChildrenMutation, Node}; use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; @@ -69,17 +69,17 @@ impl VirtualMethods for HTMLTitleElement { s.children_changed(mutation); } let node = self.upcast::<Node>(); - if node.is_connected() { + if node.is_in_doc() { node.owner_doc().title_changed(); } } - fn bind_to_tree(&self, tree_connected: bool) { + fn bind_to_tree(&self, context: &BindContext) { if let Some(ref s) = self.super_type() { - s.bind_to_tree(tree_connected); + s.bind_to_tree(context); } let node = self.upcast::<Node>(); - if tree_connected { + if context.tree_in_doc { node.owner_doc().title_changed(); } } diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index 22e157f3132..8070481045a 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -296,7 +296,10 @@ impl Node { node.set_flag(NodeFlags::IS_CONNECTED, parent_is_connected); // Out-of-document elements never have the descendants flag set. debug_assert!(!node.get_flag(NodeFlags::HAS_DIRTY_DESCENDANTS)); - vtable_for(&&*node).bind_to_tree(parent_is_connected); + vtable_for(&&*node).bind_to_tree(&BindContext { + tree_connected: parent_is_connected, + tree_in_doc: parent_in_doc, + }); } } @@ -3025,6 +3028,14 @@ impl<'a> ChildrenMutation<'a> { } } +/// The context of the binding to tree of a node. +pub struct BindContext { + /// Whether the tree is connected. + pub tree_connected: bool, + /// Whether the tree is in the document. + pub tree_in_doc: bool, +} + /// The context of the unbinding from a tree of a node when one of its /// inclusive ancestors is removed. pub struct UnbindContext<'a> { @@ -3038,6 +3049,8 @@ pub struct UnbindContext<'a> { pub next_sibling: Option<&'a Node>, /// Whether the tree is connected. pub tree_connected: bool, + /// Whether the tree is in doc. + pub tree_in_doc: bool, } impl<'a> UnbindContext<'a> { @@ -3054,6 +3067,7 @@ impl<'a> UnbindContext<'a> { prev_sibling: prev_sibling, next_sibling: next_sibling, tree_connected: parent.is_connected(), + tree_in_doc: parent.is_in_doc(), } } diff --git a/components/script/dom/virtualmethods.rs b/components/script/dom/virtualmethods.rs index 2bb90e93b53..f3b8b633232 100644 --- a/components/script/dom/virtualmethods.rs +++ b/components/script/dom/virtualmethods.rs @@ -51,7 +51,7 @@ use crate::dom::htmltemplateelement::HTMLTemplateElement; use crate::dom::htmltextareaelement::HTMLTextAreaElement; use crate::dom::htmltitleelement::HTMLTitleElement; use crate::dom::htmlvideoelement::HTMLVideoElement; -use crate::dom::node::{ChildrenMutation, CloneChildrenFlag, Node, UnbindContext}; +use crate::dom::node::{BindContext, ChildrenMutation, CloneChildrenFlag, Node, UnbindContext}; use crate::dom::svgsvgelement::SVGSVGElement; use html5ever::LocalName; use style::attr::AttrValue; @@ -92,9 +92,9 @@ pub trait VirtualMethods { /// Called when a Node is appended to a tree, where 'tree_connected' indicates /// whether the tree is part of a Document. - fn bind_to_tree(&self, tree_connected: bool) { + fn bind_to_tree(&self, context: &BindContext) { if let Some(ref s) = self.super_type() { - s.bind_to_tree(tree_connected); + s.bind_to_tree(context); } } |