diff options
author | Arya Nair <aryaajitnair@gmail.com> | 2025-03-19 23:33:09 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-19 18:03:09 +0000 |
commit | cb56ac8561ab4f27d0268881e7c95ee57a2eadfe (patch) | |
tree | f1d73e3b202a8d06ce988578cc0ee355a451d7be /components/script/dom | |
parent | 0917e080df769011f6fd4348d63f8fd5895baa21 (diff) | |
download | servo-cb56ac8561ab4f27d0268881e7c95ee57a2eadfe.tar.gz servo-cb56ac8561ab4f27d0268881e7c95ee57a2eadfe.zip |
feat: add can_gc argument to to_frozen_array (#36043)
* feat: add can_gc argument to to_frozen_array
Signed-off-by: Arya Nair <aryaajitnair@gmail.com>
* fix: linting issues
Signed-off-by: Arya Nair <aryaajitnair@gmail.com>
* feat: add can_gc in binding.conf
Signed-off-by: Arya Nair <aryaajitnair@gmail.com>
* fix: linting issues
Signed-off-by: Arya Nair <aryaajitnair@gmail.com>
---------
Signed-off-by: Arya Nair <aryaajitnair@gmail.com>
Diffstat (limited to 'components/script/dom')
20 files changed, 56 insertions, 39 deletions
diff --git a/components/script/dom/bindings/frozenarray.rs b/components/script/dom/bindings/frozenarray.rs index 44cc0bd4085..a9fb40ad0b4 100644 --- a/components/script/dom/bindings/frozenarray.rs +++ b/components/script/dom/bindings/frozenarray.rs @@ -9,7 +9,7 @@ use js::rust::MutableHandleValue; use crate::dom::bindings::cell::DomRefCell; use crate::dom::bindings::utils::to_frozen_array; -use crate::script_runtime::JSContext; +use crate::script_runtime::{CanGc, JSContext}; #[derive(JSTraceable)] pub(crate) struct CachedFrozenArray { @@ -28,6 +28,7 @@ impl CachedFrozenArray { f: F, cx: JSContext, mut retval: MutableHandleValue, + can_gc: CanGc, ) { if let Some(inner) = &*self.frozen_value.borrow() { retval.set(inner.get()); @@ -35,7 +36,7 @@ impl CachedFrozenArray { } let array = f(); - to_frozen_array(array.as_slice(), cx, retval); + to_frozen_array(array.as_slice(), cx, retval, can_gc); // Safety: need to create the Heap value in its final memory location before setting it. *self.frozen_value.borrow_mut() = Some(Heap::default()); diff --git a/components/script/dom/bindings/utils.rs b/components/script/dom/bindings/utils.rs index 36b81e6e884..c5c61425a3b 100644 --- a/components/script/dom/bindings/utils.rs +++ b/components/script/dom/bindings/utils.rs @@ -123,6 +123,7 @@ pub(crate) fn to_frozen_array<T: ToJSValConvertible>( convertibles: &[T], cx: SafeJSContext, rval: MutableHandleValue, + _can_gc: CanGc, ) { unsafe { convertibles.to_jsval(*cx, rval) }; diff --git a/components/script/dom/csslayerstatementrule.rs b/components/script/dom/csslayerstatementrule.rs index 3678632347a..1206cff9442 100644 --- a/components/script/dom/csslayerstatementrule.rs +++ b/components/script/dom/csslayerstatementrule.rs @@ -69,13 +69,13 @@ impl SpecificCSSRule for CSSLayerStatementRule { impl CSSLayerStatementRuleMethods<crate::DomTypeHolder> for CSSLayerStatementRule { /// <https://drafts.csswg.org/css-cascade-5/#dom-csslayerstatementrule-namelist> - fn NameList(&self, cx: SafeJSContext, retval: MutableHandleValue) { + fn NameList(&self, cx: SafeJSContext, can_gc: CanGc, retval: MutableHandleValue) { let names: Vec<DOMString> = self .layerstatementrule .names .iter() .map(|name| DOMString::from_string(name.to_css_string())) .collect(); - to_frozen_array(names.as_slice(), cx, retval) + to_frozen_array(names.as_slice(), cx, retval, can_gc) } } diff --git a/components/script/dom/datatransfer.rs b/components/script/dom/datatransfer.rs index 0626ec27787..d86e351f513 100644 --- a/components/script/dom/datatransfer.rs +++ b/components/script/dom/datatransfer.rs @@ -160,8 +160,8 @@ impl DataTransferMethods<crate::DomTypeHolder> for DataTransfer { } /// <https://html.spec.whatwg.org/multipage/#dom-datatransfer-types> - fn Types(&self, cx: JSContext, retval: MutableHandleValue) { - self.items.frozen_types(cx, retval); + fn Types(&self, cx: JSContext, can_gc: CanGc, retval: MutableHandleValue) { + self.items.frozen_types(cx, retval, can_gc); } /// <https://html.spec.whatwg.org/multipage/#dom-datatransfer-getdata> diff --git a/components/script/dom/datatransferitemlist.rs b/components/script/dom/datatransferitemlist.rs index 0977834ddb7..f0ad17b94ef 100644 --- a/components/script/dom/datatransferitemlist.rs +++ b/components/script/dom/datatransferitemlist.rs @@ -51,7 +51,7 @@ impl DataTransferItemList { ) } - pub(crate) fn frozen_types(&self, cx: JSContext, retval: MutableHandleValue) { + pub(crate) fn frozen_types(&self, cx: JSContext, retval: MutableHandleValue, can_gc: CanGc) { self.frozen_types.get_or_init( || { self.data_store @@ -61,6 +61,7 @@ impl DataTransferItemList { }, cx, retval, + can_gc, ); } diff --git a/components/script/dom/extendablemessageevent.rs b/components/script/dom/extendablemessageevent.rs index 029762d4dae..63852928722 100644 --- a/components/script/dom/extendablemessageevent.rs +++ b/components/script/dom/extendablemessageevent.rs @@ -207,7 +207,7 @@ impl ExtendableMessageEventMethods<crate::DomTypeHolder> for ExtendableMessageEv } /// <https://w3c.github.io/ServiceWorker/#extendablemessage-event-ports> - fn Ports(&self, cx: JSContext, retval: MutableHandleValue) { + fn Ports(&self, cx: JSContext, can_gc: CanGc, retval: MutableHandleValue) { self.frozen_ports.get_or_init( || { self.ports @@ -217,6 +217,7 @@ impl ExtendableMessageEventMethods<crate::DomTypeHolder> for ExtendableMessageEv }, cx, retval, + can_gc, ); } } diff --git a/components/script/dom/gamepadhapticactuator.rs b/components/script/dom/gamepadhapticactuator.rs index fc8dbbd7add..d19db6d1279 100644 --- a/components/script/dom/gamepadhapticactuator.rs +++ b/components/script/dom/gamepadhapticactuator.rs @@ -126,8 +126,8 @@ impl GamepadHapticActuator { impl GamepadHapticActuatorMethods<crate::DomTypeHolder> for GamepadHapticActuator { /// <https://www.w3.org/TR/gamepad/#dom-gamepadhapticactuator-effects> - fn Effects(&self, cx: JSContext, retval: MutableHandleValue) { - to_frozen_array(self.effects.as_slice(), cx, retval) + fn Effects(&self, cx: JSContext, can_gc: CanGc, retval: MutableHandleValue) { + to_frozen_array(self.effects.as_slice(), cx, retval, can_gc) } /// <https://www.w3.org/TR/gamepad/#dom-gamepadhapticactuator-playeffect> diff --git a/components/script/dom/globalscope.rs b/components/script/dom/globalscope.rs index bea3e1c3357..88d56456686 100644 --- a/components/script/dom/globalscope.rs +++ b/components/script/dom/globalscope.rs @@ -2908,6 +2908,7 @@ impl GlobalScope { &self, cx: SafeJSContext, retval: MutableHandleValue, + can_gc: CanGc, ) { self.frozen_supported_performance_entry_types.get_or_init( || { @@ -2918,6 +2919,7 @@ impl GlobalScope { }, cx, retval, + can_gc, ); } diff --git a/components/script/dom/intersectionobserver.rs b/components/script/dom/intersectionobserver.rs index 95ede7780f9..81ac8a1337d 100644 --- a/components/script/dom/intersectionobserver.rs +++ b/components/script/dom/intersectionobserver.rs @@ -691,8 +691,8 @@ impl IntersectionObserverMethods<crate::DomTypeHolder> for IntersectionObserver /// > constructor, or the sequence is empty, the value of this attribute will be `[0]`. /// /// <https://w3c.github.io/IntersectionObserver/#dom-intersectionobserver-thresholds> - fn Thresholds(&self, context: JSContext, retval: MutableHandleValue) { - to_frozen_array(&self.thresholds.borrow(), context, retval); + fn Thresholds(&self, context: JSContext, can_gc: CanGc, retval: MutableHandleValue) { + to_frozen_array(&self.thresholds.borrow(), context, retval, can_gc); } /// > A number indicating the minimum delay in milliseconds between notifications from diff --git a/components/script/dom/messageevent.rs b/components/script/dom/messageevent.rs index de866425322..93e457ff049 100644 --- a/components/script/dom/messageevent.rs +++ b/components/script/dom/messageevent.rs @@ -302,7 +302,7 @@ impl MessageEventMethods<crate::DomTypeHolder> for MessageEvent { } /// <https://html.spec.whatwg.org/multipage/#dom-messageevent-ports> - fn Ports(&self, cx: JSContext, retval: MutableHandleValue) { + fn Ports(&self, cx: JSContext, can_gc: CanGc, retval: MutableHandleValue) { self.frozen_ports.get_or_init( || { self.ports @@ -313,6 +313,7 @@ impl MessageEventMethods<crate::DomTypeHolder> for MessageEvent { }, cx, retval, + can_gc, ); } diff --git a/components/script/dom/navigator.rs b/components/script/dom/navigator.rs index 492cb89fb0f..371ab0b1b9f 100644 --- a/components/script/dom/navigator.rs +++ b/components/script/dom/navigator.rs @@ -214,8 +214,8 @@ impl NavigatorMethods<crate::DomTypeHolder> for Navigator { // https://html.spec.whatwg.org/multipage/#dom-navigator-languages #[allow(unsafe_code)] - fn Languages(&self, cx: JSContext, retval: MutableHandleValue) { - to_frozen_array(&[self.Language()], cx, retval) + fn Languages(&self, cx: JSContext, can_gc: CanGc, retval: MutableHandleValue) { + to_frozen_array(&[self.Language()], cx, retval, can_gc) } // https://html.spec.whatwg.org/multipage/#dom-navigator-plugins diff --git a/components/script/dom/notification.rs b/components/script/dom/notification.rs index 7992cb459c3..197a79e9bfb 100644 --- a/components/script/dom/notification.rs +++ b/components/script/dom/notification.rs @@ -441,7 +441,7 @@ impl NotificationMethods<crate::DomTypeHolder> for Notification { retval.set(self.data.get()); } /// <https://notifications.spec.whatwg.org/#dom-notification-actions> - fn Actions(&self, cx: SafeJSContext, retval: MutableHandleValue) { + fn Actions(&self, cx: SafeJSContext, can_gc: CanGc, retval: MutableHandleValue) { // step 1: Let frozenActions be an empty list of type NotificationAction. let mut frozen_actions: Vec<NotificationAction> = Vec::new(); @@ -461,11 +461,11 @@ impl NotificationMethods<crate::DomTypeHolder> for Notification { } // step 3: Return the result of create a frozen array from frozenActions. - to_frozen_array(frozen_actions.as_slice(), cx, retval); + to_frozen_array(frozen_actions.as_slice(), cx, retval, can_gc); } /// <https://notifications.spec.whatwg.org/#dom-notification-vibrate> - fn Vibrate(&self, cx: SafeJSContext, retval: MutableHandleValue) { - to_frozen_array(self.vibration_pattern.as_slice(), cx, retval); + fn Vibrate(&self, cx: SafeJSContext, can_gc: CanGc, retval: MutableHandleValue) { + to_frozen_array(self.vibration_pattern.as_slice(), cx, retval, can_gc); } /// <https://notifications.spec.whatwg.org/#dom-notification-timestamp> fn Timestamp(&self) -> u64 { diff --git a/components/script/dom/performanceobserver.rs b/components/script/dom/performanceobserver.rs index 25c3f0139fc..397069dd028 100644 --- a/components/script/dom/performanceobserver.rs +++ b/components/script/dom/performanceobserver.rs @@ -141,10 +141,15 @@ impl PerformanceObserverMethods<crate::DomTypeHolder> for PerformanceObserver { } // https://w3c.github.io/performance-timeline/#supportedentrytypes-attribute - fn SupportedEntryTypes(cx: JSContext, global: &GlobalScope, retval: MutableHandleValue) { + fn SupportedEntryTypes( + cx: JSContext, + global: &GlobalScope, + can_gc: CanGc, + retval: MutableHandleValue, + ) { // While this is exposed through a method of PerformanceObserver, // it is specified as associated with the global scope. - global.supported_performance_entry_types(cx, retval) + global.supported_performance_entry_types(cx, retval, can_gc) } // https://w3c.github.io/performance-timeline/#dom-performanceobserver-observe() diff --git a/components/script/dom/resizeobserverentry.rs b/components/script/dom/resizeobserverentry.rs index 12157b226ad..8ac8d43dcbb 100644 --- a/components/script/dom/resizeobserverentry.rs +++ b/components/script/dom/resizeobserverentry.rs @@ -90,32 +90,37 @@ impl ResizeObserverEntryMethods<crate::DomTypeHolder> for ResizeObserverEntry { } /// <https://drafts.csswg.org/resize-observer/#dom-resizeobserverentry-borderboxsize> - fn BorderBoxSize(&self, cx: SafeJSContext, retval: MutableHandleValue) { + fn BorderBoxSize(&self, cx: SafeJSContext, can_gc: CanGc, retval: MutableHandleValue) { let sizes: Vec<DomRoot<ResizeObserverSize>> = self .border_box_size .iter() .map(|size| DomRoot::from_ref(&**size)) .collect(); - to_frozen_array(sizes.as_slice(), cx, retval) + to_frozen_array(sizes.as_slice(), cx, retval, can_gc); } /// <https://drafts.csswg.org/resize-observer/#dom-resizeobserverentry-contentboxsize> - fn ContentBoxSize(&self, cx: SafeJSContext, retval: MutableHandleValue) { + fn ContentBoxSize(&self, cx: SafeJSContext, can_gc: CanGc, retval: MutableHandleValue) { let sizes: Vec<DomRoot<ResizeObserverSize>> = self .content_box_size .iter() .map(|size| DomRoot::from_ref(&**size)) .collect(); - to_frozen_array(sizes.as_slice(), cx, retval); + to_frozen_array(sizes.as_slice(), cx, retval, can_gc); } /// <https://drafts.csswg.org/resize-observer/#dom-resizeobserverentry-devicepixelcontentboxsize> - fn DevicePixelContentBoxSize(&self, cx: SafeJSContext, retval: MutableHandleValue) { + fn DevicePixelContentBoxSize( + &self, + cx: SafeJSContext, + can_gc: CanGc, + retval: MutableHandleValue, + ) { let sizes: Vec<DomRoot<ResizeObserverSize>> = self .device_pixel_content_box_size .iter() .map(|size| DomRoot::from_ref(&**size)) .collect(); - to_frozen_array(sizes.as_slice(), cx, retval); + to_frozen_array(sizes.as_slice(), cx, retval, can_gc); } } diff --git a/components/script/dom/webgpu/gpucompilationinfo.rs b/components/script/dom/webgpu/gpucompilationinfo.rs index a2f0cc3ff89..ae092479f2b 100644 --- a/components/script/dom/webgpu/gpucompilationinfo.rs +++ b/components/script/dom/webgpu/gpucompilationinfo.rs @@ -57,7 +57,7 @@ impl GPUCompilationInfo { impl GPUCompilationInfoMethods<crate::DomTypeHolder> for GPUCompilationInfo { /// <https://gpuweb.github.io/gpuweb/#dom-gpucompilationinfo-messages> - fn Messages(&self, cx: JSContext, retval: MutableHandleValue) { - to_frozen_array(self.msg.as_slice(), cx, retval) + fn Messages(&self, cx: JSContext, can_gc: CanGc, retval: MutableHandleValue) { + to_frozen_array(self.msg.as_slice(), cx, retval, can_gc) } } diff --git a/components/script/dom/webxr/xrboundedreferencespace.rs b/components/script/dom/webxr/xrboundedreferencespace.rs index 6965ef3dc26..46c48c2494e 100644 --- a/components/script/dom/webxr/xrboundedreferencespace.rs +++ b/components/script/dom/webxr/xrboundedreferencespace.rs @@ -85,9 +85,9 @@ impl XRBoundedReferenceSpaceMethods<crate::DomTypeHolder> for XRBoundedReference }) .collect(); - to_frozen_array(&points, cx, retval) + to_frozen_array(&points, cx, retval, can_gc) } else { - to_frozen_array::<DomRoot<DOMPointReadOnly>>(&[], cx, retval) + to_frozen_array::<DomRoot<DOMPointReadOnly>>(&[], cx, retval, can_gc) } } } diff --git a/components/script/dom/webxr/xrinputsourceschangeevent.rs b/components/script/dom/webxr/xrinputsourceschangeevent.rs index e69d59c8529..6893a5e80ea 100644 --- a/components/script/dom/webxr/xrinputsourceschangeevent.rs +++ b/components/script/dom/webxr/xrinputsourceschangeevent.rs @@ -88,9 +88,9 @@ impl XRInputSourcesChangeEvent { let _ac = enter_realm(global); let cx = GlobalScope::get_cx(); rooted!(in(*cx) let mut frozen_val: JSVal); - to_frozen_array(added, cx, frozen_val.handle_mut()); + to_frozen_array(added, cx, frozen_val.handle_mut(), can_gc); changeevent.added.set(*frozen_val); - to_frozen_array(removed, cx, frozen_val.handle_mut()); + to_frozen_array(removed, cx, frozen_val.handle_mut(), can_gc); changeevent.removed.set(*frozen_val); changeevent } diff --git a/components/script/dom/webxr/xrrenderstate.rs b/components/script/dom/webxr/xrrenderstate.rs index 4cf263a9182..3f546c2353d 100644 --- a/components/script/dom/webxr/xrrenderstate.rs +++ b/components/script/dom/webxr/xrrenderstate.rs @@ -149,10 +149,10 @@ impl XRRenderStateMethods<crate::DomTypeHolder> for XRRenderState { } /// <https://immersive-web.github.io/layers/#dom-xrrenderstate-layers> - fn Layers(&self, cx: JSContext, retval: MutableHandleValue) { + fn Layers(&self, cx: JSContext, can_gc: CanGc, retval: MutableHandleValue) { // TODO: cache this array? let layers = self.layers.borrow(); let layers: Vec<&XRLayer> = layers.iter().map(|x| &**x).collect(); - to_frozen_array(&layers[..], cx, retval) + to_frozen_array(&layers[..], cx, retval, can_gc) } } diff --git a/components/script/dom/webxr/xrsession.rs b/components/script/dom/webxr/xrsession.rs index 31fe2ceb144..fb2a7f6c962 100644 --- a/components/script/dom/webxr/xrsession.rs +++ b/components/script/dom/webxr/xrsession.rs @@ -1006,10 +1006,10 @@ impl XRSessionMethods<crate::DomTypeHolder> for XRSession { } /// <https://www.w3.org/TR/webxr/#dom-xrsession-enabledfeatures> - fn EnabledFeatures(&self, cx: JSContext, retval: MutableHandleValue) { + fn EnabledFeatures(&self, cx: JSContext, can_gc: CanGc, retval: MutableHandleValue) { let session = self.session.borrow(); let features = session.granted_features(); - to_frozen_array(features, cx, retval) + to_frozen_array(features, cx, retval, can_gc) } /// <https://www.w3.org/TR/webxr/#dom-xrsession-issystemkeyboardsupported> diff --git a/components/script/dom/workernavigator.rs b/components/script/dom/workernavigator.rs index 1cbba5dcc89..1034381a287 100644 --- a/components/script/dom/workernavigator.rs +++ b/components/script/dom/workernavigator.rs @@ -100,8 +100,8 @@ impl WorkerNavigatorMethods<crate::DomTypeHolder> for WorkerNavigator { // https://html.spec.whatwg.org/multipage/#dom-navigator-languages #[allow(unsafe_code)] - fn Languages(&self, cx: JSContext, retval: MutableHandleValue) { - to_frozen_array(&[self.Language()], cx, retval) + fn Languages(&self, cx: JSContext, can_gc: CanGc, retval: MutableHandleValue) { + to_frozen_array(&[self.Language()], cx, retval, can_gc) } // https://w3c.github.io/permissions/#navigator-and-workernavigator-extension |