aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFernando Jiménez Moreno <ferjmoreno@gmail.com>2019-03-05 18:01:59 +0100
committerFernando Jiménez Moreno <ferjmoreno@gmail.com>2019-04-26 11:31:18 +0200
commit813b242419d41505641b433c3b38b0d0542c559d (patch)
treeb0620df09b19e2a271e9d09994520349ba1e9a53
parent740aae06bad9e5ff864c914117cab1e74a727614 (diff)
downloadservo-813b242419d41505641b433c3b38b0d0542c559d.tar.gz
servo-813b242419d41505641b433c3b38b0d0542c559d.zip
Introduce BindContext with in_doc and connected flags
Fix some is_in_doc -> is_connected mistakes
-rw-r--r--components/script/dom/element.rs23
-rw-r--r--components/script/dom/htmlbaseelement.rs14
-rw-r--r--components/script/dom/htmlbodyelement.rs8
-rwxr-xr-xcomponents/script/dom/htmlbuttonelement.rs6
-rw-r--r--components/script/dom/htmlelement.rs6
-rw-r--r--components/script/dom/htmlheadelement.rs6
-rw-r--r--components/script/dom/htmliframeelement.rs9
-rw-r--r--components/script/dom/htmlimageelement.rs10
-rwxr-xr-xcomponents/script/dom/htmlinputelement.rs6
-rw-r--r--components/script/dom/htmllegendelement.rs6
-rw-r--r--components/script/dom/htmllinkelement.rs9
-rw-r--r--components/script/dom/htmlmetaelement.rs9
-rw-r--r--components/script/dom/htmloptionelement.rs6
-rw-r--r--components/script/dom/htmlscriptelement.rs8
-rwxr-xr-xcomponents/script/dom/htmlselectelement.rs7
-rw-r--r--components/script/dom/htmlsourceelement.rs6
-rw-r--r--components/script/dom/htmlstyleelement.rs10
-rwxr-xr-xcomponents/script/dom/htmltextareaelement.rs8
-rw-r--r--components/script/dom/htmltitleelement.rs10
-rw-r--r--components/script/dom/node.rs16
-rw-r--r--components/script/dom/virtualmethods.rs6
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);
}
}