diff --git a/Cargo.lock b/Cargo.lock index 3d7fd60b335..b0dad9061b5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -302,15 +302,13 @@ dependencies = [ [[package]] name = "bindgen" -version = "0.58.1" +version = "0.62.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f8523b410d7187a43085e7e064416ea32ded16bd0a4e6fc025e21616d01258f" +checksum = "c6720a8b7b2d39dd533285ed438d458f65b31b5c257e6ac7bb3d7e82844dd722" dependencies = [ "bitflags", "cexpr", "clang-sys", - "clap", - "env_logger", "lazy_static", "lazycell", "log", @@ -320,6 +318,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", + "syn", "which", ] @@ -672,11 +671,11 @@ checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" [[package]] name = "cexpr" -version = "0.4.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4aedb84272dbe89af497cf81375129abda4fc0a9e7c5d317498c15cc30c0d27" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" dependencies = [ - "nom 5.1.2", + "nom", ] [[package]] @@ -3924,7 +3923,7 @@ dependencies = [ [[package]] name = "mozjs" version = "0.14.1" -source = "git+https://github.com/servo/rust-mozjs#a10ab915532bb3e334e564364ed3630561bccacb" +source = "git+https://github.com/servo/mozjs#f87705d61015bf1646b33f33664da51f31b23b74" dependencies = [ "cc", "lazy_static", @@ -3937,7 +3936,7 @@ dependencies = [ [[package]] name = "mozjs_sys" version = "0.68.2" -source = "git+https://github.com/servo/mozjs?rev=72ce2c95d24b225e3c87364608822b498b2312fb#72ce2c95d24b225e3c87364608822b498b2312fb" +source = "git+https://github.com/servo/mozjs#f87705d61015bf1646b33f33664da51f31b23b74" dependencies = [ "bindgen", "cc", @@ -4216,16 +4215,6 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" -[[package]] -name = "nom" -version = "5.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af" -dependencies = [ - "memchr", - "version_check", -] - [[package]] name = "nom" version = "7.1.1" @@ -4932,11 +4921,11 @@ checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" [[package]] name = "proc-macro2" -version = "1.0.37" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec757218438d5fda206afc041538b2f6d889286160d649a86a24d37e1235afd1" +checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] @@ -5209,9 +5198,9 @@ checksum = "2b5ceb840e4009da4841ed22a15eb49f64fdd00a2138945c5beacf506b2fb5ed" [[package]] name = "regex" -version = "1.4.5" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "957056ecddbeba1b26965114e191d2e8589ce74db242b6ea25fc4062427a5c19" +checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a" dependencies = [ "aho-corasick", "memchr", @@ -5220,9 +5209,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.23" +version = "0.6.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5f089152e60f62d28b835fbff2cd2e8dc0baf1ac13343bef92ab7eed84548" +checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" [[package]] name = "remove_dir_all" @@ -6452,13 +6441,13 @@ checksum = "e454d048db5527d000bfddb77bd072bbf3a1e2ae785f16d9bd116e07c2ab45eb" [[package]] name = "syn" -version = "1.0.67" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6498a9efc342871f91cc2d0d694c674368b4ceb40f62b65a7a08c3792935e702" +checksum = "a864042229133ada95abf3b54fdc62ef5ccabe9515b64717bcb9a1919e59445d" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] @@ -6939,6 +6928,12 @@ dependencies = [ "serde", ] +[[package]] +name = "unicode-ident" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" + [[package]] name = "unicode-normalization" version = "0.1.17" @@ -7400,7 +7395,7 @@ dependencies = [ [[package]] name = "webxr" version = "0.0.1" -source = "git+https://github.com/servo/webxr#af2e84a28d52521212816584e0553aaf364a9162" +source = "git+https://github.com/servo/webxr#4eb957ac4f0e22ac5baded31eb86eea32862d687" dependencies = [ "android_injected_glue", "bindgen", @@ -7423,7 +7418,7 @@ dependencies = [ [[package]] name = "webxr-api" version = "0.0.1" -source = "git+https://github.com/servo/webxr#af2e84a28d52521212816584e0553aaf364a9162" +source = "git+https://github.com/servo/webxr#4eb957ac4f0e22ac5baded31eb86eea32862d687" dependencies = [ "euclid", "ipc-channel", @@ -7477,11 +7472,13 @@ dependencies = [ [[package]] name = "which" -version = "3.1.1" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d011071ae14a2f6671d0b74080ae0cd8ebf3a6f8c9589a2cd45f23126fe29724" +checksum = "1c831fbbee9e129a8cf93e7747a82da9d95ba8e16621cae60ec2cdc849bacb7b" dependencies = [ + "either", "libc", + "once_cell", ] [[package]] @@ -7679,7 +7676,7 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "463705a63313cd4301184381c5e8042f0a7e9b4bb63653f216311d4ae74690b7" dependencies = [ - "nom 7.1.1", + "nom", ] [[package]] diff --git a/components/script/Cargo.toml b/components/script/Cargo.toml index 85b566c0580..b6aabb0d88d 100644 --- a/components/script/Cargo.toml +++ b/components/script/Cargo.toml @@ -62,7 +62,7 @@ image = "0.24" indexmap = { version = "1.0.2", features = ["std"] } ipc-channel = "0.14" itertools = "0.8" -js = { package = "mozjs", git = "https://github.com/servo/rust-mozjs" } +js = { package = "mozjs", git = "https://github.com/servo/mozjs" } jstraceable_derive = { path = "../jstraceable_derive" } keyboard-types = "0.6" lazy_static = "1" diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index 046f7984858..1242de82fa1 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -1886,7 +1886,7 @@ class AttrDefiner(PropertyDefiner): "name": m.identifier.name, "attr": m, "flags": "JSPROP_ENUMERATE", - "is_accessor": "true", + "kind": "JSPropertySpec_Kind::NativeAccessor", } for m in descriptor.interface.members if m.isAttr() and m.isStatic() == static @@ -1906,7 +1906,7 @@ class AttrDefiner(PropertyDefiner): "name": "@@toStringTag", "attr": None, "flags": "JSPROP_READONLY", - "is_accessor": "false", + "kind": "JSPropertySpec_Kind::Value", }) def generateArray(self, array, name): @@ -1963,13 +1963,13 @@ class AttrDefiner(PropertyDefiner): def specData(attr): if attr["name"] == "@@toStringTag": - return (attr["name"][2:], attr["flags"], attr["is_accessor"], + return (attr["name"][2:], attr["flags"], attr["kind"], str_to_const_array(self.descriptor.interface.getClassName())) flags = attr["flags"] if self.unforgeable: flags += " | JSPROP_PERMANENT" - return (str_to_const_array(attr["attr"].identifier.name), flags, attr["is_accessor"], getter(attr), + return (str_to_const_array(attr["attr"].identifier.name), flags, attr["kind"], getter(attr), setter(attr)) def template(m): @@ -1977,7 +1977,7 @@ class AttrDefiner(PropertyDefiner): return """ JSPropertySpec { name: JSPropertySpec_Name { symbol_: SymbolCode::%s as usize + 1 }, attributes_: (%s) as u8, - isAccessor_: (%s), + kind_: (%s), u: JSPropertySpec_AccessorsOrValue { value: JSPropertySpec_ValueWrapper { type_: JSPropertySpec_ValueWrapper_Type::String, @@ -1991,7 +1991,7 @@ class AttrDefiner(PropertyDefiner): return """ JSPropertySpec { name: JSPropertySpec_Name { string_: %s as *const u8 as *const libc::c_char }, attributes_: (%s) as u8, - isAccessor_: (%s), + kind_: (%s), u: JSPropertySpec_AccessorsOrValue { accessors: JSPropertySpec_AccessorsOrValue_Accessors { getter: JSPropertySpec_Accessor { @@ -2361,7 +2361,6 @@ static CLASS_OPS: js::jsapi::JSClassOps = js::jsapi::JSClassOps { mayResolve: None, finalize: Some(%(finalizeHook)s), call: None, - hasInstance: None, construct: None, trace: Some(%(traceHook)s), }; @@ -3620,7 +3619,6 @@ let traps = ProxyTraps { hasOwn: Some(hasOwn), getOwnEnumerablePropertyKeys: Some(%(getOwnEnumerablePropertyKeys)s), nativeCall: None, - hasInstance: None, objectClassIs: None, className: Some(className), fun_toString: None, @@ -5368,7 +5366,7 @@ class CGProxySpecialOperation(CGPerSignatureCall): } self.cgRoot.prepend(instantiateJSToNativeConversionTemplate( template, templateValues, declType, argument.identifier.name)) - self.cgRoot.prepend(CGGeneric("rooted!(in(*cx) let value = desc.value);")) + self.cgRoot.prepend(CGGeneric("rooted!(in(*cx) let value = desc.value_);")) def getArguments(self): args = [(a, process_arg(a.identifier.name, a)) for a in self.arguments] @@ -5471,7 +5469,8 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(CGAbstractExternMethod): def __init__(self, descriptor): args = [Argument('*mut JSContext', 'cx'), Argument('RawHandleObject', 'proxy'), Argument('RawHandleId', 'id'), - Argument('RawMutableHandle', 'mut desc')] + Argument('RawMutableHandle', 'mut desc'), + Argument('*mut bool', 'is_none')] CGAbstractExternMethod.__init__(self, descriptor, "getOwnPropertyDescriptor", "bool", args) self.descriptor = descriptor @@ -5487,12 +5486,12 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(CGAbstractExternMethod): """ if !proxyhandler::is_platform_object_same_origin(cx, proxy) { if !proxyhandler::cross_origin_get_own_property_helper( - cx, proxy, &CROSS_ORIGIN_PROPERTIES, id, desc + cx, proxy, &CROSS_ORIGIN_PROPERTIES, id, desc, &mut *is_none ) { return false; } - if desc.obj.is_null() { - return proxyhandler::cross_origin_property_fallback(cx, proxy, id, desc); + if *is_none { + return proxyhandler::cross_origin_property_fallback(cx, proxy, id, desc, &mut *is_none); } return true; } @@ -5507,8 +5506,12 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(CGAbstractExternMethod): attrs = "JSPROP_ENUMERATE" if self.descriptor.operations['IndexedSetter'] is None: attrs += " | JSPROP_READONLY" - fillDescriptor = ("desc.value = result_root.get();\n" - "fill_property_descriptor(MutableHandle::from_raw(desc), proxy.get(), (%s) as u32);\n" + fillDescriptor = ("set_property_descriptor(\n" + " MutableHandle::from_raw(desc),\n" + " result_root.handle(),\n" + " (%s) as u32,\n" + " &mut *is_none\n" + ");\n" "return true;" % attrs) templateValues = { 'jsvalRef': 'result_root.handle_mut()', @@ -5532,8 +5535,12 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(CGAbstractExternMethod): attrs = " | ".join(attrs) else: attrs = "0" - fillDescriptor = ("desc.value = result_root.get();\n" - "fill_property_descriptor(MutableHandle::from_raw(desc), proxy.get(), (%s) as u32);\n" + fillDescriptor = ("set_property_descriptor(\n" + " MutableHandle::from_raw(desc),\n" + " result_root.handle(),\n" + " (%s) as u32,\n" + " &mut *is_none\n" + ");\n" "return true;" % attrs) templateValues = { 'jsvalRef': 'result_root.handle_mut()', @@ -5542,7 +5549,7 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(CGAbstractExternMethod): } # See the similar-looking in CGDOMJSProxyHandler_get for the spec quote. - condition = "RUST_JSID_IS_STRING(id) || RUST_JSID_IS_INT(id)" + condition = "id.is_string() || id.is_int()" if indexedGetter: condition = "index.is_none() && (%s)" % condition # Once we start supporting OverrideBuiltins we need to make @@ -5569,17 +5576,16 @@ get_expando_object(proxy, expando.handle_mut()); let proxy_lt = Handle::from_raw(proxy); let id_lt = Handle::from_raw(id); if !expando.is_null() { - if !JS_GetPropertyDescriptorById(*cx, expando.handle().into(), id, desc) { + rooted!(in(*cx) let mut ignored = ptr::null_mut::()); + if !JS_GetPropertyDescriptorById(*cx, expando.handle().into(), id, desc, ignored.handle_mut().into(), is_none) { return false; } - if !desc.obj.is_null() { + if !*is_none { // Pretend the property lives on the wrapper. - desc.obj = proxy.get(); return true; } } """ + namedGet + """\ -desc.obj = ptr::null_mut(); return true;""" def definition_body(self): @@ -5628,12 +5634,12 @@ class CGDOMJSProxyHandler_defineProperty(CGAbstractExternMethod): if self.descriptor.hasUnforgeableMembers: raise TypeError("Can't handle a named setter on an interface that has " "unforgeables. Figure out how that should work!") - set += ("if RUST_JSID_IS_STRING(id) || RUST_JSID_IS_INT(id) {\n" + set += ("if id.is_string() || id.is_int() {\n" + CGIndenter(CGProxyNamedSetter(self.descriptor)).define() + " return (*opresult).succeed();\n" + "}\n") elif self.descriptor.operations['NamedGetter']: - set += ("if RUST_JSID_IS_STRING(id) || RUST_JSID_IS_INT(id) {\n" + set += ("if id.is_string() || id.is_int() {\n" + CGIndenter(CGProxyNamedGetter(self.descriptor)).define() + " if result.is_some() {\n" " return (*opresult).failNoNamedSetter();\n" @@ -5839,7 +5845,7 @@ class CGDOMJSProxyHandler_hasOwn(CGAbstractExternMethod): + "}\n\n") namedGetter = self.descriptor.operations['NamedGetter'] - condition = "RUST_JSID_IS_STRING(id) || RUST_JSID_IS_INT(id)" + condition = "id.is_string() || id.is_int()" if indexedGetter: condition = "index.is_none() && (%s)" % condition if namedGetter: @@ -5939,7 +5945,7 @@ if !expando.is_null() { namedGetter = self.descriptor.operations['NamedGetter'] if namedGetter: - condition = "RUST_JSID_IS_STRING(id) || RUST_JSID_IS_INT(id)" + condition = "id.is_string() || id.is_int()" # From step 1: # If O supports indexed properties and P is an array index, then: # @@ -6139,7 +6145,7 @@ class CGClassFinalizeHook(CGAbstractClassHook): A hook for finalize, used to release our native object. """ def __init__(self, descriptor): - args = [Argument('*mut JSFreeOp', '_fop'), Argument('*mut JSObject', 'obj')] + args = [Argument('*mut GCContext', '_cx'), Argument('*mut JSObject', 'obj')] CGAbstractClassHook.__init__(self, descriptor, FINALIZE_HOOK_NAME, 'void', args) @@ -6302,6 +6308,7 @@ def generate_imports(config, cgthings, descriptors, callbacks=None, dictionaries 'js::jsapi::CallArgs', 'js::jsapi::CurrentGlobalOrNull', 'js::rust::wrappers::GetPropertyKeys', + 'js::jsapi::GCContext', 'js::jsapi::GetWellKnownSymbol', 'js::rust::Handle', 'js::jsapi::Handle as RawHandle', @@ -6320,7 +6327,6 @@ def generate_imports(config, cgthings, descriptors, callbacks=None, dictionaries 'js::jsapi::JSCLASS_RESERVED_SLOTS_SHIFT', 'js::jsapi::JSClass', 'js::jsapi::JSContext', - 'js::jsapi::JSFreeOp', 'js::jsapi::JSFunctionSpec', 'js::jsapi::JSITER_HIDDEN', 'js::jsapi::JSITER_OWNONLY', @@ -6345,6 +6351,7 @@ def generate_imports(config, cgthings, descriptors, callbacks=None, dictionaries 'js::jsapi::JSPropertySpec_Accessor', 'js::jsapi::JSPropertySpec_AccessorsOrValue', 'js::jsapi::JSPropertySpec_AccessorsOrValue_Accessors', + 'js::jsapi::JSPropertySpec_Kind', 'js::jsapi::JSPropertySpec_Name', 'js::jsapi::JSPropertySpec_ValueWrapper', 'js::jsapi::JSPropertySpec_ValueWrapper_Type', @@ -6414,8 +6421,6 @@ def generate_imports(config, cgthings, descriptors, callbacks=None, dictionaries 'js::glue::SetProxyReservedSlot', 'js::rust::wrappers::NewProxyObject', 'js::glue::ProxyTraps', - 'js::glue::RUST_JSID_IS_INT', - 'js::glue::RUST_JSID_IS_STRING', 'js::rust::wrappers::RUST_SYMBOL_TO_JSID', 'js::rust::wrappers::int_to_jsid', 'js::glue::UnwrapObjectDynamic', @@ -6521,7 +6526,7 @@ def generate_imports(config, cgthings, descriptors, callbacks=None, dictionaries 'crate::dom::bindings::inheritance::Castable', 'crate::dom::bindings::proxyhandler', 'crate::dom::bindings::proxyhandler::ensure_expando_object', - 'crate::dom::bindings::proxyhandler::fill_property_descriptor', + 'crate::dom::bindings::proxyhandler::set_property_descriptor', 'crate::dom::bindings::proxyhandler::get_expando_object', 'crate::dom::bindings::record::Record', 'std::ptr::NonNull', diff --git a/components/script/dom/bindings/conversions.rs b/components/script/dom/bindings/conversions.rs index 4964180753d..25cd0f206b7 100644 --- a/components/script/dom/bindings/conversions.rs +++ b/components/script/dom/bindings/conversions.rs @@ -53,8 +53,6 @@ use js::error::throw_type_error; use js::glue::GetProxyReservedSlot; use js::glue::JS_GetReservedSlot; use js::glue::{IsWrapper, UnwrapObjectDynamic}; -use js::glue::{RUST_JSID_IS_INT, RUST_JSID_TO_INT}; -use js::glue::{RUST_JSID_IS_STRING, RUST_JSID_TO_STRING}; use js::jsapi::{Heap, JSContext, JSObject, JSString}; use js::jsapi::{IsWindowProxy, JS_DeprecatedStringHasLatin1Chars, JS_NewStringCopyN}; use js::jsapi::{ @@ -160,13 +158,13 @@ where /// /// Handling of invalid UTF-16 in strings depends on the relevant option. pub unsafe fn jsid_to_string(cx: *mut JSContext, id: HandleId) -> Option { - let id_raw = id.into(); - if RUST_JSID_IS_STRING(id_raw) { - return Some(jsstring_to_str(cx, RUST_JSID_TO_STRING(id_raw))); + let id_raw = *id; + if id_raw.is_string() { + return Some(jsstring_to_str(cx, id_raw.to_string())); } - if RUST_JSID_IS_INT(id_raw) { - return Some(RUST_JSID_TO_INT(id_raw).to_string().into()); + if id_raw.is_int() { + return Some(id_raw.to_int().to_string().into()); } None diff --git a/components/script/dom/bindings/interface.rs b/components/script/dom/bindings/interface.rs index f73152c9df7..e6d0b9d0df5 100644 --- a/components/script/dom/bindings/interface.rs +++ b/components/script/dom/bindings/interface.rs @@ -105,7 +105,6 @@ impl InterfaceConstructorBehavior { finalize: None, call: Some(invalid_constructor), construct: Some(invalid_constructor), - hasInstance: None, // heycam/webidl#356 trace: None, }) } @@ -122,7 +121,6 @@ impl InterfaceConstructorBehavior { finalize: None, call: Some(non_new_constructor), construct: Some(hook), - hasInstance: None, // heycam/webidl#356 trace: None, }) } diff --git a/components/script/dom/bindings/proxyhandler.rs b/components/script/dom/bindings/proxyhandler.rs index 3650df6186b..3daecf570cd 100644 --- a/components/script/dom/bindings/proxyhandler.rs +++ b/components/script/dom/bindings/proxyhandler.rs @@ -44,8 +44,12 @@ use js::jsval::ObjectValue; use js::jsval::UndefinedValue; use js::rust::wrappers::JS_AlreadyHasOwnPropertyById; use js::rust::wrappers::JS_NewObjectWithGivenProto; -use js::rust::wrappers::{AppendToIdVector, RUST_INTERNED_STRING_TO_JSID}; -use js::rust::{get_context_realm, Handle, HandleObject, MutableHandle, MutableHandleObject}; +use js::rust::wrappers::{ + AppendToIdVector, SetDataPropertyDescriptor, RUST_INTERNED_STRING_TO_JSID, +}; +use js::rust::{ + get_context_realm, Handle, HandleObject, HandleValue, MutableHandle, MutableHandleObject, +}; use std::{ffi::CStr, os::raw::c_char, ptr}; /// Determine if this id shadows any existing properties for this proxy. @@ -189,15 +193,16 @@ pub unsafe fn ensure_expando_object( /// Set the property descriptor's object to `obj` and set it to enumerable, /// and writable if `readonly` is true. -pub fn fill_property_descriptor( - mut desc: MutableHandle, - obj: *mut JSObject, +pub fn set_property_descriptor( + desc: MutableHandle, + value: HandleValue, attrs: u32, + is_none: &mut bool, ) { - desc.obj = obj; - desc.attrs = attrs; - desc.getter = None; - desc.setter = None; + unsafe { + SetDataPropertyDescriptor(desc, value, attrs); + } + *is_none = false; } /// @@ -333,12 +338,14 @@ pub unsafe extern "C" fn maybe_cross_origin_set_rawcx( // OrdinarySet // rooted!(in(*cx) let mut own_desc = PropertyDescriptor::default()); + let mut is_none = false; if !InvokeGetOwnPropertyDescriptor( GetProxyHandler(*proxy), *cx, proxy, id, own_desc.handle_mut().into(), + &mut is_none, ) { return false; } @@ -439,26 +446,28 @@ pub unsafe fn cross_origin_get( ) -> bool { // > 1. Let `desc` be `? O.[[GetOwnProperty]](P)`. rooted!(in(*cx) let mut descriptor = PropertyDescriptor::default()); + let mut is_none = false; if !InvokeGetOwnPropertyDescriptor( GetProxyHandler(*proxy), *cx, proxy, id, descriptor.handle_mut().into(), + &mut is_none, ) { return false; } // > 2. Assert: `desc` is not undefined. assert!( - !descriptor.obj.is_null(), + !is_none, "Callees should throw in all cases when they are not finding \ a property decriptor" ); // > 3. If `! IsDataDescriptor(desc)` is true, then return `desc.[[Value]]`. if is_data_descriptor(&descriptor) { - vp.set(descriptor.value); + vp.set(descriptor.value_); return true; } @@ -504,19 +513,21 @@ pub unsafe fn cross_origin_set( ) -> bool { // > 1. Let desc be ? O.[[GetOwnProperty]](P). rooted!(in(*cx) let mut descriptor = PropertyDescriptor::default()); + let mut is_none = false; if !InvokeGetOwnPropertyDescriptor( GetProxyHandler(*proxy), *cx, proxy, id, descriptor.handle_mut().into(), + &mut is_none, ) { return false; } // > 2. Assert: desc is not undefined. assert!( - !descriptor.obj.is_null(), + !is_none, "Callees should throw in all cases when they are not finding \ a property decriptor" ); @@ -557,32 +568,25 @@ pub unsafe fn cross_origin_set( } unsafe fn get_getter_object(d: &PropertyDescriptor, out: RawMutableHandleObject) { - if (d.attrs & jsapi::JSPROP_GETTER as u32) != 0 { - out.set(std::mem::transmute(d.getter)); + if d.hasGetter_() { + out.set(std::mem::transmute(d.getter_)); } } unsafe fn get_setter_object(d: &PropertyDescriptor, out: RawMutableHandleObject) { - if (d.attrs & jsapi::JSPROP_SETTER as u32) != 0 { - out.set(std::mem::transmute(d.setter)); + if d.hasSetter_() { + out.set(std::mem::transmute(d.setter_)); } } /// fn is_accessor_descriptor(d: &PropertyDescriptor) -> bool { - d.attrs & (jsapi::JSPROP_GETTER as u32 | jsapi::JSPROP_SETTER as u32) != 0 + d.hasSetter_() || d.hasGetter_() } /// fn is_data_descriptor(d: &PropertyDescriptor) -> bool { - let is_accessor = is_accessor_descriptor(d); - let is_generic = d.attrs & - (jsapi::JSPROP_GETTER as u32 | - jsapi::JSPROP_SETTER as u32 | - jsapi::JSPROP_IGNORE_READONLY | - jsapi::JSPROP_IGNORE_VALUE) == - jsapi::JSPROP_IGNORE_READONLY | jsapi::JSPROP_IGNORE_VALUE; - !is_accessor && !is_generic + d.hasWritable_() || d.hasValue_() } /// Evaluate `CrossOriginGetOwnPropertyHelper(proxy, id) != null`. @@ -621,7 +625,8 @@ pub unsafe fn cross_origin_get_own_property_helper( proxy: RawHandleObject, cross_origin_properties: &'static CrossOriginProperties, id: RawHandleId, - mut desc: RawMutableHandle, + desc: RawMutableHandle, + is_none: &mut bool, ) -> bool { rooted!(in(*cx) let mut holder = ptr::null_mut::()); @@ -632,15 +637,7 @@ pub unsafe fn cross_origin_get_own_property_helper( holder.handle_mut().into(), ); - if !JS_GetOwnPropertyDescriptorById(*cx, holder.handle().into(), id, desc) { - return false; - } - - if !desc.obj.is_null() { - desc.obj = proxy.get(); - } - - true + return JS_GetOwnPropertyDescriptorById(*cx, holder.handle().into(), id, desc, is_none); } /// Implementation of [`CrossOriginPropertyFallback`]. @@ -651,24 +648,24 @@ pub unsafe fn cross_origin_get_own_property_helper( /// [`CrossOriginPropertyFallback`]: https://html.spec.whatwg.org/multipage/#crossoriginpropertyfallback-(-p-) pub unsafe fn cross_origin_property_fallback( cx: SafeJSContext, - proxy: RawHandleObject, + _proxy: RawHandleObject, id: RawHandleId, - mut desc: RawMutableHandle, + desc: RawMutableHandle, + is_none: &mut bool, ) -> bool { - assert!(desc.obj.is_null(), "why are we being called?"); + assert!(*is_none, "why are we being called?"); // > 1. If P is `then`, `@@toStringTag`, `@@hasInstance`, or // > `@@isConcatSpreadable`, then return `PropertyDescriptor{ [[Value]]: // > undefined, [[Writable]]: false, [[Enumerable]]: false, // > [[Configurable]]: true }`. if is_cross_origin_allowlisted_prop(cx, id) { - *desc = PropertyDescriptor { - getter: None, - setter: None, - value: UndefinedValue(), - attrs: jsapi::JSPROP_READONLY as u32, - obj: proxy.get(), - }; + set_property_descriptor( + MutableHandle::from_raw(desc), + HandleValue::undefined(), + jsapi::JSPROP_READONLY as u32, + is_none, + ); return true; } @@ -695,7 +692,7 @@ unsafe fn is_cross_origin_allowlisted_prop(cx: SafeJSContext, id: RawHandleId) - ); // `jsid`s containing `JS::Symbol *` can be compared by // referential equality - allowed_id.get().asBits == id.asBits + allowed_id.get().asBits_ == id.asBits_ }) } diff --git a/components/script/dom/bindings/record.rs b/components/script/dom/bindings/record.rs index c54a2403d70..a586f9369c9 100644 --- a/components/script/dom/bindings/record.rs +++ b/components/script/dom/bindings/record.rs @@ -8,6 +8,7 @@ use crate::dom::bindings::conversions::jsid_to_string; use crate::dom::bindings::str::{ByteString, DOMString, USVString}; use indexmap::IndexMap; use js::conversions::{ConversionResult, FromJSValConvertible, ToJSValConvertible}; +use js::jsapi::glue::JS_GetOwnPropertyDescriptorById; use js::jsapi::HandleId as RawHandleId; use js::jsapi::JSContext; use js::jsapi::JS_NewPlainObject; @@ -20,7 +21,6 @@ use js::jsval::ObjectValue; use js::jsval::UndefinedValue; use js::rust::wrappers::GetPropertyKeys; use js::rust::wrappers::JS_DefineUCProperty2; -use js::rust::wrappers::JS_GetOwnPropertyDescriptorById; use js::rust::wrappers::JS_GetPropertyById; use js::rust::wrappers::JS_IdToValue; use js::rust::HandleId; @@ -135,12 +135,18 @@ where rooted!(in(cx) let id = *id); rooted!(in(cx) let mut desc = PropertyDescriptor::default()); - if !JS_GetOwnPropertyDescriptorById(cx, object.handle(), id.handle(), desc.handle_mut()) - { + let mut is_none = false; + if !JS_GetOwnPropertyDescriptorById( + cx, + object.handle().into(), + id.handle().into(), + desc.handle_mut().into(), + &mut is_none, + ) { return Err(()); } - if (JSPROP_ENUMERATE as u32) & desc.attrs == 0 { + if !desc.enumerable_() { continue; } diff --git a/components/script/dom/bindings/structuredclone.rs b/components/script/dom/bindings/structuredclone.rs index 132f3f78222..19dcf78ccd4 100644 --- a/components/script/dom/bindings/structuredclone.rs +++ b/components/script/dom/bindings/structuredclone.rs @@ -306,6 +306,7 @@ pub fn write( let policy = CloneDataPolicy { allowIntraClusterClonableSharedObjects_: false, allowSharedMemoryObjects_: false, + allowErrorStackFrames_: false, }; let result = JS_WriteStructuredClone( *cx, @@ -382,6 +383,7 @@ pub fn read( &CloneDataPolicy { allowIntraClusterClonableSharedObjects_: false, allowSharedMemoryObjects_: false, + allowErrorStackFrames_: false, }, &STRUCTURED_CLONE_CALLBACKS, sc_holder_ptr as *mut raw::c_void, diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs index efba7c718d1..a9b5733c9ff 100644 --- a/components/script/dom/bindings/trace.rs +++ b/components/script/dom/bindings/trace.rs @@ -82,7 +82,7 @@ use js::jsapi::{ GCTraceKindToAscii, Heap, JSObject, JSScript, JSString, JSTracer, JobQueue, TraceKind, }; use js::jsval::JSVal; -use js::rust::{GCMethods, Handle, Runtime}; +use js::rust::{GCMethods, Handle, Runtime, Stencil}; use js::typedarray::TypedArray; use js::typedarray::TypedArrayElement; use malloc_size_of::{MallocSizeOf, MallocSizeOfOps}; @@ -677,6 +677,7 @@ unsafe_no_jsmanaged_fields!(MediaMetadata); unsafe_no_jsmanaged_fields!(WebrenderIpcSender); unsafe_no_jsmanaged_fields!(StreamConsumer); unsafe_no_jsmanaged_fields!(DocumentAnimationSet); +unsafe_no_jsmanaged_fields!(Stencil); unsafe impl<'a> JSTraceable for &'a str { #[inline] diff --git a/components/script/dom/bindings/utils.rs b/components/script/dom/bindings/utils.rs index 77192291416..a0d3f75315d 100644 --- a/components/script/dom/bindings/utils.rs +++ b/components/script/dom/bindings/utils.rs @@ -18,11 +18,9 @@ use crate::dom::windowproxy; use crate::script_runtime::JSContext as SafeJSContext; use js::conversions::ToJSValConvertible; use js::glue::JS_GetReservedSlot; +use js::glue::RUST_FUNCTION_VALUE_TO_JITINFO; use js::glue::{CallJitGetterOp, CallJitMethodOp, CallJitSetterOp, IsWrapper}; -use js::glue::{UnwrapObjectDynamic, UnwrapObjectStatic, RUST_JSID_TO_INT, RUST_JSID_TO_STRING}; -use js::glue::{ - RUST_FUNCTION_VALUE_TO_JITINFO, RUST_JSID_IS_INT, RUST_JSID_IS_STRING, RUST_JSID_IS_VOID, -}; +use js::glue::{UnwrapObjectDynamic, UnwrapObjectStatic}; use js::jsapi::HandleId as RawHandleId; use js::jsapi::HandleObject as RawHandleObject; use js::jsapi::MutableHandleIdVector as RawMutableHandleIdVector; @@ -192,16 +190,16 @@ pub unsafe fn get_property_on_prototype( /// Get an array index from the given `jsid`. Returns `None` if the given /// `jsid` is not an integer. pub unsafe fn get_array_index_from_id(_cx: *mut JSContext, id: HandleId) -> Option { - let raw_id = id.into(); - if RUST_JSID_IS_INT(raw_id) { - return Some(RUST_JSID_TO_INT(raw_id) as u32); + let raw_id = *id; + if raw_id.is_int() { + return Some(raw_id.to_int() as u32); } - if RUST_JSID_IS_VOID(raw_id) || !RUST_JSID_IS_STRING(raw_id) { + if raw_id.is_void() || !raw_id.is_string() { return None; } - let atom = RUST_JSID_TO_STRING(raw_id) as *mut JSAtom; + let atom = raw_id.to_string() as *mut JSAtom; let s = AtomToLinearString(atom); if GetLinearStringLength(s) == 0 { return None; @@ -451,12 +449,12 @@ pub unsafe extern "C" fn resolve_global( if *rval { return true; } - if !RUST_JSID_IS_STRING(id) { + if !id.is_string() { *rval = false; return true; } - let string = RUST_JSID_TO_STRING(id); + let string = id.to_string(); if !JS_DeprecatedStringHasLatin1Chars(string) { *rval = false; return true; diff --git a/components/script/dom/globalscope.rs b/components/script/dom/globalscope.rs index 6e576c036f7..ac2497da004 100644 --- a/components/script/dom/globalscope.rs +++ b/components/script/dom/globalscope.rs @@ -82,7 +82,7 @@ use js::glue::{IsWrapper, UnwrapObjectDynamic}; use js::jsapi::Compile1; use js::jsapi::SetScriptPrivate; use js::jsapi::{CurrentGlobalOrNull, GetNonCCWObjectGlobal}; -use js::jsapi::{HandleObject, Heap}; +use js::jsapi::{HandleObject, Heap, InstantiateGlobalStencil, InstantiateOptions}; use js::jsapi::{JSContext, JSObject, JSScript}; use js::jsval::PrivateValue; use js::jsval::{JSVal, UndefinedValue}; @@ -120,6 +120,7 @@ use std::collections::hash_map::Entry; use std::collections::{HashMap, VecDeque}; use std::mem; use std::ops::Index; +use std::ptr; use std::rc::Rc; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; @@ -2625,7 +2626,18 @@ impl GlobalScope { } }, SourceCode::Compiled(pre_compiled_script) => { - compiled_script.set(pre_compiled_script.source_code.get()); + let options = InstantiateOptions { + skipFilenameValidation: false, + hideScriptFromDebugger: false, + deferDebugMetadata: false, + }; + let script = InstantiateGlobalStencil( + *cx, + &options, + *pre_compiled_script.source_code, + ptr::null_mut(), + ); + compiled_script.set(script); }, }; diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index d27fee98fb5..dc7490f232c 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -13,7 +13,6 @@ use crate::dom::bindings::reflector::DomObject; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::settings_stack::AutoEntryScript; use crate::dom::bindings::str::{DOMString, USVString}; -use crate::dom::bindings::trace::RootedTraceableBox; use crate::dom::document::Document; use crate::dom::element::{ cors_setting_for_element, referrer_policy_for_element, reflect_cross_origin_attribute, @@ -43,11 +42,11 @@ use encoding_rs::Encoding; use html5ever::{LocalName, Prefix}; use ipc_channel::ipc; use ipc_channel::router::ROUTER; -use js::jsapi::{ - CanCompileOffThread, CompileOffThread1, FinishOffThreadScript, Heap, JSScript, OffThreadToken, -}; +use js::jsapi::{CanCompileOffThread, CompileToStencilOffThread1, OffThreadToken}; use js::jsval::UndefinedValue; -use js::rust::{transform_str_to_source_text, CompileOptionsWrapper}; +use js::rust::{ + transform_str_to_source_text, CompileOptionsWrapper, FinishOffThreadStencil, Stencil, +}; use msg::constellation_msg::PipelineId; use net_traits::request::{ CorsSettings, CredentialsMode, Destination, ParserMetadata, RequestBuilder, @@ -66,6 +65,7 @@ use std::io::{Read, Seek, Write}; use std::mem::replace; use std::path::PathBuf; use std::process::Command; +use std::ptr; use std::rc::Rc; use std::sync::{Arc, Mutex}; use style::str::{StaticStringVec, HTML_SPACE_CHARACTERS}; @@ -113,21 +113,16 @@ unsafe extern "C" fn off_thread_compilation_callback( let cx = global.get_cx(); let _ar = enter_realm(&*global); - rooted!(in(*cx) - let compiled_script = FinishOffThreadScript(*cx, token.0) - ); + let compiled_script = FinishOffThreadStencil(*cx, token.0, ptr::null_mut()); - let load = if compiled_script.get().is_null() { + let load = if compiled_script.is_null() { Err(NetworkError::Internal( "Off-thread compilation failed.".into(), )) } else { let script_text = DOMString::from(script); - let heap = Heap::default(); - let source_code = RootedTraceableBox::new(heap); - source_code.set(compiled_script.get()); let code = SourceCode::Compiled(CompiledSourceCode { - source_code: source_code, + source_code: compiled_script, original_text: Rc::new(script_text), }); @@ -244,7 +239,7 @@ pub enum ScriptType { #[derive(JSTraceable, MallocSizeOf)] pub struct CompiledSourceCode { #[ignore_malloc_size_of = "SM handles JS values"] - pub source_code: RootedTraceableBox>, + pub source_code: Stencil, #[ignore_malloc_size_of = "Rc is hard"] pub original_text: Rc, } @@ -446,7 +441,7 @@ impl FetchResponseListener for ClassicContext { }); unsafe { - assert!(!CompileOffThread1( + assert!(!CompileToStencilOffThread1( *cx, options.ptr as *const _, &mut transform_str_to_source_text(&context.script_text) as *mut _, @@ -1113,7 +1108,9 @@ impl HTMLScriptElement { .map(|record| record.handle()); if let Some(record) = record { - let evaluated = module_tree.execute_module(global, record); + rooted!(in(*global.get_cx()) let mut rval = UndefinedValue()); + let evaluated = + module_tree.execute_module(global, record, rval.handle_mut().into()); if let Err(exception) = evaluated { module_tree.set_rethrow_error(exception); diff --git a/components/script/dom/readablestream.rs b/components/script/dom/readablestream.rs index 90e6c72da70..723e229916a 100644 --- a/components/script/dom/readablestream.rs +++ b/components/script/dom/readablestream.rs @@ -18,14 +18,15 @@ use js::glue::{ CreateReadableStreamUnderlyingSource, DeleteReadableStreamUnderlyingSource, ReadableStreamUnderlyingSourceTraps, }; -use js::jsapi::{HandleObject, HandleValue, Heap, JSContext, JSObject}; use js::jsapi::{ - IsReadableStream, NewReadableExternalSourceStreamObject, ReadableStreamClose, - ReadableStreamDefaultReaderRead, ReadableStreamError, ReadableStreamGetReader, - ReadableStreamIsDisturbed, ReadableStreamIsLocked, ReadableStreamIsReadable, - ReadableStreamReaderMode, ReadableStreamReaderReleaseLock, ReadableStreamUnderlyingSource, + AutoRequireNoGC, IsReadableStream, JS_GetArrayBufferViewData, + NewReadableExternalSourceStreamObject, ReadableStreamClose, ReadableStreamDefaultReaderRead, + ReadableStreamError, ReadableStreamGetReader, ReadableStreamIsDisturbed, + ReadableStreamIsLocked, ReadableStreamIsReadable, ReadableStreamReaderMode, + ReadableStreamReaderReleaseLock, ReadableStreamUnderlyingSource, ReadableStreamUpdateDataAvailableFromSource, UnwrapReadableStream, }; +use js::jsapi::{HandleObject, HandleValue, Heap, JSContext, JSObject}; use js::jsval::JSVal; use js::jsval::UndefinedValue; use js::rust::HandleValue as SafeHandleValue; @@ -332,11 +333,18 @@ unsafe extern "C" fn write_into_read_request_buffer( source: *const c_void, _cx: *mut JSContext, _stream: HandleObject, - buffer: *mut c_void, + chunk: HandleObject, length: usize, bytes_written: *mut usize, ) { let source = &*(source as *const ExternalUnderlyingSourceController); + let mut is_shared_memory = false; + let buffer = JS_GetArrayBufferViewData( + *chunk, + &mut is_shared_memory, + &AutoRequireNoGC { _address: 0 }, + ); + assert!(!is_shared_memory); let slice = slice::from_raw_parts_mut(buffer as *mut u8, length); source.write_into_buffer(slice); diff --git a/components/script/dom/windowproxy.rs b/components/script/dom/windowproxy.rs index bccded0f43c..d5cfbe02f72 100644 --- a/components/script/dom/windowproxy.rs +++ b/components/script/dom/windowproxy.rs @@ -6,7 +6,7 @@ use crate::dom::bindings::cell::DomRefCell; use crate::dom::bindings::conversions::{root_from_handleobject, ToJSValConvertible}; use crate::dom::bindings::error::{throw_dom_exception, Error, Fallible}; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::proxyhandler::fill_property_descriptor; +use crate::dom::bindings::proxyhandler::set_property_descriptor; use crate::dom::bindings::reflector::{DomObject, Reflector}; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::str::{DOMString, USVString}; @@ -33,7 +33,7 @@ use js::jsapi::HandleValue as RawHandleValue; use js::jsapi::MutableHandle as RawMutableHandle; use js::jsapi::MutableHandleObject as RawMutableHandleObject; use js::jsapi::MutableHandleValue as RawMutableHandleValue; -use js::jsapi::{JSAutoRealm, JSContext, JSErrNum, JSFreeOp, JSObject}; +use js::jsapi::{GCContext, JSAutoRealm, JSContext, JSErrNum, JSObject}; use js::jsapi::{JSTracer, JS_DefinePropertyById, JSPROP_ENUMERATE, JSPROP_READONLY}; use js::jsapi::{JS_ForwardGetPropertyTo, JS_ForwardSetPropertyTo}; use js::jsapi::{JS_GetOwnPropertyDescriptorById, JS_IsExceptionPending}; @@ -901,30 +901,26 @@ unsafe extern "C" fn getOwnPropertyDescriptor( cx: *mut JSContext, proxy: RawHandleObject, id: RawHandleId, - mut desc: RawMutableHandle, + desc: RawMutableHandle, + is_none: *mut bool, ) -> bool { let window = GetSubframeWindowProxy(cx, proxy, id); if let Some((window, attrs)) = window { rooted!(in(cx) let mut val = UndefinedValue()); window.to_jsval(cx, val.handle_mut()); - desc.value = val.get(); - fill_property_descriptor(MutableHandle::from_raw(desc), proxy.get(), attrs); + set_property_descriptor( + MutableHandle::from_raw(desc), + val.handle().into(), + attrs, + &mut *is_none, + ); return true; } let mut slot = UndefinedValue(); GetProxyPrivate(proxy.get(), &mut slot); rooted!(in(cx) let target = slot.to_object()); - if !JS_GetOwnPropertyDescriptorById(cx, target.handle().into(), id, desc) { - return false; - } - - assert!(desc.obj.is_null() || desc.obj == target.get()); - if desc.obj == target.get() { - desc.obj = proxy.get(); - } - - true + return JS_GetOwnPropertyDescriptorById(cx, target.handle().into(), id, desc, is_none); } #[allow(unsafe_code, non_snake_case)] @@ -1062,7 +1058,6 @@ static PROXY_HANDLER: ProxyTraps = ProxyTraps { hasOwn: None, getOwnEnumerablePropertyKeys: None, nativeCall: None, - hasInstance: None, objectClassIs: None, className: None, fun_toString: None, @@ -1161,10 +1156,11 @@ unsafe extern "C" fn getOwnPropertyDescriptor_xorigin( proxy: RawHandleObject, id: RawHandleId, desc: RawMutableHandle, + is_none: *mut bool, ) -> bool { let mut found = false; has_xorigin(cx, proxy, id, &mut found); - found && getOwnPropertyDescriptor(cx, proxy, id, desc) + found && getOwnPropertyDescriptor(cx, proxy, id, desc, is_none) } #[allow(unsafe_code, non_snake_case)] @@ -1210,7 +1206,6 @@ static XORIGIN_PROXY_HANDLER: ProxyTraps = ProxyTraps { hasOwn: Some(has_xorigin), getOwnEnumerablePropertyKeys: None, nativeCall: None, - hasInstance: None, objectClassIs: None, className: None, fun_toString: None, @@ -1226,7 +1221,7 @@ static XORIGIN_PROXY_HANDLER: ProxyTraps = ProxyTraps { // How WindowProxy objects are garbage collected. #[allow(unsafe_code)] -unsafe extern "C" fn finalize(_fop: *mut JSFreeOp, obj: *mut JSObject) { +unsafe extern "C" fn finalize(_fop: *mut GCContext, obj: *mut JSObject) { let mut slot = UndefinedValue(); GetProxyReservedSlot(obj, 0, &mut slot); let this = slot.to_private() as *mut WindowProxy; diff --git a/components/script/script_module.rs b/components/script/script_module.rs index 4f1cfe1430a..c13fbc3aeb8 100644 --- a/components/script/script_module.rs +++ b/components/script/script_module.rs @@ -44,15 +44,16 @@ use ipc_channel::router::ROUTER; use js::jsapi::Handle as RawHandle; use js::jsapi::HandleObject; use js::jsapi::HandleValue as RawHandleValue; +use js::jsapi::MutableHandleValue; use js::jsapi::Value; -use js::jsapi::{CompileModule1, ExceptionStackBehavior, FinishDynamicModuleImport_NoTLA}; -use js::jsapi::{DynamicImportStatus, SetModuleDynamicImportHook, SetScriptPrivateReferenceHooks}; +use js::jsapi::{CompileModule1, ExceptionStackBehavior, FinishDynamicModuleImport}; +use js::jsapi::{GetModuleRequestSpecifier, GetRequestedModules, SetModuleMetadataHook}; use js::jsapi::{GetModuleResolveHook, JSRuntime, SetModuleResolveHook}; -use js::jsapi::{GetRequestedModules, SetModuleMetadataHook}; use js::jsapi::{Heap, JSContext, JS_ClearPendingException, SetModulePrivate}; use js::jsapi::{JSAutoRealm, JSObject, JSString}; use js::jsapi::{JS_DefineProperty4, JS_IsExceptionPending, JS_NewStringCopyN, JSPROP_ENUMERATE}; -use js::jsapi::{ModuleEvaluate, ModuleInstantiate}; +use js::jsapi::{ModuleErrorBehaviour, ModuleEvaluate, ModuleLink, ThrowOnModuleEvaluationFailure}; +use js::jsapi::{SetModuleDynamicImportHook, SetScriptPrivateReferenceHooks}; use js::jsval::{JSVal, PrivateValue, UndefinedValue}; use js::rust::jsapi_wrapped::{GetArrayLength, JS_GetElement}; use js::rust::jsapi_wrapped::{GetRequestedModuleSpecifier, JS_GetPendingException}; @@ -71,6 +72,7 @@ use net_traits::{ResourceFetchTiming, ResourceTimingType}; use servo_url::ServoUrl; use std::collections::{HashMap, HashSet}; use std::mem; +use std::ptr; use std::rc::Rc; use std::str::FromStr; use std::sync::{Arc, Mutex}; @@ -475,8 +477,8 @@ impl ModuleTree { let _ac = JSAutoRealm::new(*global.get_cx(), *global.reflector().get_jsobject()); unsafe { - if !ModuleInstantiate(*global.get_cx(), module_record) { - warn!("fail to instantiate module"); + if !ModuleLink(*global.get_cx(), module_record) { + warn!("fail to link & instantiate module"); rooted!(in(*global.get_cx()) let mut exception = UndefinedValue()); assert!(JS_GetPendingException( @@ -501,20 +503,31 @@ impl ModuleTree { &self, global: &GlobalScope, module_record: HandleObject, + eval_result: MutableHandleValue, ) -> Result<(), RethrowError> { - let _ac = JSAutoRealm::new(*global.get_cx(), *global.reflector().get_jsobject()); + let cx = global.get_cx(); + let _ac = JSAutoRealm::new(*cx, *global.reflector().get_jsobject()); unsafe { - rooted!(in(*global.get_cx()) let mut rval = UndefinedValue()); - if !ModuleEvaluate(*global.get_cx(), module_record, rval.handle_mut().into()) { + let ok = ModuleEvaluate(*cx, module_record, eval_result); + assert!(ok, "module evaluation failed"); + + rooted!(in(*cx) let mut evaluation_promise = ptr::null_mut::()); + if eval_result.is_object() { + evaluation_promise.set(eval_result.to_object()); + } + + let throw_result = ThrowOnModuleEvaluationFailure( + *cx, + evaluation_promise.handle().into(), + ModuleErrorBehaviour::ThrowModuleErrorsSync, + ); + if !throw_result { warn!("fail to evaluate module"); - rooted!(in(*global.get_cx()) let mut exception = UndefinedValue()); - assert!(JS_GetPendingException( - *global.get_cx(), - &mut exception.handle_mut() - )); - JS_ClearPendingException(*global.get_cx()); + rooted!(in(*cx) let mut exception = UndefinedValue()); + assert!(JS_GetPendingException(*cx, &mut exception.handle_mut())); + JS_ClearPendingException(*cx); Err(RethrowError(RootedTraceableBox::from_box(Heap::boxed( exception.get(), @@ -973,7 +986,8 @@ impl ModuleOwner { let network_error = module_tree.get_network_error().borrow().as_ref().cloned(); let existing_rethrow_error = module_tree.get_rethrow_error().borrow().as_ref().cloned(); - let execution_err = if network_error.is_none() && existing_rethrow_error.is_none() { + rooted!(in(*global.get_cx()) let mut rval = UndefinedValue()); + if network_error.is_none() && existing_rethrow_error.is_none() { let record = module_tree .get_record() .borrow() @@ -981,58 +995,53 @@ impl ModuleOwner { .map(|record| record.handle()); if let Some(record) = record { - let evaluated = module_tree.execute_module(&global, record).err(); + let evaluated = module_tree + .execute_module(&global, record, rval.handle_mut().into()) + .err(); if let Some(exception) = evaluated.clone() { module_tree.set_rethrow_error(exception); } - - evaluated - } else { - None } - } else { - None - }; + } // Ensure any failures related to importing this dynamic module are immediately reported. - let status = match (network_error, existing_rethrow_error, execution_err) { - (Some(_), _, _) => unsafe { + match (network_error, existing_rethrow_error) { + (Some(_), _) => unsafe { let err = gen_type_error(&global, "Dynamic import failed".to_owned()); JS_SetPendingException(*cx, err.handle(), ExceptionStackBehavior::Capture); - DynamicImportStatus::Failed }, - (None, _, Some(execution_err)) => unsafe { - JS_SetPendingException( - *cx, - execution_err.handle(), - ExceptionStackBehavior::Capture, - ); - DynamicImportStatus::Failed - }, - (None, Some(rethrow_error), _) => unsafe { + (None, Some(rethrow_error)) => unsafe { JS_SetPendingException( *cx, rethrow_error.handle(), ExceptionStackBehavior::Capture, ); - DynamicImportStatus::Failed }, // do nothing if there's no errors - (None, None, None) => DynamicImportStatus::Ok, + (None, None) => {}, }; debug!("Finishing dynamic import for {:?}", module_identity); + rooted!(in(*cx) let mut evaluation_promise = ptr::null_mut::()); + if rval.is_object() { + evaluation_promise.set(rval.to_object()); + } + unsafe { - FinishDynamicModuleImport_NoTLA( + let ok = FinishDynamicModuleImport( *cx, - status, + evaluation_promise.handle().into(), module.referencing_private.handle(), module.specifier.handle(), module.promise.reflector().get_jsobject().into_handle(), ); - assert!(!JS_IsExceptionPending(*cx)); + if ok { + assert!(!JS_IsExceptionPending(*cx)); + } else { + warn!("failed to finish dynamic module import"); + } } return; } @@ -1249,7 +1258,7 @@ unsafe extern "C" fn host_release_top_level_script(value: *const Value) { pub unsafe extern "C" fn host_import_module_dynamically( cx: *mut JSContext, reference_private: RawHandleValue, - specifier: RawHandle<*mut JSString>, + specifier: RawHandle<*mut JSObject>, promise: RawHandle<*mut JSObject>, ) -> bool { // Step 1. @@ -1339,14 +1348,16 @@ unsafe fn module_script_from_reference_private<'a>( #[allow(unsafe_code)] fn fetch_an_import_module_script_graph( global: &GlobalScope, - specifier: RawHandle<*mut JSString>, + module_request: RawHandle<*mut JSObject>, reference_private: RawHandleValue, base_url: ServoUrl, options: ScriptFetchOptions, promise: Rc, ) -> Result<(), RethrowError> { // Step 1. - let url = ModuleTree::resolve_module_specifier(*global.get_cx(), &base_url, specifier); + let cx = global.get_cx(); + rooted!(in(*cx) let specifier = unsafe { GetModuleRequestSpecifier(*cx, module_request) }); + let url = ModuleTree::resolve_module_specifier(*cx, &base_url, specifier.handle().into()); // Step 2. if url.is_err() { @@ -1373,7 +1384,7 @@ fn fetch_an_import_module_script_graph( referencing_private: Heap::default(), id: dynamic_module_id, }); - dynamic_module.specifier.set(specifier.get()); + dynamic_module.specifier.set(module_request.get()); dynamic_module .referencing_private .set(reference_private.get()); @@ -1402,7 +1413,7 @@ fn fetch_an_import_module_script_graph( unsafe extern "C" fn HostResolveImportedModule( cx: *mut JSContext, reference_private: RawHandleValue, - specifier: RawHandle<*mut JSString>, + specifier: RawHandle<*mut JSObject>, ) -> *mut JSObject { let in_realm_proof = AlreadyInRealm::assert_for_cx(SafeJSContext::from_ptr(cx)); let global_scope = GlobalScope::from_context(cx, InRealm::Already(&in_realm_proof)); @@ -1417,7 +1428,12 @@ unsafe extern "C" fn HostResolveImportedModule( } // Step 5. - let url = ModuleTree::resolve_module_specifier(*global_scope.get_cx(), &base_url, specifier); + rooted!(in(*global_scope.get_cx()) let specifier = GetModuleRequestSpecifier(cx, specifier)); + let url = ModuleTree::resolve_module_specifier( + *global_scope.get_cx(), + &base_url, + specifier.handle().into(), + ); // Step 6. assert!(url.is_ok()); @@ -1542,7 +1558,7 @@ struct DynamicModule { #[ignore_malloc_size_of = "Rc is hard"] promise: Rc, #[ignore_malloc_size_of = "GC types are hard"] - specifier: Heap<*mut JSString>, + specifier: Heap<*mut JSObject>, #[ignore_malloc_size_of = "GC types are hard"] referencing_private: Heap, #[ignore_malloc_size_of = "Defined in uuid"] diff --git a/components/script/script_runtime.rs b/components/script/script_runtime.rs index 5ce21f01366..fe88b017934 100644 --- a/components/script/script_runtime.rs +++ b/components/script/script_runtime.rs @@ -52,8 +52,8 @@ use js::jsapi::StreamConsumer as JSStreamConsumer; use js::jsapi::{BuildIdCharVector, DisableIncrementalGC, GCDescription, GCProgress}; use js::jsapi::{Dispatchable as JSRunnable, Dispatchable_MaybeShuttingDown}; use js::jsapi::{ - GCReason, JSGCInvocationKind, JSGCStatus, JS_AddExtraGCRootsTracer, - JS_RequestInterruptCallback, JS_SetGCCallback, + GCOptions, GCReason, JSGCStatus, JS_AddExtraGCRootsTracer, JS_RequestInterruptCallback, + JS_SetGCCallback, }; use js::jsapi::{HandleObject, Heap, JobQueue}; use js::jsapi::{JSContext as RawJSContext, JSTracer, SetDOMCallbacks, SetGCSliceCallback}; @@ -791,14 +791,12 @@ unsafe extern "C" fn gc_slice_callback( }; if !desc.is_null() { let desc: &GCDescription = &*desc; - let invocation_kind = match desc.invocationKind_ { - JSGCInvocationKind::GC_NORMAL => "GC_NORMAL", - JSGCInvocationKind::GC_SHRINK => "GC_SHRINK", + let options = match desc.options_ { + GCOptions::Normal => "Normal", + GCOptions::Shrink => "Shrink", + GCOptions::Shutdown => "Shutdown", }; - println!( - " isZone={}, invocation_kind={}", - desc.isZone_, invocation_kind - ); + println!(" isZone={}, options={}", desc.isZone_, options); } let _ = stdout().flush(); } diff --git a/components/style/Cargo.toml b/components/style/Cargo.toml index 02c8047c2c9..45765497481 100644 --- a/components/style/Cargo.toml +++ b/components/style/Cargo.toml @@ -80,7 +80,7 @@ unicode-segmentation = "1.0" void = "1.0.2" [build-dependencies] -bindgen = { version = "0.58", optional = true, default-features = false } +bindgen = { version = "0.62", optional = true, default-features = false } lazy_static = "1" log = "0.4" regex = { version = "1.1", optional = true } diff --git a/servo-tidy.toml b/servo-tidy.toml index 26371c0a387..9e0e5ed2c2e 100644 --- a/servo-tidy.toml +++ b/servo-tidy.toml @@ -90,7 +90,6 @@ packages = [ # https://github.com/servo/servo/pull/28236 "dlib", "nix", - "nom", "strsim", # Duplicated by webrender debugger via ws diff --git a/tests/wpt/metadata/html/browsers/history/the-location-interface/location-prototype-setting-same-origin-domain.sub.html.ini b/tests/wpt/metadata/html/browsers/history/the-location-interface/location-prototype-setting-same-origin-domain.sub.html.ini new file mode 100644 index 00000000000..e94f347f6ee --- /dev/null +++ b/tests/wpt/metadata/html/browsers/history/the-location-interface/location-prototype-setting-same-origin-domain.sub.html.ini @@ -0,0 +1,3 @@ +[location-prototype-setting-same-origin-domain.sub.html] + [Same-origin-domain: setting the prototype to an empty object via __proto__ should throw a TypeError] + expected: FAIL diff --git a/tests/wpt/metadata/html/browsers/history/the-location-interface/location-prototype-setting-same-origin.html.ini b/tests/wpt/metadata/html/browsers/history/the-location-interface/location-prototype-setting-same-origin.html.ini new file mode 100644 index 00000000000..7bf488f91f7 --- /dev/null +++ b/tests/wpt/metadata/html/browsers/history/the-location-interface/location-prototype-setting-same-origin.html.ini @@ -0,0 +1,3 @@ +[location-prototype-setting-same-origin.html] + [Same-origin: setting the prototype to an empty object via __proto__ should throw a TypeError] + expected: FAIL diff --git a/tests/wpt/metadata/html/browsers/history/the-location-interface/no-browsing-context.window.js.ini b/tests/wpt/metadata/html/browsers/history/the-location-interface/no-browsing-context.window.js.ini index a6f9d3f7157..6c97c62ef3f 100644 --- a/tests/wpt/metadata/html/browsers/history/the-location-interface/no-browsing-context.window.js.ini +++ b/tests/wpt/metadata/html/browsers/history/the-location-interface/no-browsing-context.window.js.ini @@ -16,4 +16,3 @@ [Setting `href` to `http://test:test/` of a `Location` object sans browsing context is a no-op] expected: FAIL - diff --git a/tests/wpt/metadata/html/browsers/history/the-location-interface/same-hash.html.ini b/tests/wpt/metadata/html/browsers/history/the-location-interface/same-hash.html.ini index 8261add5420..685526c321e 100644 --- a/tests/wpt/metadata/html/browsers/history/the-location-interface/same-hash.html.ini +++ b/tests/wpt/metadata/html/browsers/history/the-location-interface/same-hash.html.ini @@ -1,2 +1,37 @@ [same-hash.html] expected: ERROR + [Using location.hash = "#te