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( 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 for CSSLayerStatementRule { /// - fn NameList(&self, cx: SafeJSContext, retval: MutableHandleValue) { + fn NameList(&self, cx: SafeJSContext, can_gc: CanGc, retval: MutableHandleValue) { let names: Vec = 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 for DataTransfer { } /// - 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); } /// 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 for ExtendableMessageEv } /// - 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 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 for GamepadHapticActuator { /// - 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) } /// 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 for IntersectionObserver /// > constructor, or the sequence is empty, the value of this attribute will be `[0]`. /// /// - 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 for MessageEvent { } /// - 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 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 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 for Notification { retval.set(self.data.get()); } /// - 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 = Vec::new(); @@ -461,11 +461,11 @@ impl NotificationMethods 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); } /// - 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); } /// 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 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 for ResizeObserverEntry { } /// - fn BorderBoxSize(&self, cx: SafeJSContext, retval: MutableHandleValue) { + fn BorderBoxSize(&self, cx: SafeJSContext, can_gc: CanGc, retval: MutableHandleValue) { let sizes: Vec> = 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); } /// - fn ContentBoxSize(&self, cx: SafeJSContext, retval: MutableHandleValue) { + fn ContentBoxSize(&self, cx: SafeJSContext, can_gc: CanGc, retval: MutableHandleValue) { let sizes: Vec> = 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); } /// - fn DevicePixelContentBoxSize(&self, cx: SafeJSContext, retval: MutableHandleValue) { + fn DevicePixelContentBoxSize( + &self, + cx: SafeJSContext, + can_gc: CanGc, + retval: MutableHandleValue, + ) { let sizes: Vec> = 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 for GPUCompilationInfo { /// - 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 for XRBoundedReference }) .collect(); - to_frozen_array(&points, cx, retval) + to_frozen_array(&points, cx, retval, can_gc) } else { - to_frozen_array::>(&[], cx, retval) + to_frozen_array::>(&[], 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 for XRRenderState { } /// - 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 for XRSession { } /// - 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) } /// 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 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 diff --git a/components/script_bindings/codegen/Bindings.conf b/components/script_bindings/codegen/Bindings.conf index a6adf7e45df..1cd8616f194 100644 --- a/components/script_bindings/codegen/Bindings.conf +++ b/components/script_bindings/codegen/Bindings.conf @@ -99,6 +99,10 @@ DOMInterfaces = { 'canGc': ['AppendRule', 'CssRules', 'DeleteRule', 'FindRule'], }, +'CSSLayerStatementRule': { + 'canGc': ['NameList'], +}, + 'CSSMediaRule': { 'canGc': ['Media'], }, @@ -121,7 +125,7 @@ DOMInterfaces = { }, 'DataTransfer': { - 'canGc': ['Files'] + 'canGc': ['Files', 'Types'] }, 'DataTransferItem': { @@ -201,6 +205,10 @@ DOMInterfaces = { 'canGc': ['DispatchEvent'], }, +'ExtendableMessageEvent': { + 'canGc': ['Ports'], +}, + 'FakeXRDevice': { 'canGc': ['Disconnect'], }, @@ -224,7 +232,7 @@ DOMInterfaces = { 'GamepadHapticActuator': { 'inRealms': ['PlayEffect', 'Reset'], - 'canGc': ['PlayEffect', 'Reset'], + 'canGc': ['PlayEffect', 'Reset', 'Effects'], }, 'GlobalScope': { @@ -250,6 +258,10 @@ DOMInterfaces = { 'weakReferenceable': True, }, +'GPUCompilationInfo': { + 'canGc': ['Messages'], +}, + 'GPUDevice': { 'inRealms': [ 'CreateComputePipelineAsync', @@ -387,6 +399,10 @@ DOMInterfaces = { 'canGc': ['SetText'] }, +'IntersectionObserver': { + 'canGc': ['Thresholds'] +}, + 'Location': { 'canGc': ['Assign', 'Reload', 'Replace', 'SetHash', 'SetHost', 'SetHostname', 'SetHref', 'SetPathname', 'SetPort', 'SetProtocol', 'SetSearch'], }, @@ -413,6 +429,10 @@ DOMInterfaces = { 'canGc': ['GetOnmessage'], }, +'MessageEvent': { + 'canGc': ['Ports'], +}, + 'MouseEvent': { 'canGc': ['OffsetX', 'OffsetY'], }, @@ -424,6 +444,7 @@ DOMInterfaces = { 'Navigator': { 'inRealms': ['GetVRDisplays'], + 'canGc': ['Languages'], }, 'Node': { @@ -435,7 +456,7 @@ DOMInterfaces = { }, 'Notification': { - 'canGc': ['RequestPermission'], + 'canGc': ['RequestPermission', 'Actions', 'Vibrate'], }, 'OfflineAudioContext': { @@ -459,6 +480,10 @@ DOMInterfaces = { 'canGc': ['Mark', 'Measure'], }, +'PerformanceObserver': { + 'canGc': ['SupportedEntryTypes'], +}, + 'Permissions': { 'canGc': ['Query', 'Request', 'Revoke'], }, @@ -609,13 +634,17 @@ DOMInterfaces = { 'canGc': ['GetOffsetReferenceSpace'], }, +'XRRenderState': { + 'canGc': ['Layers'], +}, + 'XRRigidTransform': { 'canGc': ['Position', 'Orientation', 'Inverse', 'Matrix'], }, 'XRSession': { 'inRealms': ['RequestReferenceSpace', 'UpdateRenderState', 'UpdateTargetFrameRate'], - 'canGc': ['End', 'RequestReferenceSpace', 'UpdateTargetFrameRate', 'RequestHitTestSource', 'GetSupportedFrameRates'], + 'canGc': ['End', 'RequestReferenceSpace', 'UpdateTargetFrameRate', 'RequestHitTestSource', 'GetSupportedFrameRates', 'EnabledFeatures'], }, 'XRSystem': { @@ -656,6 +685,10 @@ DOMInterfaces = { "canGc": ["Cancel", "Read", "ReleaseLock"] }, +'ResizeObserverEntry': { + 'canGc': ['BorderBoxSize', 'ContentBoxSize', 'DevicePixelContentBoxSize'], +}, + 'WritableStream': { 'canGc': ['Abort', 'Close', 'GetWriter'], 'inRealms': ['Abort', 'Close', 'GetWriter'], @@ -671,6 +704,10 @@ DOMInterfaces = { 'inRealms': ['Abort', 'Close', 'Write'], }, +'WorkerNavigator': { + 'canGc': ['Languages'], +}, + } Dictionaries = {