aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/script/dom/bindings/codegen/Bindings.conf4
-rw-r--r--components/script/dom/bindings/codegen/CodegenRust.py126
-rw-r--r--components/script/dom/bindings/conversions.rs10
-rw-r--r--components/script/dom/bindings/interface.rs35
-rw-r--r--components/script/dom/bindings/proxyhandler.rs15
-rw-r--r--components/script/dom/bindings/refcounted.rs3
-rw-r--r--components/script/dom/bindings/structuredclone.rs3
-rw-r--r--components/script/dom/bindings/trace.rs35
-rw-r--r--components/script/dom/bindings/utils.rs41
-rw-r--r--components/script/dom/browsingcontext.rs27
-rw-r--r--components/script/dom/imagedata.rs9
-rw-r--r--components/script/dom/textencoder.rs5
-rw-r--r--components/script/dom/websocket.rs4
-rw-r--r--components/script/dom/window.rs8
-rw-r--r--components/script/dom/workerglobalscope.rs9
-rw-r--r--components/script/script_runtime.rs6
-rw-r--r--components/script/script_thread.rs5
-rw-r--r--components/servo/Cargo.lock6
-rw-r--r--ports/cef/Cargo.lock6
-rw-r--r--ports/gonk/Cargo.lock6
-rw-r--r--tests/wpt/mozilla/tests/mozilla/interfaces.html11
21 files changed, 180 insertions, 194 deletions
diff --git a/components/script/dom/bindings/codegen/Bindings.conf b/components/script/dom/bindings/codegen/Bindings.conf
index dfb31685fd1..314151f8c58 100644
--- a/components/script/dom/bindings/codegen/Bindings.conf
+++ b/components/script/dom/bindings/codegen/Bindings.conf
@@ -14,10 +14,6 @@
DOMInterfaces = {
-'Window': {
- 'outerObjectHook': 'Some(bindings::utils::outerize_global)',
-},
-
'Range': {
'weakReferenceable': True,
},
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py
index 1ef2e0a4eb9..c0aa97d633e 100644
--- a/components/script/dom/bindings/codegen/CodegenRust.py
+++ b/components/script/dom/bindings/codegen/CodegenRust.py
@@ -1499,7 +1499,7 @@ class AttrDefiner(PropertyDefiner):
flags = "JSPROP_ENUMERATE | JSPROP_SHARED"
if self.unforgeable:
- flags += " | JSPROP_READONLY | JSPROP_PERMANENT"
+ flags += " | JSPROP_PERMANENT"
def getter(attr):
if self.static:
@@ -1542,7 +1542,7 @@ class AttrDefiner(PropertyDefiner):
array, name,
' JSPropertySpec {\n'
' name: %s as *const u8 as *const libc::c_char,\n'
- ' flags: ((%s) & 0xFF) as u8,\n'
+ ' flags: (%s) as u8,\n'
' getter: %s,\n'
' setter: %s\n'
' }',
@@ -1779,7 +1779,6 @@ class CGDOMJSClass(CGThing):
"finalizeHook": FINALIZE_HOOK_NAME,
"flags": "0",
"name": str_to_const_array(self.descriptor.interface.identifier.name),
- "outerObjectHook": self.descriptor.outerObjectHook,
"resolveHook": "None",
"slots": "1",
"traceHook": TRACE_HOOK_NAME,
@@ -1797,7 +1796,7 @@ class CGDOMJSClass(CGThing):
static Class: DOMJSClass = DOMJSClass {
base: js::jsapi::Class {
name: %(name)s as *const u8 as *const libc::c_char,
- flags: JSCLASS_IS_DOMJSCLASS | JSCLASS_IMPLEMENTS_BARRIERS | %(flags)s |
+ flags: JSCLASS_IS_DOMJSCLASS | %(flags)s |
(((%(slots)s) & JSCLASS_RESERVED_SLOTS_MASK) << JSCLASS_RESERVED_SLOTS_SHIFT)
/* JSCLASS_HAS_RESERVED_SLOTS(%(slots)s) */,
addProperty: None,
@@ -1806,7 +1805,7 @@ static Class: DOMJSClass = DOMJSClass {
setProperty: None,
enumerate: %(enumerateHook)s,
resolve: %(resolveHook)s,
- convert: None,
+ mayResolve: None,
finalize: Some(%(finalizeHook)s),
call: None,
hasInstance: None,
@@ -1814,19 +1813,17 @@ static Class: DOMJSClass = DOMJSClass {
trace: Some(%(traceHook)s),
spec: js::jsapi::ClassSpec {
- createConstructor: None,
- createPrototype: None,
- constructorFunctions: 0 as *const js::jsapi::JSFunctionSpec,
- constructorProperties: 0 as *const js::jsapi::JSPropertySpec,
- prototypeFunctions: 0 as *const js::jsapi::JSFunctionSpec,
- prototypeProperties: 0 as *const js::jsapi::JSPropertySpec,
- finishInit: None,
+ createConstructor_: None,
+ createPrototype_: None,
+ constructorFunctions_: 0 as *const js::jsapi::JSFunctionSpec,
+ constructorProperties_: 0 as *const js::jsapi::JSPropertySpec,
+ prototypeFunctions_: 0 as *const js::jsapi::JSFunctionSpec,
+ prototypeProperties_: 0 as *const js::jsapi::JSPropertySpec,
+ finishInit_: None,
flags: 0,
},
ext: js::jsapi::ClassExtension {
- outerObject: %(outerObjectHook)s,
- innerObject: None,
isWrappedNative: false,
weakmapKeyDelegateOp: None,
objectMovedOp: None,
@@ -1844,7 +1841,6 @@ static Class: DOMJSClass = DOMJSClass {
unwatch: None,
getElements: None,
enumerate: None,
- thisObject: %(outerObjectHook)s,
funToString: None,
},
},
@@ -1878,13 +1874,13 @@ static PrototypeClass: JSClass = JSClass {
setProperty: None,
enumerate: None,
resolve: None,
- convert: None,
+ mayResolve: None,
finalize: None,
call: None,
hasInstance: None,
construct: None,
trace: None,
- reserved: [0 as *mut libc::c_void; 26]
+ reserved: [0 as *mut os::raw::c_void; 23]
};
""" % {'name': name, 'slotCount': slotCount}
@@ -2402,10 +2398,11 @@ class CGCreateInterfaceObjectsMethod(CGAbstractMethod):
let mut interface = RootedObject::new(cx, ptr::null_mut());
create_callback_interface_object(cx, global, sConstants, %(name)s, interface.handle_mut());
assert!(!interface.ptr.is_null());
+assert!((*cache)[PrototypeList::Constructor::%(id)s as usize].is_null());
(*cache)[PrototypeList::Constructor::%(id)s as usize] = interface.ptr;
-if <*mut JSObject>::needs_post_barrier(interface.ptr) {
- <*mut JSObject>::post_barrier((*cache).as_mut_ptr().offset(PrototypeList::Constructor::%(id)s as isize));
-}
+<*mut JSObject>::post_barrier((*cache).as_mut_ptr().offset(PrototypeList::Constructor::%(id)s as isize),
+ ptr::null_mut(),
+ interface.ptr);
""" % {"id": name, "name": str_to_const_array(name)})
if len(self.descriptor.prototypeChain) == 1:
@@ -2445,10 +2442,12 @@ create_interface_prototype_object(cx,
%(consts)s,
prototype.handle_mut());
assert!(!prototype.ptr.is_null());
+assert!((*cache)[PrototypeList::ID::%(id)s as usize].is_null());
(*cache)[PrototypeList::ID::%(id)s as usize] = prototype.ptr;
-if <*mut JSObject>::needs_post_barrier(prototype.ptr) {
- <*mut JSObject>::post_barrier((*cache).as_mut_ptr().offset(PrototypeList::ID::%(id)s as isize));
-}""" % properties))
+<*mut JSObject>::post_barrier((*cache).as_mut_ptr().offset(PrototypeList::ID::%(id)s as isize),
+ ptr::null_mut(),
+ prototype.ptr);
+""" % properties))
if self.descriptor.interface.hasInterfaceObject():
properties["name"] = str_to_const_array(name)
@@ -2482,10 +2481,12 @@ create_noncallback_interface_object(cx,
assert!(!interface.ptr.is_null());""" % properties))
if self.descriptor.hasDescendants():
code.append(CGGeneric("""\
+assert!((*cache)[PrototypeList::Constructor::%(id)s as usize].is_null());
(*cache)[PrototypeList::Constructor::%(id)s as usize] = interface.ptr;
-if <*mut JSObject>::needs_post_barrier(prototype.ptr) {
- <*mut JSObject>::post_barrier((*cache).as_mut_ptr().offset(PrototypeList::Constructor::%(id)s as isize));
-}""" % properties))
+<*mut JSObject>::post_barrier((*cache).as_mut_ptr().offset(PrototypeList::Constructor::%(id)s as isize),
+ ptr::null_mut(),
+ interface.ptr);
+""" % properties))
constructors = self.descriptor.interface.namedConstructors
if constructors:
@@ -3167,7 +3168,7 @@ class CGMemberJITInfo(CGThing):
aliasSet, alwaysInSlot, lazilyInSlot, slotIndex,
returnTypes, args):
"""
- aliasSet is a JSJitInfo::AliasSet value, without the "JSJitInfo::" bit.
+ aliasSet is a JSJitInfo_AliasSet value, without the "JSJitInfo_AliasSet::" bit.
args is None if we don't want to output argTypes for some
reason (e.g. we have overloads or we're not a method) and
@@ -3180,16 +3181,17 @@ class CGMemberJITInfo(CGThing):
initializer = fill(
"""
JSJitInfo {
- call: ${opName} as *const ::libc::c_void,
+ call: ${opName} as *const os::raw::c_void,
protoID: PrototypeList::ID::${name} as u16,
depth: ${depth},
_bitfield_1:
JSJitInfo::new_bitfield_1(
- OpType::${opType} as u8,
- AliasSet::${aliasSet} as u8,
+ JSJitInfo_OpType::${opType} as u8,
+ JSJitInfo_AliasSet::${aliasSet} as u8,
JSValueType::${returnType} as u8,
${isInfallible},
${isMovable},
+ ${isEliminatable},
${isAlwaysInSlot},
${isLazilyCachedInSlot},
${isTypedMethod},
@@ -3206,6 +3208,8 @@ class CGMemberJITInfo(CGThing):
""),
isInfallible=toStringBool(infallible),
isMovable=toStringBool(movable),
+ # FIXME(nox): https://github.com/servo/servo/issues/10991
+ isEliminatable=toStringBool(False),
isAlwaysInSlot=toStringBool(alwaysInSlot),
isLazilyCachedInSlot=toStringBool(lazilyInSlot),
isTypedMethod=toStringBool(isTypedMethod),
@@ -3215,7 +3219,7 @@ class CGMemberJITInfo(CGThing):
if args is not None:
argTypes = "%s_argTypes" % infoName
args = [CGMemberJITInfo.getJSArgType(arg.type) for arg in args]
- args.append("ArgType::ArgTypeListEnd as i32")
+ args.append("JSJitInfo_ArgType::ArgTypeListEnd as i32")
argTypesDecl = (
"const %s: [i32; %d] = [ %s ];\n" %
(argTypes, len(args), ", ".join(args)))
@@ -3224,7 +3228,7 @@ class CGMemberJITInfo(CGThing):
$*{argTypesDecl}
const ${infoName}: JSTypedMethodJitInfo = JSTypedMethodJitInfo {
base: ${jitInfo},
- argTypes: &${argTypes} as *const _ as *const ArgType,
+ argTypes: &${argTypes} as *const _ as *const JSJitInfo_ArgType,
};
""",
argTypesDecl=argTypesDecl,
@@ -3438,56 +3442,56 @@ class CGMemberJITInfo(CGThing):
assert not t.isVoid()
if t.nullable():
# Sometimes it might return null, sometimes not
- return "ArgType::Null as i32 | %s" % CGMemberJITInfo.getJSArgType(t.inner)
+ return "JSJitInfo_ArgType::Null as i32 | %s" % CGMemberJITInfo.getJSArgType(t.inner)
if t.isArray():
# No idea yet
assert False
if t.isSequence():
- return "ArgType::Object as i32"
+ return "JSJitInfo_ArgType::Object as i32"
if t.isGeckoInterface():
- return "ArgType::Object as i32"
+ return "JSJitInfo_ArgType::Object as i32"
if t.isString():
- return "ArgType::String as i32"
+ return "JSJitInfo_ArgType::String as i32"
if t.isEnum():
- return "ArgType::String as i32"
+ return "JSJitInfo_ArgType::String as i32"
if t.isCallback():
- return "ArgType::Object as i32"
+ return "JSJitInfo_ArgType::Object as i32"
if t.isAny():
# The whole point is to return various stuff
- return "ArgType::Any as i32"
+ return "JSJitInfo_ArgType::Any as i32"
if t.isObject():
- return "ArgType::Object as i32"
+ return "JSJitInfo_ArgType::Object as i32"
if t.isSpiderMonkeyInterface():
- return "ArgType::Object as i32"
+ return "JSJitInfo_ArgType::Object as i32"
if t.isUnion():
u = t.unroll()
type = "JSJitInfo::Null as i32" if u.hasNullableType else ""
return reduce(CGMemberJITInfo.getSingleArgType,
u.flatMemberTypes, type)
if t.isDictionary():
- return "ArgType::Object as i32"
+ return "JSJitInfo_ArgType::Object as i32"
if t.isDate():
- return "ArgType::Object as i32"
+ return "JSJitInfo_ArgType::Object as i32"
if not t.isPrimitive():
raise TypeError("No idea what type " + str(t) + " is.")
tag = t.tag()
if tag == IDLType.Tags.bool:
- return "ArgType::Boolean as i32"
+ return "JSJitInfo_ArgType::Boolean as i32"
if tag in [IDLType.Tags.int8, IDLType.Tags.uint8,
IDLType.Tags.int16, IDLType.Tags.uint16,
IDLType.Tags.int32]:
- return "ArgType::Integer as i32"
+ return "JSJitInfo_ArgType::Integer as i32"
if tag in [IDLType.Tags.int64, IDLType.Tags.uint64,
IDLType.Tags.unrestricted_float, IDLType.Tags.float,
IDLType.Tags.unrestricted_double, IDLType.Tags.double]:
# These all use JS_NumberValue, which can return int or double.
# But TI treats "double" as meaning "int or double", so we're
# good to return JSVAL_TYPE_DOUBLE here.
- return "ArgType::Double as i32"
+ return "JSJitInfo_ArgType::Double as i32"
if tag != IDLType.Tags.uint32:
raise TypeError("No idea what type " + str(t) + " is.")
# uint32 is sometimes int and sometimes double.
- return "ArgType::Double as i32"
+ return "JSJitInfo_ArgType::Double as i32"
@staticmethod
def getSingleArgType(existingType, t):
@@ -4319,7 +4323,7 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(CGAbstractExternMethod):
def __init__(self, descriptor):
args = [Argument('*mut JSContext', 'cx'), Argument('HandleObject', 'proxy'),
Argument('HandleId', 'id'),
- Argument('MutableHandle<JSPropertyDescriptor>', 'desc')]
+ Argument('MutableHandle<PropertyDescriptor>', 'desc')]
CGAbstractExternMethod.__init__(self, descriptor, "getOwnPropertyDescriptor",
"bool", args)
self.descriptor = descriptor
@@ -4405,7 +4409,7 @@ class CGDOMJSProxyHandler_defineProperty(CGAbstractExternMethod):
def __init__(self, descriptor):
args = [Argument('*mut JSContext', 'cx'), Argument('HandleObject', 'proxy'),
Argument('HandleId', 'id'),
- Argument('Handle<JSPropertyDescriptor>', 'desc'),
+ Argument('Handle<PropertyDescriptor>', 'desc'),
Argument('*mut ObjectOpResult', 'opresult')]
CGAbstractExternMethod.__init__(self, descriptor, "defineProperty", "bool", args)
self.descriptor = descriptor
@@ -4511,7 +4515,7 @@ class CGDOMJSProxyHandler_ownPropertyKeys(CGAbstractExternMethod):
"""
for name in (*unwrapped_proxy).SupportedPropertyNames() {
let cstring = CString::new(name).unwrap();
- let jsstring = JS_InternString(cx, cstring.as_ptr());
+ let jsstring = JS_AtomizeAndPinString(cx, cstring.as_ptr());
let rooted = RootedString::new(cx, jsstring);
let jsid = INTERNED_STRING_TO_JSID(cx, rooted.handle().get());
let rooted_jsid = RootedId::new(cx, jsid);
@@ -4632,7 +4636,7 @@ return true;"""
class CGDOMJSProxyHandler_get(CGAbstractExternMethod):
def __init__(self, descriptor):
args = [Argument('*mut JSContext', 'cx'), Argument('HandleObject', 'proxy'),
- Argument('HandleObject', 'receiver'), Argument('HandleId', 'id'),
+ Argument('HandleValue', 'receiver'), Argument('HandleId', 'id'),
Argument('MutableHandleValue', 'vp')]
CGAbstractExternMethod.__init__(self, descriptor, "get", "bool", args)
self.descriptor = descriptor
@@ -5366,13 +5370,12 @@ class CGBindingRoot(CGThing):
# Add imports
curr = CGImports(curr, descriptors + callbackDescriptors, mainCallbacks, [
'js',
- 'js::{JSCLASS_GLOBAL_SLOT_COUNT, JSCLASS_IMPLEMENTS_BARRIERS}',
+ 'js::{JS_CALLEE, JSCLASS_GLOBAL_SLOT_COUNT}',
'js::{JSCLASS_IS_DOMJSCLASS, JSCLASS_IS_GLOBAL, JSCLASS_RESERVED_SLOTS_MASK}',
- 'js::{JSCLASS_RESERVED_SLOTS_SHIFT, JSITER_HIDDEN, JSITER_OWNONLY}',
- 'js::{JSITER_SYMBOLS, JSPROP_ENUMERATE, JSPROP_PERMANENT, JSPROP_READONLY}',
- 'js::{JSPROP_SHARED, JS_CALLEE}',
'js::error::throw_type_error',
- 'js::jsapi::{AliasSet, ArgType, AutoIdVector, CallArgs, FreeOp}',
+ 'js::jsapi::{JSJitInfo_AliasSet, JSJitInfo_ArgType, AutoIdVector, CallArgs, FreeOp}',
+ 'js::jsapi::{JSITER_SYMBOLS, JSPROP_ENUMERATE, JSPROP_PERMANENT, JSPROP_READONLY, JSPROP_SHARED}',
+ 'js::jsapi::{JSCLASS_RESERVED_SLOTS_SHIFT, JSITER_HIDDEN, JSITER_OWNONLY}',
'js::jsapi::{GetGlobalForObjectCrossCompartment , GetPropertyKeys, Handle}',
'js::jsapi::{HandleId, HandleObject, HandleValue, HandleValueArray}',
'js::jsapi::{INTERNED_STRING_TO_JSID, IsCallable, JS_CallFunctionValue}',
@@ -5381,16 +5384,16 @@ class CGBindingRoot(CGThing):
'js::jsapi::{JS_GetGlobalForObject, JS_GetObjectPrototype, JS_GetProperty}',
'js::jsapi::{JS_GetPropertyById, JS_GetPropertyDescriptorById, JS_GetReservedSlot}',
'js::jsapi::{JS_HasProperty, JS_HasPropertyById, JS_InitializePropertiesFromCompatibleNativeObject}',
- 'js::jsapi::{JS_InternString, JS_IsExceptionPending, JS_NewObject, JS_NewObjectWithGivenProto}',
+ 'js::jsapi::{JS_AtomizeAndPinString, JS_IsExceptionPending, JS_NewObject, JS_NewObjectWithGivenProto}',
'js::jsapi::{JS_NewObjectWithoutMetadata, JS_NewStringCopyZ, JS_SetProperty}',
'js::jsapi::{JS_SetPrototype, JS_SetReservedSlot, JS_WrapValue, JSAutoCompartment}',
'js::jsapi::{JSAutoRequest, JSContext, JSClass, JSFreeOp, JSFunctionSpec}',
'js::jsapi::{JSJitGetterCallArgs, JSJitInfo, JSJitMethodCallArgs, JSJitSetterCallArgs}',
- 'js::jsapi::{JSNative, JSObject, JSNativeWrapper, JSPropertyDescriptor, JSPropertySpec}',
+ 'js::jsapi::{JSNative, JSObject, JSNativeWrapper, JSPropertySpec}',
'js::jsapi::{JSString, JSTracer, JSType, JSTypedMethodJitInfo, JSValueType}',
- 'js::jsapi::{ObjectOpResult, OpType, MutableHandle, MutableHandleObject}',
- 'js::jsapi::{MutableHandleValue, RootedId, RootedObject, RootedString}',
- 'js::jsapi::{RootedValue, SymbolCode, jsid}',
+ 'js::jsapi::{ObjectOpResult, JSJitInfo_OpType, MutableHandle, MutableHandleObject}',
+ 'js::jsapi::{MutableHandleValue, PropertyDescriptor, RootedId, RootedObject}',
+ 'js::jsapi::{RootedString, RootedValue, SymbolCode, jsid}',
'js::jsval::JSVal',
'js::jsval::{ObjectValue, ObjectOrNullValue, PrivateValue}',
'js::jsval::{NullValue, UndefinedValue}',
@@ -5449,6 +5452,7 @@ class CGBindingRoot(CGThing):
'std::cmp',
'std::mem',
'std::num',
+ 'std::os',
'std::ptr',
'std::str',
'std::rc',
diff --git a/components/script/dom/bindings/conversions.rs b/components/script/dom/bindings/conversions.rs
index baeb0a1f92b..e6e1dac58df 100644
--- a/components/script/dom/bindings/conversions.rs
+++ b/components/script/dom/bindings/conversions.rs
@@ -281,7 +281,7 @@ pub unsafe fn private_from_proto_check<F>(mut obj: *mut JSObject,
let dom_class = try!(get_dom_class(obj).or_else(|_| {
if IsWrapper(obj) {
debug!("found wrapper");
- obj = UnwrapObject(obj, /* stopAtOuter = */ 0);
+ obj = UnwrapObject(obj, /* stopAtWindowProxy = */ 0);
if obj.is_null() {
debug!("unwrapping security wrapper failed");
Err(())
@@ -424,7 +424,9 @@ unsafe impl ArrayBufferViewContents for f64 {
pub unsafe fn array_buffer_view_data<'a, T: ArrayBufferViewContents>(abv: *mut JSObject) -> Option<&'a mut [T]> {
let mut byte_length = 0;
let mut ptr = ptr::null_mut();
- let ret = JS_GetObjectAsArrayBufferView(abv, &mut byte_length, &mut ptr);
+ let mut is_shared = false;
+ let ret = JS_GetObjectAsArrayBufferView(abv, &mut byte_length, &mut is_shared, &mut ptr);
+ assert!(!is_shared);
if ret.is_null() {
return None;
}
@@ -463,5 +465,7 @@ pub fn array_buffer_view_to_vec_checked<T: ArrayBufferViewContents>(abv: *mut JS
/// Note: Currently only Arrays are supported.
/// TODO: Expand this to support sequences and other array-like objects
pub unsafe fn is_array_like(cx: *mut JSContext, value: HandleValue) -> bool {
- JS_IsArrayObject(cx, value)
+ let mut result = false;
+ assert!(JS_IsArrayObject(cx, value, &mut result));
+ result
}
diff --git a/components/script/dom/bindings/interface.rs b/components/script/dom/bindings/interface.rs
index f41941f08b0..db8772d1dbe 100644
--- a/components/script/dom/bindings/interface.rs
+++ b/components/script/dom/bindings/interface.rs
@@ -11,15 +11,15 @@ use js::error::throw_type_error;
use js::glue::UncheckedUnwrapObject;
use js::jsapi::{Class, ClassExtension, ClassSpec, GetGlobalForObjectCrossCompartment};
use js::jsapi::{HandleObject, HandleValue, JSClass, JSContext, JSFunctionSpec};
-use js::jsapi::{JSNative, JSPropertySpec, JSString, JS_DefineProperty1, JS_DefineProperty2};
-use js::jsapi::{JS_DefineProperty4, JS_GetClass, JS_GetFunctionObject, JS_GetPrototype};
-use js::jsapi::{JS_InternString, JS_LinkConstructorAndPrototype, JS_NewFunction, JS_NewObject};
+use js::jsapi::{JSNative, JSFUN_CONSTRUCTOR, JSPROP_ENUMERATE, JSPROP_PERMANENT, JSPROP_READONLY};
+use js::jsapi::{JSPROP_RESOLVING, JSPropertySpec, JSString, JS_DefineProperty1, JS_DefineProperty2};
+use js::jsapi::{JS_AtomizeAndPinString, JS_DefineProperty4, JS_GetClass, JS_GetFunctionObject};
+use js::jsapi::{JS_GetPrototype, JS_LinkConstructorAndPrototype, JS_NewFunction, JS_NewObject};
use js::jsapi::{JS_NewObjectWithUniqueType, JS_NewStringCopyZ, JS_DefineProperty};
use js::jsapi::{MutableHandleObject, MutableHandleValue, ObjectOps, RootedObject, RootedString};
use js::jsapi::{RootedValue, Value};
use js::jsval::{BooleanValue, DoubleValue, Int32Value, JSVal, NullValue, UInt32Value};
use js::rust::{define_methods, define_properties};
-use js::{JSPROP_ENUMERATE, JSFUN_CONSTRUCTOR, JSPROP_PERMANENT, JSPROP_READONLY};
use libc;
use std::ptr;
@@ -127,25 +127,23 @@ impl NonCallbackInterfaceObjectClass {
setProperty: None,
enumerate: None,
resolve: None,
- convert: None,
+ mayResolve: None,
finalize: None,
call: constructor_behavior.call,
construct: constructor_behavior.construct,
hasInstance: Some(has_instance_hook),
trace: None,
spec: ClassSpec {
- createConstructor: None,
- createPrototype: None,
- constructorFunctions: ptr::null(),
- constructorProperties: ptr::null(),
- prototypeFunctions: ptr::null(),
- prototypeProperties: ptr::null(),
- finishInit: None,
+ createConstructor_: None,
+ createPrototype_: None,
+ constructorFunctions_: ptr::null(),
+ constructorProperties_: ptr::null(),
+ prototypeFunctions_: ptr::null(),
+ prototypeProperties_: ptr::null(),
+ finishInit_: None,
flags: 0,
},
ext: ClassExtension {
- outerObject: None,
- innerObject: None,
isWrappedNative: false,
weakmapKeyDelegateOp: None,
objectMovedOp: None,
@@ -162,7 +160,6 @@ impl NonCallbackInterfaceObjectClass {
unwatch: None,
getElements: None,
enumerate: None,
- thisObject: None,
funToString: Some(fun_to_string_hook),
}
},
@@ -323,7 +320,7 @@ unsafe fn has_instance(
let js_class = JS_GetClass(interface_object.get());
let object_class = &*(js_class as *const NonCallbackInterfaceObjectClass);
- if let Ok(dom_class) = get_dom_class(UncheckedUnwrapObject(value.ptr, /* stopAtOuter = */ 0)) {
+ if let Ok(dom_class) = get_dom_class(UncheckedUnwrapObject(value.ptr, /* stopAtWindowProxy = */ 0)) {
if dom_class.interface_chain[object_class.proto_depth as usize] == object_class.proto_id {
// Step 4.
return Ok(true);
@@ -372,8 +369,8 @@ unsafe fn create_object(
unsafe fn define_name(cx: *mut JSContext, obj: HandleObject, name: &'static [u8]) {
assert!(*name.last().unwrap() == b'\0');
- let name =
- RootedString::new(cx, JS_InternString(cx, name.as_ptr() as *const libc::c_char));
+ let name = RootedString::new(
+ cx, JS_AtomizeAndPinString(cx, name.as_ptr() as *const libc::c_char));
assert!(!name.ptr.is_null());
assert!(JS_DefineProperty2(cx,
obj,
@@ -402,7 +399,7 @@ unsafe fn define_on_global_object(
receiver,
name.as_ptr() as *const libc::c_char,
obj,
- 0,
+ JSPROP_RESOLVING,
None, None));
}
diff --git a/components/script/dom/bindings/proxyhandler.rs b/components/script/dom/bindings/proxyhandler.rs
index 31b5f3db2d0..f7505b77fc7 100644
--- a/components/script/dom/bindings/proxyhandler.rs
+++ b/components/script/dom/bindings/proxyhandler.rs
@@ -8,16 +8,15 @@
use dom::bindings::conversions::is_dom_proxy;
use dom::bindings::utils::delete_property_by_id;
-use js::JSPROP_GETTER;
use js::glue::GetProxyExtra;
use js::glue::InvokeGetOwnPropertyDescriptor;
use js::glue::{GetProxyHandler, SetProxyExtra};
use js::jsapi::GetObjectProto;
use js::jsapi::JS_GetPropertyDescriptorById;
use js::jsapi::{Handle, HandleId, HandleObject, MutableHandle, ObjectOpResult, RootedObject};
-use js::jsapi::{JSContext, JSObject, JSPropertyDescriptor};
+use js::jsapi::{JSContext, JSObject, JSPROP_GETTER, PropertyDescriptor};
use js::jsapi::{JSErrNum, JS_StrictPropertyStub};
-use js::jsapi::{JS_DefinePropertyById6, JS_NewObjectWithGivenProto};
+use js::jsapi::{JS_DefinePropertyById, JS_NewObjectWithGivenProto};
use js::jsval::ObjectValue;
use libc;
use std::{mem, ptr};
@@ -31,7 +30,7 @@ static JSPROXYSLOT_EXPANDO: u32 = 0;
pub unsafe extern "C" fn get_property_descriptor(cx: *mut JSContext,
proxy: HandleObject,
id: HandleId,
- desc: MutableHandle<JSPropertyDescriptor>)
+ desc: MutableHandle<PropertyDescriptor>)
-> bool {
let handler = GetProxyHandler(proxy.get());
if !InvokeGetOwnPropertyDescriptor(handler, cx, proxy, id, desc) {
@@ -54,7 +53,7 @@ pub unsafe extern "C" fn get_property_descriptor(cx: *mut JSContext,
pub unsafe extern "C" fn define_property(cx: *mut JSContext,
proxy: HandleObject,
id: HandleId,
- desc: Handle<JSPropertyDescriptor>,
+ desc: Handle<PropertyDescriptor>,
result: *mut ObjectOpResult)
-> bool {
// FIXME: Workaround for https://github.com/rust-lang/rfcs/issues/718
@@ -67,7 +66,7 @@ pub unsafe extern "C" fn define_property(cx: *mut JSContext,
}
let expando = RootedObject::new(cx, ensure_expando_object(cx, proxy));
- JS_DefinePropertyById6(cx, expando.handle(), id, desc, result)
+ JS_DefinePropertyById(cx, expando.handle(), id, desc, result)
}
/// Deletes an expando off the given `proxy`.
@@ -126,7 +125,7 @@ pub fn ensure_expando_object(cx: *mut JSContext, obj: HandleObject) -> *mut JSOb
expando = JS_NewObjectWithGivenProto(cx, ptr::null_mut(), HandleObject::null());
assert!(!expando.is_null());
- SetProxyExtra(obj.get(), JSPROXYSLOT_EXPANDO, ObjectValue(&*expando));
+ SetProxyExtra(obj.get(), JSPROXYSLOT_EXPANDO, &ObjectValue(&*expando));
}
expando
}
@@ -134,7 +133,7 @@ pub fn ensure_expando_object(cx: *mut JSContext, obj: HandleObject) -> *mut JSOb
/// Set the property descriptor's object to `obj` and set it to enumerable,
/// and writable if `readonly` is true.
-pub fn fill_property_descriptor(desc: &mut JSPropertyDescriptor,
+pub fn fill_property_descriptor(desc: &mut PropertyDescriptor,
obj: *mut JSObject,
attrs: u32) {
desc.obj = obj;
diff --git a/components/script/dom/bindings/refcounted.rs b/components/script/dom/bindings/refcounted.rs
index c5d5be9bae9..057c67c0ef4 100644
--- a/components/script/dom/bindings/refcounted.rs
+++ b/components/script/dom/bindings/refcounted.rs
@@ -33,6 +33,7 @@ use std::cell::RefCell;
use std::collections::hash_map::Entry::{Occupied, Vacant};
use std::collections::hash_map::HashMap;
use std::marker::PhantomData;
+use std::os;
use std::sync::{Arc, Mutex};
@@ -199,7 +200,7 @@ impl LiveDOMReferences {
/// A JSTraceDataOp for tracing reflectors held in LIVE_REFERENCES
pub unsafe extern "C" fn trace_refcounted_objects(tracer: *mut JSTracer,
- _data: *mut libc::c_void) {
+ _data: *mut os::raw::c_void) {
LIVE_REFERENCES.with(|ref r| {
let r = r.borrow();
let live_references = r.as_ref().unwrap();
diff --git a/components/script/dom/bindings/structuredclone.rs b/components/script/dom/bindings/structuredclone.rs
index e1b15f59655..f9c4e98f2f9 100644
--- a/components/script/dom/bindings/structuredclone.rs
+++ b/components/script/dom/bindings/structuredclone.rs
@@ -7,9 +7,8 @@
use dom::bindings::error::{Error, Fallible};
use dom::bindings::global::GlobalRef;
-use js::glue::JS_STRUCTURED_CLONE_VERSION;
use js::jsapi::{HandleValue, MutableHandleValue};
-use js::jsapi::{JSContext, JS_ReadStructuredClone};
+use js::jsapi::{JSContext, JS_ReadStructuredClone, JS_STRUCTURED_CLONE_VERSION};
use js::jsapi::{JS_ClearPendingException, JS_WriteStructuredClone};
use libc::size_t;
use std::ptr;
diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs
index 7cbfc19ac44..1ec19ac15bc 100644
--- a/components/script/dom/bindings/trace.rs
+++ b/components/script/dom/bindings/trace.rs
@@ -49,8 +49,8 @@ use hyper::header::Headers;
use hyper::method::Method;
use hyper::mime::Mime;
use ipc_channel::ipc::{IpcReceiver, IpcSender};
-use js::jsapi::JS_CallUnbarrieredObjectTracer;
-use js::jsapi::{GCTraceKindToAscii, Heap, JSGCTraceKind, JSObject, JSTracer, JS_CallObjectTracer, JS_CallValueTracer};
+use js::glue::{CallObjectTracer, CallUnbarrieredObjectTracer, CallValueTracer};
+use js::jsapi::{GCTraceKindToAscii, Heap, TraceKind, JSObject, JSTracer};
use js::jsval::JSVal;
use js::rust::Runtime;
use layout_interface::{LayoutChan, LayoutRPC};
@@ -72,7 +72,6 @@ use smallvec::SmallVec;
use std::boxed::FnBox;
use std::cell::{Cell, UnsafeCell};
use std::collections::{BTreeMap, HashMap, HashSet};
-use std::ffi::CString;
use std::hash::{BuildHasher, Hash};
use std::intrinsics::return_address;
use std::iter::{FromIterator, IntoIterator};
@@ -114,14 +113,10 @@ pub fn trace_jsval(tracer: *mut JSTracer, description: &str, val: &Heap<JSVal>)
return;
}
- let name = CString::new(description).unwrap();
- (*tracer).debugPrinter_ = None;
- (*tracer).debugPrintIndex_ = !0;
- (*tracer).debugPrintArg_ = name.as_ptr() as *const libc::c_void;
debug!("tracing value {}", description);
- JS_CallValueTracer(tracer,
- val.ptr.get() as *mut _,
- GCTraceKindToAscii(val.get().trace_kind()));
+ CallValueTracer(tracer,
+ val.ptr.get() as *mut _,
+ GCTraceKindToAscii(val.get().trace_kind()));
}
}
@@ -129,28 +124,20 @@ pub fn trace_jsval(tracer: *mut JSTracer, description: &str, val: &Heap<JSVal>)
#[allow(unrooted_must_root)]
pub fn trace_reflector(tracer: *mut JSTracer, description: &str, reflector: &Reflector) {
unsafe {
- let name = CString::new(description).unwrap();
- (*tracer).debugPrinter_ = None;
- (*tracer).debugPrintIndex_ = !0;
- (*tracer).debugPrintArg_ = name.as_ptr() as *const libc::c_void;
debug!("tracing reflector {}", description);
- JS_CallUnbarrieredObjectTracer(tracer,
- reflector.rootable(),
- GCTraceKindToAscii(JSGCTraceKind::JSTRACE_OBJECT));
+ CallUnbarrieredObjectTracer(tracer,
+ reflector.rootable(),
+ GCTraceKindToAscii(TraceKind::Object));
}
}
/// Trace a `JSObject`.
pub fn trace_object(tracer: *mut JSTracer, description: &str, obj: &Heap<*mut JSObject>) {
unsafe {
- let name = CString::new(description).unwrap();
- (*tracer).debugPrinter_ = None;
- (*tracer).debugPrintIndex_ = !0;
- (*tracer).debugPrintArg_ = name.as_ptr() as *const libc::c_void;
debug!("tracing {}", description);
- JS_CallObjectTracer(tracer,
- obj.ptr.get() as *mut _,
- GCTraceKindToAscii(JSGCTraceKind::JSTRACE_OBJECT));
+ CallObjectTracer(tracer,
+ obj.ptr.get() as *mut _,
+ GCTraceKindToAscii(TraceKind::Object));
}
}
diff --git a/components/script/dom/bindings/utils.rs b/components/script/dom/bindings/utils.rs
index 9302bb40a09..ee31eca5504 100644
--- a/components/script/dom/bindings/utils.rs
+++ b/components/script/dom/bindings/utils.rs
@@ -7,13 +7,11 @@
use dom::bindings::codegen::InterfaceObjectMap;
use dom::bindings::codegen::PrototypeList;
use dom::bindings::codegen::PrototypeList::{MAX_PROTO_CHAIN_LENGTH, PROTO_OR_IFACE_LENGTH};
-use dom::bindings::conversions::{DOM_OBJECT_SLOT, is_dom_class};
-use dom::bindings::conversions::{private_from_proto_check, root_from_handleobject};
+use dom::bindings::conversions::{DOM_OBJECT_SLOT, is_dom_class, private_from_proto_check};
use dom::bindings::error::throw_invalid_this;
use dom::bindings::inheritance::TopTypeId;
use dom::bindings::trace::trace_object;
use dom::browsingcontext;
-use dom::window;
use heapsize::HeapSizeOf;
use js;
use js::glue::{CallJitGetterOp, CallJitMethodOp, CallJitSetterOp, IsWrapper};
@@ -23,15 +21,14 @@ use js::glue::{RUST_JSID_TO_INT, RUST_JSID_TO_STRING, UnwrapObject};
use js::jsapi::{CallArgs, CompartmentOptions, DOMCallbacks, GetGlobalForObjectCrossCompartment};
use js::jsapi::{HandleId, HandleObject, HandleValue, Heap, JSAutoCompartment, JSClass, JSContext};
use js::jsapi::{JSJitInfo, JSObject, JSTraceOp, JSTracer, JSVersion, JSWrapObjectCallbacks};
-use js::jsapi::{JS_DeletePropertyById1, JS_EnumerateStandardClasses, JS_FireOnNewGlobalObject};
+use js::jsapi::{JS_DeletePropertyById, JS_EnumerateStandardClasses, JS_FireOnNewGlobalObject};
use js::jsapi::{JS_ForwardGetPropertyTo, JS_GetClass, JS_GetLatin1StringCharsAndLength};
use js::jsapi::{JS_GetProperty, JS_GetPrototype, JS_GetReservedSlot, JS_HasProperty};
use js::jsapi::{JS_HasPropertyById, JS_IsExceptionPending, JS_IsGlobalObject, JS_NewGlobalObject};
-use js::jsapi::{JS_ObjectToOuterObject, JS_ResolveStandardClass, JS_SetProperty};
+use js::jsapi::{JS_ResolveStandardClass, JS_SetProperty, ToWindowProxyIfWindow};
use js::jsapi::{JS_SetReservedSlot, JS_StringHasLatin1Chars, MutableHandleValue, ObjectOpResult};
-use js::jsapi::{OnNewGlobalHookOption, RootedObject};
-use js::jsval::{JSVal};
-use js::jsval::{PrivateValue, UndefinedValue};
+use js::jsapi::{OnNewGlobalHookOption, RootedObject, RootedValue};
+use js::jsval::{JSVal, ObjectValue, PrivateValue, UndefinedValue};
use js::rust::{GCMethods, ToString};
use js::{JS_CALLEE};
use libc;
@@ -152,7 +149,8 @@ pub fn get_property_on_prototype(cx: *mut JSContext,
return true;
}
- JS_ForwardGetPropertyTo(cx, proto.handle(), id, proxy, vp)
+ let receiver = RootedValue::new(cx, ObjectValue(&**proxy.ptr));
+ JS_ForwardGetPropertyTo(cx, proto.handle(), id, receiver.handle(), vp)
}
}
@@ -208,7 +206,7 @@ pub fn is_platform_object(obj: *mut JSObject) -> bool {
}
// Now for simplicity check for security wrappers before anything else
if IsWrapper(obj) {
- let unwrapped_obj = UnwrapObject(obj, /* stopAtOuter = */ 0);
+ let unwrapped_obj = UnwrapObject(obj, /* stopAtWindowProxy = */ 0);
if unwrapped_obj.is_null() {
return false;
}
@@ -302,8 +300,9 @@ pub fn create_dom_global(cx: *mut JSContext,
-> *mut JSObject {
unsafe {
let mut options = CompartmentOptions::default();
- options.version_ = JSVersion::JSVERSION_ECMA_5;
- options.traceGlobal_ = trace;
+ options.behaviors_.version_ = JSVersion::JSVERSION_ECMA_5;
+ options.creationOptions_.traceGlobal_ = trace;
+ options.creationOptions_.sharedMemoryAndAtomics_ = true;
let obj =
RootedObject::new(cx,
@@ -338,9 +337,7 @@ pub unsafe fn finalize_global(obj: *mut JSObject) {
for idx in 0..PROTO_OR_IFACE_LENGTH as isize {
let entry = list.offset(idx);
let value = *entry;
- if <*mut JSObject>::needs_post_barrier(value) {
- <*mut JSObject>::relocate(entry);
- }
+ <*mut JSObject>::post_barrier(entry, value, ptr::null_mut());
}
let _: Box<ProtoOrIfaceArray> = Box::from_raw(protolist);
}
@@ -422,7 +419,9 @@ unsafe extern "C" fn pre_wrap(cx: *mut JSContext,
_object_passed_to_wrap: HandleObject)
-> *mut JSObject {
let _ac = JSAutoCompartment::new(cx, obj.get());
- JS_ObjectToOuterObject(cx, obj)
+ let obj = ToWindowProxyIfWindow(obj.get());
+ assert!(!obj.is_null());
+ obj
}
/// Callback table for use with JS_SetWrapObjectCallbacks
@@ -431,21 +430,13 @@ pub static WRAP_CALLBACKS: JSWrapObjectCallbacks = JSWrapObjectCallbacks {
preWrap: Some(pre_wrap),
};
-/// Callback to outerize windows.
-pub unsafe extern "C" fn outerize_global(_cx: *mut JSContext, obj: HandleObject) -> *mut JSObject {
- debug!("outerizing");
- let win = root_from_handleobject::<window::Window>(obj).unwrap();
- let context = win.browsing_context();
- context.window_proxy()
-}
-
/// Deletes the property `id` from `object`.
pub unsafe fn delete_property_by_id(cx: *mut JSContext,
object: HandleObject,
id: HandleId,
bp: *mut ObjectOpResult)
-> bool {
- JS_DeletePropertyById1(cx, object, id, bp)
+ JS_DeletePropertyById(cx, object, id, bp)
}
unsafe fn generic_call(cx: *mut JSContext,
diff --git a/components/script/dom/browsingcontext.rs b/components/script/dom/browsingcontext.rs
index c88b4e053e3..b314bce603d 100644
--- a/components/script/dom/browsingcontext.rs
+++ b/components/script/dom/browsingcontext.rs
@@ -12,15 +12,15 @@ use dom::bindings::utils::get_array_index_from_id;
use dom::document::Document;
use dom::element::Element;
use dom::window::Window;
+use js::JSCLASS_IS_GLOBAL;
use js::glue::{CreateWrapperProxyHandler, ProxyTraps, NewWindowProxy};
use js::glue::{GetProxyPrivate, SetProxyExtra};
-use js::jsapi::{Handle, HandleId, HandleObject, JSAutoCompartment, JSAutoRequest, JSContext};
-use js::jsapi::{JSErrNum, JSObject, JSPropertyDescriptor, JS_DefinePropertyById6};
+use js::jsapi::{Handle, HandleId, HandleObject, HandleValue, JSAutoCompartment, JSAutoRequest};
+use js::jsapi::{JSContext, JSPROP_READONLY, JSErrNum, JSObject, PropertyDescriptor, JS_DefinePropertyById};
use js::jsapi::{JS_ForwardGetPropertyTo, JS_ForwardSetPropertyTo, JS_GetClass};
use js::jsapi::{JS_GetOwnPropertyDescriptorById, JS_HasPropertyById, MutableHandle};
use js::jsapi::{MutableHandleValue, ObjectOpResult, RootedObject, RootedValue};
-use js::jsval::{ObjectValue, UndefinedValue, PrivateValue};
-use js::{JSCLASS_IS_GLOBAL, JSPROP_READONLY};
+use js::jsval::{UndefinedValue, PrivateValue};
#[dom_struct]
pub struct BrowsingContext {
@@ -59,7 +59,7 @@ impl BrowsingContext {
let object = box BrowsingContext::new_inherited(frame_element);
let raw = Box::into_raw(object);
- SetProxyExtra(window_proxy.ptr, 0, PrivateValue(raw as *const _));
+ SetProxyExtra(window_proxy.ptr, 0, &PrivateValue(raw as *const _));
(*raw).init_reflector(window_proxy.ptr);
@@ -131,7 +131,7 @@ unsafe fn GetSubframeWindow(cx: *mut JSContext,
unsafe extern "C" fn getOwnPropertyDescriptor(cx: *mut JSContext,
proxy: HandleObject,
id: HandleId,
- desc: MutableHandle<JSPropertyDescriptor>)
+ desc: MutableHandle<PropertyDescriptor>)
-> bool {
let window = GetSubframeWindow(cx, proxy, id);
if let Some(window) = window {
@@ -159,7 +159,7 @@ unsafe extern "C" fn getOwnPropertyDescriptor(cx: *mut JSContext,
unsafe extern "C" fn defineProperty(cx: *mut JSContext,
proxy: HandleObject,
id: HandleId,
- desc: Handle<JSPropertyDescriptor>,
+ desc: Handle<PropertyDescriptor>,
res: *mut ObjectOpResult)
-> bool {
if get_array_index_from_id(cx, id).is_some() {
@@ -172,7 +172,7 @@ unsafe extern "C" fn defineProperty(cx: *mut JSContext,
}
let target = RootedObject::new(cx, GetProxyPrivate(*proxy.ptr).to_object());
- JS_DefinePropertyById6(cx, target.handle(), id, desc, res)
+ JS_DefinePropertyById(cx, target.handle(), id, desc, res)
}
#[allow(unsafe_code)]
@@ -200,7 +200,7 @@ unsafe extern "C" fn has(cx: *mut JSContext,
#[allow(unsafe_code)]
unsafe extern "C" fn get(cx: *mut JSContext,
proxy: HandleObject,
- receiver: HandleObject,
+ receiver: HandleValue,
id: HandleId,
vp: MutableHandleValue)
-> bool {
@@ -217,9 +217,9 @@ unsafe extern "C" fn get(cx: *mut JSContext,
#[allow(unsafe_code)]
unsafe extern "C" fn set(cx: *mut JSContext,
proxy: HandleObject,
- receiver: HandleObject,
id: HandleId,
- vp: MutableHandleValue,
+ v: HandleValue,
+ receiver: HandleValue,
res: *mut ObjectOpResult)
-> bool {
if get_array_index_from_id(cx, id).is_some() {
@@ -229,12 +229,11 @@ unsafe extern "C" fn set(cx: *mut JSContext,
}
let target = RootedObject::new(cx, GetProxyPrivate(*proxy.ptr).to_object());
- let receiver = RootedValue::new(cx, ObjectValue(&**receiver.ptr));
JS_ForwardSetPropertyTo(cx,
target.handle(),
id,
- vp.to_handle(),
- receiver.handle(),
+ v,
+ receiver,
res)
}
diff --git a/components/script/dom/imagedata.rs b/components/script/dom/imagedata.rs
index cbc3b489a21..abcb9b5640b 100644
--- a/components/script/dom/imagedata.rs
+++ b/components/script/dom/imagedata.rs
@@ -39,7 +39,9 @@ impl ImageData {
let js_object: *mut JSObject = JS_NewUint8ClampedArray(cx, width * height * 4);
if let Some(vec) = data {
- let js_object_data: *mut uint8_t = JS_GetUint8ClampedArrayData(js_object, ptr::null());
+ let mut is_shared = false;
+ let js_object_data: *mut uint8_t = JS_GetUint8ClampedArrayData(js_object, &mut is_shared, ptr::null());
+ assert!(!is_shared);
ptr::copy_nonoverlapping(vec.as_ptr(), js_object_data, vec.len())
}
(*imagedata).data.set(js_object);
@@ -53,7 +55,10 @@ impl ImageData {
pub fn get_data_array(&self, global: &GlobalRef) -> Vec<u8> {
unsafe {
let cx = global.get_cx();
- let data: *const uint8_t = JS_GetUint8ClampedArrayData(self.Data(cx), ptr::null()) as *const uint8_t;
+ let mut is_shared = false;
+ let data: *const uint8_t =
+ JS_GetUint8ClampedArrayData(self.Data(cx), &mut is_shared, ptr::null()) as *const uint8_t;
+ assert!(!is_shared);
let len = self.Width() * self.Height() * 4;
slice::from_raw_parts(data, len as usize).to_vec()
}
diff --git a/components/script/dom/textencoder.rs b/components/script/dom/textencoder.rs
index 114cca38908..4eae6a97707 100644
--- a/components/script/dom/textencoder.rs
+++ b/components/script/dom/textencoder.rs
@@ -76,8 +76,9 @@ impl TextEncoderMethods for TextEncoder {
let encoded = self.encoder.encode(&input.0, EncoderTrap::Strict).unwrap();
let length = encoded.len() as u32;
let js_object: *mut JSObject = JS_NewUint8Array(cx, length);
-
- let js_object_data: *mut uint8_t = JS_GetUint8ArrayData(js_object, ptr::null());
+ let mut is_shared = false;
+ let js_object_data: *mut uint8_t = JS_GetUint8ArrayData(js_object, &mut is_shared, ptr::null());
+ assert!(!is_shared);
ptr::copy_nonoverlapping(encoded.as_ptr(), js_object_data, length as usize);
js_object
}
diff --git a/components/script/dom/websocket.rs b/components/script/dom/websocket.rs
index 615881e789b..861c91090c8 100644
--- a/components/script/dom/websocket.rs
+++ b/components/script/dom/websocket.rs
@@ -604,7 +604,9 @@ impl Runnable for MessageReceivedTask {
BinaryType::Arraybuffer => {
let len = data.len() as uint32_t;
let buf = JS_NewArrayBuffer(cx, len);
- let buf_data: *mut uint8_t = JS_GetArrayBufferData(buf, ptr::null());
+ let mut is_shared = false;
+ let buf_data: *mut uint8_t = JS_GetArrayBufferData(buf, &mut is_shared, ptr::null());
+ assert!(!is_shared);
ptr::copy_nonoverlapping(data.as_ptr(), buf_data, len as usize);
buf.to_jsval(cx, message.handle_mut());
}
diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs
index 94b6d2c7fb3..6394f01ef27 100644
--- a/components/script/dom/window.rs
+++ b/components/script/dom/window.rs
@@ -37,7 +37,7 @@ use gfx_traits::LayerId;
use ipc_channel::ipc::{self, IpcSender};
use js::jsapi::{Evaluate2, MutableHandleValue};
use js::jsapi::{HandleValue, JSContext};
-use js::jsapi::{JSAutoCompartment, JSAutoRequest, JS_GC, JS_GetRuntime};
+use js::jsapi::{JSAutoCompartment, JSAutoRequest, JS_GC, JS_GetRuntime, SetWindowProxy};
use js::rust::CompileOptionsWrapper;
use js::rust::Runtime;
use layout_interface::{ContentBoxResponse, ContentBoxesResponse, ResolvedStyleResponse, ScriptReflow};
@@ -1192,9 +1192,15 @@ impl Window {
self.layout_rpc.margin_style()
}
+ #[allow(unsafe_code)]
pub fn init_browsing_context(&self, browsing_context: &BrowsingContext) {
assert!(self.browsing_context.get().is_none());
self.browsing_context.set(Some(&browsing_context));
+ let window = self.reflector().get_jsobject();
+ let cx = self.get_cx();
+ let _ar = JSAutoRequest::new(cx);
+ let _ac = JSAutoCompartment::new(cx, window.get());
+ unsafe { SetWindowProxy(cx, window, browsing_context.reflector().get_jsobject()); }
}
/// Commence a new URL load which will either replace this window or scroll to a fragment.
diff --git a/components/script/dom/workerglobalscope.rs b/components/script/dom/workerglobalscope.rs
index fbfd6a1a8bc..5a4a2d9a7c8 100644
--- a/components/script/dom/workerglobalscope.rs
+++ b/components/script/dom/workerglobalscope.rs
@@ -18,7 +18,8 @@ use dom::window::{base64_atob, base64_btoa};
use dom::workerlocation::WorkerLocation;
use dom::workernavigator::WorkerNavigator;
use ipc_channel::ipc::IpcSender;
-use js::jsapi::{HandleValue, JSAutoRequest, JSContext, JSRuntime};
+use js::jsapi::{HandleValue, JSAutoRequest, JSContext, JSRuntime, RootedValue};
+use js::jsval::UndefinedValue;
use js::rust::Runtime;
use msg::constellation_msg::{ConstellationChan, PipelineId};
use net_traits::{LoadContext, ResourceThread, load_whole_resource};
@@ -216,6 +217,7 @@ impl WorkerGlobalScopeMethods for WorkerGlobalScope {
};
}
+ let mut rval = RootedValue::new(self.runtime.cx(), UndefinedValue());
for url in urls {
let (url, source) = match load_whole_resource(LoadContext::Script, &self.resource_thread, url, None) {
Err(_) => return Err(Error::Network),
@@ -225,7 +227,7 @@ impl WorkerGlobalScopeMethods for WorkerGlobalScope {
};
match self.runtime.evaluate_script(
- self.reflector().get_jsobject(), source, url.to_string(), 1) {
+ self.reflector().get_jsobject(), &source, url.as_str(), 1, rval.handle_mut()) {
Ok(_) => (),
Err(_) => {
println!("evaluate_script failed");
@@ -316,8 +318,9 @@ impl WorkerGlobalScopeMethods for WorkerGlobalScope {
impl WorkerGlobalScope {
pub fn execute_script(&self, source: DOMString) {
+ let mut rval = RootedValue::new(self.runtime.cx(), UndefinedValue());
match self.runtime.evaluate_script(
- self.reflector().get_jsobject(), String::from(source), self.worker_url.to_string(), 1) {
+ self.reflector().get_jsobject(), &source, self.worker_url.as_str(), 1, rval.handle_mut()) {
Ok(_) => (),
Err(_) => {
if self.is_closing() {
diff --git a/components/script/script_runtime.rs b/components/script/script_runtime.rs
index c14fa1cf021..783433b9a21 100644
--- a/components/script/script_runtime.rs
+++ b/components/script/script_runtime.rs
@@ -17,12 +17,12 @@ use js::jsapi::{JSGCMode, JSGCParamKey, JS_SetGCParameter, JS_SetGlobalJitCompil
use js::jsapi::{JSJitCompilerOption, JS_SetOffthreadIonCompilationEnabled, JS_SetParallelParsingEnabled};
use js::jsapi::{JSObject, RuntimeOptionsRef, SetPreserveWrapperCallback};
use js::rust::Runtime;
-use libc;
use profile_traits::mem::{Report, ReportKind, ReportsChan};
use script_thread::{Runnable, STACK_ROOTS, trace_thread};
use std::cell::Cell;
use std::io::{Write, stdout};
use std::marker::PhantomData;
+use std::os;
use std::ptr;
use time::{Tm, now};
use util::opts;
@@ -362,7 +362,7 @@ unsafe extern "C" fn gc_slice_callback(_rt: *mut JSRuntime, progress: GCProgress
}
#[allow(unsafe_code)]
-unsafe extern "C" fn debug_gc_callback(_rt: *mut JSRuntime, status: JSGCStatus, _data: *mut libc::c_void) {
+unsafe extern "C" fn debug_gc_callback(_rt: *mut JSRuntime, status: JSGCStatus, _data: *mut os::raw::c_void) {
match status {
JSGCStatus::JSGC_BEGIN => thread_state::enter(thread_state::IN_GC),
JSGCStatus::JSGC_END => thread_state::exit(thread_state::IN_GC),
@@ -370,7 +370,7 @@ unsafe extern "C" fn debug_gc_callback(_rt: *mut JSRuntime, status: JSGCStatus,
}
#[allow(unsafe_code)]
-unsafe extern fn trace_rust_roots(tr: *mut JSTracer, _data: *mut libc::c_void) {
+unsafe extern fn trace_rust_roots(tr: *mut JSTracer, _data: *mut os::raw::c_void) {
trace_thread(tr);
trace_traceables(tr);
trace_roots(tr);
diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs
index 4768273c16e..2896c2306dc 100644
--- a/components/script/script_thread.rs
+++ b/components/script/script_thread.rs
@@ -51,9 +51,9 @@ use hyper::method::Method;
use hyper::mime::{Mime, SubLevel, TopLevel};
use ipc_channel::ipc::{self, IpcSender};
use ipc_channel::router::ROUTER;
+use js::glue::GetWindowProxyClass;
use js::jsapi::{DOMProxyShadowsResult, HandleId, HandleObject, RootedValue};
-use js::jsapi::{JSAutoRequest, JS_SetWrapObjectCallbacks};
-use js::jsapi::{JSContext, JSTracer};
+use js::jsapi::{JSAutoRequest, JSContext, JS_SetWrapObjectCallbacks, JSTracer, SetWindowProxyClass};
use js::jsval::UndefinedValue;
use js::rust::Runtime;
use layout_interface::{ReflowQueryType};
@@ -515,6 +515,7 @@ impl ScriptThread {
unsafe {
JS_SetWrapObjectCallbacks(runtime.rt(),
&WRAP_CALLBACKS);
+ SetWindowProxyClass(runtime.rt(), GetWindowProxyClass());
}
// Ask the router to proxy IPC messages from the devtools to us.
diff --git a/components/servo/Cargo.lock b/components/servo/Cargo.lock
index 553f32d446e..5afafafc99d 100644
--- a/components/servo/Cargo.lock
+++ b/components/servo/Cargo.lock
@@ -1019,13 +1019,13 @@ dependencies = [
[[package]]
name = "js"
version = "0.1.2"
-source = "git+https://github.com/servo/rust-mozjs#efe805affa75d776316e9ea6113f85cdad1e82ed"
+source = "git+https://github.com/servo/rust-mozjs#8ad6c1148fd77e5b9dc2ce0f0ab40d4f455f6f4e"
dependencies = [
"heapsize 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
"mozjs_sys 0.0.0 (git+https://github.com/servo/mozjs)",
- "num 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)",
"rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -1270,7 +1270,7 @@ dependencies = [
[[package]]
name = "mozjs_sys"
version = "0.0.0"
-source = "git+https://github.com/servo/mozjs#3122a1e1a80b78377ae1ce8e7edd4ad3bcbb3d65"
+source = "git+https://github.com/servo/mozjs#2af5849a97a9f18acd482940ba3fa0c6797ed7eb"
dependencies = [
"libc 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
"libz-sys 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
diff --git a/ports/cef/Cargo.lock b/ports/cef/Cargo.lock
index b724e54e5b6..9a3665bc24e 100644
--- a/ports/cef/Cargo.lock
+++ b/ports/cef/Cargo.lock
@@ -940,13 +940,13 @@ dependencies = [
[[package]]
name = "js"
version = "0.1.2"
-source = "git+https://github.com/servo/rust-mozjs#efe805affa75d776316e9ea6113f85cdad1e82ed"
+source = "git+https://github.com/servo/rust-mozjs#8ad6c1148fd77e5b9dc2ce0f0ab40d4f455f6f4e"
dependencies = [
"heapsize 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
"mozjs_sys 0.0.0 (git+https://github.com/servo/mozjs)",
- "num 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)",
"rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -1184,7 +1184,7 @@ dependencies = [
[[package]]
name = "mozjs_sys"
version = "0.0.0"
-source = "git+https://github.com/servo/mozjs#3122a1e1a80b78377ae1ce8e7edd4ad3bcbb3d65"
+source = "git+https://github.com/servo/mozjs#2af5849a97a9f18acd482940ba3fa0c6797ed7eb"
dependencies = [
"libc 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
"libz-sys 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
diff --git a/ports/gonk/Cargo.lock b/ports/gonk/Cargo.lock
index ccbf31025ca..9ea3972bd5b 100644
--- a/ports/gonk/Cargo.lock
+++ b/ports/gonk/Cargo.lock
@@ -923,13 +923,13 @@ dependencies = [
[[package]]
name = "js"
version = "0.1.2"
-source = "git+https://github.com/servo/rust-mozjs#efe805affa75d776316e9ea6113f85cdad1e82ed"
+source = "git+https://github.com/servo/rust-mozjs#8ad6c1148fd77e5b9dc2ce0f0ab40d4f455f6f4e"
dependencies = [
"heapsize 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
"mozjs_sys 0.0.0 (git+https://github.com/servo/mozjs)",
- "num 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)",
"rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -1167,7 +1167,7 @@ dependencies = [
[[package]]
name = "mozjs_sys"
version = "0.0.0"
-source = "git+https://github.com/servo/mozjs#3122a1e1a80b78377ae1ce8e7edd4ad3bcbb3d65"
+source = "git+https://github.com/servo/mozjs#2af5849a97a9f18acd482940ba3fa0c6797ed7eb"
dependencies = [
"libc 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
"libz-sys 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
diff --git a/tests/wpt/mozilla/tests/mozilla/interfaces.html b/tests/wpt/mozilla/tests/mozilla/interfaces.html
index 31495c457f0..087411f5157 100644
--- a/tests/wpt/mozilla/tests/mozilla/interfaces.html
+++ b/tests/wpt/mozilla/tests/mozilla/interfaces.html
@@ -30,7 +30,6 @@ var ecmaGlobals = [
"Int32Array",
"Int8Array",
"InternalError",
- "Intl",
"Iterator",
"JSON",
"Map",
@@ -41,19 +40,11 @@ var ecmaGlobals = [
"Proxy",
"RangeError",
"ReferenceError",
+ "Reflect",
"RegExp",
"SIMD",
"Set",
"SharedArrayBuffer",
- "SharedFloat32Array",
- "SharedFloat64Array",
- "SharedInt16Array",
- "SharedInt32Array",
- "SharedInt8Array",
- "SharedUint16Array",
- "SharedUint32Array",
- "SharedUint8Array",
- "SharedUint8ClampedArray",
"StopIteration",
"String",
"Symbol",