diff --git a/components/script/devtools.rs b/components/script/devtools.rs index d1ffde7c26a..af82058bea4 100644 --- a/components/script/devtools.rs +++ b/components/script/devtools.rs @@ -440,7 +440,7 @@ pub(crate) fn handle_modify_attribute( can_gc, ); }, - None => elem.RemoveAttribute(DOMString::from(modification.attribute_name)), + None => elem.RemoveAttribute(DOMString::from(modification.attribute_name), can_gc), } } } diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 5216768c3ac..4aebe893bef 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -2294,13 +2294,13 @@ impl Element { .map(|sr| DomRoot::from_ref(&**sr)) } - pub(crate) fn ensure_element_internals(&self) -> DomRoot { + pub(crate) fn ensure_element_internals(&self, can_gc: CanGc) -> DomRoot { let mut rare_data = self.ensure_rare_data(); DomRoot::from_ref(rare_data.element_internals.get_or_insert_with(|| { let elem = self .downcast::() .expect("ensure_element_internals should only be called for an HTMLElement"); - Dom::from_ref(&*ElementInternals::new(elem, CanGc::note())) + Dom::from_ref(&*ElementInternals::new(elem, can_gc)) })) } } @@ -2361,9 +2361,9 @@ impl ElementMethods for Element { } // https://dom.spec.whatwg.org/#dom-element-classlist - fn ClassList(&self) -> DomRoot { + fn ClassList(&self, can_gc: CanGc) -> DomRoot { self.class_list - .or_init(|| DOMTokenList::new(self, &local_name!("class"), None, CanGc::note())) + .or_init(|| DOMTokenList::new(self, &local_name!("class"), None, can_gc)) } // https://dom.spec.whatwg.org/#dom-element-slot @@ -2373,9 +2373,9 @@ impl ElementMethods for Element { make_setter!(SetSlot, "slot"); // https://dom.spec.whatwg.org/#dom-element-attributes - fn Attributes(&self) -> DomRoot { + fn Attributes(&self, can_gc: CanGc) -> DomRoot { self.attr_list - .or_init(|| NamedNodeMap::new(&self.owner_window(), self, CanGc::note())) + .or_init(|| NamedNodeMap::new(&self.owner_window(), self, can_gc)) } // https://dom.spec.whatwg.org/#dom-element-hasattributes @@ -2515,7 +2515,7 @@ impl ElementMethods for Element { } // https://dom.spec.whatwg.org/#dom-element-setattributenode - fn SetAttributeNode(&self, attr: &Attr) -> Fallible>> { + fn SetAttributeNode(&self, attr: &Attr, can_gc: CanGc) -> Fallible>> { // Step 1. if let Some(owner) = attr.GetOwnerElement() { if &*owner != self { @@ -2565,7 +2565,7 @@ impl ElementMethods for Element { vtable.attribute_mutated( attr, AttributeMutation::Set(Some(&old_attr.value())), - CanGc::note(), + can_gc, ); } @@ -2574,7 +2574,7 @@ impl ElementMethods for Element { } else { // Step 5. attr.set_owner(Some(self)); - self.push_attribute(attr, CanGc::note()); + self.push_attribute(attr, can_gc); // Step 6. Ok(None) @@ -2582,26 +2582,31 @@ impl ElementMethods for Element { } // https://dom.spec.whatwg.org/#dom-element-setattributenodens - fn SetAttributeNodeNS(&self, attr: &Attr) -> Fallible>> { - self.SetAttributeNode(attr) + fn SetAttributeNodeNS(&self, attr: &Attr, can_gc: CanGc) -> Fallible>> { + self.SetAttributeNode(attr, can_gc) } // https://dom.spec.whatwg.org/#dom-element-removeattribute - fn RemoveAttribute(&self, name: DOMString) { + fn RemoveAttribute(&self, name: DOMString, can_gc: CanGc) { let name = self.parsed_name(name); - self.remove_attribute_by_name(&name, CanGc::note()); + self.remove_attribute_by_name(&name, can_gc); } // https://dom.spec.whatwg.org/#dom-element-removeattributens - fn RemoveAttributeNS(&self, namespace: Option, local_name: DOMString) { + fn RemoveAttributeNS( + &self, + namespace: Option, + local_name: DOMString, + can_gc: CanGc, + ) { let namespace = namespace_from_domstring(namespace); let local_name = LocalName::from(local_name); - self.remove_attribute(&namespace, &local_name, CanGc::note()); + self.remove_attribute(&namespace, &local_name, can_gc); } // https://dom.spec.whatwg.org/#dom-element-removeattributenode - fn RemoveAttributeNode(&self, attr: &Attr) -> Fallible> { - self.remove_first_matching_attribute(|a| a == attr, CanGc::note()) + fn RemoveAttributeNode(&self, attr: &Attr, can_gc: CanGc) -> Fallible> { + self.remove_first_matching_attribute(|a| a == attr, can_gc) .ok_or(Error::NotFound) } @@ -2616,13 +2621,13 @@ impl ElementMethods for Element { } // https://dom.spec.whatwg.org/#dom-element-getelementsbytagname - fn GetElementsByTagName(&self, localname: DOMString) -> DomRoot { + fn GetElementsByTagName(&self, localname: DOMString, can_gc: CanGc) -> DomRoot { let window = self.owner_window(); HTMLCollection::by_qualified_name( &window, self.upcast(), LocalName::from(&*localname), - CanGc::note(), + can_gc, ) } @@ -2631,15 +2636,16 @@ impl ElementMethods for Element { &self, maybe_ns: Option, localname: DOMString, + can_gc: CanGc, ) -> DomRoot { let window = self.owner_window(); - HTMLCollection::by_tag_name_ns(&window, self.upcast(), localname, maybe_ns, CanGc::note()) + HTMLCollection::by_tag_name_ns(&window, self.upcast(), localname, maybe_ns, can_gc) } // https://dom.spec.whatwg.org/#dom-element-getelementsbyclassname - fn GetElementsByClassName(&self, classes: DOMString) -> DomRoot { + fn GetElementsByClassName(&self, classes: DOMString, can_gc: CanGc) -> DomRoot { let window = self.owner_window(); - HTMLCollection::by_class_name(&window, self.upcast(), classes, CanGc::note()) + HTMLCollection::by_class_name(&window, self.upcast(), classes, can_gc) } // https://drafts.csswg.org/cssom-view/#dom-element-getclientrects @@ -2690,13 +2696,13 @@ impl ElementMethods for Element { } // https://drafts.csswg.org/cssom-view/#dom-element-scrollto - fn ScrollTo(&self, options: &ScrollToOptions) { - self.Scroll(options, CanGc::note()); + fn ScrollTo(&self, options: &ScrollToOptions, can_gc: CanGc) { + self.Scroll(options, can_gc); } // https://drafts.csswg.org/cssom-view/#dom-element-scrollto - fn ScrollTo_(&self, x: f64, y: f64) { - self.Scroll_(x, y, CanGc::note()); + fn ScrollTo_(&self, x: f64, y: f64, can_gc: CanGc) { + self.Scroll_(x, y, can_gc); } // https://drafts.csswg.org/cssom-view/#dom-element-scrollby @@ -3117,9 +3123,9 @@ impl ElementMethods for Element { } // https://dom.spec.whatwg.org/#dom-parentnode-children - fn Children(&self) -> DomRoot { + fn Children(&self, can_gc: CanGc) -> DomRoot { let window = self.owner_window(); - HTMLCollection::children(&window, self.upcast(), CanGc::note()) + HTMLCollection::children(&window, self.upcast(), can_gc) } // https://dom.spec.whatwg.org/#dom-parentnode-firstelementchild @@ -3183,8 +3189,8 @@ impl ElementMethods for Element { } // https://dom.spec.whatwg.org/#dom-childnode-remove - fn Remove(&self) { - self.upcast::().remove_self(CanGc::note()); + fn Remove(&self, can_gc: CanGc) { + self.upcast::().remove_self(can_gc); } // https://dom.spec.whatwg.org/#dom-element-matches @@ -3240,9 +3246,10 @@ impl ElementMethods for Element { &self, where_: DOMString, element: &Element, + can_gc: CanGc, ) -> Fallible>> { let where_ = where_.parse::()?; - let inserted_node = self.insert_adjacent(where_, element.upcast(), CanGc::note())?; + let inserted_node = self.insert_adjacent(where_, element.upcast(), can_gc)?; Ok(inserted_node.map(|node| DomRoot::downcast(node).unwrap())) } @@ -3325,7 +3332,7 @@ impl ElementMethods for Element { } // https://dom.spec.whatwg.org/#dom-element-attachshadow - fn AttachShadow(&self, init: &ShadowRootInit) -> Fallible> { + fn AttachShadow(&self, init: &ShadowRootInit, can_gc: CanGc) -> Fallible> { // Step 1. Run attach a shadow root with this, init["mode"], init["clonable"], init["serializable"], // init["delegatesFocus"], and init["slotAssignment"]. let shadow_root = self.attach_shadow( @@ -3335,7 +3342,7 @@ impl ElementMethods for Element { init.serializable, init.delegatesFocus, init.slotAssignment, - CanGc::note(), + can_gc, )?; // Step 2. Return this’s shadow root. @@ -3751,7 +3758,7 @@ impl VirtualMethods for Element { let doc = node.owner_doc(); match attr.local_name() { &local_name!("tabindex") | &local_name!("draggable") | &local_name!("hidden") => { - self.update_sequentially_focusable_status(CanGc::note()) + self.update_sequentially_focusable_status(can_gc) }, &local_name!("style") => { // Modifying the `style` attribute might change style. @@ -3924,7 +3931,7 @@ impl VirtualMethods for Element { return; } - self.update_sequentially_focusable_status(CanGc::note()); + self.update_sequentially_focusable_status(can_gc); if let Some(ref id) = *self.id_attribute.borrow() { if let Some(shadow_root) = self.containing_shadow_root() { @@ -3957,13 +3964,13 @@ impl VirtualMethods for Element { return; } - self.update_sequentially_focusable_status(CanGc::note()); + self.update_sequentially_focusable_status(can_gc); let doc = self.owner_document(); let fullscreen = doc.GetFullscreenElement(); if fullscreen.as_deref() == Some(self) { - doc.exit_fullscreen(CanGc::note()); + doc.exit_fullscreen(can_gc); } if let Some(ref value) = *self.id_attribute.borrow() { if let Some(ref shadow_root) = self.containing_shadow_root() { diff --git a/components/script/dom/htmlelement.rs b/components/script/dom/htmlelement.rs index a74d4470788..4a62d0a2749 100644 --- a/components/script/dom/htmlelement.rs +++ b/components/script/dom/htmlelement.rs @@ -594,7 +594,7 @@ impl HTMLElementMethods for HTMLElement { false } /// - fn AttachInternals(&self) -> Fallible> { + fn AttachInternals(&self, can_gc: CanGc) -> Fallible> { let element = self.as_element(); // Step 1: If this's is value is not null, then throw a "NotSupportedError" DOMException if element.get_is().is_some() { @@ -620,7 +620,7 @@ impl HTMLElementMethods for HTMLElement { } // Step 5: If this's attached internals is non-null, then throw an "NotSupportedError" DOMException - let internals = element.ensure_element_internals(); + let internals = element.ensure_element_internals(can_gc); if internals.attached() { return Err(Error::NotSupported); } @@ -1227,7 +1227,7 @@ impl FormControl for HTMLElement { fn set_form_owner(&self, form: Option<&HTMLFormElement>) { debug_assert!(self.is_form_associated_custom_element()); self.as_element() - .ensure_element_internals() + .ensure_element_internals(CanGc::note()) .set_form_owner(form); } diff --git a/components/script/dom/htmlformelement.rs b/components/script/dom/htmlformelement.rs index 69290f89b0a..858b5ff6dec 100644 --- a/components/script/dom/htmlformelement.rs +++ b/components/script/dom/htmlformelement.rs @@ -1129,6 +1129,7 @@ impl HTMLFormElement { &self, submitter: Option, encoding: Option<&'static Encoding>, + can_gc: CanGc, ) -> Vec { let controls = self.controls.borrow(); let mut data_set = Vec::new(); @@ -1177,7 +1178,8 @@ impl HTMLFormElement { let custom = child.downcast::().unwrap(); if custom.is_form_associated_custom_element() { // https://html.spec.whatwg.org/multipage/#face-entry-construction - let internals = custom.upcast::().ensure_element_internals(); + let internals = + custom.upcast::().ensure_element_internals(can_gc); internals.perform_entry_construction(&mut data_set); // Otherwise no form value has been set so there is nothing to do. } @@ -1225,7 +1227,7 @@ impl HTMLFormElement { self.constructing_entry_list.set(true); // Step 3-6 - let ret = self.get_unclean_dataset(submitter, encoding); + let ret = self.get_unclean_dataset(submitter, encoding, can_gc); let window = self.owner_window(); diff --git a/components/script/dom/htmloptionscollection.rs b/components/script/dom/htmloptionscollection.rs index bf3b40909f2..c16d1656b06 100644 --- a/components/script/dom/htmloptionscollection.rs +++ b/components/script/dom/htmloptionscollection.rs @@ -226,7 +226,7 @@ impl HTMLOptionsCollectionMethods for HTMLOptionsCollectio /// fn Remove(&self, index: i32) { if let Some(element) = self.upcast().IndexedGetter(index as u32) { - element.Remove(); + element.Remove(CanGc::note()); } } diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index 0a416bd85a0..f4a62abe8b4 100644 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -534,7 +534,7 @@ impl HTMLSelectElementMethods for HTMLSelectElement { /// fn Remove(&self) { - self.upcast::().Remove() + self.upcast::().Remove(CanGc::note()) } /// diff --git a/components/script/dom/namednodemap.rs b/components/script/dom/namednodemap.rs index a96b63326b3..45b7708bd4c 100644 --- a/components/script/dom/namednodemap.rs +++ b/components/script/dom/namednodemap.rs @@ -67,7 +67,7 @@ impl NamedNodeMapMethods for NamedNodeMap { // https://dom.spec.whatwg.org/#dom-namednodemap-setnameditem fn SetNamedItem(&self, attr: &Attr) -> Fallible>> { - self.owner.SetAttributeNode(attr) + self.owner.SetAttributeNode(attr, CanGc::note()) } // https://dom.spec.whatwg.org/#dom-namednodemap-setnameditemns diff --git a/components/script/webdriver_handlers.rs b/components/script/webdriver_handlers.rs index a28cc523cc5..5e7c2b6c057 100644 --- a/components/script/webdriver_handlers.rs +++ b/components/script/webdriver_handlers.rs @@ -679,7 +679,7 @@ pub(crate) fn handle_find_element_element_tag_name( element_id: String, selector: String, reply: IpcSender, ErrorStatus>>, - _can_gc: CanGc, + can_gc: CanGc, ) { reply .send( @@ -687,7 +687,7 @@ pub(crate) fn handle_find_element_element_tag_name( .downcast::( ) { Some(element) => Ok(element - .GetElementsByTagName(DOMString::from(selector)) + .GetElementsByTagName(DOMString::from(selector), can_gc) .elements_iter() .next() .map(|x| x.upcast::().unique_id())), @@ -742,7 +742,7 @@ pub(crate) fn handle_find_element_elements_tag_name( element_id: String, selector: String, reply: IpcSender, ErrorStatus>>, - _can_gc: CanGc, + can_gc: CanGc, ) { reply .send( @@ -750,7 +750,7 @@ pub(crate) fn handle_find_element_elements_tag_name( .downcast::( ) { Some(element) => Ok(element - .GetElementsByTagName(DOMString::from(selector)) + .GetElementsByTagName(DOMString::from(selector), can_gc) .elements_iter() .map(|x| x.upcast::().unique_id()) .collect::>()), diff --git a/components/script_bindings/codegen/Bindings.conf b/components/script_bindings/codegen/Bindings.conf index f1956872a36..3ade5db811a 100644 --- a/components/script_bindings/codegen/Bindings.conf +++ b/components/script_bindings/codegen/Bindings.conf @@ -222,7 +222,7 @@ DOMInterfaces = { }, 'Element': { - 'canGc': ['SetHTMLUnsafe', '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', 'GetHTML', 'GetInnerHTML', 'GetOuterHTML'], + 'canGc': ['SetHTMLUnsafe', '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', 'GetHTML', 'GetInnerHTML', 'GetOuterHTML', 'ClassList', 'Attributes', 'SetAttributeNode', 'SetAttributeNodeNS', 'RemoveAttribute', 'RemoveAttributeNS', 'RemoveAttributeNode', 'GetElementsByTagName', 'GetElementsByTagNameNS', 'GetElementsByClassName', 'ScrollTo', 'ScrollTo_', 'Children', 'Remove', 'InsertAdjacentElement', 'AttachShadow'], }, 'ElementInternals': { @@ -343,7 +343,7 @@ DOMInterfaces = { }, 'HTMLElement': { - 'canGc': ['Focus', 'Blur', 'Click', 'SetInnerText', 'SetOuterText', "SetTranslate", 'SetAutofocus', 'GetOffsetParent', 'OffsetTop', 'OffsetLeft', 'OffsetWidth', 'OffsetHeight', 'InnerText', 'GetOuterText', 'GetOnerror', 'GetOnload', 'GetOnblur', 'GetOnfocus', 'GetOnresize', 'GetOnscroll'], + 'canGc': ['AttachInternals', 'Focus', 'Blur', 'Click', 'SetInnerText', 'SetOuterText', "SetTranslate", 'SetAutofocus', 'GetOffsetParent', 'OffsetTop', 'OffsetLeft', 'OffsetWidth', 'OffsetHeight', 'InnerText', 'GetOuterText', 'GetOnerror', 'GetOnload', 'GetOnblur', 'GetOnfocus', 'GetOnresize', 'GetOnscroll'], }, 'HTMLFieldSetElement': {