diff options
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/bindings/codegen/CodegenRust.py | 9 | ||||
-rw-r--r-- | components/script/dom/bindings/root.rs | 2 | ||||
-rw-r--r-- | components/script/dom/cssrulelist.rs | 5 | ||||
-rw-r--r-- | components/script/dom/element.rs | 9 | ||||
-rw-r--r-- | components/script/dom/htmlcanvaselement.rs | 4 | ||||
-rw-r--r-- | components/script/dom/htmlstyleelement.rs | 3 | ||||
-rw-r--r-- | components/script/dom/webgl2renderingcontext.rs | 23 | ||||
-rw-r--r-- | components/script/dom/webidls/WebGL2RenderingContext.webidl | 2 | ||||
-rw-r--r-- | components/script/dom/xrview.rs | 25 |
9 files changed, 59 insertions, 23 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index 3c9555ba659..021757a4ad1 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -3992,8 +3992,8 @@ class CGMemberJITInfo(CGThing): protoID: PrototypeList::ID::${name} as u16, }, __bindgen_anon_3: JSJitInfo__bindgen_ty_3 { depth: ${depth} }, - _bitfield_1: unsafe { - mem::transmute(new_jsjitinfo_bitfield_1!( + _bitfield_1: __BindgenBitfieldUnit::new( + new_jsjitinfo_bitfield_1!( JSJitInfo_OpType::${opType} as u8, JSJitInfo_AliasSet::${aliasSet} as u8, JSValueType::${returnType} as u8, @@ -4004,8 +4004,8 @@ class CGMemberJITInfo(CGThing): ${isLazilyCachedInSlot}, ${isTypedMethod}, ${slotIndex}, - )) - }, + ).to_ne_bytes() + ), } """, opName=opName, @@ -5988,6 +5988,7 @@ def generate_imports(config, cgthings, descriptors, callbacks=None, dictionaries 'js::error::throw_type_error', 'js::error::throw_internal_error', 'js::rust::wrappers::Call', + 'js::jsapi::__BindgenBitfieldUnit', 'js::jsapi::CallArgs', 'js::jsapi::CurrentGlobalOrNull', 'js::rust::wrappers::GetPropertyKeys', diff --git a/components/script/dom/bindings/root.rs b/components/script/dom/bindings/root.rs index 4f4d376e951..59f9b964564 100644 --- a/components/script/dom/bindings/root.rs +++ b/components/script/dom/bindings/root.rs @@ -383,7 +383,7 @@ where #[allow(unrooted_must_root)] pub unsafe fn from_box(value: Box<T>) -> Self { Self { - ptr: Box::into_raw_non_null(value), + ptr: Box::leak(value).into(), } } } diff --git a/components/script/dom/cssrulelist.rs b/components/script/dom/cssrulelist.rs index 18a41857923..812434fd180 100644 --- a/components/script/dom/cssrulelist.rs +++ b/components/script/dom/cssrulelist.rs @@ -17,7 +17,9 @@ use crate::stylesheet_loader::StylesheetLoader; use dom_struct::dom_struct; use servo_arc::Arc; use style::shared_lock::Locked; -use style::stylesheets::{CssRules, CssRulesHelpers, KeyframesRule, RulesMutateError}; +use style::stylesheets::{ + AllowImportRules, CssRules, CssRulesHelpers, KeyframesRule, RulesMutateError, +}; #[allow(unsafe_code)] unsafe_no_jsmanaged_fields!(RulesSource); @@ -116,6 +118,7 @@ impl CSSRuleList { index, nested, Some(&loader), + AllowImportRules::Yes, ) })?; diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 2fd6780cab0..baccc4e65aa 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -682,10 +682,7 @@ impl<'dom> LayoutElementHelpers<'dom> for LayoutDom<'dom, Element> { hints.push(from_declaration( shared_lock, PropertyDeclaration::BackgroundImage(background_image::SpecifiedValue( - vec![specified::ImageLayer::Image(specified::Image::for_cascade( - url.into(), - ))] - .into(), + vec![specified::Image::for_cascade(url.into())].into(), )), )); } @@ -3164,10 +3161,6 @@ impl<'a> SelectorsElement for DomRoot<Element> { false } - fn exported_part(&self, _: &Atom) -> Option<Atom> { - None - } - fn imported_part(&self, _: &Atom) -> Option<Atom> { None } diff --git a/components/script/dom/htmlcanvaselement.rs b/components/script/dom/htmlcanvaselement.rs index b4118e234c3..9e04585168c 100644 --- a/components/script/dom/htmlcanvaselement.rs +++ b/components/script/dom/htmlcanvaselement.rs @@ -41,7 +41,6 @@ use js::error::throw_type_error; use js::rust::HandleValue; use profile_traits::ipc; use script_layout_interface::{HTMLCanvasData, HTMLCanvasDataSource}; -use servo_config::pref; use style::attr::{AttrValue, LengthOrPercentageOrAuto}; const DEFAULT_WIDTH: u32 = 300; @@ -222,7 +221,8 @@ impl HTMLCanvasElement { cx: JSContext, options: HandleValue, ) -> Option<DomRoot<WebGL2RenderingContext>> { - if !pref!(dom.webgl2.enabled) { + if !WebGL2RenderingContext::is_webgl2_enabled(cx, self.global().reflector().get_jsobject()) + { return None; } if let Some(ctx) = self.context() { diff --git a/components/script/dom/htmlstyleelement.rs b/components/script/dom/htmlstyleelement.rs index afa99d8d86b..6d10b0838f7 100644 --- a/components/script/dom/htmlstyleelement.rs +++ b/components/script/dom/htmlstyleelement.rs @@ -26,7 +26,7 @@ use servo_arc::Arc; use std::cell::Cell; use style::media_queries::MediaList; use style::parser::ParserContext as CssParserContext; -use style::stylesheets::{CssRuleType, Origin, Stylesheet}; +use style::stylesheets::{AllowImportRules, CssRuleType, Origin, Stylesheet}; use style_traits::ParsingMode; #[dom_struct] @@ -119,6 +119,7 @@ impl HTMLStyleElement { css_error_reporter, doc.quirks_mode(), self.line_number as u32, + AllowImportRules::Yes, ); let sheet = Arc::new(sheet); diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 62af18d1002..8e967fbcb86 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -16,6 +16,7 @@ use crate::dom::bindings::reflector::DomObject; use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; use crate::dom::bindings::root::{Dom, DomRoot, LayoutDom, MutNullableDom}; use crate::dom::bindings::str::DOMString; +use crate::dom::globalscope::GlobalScope; use crate::dom::htmlcanvaselement::HTMLCanvasElement; use crate::dom::htmliframeelement::HTMLIFrameElement; use crate::dom::webglactiveinfo::WebGLActiveInfo; @@ -50,12 +51,14 @@ use ipc_channel::ipc; use js::jsapi::{JSObject, Type}; use js::jsval::{BooleanValue, DoubleValue, Int32Value, UInt32Value}; use js::jsval::{JSVal, NullValue, ObjectValue, UndefinedValue}; -use js::rust::CustomAutoRooterGuard; +use js::rust::{CustomAutoRooterGuard, HandleObject}; use js::typedarray::{ArrayBufferView, CreateWith, Float32, Int32Array, Uint32, Uint32Array}; use script_layout_interface::HTMLCanvasDataSource; +use servo_config::pref; use std::cell::Cell; use std::cmp; use std::ptr::{self, NonNull}; +use url::Host; #[unrooted_must_root_lint::must_root] #[derive(JSTraceable, MallocSizeOf)] @@ -178,8 +181,26 @@ impl WebGL2RenderingContext { WebGL2RenderingContext::new_inherited(window, canvas, size, attrs) .map(|ctx| reflect_dom_object(Box::new(ctx), window)) } + + #[allow(unsafe_code)] + pub fn is_webgl2_enabled(_cx: JSContext, global: HandleObject) -> bool { + if pref!(dom.webgl2.enabled) { + return true; + } + + let global = unsafe { GlobalScope::from_object(global.get()) }; + let origin = global.origin(); + let host = origin.host(); + WEBGL2_ORIGINS + .iter() + .any(|origin| host == Host::parse(origin).ok().as_ref()) + } } +/// List of domains for which WebGL 2 is enabled automatically, regardless +/// of the status of the dom.webgl2.enabled preference. +static WEBGL2_ORIGINS: &[&str] = &["www.servoexperiments.com"]; + impl WebGL2RenderingContext { pub fn recreate(&self, size: Size2D<u32>) { self.base.recreate(size) diff --git a/components/script/dom/webidls/WebGL2RenderingContext.webidl b/components/script/dom/webidls/WebGL2RenderingContext.webidl index e7f94cb9a3c..f6278370cce 100644 --- a/components/script/dom/webidls/WebGL2RenderingContext.webidl +++ b/components/script/dom/webidls/WebGL2RenderingContext.webidl @@ -542,7 +542,7 @@ interface mixin WebGL2RenderingContextBase void bindVertexArray(WebGLVertexArrayObject? array); }; -[Exposed=Window, Pref="dom.webgl2.enabled"] +[Exposed=Window, Func="WebGL2RenderingContext::is_webgl2_enabled"] interface WebGL2RenderingContext { }; diff --git a/components/script/dom/xrview.rs b/components/script/dom/xrview.rs index 14309dfc99c..8aa0b0adc58 100644 --- a/components/script/dom/xrview.rs +++ b/components/script/dom/xrview.rs @@ -3,6 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use crate::dom::bindings::codegen::Bindings::XRViewBinding::{XREye, XRViewMethods}; +use crate::dom::bindings::reflector::DomObject; use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::utils::create_typed_array; @@ -24,17 +25,24 @@ pub struct XRView { proj: Heap<*mut JSObject>, #[ignore_malloc_size_of = "mozjs"] view: Heap<*mut JSObject>, + proj_array: Vec<f32>, transform: Dom<XRRigidTransform>, } impl XRView { - fn new_inherited(session: &XRSession, transform: &XRRigidTransform, eye: XREye) -> XRView { + fn new_inherited( + session: &XRSession, + transform: &XRRigidTransform, + eye: XREye, + proj_array: Vec<f32>, + ) -> XRView { XRView { reflector_: Reflector::new(), session: Dom::from_ref(session), eye, proj: Heap::default(), view: Heap::default(), + proj_array, transform: Dom::from_ref(transform), } } @@ -55,13 +63,18 @@ impl XRView { let transform = pose.pre_transform(&offset); let transform = XRRigidTransform::new(global, cast_transform(transform)); + // row_major since euclid uses row vectors + let proj = view.projection.to_row_major_array(); let ret = reflect_dom_object( - Box::new(XRView::new_inherited(session, &transform, eye)), + Box::new(XRView::new_inherited( + session, + &transform, + eye, + (&proj).to_vec(), + )), global, ); - // row_major since euclid uses row vectors - let proj = view.projection.to_row_major_array(); let cx = global.get_cx(); create_typed_array(cx, &proj, &ret.proj); ret @@ -80,6 +93,10 @@ impl XRViewMethods for XRView { /// https://immersive-web.github.io/webxr/#dom-xrview-projectionmatrix fn ProjectionMatrix(&self, _cx: JSContext) -> NonNull<JSObject> { + if self.proj.get().is_null() { + let cx = self.global().get_cx(); + create_typed_array(cx, &self.proj_array, &self.proj); + } NonNull::new(self.proj.get()).unwrap() } |