aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/attr.rs5
-rw-r--r--components/script/dom/bindings/codegen/Bindings.conf120
-rw-r--r--components/script/dom/bindings/codegen/CodegenRust.py1
-rw-r--r--components/script/dom/bindings/constructor.rs5
-rw-r--r--components/script/dom/cdatasection.rs4
-rw-r--r--components/script/dom/characterdata.rs33
-rw-r--r--components/script/dom/comment.rs6
-rw-r--r--components/script/dom/create.rs15
-rw-r--r--components/script/dom/cssstyledeclaration.rs144
-rw-r--r--components/script/dom/document.rs63
-rw-r--r--components/script/dom/documentfragment.rs22
-rw-r--r--components/script/dom/documenttype.rs15
-rw-r--r--components/script/dom/domimplementation.rs11
-rw-r--r--components/script/dom/domstringmap.rs5
-rw-r--r--components/script/dom/domtokenlist.rs27
-rw-r--r--components/script/dom/element.rs355
-rw-r--r--components/script/dom/htmlanchorelement.rs59
-rw-r--r--components/script/dom/htmlareaelement.rs6
-rw-r--r--components/script/dom/htmlaudioelement.rs6
-rw-r--r--components/script/dom/htmlbaseelement.rs3
-rw-r--r--components/script/dom/htmlbodyelement.rs7
-rw-r--r--components/script/dom/htmlbrelement.rs3
-rw-r--r--components/script/dom/htmlbuttonelement.rs4
-rw-r--r--components/script/dom/htmlcanvaselement.rs2
-rw-r--r--components/script/dom/htmldataelement.rs3
-rw-r--r--components/script/dom/htmldatalistelement.rs3
-rw-r--r--components/script/dom/htmldetailselement.rs3
-rw-r--r--components/script/dom/htmldialogelement.rs7
-rw-r--r--components/script/dom/htmldirectoryelement.rs3
-rw-r--r--components/script/dom/htmldivelement.rs3
-rw-r--r--components/script/dom/htmldlistelement.rs3
-rw-r--r--components/script/dom/htmlelement.rs42
-rw-r--r--components/script/dom/htmlembedelement.rs3
-rw-r--r--components/script/dom/htmlfieldsetelement.rs2
-rw-r--r--components/script/dom/htmlfontelement.rs7
-rw-r--r--components/script/dom/htmlformelement.rs14
-rw-r--r--components/script/dom/htmlframeelement.rs3
-rw-r--r--components/script/dom/htmlframesetelement.rs3
-rw-r--r--components/script/dom/htmlheadelement.rs3
-rw-r--r--components/script/dom/htmlheadingelement.rs3
-rw-r--r--components/script/dom/htmlhrelement.rs3
-rw-r--r--components/script/dom/htmlhtmlelement.rs3
-rw-r--r--components/script/dom/htmliframeelement.rs2
-rw-r--r--components/script/dom/htmlimageelement.rs30
-rw-r--r--components/script/dom/htmlinputelement.rs48
-rw-r--r--components/script/dom/htmllabelelement.rs2
-rw-r--r--components/script/dom/htmllegendelement.rs3
-rw-r--r--components/script/dom/htmllielement.rs3
-rw-r--r--components/script/dom/htmllinkelement.rs11
-rw-r--r--components/script/dom/htmlmapelement.rs3
-rw-r--r--components/script/dom/htmlmediaelement.rs16
-rw-r--r--components/script/dom/htmlmenuelement.rs3
-rw-r--r--components/script/dom/htmlmetaelement.rs2
-rw-r--r--components/script/dom/htmlmeterelement.rs32
-rw-r--r--components/script/dom/htmlmodelement.rs3
-rw-r--r--components/script/dom/htmlobjectelement.rs2
-rw-r--r--components/script/dom/htmlolistelement.rs3
-rw-r--r--components/script/dom/htmloptgroupelement.rs3
-rw-r--r--components/script/dom/htmloptionelement.rs8
-rw-r--r--components/script/dom/htmloptionscollection.rs19
-rw-r--r--components/script/dom/htmloutputelement.rs14
-rw-r--r--components/script/dom/htmlparagraphelement.rs3
-rw-r--r--components/script/dom/htmlparamelement.rs3
-rw-r--r--components/script/dom/htmlpictureelement.rs3
-rw-r--r--components/script/dom/htmlpreelement.rs3
-rw-r--r--components/script/dom/htmlprogresselement.rs21
-rw-r--r--components/script/dom/htmlquoteelement.rs3
-rw-r--r--components/script/dom/htmlscriptelement.rs14
-rw-r--r--components/script/dom/htmlselectelement.rs15
-rw-r--r--components/script/dom/htmlsourceelement.rs2
-rw-r--r--components/script/dom/htmlspanelement.rs3
-rw-r--r--components/script/dom/htmlstyleelement.rs3
-rw-r--r--components/script/dom/htmltablecaptionelement.rs3
-rw-r--r--components/script/dom/htmltablecellelement.rs3
-rw-r--r--components/script/dom/htmltablecolelement.rs3
-rw-r--r--components/script/dom/htmltableelement.rs45
-rw-r--r--components/script/dom/htmltablerowelement.rs7
-rw-r--r--components/script/dom/htmltablesectionelement.rs7
-rw-r--r--components/script/dom/htmltemplateelement.rs4
-rw-r--r--components/script/dom/htmltextareaelement.rs6
-rw-r--r--components/script/dom/htmltimeelement.rs3
-rw-r--r--components/script/dom/htmltitleelement.rs7
-rw-r--r--components/script/dom/htmltrackelement.rs3
-rw-r--r--components/script/dom/htmlulistelement.rs3
-rw-r--r--components/script/dom/htmlunknownelement.rs3
-rw-r--r--components/script/dom/htmlvideoelement.rs2
-rw-r--r--components/script/dom/macros.rs33
-rw-r--r--components/script/dom/node.rs54
-rw-r--r--components/script/dom/processinginstruction.rs3
-rw-r--r--components/script/dom/range.rs18
-rw-r--r--components/script/dom/servoparser/async_html.rs11
-rw-r--r--components/script/dom/servoparser/mod.rs16
-rw-r--r--components/script/dom/svgelement.rs7
-rw-r--r--components/script/dom/svgsvgelement.rs3
-rw-r--r--components/script/dom/text.rs14
95 files changed, 1036 insertions, 534 deletions
diff --git a/components/script/dom/attr.rs b/components/script/dom/attr.rs
index 15626358f3c..140329ec4cc 100644
--- a/components/script/dom/attr.rs
+++ b/components/script/dom/attr.rs
@@ -23,6 +23,7 @@ use crate::dom::element::{AttributeMutation, Element};
use crate::dom::mutationobserver::{Mutation, MutationObserver};
use crate::dom::node::Node;
use crate::dom::virtualmethods::vtable_for;
+use crate::script_runtime::CanGc;
use crate::script_thread::ScriptThread;
// https://dom.spec.whatwg.org/#interface-attr
@@ -60,7 +61,7 @@ impl Attr {
owner: MutNullableDom::new(owner),
}
}
-
+ #[allow(clippy::too_many_arguments)]
pub fn new(
document: &Document,
local_name: LocalName,
@@ -69,12 +70,14 @@ impl Attr {
namespace: Namespace,
prefix: Option<Prefix>,
owner: Option<&Element>,
+ can_gc: CanGc,
) -> DomRoot<Attr> {
Node::reflect_node(
Box::new(Attr::new_inherited(
document, local_name, value, name, namespace, prefix, owner,
)),
document,
+ can_gc,
)
}
diff --git a/components/script/dom/bindings/codegen/Bindings.conf b/components/script/dom/bindings/codegen/Bindings.conf
index de0f67315d1..c8aeb645284 100644
--- a/components/script/dom/bindings/codegen/Bindings.conf
+++ b/components/script/dom/bindings/codegen/Bindings.conf
@@ -66,6 +66,14 @@ DOMInterfaces = {
'canGc': ['GetTransform','GetImageData', 'CreateImageData', 'CreateImageData_', 'SetFont', 'FillText', 'MeasureText', 'SetStrokeStyle', 'SetFillStyle', 'SetShadowColor'],
},
+'CharacterData': {
+ 'canGc': ['Before', 'After', 'ReplaceWith']
+},
+
+'CSSStyleDeclaration': {
+ 'canGc': ['RemoveProperty', 'SetCssText']
+},
+
'CanvasGradient': {
'canGc': ['AddColorStop'],
},
@@ -76,7 +84,7 @@ DOMInterfaces = {
},
'DOMImplementation': {
- 'canGc': ['CreateDocument', 'CreateHTMLDocument'],
+ 'canGc': ['CreateDocument', 'CreateHTMLDocument', 'CreateDocumentType'],
},
'DOMMatrix': {
@@ -104,15 +112,31 @@ DOMInterfaces = {
},
'Document': {
- 'canGc': ['Close', 'CreateElement', 'CreateElementNS', 'ImportNode', 'SetTitle', 'Write', 'Writeln', 'CreateEvent', 'CreateRange', 'Open', 'Open_', 'Fonts', 'ElementFromPoint', 'ElementsFromPoint', 'ExitFullscreen'],
+ 'canGc': ['Close', 'CreateElement', 'CreateElementNS', 'ImportNode', 'SetTitle', 'Write', 'Writeln', 'CreateEvent', 'CreateRange', 'Open', 'Open_', 'CreateComment', 'CreateAttribute', 'CreateAttributeNS', 'CreateDocumentFragment', 'CreateTextNode', 'CreateCDATASection', 'CreateProcessingInstruction', 'Prepend', 'Append', 'ReplaceChildren', 'SetBgColor', 'SetFgColor', 'Fonts', 'ElementFromPoint', 'ElementsFromPoint', 'ExitFullscreen'],
},
'DynamicModuleOwner': {
'inRealms': ['PromiseAttribute'],
},
+'DocumentFragment': {
+ 'canGc': ['Prepend', 'Append', 'ReplaceChildren']
+},
+
+'DocumentType': {
+ 'canGc': ['Before', 'After', 'ReplaceWith']
+},
+
+'DOMStringMap': {
+ 'canGc': ['NamedSetter']
+},
+
+"DOMTokenList": {
+ 'canGc': ['SetValue', 'Add', 'Remove', 'Toggle', 'Replace']
+},
+
'Element': {
- 'canGc': ['SetInnerHTML', 'SetOuterHTML', 'InsertAdjacentHTML', 'GetClientRects', 'GetBoundingClientRect', 'SetScrollTop', 'SetScrollLeft', 'Scroll', 'Scroll_', 'ScrollBy', 'ScrollBy_', 'ScrollWidth', 'ScrollHeight', 'ScrollTop', 'ScrollLeft', 'ClientTop', 'ClientLeft', 'ClientWidth', 'ClientHeight', 'RequestFullscreen'],
+ 'canGc': ['SetInnerHTML', 'SetOuterHTML', 'InsertAdjacentHTML', 'GetClientRects', 'GetBoundingClientRect', 'InsertAdjacentText', 'ToggleAttribute', 'SetAttribute', 'SetAttributeNS', "SetId","SetClassName","Prepend","Append","ReplaceChildren","Before","After","ReplaceWith", 'SetRole', 'SetAriaAtomic', 'SetAriaAutoComplete', 'SetAriaBrailleLabel', 'SetAriaBrailleRoleDescription', 'SetAriaBusy', 'SetAriaChecked', 'SetAriaColCount', 'SetAriaColIndex', 'SetAriaColIndexText', 'SetAriaColSpan', 'SetAriaCurrent', 'SetAriaDescription', 'SetAriaDisabled', 'SetAriaExpanded', 'SetAriaHasPopup', 'SetAriaHidden', 'SetAriaInvalid', 'SetAriaKeyShortcuts', 'SetAriaLabel', 'SetAriaLevel', 'SetAriaLive', 'SetAriaModal', 'SetAriaMultiLine', 'SetAriaMultiSelectable', 'SetAriaOrientation', 'SetAriaPlaceholder', 'SetAriaPosInSet', 'SetAriaPressed','SetAriaReadOnly', 'SetAriaRelevant', 'SetAriaRequired', 'SetAriaRoleDescription', 'SetAriaRowCount', 'SetAriaRowIndex', 'SetAriaRowIndexText', 'SetAriaRowSpan', 'SetAriaSelected', 'SetAriaSetSize','SetAriaSort', 'SetAriaValueMax', 'SetAriaValueMin', 'SetAriaValueNow', 'SetAriaValueText', 'SetScrollTop', 'SetScrollLeft', 'Scroll', 'Scroll_', 'ScrollBy', 'ScrollBy_', 'ScrollWidth', 'ScrollHeight', 'ScrollTop', 'ScrollLeft', 'ClientTop', 'ClientLeft', 'ClientWidth', 'ClientHeight', 'RequestFullscreen'],
},
'ElementInternals': {
@@ -184,31 +208,47 @@ DOMInterfaces = {
},
'HTMLButtonElement': {
- 'canGc': ['CheckValidity', 'ReportValidity'],
+ 'canGc': ['CheckValidity', 'ReportValidity','SetBackground'],
},
'HTMLElement': {
- 'canGc': ['GetOffsetParent', 'OffsetTop', 'OffsetLeft', 'OffsetWidth', 'OffsetHeight', 'InnerText', 'GetOuterText', 'Focus', 'Blur', 'Click'],
+ 'canGc': ['Focus', 'Blur', 'Click', 'SetInnerText', 'SetOuterText', "SetTranslate", 'SetAutofocus', 'GetOffsetParent', 'OffsetTop', 'OffsetLeft', 'OffsetWidth', 'OffsetHeight', 'InnerText', 'GetOuterText'],
},
'HTMLFieldSetElement': {
'canGc': ['CheckValidity', 'ReportValidity'],
},
+'HTMLDialogElement': {
+ 'canGc': ['Show'],
+},
+
'HTMLFormElement': {
- 'canGc': ['CheckValidity', 'RequestSubmit', 'ReportValidity', 'Submit'],
+ 'canGc': ['CheckValidity', 'RequestSubmit', 'ReportValidity', 'Submit', 'Reset', 'SetRel'],
},
'HTMLImageElement': {
- 'canGc': ['Width', 'Height', 'Decode'],
+ 'canGc': ['RequestSubmit', 'ReportValidity', 'Reset','SetRel', 'Width', 'Height', 'Decode', 'SetCrossOrigin', 'SetWidth', 'SetHeight', 'SetReferrerPolicy'],
+},
+
+'HTMLFontElement': {
+ 'canGc': ['SetSize']
},
'HTMLInputElement': {
- 'canGc': ['CheckValidity', 'ReportValidity', 'SelectFiles'],
+ 'canGc': ['ReportValidity', 'SetValue', 'SetValueAsNumber', 'SetValueAsDate', 'StepUp', 'StepDown', 'CheckValidity', 'ReportValidity', 'SelectFiles'],
+},
+
+"HTMLAreaElement": {
+ "canGc": ["SetRel"]
+},
+
+"HTMLBodyElement": {
+ "canGc": ["SetBackground"]
},
'HTMLMediaElement': {
- 'canGc': ['Load', 'Pause', 'Play', 'SetSrcObject'],
+ 'canGc': ['Load', 'Pause', 'Play', 'SetSrcObject', 'SetCrossOrigin'],
'inRealms': ['Play'],
},
@@ -217,7 +257,11 @@ DOMInterfaces = {
},
'HTMLOutputElement': {
- 'canGc': ['CheckValidity', 'ReportValidity'],
+ 'canGc': ['ReportValidity', 'SetDefaultValue', 'SetValue', 'CheckValidity'],
+},
+
+'HTMLMeterElement': {
+ 'canGc': ['SetValue', 'SetMin', 'SetMax', 'SetLow', 'SetHigh', 'SetOptimum', 'CheckValidity', 'ReportValidity']
},
'HTMLCanvasElement': {
@@ -225,15 +269,55 @@ DOMInterfaces = {
},
'HTMLSelectElement': {
- 'canGc': ['CheckValidity', 'ReportValidity'],
+ 'canGc': ['ReportValidity', 'SetLength', 'IndexedSetter', 'CheckValidity'],
},
'HTMLTemplateElement': {
'canGc': ['Content'],
},
+'HTMLTitleElement': {
+ 'canGc': ['SetText']
+},
+
'HTMLTextAreaElement': {
- 'canGc': ['CheckValidity', 'ReportValidity'],
+ 'canGc': ['ReportValidity', 'SetDefaultValue', 'CheckValidity'],
+},
+
+'HTMLTableElement': {
+ 'canGc': ['CreateCaption', 'CreateTBody', 'InsertRow', 'InsertCell', 'InsertRow', 'CreateTHead', 'CreateTFoot']
+},
+
+'HTMLTableRowElement': {
+ 'canGc': ['InsertCell']
+},
+
+'HTMLTableSectionElement': {
+ 'canGc': ['InsertRow']
+},
+
+'HTMLOptionsCollection': {
+ 'canGc': ['IndexedSetter', 'SetLength']
+},
+
+'HTMLOptionElement': {
+ 'canGc': ['SetText']
+},
+
+'HTMLProgressElement': {
+ 'canGc': ['SetValue', 'SetMax']
+},
+
+'HTMLScriptElement': {
+ 'canGc': ['SetAsync', 'SetCrossOrigin', 'SetText']
+},
+
+"HTMLAnchorElement": {
+ "canGc": ["SetText","SetRel","SetHref", 'SetHash', 'SetHost', 'SetHostname', 'SetPassword', 'SetPathname', 'SetPort', 'SetProtocol', 'SetSearch', 'SetUsername']
+},
+
+'HTMLLinkElement': {
+ 'canGc': ['SetRel', 'SetCrossOrigin'],
},
'Location': {
@@ -275,7 +359,7 @@ DOMInterfaces = {
},
'Node': {
- 'canGc': ['CloneNode'],
+ 'canGc': ['CloneNode', 'SetTextContent'],
},
'OfflineAudioContext': {
@@ -313,7 +397,7 @@ DOMInterfaces = {
},
'Range': {
- 'canGc': ['CloneContents', 'CloneRange', 'CreateContextualFragment', 'ExtractContents', 'SurroundContents'],
+ 'canGc': ['CloneContents', 'CloneRange', 'CreateContextualFragment', 'ExtractContents', 'SurroundContents', 'InsertNode'],
'weakReferenceable': True,
},
@@ -348,6 +432,10 @@ DOMInterfaces = {
'canGc': ['Encrypt', 'Decrypt', 'GenerateKey', 'ImportKey', 'ExportKey'],
},
+'SVGElement': {
+ 'canGc': ['SetAutofocus']
+},
+
#FIXME(jdm): This should be 'register': False, but then we don't generate enum types
'TestBinding': {
'inRealms': ['PromiseAttribute', 'PromiseNativeHandler'],
@@ -359,6 +447,10 @@ DOMInterfaces = {
'canGc': ['AddModule'],
},
+'Text': {
+ 'canGc': ['SplitText']
+},
+
'URL': {
'weakReferenceable': True,
'canGc': ['Parse', 'SearchParams'],
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py
index 139bf49e4a7..192697a4046 100644
--- a/components/script/dom/bindings/codegen/CodegenRust.py
+++ b/components/script/dom/bindings/codegen/CodegenRust.py
@@ -6239,6 +6239,7 @@ let global = GlobalScope::from_object(JS_CALLEE(*cx, vp).to_object());
&global,
PrototypeList::ID::{MakeNativeName(self.descriptor.name)},
CreateInterfaceObjects,
+ CanGc::note()
)
"""
else:
diff --git a/components/script/dom/bindings/constructor.rs b/components/script/dom/bindings/constructor.rs
index b9c29183b84..50e0d5bfffb 100644
--- a/components/script/dom/bindings/constructor.rs
+++ b/components/script/dom/bindings/constructor.rs
@@ -63,6 +63,7 @@ unsafe fn html_constructor(
check_type: fn(&Element) -> bool,
proto_id: PrototypeList::ID,
creator: unsafe fn(SafeJSContext, HandleObject, *mut ProtoOrIfaceArray),
+ can_gc: CanGc,
) -> Result<(), ()> {
let window = global.downcast::<Window>().unwrap();
let document = window.Document();
@@ -157,7 +158,7 @@ unsafe fn html_constructor(
// Any prototype used to create these elements will be overwritten before returning
// from this function, so we don't bother overwriting the defaults here.
let element = if definition.is_autonomous() {
- DomRoot::upcast(HTMLElement::new(name.local, None, &document, None))
+ DomRoot::upcast(HTMLElement::new(name.local, None, &document, None, can_gc))
} else {
create_native_html_element(
name,
@@ -384,6 +385,7 @@ pub unsafe fn call_html_constructor<T: DerivedFrom<Element> + DomObject>(
global: &GlobalScope,
proto_id: PrototypeList::ID,
creator: unsafe fn(SafeJSContext, HandleObject, *mut ProtoOrIfaceArray),
+ can_gc: CanGc,
) -> bool {
fn element_derives_interface<T: DerivedFrom<Element>>(element: &Element) -> bool {
element.is::<T>()
@@ -396,6 +398,7 @@ pub unsafe fn call_html_constructor<T: DerivedFrom<Element> + DomObject>(
element_derives_interface::<T>,
proto_id,
creator,
+ can_gc,
)
.is_ok()
}
diff --git a/components/script/dom/cdatasection.rs b/components/script/dom/cdatasection.rs
index 6fbe4d1e4b7..29151354044 100644
--- a/components/script/dom/cdatasection.rs
+++ b/components/script/dom/cdatasection.rs
@@ -9,6 +9,7 @@ use crate::dom::bindings::str::DOMString;
use crate::dom::document::Document;
use crate::dom::node::Node;
use crate::dom::text::Text;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct CDATASection {
@@ -22,10 +23,11 @@ impl CDATASection {
}
}
- pub fn new(text: DOMString, document: &Document) -> DomRoot<CDATASection> {
+ pub fn new(text: DOMString, document: &Document, can_gc: CanGc) -> DomRoot<CDATASection> {
Node::reflect_node(
Box::new(CDATASection::new_inherited(text, document)),
document,
+ can_gc,
)
}
}
diff --git a/components/script/dom/characterdata.rs b/components/script/dom/characterdata.rs
index 35296b2dfce..4c53a09ca60 100644
--- a/components/script/dom/characterdata.rs
+++ b/components/script/dom/characterdata.rs
@@ -25,6 +25,7 @@ use crate::dom::node::{ChildrenMutation, Node, NodeDamage};
use crate::dom::processinginstruction::ProcessingInstruction;
use crate::dom::text::Text;
use crate::dom::virtualmethods::vtable_for;
+use crate::script_runtime::CanGc;
// https://dom.spec.whatwg.org/#characterdata
#[dom_struct]
@@ -41,20 +42,30 @@ impl CharacterData {
}
}
- pub fn clone_with_data(&self, data: DOMString, document: &Document) -> DomRoot<Node> {
+ pub fn clone_with_data(
+ &self,
+ data: DOMString,
+ document: &Document,
+ can_gc: CanGc,
+ ) -> DomRoot<Node> {
match self.upcast::<Node>().type_id() {
NodeTypeId::CharacterData(CharacterDataTypeId::Comment) => {
- DomRoot::upcast(Comment::new(data, document, None))
+ DomRoot::upcast(Comment::new(data, document, None, can_gc))
},
NodeTypeId::CharacterData(CharacterDataTypeId::ProcessingInstruction) => {
let pi = self.downcast::<ProcessingInstruction>().unwrap();
- DomRoot::upcast(ProcessingInstruction::new(pi.Target(), data, document))
+ DomRoot::upcast(ProcessingInstruction::new(
+ pi.Target(),
+ data,
+ document,
+ can_gc,
+ ))
},
NodeTypeId::CharacterData(CharacterDataTypeId::Text(TextTypeId::CDATASection)) => {
- DomRoot::upcast(CDATASection::new(data, document))
+ DomRoot::upcast(CDATASection::new(data, document, can_gc))
},
NodeTypeId::CharacterData(CharacterDataTypeId::Text(TextTypeId::Text)) => {
- DomRoot::upcast(Text::new(data, document))
+ DomRoot::upcast(Text::new(data, document, can_gc))
},
_ => unreachable!(),
}
@@ -243,18 +254,18 @@ impl CharacterDataMethods for CharacterData {
}
// https://dom.spec.whatwg.org/#dom-childnode-before
- fn Before(&self, nodes: Vec<NodeOrString>) -> ErrorResult {
- self.upcast::<Node>().before(nodes)
+ fn Before(&self, nodes: Vec<NodeOrString>, can_gc: CanGc) -> ErrorResult {
+ self.upcast::<Node>().before(nodes, can_gc)
}
// https://dom.spec.whatwg.org/#dom-childnode-after
- fn After(&self, nodes: Vec<NodeOrString>) -> ErrorResult {
- self.upcast::<Node>().after(nodes)
+ fn After(&self, nodes: Vec<NodeOrString>, can_gc: CanGc) -> ErrorResult {
+ self.upcast::<Node>().after(nodes, can_gc)
}
// https://dom.spec.whatwg.org/#dom-childnode-replacewith
- fn ReplaceWith(&self, nodes: Vec<NodeOrString>) -> ErrorResult {
- self.upcast::<Node>().replace_with(nodes)
+ fn ReplaceWith(&self, nodes: Vec<NodeOrString>, can_gc: CanGc) -> ErrorResult {
+ self.upcast::<Node>().replace_with(nodes, can_gc)
}
// https://dom.spec.whatwg.org/#dom-childnode-remove
diff --git a/components/script/dom/comment.rs b/components/script/dom/comment.rs
index 12e61155de8..8a6b41c44f6 100644
--- a/components/script/dom/comment.rs
+++ b/components/script/dom/comment.rs
@@ -33,11 +33,13 @@ impl Comment {
text: DOMString,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<Comment> {
Node::reflect_node_with_proto(
Box::new(Comment::new_inherited(text, document)),
document,
proto,
+ can_gc,
)
}
}
@@ -47,10 +49,10 @@ impl CommentMethods for Comment {
fn Constructor(
window: &Window,
proto: Option<HandleObject>,
- _can_gc: CanGc,
+ can_gc: CanGc,
data: DOMString,
) -> Fallible<DomRoot<Comment>> {
let document = window.Document();
- Ok(Comment::new(data, &document, proto))
+ Ok(Comment::new(data, &document, proto, can_gc))
}
}
diff --git a/components/script/dom/create.rs b/components/script/dom/create.rs
index 32967004741..df04898908f 100644
--- a/components/script/dom/create.rs
+++ b/components/script/dom/create.rs
@@ -99,17 +99,17 @@ fn create_svg_element(
macro_rules! make(
($ctor:ident) => ({
- let obj = $ctor::new(name.local, prefix, document, proto);
+ let obj = $ctor::new(name.local, prefix, document, proto, CanGc::note());
DomRoot::upcast(obj)
});
($ctor:ident, $($arg:expr),+) => ({
- let obj = $ctor::new(name.local, prefix, document, proto, $($arg),+);
+ let obj = $ctor::new(name.local, prefix, document, proto, $($arg),+, CanGc::note());
DomRoot::upcast(obj)
})
);
if !pref!(dom.svg.enabled) {
- return Element::new(name.local, name.ns, prefix, document, proto);
+ return Element::new(name.local, name.ns, prefix, document, proto, CanGc::note());
}
match name.local {
@@ -145,6 +145,7 @@ fn create_html_element(
prefix.clone(),
document,
proto,
+ can_gc,
));
result.set_custom_element_state(CustomElementState::Undefined);
ScriptThread::enqueue_upgrade_reaction(&result, definition);
@@ -173,7 +174,7 @@ fn create_html_element(
// Step 6.1.2
let element = DomRoot::upcast::<Element>(HTMLUnknownElement::new(
- local_name, prefix, document, proto,
+ local_name, prefix, document, proto, can_gc,
));
element.set_custom_element_state(CustomElementState::Failed);
element
@@ -231,11 +232,11 @@ pub fn create_native_html_element(
macro_rules! make(
($ctor:ident) => ({
- let obj = $ctor::new(name.local, prefix, document, proto);
+ let obj = $ctor::new(name.local, prefix, document, proto, CanGc::note());
DomRoot::upcast(obj)
});
($ctor:ident, $($arg:expr),+) => ({
- let obj = $ctor::new(name.local, prefix, document, proto, $($arg),+);
+ let obj = $ctor::new(name.local, prefix, document, proto, $($arg),+, CanGc::note());
DomRoot::upcast(obj)
})
);
@@ -406,6 +407,6 @@ pub fn create_element(
match name.ns {
ns!(html) => create_html_element(name, prefix, is, document, creator, mode, proto, can_gc),
ns!(svg) => create_svg_element(name, prefix, document, proto),
- _ => Element::new(name.local, name.ns, prefix, document, proto),
+ _ => Element::new(name.local, name.ns, prefix, document, proto, can_gc),
}
}
diff --git a/components/script/dom/cssstyledeclaration.rs b/components/script/dom/cssstyledeclaration.rs
index e660f15166f..0e861b83c5d 100644
--- a/components/script/dom/cssstyledeclaration.rs
+++ b/components/script/dom/cssstyledeclaration.rs
@@ -57,7 +57,7 @@ pub enum CSSStyleOwner {
impl CSSStyleOwner {
// Mutate the declaration block associated to this style owner, and
// optionally indicate if it has changed (assumed to be true).
- fn mutate_associated_block<F, R>(&self, f: F) -> R
+ fn mutate_associated_block<F, R>(&self, f: F, can_gc: CanGc) -> R
where
F: FnOnce(&mut PropertyDeclarationBlock, &mut bool) -> R,
{
@@ -103,6 +103,7 @@ impl CSSStyleOwner {
el.set_attribute(
&local_name!("style"),
AttrValue::Declaration(serialization, pdb),
+ can_gc,
);
}
} else {
@@ -287,61 +288,64 @@ impl CSSStyleDeclaration {
return Ok(());
}
- self.owner.mutate_associated_block(|pdb, changed| {
- if value.is_empty() {
- // Step 3
- *changed = remove_property(pdb, &id);
- return Ok(());
- }
-
- // Step 4
- let importance = match &*priority {
- "" => Importance::Normal,
- p if p.eq_ignore_ascii_case("important") => Importance::Important,
- _ => {
- *changed = false;
+ self.owner.mutate_associated_block(
+ |pdb, changed| {
+ if value.is_empty() {
+ // Step 3
+ *changed = remove_property(pdb, &id);
return Ok(());
- },
- };
-
- // Step 5
- let window = self.owner.window();
- let quirks_mode = window.Document().quirks_mode();
- let mut declarations = SourcePropertyDeclaration::default();
- let result = parse_one_declaration_into(
- &mut declarations,
- id,
- &value,
- Origin::Author,
- &UrlExtraData(self.owner.base_url().get_arc()),
- window.css_error_reporter(),
- ParsingMode::DEFAULT,
- quirks_mode,
- CssRuleType::Style,
- );
-
- // Step 6
- match result {
- Ok(()) => {},
- Err(_) => {
- *changed = false;
- return Ok(());
- },
- }
+ }
- let mut updates = Default::default();
- *changed = pdb.prepare_for_update(&declarations, importance, &mut updates);
+ // Step 4
+ let importance = match &*priority {
+ "" => Importance::Normal,
+ p if p.eq_ignore_ascii_case("important") => Importance::Important,
+ _ => {
+ *changed = false;
+ return Ok(());
+ },
+ };
- if !*changed {
- return Ok(());
- }
+ // Step 5
+ let window = self.owner.window();
+ let quirks_mode = window.Document().quirks_mode();
+ let mut declarations = SourcePropertyDeclaration::default();
+ let result = parse_one_declaration_into(
+ &mut declarations,
+ id,
+ &value,
+ Origin::Author,
+ &UrlExtraData(self.owner.base_url().get_arc()),
+ window.css_error_reporter(),
+ ParsingMode::DEFAULT,
+ quirks_mode,
+ CssRuleType::Style,
+ );
- // Step 7
- // Step 8
- pdb.update(declarations.drain(), importance, &mut updates);
+ // Step 6
+ match result {
+ Ok(()) => {},
+ Err(_) => {
+ *changed = false;
+ return Ok(());
+ },
+ }
- Ok(())
- })
+ let mut updates = Default::default();
+ *changed = pdb.prepare_for_update(&declarations, importance, &mut updates);
+
+ if !*changed {
+ return Ok(());
+ }
+
+ // Step 7
+ // Step 8
+ pdb.update(declarations.drain(), importance, &mut updates);
+
+ Ok(())
+ },
+ CanGc::note(),
+ )
}
}
@@ -435,7 +439,7 @@ impl CSSStyleDeclarationMethods for CSSStyleDeclaration {
}
// https://dev.w3.org/csswg/cssom/#dom-cssstyledeclaration-removeproperty
- fn RemoveProperty(&self, property: DOMString) -> Fallible<DOMString> {
+ fn RemoveProperty(&self, property: DOMString, can_gc: CanGc) -> Fallible<DOMString> {
// Step 1
if self.readonly {
return Err(Error::NoModificationAllowed);
@@ -447,10 +451,13 @@ impl CSSStyleDeclarationMethods for CSSStyleDeclaration {
};
let mut string = String::new();
- self.owner.mutate_associated_block(|pdb, changed| {
- pdb.property_value_to_css(&id, &mut string).unwrap();
- *changed = remove_property(pdb, &id);
- });
+ self.owner.mutate_associated_block(
+ |pdb, changed| {
+ pdb.property_value_to_css(&id, &mut string).unwrap();
+ *changed = remove_property(pdb, &id);
+ },
+ can_gc,
+ );
// Step 6
Ok(DOMString::from(string))
@@ -498,7 +505,7 @@ impl CSSStyleDeclarationMethods for CSSStyleDeclaration {
}
// https://drafts.csswg.org/cssom/#dom-cssstyledeclaration-csstext
- fn SetCssText(&self, value: DOMString) -> ErrorResult {
+ fn SetCssText(&self, value: DOMString, can_gc: CanGc) -> ErrorResult {
let window = self.owner.window();
// Step 1
@@ -507,16 +514,19 @@ impl CSSStyleDeclarationMethods for CSSStyleDeclaration {
}
let quirks_mode = window.Document().quirks_mode();
- self.owner.mutate_associated_block(|pdb, _changed| {
- // Step 3
- *pdb = parse_style_attribute(
- &value,
- &UrlExtraData(self.owner.base_url().get_arc()),
- window.css_error_reporter(),
- quirks_mode,
- CssRuleType::Style,
- );
- });
+ self.owner.mutate_associated_block(
+ |pdb, _changed| {
+ // Step 3
+ *pdb = parse_style_attribute(
+ &value,
+ &UrlExtraData(self.owner.base_url().get_arc()),
+ window.css_error_reporter(),
+ quirks_mode,
+ CssRuleType::Style,
+ );
+ },
+ can_gc,
+ );
Ok(())
}
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs
index 7fe364fb5ba..fd862b891a1 100644
--- a/components/script/dom/document.rs
+++ b/components/script/dom/document.rs
@@ -1973,21 +1973,24 @@ impl Document {
pub fn node_from_nodes_and_strings(
&self,
mut nodes: Vec<NodeOrString>,
+ can_gc: CanGc,
) -> Fallible<DomRoot<Node>> {
if nodes.len() == 1 {
Ok(match nodes.pop().unwrap() {
NodeOrString::Node(node) => node,
- NodeOrString::String(string) => DomRoot::upcast(self.CreateTextNode(string)),
+ NodeOrString::String(string) => {
+ DomRoot::upcast(self.CreateTextNode(string, can_gc))
+ },
})
} else {
- let fragment = DomRoot::upcast::<Node>(self.CreateDocumentFragment());
+ let fragment = DomRoot::upcast::<Node>(self.CreateDocumentFragment(can_gc));
for node in nodes {
match node {
NodeOrString::Node(node) => {
fragment.AppendChild(&node)?;
},
NodeOrString::String(string) => {
- let node = DomRoot::upcast::<Node>(self.CreateTextNode(string));
+ let node = DomRoot::upcast::<Node>(self.CreateTextNode(string, can_gc));
// No try!() here because appending a text node
// should not fail.
fragment.AppendChild(&node).unwrap();
@@ -2008,14 +2011,14 @@ impl Document {
}
}
- pub fn set_body_attribute(&self, local_name: &LocalName, value: DOMString) {
+ pub fn set_body_attribute(&self, local_name: &LocalName, value: DOMString, can_gc: CanGc) {
if let Some(ref body) = self
.GetBody()
.and_then(DomRoot::downcast::<HTMLBodyElement>)
{
let body = body.upcast::<Element>();
let value = body.parse_attribute(&ns!(), local_name, value);
- body.set_attribute(local_name, value);
+ body.set_attribute(local_name, value, can_gc);
}
}
@@ -4565,7 +4568,7 @@ impl DocumentMethods for Document {
}
// https://dom.spec.whatwg.org/#dom-document-createattribute
- fn CreateAttribute(&self, mut local_name: DOMString) -> Fallible<DomRoot<Attr>> {
+ fn CreateAttribute(&self, mut local_name: DOMString, can_gc: CanGc) -> Fallible<DomRoot<Attr>> {
if xml_name_type(&local_name) == Invalid {
debug!("Not a valid element name");
return Err(Error::InvalidCharacter);
@@ -4584,6 +4587,7 @@ impl DocumentMethods for Document {
ns!(),
None,
None,
+ can_gc,
))
}
@@ -4592,6 +4596,7 @@ impl DocumentMethods for Document {
&self,
namespace: Option<DOMString>,
qualified_name: DOMString,
+ can_gc: CanGc,
) -> Fallible<DomRoot<Attr>> {
let (namespace, prefix, local_name) = validate_and_extract(namespace, &qualified_name)?;
let value = AttrValue::String("".to_owned());
@@ -4604,21 +4609,26 @@ impl DocumentMethods for Document {
namespace,
prefix,
None,
+ can_gc,
))
}
// https://dom.spec.whatwg.org/#dom-document-createdocumentfragment
- fn CreateDocumentFragment(&self) -> DomRoot<DocumentFragment> {
- DocumentFragment::new(self)
+ fn CreateDocumentFragment(&self, can_gc: CanGc) -> DomRoot<DocumentFragment> {
+ DocumentFragment::new(self, can_gc)
}
// https://dom.spec.whatwg.org/#dom-document-createtextnode
- fn CreateTextNode(&self, data: DOMString) -> DomRoot<Text> {
- Text::new(data, self)
+ fn CreateTextNode(&self, data: DOMString, can_gc: CanGc) -> DomRoot<Text> {
+ Text::new(data, self, can_gc)
}
// https://dom.spec.whatwg.org/#dom-document-createcdatasection
- fn CreateCDATASection(&self, data: DOMString) -> Fallible<DomRoot<CDATASection>> {
+ fn CreateCDATASection(
+ &self,
+ data: DOMString,
+ can_gc: CanGc,
+ ) -> Fallible<DomRoot<CDATASection>> {
// Step 1
if self.is_html_document {
return Err(Error::NotSupported);
@@ -4630,12 +4640,12 @@ impl DocumentMethods for Document {
}
// Step 3
- Ok(CDATASection::new(data, self))
+ Ok(CDATASection::new(data, self, can_gc))
}
// https://dom.spec.whatwg.org/#dom-document-createcomment
- fn CreateComment(&self, data: DOMString) -> DomRoot<Comment> {
- Comment::new(data, self, None)
+ fn CreateComment(&self, data: DOMString, can_gc: CanGc) -> DomRoot<Comment> {
+ Comment::new(data, self, None, can_gc)
}
// https://dom.spec.whatwg.org/#dom-document-createprocessinginstruction
@@ -4643,6 +4653,7 @@ impl DocumentMethods for Document {
&self,
target: DOMString,
data: DOMString,
+ can_gc: CanGc,
) -> Fallible<DomRoot<ProcessingInstruction>> {
// Step 1.
if xml_name_type(&target) == Invalid {
@@ -4655,7 +4666,7 @@ impl DocumentMethods for Document {
}
// Step 3.
- Ok(ProcessingInstruction::new(target, data, self))
+ Ok(ProcessingInstruction::new(target, data, self, can_gc))
}
// https://dom.spec.whatwg.org/#dom-document-importnode
@@ -4853,7 +4864,7 @@ impl DocumentMethods for Document {
return;
};
- elem.SetTextContent(Some(title));
+ elem.SetTextContent(Some(title), can_gc);
}
// https://html.spec.whatwg.org/multipage/#dom-document-head
@@ -5030,18 +5041,18 @@ impl DocumentMethods for Document {
}
// https://dom.spec.whatwg.org/#dom-parentnode-prepend
- fn Prepend(&self, nodes: Vec<NodeOrString>) -> ErrorResult {
- self.upcast::<Node>().prepend(nodes)
+ fn Prepend(&self, nodes: Vec<NodeOrString>, can_gc: CanGc) -> ErrorResult {
+ self.upcast::<Node>().prepend(nodes, can_gc)
}
// https://dom.spec.whatwg.org/#dom-parentnode-append
- fn Append(&self, nodes: Vec<NodeOrString>) -> ErrorResult {
- self.upcast::<Node>().append(nodes)
+ fn Append(&self, nodes: Vec<NodeOrString>, can_gc: CanGc) -> ErrorResult {
+ self.upcast::<Node>().append(nodes, can_gc)
}
// https://dom.spec.whatwg.org/#dom-parentnode-replacechildren
- fn ReplaceChildren(&self, nodes: Vec<NodeOrString>) -> ErrorResult {
- self.upcast::<Node>().replace_children(nodes)
+ fn ReplaceChildren(&self, nodes: Vec<NodeOrString>, can_gc: CanGc) -> ErrorResult {
+ self.upcast::<Node>().replace_children(nodes, can_gc)
}
// https://dom.spec.whatwg.org/#dom-parentnode-queryselector
@@ -5121,8 +5132,8 @@ impl DocumentMethods for Document {
}
// https://html.spec.whatwg.org/multipage/#dom-document-bgcolor
- fn SetBgColor(&self, value: DOMString) {
- self.set_body_attribute(&local_name!("bgcolor"), value)
+ fn SetBgColor(&self, value: DOMString, can_gc: CanGc) {
+ self.set_body_attribute(&local_name!("bgcolor"), value, can_gc)
}
// https://html.spec.whatwg.org/multipage/#dom-document-fgcolor
@@ -5131,8 +5142,8 @@ impl DocumentMethods for Document {
}
// https://html.spec.whatwg.org/multipage/#dom-document-fgcolor
- fn SetFgColor(&self, value: DOMString) {
- self.set_body_attribute(&local_name!("text"), value)
+ fn SetFgColor(&self, value: DOMString, can_gc: CanGc) {
+ self.set_body_attribute(&local_name!("text"), value, can_gc)
}
#[allow(unsafe_code)]
diff --git a/components/script/dom/documentfragment.rs b/components/script/dom/documentfragment.rs
index a1cd8f44e13..5c8165c06a7 100644
--- a/components/script/dom/documentfragment.rs
+++ b/components/script/dom/documentfragment.rs
@@ -40,18 +40,20 @@ impl DocumentFragment {
}
}
- pub fn new(document: &Document) -> DomRoot<DocumentFragment> {
- Self::new_with_proto(document, None)
+ pub fn new(document: &Document, can_gc: CanGc) -> DomRoot<DocumentFragment> {
+ Self::new_with_proto(document, None, can_gc)
}
fn new_with_proto(
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<DocumentFragment> {
Node::reflect_node_with_proto(
Box::new(DocumentFragment::new_inherited(document)),
document,
proto,
+ can_gc,
)
}
@@ -65,11 +67,11 @@ impl DocumentFragmentMethods for DocumentFragment {
fn Constructor(
window: &Window,
proto: Option<HandleObject>,
- _can_gc: CanGc,
+ can_gc: CanGc,
) -> Fallible<DomRoot<DocumentFragment>> {
let document = window.Document();
- Ok(DocumentFragment::new_with_proto(&document, proto))
+ Ok(DocumentFragment::new_with_proto(&document, proto, can_gc))
}
// https://dom.spec.whatwg.org/#dom-parentnode-children
@@ -106,18 +108,18 @@ impl DocumentFragmentMethods for DocumentFragment {
}
// https://dom.spec.whatwg.org/#dom-parentnode-prepend
- fn Prepend(&self, nodes: Vec<NodeOrString>) -> ErrorResult {
- self.upcast::<Node>().prepend(nodes)
+ fn Prepend(&self, nodes: Vec<NodeOrString>, can_gc: CanGc) -> ErrorResult {
+ self.upcast::<Node>().prepend(nodes, can_gc)
}
// https://dom.spec.whatwg.org/#dom-parentnode-append
- fn Append(&self, nodes: Vec<NodeOrString>) -> ErrorResult {
- self.upcast::<Node>().append(nodes)
+ fn Append(&self, nodes: Vec<NodeOrString>, can_gc: CanGc) -> ErrorResult {
+ self.upcast::<Node>().append(nodes, can_gc)
}
// https://dom.spec.whatwg.org/#dom-parentnode-replacechildren
- fn ReplaceChildren(&self, nodes: Vec<NodeOrString>) -> ErrorResult {
- self.upcast::<Node>().replace_children(nodes)
+ fn ReplaceChildren(&self, nodes: Vec<NodeOrString>, can_gc: CanGc) -> ErrorResult {
+ self.upcast::<Node>().replace_children(nodes, can_gc)
}
// https://dom.spec.whatwg.org/#dom-parentnode-queryselector
diff --git a/components/script/dom/documenttype.rs b/components/script/dom/documenttype.rs
index 7ffd6a948e7..c0384650577 100644
--- a/components/script/dom/documenttype.rs
+++ b/components/script/dom/documenttype.rs
@@ -12,6 +12,7 @@ use crate::dom::bindings::root::DomRoot;
use crate::dom::bindings::str::DOMString;
use crate::dom::document::Document;
use crate::dom::node::Node;
+use crate::script_runtime::CanGc;
// https://dom.spec.whatwg.org/#documenttype
/// The `DOCTYPE` tag.
@@ -43,12 +44,14 @@ impl DocumentType {
public_id: Option<DOMString>,
system_id: Option<DOMString>,
document: &Document,
+ can_gc: CanGc,
) -> DomRoot<DocumentType> {
Node::reflect_node(
Box::new(DocumentType::new_inherited(
name, public_id, system_id, document,
)),
document,
+ can_gc,
)
}
@@ -85,18 +88,18 @@ impl DocumentTypeMethods for DocumentType {
}
// https://dom.spec.whatwg.org/#dom-childnode-before
- fn Before(&self, nodes: Vec<NodeOrString>) -> ErrorResult {
- self.upcast::<Node>().before(nodes)
+ fn Before(&self, nodes: Vec<NodeOrString>, can_gc: CanGc) -> ErrorResult {
+ self.upcast::<Node>().before(nodes, can_gc)
}
// https://dom.spec.whatwg.org/#dom-childnode-after
- fn After(&self, nodes: Vec<NodeOrString>) -> ErrorResult {
- self.upcast::<Node>().after(nodes)
+ fn After(&self, nodes: Vec<NodeOrString>, can_gc: CanGc) -> ErrorResult {
+ self.upcast::<Node>().after(nodes, can_gc)
}
// https://dom.spec.whatwg.org/#dom-childnode-replacewith
- fn ReplaceWith(&self, nodes: Vec<NodeOrString>) -> ErrorResult {
- self.upcast::<Node>().replace_with(nodes)
+ fn ReplaceWith(&self, nodes: Vec<NodeOrString>, can_gc: CanGc) -> ErrorResult {
+ self.upcast::<Node>().replace_with(nodes, can_gc)
}
// https://dom.spec.whatwg.org/#dom-childnode-remove
diff --git a/components/script/dom/domimplementation.rs b/components/script/dom/domimplementation.rs
index 9266445ef17..7a75fce1ae4 100644
--- a/components/script/dom/domimplementation.rs
+++ b/components/script/dom/domimplementation.rs
@@ -59,6 +59,7 @@ impl DOMImplementationMethods for DOMImplementation {
qualified_name: DOMString,
pubid: DOMString,
sysid: DOMString,
+ can_gc: CanGc,
) -> Fallible<DomRoot<DocumentType>> {
validate_qualified_name(&qualified_name)?;
Ok(DocumentType::new(
@@ -66,6 +67,7 @@ impl DOMImplementationMethods for DOMImplementation {
Some(pubid),
Some(sysid),
&self.document,
+ can_gc,
))
}
@@ -165,7 +167,7 @@ impl DOMImplementationMethods for DOMImplementation {
{
// Step 3.
let doc_node = doc.upcast::<Node>();
- let doc_type = DocumentType::new(DOMString::from("html"), None, None, &doc);
+ let doc_type = DocumentType::new(DOMString::from("html"), None, None, &doc, can_gc);
doc_node.AppendChild(doc_type.upcast()).unwrap();
}
@@ -177,6 +179,7 @@ impl DOMImplementationMethods for DOMImplementation {
None,
&doc,
None,
+ can_gc,
));
doc_node.AppendChild(&doc_html).expect("Appending failed");
@@ -187,6 +190,7 @@ impl DOMImplementationMethods for DOMImplementation {
None,
&doc,
None,
+ can_gc,
));
doc_html.AppendChild(&doc_head).unwrap();
@@ -198,17 +202,18 @@ impl DOMImplementationMethods for DOMImplementation {
None,
&doc,
None,
+ can_gc,
));
doc_head.AppendChild(&doc_title).unwrap();
// Step 6.2.
- let title_text = Text::new(title_str, &doc);
+ let title_text = Text::new(title_str, &doc, can_gc);
doc_title.AppendChild(title_text.upcast()).unwrap();
}
}
// Step 7.
- let doc_body = HTMLBodyElement::new(local_name!("body"), None, &doc, None);
+ let doc_body = HTMLBodyElement::new(local_name!("body"), None, &doc, None, can_gc);
doc_html.AppendChild(doc_body.upcast()).unwrap();
}
diff --git a/components/script/dom/domstringmap.rs b/components/script/dom/domstringmap.rs
index 1a6b7b6f36e..68c5d16a880 100644
--- a/components/script/dom/domstringmap.rs
+++ b/components/script/dom/domstringmap.rs
@@ -11,6 +11,7 @@ use crate::dom::bindings::root::{Dom, DomRoot};
use crate::dom::bindings::str::DOMString;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::window_from_node;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct DOMStringMap {
@@ -40,8 +41,8 @@ impl DOMStringMapMethods for DOMStringMap {
}
// https://html.spec.whatwg.org/multipage/#dom-domstringmap-setitem
- fn NamedSetter(&self, name: DOMString, value: DOMString) -> ErrorResult {
- self.element.set_custom_attr(name, value)
+ fn NamedSetter(&self, name: DOMString, value: DOMString, can_gc: CanGc) -> ErrorResult {
+ self.element.set_custom_attr(name, value, can_gc)
}
// https://html.spec.whatwg.org/multipage/#dom-domstringmap-nameditem
diff --git a/components/script/dom/domtokenlist.rs b/components/script/dom/domtokenlist.rs
index ff098dbf87e..4b045493232 100644
--- a/components/script/dom/domtokenlist.rs
+++ b/components/script/dom/domtokenlist.rs
@@ -15,6 +15,7 @@ use crate::dom::bindings::root::{Dom, DomRoot};
use crate::dom::bindings::str::DOMString;
use crate::dom::element::Element;
use crate::dom::node::window_from_node;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct DOMTokenList {
@@ -69,14 +70,14 @@ impl DOMTokenList {
}
/// <https://dom.spec.whatwg.org/#concept-dtl-update>
- fn perform_update_steps(&self, atoms: Vec<Atom>) {
+ fn perform_update_steps(&self, atoms: Vec<Atom>, can_gc: CanGc) {
// Step 1
if !self.element.has_attribute(&self.local_name) && atoms.is_empty() {
return;
}
// step 2
self.element
- .set_atomic_tokenlist_attribute(&self.local_name, atoms)
+ .set_atomic_tokenlist_attribute(&self.local_name, atoms, can_gc)
}
/// <https://dom.spec.whatwg.org/#concept-domtokenlist-validation>
@@ -130,7 +131,7 @@ impl DOMTokenListMethods for DOMTokenList {
}
/// <https://dom.spec.whatwg.org/#dom-domtokenlist-add>
- fn Add(&self, tokens: Vec<DOMString>) -> ErrorResult {
+ fn Add(&self, tokens: Vec<DOMString>, can_gc: CanGc) -> ErrorResult {
let mut atoms = self.element.get_tokenlist_attribute(&self.local_name);
for token in &tokens {
let token = self.check_token_exceptions(token)?;
@@ -138,12 +139,12 @@ impl DOMTokenListMethods for DOMTokenList {
atoms.push(token);
}
}
- self.perform_update_steps(atoms);
+ self.perform_update_steps(atoms, can_gc);
Ok(())
}
/// <https://dom.spec.whatwg.org/#dom-domtokenlist-remove>
- fn Remove(&self, tokens: Vec<DOMString>) -> ErrorResult {
+ fn Remove(&self, tokens: Vec<DOMString>, can_gc: CanGc) -> ErrorResult {
let mut atoms = self.element.get_tokenlist_attribute(&self.local_name);
for token in &tokens {
let token = self.check_token_exceptions(token)?;
@@ -152,12 +153,12 @@ impl DOMTokenListMethods for DOMTokenList {
.position(|atom| *atom == token)
.map(|index| atoms.remove(index));
}
- self.perform_update_steps(atoms);
+ self.perform_update_steps(atoms, can_gc);
Ok(())
}
/// <https://dom.spec.whatwg.org/#dom-domtokenlist-toggle>
- fn Toggle(&self, token: DOMString, force: Option<bool>) -> Fallible<bool> {
+ fn Toggle(&self, token: DOMString, force: Option<bool>, can_gc: CanGc) -> Fallible<bool> {
let mut atoms = self.element.get_tokenlist_attribute(&self.local_name);
let token = self.check_token_exceptions(&token)?;
match atoms.iter().position(|atom| *atom == token) {
@@ -165,7 +166,7 @@ impl DOMTokenListMethods for DOMTokenList {
Some(true) => Ok(true),
_ => {
atoms.remove(index);
- self.perform_update_steps(atoms);
+ self.perform_update_steps(atoms, can_gc);
Ok(false)
},
},
@@ -173,7 +174,7 @@ impl DOMTokenListMethods for DOMTokenList {
Some(false) => Ok(false),
_ => {
atoms.push(token);
- self.perform_update_steps(atoms);
+ self.perform_update_steps(atoms, can_gc);
Ok(true)
},
},
@@ -186,13 +187,13 @@ impl DOMTokenListMethods for DOMTokenList {
}
/// <https://dom.spec.whatwg.org/#dom-domtokenlist-value>
- fn SetValue(&self, value: DOMString) {
+ fn SetValue(&self, value: DOMString, can_gc: CanGc) {
self.element
- .set_tokenlist_attribute(&self.local_name, value);
+ .set_tokenlist_attribute(&self.local_name, value, can_gc);
}
/// <https://dom.spec.whatwg.org/#dom-domtokenlist-replace>
- fn Replace(&self, token: DOMString, new_token: DOMString) -> Fallible<bool> {
+ fn Replace(&self, token: DOMString, new_token: DOMString, can_gc: CanGc) -> Fallible<bool> {
if token.is_empty() || new_token.is_empty() {
// Step 1.
return Err(Error::Syntax);
@@ -231,7 +232,7 @@ impl DOMTokenListMethods for DOMTokenList {
}
// Step 5.
- self.perform_update_steps(atoms);
+ self.perform_update_steps(atoms, can_gc);
result = true;
}
Ok(result)
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs
index b6d5e4060e1..1c526d02a0b 100644
--- a/components/script/dom/element.rs
+++ b/components/script/dom/element.rs
@@ -314,6 +314,7 @@ impl Element {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<Element> {
Node::reflect_node_with_proto(
Box::new(Element::new_inherited(
@@ -321,6 +322,7 @@ impl Element {
)),
document,
proto,
+ can_gc,
)
}
@@ -1441,6 +1443,7 @@ impl Element {
name: LocalName,
namespace: Namespace,
prefix: Option<Prefix>,
+ can_gc: CanGc,
) {
let attr = Attr::new(
&self.node.owner_doc(),
@@ -1450,6 +1453,7 @@ impl Element {
namespace,
prefix,
Some(self),
+ can_gc,
);
self.push_attribute(&attr);
}
@@ -1519,6 +1523,7 @@ impl Element {
qname: QualName,
value: DOMString,
prefix: Option<Prefix>,
+ can_gc: CanGc,
) {
// Don't set if the attribute already exists, so we can handle add_attrs_if_missing
if self
@@ -1538,20 +1543,31 @@ impl Element {
},
};
let value = self.parse_attribute(&qname.ns, &qname.local, value);
- self.push_new_attribute(qname.local, value, name, qname.ns, prefix);
+ self.push_new_attribute(qname.local, value, name, qname.ns, prefix, can_gc);
}
- pub fn set_attribute(&self, name: &LocalName, value: AttrValue) {
+ pub fn set_attribute(&self, name: &LocalName, value: AttrValue, can_gc: CanGc) {
assert!(name == &name.to_ascii_lowercase());
assert!(!name.contains(':'));
- self.set_first_matching_attribute(name.clone(), value, name.clone(), ns!(), None, |attr| {
- attr.local_name() == name
- });
+ self.set_first_matching_attribute(
+ name.clone(),
+ value,
+ name.clone(),
+ ns!(),
+ None,
+ |attr| attr.local_name() == name,
+ can_gc,
+ );
}
// https://html.spec.whatwg.org/multipage/#attr-data-*
- pub fn set_custom_attribute(&self, name: DOMString, value: DOMString) -> ErrorResult {
+ pub fn set_custom_attribute(
+ &self,
+ name: DOMString,
+ value: DOMString,
+ can_gc: CanGc,
+ ) -> ErrorResult {
// Step 1.
if let Invalid = xml_name_type(&name) {
return Err(Error::InvalidCharacter);
@@ -1560,12 +1576,19 @@ impl Element {
// Steps 2-5.
let name = LocalName::from(name);
let value = self.parse_attribute(&ns!(), &name, value);
- self.set_first_matching_attribute(name.clone(), value, name.clone(), ns!(), None, |attr| {
- *attr.name() == name && *attr.namespace() == ns!()
- });
+ self.set_first_matching_attribute(
+ name.clone(),
+ value,
+ name.clone(),
+ ns!(),
+ None,
+ |attr| *attr.name() == name && *attr.namespace() == ns!(),
+ can_gc,
+ );
Ok(())
}
+ #[allow(clippy::too_many_arguments)]
fn set_first_matching_attribute<F>(
&self,
local_name: LocalName,
@@ -1574,6 +1597,7 @@ impl Element {
namespace: Namespace,
prefix: Option<Prefix>,
find: F,
+ can_gc: CanGc,
) where
F: Fn(&Attr) -> bool,
{
@@ -1586,7 +1610,7 @@ impl Element {
if let Some(attr) = attr {
attr.set_value(value, self);
} else {
- self.push_new_attribute(local_name, value, name, namespace, prefix);
+ self.push_new_attribute(local_name, value, name, namespace, prefix, can_gc);
};
}
@@ -1660,10 +1684,10 @@ impl Element {
})
}
- pub fn set_atomic_attribute(&self, local_name: &LocalName, value: DOMString) {
+ pub fn set_atomic_attribute(&self, local_name: &LocalName, value: DOMString, can_gc: CanGc) {
assert!(*local_name == local_name.to_ascii_lowercase());
let value = AttrValue::from_atomic(value.into());
- self.set_attribute(local_name, value);
+ self.set_attribute(local_name, value, can_gc);
}
pub fn has_attribute(&self, local_name: &LocalName) -> bool {
@@ -1674,12 +1698,12 @@ impl Element {
.any(|attr| attr.local_name() == local_name && attr.namespace() == &ns!())
}
- pub fn set_bool_attribute(&self, local_name: &LocalName, value: bool) {
+ pub fn set_bool_attribute(&self, local_name: &LocalName, value: bool, can_gc: CanGc) {
if self.has_attribute(local_name) == value {
return;
}
if value {
- self.set_string_attribute(local_name, DOMString::new());
+ self.set_string_attribute(local_name, DOMString::new(), can_gc);
} else {
self.remove_attribute(&ns!(), local_name);
}
@@ -1700,9 +1724,9 @@ impl Element {
.unwrap_or_else(|_| USVString(value.to_owned()))
}
- pub fn set_url_attribute(&self, local_name: &LocalName, value: USVString) {
+ pub fn set_url_attribute(&self, local_name: &LocalName, value: USVString, can_gc: CanGc) {
assert!(*local_name == local_name.to_ascii_lowercase());
- self.set_attribute(local_name, AttrValue::String(value.to_string()));
+ self.set_attribute(local_name, AttrValue::String(value.to_string()), can_gc);
}
pub fn get_string_attribute(&self, local_name: &LocalName) -> DOMString {
@@ -1712,9 +1736,9 @@ impl Element {
}
}
- pub fn set_string_attribute(&self, local_name: &LocalName, value: DOMString) {
+ pub fn set_string_attribute(&self, local_name: &LocalName, value: DOMString, can_gc: CanGc) {
assert!(*local_name == local_name.to_ascii_lowercase());
- self.set_attribute(local_name, AttrValue::String(value.into()));
+ self.set_attribute(local_name, AttrValue::String(value.into()), can_gc);
}
/// Used for string attribute reflections where absence of the attribute returns `null`,
@@ -1729,10 +1753,15 @@ impl Element {
/// Used for string attribute reflections where setting `null`/`undefined` removes the
/// attribute, e.g. `element.ariaLabel = null` removing the `aria-label` attribute.
- fn set_nullable_string_attribute(&self, local_name: &LocalName, value: Option<DOMString>) {
+ fn set_nullable_string_attribute(
+ &self,
+ local_name: &LocalName,
+ value: Option<DOMString>,
+ can_gc: CanGc,
+ ) {
match value {
Some(val) => {
- self.set_string_attribute(local_name, val);
+ self.set_string_attribute(local_name, val, can_gc);
},
None => {
self.remove_attribute(&ns!(), local_name);
@@ -1746,17 +1775,23 @@ impl Element {
.unwrap_or_default()
}
- pub fn set_tokenlist_attribute(&self, local_name: &LocalName, value: DOMString) {
+ pub fn set_tokenlist_attribute(&self, local_name: &LocalName, value: DOMString, can_gc: CanGc) {
assert!(*local_name == local_name.to_ascii_lowercase());
self.set_attribute(
local_name,
AttrValue::from_serialized_tokenlist(value.into()),
+ can_gc,
);
}
- pub fn set_atomic_tokenlist_attribute(&self, local_name: &LocalName, tokens: Vec<Atom>) {
+ pub fn set_atomic_tokenlist_attribute(
+ &self,
+ local_name: &LocalName,
+ tokens: Vec<Atom>,
+ can_gc: CanGc,
+ ) {
assert!(*local_name == local_name.to_ascii_lowercase());
- self.set_attribute(local_name, AttrValue::from_atomic_tokens(tokens));
+ self.set_attribute(local_name, AttrValue::from_atomic_tokens(tokens), can_gc);
}
pub fn get_int_attribute(&self, local_name: &LocalName, default: i32) -> i32 {
@@ -1778,9 +1813,9 @@ impl Element {
}
}
- pub fn set_int_attribute(&self, local_name: &LocalName, value: i32) {
+ pub fn set_int_attribute(&self, local_name: &LocalName, value: i32, can_gc: CanGc) {
assert!(*local_name == local_name.to_ascii_lowercase());
- self.set_attribute(local_name, AttrValue::Int(value.to_string(), value));
+ self.set_attribute(local_name, AttrValue::Int(value.to_string(), value), can_gc);
}
pub fn get_uint_attribute(&self, local_name: &LocalName, default: u32) -> u32 {
@@ -1796,9 +1831,13 @@ impl Element {
None => default,
}
}
- pub fn set_uint_attribute(&self, local_name: &LocalName, value: u32) {
+ pub fn set_uint_attribute(&self, local_name: &LocalName, value: u32, can_gc: CanGc) {
assert!(*local_name == local_name.to_ascii_lowercase());
- self.set_attribute(local_name, AttrValue::UInt(value.to_string(), value));
+ self.set_attribute(
+ local_name,
+ AttrValue::UInt(value.to_string(), value),
+ can_gc,
+ );
}
pub fn will_mutate_attr(&self, attr: &Attr) {
@@ -1905,7 +1944,7 @@ impl Element {
document_from_node(self)
}
};
- let fragment = DocumentFragment::new(&context_document);
+ let fragment = DocumentFragment::new(&context_document, can_gc);
// Step 4.
for child in new_children {
fragment.upcast::<Node>().AppendChild(&child).unwrap();
@@ -1914,7 +1953,11 @@ impl Element {
Ok(fragment)
}
- pub fn fragment_parsing_context(owner_doc: &Document, element: Option<&Self>) -> DomRoot<Self> {
+ pub fn fragment_parsing_context(
+ owner_doc: &Document,
+ element: Option<&Self>,
+ can_gc: CanGc,
+ ) -> DomRoot<Self> {
match element {
Some(elem)
if elem.local_name() != &local_name!("html") ||
@@ -1927,6 +1970,7 @@ impl Element {
None,
owner_doc,
None,
+ can_gc,
)),
}
}
@@ -2078,8 +2122,8 @@ impl ElementMethods for Element {
}
// https://dom.spec.whatwg.org/#dom-element-id
- fn SetId(&self, id: DOMString) {
- self.set_atomic_attribute(&local_name!("id"), id);
+ fn SetId(&self, id: DOMString, can_gc: CanGc) {
+ self.set_atomic_attribute(&local_name!("id"), id, can_gc);
}
// https://dom.spec.whatwg.org/#dom-element-classname
@@ -2088,8 +2132,8 @@ impl ElementMethods for Element {
}
// https://dom.spec.whatwg.org/#dom-element-classname
- fn SetClassName(&self, class: DOMString) {
- self.set_tokenlist_attribute(&local_name!("class"), class);
+ fn SetClassName(&self, class: DOMString, can_gc: CanGc) {
+ self.set_tokenlist_attribute(&local_name!("class"), class, can_gc);
}
// https://dom.spec.whatwg.org/#dom-element-classlist
@@ -2145,7 +2189,12 @@ impl ElementMethods for Element {
}
// https://dom.spec.whatwg.org/#dom-element-toggleattribute
- fn ToggleAttribute(&self, name: DOMString, force: Option<bool>) -> Fallible<bool> {
+ fn ToggleAttribute(
+ &self,
+ name: DOMString,
+ force: Option<bool>,
+ can_gc: CanGc,
+ ) -> Fallible<bool> {
// Step 1.
if xml_name_type(&name) == Invalid {
return Err(Error::InvalidCharacter);
@@ -2168,6 +2217,7 @@ impl ElementMethods for Element {
ns!(),
None,
|attr| *attr.name() == name,
+ can_gc,
);
Ok(true)
},
@@ -2187,7 +2237,7 @@ impl ElementMethods for Element {
}
// https://dom.spec.whatwg.org/#dom-element-setattribute
- fn SetAttribute(&self, name: DOMString, value: DOMString) -> ErrorResult {
+ fn SetAttribute(&self, name: DOMString, value: DOMString, can_gc: CanGc) -> ErrorResult {
// Step 1.
if xml_name_type(&name) == Invalid {
return Err(Error::InvalidCharacter);
@@ -2198,9 +2248,15 @@ impl ElementMethods for Element {
// Step 3-5.
let value = self.parse_attribute(&ns!(), &name, value);
- self.set_first_matching_attribute(name.clone(), value, name.clone(), ns!(), None, |attr| {
- *attr.name() == name
- });
+ self.set_first_matching_attribute(
+ name.clone(),
+ value,
+ name.clone(),
+ ns!(),
+ None,
+ |attr| *attr.name() == name,
+ can_gc,
+ );
Ok(())
}
@@ -2210,6 +2266,7 @@ impl ElementMethods for Element {
namespace: Option<DOMString>,
qualified_name: DOMString,
value: DOMString,
+ can_gc: CanGc,
) -> ErrorResult {
let (namespace, prefix, local_name) = validate_and_extract(namespace, &qualified_name)?;
let qualified_name = LocalName::from(qualified_name);
@@ -2221,6 +2278,7 @@ impl ElementMethods for Element {
namespace.clone(),
prefix,
|attr| *attr.local_name() == local_name && *attr.namespace() == namespace,
+ can_gc,
);
Ok(())
}
@@ -2684,7 +2742,7 @@ impl ElementMethods for Element {
.iter()
.any(|c| matches!(*c, b'&' | b'\0' | b'<' | b'\r'))
{
- Node::SetTextContent(&target, Some(value));
+ Node::SetTextContent(&target, Some(value), can_gc);
return Ok(());
}
@@ -2785,18 +2843,18 @@ impl ElementMethods for Element {
}
// https://dom.spec.whatwg.org/#dom-parentnode-prepend
- fn Prepend(&self, nodes: Vec<NodeOrString>) -> ErrorResult {
- self.upcast::<Node>().prepend(nodes)
+ fn Prepend(&self, nodes: Vec<NodeOrString>, can_gc: CanGc) -> ErrorResult {
+ self.upcast::<Node>().prepend(nodes, can_gc)
}
// https://dom.spec.whatwg.org/#dom-parentnode-append
- fn Append(&self, nodes: Vec<NodeOrString>) -> ErrorResult {
- self.upcast::<Node>().append(nodes)
+ fn Append(&self, nodes: Vec<NodeOrString>, can_gc: CanGc) -> ErrorResult {
+ self.upcast::<Node>().append(nodes, can_gc)
}
// https://dom.spec.whatwg.org/#dom-parentnode-replacechildren
- fn ReplaceChildren(&self, nodes: Vec<NodeOrString>) -> ErrorResult {
- self.upcast::<Node>().replace_children(nodes)
+ fn ReplaceChildren(&self, nodes: Vec<NodeOrString>, can_gc: CanGc) -> ErrorResult {
+ self.upcast::<Node>().replace_children(nodes, can_gc)
}
// https://dom.spec.whatwg.org/#dom-parentnode-queryselector
@@ -2812,18 +2870,18 @@ impl ElementMethods for Element {
}
// https://dom.spec.whatwg.org/#dom-childnode-before
- fn Before(&self, nodes: Vec<NodeOrString>) -> ErrorResult {
- self.upcast::<Node>().before(nodes)
+ fn Before(&self, nodes: Vec<NodeOrString>, can_gc: CanGc) -> ErrorResult {
+ self.upcast::<Node>().before(nodes, can_gc)
}
// https://dom.spec.whatwg.org/#dom-childnode-after
- fn After(&self, nodes: Vec<NodeOrString>) -> ErrorResult {
- self.upcast::<Node>().after(nodes)
+ fn After(&self, nodes: Vec<NodeOrString>, can_gc: CanGc) -> ErrorResult {
+ self.upcast::<Node>().after(nodes, can_gc)
}
// https://dom.spec.whatwg.org/#dom-childnode-replacewith
- fn ReplaceWith(&self, nodes: Vec<NodeOrString>) -> ErrorResult {
- self.upcast::<Node>().replace_with(nodes)
+ fn ReplaceWith(&self, nodes: Vec<NodeOrString>, can_gc: CanGc) -> ErrorResult {
+ self.upcast::<Node>().replace_with(nodes, can_gc)
}
// https://dom.spec.whatwg.org/#dom-childnode-remove
@@ -2886,9 +2944,9 @@ impl ElementMethods for Element {
}
// https://dom.spec.whatwg.org/#dom-element-insertadjacenttext
- fn InsertAdjacentText(&self, where_: DOMString, data: DOMString) -> ErrorResult {
+ fn InsertAdjacentText(&self, where_: DOMString, data: DOMString, can_gc: CanGc) -> ErrorResult {
// Step 1.
- let text = Text::new(data, &document_from_node(self));
+ let text = Text::new(data, &document_from_node(self), can_gc);
// Step 2.
let where_ = where_.parse::<AdjacentPosition>()?;
@@ -2921,8 +2979,11 @@ impl ElementMethods for Element {
};
// Step 2.
- let context =
- Element::fragment_parsing_context(&context.owner_doc(), context.downcast::<Element>());
+ let context = Element::fragment_parsing_context(
+ &context.owner_doc(),
+ context.downcast::<Element>(),
+ can_gc,
+ );
// Step 3.
let fragment = context.parse_fragment(text, can_gc)?;
@@ -2970,352 +3031,356 @@ impl ElementMethods for Element {
self.get_nullable_string_attribute(&local_name!("role"))
}
- fn SetRole(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("role"), value);
+ fn SetRole(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("role"), value, can_gc);
}
fn GetAriaAtomic(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-atomic"))
}
- fn SetAriaAtomic(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-atomic"), value);
+ fn SetAriaAtomic(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-atomic"), value, can_gc);
}
fn GetAriaAutoComplete(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-autocomplete"))
}
- fn SetAriaAutoComplete(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-autocomplete"), value);
+ fn SetAriaAutoComplete(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-autocomplete"), value, can_gc);
}
fn GetAriaBrailleLabel(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-braillelabel"))
}
- fn SetAriaBrailleLabel(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-braillelabel"), value);
+ fn SetAriaBrailleLabel(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-braillelabel"), value, can_gc);
}
fn GetAriaBrailleRoleDescription(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-brailleroledescription"))
}
- fn SetAriaBrailleRoleDescription(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-brailleroledescription"), value);
+ fn SetAriaBrailleRoleDescription(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(
+ &local_name!("aria-brailleroledescription"),
+ value,
+ can_gc,
+ );
}
fn GetAriaBusy(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-busy"))
}
- fn SetAriaBusy(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-busy"), value);
+ fn SetAriaBusy(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-busy"), value, can_gc);
}
fn GetAriaChecked(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-checked"))
}
- fn SetAriaChecked(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-checked"), value);
+ fn SetAriaChecked(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-checked"), value, can_gc);
}
fn GetAriaColCount(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-colcount"))
}
- fn SetAriaColCount(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-colcount"), value);
+ fn SetAriaColCount(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-colcount"), value, can_gc);
}
fn GetAriaColIndex(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-colindex"))
}
- fn SetAriaColIndex(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-colindex"), value);
+ fn SetAriaColIndex(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-colindex"), value, can_gc);
}
fn GetAriaColIndexText(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-colindextext"))
}
- fn SetAriaColIndexText(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-colindextext"), value);
+ fn SetAriaColIndexText(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-colindextext"), value, can_gc);
}
fn GetAriaColSpan(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-colspan"))
}
- fn SetAriaColSpan(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-colspan"), value);
+ fn SetAriaColSpan(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-colspan"), value, can_gc);
}
fn GetAriaCurrent(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-current"))
}
- fn SetAriaCurrent(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-current"), value);
+ fn SetAriaCurrent(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-current"), value, can_gc);
}
fn GetAriaDescription(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-description"))
}
- fn SetAriaDescription(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-description"), value);
+ fn SetAriaDescription(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-description"), value, can_gc);
}
fn GetAriaDisabled(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-disabled"))
}
- fn SetAriaDisabled(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-disabled"), value);
+ fn SetAriaDisabled(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-disabled"), value, can_gc);
}
fn GetAriaExpanded(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-expanded"))
}
- fn SetAriaExpanded(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-expanded"), value);
+ fn SetAriaExpanded(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-expanded"), value, can_gc);
}
fn GetAriaHasPopup(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-haspopup"))
}
- fn SetAriaHasPopup(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-haspopup"), value);
+ fn SetAriaHasPopup(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-haspopup"), value, can_gc);
}
fn GetAriaHidden(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-hidden"))
}
- fn SetAriaHidden(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-hidden"), value);
+ fn SetAriaHidden(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-hidden"), value, can_gc);
}
fn GetAriaInvalid(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-invalid"))
}
- fn SetAriaInvalid(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-invalid"), value);
+ fn SetAriaInvalid(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-invalid"), value, can_gc);
}
fn GetAriaKeyShortcuts(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-keyshortcuts"))
}
- fn SetAriaKeyShortcuts(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-keyshortcuts"), value);
+ fn SetAriaKeyShortcuts(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-keyshortcuts"), value, can_gc);
}
fn GetAriaLabel(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-label"))
}
- fn SetAriaLabel(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-label"), value);
+ fn SetAriaLabel(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-label"), value, can_gc);
}
fn GetAriaLevel(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-level"))
}
- fn SetAriaLevel(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-level"), value);
+ fn SetAriaLevel(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-level"), value, can_gc);
}
fn GetAriaLive(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-live"))
}
- fn SetAriaLive(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-live"), value);
+ fn SetAriaLive(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-live"), value, can_gc);
}
fn GetAriaModal(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-modal"))
}
- fn SetAriaModal(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-modal"), value);
+ fn SetAriaModal(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-modal"), value, can_gc);
}
fn GetAriaMultiLine(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-multiline"))
}
- fn SetAriaMultiLine(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-multiline"), value);
+ fn SetAriaMultiLine(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-multiline"), value, can_gc);
}
fn GetAriaMultiSelectable(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-multiselectable"))
}
- fn SetAriaMultiSelectable(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-multiselectable"), value);
+ fn SetAriaMultiSelectable(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-multiselectable"), value, can_gc);
}
fn GetAriaOrientation(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-orientation"))
}
- fn SetAriaOrientation(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-orientation"), value);
+ fn SetAriaOrientation(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-orientation"), value, can_gc);
}
fn GetAriaPlaceholder(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-placeholder"))
}
- fn SetAriaPlaceholder(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-placeholder"), value);
+ fn SetAriaPlaceholder(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-placeholder"), value, can_gc);
}
fn GetAriaPosInSet(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-posinset"))
}
- fn SetAriaPosInSet(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-posinset"), value);
+ fn SetAriaPosInSet(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-posinset"), value, can_gc);
}
fn GetAriaPressed(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-pressed"))
}
- fn SetAriaPressed(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-pressed"), value);
+ fn SetAriaPressed(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-pressed"), value, can_gc);
}
fn GetAriaReadOnly(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-readonly"))
}
- fn SetAriaReadOnly(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-readonly"), value);
+ fn SetAriaReadOnly(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-readonly"), value, can_gc);
}
fn GetAriaRelevant(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-relevant"))
}
- fn SetAriaRelevant(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-relevant"), value);
+ fn SetAriaRelevant(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-relevant"), value, can_gc);
}
fn GetAriaRequired(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-required"))
}
- fn SetAriaRequired(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-required"), value);
+ fn SetAriaRequired(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-required"), value, can_gc);
}
fn GetAriaRoleDescription(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-roledescription"))
}
- fn SetAriaRoleDescription(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-roledescription"), value);
+ fn SetAriaRoleDescription(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-roledescription"), value, can_gc);
}
fn GetAriaRowCount(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-rowcount"))
}
- fn SetAriaRowCount(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-rowcount"), value);
+ fn SetAriaRowCount(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-rowcount"), value, can_gc);
}
fn GetAriaRowIndex(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-rowindex"))
}
- fn SetAriaRowIndex(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-rowindex"), value);
+ fn SetAriaRowIndex(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-rowindex"), value, can_gc);
}
fn GetAriaRowIndexText(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-rowindextext"))
}
- fn SetAriaRowIndexText(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-rowindextext"), value);
+ fn SetAriaRowIndexText(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-rowindextext"), value, can_gc);
}
fn GetAriaRowSpan(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-rowspan"))
}
- fn SetAriaRowSpan(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-rowspan"), value);
+ fn SetAriaRowSpan(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-rowspan"), value, can_gc);
}
fn GetAriaSelected(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-selected"))
}
- fn SetAriaSelected(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-selected"), value);
+ fn SetAriaSelected(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-selected"), value, can_gc);
}
fn GetAriaSetSize(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-setsize"))
}
- fn SetAriaSetSize(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-setsize"), value);
+ fn SetAriaSetSize(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-setsize"), value, can_gc);
}
fn GetAriaSort(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-sort"))
}
- fn SetAriaSort(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-sort"), value);
+ fn SetAriaSort(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-sort"), value, can_gc);
}
fn GetAriaValueMax(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-valuemax"))
}
- fn SetAriaValueMax(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-valuemax"), value);
+ fn SetAriaValueMax(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-valuemax"), value, can_gc);
}
fn GetAriaValueMin(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-valuemin"))
}
- fn SetAriaValueMin(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-valuemin"), value);
+ fn SetAriaValueMin(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-valuemin"), value, can_gc);
}
fn GetAriaValueNow(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-valuenow"))
}
- fn SetAriaValueNow(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-valuenow"), value);
+ fn SetAriaValueNow(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-valuenow"), value, can_gc);
}
fn GetAriaValueText(&self) -> Option<DOMString> {
self.get_nullable_string_attribute(&local_name!("aria-valuetext"))
}
- fn SetAriaValueText(&self, value: Option<DOMString>) {
- self.set_nullable_string_attribute(&local_name!("aria-valuetext"), value);
+ fn SetAriaValueText(&self, value: Option<DOMString>, can_gc: CanGc) {
+ self.set_nullable_string_attribute(&local_name!("aria-valuetext"), value, can_gc);
}
}
@@ -4414,9 +4479,9 @@ pub fn reflect_cross_origin_attribute(element: &Element) -> Option<DOMString> {
None
}
-pub fn set_cross_origin_attribute(element: &Element, value: Option<DOMString>) {
+pub fn set_cross_origin_attribute(element: &Element, value: Option<DOMString>, can_gc: CanGc) {
match value {
- Some(val) => element.set_string_attribute(&local_name!("crossorigin"), val),
+ Some(val) => element.set_string_attribute(&local_name!("crossorigin"), val, can_gc),
None => {
element.remove_attribute(&ns!(), &local_name!("crossorigin"));
},
diff --git a/components/script/dom/htmlanchorelement.rs b/components/script/dom/htmlanchorelement.rs
index a38195030c0..bf0db257134 100644
--- a/components/script/dom/htmlanchorelement.rs
+++ b/components/script/dom/htmlanchorelement.rs
@@ -67,6 +67,7 @@ impl HTMLAnchorElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLAnchorElement> {
Node::reflect_node_with_proto(
Box::new(HTMLAnchorElement::new_inherited(
@@ -74,6 +75,7 @@ impl HTMLAnchorElement {
)),
document,
proto,
+ can_gc,
)
}
@@ -115,9 +117,9 @@ impl HTMLAnchorElement {
}
// https://html.spec.whatwg.org/multipage/#update-href
- fn update_href(&self, url: DOMString) {
+ fn update_href(&self, url: DOMString, can_gc: CanGc) {
self.upcast::<Element>()
- .set_string_attribute(&local_name!("href"), url);
+ .set_string_attribute(&local_name!("href"), url, can_gc);
}
}
@@ -165,17 +167,17 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement {
}
// https://html.spec.whatwg.org/multipage/#dom-a-text
- fn SetText(&self, value: DOMString) {
- self.upcast::<Node>().SetTextContent(Some(value))
+ fn SetText(&self, value: DOMString, can_gc: CanGc) {
+ self.upcast::<Node>().SetTextContent(Some(value), can_gc)
}
// https://html.spec.whatwg.org/multipage/#dom-a-rel
make_getter!(Rel, "rel");
// https://html.spec.whatwg.org/multipage/#dom-a-rel
- fn SetRel(&self, rel: DOMString) {
+ fn SetRel(&self, rel: DOMString, can_gc: CanGc) {
self.upcast::<Element>()
- .set_tokenlist_attribute(&local_name!("rel"), rel);
+ .set_tokenlist_attribute(&local_name!("rel"), rel, can_gc);
}
// https://html.spec.whatwg.org/multipage/#dom-a-rellist
@@ -239,7 +241,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement {
}
// https://html.spec.whatwg.org/multipage/#dom-hyperlink-hash
- fn SetHash(&self, value: USVString) {
+ fn SetHash(&self, value: USVString, can_gc: CanGc) {
// Step 1.
self.reinitialize_url();
@@ -255,7 +257,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement {
},
};
// Step 6.
- self.update_href(url);
+ self.update_href(url, can_gc);
}
// https://html.spec.whatwg.org/multipage/#dom-hyperlink-host
@@ -278,7 +280,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement {
}
// https://html.spec.whatwg.org/multipage/#dom-hyperlink-host
- fn SetHost(&self, value: USVString) {
+ fn SetHost(&self, value: USVString, can_gc: CanGc) {
// Step 1.
self.reinitialize_url();
@@ -294,7 +296,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement {
},
};
// Step 5.
- self.update_href(url);
+ self.update_href(url, can_gc);
}
// https://html.spec.whatwg.org/multipage/#dom-hyperlink-hostname
@@ -313,7 +315,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement {
}
// https://html.spec.whatwg.org/multipage/#dom-hyperlink-hostname
- fn SetHostname(&self, value: USVString) {
+ fn SetHostname(&self, value: USVString, can_gc: CanGc) {
// Step 1.
self.reinitialize_url();
@@ -329,7 +331,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement {
},
};
// Step 5.
- self.update_href(url);
+ self.update_href(url, can_gc);
}
// https://html.spec.whatwg.org/multipage/#dom-hyperlink-href
@@ -355,9 +357,12 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement {
}
// https://html.spec.whatwg.org/multipage/#dom-hyperlink-href
- fn SetHref(&self, value: USVString) {
- self.upcast::<Element>()
- .set_string_attribute(&local_name!("href"), DOMString::from_string(value.0));
+ fn SetHref(&self, value: USVString, can_gc: CanGc) {
+ self.upcast::<Element>().set_string_attribute(
+ &local_name!("href"),
+ DOMString::from_string(value.0),
+ can_gc,
+ );
self.set_url();
}
@@ -392,7 +397,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement {
}
// https://html.spec.whatwg.org/multipage/#dom-hyperlink-password
- fn SetPassword(&self, value: USVString) {
+ fn SetPassword(&self, value: USVString, can_gc: CanGc) {
// Step 1.
self.reinitialize_url();
@@ -408,7 +413,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement {
},
};
// Step 5.
- self.update_href(url);
+ self.update_href(url, can_gc);
}
// https://html.spec.whatwg.org/multipage/#dom-hyperlink-pathname
@@ -425,7 +430,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement {
}
// https://html.spec.whatwg.org/multipage/#dom-hyperlink-pathname
- fn SetPathname(&self, value: USVString) {
+ fn SetPathname(&self, value: USVString, can_gc: CanGc) {
// Step 1.
self.reinitialize_url();
@@ -441,7 +446,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement {
},
};
// Step 6.
- self.update_href(url);
+ self.update_href(url, can_gc);
}
// https://html.spec.whatwg.org/multipage/#dom-hyperlink-port
@@ -458,7 +463,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement {
}
// https://html.spec.whatwg.org/multipage/#dom-hyperlink-port
- fn SetPort(&self, value: USVString) {
+ fn SetPort(&self, value: USVString, can_gc: CanGc) {
// Step 1.
self.reinitialize_url();
@@ -477,7 +482,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement {
},
};
// Step 5.
- self.update_href(url);
+ self.update_href(url, can_gc);
}
// https://html.spec.whatwg.org/multipage/#dom-hyperlink-protocol
@@ -494,7 +499,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement {
}
// https://html.spec.whatwg.org/multipage/#dom-hyperlink-protocol
- fn SetProtocol(&self, value: USVString) {
+ fn SetProtocol(&self, value: USVString, can_gc: CanGc) {
// Step 1.
self.reinitialize_url();
@@ -508,7 +513,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement {
},
};
// Step 4.
- self.update_href(url);
+ self.update_href(url, can_gc);
}
// https://html.spec.whatwg.org/multipage/#dom-hyperlink-search
@@ -525,7 +530,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement {
}
// https://html.spec.whatwg.org/multipage/#dom-hyperlink-search
- fn SetSearch(&self, value: USVString) {
+ fn SetSearch(&self, value: USVString, can_gc: CanGc) {
// Step 1.
self.reinitialize_url();
@@ -542,7 +547,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement {
},
};
// Step 6.
- self.update_href(url);
+ self.update_href(url, can_gc);
}
// https://html.spec.whatwg.org/multipage/#dom-hyperlink-username
@@ -559,7 +564,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement {
}
// https://html.spec.whatwg.org/multipage/#dom-hyperlink-username
- fn SetUsername(&self, value: USVString) {
+ fn SetUsername(&self, value: USVString, can_gc: CanGc) {
// Step 1.
self.reinitialize_url();
@@ -575,7 +580,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement {
},
};
// Step 5.
- self.update_href(url);
+ self.update_href(url, can_gc);
}
}
diff --git a/components/script/dom/htmlareaelement.rs b/components/script/dom/htmlareaelement.rs
index f7b34642d86..f42a769a18e 100644
--- a/components/script/dom/htmlareaelement.rs
+++ b/components/script/dom/htmlareaelement.rs
@@ -264,11 +264,13 @@ impl HTMLAreaElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLAreaElement> {
Node::reflect_node_with_proto(
Box::new(HTMLAreaElement::new_inherited(local_name, prefix, document)),
document,
proto,
+ can_gc,
)
}
@@ -341,9 +343,9 @@ impl HTMLAreaElementMethods for HTMLAreaElement {
make_getter!(Rel, "rel");
// https://html.spec.whatwg.org/multipage/#dom-a-rel
- fn SetRel(&self, rel: DOMString) {
+ fn SetRel(&self, rel: DOMString, can_gc: CanGc) {
self.upcast::<Element>()
- .set_tokenlist_attribute(&local_name!("rel"), rel);
+ .set_tokenlist_attribute(&local_name!("rel"), rel, can_gc);
}
// https://html.spec.whatwg.org/multipage/#dom-area-rellist
diff --git a/components/script/dom/htmlaudioelement.rs b/components/script/dom/htmlaudioelement.rs
index e1e295e029c..b9140f9c2d3 100644
--- a/components/script/dom/htmlaudioelement.rs
+++ b/components/script/dom/htmlaudioelement.rs
@@ -42,6 +42,7 @@ impl HTMLAudioElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLAudioElement> {
Node::reflect_node_with_proto(
Box::new(HTMLAudioElement::new_inherited(
@@ -49,6 +50,7 @@ impl HTMLAudioElement {
)),
document,
proto,
+ can_gc,
)
}
}
@@ -75,12 +77,12 @@ impl HTMLAudioElementMethods for HTMLAudioElement {
audio
.upcast::<Element>()
- .SetAttribute(DOMString::from("preload"), DOMString::from("auto"))
+ .SetAttribute(DOMString::from("preload"), DOMString::from("auto"), can_gc)
.expect("should be infallible");
if let Some(s) = src {
audio
.upcast::<Element>()
- .SetAttribute(DOMString::from("src"), s)
+ .SetAttribute(DOMString::from("src"), s, can_gc)
.expect("should be infallible");
}
diff --git a/components/script/dom/htmlbaseelement.rs b/components/script/dom/htmlbaseelement.rs
index 59725b2161e..e87d8b58fc5 100644
--- a/components/script/dom/htmlbaseelement.rs
+++ b/components/script/dom/htmlbaseelement.rs
@@ -17,6 +17,7 @@ use crate::dom::element::{AttributeMutation, Element};
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::{document_from_node, BindContext, Node, UnbindContext};
use crate::dom::virtualmethods::VirtualMethods;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLBaseElement {
@@ -40,11 +41,13 @@ impl HTMLBaseElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLBaseElement> {
Node::reflect_node_with_proto(
Box::new(HTMLBaseElement::new_inherited(local_name, prefix, document)),
document,
proto,
+ can_gc,
)
}
diff --git a/components/script/dom/htmlbodyelement.rs b/components/script/dom/htmlbodyelement.rs
index bc544e5491a..e85eb407900 100644
--- a/components/script/dom/htmlbodyelement.rs
+++ b/components/script/dom/htmlbodyelement.rs
@@ -24,6 +24,7 @@ use crate::dom::eventtarget::EventTarget;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::{document_from_node, window_from_node, BindContext, Node};
use crate::dom::virtualmethods::VirtualMethods;
+use crate::script_runtime::CanGc;
/// How long we should wait before performing the initial reflow after `<body>` is parsed.
const INITIAL_REFLOW_DELAY: Duration = Duration::from_millis(200);
@@ -50,11 +51,13 @@ impl HTMLBodyElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLBodyElement> {
Node::reflect_node_with_proto(
Box::new(HTMLBodyElement::new_inherited(local_name, prefix, document)),
document,
proto,
+ can_gc,
)
}
@@ -87,13 +90,13 @@ impl HTMLBodyElementMethods for HTMLBodyElement {
make_getter!(Background, "background");
// https://html.spec.whatwg.org/multipage/#dom-body-background
- fn SetBackground(&self, input: DOMString) {
+ fn SetBackground(&self, input: DOMString, can_gc: CanGc) {
let value = AttrValue::from_resolved_url(
&document_from_node(self).base_url().get_arc(),
input.into(),
);
self.upcast::<Element>()
- .set_attribute(&local_name!("background"), value);
+ .set_attribute(&local_name!("background"), value, can_gc);
}
// https://html.spec.whatwg.org/multipage/#windoweventhandlers
diff --git a/components/script/dom/htmlbrelement.rs b/components/script/dom/htmlbrelement.rs
index a8e06cd4dd1..7f968c27574 100644
--- a/components/script/dom/htmlbrelement.rs
+++ b/components/script/dom/htmlbrelement.rs
@@ -10,6 +10,7 @@ use crate::dom::bindings::root::DomRoot;
use crate::dom::document::Document;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::Node;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLBRElement {
@@ -33,11 +34,13 @@ impl HTMLBRElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLBRElement> {
Node::reflect_node_with_proto(
Box::new(HTMLBRElement::new_inherited(local_name, prefix, document)),
document,
proto,
+ can_gc,
)
}
}
diff --git a/components/script/dom/htmlbuttonelement.rs b/components/script/dom/htmlbuttonelement.rs
index b034e391bc8..0fc017a1707 100644
--- a/components/script/dom/htmlbuttonelement.rs
+++ b/components/script/dom/htmlbuttonelement.rs
@@ -75,6 +75,7 @@ impl HTMLButtonElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLButtonElement> {
Node::reflect_node_with_proto(
Box::new(HTMLButtonElement::new_inherited(
@@ -82,6 +83,7 @@ impl HTMLButtonElement {
)),
document,
proto,
+ can_gc,
)
}
@@ -360,7 +362,7 @@ impl Activatable for HTMLButtonElement {
ButtonType::Reset => {
// TODO: is document owner fully active?
if let Some(owner) = self.form_owner() {
- owner.reset(ResetFrom::NotFromForm);
+ owner.reset(ResetFrom::NotFromForm, CanGc::note());
}
},
_ => (),
diff --git a/components/script/dom/htmlcanvaselement.rs b/components/script/dom/htmlcanvaselement.rs
index 74cbb7adea9..bb3109771f9 100644
--- a/components/script/dom/htmlcanvaselement.rs
+++ b/components/script/dom/htmlcanvaselement.rs
@@ -86,6 +86,7 @@ impl HTMLCanvasElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLCanvasElement> {
Node::reflect_node_with_proto(
Box::new(HTMLCanvasElement::new_inherited(
@@ -93,6 +94,7 @@ impl HTMLCanvasElement {
)),
document,
proto,
+ can_gc,
)
}
diff --git a/components/script/dom/htmldataelement.rs b/components/script/dom/htmldataelement.rs
index 4b59199edb7..c393ef376c3 100644
--- a/components/script/dom/htmldataelement.rs
+++ b/components/script/dom/htmldataelement.rs
@@ -12,6 +12,7 @@ use crate::dom::bindings::str::DOMString;
use crate::dom::document::Document;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::Node;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLDataElement {
@@ -35,11 +36,13 @@ impl HTMLDataElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLDataElement> {
Node::reflect_node_with_proto(
Box::new(HTMLDataElement::new_inherited(local_name, prefix, document)),
document,
proto,
+ can_gc,
)
}
}
diff --git a/components/script/dom/htmldatalistelement.rs b/components/script/dom/htmldatalistelement.rs
index 4d74e2aded5..3a5947e218a 100644
--- a/components/script/dom/htmldatalistelement.rs
+++ b/components/script/dom/htmldatalistelement.rs
@@ -15,6 +15,7 @@ use crate::dom::htmlcollection::{CollectionFilter, HTMLCollection};
use crate::dom::htmlelement::HTMLElement;
use crate::dom::htmloptionelement::HTMLOptionElement;
use crate::dom::node::{window_from_node, Node};
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLDataListElement {
@@ -38,6 +39,7 @@ impl HTMLDataListElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLDataListElement> {
Node::reflect_node_with_proto(
Box::new(HTMLDataListElement::new_inherited(
@@ -45,6 +47,7 @@ impl HTMLDataListElement {
)),
document,
proto,
+ can_gc,
)
}
}
diff --git a/components/script/dom/htmldetailselement.rs b/components/script/dom/htmldetailselement.rs
index f620f7d576a..e5f2d9986fa 100644
--- a/components/script/dom/htmldetailselement.rs
+++ b/components/script/dom/htmldetailselement.rs
@@ -19,6 +19,7 @@ use crate::dom::eventtarget::EventTarget;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::{window_from_node, Node, NodeDamage};
use crate::dom::virtualmethods::VirtualMethods;
+use crate::script_runtime::CanGc;
use crate::task_source::TaskSource;
#[dom_struct]
@@ -45,6 +46,7 @@ impl HTMLDetailsElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLDetailsElement> {
Node::reflect_node_with_proto(
Box::new(HTMLDetailsElement::new_inherited(
@@ -52,6 +54,7 @@ impl HTMLDetailsElement {
)),
document,
proto,
+ can_gc,
)
}
diff --git a/components/script/dom/htmldialogelement.rs b/components/script/dom/htmldialogelement.rs
index 9ab630a6564..ee52cbfb814 100644
--- a/components/script/dom/htmldialogelement.rs
+++ b/components/script/dom/htmldialogelement.rs
@@ -16,6 +16,7 @@ use crate::dom::element::Element;
use crate::dom::eventtarget::EventTarget;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::{window_from_node, Node};
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLDialogElement {
@@ -41,6 +42,7 @@ impl HTMLDialogElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLDialogElement> {
Node::reflect_node_with_proto(
Box::new(HTMLDialogElement::new_inherited(
@@ -48,6 +50,7 @@ impl HTMLDialogElement {
)),
document,
proto,
+ can_gc,
)
}
}
@@ -71,7 +74,7 @@ impl HTMLDialogElementMethods for HTMLDialogElement {
}
/// <https://html.spec.whatwg.org/multipage/#dom-dialog-show>
- fn Show(&self) {
+ fn Show(&self, can_gc: CanGc) {
let element = self.upcast::<Element>();
// Step 1 TODO: Check is modal flag is false
@@ -82,7 +85,7 @@ impl HTMLDialogElementMethods for HTMLDialogElement {
// TODO: Step 2 If this has an open attribute, then throw an "InvalidStateError" DOMException.
// Step 3
- element.set_bool_attribute(&local_name!("open"), true);
+ element.set_bool_attribute(&local_name!("open"), true, can_gc);
// TODO: Step 4 Set this's previously focused element to the focused element.
diff --git a/components/script/dom/htmldirectoryelement.rs b/components/script/dom/htmldirectoryelement.rs
index 2b11f61fced..d06b622e5c9 100644
--- a/components/script/dom/htmldirectoryelement.rs
+++ b/components/script/dom/htmldirectoryelement.rs
@@ -10,6 +10,7 @@ use crate::dom::bindings::root::DomRoot;
use crate::dom::document::Document;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::Node;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLDirectoryElement {
@@ -33,6 +34,7 @@ impl HTMLDirectoryElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLDirectoryElement> {
Node::reflect_node_with_proto(
Box::new(HTMLDirectoryElement::new_inherited(
@@ -40,6 +42,7 @@ impl HTMLDirectoryElement {
)),
document,
proto,
+ can_gc,
)
}
}
diff --git a/components/script/dom/htmldivelement.rs b/components/script/dom/htmldivelement.rs
index af25f8a6731..bc028c1d09d 100644
--- a/components/script/dom/htmldivelement.rs
+++ b/components/script/dom/htmldivelement.rs
@@ -12,6 +12,7 @@ use crate::dom::bindings::str::DOMString;
use crate::dom::document::Document;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::Node;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLDivElement {
@@ -35,11 +36,13 @@ impl HTMLDivElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLDivElement> {
Node::reflect_node_with_proto(
Box::new(HTMLDivElement::new_inherited(local_name, prefix, document)),
document,
proto,
+ can_gc,
)
}
}
diff --git a/components/script/dom/htmldlistelement.rs b/components/script/dom/htmldlistelement.rs
index 828927fbb69..1e51328fe96 100644
--- a/components/script/dom/htmldlistelement.rs
+++ b/components/script/dom/htmldlistelement.rs
@@ -10,6 +10,7 @@ use crate::dom::bindings::root::DomRoot;
use crate::dom::document::Document;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::Node;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLDListElement {
@@ -33,6 +34,7 @@ impl HTMLDListElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLDListElement> {
Node::reflect_node_with_proto(
Box::new(HTMLDListElement::new_inherited(
@@ -40,6 +42,7 @@ impl HTMLDListElement {
)),
document,
proto,
+ can_gc,
)
}
}
diff --git a/components/script/dom/htmlelement.rs b/components/script/dom/htmlelement.rs
index cbbbd86ce3c..b3811edb5ec 100644
--- a/components/script/dom/htmlelement.rs
+++ b/components/script/dom/htmlelement.rs
@@ -95,11 +95,13 @@ impl HTMLElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLElement> {
Node::reflect_node_with_proto(
Box::new(HTMLElement::new_inherited(local_name, prefix, document)),
document,
proto,
+ can_gc,
)
}
@@ -481,10 +483,10 @@ impl HTMLElementMethods for HTMLElement {
}
/// <https://html.spec.whatwg.org/multipage/#set-the-inner-text-steps>
- fn SetInnerText(&self, input: DOMString) {
+ fn SetInnerText(&self, input: DOMString, can_gc: CanGc) {
// Step 1: Let fragment be the rendered text fragment for value given element's node
// document.
- let fragment = self.rendered_text_fragment(input);
+ let fragment = self.rendered_text_fragment(input, can_gc);
// Step 2: Replace all with fragment within element.
Node::replace_all(Some(fragment.upcast()), self.upcast::<Node>());
@@ -496,7 +498,7 @@ impl HTMLElementMethods for HTMLElement {
}
/// <https://html.spec.whatwg.org/multipage/#the-innertext-idl-attribute:dom-outertext-2>
- fn SetOuterText(&self, input: DOMString) -> Fallible<()> {
+ fn SetOuterText(&self, input: DOMString, can_gc: CanGc) -> Fallible<()> {
// Step 1: If this's parent is null, then throw a "NoModificationAllowedError" DOMException.
let Some(parent) = self.upcast::<Node>().GetParentNode() else {
return Err(Error::NoModificationAllowed);
@@ -513,12 +515,12 @@ impl HTMLElementMethods for HTMLElement {
// Step 4: Let fragment be the rendered text fragment for the given value given this's node
// document.
- let fragment = self.rendered_text_fragment(input);
+ let fragment = self.rendered_text_fragment(input, can_gc);
// Step 5: If fragment has no children, then append a new Text node whose data is the empty
// string and node document is this's node document to fragment.
if fragment.upcast::<Node>().children_count() == 0 {
- let text_node = Text::new(DOMString::from("".to_owned()), &document);
+ let text_node = Text::new(DOMString::from("".to_owned()), &document, can_gc);
fragment.upcast::<Node>().AppendChild(text_node.upcast())?;
}
@@ -548,13 +550,14 @@ impl HTMLElementMethods for HTMLElement {
}
// https://html.spec.whatwg.org/multipage/#dom-translate
- fn SetTranslate(&self, yesno: bool) {
+ fn SetTranslate(&self, yesno: bool, can_gc: CanGc) {
self.as_element().set_string_attribute(
&html5ever::local_name!("translate"),
match yesno {
true => DOMString::from("yes"),
false => DOMString::from("no"),
},
+ can_gc,
);
}
@@ -625,14 +628,19 @@ impl HTMLElementMethods for HTMLElement {
}
// https://html.spec.whatwg.org/multipage/#dom-fe-autofocus
- fn SetAutofocus(&self, autofocus: bool) {
+ fn SetAutofocus(&self, autofocus: bool, can_gc: CanGc) {
self.element
- .set_bool_attribute(&local_name!("autofocus"), autofocus);
+ .set_bool_attribute(&local_name!("autofocus"), autofocus, can_gc);
}
}
-fn append_text_node_to_fragment(document: &Document, fragment: &DocumentFragment, text: String) {
- let text = Text::new(DOMString::from(text), document);
+fn append_text_node_to_fragment(
+ document: &Document,
+ fragment: &DocumentFragment,
+ text: String,
+ can_gc: CanGc,
+) {
+ let text = Text::new(DOMString::from(text), document, can_gc);
fragment
.upcast::<Node>()
.AppendChild(text.upcast())
@@ -695,7 +703,7 @@ fn to_camel_case(name: &str) -> Option<DOMString> {
}
impl HTMLElement {
- pub fn set_custom_attr(&self, name: DOMString, value: DOMString) -> ErrorResult {
+ pub fn set_custom_attr(&self, name: DOMString, value: DOMString, can_gc: CanGc) -> ErrorResult {
if name
.chars()
.skip_while(|&ch| ch != '\u{2d}')
@@ -705,7 +713,7 @@ impl HTMLElement {
return Err(Error::Syntax);
}
self.as_element()
- .set_custom_attribute(to_snake_case(name), value)
+ .set_custom_attribute(to_snake_case(name), value, can_gc)
}
pub fn get_custom_attr(&self, local_name: DOMString) -> Option<DOMString> {
@@ -926,10 +934,10 @@ impl HTMLElement {
}
/// <https://html.spec.whatwg.org/multipage/#rendered-text-fragment>
- fn rendered_text_fragment(&self, input: DOMString) -> DomRoot<DocumentFragment> {
+ fn rendered_text_fragment(&self, input: DOMString, can_gc: CanGc) -> DomRoot<DocumentFragment> {
// Step 1: Let fragment be a new DocumentFragment whose node document is document.
let document = document_from_node(self);
- let fragment = DocumentFragment::new(&document);
+ let fragment = DocumentFragment::new(&document, can_gc);
// Step 2: Let position be a position variable for input, initially pointing at the start
// of input.
@@ -951,11 +959,11 @@ impl HTMLElement {
}
if !text.is_empty() {
- append_text_node_to_fragment(&document, &fragment, text);
+ append_text_node_to_fragment(&document, &fragment, text, can_gc);
text = String::new();
}
- let br = HTMLBRElement::new(local_name!("br"), None, &document, None);
+ let br = HTMLBRElement::new(local_name!("br"), None, &document, None, can_gc);
fragment.upcast::<Node>().AppendChild(br.upcast()).unwrap();
},
_ => {
@@ -969,7 +977,7 @@ impl HTMLElement {
// If text is not the empty string, then append a new Text node whose data is text and node
// document is document to fragment.
if !text.is_empty() {
- append_text_node_to_fragment(&document, &fragment, text);
+ append_text_node_to_fragment(&document, &fragment, text, can_gc);
}
fragment
diff --git a/components/script/dom/htmlembedelement.rs b/components/script/dom/htmlembedelement.rs
index 714798cfe80..65314abdd9e 100644
--- a/components/script/dom/htmlembedelement.rs
+++ b/components/script/dom/htmlembedelement.rs
@@ -10,6 +10,7 @@ use crate::dom::bindings::root::DomRoot;
use crate::dom::document::Document;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::Node;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLEmbedElement {
@@ -33,6 +34,7 @@ impl HTMLEmbedElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLEmbedElement> {
Node::reflect_node_with_proto(
Box::new(HTMLEmbedElement::new_inherited(
@@ -40,6 +42,7 @@ impl HTMLEmbedElement {
)),
document,
proto,
+ can_gc,
)
}
}
diff --git a/components/script/dom/htmlfieldsetelement.rs b/components/script/dom/htmlfieldsetelement.rs
index ab27a38d272..b0a253e869b 100644
--- a/components/script/dom/htmlfieldsetelement.rs
+++ b/components/script/dom/htmlfieldsetelement.rs
@@ -59,6 +59,7 @@ impl HTMLFieldSetElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLFieldSetElement> {
Node::reflect_node_with_proto(
Box::new(HTMLFieldSetElement::new_inherited(
@@ -66,6 +67,7 @@ impl HTMLFieldSetElement {
)),
document,
proto,
+ can_gc,
)
}
diff --git a/components/script/dom/htmlfontelement.rs b/components/script/dom/htmlfontelement.rs
index c06d9367a73..13d9cd41307 100644
--- a/components/script/dom/htmlfontelement.rs
+++ b/components/script/dom/htmlfontelement.rs
@@ -24,6 +24,7 @@ use crate::dom::element::{Element, LayoutElementHelpers};
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::Node;
use crate::dom::virtualmethods::VirtualMethods;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLFontElement {
@@ -47,11 +48,13 @@ impl HTMLFontElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLFontElement> {
Node::reflect_node_with_proto(
Box::new(HTMLFontElement::new_inherited(local_name, prefix, document)),
document,
proto,
+ can_gc,
)
}
@@ -104,9 +107,9 @@ impl HTMLFontElementMethods for HTMLFontElement {
make_getter!(Size, "size");
// https://html.spec.whatwg.org/multipage/#dom-font-size
- fn SetSize(&self, value: DOMString) {
+ fn SetSize(&self, value: DOMString, can_gc: CanGc) {
let element = self.upcast::<Element>();
- element.set_attribute(&local_name!("size"), parse_size(&value));
+ element.set_attribute(&local_name!("size"), parse_size(&value), can_gc);
}
}
diff --git a/components/script/dom/htmlformelement.rs b/components/script/dom/htmlformelement.rs
index 53a38441b11..e4f35fec912 100644
--- a/components/script/dom/htmlformelement.rs
+++ b/components/script/dom/htmlformelement.rs
@@ -140,11 +140,13 @@ impl HTMLFormElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLFormElement> {
Node::reflect_node_with_proto(
Box::new(HTMLFormElement::new_inherited(local_name, prefix, document)),
document,
proto,
+ can_gc,
)
}
@@ -339,8 +341,8 @@ impl HTMLFormElementMethods for HTMLFormElement {
}
// https://html.spec.whatwg.org/multipage/#dom-form-reset
- fn Reset(&self) {
- self.reset(ResetFrom::FromForm);
+ fn Reset(&self, can_gc: CanGc) {
+ self.reset(ResetFrom::FromForm, can_gc);
}
// https://html.spec.whatwg.org/multipage/#dom-form-elements
@@ -474,9 +476,9 @@ impl HTMLFormElementMethods for HTMLFormElement {
}
// https://html.spec.whatwg.org/multipage/#dom-a-rel
- fn SetRel(&self, rel: DOMString) {
+ fn SetRel(&self, rel: DOMString, can_gc: CanGc) {
self.upcast::<Element>()
- .set_tokenlist_attribute(&local_name!("rel"), rel);
+ .set_tokenlist_attribute(&local_name!("rel"), rel, can_gc);
}
// https://html.spec.whatwg.org/multipage/#dom-a-rellist
@@ -1230,7 +1232,7 @@ impl HTMLFormElement {
Some(form_data.datums())
}
- pub fn reset(&self, _reset_method_flag: ResetFrom) {
+ pub fn reset(&self, _reset_method_flag: ResetFrom, can_gc: CanGc) {
// https://html.spec.whatwg.org/multipage/#locked-for-reset
if self.marked_for_reset.get() {
return;
@@ -1268,7 +1270,7 @@ impl HTMLFormElement {
NodeTypeId::Element(ElementTypeId::HTMLElement(
HTMLElementTypeId::HTMLOutputElement,
)) => {
- child.downcast::<HTMLOutputElement>().unwrap().reset();
+ child.downcast::<HTMLOutputElement>().unwrap().reset(can_gc);
},
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLElement)) => {
let html_element = child.downcast::<HTMLElement>().unwrap();
diff --git a/components/script/dom/htmlframeelement.rs b/components/script/dom/htmlframeelement.rs
index 93b0dc0722b..87348f33ebd 100644
--- a/components/script/dom/htmlframeelement.rs
+++ b/components/script/dom/htmlframeelement.rs
@@ -10,6 +10,7 @@ use crate::dom::bindings::root::DomRoot;
use crate::dom::document::Document;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::Node;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLFrameElement {
@@ -33,6 +34,7 @@ impl HTMLFrameElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLFrameElement> {
Node::reflect_node_with_proto(
Box::new(HTMLFrameElement::new_inherited(
@@ -40,6 +42,7 @@ impl HTMLFrameElement {
)),
document,
proto,
+ can_gc,
)
}
}
diff --git a/components/script/dom/htmlframesetelement.rs b/components/script/dom/htmlframesetelement.rs
index 723435b7f46..37e81ff2f0a 100644
--- a/components/script/dom/htmlframesetelement.rs
+++ b/components/script/dom/htmlframesetelement.rs
@@ -13,6 +13,7 @@ use crate::dom::bindings::root::DomRoot;
use crate::dom::document::Document;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::{document_from_node, Node};
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLFrameSetElement {
@@ -36,6 +37,7 @@ impl HTMLFrameSetElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLFrameSetElement> {
let n = Node::reflect_node_with_proto(
Box::new(HTMLFrameSetElement::new_inherited(
@@ -43,6 +45,7 @@ impl HTMLFrameSetElement {
)),
document,
proto,
+ can_gc,
);
n.upcast::<Node>().set_weird_parser_insertion_mode();
n
diff --git a/components/script/dom/htmlheadelement.rs b/components/script/dom/htmlheadelement.rs
index 33f628df572..3e6e9bafb60 100644
--- a/components/script/dom/htmlheadelement.rs
+++ b/components/script/dom/htmlheadelement.rs
@@ -17,6 +17,7 @@ use crate::dom::htmlmetaelement::HTMLMetaElement;
use crate::dom::node::{document_from_node, BindContext, Node, ShadowIncluding};
use crate::dom::userscripts::load_script;
use crate::dom::virtualmethods::VirtualMethods;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLHeadElement {
@@ -40,11 +41,13 @@ impl HTMLHeadElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLHeadElement> {
let n = Node::reflect_node_with_proto(
Box::new(HTMLHeadElement::new_inherited(local_name, prefix, document)),
document,
proto,
+ can_gc,
);
n.upcast::<Node>().set_weird_parser_insertion_mode();
diff --git a/components/script/dom/htmlheadingelement.rs b/components/script/dom/htmlheadingelement.rs
index c184bb115e9..ed71480b413 100644
--- a/components/script/dom/htmlheadingelement.rs
+++ b/components/script/dom/htmlheadingelement.rs
@@ -10,6 +10,7 @@ use crate::dom::bindings::root::DomRoot;
use crate::dom::document::Document;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::Node;
+use crate::script_runtime::CanGc;
#[derive(JSTraceable, MallocSizeOf)]
pub enum HeadingLevel {
@@ -47,6 +48,7 @@ impl HTMLHeadingElement {
document: &Document,
proto: Option<HandleObject>,
level: HeadingLevel,
+ can_gc: CanGc,
) -> DomRoot<HTMLHeadingElement> {
Node::reflect_node_with_proto(
Box::new(HTMLHeadingElement::new_inherited(
@@ -54,6 +56,7 @@ impl HTMLHeadingElement {
)),
document,
proto,
+ can_gc,
)
}
}
diff --git a/components/script/dom/htmlhrelement.rs b/components/script/dom/htmlhrelement.rs
index 351b825d730..24f86f94674 100644
--- a/components/script/dom/htmlhrelement.rs
+++ b/components/script/dom/htmlhrelement.rs
@@ -17,6 +17,7 @@ use crate::dom::element::{Element, LayoutElementHelpers};
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::Node;
use crate::dom::virtualmethods::VirtualMethods;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLHRElement {
@@ -40,11 +41,13 @@ impl HTMLHRElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLHRElement> {
Node::reflect_node_with_proto(
Box::new(HTMLHRElement::new_inherited(local_name, prefix, document)),
document,
proto,
+ can_gc,
)
}
}
diff --git a/components/script/dom/htmlhtmlelement.rs b/components/script/dom/htmlhtmlelement.rs
index 7331a0f7513..ebb07276e2e 100644
--- a/components/script/dom/htmlhtmlelement.rs
+++ b/components/script/dom/htmlhtmlelement.rs
@@ -11,6 +11,7 @@ use crate::dom::bindings::root::DomRoot;
use crate::dom::document::Document;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::Node;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLHtmlElement {
@@ -35,11 +36,13 @@ impl HTMLHtmlElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLHtmlElement> {
let n = Node::reflect_node_with_proto(
Box::new(HTMLHtmlElement::new_inherited(localName, prefix, document)),
document,
proto,
+ can_gc,
);
n.upcast::<Node>().set_weird_parser_insertion_mode();
diff --git a/components/script/dom/htmliframeelement.rs b/components/script/dom/htmliframeelement.rs
index d7f0f39274e..8745606b39c 100644
--- a/components/script/dom/htmliframeelement.rs
+++ b/components/script/dom/htmliframeelement.rs
@@ -456,6 +456,7 @@ impl HTMLIFrameElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLIFrameElement> {
Node::reflect_node_with_proto(
Box::new(HTMLIFrameElement::new_inherited(
@@ -463,6 +464,7 @@ impl HTMLIFrameElement {
)),
document,
proto,
+ can_gc,
)
}
diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs
index 859f2ec1d55..13970e06aad 100644
--- a/components/script/dom/htmlimageelement.rs
+++ b/components/script/dom/htmlimageelement.rs
@@ -1335,6 +1335,7 @@ impl HTMLImageElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLImageElement> {
Node::reflect_node_with_proto(
Box::new(HTMLImageElement::new_inherited(
@@ -1342,6 +1343,7 @@ impl HTMLImageElement {
)),
document,
proto,
+ can_gc,
)
}
@@ -1546,10 +1548,10 @@ impl HTMLImageElementMethods for HTMLImageElement {
let image = DomRoot::downcast::<HTMLImageElement>(element).unwrap();
if let Some(w) = width {
- image.SetWidth(w);
+ image.SetWidth(w, can_gc);
}
if let Some(h) = height {
- image.SetHeight(h);
+ image.SetHeight(h, can_gc);
}
// run update_the_image_data when the element is created.
@@ -1581,8 +1583,8 @@ impl HTMLImageElementMethods for HTMLImageElement {
}
// https://html.spec.whatwg.org/multipage/#dom-img-crossOrigin
- fn SetCrossOrigin(&self, value: Option<DOMString>) {
- set_cross_origin_attribute(self.upcast::<Element>(), value);
+ fn SetCrossOrigin(&self, value: Option<DOMString>, can_gc: CanGc) {
+ set_cross_origin_attribute(self.upcast::<Element>(), value, can_gc);
}
// https://html.spec.whatwg.org/multipage/#dom-img-usemap
@@ -1605,8 +1607,8 @@ impl HTMLImageElementMethods for HTMLImageElement {
}
// https://html.spec.whatwg.org/multipage/#dom-img-width
- fn SetWidth(&self, value: u32) {
- image_dimension_setter(self.upcast(), local_name!("width"), value);
+ fn SetWidth(&self, value: u32, can_gc: CanGc) {
+ image_dimension_setter(self.upcast(), local_name!("width"), value, can_gc);
}
// https://html.spec.whatwg.org/multipage/#dom-img-height
@@ -1619,8 +1621,8 @@ impl HTMLImageElementMethods for HTMLImageElement {
}
// https://html.spec.whatwg.org/multipage/#dom-img-height
- fn SetHeight(&self, value: u32) {
- image_dimension_setter(self.upcast(), local_name!("height"), value);
+ fn SetHeight(&self, value: u32, can_gc: CanGc) {
+ image_dimension_setter(self.upcast(), local_name!("height"), value, can_gc);
}
// https://html.spec.whatwg.org/multipage/#dom-img-naturalwidth
@@ -1688,7 +1690,7 @@ impl HTMLImageElementMethods for HTMLImageElement {
}
// https://html.spec.whatwg.org/multipage/#dom-img-referrerpolicy
- fn SetReferrerPolicy(&self, value: DOMString) {
+ fn SetReferrerPolicy(&self, value: DOMString, can_gc: CanGc) {
let referrerpolicy_attr_name = local_name!("referrerpolicy");
let element = self.upcast::<Element>();
let previous_correct_attribute_value = get_correct_referrerpolicy_from_raw_token(
@@ -1698,7 +1700,11 @@ impl HTMLImageElementMethods for HTMLImageElement {
if previous_correct_attribute_value != correct_value_or_empty_string {
// Setting the attribute to the same value will update the image.
// We don't want to start an update if referrerpolicy is set to the same value.
- element.set_string_attribute(&referrerpolicy_attr_name, correct_value_or_empty_string);
+ element.set_string_attribute(
+ &referrerpolicy_attr_name,
+ correct_value_or_empty_string,
+ can_gc,
+ );
}
}
@@ -1890,7 +1896,7 @@ impl ImageCacheListener for HTMLImageElement {
}
}
-fn image_dimension_setter(element: &Element, attr: LocalName, value: u32) {
+fn image_dimension_setter(element: &Element, attr: LocalName, value: u32, can_gc: CanGc) {
// This setter is a bit weird: the IDL type is unsigned long, but it's parsed as
// a dimension for rendering.
let value = if value > UNSIGNED_LONG_MAX { 0 } else { value };
@@ -1908,7 +1914,7 @@ fn image_dimension_setter(element: &Element, attr: LocalName, value: u32) {
let dim = LengthOrPercentageOrAuto::Length(Au::from_px(pixel_value as i32));
let value = AttrValue::Dimension(value.to_string(), dim);
- element.set_attribute(&attr, value);
+ element.set_attribute(&attr, value, can_gc);
}
/// Collect sequence of code points
diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs
index 69429b7fc03..3ad69ef0918 100644
--- a/components/script/dom/htmlinputelement.rs
+++ b/components/script/dom/htmlinputelement.rs
@@ -326,6 +326,7 @@ impl HTMLInputElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLInputElement> {
Node::reflect_node_with_proto(
Box::new(HTMLInputElement::new_inherited(
@@ -333,6 +334,7 @@ impl HTMLInputElement {
)),
document,
proto,
+ can_gc,
)
}
@@ -655,7 +657,7 @@ impl HTMLInputElement {
// https://html.spec.whatwg.org/multipage/#dom-input-stepdown
// https://html.spec.whatwg.org/multipage/#dom-input-stepup
- fn step_up_or_down(&self, n: i32, dir: StepDirection) -> ErrorResult {
+ fn step_up_or_down(&self, n: i32, dir: StepDirection, can_gc: CanGc) -> ErrorResult {
// Step 1
if !self.does_value_as_number_apply() {
return Err(Error::InvalidState);
@@ -738,7 +740,7 @@ impl HTMLInputElement {
}
// Step 11
- self.SetValueAsNumber(value)
+ self.SetValueAsNumber(value, can_gc)
}
// https://html.spec.whatwg.org/multipage/#concept-input-list
@@ -1242,7 +1244,7 @@ impl HTMLInputElementMethods for HTMLInputElement {
}
// https://html.spec.whatwg.org/multipage/#dom-input-value
- fn SetValue(&self, mut value: DOMString) -> ErrorResult {
+ fn SetValue(&self, mut value: DOMString, can_gc: CanGc) -> ErrorResult {
match self.value_mode() {
ValueMode::Value => {
// Step 3.
@@ -1264,7 +1266,7 @@ impl HTMLInputElementMethods for HTMLInputElement {
},
ValueMode::Default | ValueMode::DefaultOn => {
self.upcast::<Element>()
- .set_string_attribute(&local_name!("value"), value);
+ .set_string_attribute(&local_name!("value"), value, can_gc);
},
ValueMode::Filename => {
if value.is_empty() {
@@ -1314,13 +1316,18 @@ impl HTMLInputElementMethods for HTMLInputElement {
// https://html.spec.whatwg.org/multipage/#dom-input-valueasdate
#[allow(unsafe_code, non_snake_case)]
- fn SetValueAsDate(&self, cx: SafeJSContext, value: *mut JSObject) -> ErrorResult {
+ fn SetValueAsDate(
+ &self,
+ cx: SafeJSContext,
+ value: *mut JSObject,
+ can_gc: CanGc,
+ ) -> ErrorResult {
rooted!(in(*cx) let value = value);
if !self.does_value_as_date_apply() {
return Err(Error::InvalidState);
}
if value.is_null() {
- return self.SetValue(DOMString::from(""));
+ return self.SetValue(DOMString::from(""), can_gc);
}
let mut msecs: f64 = 0.0;
// We need to go through unsafe code to interrogate jsapi about a Date.
@@ -1338,14 +1345,14 @@ impl HTMLInputElementMethods for HTMLInputElement {
return Err(Error::JSFailed);
}
if !msecs.is_finite() {
- return self.SetValue(DOMString::from(""));
+ return self.SetValue(DOMString::from(""), can_gc);
}
}
let Ok(date_time) = OffsetDateTime::from_unix_timestamp_nanos((msecs * 1e6) as i128) else {
- return self.SetValue(DOMString::from(""));
+ return self.SetValue(DOMString::from(""), can_gc);
};
- self.SetValue(self.convert_datetime_to_dom_string(date_time))
+ self.SetValue(self.convert_datetime_to_dom_string(date_time), can_gc)
}
// https://html.spec.whatwg.org/multipage/#dom-input-valueasnumber
@@ -1355,21 +1362,21 @@ impl HTMLInputElementMethods for HTMLInputElement {
}
// https://html.spec.whatwg.org/multipage/#dom-input-valueasnumber
- fn SetValueAsNumber(&self, value: f64) -> ErrorResult {
+ fn SetValueAsNumber(&self, value: f64, can_gc: CanGc) -> ErrorResult {
if value.is_infinite() {
Err(Error::Type("value is not finite".to_string()))
} else if !self.does_value_as_number_apply() {
Err(Error::InvalidState)
} else if value.is_nan() {
- self.SetValue(DOMString::from(""))
+ self.SetValue(DOMString::from(""), can_gc)
} else if let Some(converted) = self.convert_number_to_string(value) {
- self.SetValue(converted)
+ self.SetValue(converted, can_gc)
} else {
// The most literal spec-compliant implementation would use bignum types so
// overflow is impossible, but just setting an overflow to the empty string
// matches Firefox's behavior. For example, try input.valueAsNumber=1e30 on
// a type="date" input.
- self.SetValue(DOMString::from(""))
+ self.SetValue(DOMString::from(""), can_gc)
}
}
@@ -1566,13 +1573,13 @@ impl HTMLInputElementMethods for HTMLInputElement {
}
// https://html.spec.whatwg.org/multipage/#dom-input-stepup
- fn StepUp(&self, n: i32) -> ErrorResult {
- self.step_up_or_down(n, StepDirection::Up)
+ fn StepUp(&self, n: i32, can_gc: CanGc) -> ErrorResult {
+ self.step_up_or_down(n, StepDirection::Up, can_gc)
}
// https://html.spec.whatwg.org/multipage/#dom-input-stepdown
- fn StepDown(&self, n: i32) -> ErrorResult {
- self.step_up_or_down(n, StepDirection::Down)
+ fn StepDown(&self, n: i32, can_gc: CanGc) -> ErrorResult {
+ self.step_up_or_down(n, StepDirection::Down, can_gc)
}
// https://html.spec.whatwg.org/multipage/#dom-cva-willvalidate
@@ -2314,7 +2321,7 @@ impl VirtualMethods for HTMLInputElement {
// Step 1
(&ValueMode::Value, false, ValueMode::Default) |
(&ValueMode::Value, false, ValueMode::DefaultOn) => {
- self.SetValue(old_idl_value)
+ self.SetValue(old_idl_value, CanGc::note())
.expect("Failed to set input value on type change to a default ValueMode.");
},
@@ -2326,6 +2333,7 @@ impl VirtualMethods for HTMLInputElement {
.map_or(DOMString::from(""), |a| {
DOMString::from(a.summarize().value)
}),
+ CanGc::note(),
)
.expect(
"Failed to set input value on type change to ValueMode::Value.",
@@ -2337,7 +2345,7 @@ impl VirtualMethods for HTMLInputElement {
(_, _, ValueMode::Filename)
if old_value_mode != ValueMode::Filename =>
{
- self.SetValue(DOMString::from(""))
+ self.SetValue(DOMString::from(""), CanGc::note())
.expect("Failed to set input value on type change to ValueMode::Filename.");
},
_ => {},
@@ -2825,7 +2833,7 @@ impl Activatable for HTMLInputElement {
// FIXME (Manishearth): support document owners (needs ability to get parent browsing context)
// Check if document owner is fully active
if let Some(o) = self.form_owner() {
- o.reset(ResetFrom::NotFromForm)
+ o.reset(ResetFrom::NotFromForm, CanGc::note())
}
},
InputType::Checkbox | InputType::Radio => {
diff --git a/components/script/dom/htmllabelelement.rs b/components/script/dom/htmllabelelement.rs
index 854465fe38b..9fc8b3eb2f2 100644
--- a/components/script/dom/htmllabelelement.rs
+++ b/components/script/dom/htmllabelelement.rs
@@ -49,6 +49,7 @@ impl HTMLLabelElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLLabelElement> {
Node::reflect_node_with_proto(
Box::new(HTMLLabelElement::new_inherited(
@@ -56,6 +57,7 @@ impl HTMLLabelElement {
)),
document,
proto,
+ can_gc,
)
}
}
diff --git a/components/script/dom/htmllegendelement.rs b/components/script/dom/htmllegendelement.rs
index 61e8df45fe8..8d5029b69fa 100644
--- a/components/script/dom/htmllegendelement.rs
+++ b/components/script/dom/htmllegendelement.rs
@@ -17,6 +17,7 @@ use crate::dom::htmlfieldsetelement::HTMLFieldSetElement;
use crate::dom::htmlformelement::{FormControl, HTMLFormElement};
use crate::dom::node::{BindContext, Node, UnbindContext};
use crate::dom::virtualmethods::VirtualMethods;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLLegendElement {
@@ -42,6 +43,7 @@ impl HTMLLegendElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLLegendElement> {
Node::reflect_node_with_proto(
Box::new(HTMLLegendElement::new_inherited(
@@ -49,6 +51,7 @@ impl HTMLLegendElement {
)),
document,
proto,
+ can_gc,
)
}
}
diff --git a/components/script/dom/htmllielement.rs b/components/script/dom/htmllielement.rs
index c3a7a8e1eee..b86db3afef1 100644
--- a/components/script/dom/htmllielement.rs
+++ b/components/script/dom/htmllielement.rs
@@ -15,6 +15,7 @@ use crate::dom::document::Document;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::Node;
use crate::dom::virtualmethods::VirtualMethods;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLLIElement {
@@ -38,11 +39,13 @@ impl HTMLLIElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLLIElement> {
Node::reflect_node_with_proto(
Box::new(HTMLLIElement::new_inherited(local_name, prefix, document)),
document,
proto,
+ can_gc,
)
}
}
diff --git a/components/script/dom/htmllinkelement.rs b/components/script/dom/htmllinkelement.rs
index 30b8b7665f9..95f0765cb41 100644
--- a/components/script/dom/htmllinkelement.rs
+++ b/components/script/dom/htmllinkelement.rs
@@ -56,6 +56,7 @@ use crate::dom::virtualmethods::VirtualMethods;
use crate::fetch::create_a_potential_cors_request;
use crate::links::LinkRelations;
use crate::network_listener::{submit_timing, PreInvoke, ResourceTimingListener};
+use crate::script_runtime::CanGc;
use crate::stylesheet_loader::{StylesheetContextSource, StylesheetLoader, StylesheetOwner};
#[derive(Clone, Copy, JSTraceable, MallocSizeOf, PartialEq)]
@@ -137,6 +138,7 @@ impl HTMLLinkElement {
document: &Document,
proto: Option<HandleObject>,
creator: ElementCreator,
+ can_gc: CanGc,
) -> DomRoot<HTMLLinkElement> {
Node::reflect_node_with_proto(
Box::new(HTMLLinkElement::new_inherited(
@@ -144,6 +146,7 @@ impl HTMLLinkElement {
)),
document,
proto,
+ can_gc,
)
}
@@ -522,9 +525,9 @@ impl HTMLLinkElementMethods for HTMLLinkElement {
make_getter!(Rel, "rel");
// https://html.spec.whatwg.org/multipage/#dom-link-rel
- fn SetRel(&self, rel: DOMString) {
+ fn SetRel(&self, rel: DOMString, can_gc: CanGc) {
self.upcast::<Element>()
- .set_tokenlist_attribute(&local_name!("rel"), rel);
+ .set_tokenlist_attribute(&local_name!("rel"), rel, can_gc);
}
// https://html.spec.whatwg.org/multipage/#dom-link-media
@@ -602,8 +605,8 @@ impl HTMLLinkElementMethods for HTMLLinkElement {
}
// https://html.spec.whatwg.org/multipage/#dom-link-crossorigin
- fn SetCrossOrigin(&self, value: Option<DOMString>) {
- set_cross_origin_attribute(self.upcast::<Element>(), value);
+ fn SetCrossOrigin(&self, value: Option<DOMString>, can_gc: CanGc) {
+ set_cross_origin_attribute(self.upcast::<Element>(), value, can_gc);
}
// https://html.spec.whatwg.org/multipage/#dom-link-referrerpolicy
diff --git a/components/script/dom/htmlmapelement.rs b/components/script/dom/htmlmapelement.rs
index adf7c7b1b24..10fe90ce61e 100644
--- a/components/script/dom/htmlmapelement.rs
+++ b/components/script/dom/htmlmapelement.rs
@@ -12,6 +12,7 @@ use crate::dom::document::Document;
use crate::dom::htmlareaelement::HTMLAreaElement;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::{Node, ShadowIncluding};
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLMapElement {
@@ -35,11 +36,13 @@ impl HTMLMapElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLMapElement> {
Node::reflect_node_with_proto(
Box::new(HTMLMapElement::new_inherited(local_name, prefix, document)),
document,
proto,
+ can_gc,
)
}
diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs
index 2e61809bb8d..f199e2f0e7f 100644
--- a/components/script/dom/htmlmediaelement.rs
+++ b/components/script/dom/htmlmediaelement.rs
@@ -1767,7 +1767,7 @@ impl HTMLMediaElement {
// We wait until we have metadata to render the controls, so we render them
// with the appropriate size.
if self.Controls() {
- self.render_controls();
+ self.render_controls(can_gc);
}
let global = self.global();
@@ -1887,7 +1887,7 @@ impl HTMLMediaElement {
.unwrap_or_else(|_| self.playback_position.get())
}
- fn render_controls(&self) {
+ fn render_controls(&self, can_gc: CanGc) {
let element = self.htmlelement.upcast::<Element>();
if self.ready_state.get() < ReadyState::HaveMetadata || element.is_shadow_host() {
// Bail out if we have no metadata yet or
@@ -1902,6 +1902,7 @@ impl HTMLMediaElement {
&document,
None,
ElementCreator::ScriptCreated,
+ can_gc,
);
let mut media_controls_script = resources::read_string(EmbedderResource::MediaControlsJS);
// This is our hacky way to temporarily workaround the lack of a privileged
@@ -1914,7 +1915,7 @@ impl HTMLMediaElement {
*self.media_controls_id.borrow_mut() = Some(id);
script
.upcast::<Node>()
- .SetTextContent(Some(DOMString::from(media_controls_script)));
+ .SetTextContent(Some(DOMString::from(media_controls_script)), can_gc);
if let Err(e) = shadow_root
.upcast::<Node>()
.AppendChild(script.upcast::<Node>())
@@ -1930,10 +1931,11 @@ impl HTMLMediaElement {
&document,
None,
ElementCreator::ScriptCreated,
+ can_gc,
);
style
.upcast::<Node>()
- .SetTextContent(Some(DOMString::from(media_controls_style)));
+ .SetTextContent(Some(DOMString::from(media_controls_style)), can_gc);
if let Err(e) = shadow_root
.upcast::<Node>()
@@ -2078,8 +2080,8 @@ impl HTMLMediaElementMethods for HTMLMediaElement {
reflect_cross_origin_attribute(self.upcast::<Element>())
}
// https://html.spec.whatwg.org/multipage/#dom-media-crossOrigin
- fn SetCrossOrigin(&self, value: Option<DOMString>) {
- set_cross_origin_attribute(self.upcast::<Element>(), value);
+ fn SetCrossOrigin(&self, value: Option<DOMString>, can_gc: CanGc) {
+ set_cross_origin_attribute(self.upcast::<Element>(), value, can_gc);
}
// https://html.spec.whatwg.org/multipage/#dom-media-muted
@@ -2473,7 +2475,7 @@ impl VirtualMethods for HTMLMediaElement {
},
local_name!("controls") => {
if mutation.new_value(attr).is_some() {
- self.render_controls();
+ self.render_controls(CanGc::note());
} else {
self.remove_controls();
}
diff --git a/components/script/dom/htmlmenuelement.rs b/components/script/dom/htmlmenuelement.rs
index 3d799f454f7..23395728b32 100644
--- a/components/script/dom/htmlmenuelement.rs
+++ b/components/script/dom/htmlmenuelement.rs
@@ -11,6 +11,7 @@ use crate::dom::bindings::root::DomRoot;
use crate::dom::document::Document;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::Node;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLMenuElement {
@@ -34,11 +35,13 @@ impl HTMLMenuElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLMenuElement> {
Node::reflect_node_with_proto(
Box::new(HTMLMenuElement::new_inherited(local_name, prefix, document)),
document,
proto,
+ can_gc,
)
}
}
diff --git a/components/script/dom/htmlmetaelement.rs b/components/script/dom/htmlmetaelement.rs
index 62bc9bcf48c..3f4e6d2b53b 100644
--- a/components/script/dom/htmlmetaelement.rs
+++ b/components/script/dom/htmlmetaelement.rs
@@ -73,11 +73,13 @@ impl HTMLMetaElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLMetaElement> {
Node::reflect_node_with_proto(
Box::new(HTMLMetaElement::new_inherited(local_name, prefix, document)),
document,
proto,
+ can_gc,
)
}
diff --git a/components/script/dom/htmlmeterelement.rs b/components/script/dom/htmlmeterelement.rs
index 034f01283ea..d316103308c 100644
--- a/components/script/dom/htmlmeterelement.rs
+++ b/components/script/dom/htmlmeterelement.rs
@@ -18,6 +18,7 @@ use crate::dom::element::Element;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::Node;
use crate::dom::nodelist::NodeList;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLMeterElement {
@@ -44,6 +45,7 @@ impl HTMLMeterElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLMeterElement> {
Node::reflect_node_with_proto(
Box::new(HTMLMeterElement::new_inherited(
@@ -51,6 +53,7 @@ impl HTMLMeterElement {
)),
document,
proto,
+ can_gc,
)
}
}
@@ -75,13 +78,13 @@ impl HTMLMeterElementMethods for HTMLMeterElement {
}
/// <https://html.spec.whatwg.org/multipage/#dom-meter-value>
- fn SetValue(&self, value: Finite<f64>) {
+ fn SetValue(&self, value: Finite<f64>, can_gc: CanGc) {
let mut string_value = DOMString::from_string((*value).to_string());
string_value.set_best_representation_of_the_floating_point_number();
self.upcast::<Element>()
- .set_string_attribute(&local_name!("value"), string_value);
+ .set_string_attribute(&local_name!("value"), string_value, can_gc);
}
/// <https://html.spec.whatwg.org/multipage/#concept-meter-minimum>
@@ -95,13 +98,13 @@ impl HTMLMeterElementMethods for HTMLMeterElement {
}
/// <https://html.spec.whatwg.org/multipage/#dom-meter-min>
- fn SetMin(&self, value: Finite<f64>) {
+ fn SetMin(&self, value: Finite<f64>, can_gc: CanGc) {
let mut string_value = DOMString::from_string((*value).to_string());
string_value.set_best_representation_of_the_floating_point_number();
self.upcast::<Element>()
- .set_string_attribute(&local_name!("min"), string_value);
+ .set_string_attribute(&local_name!("min"), string_value, can_gc);
}
/// <https://html.spec.whatwg.org/multipage/#concept-meter-maximum>
@@ -116,13 +119,13 @@ impl HTMLMeterElementMethods for HTMLMeterElement {
}
/// <https://html.spec.whatwg.org/multipage/#concept-meter-maximum>
- fn SetMax(&self, value: Finite<f64>) {
+ fn SetMax(&self, value: Finite<f64>, can_gc: CanGc) {
let mut string_value = DOMString::from_string((*value).to_string());
string_value.set_best_representation_of_the_floating_point_number();
self.upcast::<Element>()
- .set_string_attribute(&local_name!("max"), string_value);
+ .set_string_attribute(&local_name!("max"), string_value, can_gc);
}
/// <https://html.spec.whatwg.org/multipage/#concept-meter-low>
@@ -141,13 +144,13 @@ impl HTMLMeterElementMethods for HTMLMeterElement {
}
/// <https://html.spec.whatwg.org/multipage/#dom-meter-low>
- fn SetLow(&self, value: Finite<f64>) {
+ fn SetLow(&self, value: Finite<f64>, can_gc: CanGc) {
let mut string_value = DOMString::from_string((*value).to_string());
string_value.set_best_representation_of_the_floating_point_number();
self.upcast::<Element>()
- .set_string_attribute(&local_name!("low"), string_value);
+ .set_string_attribute(&local_name!("low"), string_value, can_gc);
}
/// <https://html.spec.whatwg.org/multipage/#concept-meter-high>
@@ -170,13 +173,13 @@ impl HTMLMeterElementMethods for HTMLMeterElement {
}
/// <https://html.spec.whatwg.org/multipage/#dom-meter-high>
- fn SetHigh(&self, value: Finite<f64>) {
+ fn SetHigh(&self, value: Finite<f64>, can_gc: CanGc) {
let mut string_value = DOMString::from_string((*value).to_string());
string_value.set_best_representation_of_the_floating_point_number();
self.upcast::<Element>()
- .set_string_attribute(&local_name!("high"), string_value);
+ .set_string_attribute(&local_name!("high"), string_value, can_gc);
}
/// <https://html.spec.whatwg.org/multipage/#concept-meter-optimum>
@@ -195,12 +198,15 @@ impl HTMLMeterElementMethods for HTMLMeterElement {
}
/// <https://html.spec.whatwg.org/multipage/#dom-meter-optimum>
- fn SetOptimum(&self, value: Finite<f64>) {
+ fn SetOptimum(&self, value: Finite<f64>, can_gc: CanGc) {
let mut string_value = DOMString::from_string((*value).to_string());
string_value.set_best_representation_of_the_floating_point_number();
- self.upcast::<Element>()
- .set_string_attribute(&local_name!("optimum"), string_value);
+ self.upcast::<Element>().set_string_attribute(
+ &local_name!("optimum"),
+ string_value,
+ can_gc,
+ );
}
}
diff --git a/components/script/dom/htmlmodelement.rs b/components/script/dom/htmlmodelement.rs
index 7a3356434b8..b0b7b86b0a3 100644
--- a/components/script/dom/htmlmodelement.rs
+++ b/components/script/dom/htmlmodelement.rs
@@ -10,6 +10,7 @@ use crate::dom::bindings::root::DomRoot;
use crate::dom::document::Document;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::Node;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLModElement {
@@ -33,11 +34,13 @@ impl HTMLModElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLModElement> {
Node::reflect_node_with_proto(
Box::new(HTMLModElement::new_inherited(local_name, prefix, document)),
document,
proto,
+ can_gc,
)
}
}
diff --git a/components/script/dom/htmlobjectelement.rs b/components/script/dom/htmlobjectelement.rs
index 0c7d2839012..e0cea43155b 100644
--- a/components/script/dom/htmlobjectelement.rs
+++ b/components/script/dom/htmlobjectelement.rs
@@ -56,6 +56,7 @@ impl HTMLObjectElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLObjectElement> {
Node::reflect_node_with_proto(
Box::new(HTMLObjectElement::new_inherited(
@@ -63,6 +64,7 @@ impl HTMLObjectElement {
)),
document,
proto,
+ can_gc,
)
}
}
diff --git a/components/script/dom/htmlolistelement.rs b/components/script/dom/htmlolistelement.rs
index 1c4c928f8b3..7b42893fbbe 100644
--- a/components/script/dom/htmlolistelement.rs
+++ b/components/script/dom/htmlolistelement.rs
@@ -10,6 +10,7 @@ use crate::dom::bindings::root::DomRoot;
use crate::dom::document::Document;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::Node;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLOListElement {
@@ -33,6 +34,7 @@ impl HTMLOListElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLOListElement> {
Node::reflect_node_with_proto(
Box::new(HTMLOListElement::new_inherited(
@@ -40,6 +42,7 @@ impl HTMLOListElement {
)),
document,
proto,
+ can_gc,
)
}
}
diff --git a/components/script/dom/htmloptgroupelement.rs b/components/script/dom/htmloptgroupelement.rs
index 2141a5b9cc3..d0dbd725f4c 100644
--- a/components/script/dom/htmloptgroupelement.rs
+++ b/components/script/dom/htmloptgroupelement.rs
@@ -20,6 +20,7 @@ use crate::dom::node::{BindContext, Node, ShadowIncluding, UnbindContext};
use crate::dom::validation::Validatable;
use crate::dom::validitystate::ValidationFlags;
use crate::dom::virtualmethods::VirtualMethods;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLOptGroupElement {
@@ -48,6 +49,7 @@ impl HTMLOptGroupElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLOptGroupElement> {
Node::reflect_node_with_proto(
Box::new(HTMLOptGroupElement::new_inherited(
@@ -55,6 +57,7 @@ impl HTMLOptGroupElement {
)),
document,
proto,
+ can_gc,
)
}
diff --git a/components/script/dom/htmloptionelement.rs b/components/script/dom/htmloptionelement.rs
index 6b475017bed..649d35a50d8 100644
--- a/components/script/dom/htmloptionelement.rs
+++ b/components/script/dom/htmloptionelement.rs
@@ -72,6 +72,7 @@ impl HTMLOptionElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLOptionElement> {
Node::reflect_node_with_proto(
Box::new(HTMLOptionElement::new_inherited(
@@ -79,6 +80,7 @@ impl HTMLOptionElement {
)),
document,
proto,
+ can_gc,
)
}
@@ -196,7 +198,7 @@ impl HTMLOptionElementMethods for HTMLOptionElement {
let option = DomRoot::downcast::<HTMLOptionElement>(element).unwrap();
if !text.is_empty() {
- option.upcast::<Node>().SetTextContent(Some(text))
+ option.upcast::<Node>().SetTextContent(Some(text), can_gc)
}
if let Some(val) = value {
@@ -223,8 +225,8 @@ impl HTMLOptionElementMethods for HTMLOptionElement {
}
// https://html.spec.whatwg.org/multipage/#dom-option-text
- fn SetText(&self, value: DOMString) {
- self.upcast::<Node>().SetTextContent(Some(value))
+ fn SetText(&self, value: DOMString, can_gc: CanGc) {
+ self.upcast::<Node>().SetTextContent(Some(value), can_gc)
}
// https://html.spec.whatwg.org/multipage/#dom-option-form
diff --git a/components/script/dom/htmloptionscollection.rs b/components/script/dom/htmloptionscollection.rs
index 58155ab3183..eca2d217a3f 100644
--- a/components/script/dom/htmloptionscollection.rs
+++ b/components/script/dom/htmloptionscollection.rs
@@ -26,6 +26,7 @@ use crate::dom::htmloptionelement::HTMLOptionElement;
use crate::dom::htmlselectelement::HTMLSelectElement;
use crate::dom::node::{document_from_node, Node};
use crate::dom::window::Window;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLOptionsCollection {
@@ -53,12 +54,13 @@ impl HTMLOptionsCollection {
)
}
- fn add_new_elements(&self, count: u32) -> ErrorResult {
+ fn add_new_elements(&self, count: u32, can_gc: CanGc) -> ErrorResult {
let root = self.upcast().root_node();
let document = document_from_node(&*root);
for _ in 0..count {
- let element = HTMLOptionElement::new(local_name!("option"), None, &document, None);
+ let element =
+ HTMLOptionElement::new(local_name!("option"), None, &document, None, can_gc);
let node = element.upcast::<Node>();
root.AppendChild(node)?;
}
@@ -91,7 +93,12 @@ impl HTMLOptionsCollectionMethods for HTMLOptionsCollection {
}
// https://html.spec.whatwg.org/multipage/#dom-htmloptionscollection-setter
- fn IndexedSetter(&self, index: u32, value: Option<&HTMLOptionElement>) -> ErrorResult {
+ fn IndexedSetter(
+ &self,
+ index: u32,
+ value: Option<&HTMLOptionElement>,
+ can_gc: CanGc,
+ ) -> ErrorResult {
if let Some(value) = value {
// Step 2
let length = self.upcast().Length();
@@ -101,7 +108,7 @@ impl HTMLOptionsCollectionMethods for HTMLOptionsCollection {
// Step 4
if n > 0 {
- self.add_new_elements(n as u32)?;
+ self.add_new_elements(n as u32, can_gc)?;
}
// Step 5
@@ -128,7 +135,7 @@ impl HTMLOptionsCollectionMethods for HTMLOptionsCollection {
}
/// <https://html.spec.whatwg.org/multipage/#dom-htmloptionscollection-length>
- fn SetLength(&self, length: u32) {
+ fn SetLength(&self, length: u32, can_gc: CanGc) {
let current_length = self.upcast().Length();
let delta = length as i32 - current_length as i32;
match delta.cmp(&0) {
@@ -140,7 +147,7 @@ impl HTMLOptionsCollectionMethods for HTMLOptionsCollection {
},
Ordering::Greater => {
// new length is higher - adding new option elements
- self.add_new_elements(delta as u32).unwrap();
+ self.add_new_elements(delta as u32, can_gc).unwrap();
},
_ => {},
}
diff --git a/components/script/dom/htmloutputelement.rs b/components/script/dom/htmloutputelement.rs
index b2a4f65a4d3..a83f28277a1 100644
--- a/components/script/dom/htmloutputelement.rs
+++ b/components/script/dom/htmloutputelement.rs
@@ -53,6 +53,7 @@ impl HTMLOutputElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLOutputElement> {
Node::reflect_node_with_proto(
Box::new(HTMLOutputElement::new_inherited(
@@ -60,11 +61,12 @@ impl HTMLOutputElement {
)),
document,
proto,
+ can_gc,
)
}
- pub fn reset(&self) {
- Node::string_replace_all(self.DefaultValue(), self.upcast::<Node>());
+ pub fn reset(&self, can_gc: CanGc) {
+ Node::string_replace_all(self.DefaultValue(), self.upcast::<Node>(), can_gc);
*self.default_value_override.borrow_mut() = None;
}
}
@@ -89,10 +91,10 @@ impl HTMLOutputElementMethods for HTMLOutputElement {
}
// https://html.spec.whatwg.org/multipage/#dom-output-defaultvalue
- fn SetDefaultValue(&self, value: DOMString) {
+ fn SetDefaultValue(&self, value: DOMString, can_gc: CanGc) {
if self.default_value_override.borrow().is_none() {
// Step 1 ("and return")
- Node::string_replace_all(value.clone(), self.upcast::<Node>());
+ Node::string_replace_all(value.clone(), self.upcast::<Node>(), can_gc);
} else {
// Step 2, if not returned from step 1
*self.default_value_override.borrow_mut() = Some(value);
@@ -105,9 +107,9 @@ impl HTMLOutputElementMethods for HTMLOutputElement {
}
// https://html.spec.whatwg.org/multipage/#dom-output-value
- fn SetValue(&self, value: DOMString) {
+ fn SetValue(&self, value: DOMString, can_gc: CanGc) {
*self.default_value_override.borrow_mut() = Some(self.DefaultValue());
- Node::string_replace_all(value, self.upcast::<Node>());
+ Node::string_replace_all(value, self.upcast::<Node>(), can_gc);
}
// https://html.spec.whatwg.org/multipage/#dom-output-type
diff --git a/components/script/dom/htmlparagraphelement.rs b/components/script/dom/htmlparagraphelement.rs
index 9ac3367738a..85adea6ae48 100644
--- a/components/script/dom/htmlparagraphelement.rs
+++ b/components/script/dom/htmlparagraphelement.rs
@@ -10,6 +10,7 @@ use crate::dom::bindings::root::DomRoot;
use crate::dom::document::Document;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::Node;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLParagraphElement {
@@ -33,6 +34,7 @@ impl HTMLParagraphElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLParagraphElement> {
Node::reflect_node_with_proto(
Box::new(HTMLParagraphElement::new_inherited(
@@ -40,6 +42,7 @@ impl HTMLParagraphElement {
)),
document,
proto,
+ can_gc,
)
}
}
diff --git a/components/script/dom/htmlparamelement.rs b/components/script/dom/htmlparamelement.rs
index c4490854f27..81c081d3ff2 100644
--- a/components/script/dom/htmlparamelement.rs
+++ b/components/script/dom/htmlparamelement.rs
@@ -10,6 +10,7 @@ use crate::dom::bindings::root::DomRoot;
use crate::dom::document::Document;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::Node;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLParamElement {
@@ -33,6 +34,7 @@ impl HTMLParamElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLParamElement> {
Node::reflect_node_with_proto(
Box::new(HTMLParamElement::new_inherited(
@@ -40,6 +42,7 @@ impl HTMLParamElement {
)),
document,
proto,
+ can_gc,
)
}
}
diff --git a/components/script/dom/htmlpictureelement.rs b/components/script/dom/htmlpictureelement.rs
index 79313701b43..cc19b08518b 100644
--- a/components/script/dom/htmlpictureelement.rs
+++ b/components/script/dom/htmlpictureelement.rs
@@ -10,6 +10,7 @@ use crate::dom::bindings::root::DomRoot;
use crate::dom::document::Document;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::Node;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLPictureElement {
@@ -33,6 +34,7 @@ impl HTMLPictureElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLPictureElement> {
Node::reflect_node_with_proto(
Box::new(HTMLPictureElement::new_inherited(
@@ -40,6 +42,7 @@ impl HTMLPictureElement {
)),
document,
proto,
+ can_gc,
)
}
}
diff --git a/components/script/dom/htmlpreelement.rs b/components/script/dom/htmlpreelement.rs
index 0ee02b714bf..54651c9633e 100644
--- a/components/script/dom/htmlpreelement.rs
+++ b/components/script/dom/htmlpreelement.rs
@@ -15,6 +15,7 @@ use crate::dom::document::Document;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::Node;
use crate::dom::virtualmethods::VirtualMethods;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLPreElement {
@@ -38,11 +39,13 @@ impl HTMLPreElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLPreElement> {
Node::reflect_node_with_proto(
Box::new(HTMLPreElement::new_inherited(local_name, prefix, document)),
document,
proto,
+ can_gc,
)
}
}
diff --git a/components/script/dom/htmlprogresselement.rs b/components/script/dom/htmlprogresselement.rs
index a4c39f3e9ec..8c04391b9df 100644
--- a/components/script/dom/htmlprogresselement.rs
+++ b/components/script/dom/htmlprogresselement.rs
@@ -16,6 +16,7 @@ use crate::dom::element::Element;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::Node;
use crate::dom::nodelist::NodeList;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLProgressElement {
@@ -41,6 +42,7 @@ impl HTMLProgressElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLProgressElement> {
Node::reflect_node_with_proto(
Box::new(HTMLProgressElement::new_inherited(
@@ -48,6 +50,7 @@ impl HTMLProgressElement {
)),
document,
proto,
+ can_gc,
)
}
}
@@ -77,14 +80,17 @@ impl HTMLProgressElementMethods for HTMLProgressElement {
}
/// <https://html.spec.whatwg.org/multipage/#dom-progress-value>
- fn SetValue(&self, new_val: Finite<f64>) {
+ fn SetValue(&self, new_val: Finite<f64>, can_gc: CanGc) {
if *new_val >= 0.0 {
let mut string_value = DOMString::from_string((*new_val).to_string());
string_value.set_best_representation_of_the_floating_point_number();
- self.upcast::<Element>()
- .set_string_attribute(&local_name!("value"), string_value);
+ self.upcast::<Element>().set_string_attribute(
+ &local_name!("value"),
+ string_value,
+ can_gc,
+ );
}
}
@@ -106,14 +112,17 @@ impl HTMLProgressElementMethods for HTMLProgressElement {
}
/// <https://html.spec.whatwg.org/multipage/#dom-progress-max>
- fn SetMax(&self, new_val: Finite<f64>) {
+ fn SetMax(&self, new_val: Finite<f64>, can_gc: CanGc) {
if *new_val > 0.0 {
let mut string_value = DOMString::from_string((*new_val).to_string());
string_value.set_best_representation_of_the_floating_point_number();
- self.upcast::<Element>()
- .set_string_attribute(&local_name!("max"), string_value);
+ self.upcast::<Element>().set_string_attribute(
+ &local_name!("max"),
+ string_value,
+ can_gc,
+ );
}
}
diff --git a/components/script/dom/htmlquoteelement.rs b/components/script/dom/htmlquoteelement.rs
index e8fc6f30407..1caf6a1b46d 100644
--- a/components/script/dom/htmlquoteelement.rs
+++ b/components/script/dom/htmlquoteelement.rs
@@ -12,6 +12,7 @@ use crate::dom::bindings::str::USVString;
use crate::dom::document::Document;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::Node;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLQuoteElement {
@@ -35,6 +36,7 @@ impl HTMLQuoteElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLQuoteElement> {
Node::reflect_node_with_proto(
Box::new(HTMLQuoteElement::new_inherited(
@@ -42,6 +44,7 @@ impl HTMLQuoteElement {
)),
document,
proto,
+ can_gc,
)
}
}
diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs
index 8631f4493eb..364e975e1c9 100644
--- a/components/script/dom/htmlscriptelement.rs
+++ b/components/script/dom/htmlscriptelement.rs
@@ -193,6 +193,7 @@ impl HTMLScriptElement {
document: &Document,
proto: Option<HandleObject>,
creator: ElementCreator,
+ can_gc: CanGc,
) -> DomRoot<HTMLScriptElement> {
Node::reflect_node_with_proto(
Box::new(HTMLScriptElement::new_inherited(
@@ -200,6 +201,7 @@ impl HTMLScriptElement {
)),
document,
proto,
+ can_gc,
)
}
@@ -1311,10 +1313,10 @@ impl HTMLScriptElementMethods for HTMLScriptElement {
}
// https://html.spec.whatwg.org/multipage/#dom-script-async
- fn SetAsync(&self, value: bool) {
+ fn SetAsync(&self, value: bool, can_gc: CanGc) {
self.non_blocking.set(false);
self.upcast::<Element>()
- .set_bool_attribute(&local_name!("async"), value);
+ .set_bool_attribute(&local_name!("async"), value, can_gc);
}
// https://html.spec.whatwg.org/multipage/#dom-script-defer
@@ -1348,8 +1350,8 @@ impl HTMLScriptElementMethods for HTMLScriptElement {
}
// https://html.spec.whatwg.org/multipage/#dom-script-crossorigin
- fn SetCrossOrigin(&self, value: Option<DOMString>) {
- set_cross_origin_attribute(self.upcast::<Element>(), value);
+ fn SetCrossOrigin(&self, value: Option<DOMString>, can_gc: CanGc) {
+ set_cross_origin_attribute(self.upcast::<Element>(), value, can_gc);
}
// https://html.spec.whatwg.org/multipage/#dom-script-referrerpolicy
@@ -1366,8 +1368,8 @@ impl HTMLScriptElementMethods for HTMLScriptElement {
}
// https://html.spec.whatwg.org/multipage/#dom-script-text
- fn SetText(&self, value: DOMString) {
- self.upcast::<Node>().SetTextContent(Some(value))
+ fn SetText(&self, value: DOMString, can_gc: CanGc) {
+ self.upcast::<Node>().SetTextContent(Some(value), can_gc)
}
}
diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs
index 6d9dd34acca..f8abd9188cc 100644
--- a/components/script/dom/htmlselectelement.rs
+++ b/components/script/dom/htmlselectelement.rs
@@ -98,6 +98,7 @@ impl HTMLSelectElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLSelectElement> {
let n = Node::reflect_node_with_proto(
Box::new(HTMLSelectElement::new_inherited(
@@ -105,6 +106,7 @@ impl HTMLSelectElement {
)),
document,
proto,
+ can_gc,
);
n.upcast::<Node>().set_weird_parser_insertion_mode();
@@ -288,8 +290,8 @@ impl HTMLSelectElementMethods for HTMLSelectElement {
}
// https://html.spec.whatwg.org/multipage/#dom-select-length
- fn SetLength(&self, length: u32) {
- self.Options().SetLength(length)
+ fn SetLength(&self, length: u32, can_gc: CanGc) {
+ self.Options().SetLength(length, can_gc)
}
// https://html.spec.whatwg.org/multipage/#dom-select-item
@@ -303,8 +305,13 @@ impl HTMLSelectElementMethods for HTMLSelectElement {
}
// https://html.spec.whatwg.org/multipage/#dom-select-setter
- fn IndexedSetter(&self, index: u32, value: Option<&HTMLOptionElement>) -> ErrorResult {
- self.Options().IndexedSetter(index, value)
+ fn IndexedSetter(
+ &self,
+ index: u32,
+ value: Option<&HTMLOptionElement>,
+ can_gc: CanGc,
+ ) -> ErrorResult {
+ self.Options().IndexedSetter(index, value, can_gc)
}
// https://html.spec.whatwg.org/multipage/#dom-select-nameditem
diff --git a/components/script/dom/htmlsourceelement.rs b/components/script/dom/htmlsourceelement.rs
index 135d4a45eda..80855156df4 100644
--- a/components/script/dom/htmlsourceelement.rs
+++ b/components/script/dom/htmlsourceelement.rs
@@ -43,6 +43,7 @@ impl HTMLSourceElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLSourceElement> {
Node::reflect_node_with_proto(
Box::new(HTMLSourceElement::new_inherited(
@@ -50,6 +51,7 @@ impl HTMLSourceElement {
)),
document,
proto,
+ can_gc,
)
}
diff --git a/components/script/dom/htmlspanelement.rs b/components/script/dom/htmlspanelement.rs
index 0f1617fc5bf..5f41592693b 100644
--- a/components/script/dom/htmlspanelement.rs
+++ b/components/script/dom/htmlspanelement.rs
@@ -10,6 +10,7 @@ use crate::dom::bindings::root::DomRoot;
use crate::dom::document::Document;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::Node;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLSpanElement {
@@ -33,11 +34,13 @@ impl HTMLSpanElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLSpanElement> {
Node::reflect_node_with_proto(
Box::new(HTMLSpanElement::new_inherited(local_name, prefix, document)),
document,
proto,
+ can_gc,
)
}
}
diff --git a/components/script/dom/htmlstyleelement.rs b/components/script/dom/htmlstyleelement.rs
index f33b354b685..9639d80546a 100644
--- a/components/script/dom/htmlstyleelement.rs
+++ b/components/script/dom/htmlstyleelement.rs
@@ -30,6 +30,7 @@ use crate::dom::node::{
};
use crate::dom::stylesheet::StyleSheet as DOMStyleSheet;
use crate::dom::virtualmethods::VirtualMethods;
+use crate::script_runtime::CanGc;
use crate::stylesheet_loader::{StylesheetLoader, StylesheetOwner};
#[dom_struct]
@@ -73,6 +74,7 @@ impl HTMLStyleElement {
document: &Document,
proto: Option<HandleObject>,
creator: ElementCreator,
+ can_gc: CanGc,
) -> DomRoot<HTMLStyleElement> {
Node::reflect_node_with_proto(
Box::new(HTMLStyleElement::new_inherited(
@@ -80,6 +82,7 @@ impl HTMLStyleElement {
)),
document,
proto,
+ can_gc,
)
}
diff --git a/components/script/dom/htmltablecaptionelement.rs b/components/script/dom/htmltablecaptionelement.rs
index 959adb4d365..aaedfbd2eb2 100644
--- a/components/script/dom/htmltablecaptionelement.rs
+++ b/components/script/dom/htmltablecaptionelement.rs
@@ -11,6 +11,7 @@ use crate::dom::bindings::root::DomRoot;
use crate::dom::document::Document;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::Node;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLTableCaptionElement {
@@ -34,6 +35,7 @@ impl HTMLTableCaptionElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLTableCaptionElement> {
let n = Node::reflect_node_with_proto(
Box::new(HTMLTableCaptionElement::new_inherited(
@@ -41,6 +43,7 @@ impl HTMLTableCaptionElement {
)),
document,
proto,
+ can_gc,
);
n.upcast::<Node>().set_weird_parser_insertion_mode();
diff --git a/components/script/dom/htmltablecellelement.rs b/components/script/dom/htmltablecellelement.rs
index ff10074c96b..50f4b20cb38 100644
--- a/components/script/dom/htmltablecellelement.rs
+++ b/components/script/dom/htmltablecellelement.rs
@@ -22,6 +22,7 @@ use crate::dom::htmltablerowelement::HTMLTableRowElement;
use crate::dom::htmltablesectionelement::HTMLTableSectionElement;
use crate::dom::node::{LayoutNodeHelpers, Node};
use crate::dom::virtualmethods::VirtualMethods;
+use crate::script_runtime::CanGc;
const DEFAULT_COLSPAN: u32 = 1;
const DEFAULT_ROWSPAN: u32 = 1;
@@ -48,6 +49,7 @@ impl HTMLTableCellElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLTableCellElement> {
let n = Node::reflect_node_with_proto(
Box::new(HTMLTableCellElement::new_inherited(
@@ -55,6 +57,7 @@ impl HTMLTableCellElement {
)),
document,
proto,
+ can_gc,
);
n.upcast::<Node>().set_weird_parser_insertion_mode();
diff --git a/components/script/dom/htmltablecolelement.rs b/components/script/dom/htmltablecolelement.rs
index fbf7b2e9e32..522b6eaf934 100644
--- a/components/script/dom/htmltablecolelement.rs
+++ b/components/script/dom/htmltablecolelement.rs
@@ -18,6 +18,7 @@ use crate::dom::element::LayoutElementHelpers;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::Node;
use crate::dom::virtualmethods::VirtualMethods;
+use crate::script_runtime::CanGc;
const DEFAULT_SPAN: u32 = 1;
@@ -43,6 +44,7 @@ impl HTMLTableColElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLTableColElement> {
let n = Node::reflect_node_with_proto(
Box::new(HTMLTableColElement::new_inherited(
@@ -50,6 +52,7 @@ impl HTMLTableColElement {
)),
document,
proto,
+ can_gc,
);
n.upcast::<Node>().set_weird_parser_insertion_mode();
diff --git a/components/script/dom/htmltableelement.rs b/components/script/dom/htmltableelement.rs
index c835413c987..1d17116a6d5 100644
--- a/components/script/dom/htmltableelement.rs
+++ b/components/script/dom/htmltableelement.rs
@@ -28,6 +28,7 @@ use crate::dom::htmltablerowelement::HTMLTableRowElement;
use crate::dom::htmltablesectionelement::HTMLTableSectionElement;
use crate::dom::node::{document_from_node, window_from_node, Node};
use crate::dom::virtualmethods::VirtualMethods;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLTableElement {
@@ -75,6 +76,7 @@ impl HTMLTableElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLTableElement> {
let n = Node::reflect_node_with_proto(
Box::new(HTMLTableElement::new_inherited(
@@ -82,6 +84,7 @@ impl HTMLTableElement {
)),
document,
proto,
+ can_gc,
);
n.upcast::<Node>().set_weird_parser_insertion_mode();
@@ -137,13 +140,22 @@ impl HTMLTableElement {
// https://html.spec.whatwg.org/multipage/#dom-table-createthead
// https://html.spec.whatwg.org/multipage/#dom-table-createtfoot
- fn create_section_of_type(&self, atom: &LocalName) -> DomRoot<HTMLTableSectionElement> {
+ fn create_section_of_type(
+ &self,
+ atom: &LocalName,
+ can_gc: CanGc,
+ ) -> DomRoot<HTMLTableSectionElement> {
if let Some(section) = self.get_first_section_of_type(atom) {
return section;
}
- let section =
- HTMLTableSectionElement::new(atom.clone(), None, &document_from_node(self), None);
+ let section = HTMLTableSectionElement::new(
+ atom.clone(),
+ None,
+ &document_from_node(self),
+ None,
+ can_gc,
+ );
match *atom {
local_name!("thead") => self.SetTHead(Some(&section)),
local_name!("tfoot") => self.SetTFoot(Some(&section)),
@@ -206,7 +218,7 @@ impl HTMLTableElementMethods for HTMLTableElement {
}
// https://html.spec.whatwg.org/multipage/#dom-table-createcaption
- fn CreateCaption(&self) -> DomRoot<HTMLTableCaptionElement> {
+ fn CreateCaption(&self, can_gc: CanGc) -> DomRoot<HTMLTableCaptionElement> {
match self.GetCaption() {
Some(caption) => caption,
None => {
@@ -215,6 +227,7 @@ impl HTMLTableElementMethods for HTMLTableElement {
None,
&document_from_node(self),
None,
+ can_gc,
);
self.SetCaption(Some(&caption))
.expect("Generated caption is invalid");
@@ -243,8 +256,8 @@ impl HTMLTableElementMethods for HTMLTableElement {
}
// https://html.spec.whatwg.org/multipage/#dom-table-createthead
- fn CreateTHead(&self) -> DomRoot<HTMLTableSectionElement> {
- self.create_section_of_type(&local_name!("thead"))
+ fn CreateTHead(&self, can_gc: CanGc) -> DomRoot<HTMLTableSectionElement> {
+ self.create_section_of_type(&local_name!("thead"), can_gc)
}
// https://html.spec.whatwg.org/multipage/#dom-table-deletethead
@@ -276,8 +289,8 @@ impl HTMLTableElementMethods for HTMLTableElement {
}
// https://html.spec.whatwg.org/multipage/#dom-table-createtfoot
- fn CreateTFoot(&self) -> DomRoot<HTMLTableSectionElement> {
- self.create_section_of_type(&local_name!("tfoot"))
+ fn CreateTFoot(&self, can_gc: CanGc) -> DomRoot<HTMLTableSectionElement> {
+ self.create_section_of_type(&local_name!("tfoot"), can_gc)
}
// https://html.spec.whatwg.org/multipage/#dom-table-deletetfoot
@@ -305,12 +318,13 @@ impl HTMLTableElementMethods for HTMLTableElement {
}
// https://html.spec.whatwg.org/multipage/#dom-table-createtbody
- fn CreateTBody(&self) -> DomRoot<HTMLTableSectionElement> {
+ fn CreateTBody(&self, can_gc: CanGc) -> DomRoot<HTMLTableSectionElement> {
let tbody = HTMLTableSectionElement::new(
local_name!("tbody"),
None,
&document_from_node(self),
None,
+ can_gc,
);
let node = self.upcast::<Node>();
let last_tbody = node
@@ -325,7 +339,7 @@ impl HTMLTableElementMethods for HTMLTableElement {
}
// https://html.spec.whatwg.org/multipage/#dom-table-insertrow
- fn InsertRow(&self, index: i32) -> Fallible<DomRoot<HTMLTableRowElement>> {
+ fn InsertRow(&self, index: i32, can_gc: CanGc) -> Fallible<DomRoot<HTMLTableRowElement>> {
let rows = self.Rows();
let number_of_row_elements = rows.Length();
@@ -333,8 +347,13 @@ impl HTMLTableElementMethods for HTMLTableElement {
return Err(Error::IndexSize);
}
- let new_row =
- HTMLTableRowElement::new(local_name!("tr"), None, &document_from_node(self), None);
+ let new_row = HTMLTableRowElement::new(
+ local_name!("tr"),
+ None,
+ &document_from_node(self),
+ None,
+ can_gc,
+ );
let node = self.upcast::<Node>();
if number_of_row_elements == 0 {
@@ -351,7 +370,7 @@ impl HTMLTableElementMethods for HTMLTableElement {
.AppendChild(new_row.upcast::<Node>())
.expect("InsertRow failed to append first row.");
} else {
- let tbody = self.CreateTBody();
+ let tbody = self.CreateTBody(can_gc);
node.AppendChild(tbody.upcast())
.expect("InsertRow failed to append new tbody.");
diff --git a/components/script/dom/htmltablerowelement.rs b/components/script/dom/htmltablerowelement.rs
index 0d0d6610ce5..101182cff57 100644
--- a/components/script/dom/htmltablerowelement.rs
+++ b/components/script/dom/htmltablerowelement.rs
@@ -25,6 +25,7 @@ use crate::dom::htmltableelement::HTMLTableElement;
use crate::dom::htmltablesectionelement::HTMLTableSectionElement;
use crate::dom::node::{window_from_node, Node};
use crate::dom::virtualmethods::VirtualMethods;
+use crate::script_runtime::CanGc;
#[derive(JSTraceable)]
struct CellsFilter;
@@ -59,6 +60,7 @@ impl HTMLTableRowElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLTableRowElement> {
let n = Node::reflect_node_with_proto(
Box::new(HTMLTableRowElement::new_inherited(
@@ -66,6 +68,7 @@ impl HTMLTableRowElement {
)),
document,
proto,
+ can_gc,
);
n.upcast::<Node>().set_weird_parser_insertion_mode();
@@ -99,12 +102,12 @@ impl HTMLTableRowElementMethods for HTMLTableRowElement {
}
// https://html.spec.whatwg.org/multipage/#dom-tr-insertcell
- fn InsertCell(&self, index: i32) -> Fallible<DomRoot<HTMLElement>> {
+ fn InsertCell(&self, index: i32, can_gc: CanGc) -> Fallible<DomRoot<HTMLElement>> {
let node = self.upcast::<Node>();
node.insert_cell_or_row(
index,
|| self.Cells(),
- || HTMLTableCellElement::new(local_name!("td"), None, &node.owner_doc(), None),
+ || HTMLTableCellElement::new(local_name!("td"), None, &node.owner_doc(), None, can_gc),
)
}
diff --git a/components/script/dom/htmltablesectionelement.rs b/components/script/dom/htmltablesectionelement.rs
index 136349aec4e..37669bfa8a6 100644
--- a/components/script/dom/htmltablesectionelement.rs
+++ b/components/script/dom/htmltablesectionelement.rs
@@ -21,6 +21,7 @@ use crate::dom::htmlelement::HTMLElement;
use crate::dom::htmltablerowelement::HTMLTableRowElement;
use crate::dom::node::{window_from_node, Node};
use crate::dom::virtualmethods::VirtualMethods;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLTableSectionElement {
@@ -44,6 +45,7 @@ impl HTMLTableSectionElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLTableSectionElement> {
let n = Node::reflect_node_with_proto(
Box::new(HTMLTableSectionElement::new_inherited(
@@ -51,6 +53,7 @@ impl HTMLTableSectionElement {
)),
document,
proto,
+ can_gc,
);
n.upcast::<Node>().set_weird_parser_insertion_mode();
@@ -74,12 +77,12 @@ impl HTMLTableSectionElementMethods for HTMLTableSectionElement {
}
// https://html.spec.whatwg.org/multipage/#dom-tbody-insertrow
- fn InsertRow(&self, index: i32) -> Fallible<DomRoot<HTMLElement>> {
+ fn InsertRow(&self, index: i32, can_gc: CanGc) -> Fallible<DomRoot<HTMLElement>> {
let node = self.upcast::<Node>();
node.insert_cell_or_row(
index,
|| self.Rows(),
- || HTMLTableRowElement::new(local_name!("tr"), None, &node.owner_doc(), None),
+ || HTMLTableRowElement::new(local_name!("tr"), None, &node.owner_doc(), None, can_gc),
)
}
diff --git a/components/script/dom/htmltemplateelement.rs b/components/script/dom/htmltemplateelement.rs
index 02b8358fd0b..4e3432070fd 100644
--- a/components/script/dom/htmltemplateelement.rs
+++ b/components/script/dom/htmltemplateelement.rs
@@ -44,6 +44,7 @@ impl HTMLTemplateElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLTemplateElement> {
let n = Node::reflect_node_with_proto(
Box::new(HTMLTemplateElement::new_inherited(
@@ -51,6 +52,7 @@ impl HTMLTemplateElement {
)),
document,
proto,
+ can_gc,
);
n.upcast::<Node>().set_weird_parser_insertion_mode();
@@ -64,7 +66,7 @@ impl HTMLTemplateElementMethods for HTMLTemplateElement {
self.contents.or_init(|| {
let doc = document_from_node(self);
doc.appropriate_template_contents_owner_document(can_gc)
- .CreateDocumentFragment()
+ .CreateDocumentFragment(can_gc)
})
}
}
diff --git a/components/script/dom/htmltextareaelement.rs b/components/script/dom/htmltextareaelement.rs
index 0b50e307dcb..5505c5ced08 100644
--- a/components/script/dom/htmltextareaelement.rs
+++ b/components/script/dom/htmltextareaelement.rs
@@ -176,6 +176,7 @@ impl HTMLTextAreaElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLTextAreaElement> {
Node::reflect_node_with_proto(
Box::new(HTMLTextAreaElement::new_inherited(
@@ -183,6 +184,7 @@ impl HTMLTextAreaElement {
)),
document,
proto,
+ can_gc,
)
}
@@ -306,8 +308,8 @@ impl HTMLTextAreaElementMethods for HTMLTextAreaElement {
}
// https://html.spec.whatwg.org/multipage/#dom-textarea-defaultvalue
- fn SetDefaultValue(&self, value: DOMString) {
- self.upcast::<Node>().SetTextContent(Some(value));
+ fn SetDefaultValue(&self, value: DOMString, can_gc: CanGc) {
+ self.upcast::<Node>().SetTextContent(Some(value), can_gc);
// if the element's dirty value flag is false, then the element's
// raw value must be set to the value of the element's textContent IDL attribute
diff --git a/components/script/dom/htmltimeelement.rs b/components/script/dom/htmltimeelement.rs
index 40b1c685ebb..7b3046338aa 100644
--- a/components/script/dom/htmltimeelement.rs
+++ b/components/script/dom/htmltimeelement.rs
@@ -12,6 +12,7 @@ use crate::dom::bindings::str::DOMString;
use crate::dom::document::Document;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::Node;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLTimeElement {
@@ -35,11 +36,13 @@ impl HTMLTimeElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLTimeElement> {
Node::reflect_node_with_proto(
Box::new(HTMLTimeElement::new_inherited(local_name, prefix, document)),
document,
proto,
+ can_gc,
)
}
}
diff --git a/components/script/dom/htmltitleelement.rs b/components/script/dom/htmltitleelement.rs
index c88261e5987..e67720efe83 100644
--- a/components/script/dom/htmltitleelement.rs
+++ b/components/script/dom/htmltitleelement.rs
@@ -17,6 +17,7 @@ use crate::dom::document::Document;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::{BindContext, ChildrenMutation, Node};
use crate::dom::virtualmethods::VirtualMethods;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLTitleElement {
@@ -42,6 +43,7 @@ impl HTMLTitleElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLTitleElement> {
Node::reflect_node_with_proto(
Box::new(HTMLTitleElement::new_inherited(
@@ -49,6 +51,7 @@ impl HTMLTitleElement {
)),
document,
proto,
+ can_gc,
)
}
@@ -67,8 +70,8 @@ impl HTMLTitleElementMethods for HTMLTitleElement {
}
// https://html.spec.whatwg.org/multipage/#dom-title-text
- fn SetText(&self, value: DOMString) {
- self.upcast::<Node>().SetTextContent(Some(value))
+ fn SetText(&self, value: DOMString, can_gc: CanGc) {
+ self.upcast::<Node>().SetTextContent(Some(value), can_gc)
}
}
diff --git a/components/script/dom/htmltrackelement.rs b/components/script/dom/htmltrackelement.rs
index 786cb0320c7..7f0889a01e5 100644
--- a/components/script/dom/htmltrackelement.rs
+++ b/components/script/dom/htmltrackelement.rs
@@ -17,6 +17,7 @@ use crate::dom::element::Element;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::Node;
use crate::dom::texttrack::TextTrack;
+use crate::script_runtime::CanGc;
#[derive(Clone, Copy, JSTraceable, MallocSizeOf, PartialEq)]
#[repr(u16)]
@@ -54,6 +55,7 @@ impl HTMLTrackElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLTrackElement> {
let track = TextTrack::new(
document.window(),
@@ -70,6 +72,7 @@ impl HTMLTrackElement {
)),
document,
proto,
+ can_gc,
)
}
}
diff --git a/components/script/dom/htmlulistelement.rs b/components/script/dom/htmlulistelement.rs
index b1e39d90f47..a90fa85efb8 100644
--- a/components/script/dom/htmlulistelement.rs
+++ b/components/script/dom/htmlulistelement.rs
@@ -12,6 +12,7 @@ use crate::dom::bindings::str::DOMString;
use crate::dom::document::Document;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::Node;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLUListElement {
@@ -35,6 +36,7 @@ impl HTMLUListElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLUListElement> {
Node::reflect_node_with_proto(
Box::new(HTMLUListElement::new_inherited(
@@ -42,6 +44,7 @@ impl HTMLUListElement {
)),
document,
proto,
+ can_gc,
)
}
}
diff --git a/components/script/dom/htmlunknownelement.rs b/components/script/dom/htmlunknownelement.rs
index 70d77feeabe..25efc28cc23 100644
--- a/components/script/dom/htmlunknownelement.rs
+++ b/components/script/dom/htmlunknownelement.rs
@@ -10,6 +10,7 @@ use crate::dom::bindings::root::DomRoot;
use crate::dom::document::Document;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::Node;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct HTMLUnknownElement {
@@ -33,6 +34,7 @@ impl HTMLUnknownElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLUnknownElement> {
Node::reflect_node_with_proto(
Box::new(HTMLUnknownElement::new_inherited(
@@ -40,6 +42,7 @@ impl HTMLUnknownElement {
)),
document,
proto,
+ can_gc,
)
}
}
diff --git a/components/script/dom/htmlvideoelement.rs b/components/script/dom/htmlvideoelement.rs
index 3211a7c9e37..a8a1868cd0d 100644
--- a/components/script/dom/htmlvideoelement.rs
+++ b/components/script/dom/htmlvideoelement.rs
@@ -89,6 +89,7 @@ impl HTMLVideoElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<HTMLVideoElement> {
Node::reflect_node_with_proto(
Box::new(HTMLVideoElement::new_inherited(
@@ -96,6 +97,7 @@ impl HTMLVideoElement {
)),
document,
proto,
+ can_gc,
)
}
diff --git a/components/script/dom/macros.rs b/components/script/dom/macros.rs
index 4f9cbeae141..52731fd654b 100644
--- a/components/script/dom/macros.rs
+++ b/components/script/dom/macros.rs
@@ -32,6 +32,7 @@ macro_rules! make_limited_int_setter(
fn $attr(&self, value: i32) -> $crate::dom::bindings::error::ErrorResult {
use $crate::dom::bindings::inheritance::Castable;
use $crate::dom::element::Element;
+ use $crate::script_runtime::CanGc;
let value = if value < 0 {
return Err($crate::dom::bindings::error::Error::IndexSize);
@@ -40,7 +41,7 @@ macro_rules! make_limited_int_setter(
};
let element = self.upcast::<Element>();
- element.set_int_attribute(&html5ever::local_name!($htmlname), value);
+ element.set_int_attribute(&html5ever::local_name!($htmlname), value, CanGc::note());
Ok(())
}
);
@@ -52,9 +53,10 @@ macro_rules! make_int_setter(
fn $attr(&self, value: i32) {
use $crate::dom::bindings::inheritance::Castable;
use $crate::dom::element::Element;
+ use $crate::script_runtime::CanGc;
let element = self.upcast::<Element>();
- element.set_int_attribute(&html5ever::local_name!($htmlname), value)
+ element.set_int_attribute(&html5ever::local_name!($htmlname), value, CanGc::note())
}
);
($attr:ident, $htmlname:tt) => {
@@ -111,9 +113,10 @@ macro_rules! make_url_setter(
fn $attr(&self, value: USVString) {
use $crate::dom::bindings::inheritance::Castable;
use $crate::dom::element::Element;
+ use $crate::script_runtime::CanGc;
let element = self.upcast::<Element>();
element.set_url_attribute(&html5ever::local_name!($htmlname),
- value);
+ value, CanGc::note());
}
);
);
@@ -181,8 +184,9 @@ macro_rules! make_setter(
fn $attr(&self, value: DOMString) {
use $crate::dom::bindings::inheritance::Castable;
use $crate::dom::element::Element;
+ use $crate::script_runtime::CanGc;
let element = self.upcast::<Element>();
- element.set_string_attribute(&html5ever::local_name!($htmlname), value)
+ element.set_string_attribute(&html5ever::local_name!($htmlname), value, CanGc::note())
}
);
);
@@ -193,8 +197,9 @@ macro_rules! make_bool_setter(
fn $attr(&self, value: bool) {
use $crate::dom::bindings::inheritance::Castable;
use $crate::dom::element::Element;
+ use $crate::script_runtime::CanGc;
let element = self.upcast::<Element>();
- element.set_bool_attribute(&html5ever::local_name!($htmlname), value)
+ element.set_bool_attribute(&html5ever::local_name!($htmlname), value, CanGc::note())
}
);
);
@@ -206,13 +211,14 @@ macro_rules! make_uint_setter(
use $crate::dom::bindings::inheritance::Castable;
use $crate::dom::element::Element;
use $crate::dom::values::UNSIGNED_LONG_MAX;
+ use $crate::script_runtime::CanGc;
let value = if value > UNSIGNED_LONG_MAX {
$default
} else {
value
};
let element = self.upcast::<Element>();
- element.set_uint_attribute(&html5ever::local_name!($htmlname), value)
+ element.set_uint_attribute(&html5ever::local_name!($htmlname), value, CanGc::note())
}
);
($attr:ident, $htmlname:tt) => {
@@ -227,6 +233,7 @@ macro_rules! make_limited_uint_setter(
use $crate::dom::bindings::inheritance::Castable;
use $crate::dom::element::Element;
use $crate::dom::values::UNSIGNED_LONG_MAX;
+ use $crate::script_runtime::CanGc;
let value = if value == 0 {
return Err($crate::dom::bindings::error::Error::IndexSize);
} else if value > UNSIGNED_LONG_MAX {
@@ -235,7 +242,7 @@ macro_rules! make_limited_uint_setter(
value
};
let element = self.upcast::<Element>();
- element.set_uint_attribute(&html5ever::local_name!($htmlname), value);
+ element.set_uint_attribute(&html5ever::local_name!($htmlname), value, CanGc::note());
Ok(())
}
);
@@ -250,8 +257,9 @@ macro_rules! make_atomic_setter(
fn $attr(&self, value: DOMString) {
use $crate::dom::bindings::inheritance::Castable;
use $crate::dom::element::Element;
+ use $crate::script_runtime::CanGc;
let element = self.upcast::<Element>();
- element.set_atomic_attribute(&html5ever::local_name!($htmlname), value)
+ element.set_atomic_attribute(&html5ever::local_name!($htmlname), value, CanGc::note())
}
);
);
@@ -263,9 +271,10 @@ macro_rules! make_legacy_color_setter(
use $crate::dom::bindings::inheritance::Castable;
use $crate::dom::element::Element;
use style::attr::AttrValue;
+ use $crate::script_runtime::CanGc;
let element = self.upcast::<Element>();
let value = AttrValue::from_legacy_color(value.into());
- element.set_attribute(&html5ever::local_name!($htmlname), value)
+ element.set_attribute(&html5ever::local_name!($htmlname), value, CanGc::note())
}
);
);
@@ -276,9 +285,10 @@ macro_rules! make_dimension_setter(
fn $attr(&self, value: DOMString) {
use $crate::dom::bindings::inheritance::Castable;
use $crate::dom::element::Element;
+ use $crate::script_runtime::CanGc;
let element = self.upcast::<Element>();
let value = AttrValue::from_dimension(value.into());
- element.set_attribute(&html5ever::local_name!($htmlname), value)
+ element.set_attribute(&html5ever::local_name!($htmlname), value, CanGc::note())
}
);
);
@@ -289,9 +299,10 @@ macro_rules! make_nonzero_dimension_setter(
fn $attr(&self, value: DOMString) {
use $crate::dom::bindings::inheritance::Castable;
use $crate::dom::element::Element;
+ use $crate::script_runtime::CanGc;
let element = self.upcast::<Element>();
let value = AttrValue::from_nonzero_dimension(value.into());
- element.set_attribute(&html5ever::local_name!($htmlname), value)
+ element.set_attribute(&html5ever::local_name!($htmlname), value, CanGc::note())
}
);
);
diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs
index 4851728803e..b8334b9f4e9 100644
--- a/components/script/dom/node.rs
+++ b/components/script/dom/node.rs
@@ -857,7 +857,7 @@ impl Node {
}
/// <https://dom.spec.whatwg.org/#dom-childnode-before>
- pub fn before(&self, nodes: Vec<NodeOrString>) -> ErrorResult {
+ pub fn before(&self, nodes: Vec<NodeOrString>, can_gc: CanGc) -> ErrorResult {
// Step 1.
let parent = &self.parent_node;
@@ -871,7 +871,9 @@ impl Node {
let viable_previous_sibling = first_node_not_in(self.preceding_siblings(), &nodes);
// Step 4.
- let node = self.owner_doc().node_from_nodes_and_strings(nodes)?;
+ let node = self
+ .owner_doc()
+ .node_from_nodes_and_strings(nodes, can_gc)?;
// Step 5.
let viable_previous_sibling = match viable_previous_sibling {
@@ -886,7 +888,7 @@ impl Node {
}
/// <https://dom.spec.whatwg.org/#dom-childnode-after>
- pub fn after(&self, nodes: Vec<NodeOrString>) -> ErrorResult {
+ pub fn after(&self, nodes: Vec<NodeOrString>, can_gc: CanGc) -> ErrorResult {
// Step 1.
let parent = &self.parent_node;
@@ -900,7 +902,9 @@ impl Node {
let viable_next_sibling = first_node_not_in(self.following_siblings(), &nodes);
// Step 4.
- let node = self.owner_doc().node_from_nodes_and_strings(nodes)?;
+ let node = self
+ .owner_doc()
+ .node_from_nodes_and_strings(nodes, can_gc)?;
// Step 5.
Node::pre_insert(&node, &parent, viable_next_sibling.as_deref())?;
@@ -909,7 +913,7 @@ impl Node {
}
/// <https://dom.spec.whatwg.org/#dom-childnode-replacewith>
- pub fn replace_with(&self, nodes: Vec<NodeOrString>) -> ErrorResult {
+ pub fn replace_with(&self, nodes: Vec<NodeOrString>, can_gc: CanGc) -> ErrorResult {
// Step 1.
let parent = if let Some(parent) = self.GetParentNode() {
parent
@@ -920,7 +924,9 @@ impl Node {
// Step 3.
let viable_next_sibling = first_node_not_in(self.following_siblings(), &nodes);
// Step 4.
- let node = self.owner_doc().node_from_nodes_and_strings(nodes)?;
+ let node = self
+ .owner_doc()
+ .node_from_nodes_and_strings(nodes, can_gc)?;
if self.parent_node == Some(&*parent) {
// Step 5.
parent.ReplaceChild(&node, self)?;
@@ -932,29 +938,29 @@ impl Node {
}
/// <https://dom.spec.whatwg.org/#dom-parentnode-prepend>
- pub fn prepend(&self, nodes: Vec<NodeOrString>) -> ErrorResult {
+ pub fn prepend(&self, nodes: Vec<NodeOrString>, can_gc: CanGc) -> ErrorResult {
// Step 1.
let doc = self.owner_doc();
- let node = doc.node_from_nodes_and_strings(nodes)?;
+ let node = doc.node_from_nodes_and_strings(nodes, can_gc)?;
// Step 2.
let first_child = self.first_child.get();
Node::pre_insert(&node, self, first_child.as_deref()).map(|_| ())
}
/// <https://dom.spec.whatwg.org/#dom-parentnode-append>
- pub fn append(&self, nodes: Vec<NodeOrString>) -> ErrorResult {
+ pub fn append(&self, nodes: Vec<NodeOrString>, can_gc: CanGc) -> ErrorResult {
// Step 1.
let doc = self.owner_doc();
- let node = doc.node_from_nodes_and_strings(nodes)?;
+ let node = doc.node_from_nodes_and_strings(nodes, can_gc)?;
// Step 2.
self.AppendChild(&node).map(|_| ())
}
/// <https://dom.spec.whatwg.org/#dom-parentnode-replacechildren>
- pub fn replace_children(&self, nodes: Vec<NodeOrString>) -> ErrorResult {
+ pub fn replace_children(&self, nodes: Vec<NodeOrString>, can_gc: CanGc) -> ErrorResult {
// Step 1.
let doc = self.owner_doc();
- let node = doc.node_from_nodes_and_strings(nodes)?;
+ let node = doc.node_from_nodes_and_strings(nodes, can_gc)?;
// Step 2.
Node::ensure_pre_insertion_validity(&node, self, None)?;
// Step 3.
@@ -1767,23 +1773,24 @@ fn as_uintptr<T>(t: &T) -> uintptr_t {
}
impl Node {
- pub fn reflect_node<N>(node: Box<N>, document: &Document) -> DomRoot<N>
+ pub fn reflect_node<N>(node: Box<N>, document: &Document, can_gc: CanGc) -> DomRoot<N>
where
N: DerivedFrom<Node> + DomObject + DomObjectWrap,
{
- Self::reflect_node_with_proto(node, document, None)
+ Self::reflect_node_with_proto(node, document, None, can_gc)
}
pub fn reflect_node_with_proto<N>(
node: Box<N>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<N>
where
N: DerivedFrom<Node> + DomObject + DomObjectWrap,
{
let window = document.window();
- reflect_dom_object_with_proto(node, window, proto, CanGc::note())
+ reflect_dom_object_with_proto(node, window, proto, can_gc)
}
pub fn new_inherited(doc: &Document) -> Node {
@@ -2151,11 +2158,11 @@ impl Node {
}
/// <https://dom.spec.whatwg.org/multipage/#string-replace-all>
- pub fn string_replace_all(string: DOMString, parent: &Node) {
+ pub fn string_replace_all(string: DOMString, parent: &Node, can_gc: CanGc) {
if string.len() == 0 {
Node::replace_all(None, parent);
} else {
- let text = Text::new(string, &document_from_node(parent));
+ let text = Text::new(string, &document_from_node(parent), can_gc);
Node::replace_all(Some(text.upcast::<Node>()), parent);
};
}
@@ -2250,6 +2257,7 @@ impl Node {
Some(doctype.public_id().clone()),
Some(doctype.system_id().clone()),
&document,
+ can_gc,
);
DomRoot::upcast::<Node>(doctype)
},
@@ -2263,16 +2271,17 @@ impl Node {
attr.namespace().clone(),
attr.prefix().cloned(),
None,
+ can_gc,
);
DomRoot::upcast::<Node>(attr)
},
NodeTypeId::DocumentFragment(_) => {
- let doc_fragment = DocumentFragment::new(&document);
+ let doc_fragment = DocumentFragment::new(&document, can_gc);
DomRoot::upcast::<Node>(doc_fragment)
},
NodeTypeId::CharacterData(_) => {
let cdata = node.downcast::<CharacterData>().unwrap();
- cdata.clone_with_data(cdata.Data(), &document)
+ cdata.clone_with_data(cdata.Data(), &document, can_gc)
},
NodeTypeId::Document(_) => {
let document = node.downcast::<Document>().unwrap();
@@ -2349,6 +2358,7 @@ impl Node {
attr.name().clone(),
attr.namespace().clone(),
attr.prefix().cloned(),
+ can_gc,
);
}
},
@@ -2610,7 +2620,7 @@ impl NodeMethods for Node {
}
/// <https://dom.spec.whatwg.org/#dom-node-textcontent>
- fn SetTextContent(&self, value: Option<DOMString>) {
+ fn SetTextContent(&self, value: Option<DOMString>, can_gc: CanGc) {
let value = value.unwrap_or_default();
match self.type_id() {
NodeTypeId::DocumentFragment(_) | NodeTypeId::Element(..) => {
@@ -2618,7 +2628,9 @@ impl NodeMethods for Node {
let node = if value.is_empty() {
None
} else {
- Some(DomRoot::upcast(self.owner_doc().CreateTextNode(value)))
+ Some(DomRoot::upcast(
+ self.owner_doc().CreateTextNode(value, can_gc),
+ ))
};
// Step 3.
diff --git a/components/script/dom/processinginstruction.rs b/components/script/dom/processinginstruction.rs
index 48db9ca416f..3d123296608 100644
--- a/components/script/dom/processinginstruction.rs
+++ b/components/script/dom/processinginstruction.rs
@@ -10,6 +10,7 @@ use crate::dom::bindings::str::DOMString;
use crate::dom::characterdata::CharacterData;
use crate::dom::document::Document;
use crate::dom::node::Node;
+use crate::script_runtime::CanGc;
/// An HTML processing instruction node.
#[dom_struct]
@@ -34,10 +35,12 @@ impl ProcessingInstruction {
target: DOMString,
data: DOMString,
document: &Document,
+ can_gc: CanGc,
) -> DomRoot<ProcessingInstruction> {
Node::reflect_node(
Box::new(ProcessingInstruction::new_inherited(target, data, document)),
document,
+ can_gc,
)
}
}
diff --git a/components/script/dom/range.rs b/components/script/dom/range.rs
index 2c0981eeeeb..5801f1c7021 100644
--- a/components/script/dom/range.rs
+++ b/components/script/dom/range.rs
@@ -561,7 +561,7 @@ impl RangeMethods for Range {
let end_offset = self.end_offset();
// Step 1.
- let fragment = DocumentFragment::new(&start_node.owner_doc());
+ let fragment = DocumentFragment::new(&start_node.owner_doc(), can_gc);
// Step 2.
if self.start() == self.end() {
@@ -574,7 +574,7 @@ impl RangeMethods for Range {
let data = cdata
.SubstringData(start_offset, end_offset - start_offset)
.unwrap();
- let clone = cdata.clone_with_data(data, &start_node.owner_doc());
+ let clone = cdata.clone_with_data(data, &start_node.owner_doc(), can_gc);
// Step 4.3.
fragment.upcast::<Node>().AppendChild(&clone)?;
// Step 4.4
@@ -597,7 +597,7 @@ impl RangeMethods for Range {
let data = cdata
.SubstringData(start_offset, start_node.len() - start_offset)
.unwrap();
- let clone = cdata.clone_with_data(data, &start_node.owner_doc());
+ let clone = cdata.clone_with_data(data, &start_node.owner_doc(), can_gc);
// Step 13.3.
fragment.upcast::<Node>().AppendChild(&clone)?;
} else {
@@ -635,7 +635,7 @@ impl RangeMethods for Range {
assert!(child == end_node);
// Steps 16.1-2.
let data = cdata.SubstringData(0, end_offset).unwrap();
- let clone = cdata.clone_with_data(data, &start_node.owner_doc());
+ let clone = cdata.clone_with_data(data, &start_node.owner_doc(), can_gc);
// Step 16.3.
fragment.upcast::<Node>().AppendChild(&clone)?;
} else {
@@ -667,7 +667,7 @@ impl RangeMethods for Range {
let end_offset = self.end_offset();
// Step 1.
- let fragment = DocumentFragment::new(&start_node.owner_doc());
+ let fragment = DocumentFragment::new(&start_node.owner_doc(), can_gc);
// Step 2.
if self.collapsed() {
@@ -807,7 +807,7 @@ impl RangeMethods for Range {
/// <https://dom.spec.whatwg.org/#dom-range-insertnode>
/// <https://dom.spec.whatwg.org/#concept-range-insert>
- fn InsertNode(&self, node: &Node) -> ErrorResult {
+ fn InsertNode(&self, node: &Node, can_gc: CanGc) -> ErrorResult {
let start_node = self.start_container();
let start_offset = self.start_offset();
@@ -848,7 +848,7 @@ impl RangeMethods for Range {
let split_text;
let reference_node = match start_node.downcast::<Text>() {
Some(text) => {
- split_text = text.SplitText(start_offset)?;
+ split_text = text.SplitText(start_offset, can_gc)?;
let new_reference = DomRoot::upcast::<Node>(split_text);
assert!(new_reference.GetParentNode().as_deref() == Some(&parent));
Some(new_reference)
@@ -1006,7 +1006,7 @@ impl RangeMethods for Range {
Node::replace_all(None, new_parent);
// Step 5.
- self.InsertNode(new_parent)?;
+ self.InsertNode(new_parent, can_gc)?;
// Step 6.
new_parent.AppendChild(fragment.upcast())?;
@@ -1086,7 +1086,7 @@ impl RangeMethods for Range {
};
// Step 2.
- let element = Element::fragment_parsing_context(&owner_doc, element.as_deref());
+ let element = Element::fragment_parsing_context(&owner_doc, element.as_deref(), can_gc);
// Step 3.
let fragment_node = element.parse_fragment(fragment, can_gc)?;
diff --git a/components/script/dom/servoparser/async_html.rs b/components/script/dom/servoparser/async_html.rs
index 2f54dc64104..29d684f5fdc 100644
--- a/components/script/dom/servoparser/async_html.rs
+++ b/components/script/dom/servoparser/async_html.rs
@@ -447,7 +447,7 @@ impl Tokenizer {
self.insert_node(node, Dom::from_ref(element.upcast()));
},
ParseOperation::CreateComment { text, node } => {
- let comment = Comment::new(DOMString::from(text), document, None);
+ let comment = Comment::new(DOMString::from(text), document, None, can_gc);
self.insert_node(node, Dom::from_ref(comment.upcast()));
},
ParseOperation::AppendBeforeSibling { sibling, node } => {
@@ -477,6 +477,7 @@ impl Tokenizer {
Some(DOMString::from(public_id)),
Some(DOMString::from(system_id)),
document,
+ can_gc,
);
document
@@ -490,7 +491,12 @@ impl Tokenizer {
.downcast::<Element>()
.expect("tried to set attrs on non-Element in HTML parsing");
for attr in attrs {
- elem.set_attribute_from_parser(attr.name, DOMString::from(attr.value), None);
+ elem.set_attribute_from_parser(
+ attr.name,
+ DOMString::from(attr.value),
+ None,
+ can_gc,
+ );
}
},
ParseOperation::RemoveFromParent { target } => {
@@ -549,6 +555,7 @@ impl Tokenizer {
DOMString::from(target),
DOMString::from(data),
document,
+ can_gc,
);
self.insert_node(node, Dom::from_ref(pi.upcast()));
},
diff --git a/components/script/dom/servoparser/mod.rs b/components/script/dom/servoparser/mod.rs
index b29eeef3654..933d8e4f1eb 100644
--- a/components/script/dom/servoparser/mod.rs
+++ b/components/script/dom/servoparser/mod.rs
@@ -855,7 +855,7 @@ impl FetchResponseListener for ParserContext {
let doc = &parser.document;
let doc_body = DomRoot::upcast::<Node>(doc.GetBody().unwrap());
- let img = HTMLImageElement::new(local_name!("img"), None, doc, None);
+ let img = HTMLImageElement::new(local_name!("img"), None, doc, None, CanGc::note());
img.SetSrc(USVString(self.url.to_string()));
doc_body
.AppendChild(&DomRoot::upcast::<Node>(img))
@@ -1053,7 +1053,7 @@ fn insert(
if let Some(text) = text {
text.upcast::<CharacterData>().append_data(&t);
} else {
- let text = Text::new(String::from(t).into(), &parent.owner_doc());
+ let text = Text::new(String::from(t).into(), &parent.owner_doc(), can_gc);
parent.InsertBefore(text.upcast(), reference_child).unwrap();
}
},
@@ -1145,7 +1145,12 @@ impl TreeSink for Sink {
#[allow(crown::unrooted_must_root)]
fn create_comment(&self, text: StrTendril) -> Dom<Node> {
- let comment = Comment::new(DOMString::from(String::from(text)), &self.document, None);
+ let comment = Comment::new(
+ DOMString::from(String::from(text)),
+ &self.document,
+ None,
+ CanGc::note(),
+ );
Dom::from_ref(comment.upcast())
}
@@ -1156,6 +1161,7 @@ impl TreeSink for Sink {
DOMString::from(String::from(target)),
DOMString::from(String::from(data)),
doc,
+ CanGc::note(),
);
Dom::from_ref(pi.upcast())
}
@@ -1249,6 +1255,7 @@ impl TreeSink for Sink {
Some(DOMString::from(String::from(public_id))),
Some(DOMString::from(String::from(system_id))),
doc,
+ CanGc::note(),
);
doc.upcast::<Node>()
.AppendChild(doctype.upcast())
@@ -1264,6 +1271,7 @@ impl TreeSink for Sink {
attr.name,
DOMString::from(String::from(attr.value)),
None,
+ CanGc::note(),
);
}
}
@@ -1377,7 +1385,7 @@ fn create_element_for_token(
// Step 8
for attr in attrs {
- element.set_attribute_from_parser(attr.name, attr.value, None);
+ element.set_attribute_from_parser(attr.name, attr.value, None, can_gc);
}
// _now_ we can sanitize (and we sanitize now even if the "value"
diff --git a/components/script/dom/svgelement.rs b/components/script/dom/svgelement.rs
index 3168903812b..9a9b79a2ad6 100644
--- a/components/script/dom/svgelement.rs
+++ b/components/script/dom/svgelement.rs
@@ -15,6 +15,7 @@ use crate::dom::document::Document;
use crate::dom::element::Element;
use crate::dom::node::{window_from_node, Node};
use crate::dom::virtualmethods::VirtualMethods;
+use crate::script_runtime::CanGc;
#[dom_struct]
pub struct SVGElement {
@@ -48,11 +49,13 @@ impl SVGElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<SVGElement> {
Node::reflect_node_with_proto(
Box::new(SVGElement::new_inherited(tag_name, prefix, document)),
document,
proto,
+ can_gc,
)
}
}
@@ -83,8 +86,8 @@ impl SVGElementMethods for SVGElement {
}
// https://html.spec.whatwg.org/multipage/#dom-fe-autofocus
- fn SetAutofocus(&self, autofocus: bool) {
+ fn SetAutofocus(&self, autofocus: bool, can_gc: CanGc) {
self.element
- .set_bool_attribute(&local_name!("autofocus"), autofocus);
+ .set_bool_attribute(&local_name!("autofocus"), autofocus, can_gc);
}
}
diff --git a/components/script/dom/svgsvgelement.rs b/components/script/dom/svgsvgelement.rs
index 3fee6f3f0cf..731df017367 100644
--- a/components/script/dom/svgsvgelement.rs
+++ b/components/script/dom/svgsvgelement.rs
@@ -17,6 +17,7 @@ use crate::dom::element::{AttributeMutation, Element, LayoutElementHelpers};
use crate::dom::node::Node;
use crate::dom::svggraphicselement::SVGGraphicsElement;
use crate::dom::virtualmethods::VirtualMethods;
+use crate::script_runtime::CanGc;
const DEFAULT_WIDTH: u32 = 300;
const DEFAULT_HEIGHT: u32 = 150;
@@ -43,11 +44,13 @@ impl SVGSVGElement {
prefix: Option<Prefix>,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<SVGSVGElement> {
Node::reflect_node_with_proto(
Box::new(SVGSVGElement::new_inherited(local_name, prefix, document)),
document,
proto,
+ can_gc,
)
}
}
diff --git a/components/script/dom/text.rs b/components/script/dom/text.rs
index 37917922e84..c9381f207a8 100644
--- a/components/script/dom/text.rs
+++ b/components/script/dom/text.rs
@@ -33,19 +33,21 @@ impl Text {
}
}
- pub fn new(text: DOMString, document: &Document) -> DomRoot<Text> {
- Self::new_with_proto(text, document, None)
+ pub fn new(text: DOMString, document: &Document, can_gc: CanGc) -> DomRoot<Text> {
+ Self::new_with_proto(text, document, None, can_gc)
}
fn new_with_proto(
text: DOMString,
document: &Document,
proto: Option<HandleObject>,
+ can_gc: CanGc,
) -> DomRoot<Text> {
Node::reflect_node_with_proto(
Box::new(Text::new_inherited(text, document)),
document,
proto,
+ can_gc,
)
}
}
@@ -55,16 +57,16 @@ impl TextMethods for Text {
fn Constructor(
window: &Window,
proto: Option<HandleObject>,
- _can_gc: CanGc,
+ can_gc: CanGc,
text: DOMString,
) -> Fallible<DomRoot<Text>> {
let document = window.Document();
- Ok(Text::new_with_proto(text, &document, proto))
+ Ok(Text::new_with_proto(text, &document, proto, can_gc))
}
// https://dom.spec.whatwg.org/#dom-text-splittext
// https://dom.spec.whatwg.org/#concept-text-split
- fn SplitText(&self, offset: u32) -> Fallible<DomRoot<Text>> {
+ fn SplitText(&self, offset: u32, can_gc: CanGc) -> Fallible<DomRoot<Text>> {
let cdata = self.upcast::<CharacterData>();
// Step 1.
let length = cdata.Length();
@@ -79,7 +81,7 @@ impl TextMethods for Text {
// Step 5.
let node = self.upcast::<Node>();
let owner_doc = node.owner_doc();
- let new_node = owner_doc.CreateTextNode(new_data);
+ let new_node = owner_doc.CreateTextNode(new_data, can_gc);
// Step 6.
let parent = node.GetParentNode();
if let Some(ref parent) = parent {