/
githubmirror
/
servo
Обзор
Документация
Войти
/
githubmirror
/
servo
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
components/script/dom/webgl/extensions/wrapper.rs
90 строк
3 KB
Tim van der Lippe
script: Pass `&mut JSContext` to `WebGLExtension::New` (#45838)
20 июн 2026, 11:24
Не верифицирован
20 июн 2026, 11:24
2914d38
Код
Авторство
О чём код?
/* 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 std::ptr::NonNull; use js::context::JSContext; use js::jsapi::JSObject; use malloc_size_of::MallocSizeOf; use script_bindings::reflector::DomObject; use super::{WebGLExtension, WebGLExtensionSpec, WebGLExtensions}; use crate::dom::bindings::root::MutNullableDom; use crate::dom::bindings::trace::JSTraceable; use crate::dom::webgl::webglrenderingcontext::WebGLRenderingContext; /// Trait used internally by WebGLExtensions to store and /// handle the different WebGL extensions in a common list. pub(crate) trait WebGLExtensionWrapper: JSTraceable + MallocSizeOf { fn instance_or_init( &self, cx: &mut JSContext, ctx: &WebGLRenderingContext, ext: &WebGLExtensions, ) -> NonNull<JSObject>; fn spec(&self) -> WebGLExtensionSpec; fn is_supported(&self, _: &WebGLExtensions) -> bool; fn is_enabled(&self) -> bool; fn enable(&self, ext: &WebGLExtensions); fn name(&self) -> &'static str; } #[cfg_attr(crown, crown::unrooted_must_root_lint::must_root)] #[derive(JSTraceable, MallocSizeOf)] pub(crate) struct TypedWebGLExtensionWrapper<T: WebGLExtension> { extension: MutNullableDom<T::Extension>, } /// Typed WebGL Extension implementation. /// Exposes the exact `MutNullableDom<DOMObject>` type defined by the extension. impl<T: WebGLExtension> TypedWebGLExtensionWrapper<T> { pub(crate) fn new() -> TypedWebGLExtensionWrapper<T> { TypedWebGLExtensionWrapper { extension: MutNullableDom::new(None), } } } impl<T> WebGLExtensionWrapper for TypedWebGLExtensionWrapper<T> where T: WebGLExtension + JSTraceable + MallocSizeOf + 'static, { #[expect(unsafe_code)] fn instance_or_init( &self, cx: &mut JSContext, ctx: &WebGLRenderingContext, ext: &WebGLExtensions, ) -> NonNull<JSObject> { let mut enabled = true; let extension = self.extension.or_init(|| { enabled = false; T::new(cx, ctx) }); if !enabled { self.enable(ext); } unsafe { NonNull::new_unchecked(extension.reflector().get_jsobject().get()) } } fn spec(&self) -> WebGLExtensionSpec { T::spec() } fn is_supported(&self, ext: &WebGLExtensions) -> bool { self.is_enabled() || T::is_supported(ext) } fn is_enabled(&self) -> bool { self.extension.get().is_some() } fn enable(&self, ext: &WebGLExtensions) { T::enable(ext); } fn name(&self) -> &'static str { T::name() } }