aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/bindings/codegen/CodegenRust.py9
-rw-r--r--components/script/dom/bindings/root.rs2
-rw-r--r--components/script/dom/cssrulelist.rs5
-rw-r--r--components/script/dom/element.rs9
-rw-r--r--components/script/dom/htmlcanvaselement.rs4
-rw-r--r--components/script/dom/htmlstyleelement.rs3
-rw-r--r--components/script/dom/webgl2renderingcontext.rs23
-rw-r--r--components/script/dom/webidls/WebGL2RenderingContext.webidl2
-rw-r--r--components/script/dom/xrview.rs25
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()
}