Files
servo/components/script/dom/webgpu/gpurenderbundle.rs
Domenico Rizzo bff59c629a script: Refactors GPURenderBundle's drop implementation. (#42982)
Moves the `Drop` logic for `GPURenderBundle` into a dedicated helper
struct, `DroppableGPURenderBundle`. This change ensures that
`GPURenderBundle` itself does not directly implement `Drop`, aligning
with the policy to prevent direct `Drop` implementations on DOM types.

Removes the `allowDropImpl` configuration for `GPURenderBundle` from
script bindings.

Testing: WebGPU tests cover all related cases
Fixes: Partially #26488

Signed-off-by: Domenico Rizzo <domenico.rizzo@gmail.com>
2026-03-03 11:59:34 +00:00

104 lines
2.8 KiB
Rust

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
use dom_struct::dom_struct;
use webgpu_traits::{WebGPU, WebGPUDevice, WebGPURenderBundle, WebGPURequest};
use crate::dom::bindings::cell::DomRefCell;
use crate::dom::bindings::codegen::Bindings::WebGPUBinding::GPURenderBundleMethods;
use crate::dom::bindings::reflector::{Reflector, reflect_dom_object};
use crate::dom::bindings::root::DomRoot;
use crate::dom::bindings::str::USVString;
use crate::dom::globalscope::GlobalScope;
use crate::script_runtime::CanGc;
#[derive(JSTraceable, MallocSizeOf)]
struct DroppableGPURenderBundle {
#[no_trace]
channel: WebGPU,
#[no_trace]
render_bundle: WebGPURenderBundle,
}
impl Drop for DroppableGPURenderBundle {
fn drop(&mut self) {
if let Err(e) = self
.channel
.0
.send(WebGPURequest::DropRenderBundle(self.render_bundle.0))
{
warn!(
"Failed to send DropRenderBundle ({:?}) ({})",
self.render_bundle.0, e
);
}
}
}
#[dom_struct]
pub(crate) struct GPURenderBundle {
reflector_: Reflector,
#[no_trace]
device: WebGPUDevice,
label: DomRefCell<USVString>,
droppable: DroppableGPURenderBundle,
}
impl GPURenderBundle {
fn new_inherited(
render_bundle: WebGPURenderBundle,
device: WebGPUDevice,
channel: WebGPU,
label: USVString,
) -> Self {
Self {
reflector_: Reflector::new(),
device,
label: DomRefCell::new(label),
droppable: DroppableGPURenderBundle {
channel,
render_bundle,
},
}
}
pub(crate) fn new(
global: &GlobalScope,
render_bundle: WebGPURenderBundle,
device: WebGPUDevice,
channel: WebGPU,
label: USVString,
can_gc: CanGc,
) -> DomRoot<Self> {
reflect_dom_object(
Box::new(GPURenderBundle::new_inherited(
render_bundle,
device,
channel,
label,
)),
global,
can_gc,
)
}
}
impl GPURenderBundle {
pub(crate) fn id(&self) -> WebGPURenderBundle {
self.droppable.render_bundle
}
}
impl GPURenderBundleMethods<crate::DomTypeHolder> for GPURenderBundle {
/// <https://gpuweb.github.io/gpuweb/#dom-gpuobjectbase-label>
fn Label(&self) -> USVString {
self.label.borrow().clone()
}
/// <https://gpuweb.github.io/gpuweb/#dom-gpuobjectbase-label>
fn SetLabel(&self, value: USVString) {
*self.label.borrow_mut() = value;
}
}