diff options
Diffstat (limited to 'src/components/script/dom')
30 files changed, 283 insertions, 230 deletions
diff --git a/src/components/script/dom/attrlist.rs b/src/components/script/dom/attrlist.rs index b172e976705..839043becf1 100644 --- a/src/components/script/dom/attrlist.rs +++ b/src/components/script/dom/attrlist.rs @@ -35,7 +35,7 @@ impl AttrList { } pub fn Item(&self, index: u32) -> Option<JS<Attr>> { - self.owner.get().attrs.get_opt(index as uint).map(|x| x.clone()) + self.owner.get().attrs.get(index as uint).map(|x| x.clone()) } pub fn IndexedGetter(&self, index: u32, found: &mut bool) -> Option<JS<Attr>> { diff --git a/src/components/script/dom/bindings/callback.rs b/src/components/script/dom/bindings/callback.rs index b965fcbfb72..dff5aeb6a2b 100644 --- a/src/components/script/dom/bindings/callback.rs +++ b/src/components/script/dom/bindings/callback.rs @@ -12,17 +12,17 @@ use std::cast; use std::libc; use std::ptr; -use extra::serialize::{Encodable, Encoder}; +use serialize::{Encodable, Encoder}; pub enum ExceptionHandling { // Report any exception and don't throw it to the caller code. - eReportExceptions, + ReportExceptions, // Throw an exception to the caller code if the thrown exception is a // binding object for a DOMError from the caller's scope, otherwise report // it. - eRethrowContentExceptions, + RethrowContentExceptions, // Throw any exception to the caller code. - eRethrowExceptions + RethrowExceptions } #[deriving(Clone,Eq)] diff --git a/src/components/script/dom/bindings/codegen/Bindings.conf b/src/components/script/dom/bindings/codegen/Bindings.conf index 34deb138af2..2380a0eaeed 100644 --- a/src/components/script/dom/bindings/codegen/Bindings.conf +++ b/src/components/script/dom/bindings/codegen/Bindings.conf @@ -52,6 +52,7 @@ DOMInterfaces = { 'Element': { 'needsAbstract': [ 'attributes', + 'className', 'getBoundingClientRect', 'getClientRects', 'getElementsByClassName', @@ -89,6 +90,7 @@ DOMInterfaces = { 'isEqualNode', 'nodeName', 'nodeValue', + 'normalize', 'removeChild', 'replaceChild', 'textContent', diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index 2b3b4ca8bab..d06bfb0bc31 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -184,7 +184,7 @@ class CGMethodCall(CGThing): if requiredArgs > 0: code = ( - "if (argc < %d) {\n" + "if argc < %d {\n" " return 0; //XXXjdm throw exception\n" " //return ThrowErrorMessage(cx, MSG_MISSING_ARGUMENTS, %s);\n" "}" % (requiredArgs, methodName)) @@ -370,7 +370,7 @@ class CGMethodCall(CGThing): overloadCGThings = [] overloadCGThings.append( - CGGeneric("let argcount = argc.min(&%d);" % + CGGeneric("let argcount = cmp::min(argc, %d);" % maxArgCount)) overloadCGThings.append( CGSwitch("argcount", @@ -389,7 +389,7 @@ class CGMethodCall(CGThing): class FakeCastableDescriptor(): def __init__(self, descriptor): self.castable = True - self.nativeType = "*Box<%s>" % descriptor.concreteType + self.nativeType = "*%s" % descriptor.concreteType self.name = descriptor.name class FakeInterface: def inheritanceDepth(self): @@ -720,7 +720,7 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None, return handleDefault(conversionCode, "${declName}.SetNull()") - value = "str::from_utf8(data).to_owned()" + value = "str::from_utf8(data).unwrap().to_owned()" if type.nullable(): value = "Some(%s)" % value @@ -993,7 +993,7 @@ def instantiateJSToNativeConversionTemplate(templateTuple, replacements, conversion = CGList( [CGGeneric( - string.Template("if (${index} < ${argc}) {").substitute( + string.Template("if ${index} < ${argc} {").substitute( argcAndIndex )), declConstruct, @@ -1132,7 +1132,7 @@ def getWrapTemplateForType(type, descriptorProvider, result, successCode, raise TypeError("We don't support nullable enumerated return types " "yet") return ("""assert!((%(result)s as uint) < %(strings)s.len()); -let %(resultStr)s: *JSString = JS_NewStringCopyN(cx, ptr::to_unsafe_ptr(&%(strings)s[%(result)s as u32].value[0]) as *i8, %(strings)s[%(result)s as u32].length as libc::size_t); +let %(resultStr)s: *JSString = JS_NewStringCopyN(cx, &%(strings)s[%(result)s as u32].value[0] as *i8, %(strings)s[%(result)s as u32].length as libc::size_t); if %(resultStr)s.is_null() { return 0; } @@ -1641,7 +1641,9 @@ class CGImports(CGWrapper): # sometimes produces two 'break's in a row. See for example # CallbackMember.getArgConversions. 'unreachable_code', + 'non_camel_case_types', 'non_uppercase_statics', + 'unnecessary_parens', 'unused_imports', 'unused_variable', 'unused_unsafe', @@ -1688,11 +1690,11 @@ class CGNamespace(CGWrapper): def DOMClass(descriptor): protoList = ['PrototypeList::id::' + proto for proto in descriptor.prototypeChain] - # Pad out the list to the right length with _ID_Count so we - # guarantee that all the lists are the same length. _ID_Count + # Pad out the list to the right length with IDCount so we + # guarantee that all the lists are the same length. IDCount # is never the ID of any prototype, so it's safe to use as # padding. - protoList.extend(['PrototypeList::id::_ID_Count'] * (descriptor.config.maxProtoChainLength - len(protoList))) + protoList.extend(['PrototypeList::id::IDCount'] * (descriptor.config.maxProtoChainLength - len(protoList))) prototypeChainString = ', '.join(protoList) return """DOMClass { interface_chain: [ %s ], @@ -2066,7 +2068,7 @@ def CreateBindingJSObject(descriptor, parent=None): let handler = js_info.get().get_ref().dom_static.proxy_handlers.get(&(PrototypeList::id::%s as uint)); """ % descriptor.name create += handler + """ let obj = NewProxyObject(aCx, *handler, - ptr::to_unsafe_ptr(&PrivateValue(squirrel_away_unique(aObject) as *libc::c_void)), + &PrivateValue(squirrel_away_unboxed(aObject) as *libc::c_void), proto, %s, ptr::null(), ptr::null()); if obj.is_null() { @@ -2084,7 +2086,7 @@ def CreateBindingJSObject(descriptor, parent=None): } JS_SetReservedSlot(obj, DOM_OBJECT_SLOT as u32, - PrivateValue(squirrel_away_unique(aObject) as *libc::c_void)); + PrivateValue(squirrel_away_unboxed(aObject) as *libc::c_void)); """ return create @@ -2230,7 +2232,7 @@ class CGCreateInterfaceObjectsMethod(CGAbstractMethod): val = ('%(' + name + ')s') % self.properties.variableNames(False) if val == "ptr::null()": return val - return "ptr::to_unsafe_ptr(&%s[0])" % val + return "&%s[0]" % val call = """return CreateInterfaceObjects2(aCx, aGlobal, aReceiver, parentProto, %s, %s, %d, @@ -2376,7 +2378,7 @@ class CGDefineDOMInterfaceMethod(CGAbstractMethod): trace: %s }; js_info.dom_static.proxy_handlers.insert(PrototypeList::id::%s as uint, - CreateProxyHandler(ptr::to_unsafe_ptr(&traps), ptr::to_unsafe_ptr(&Class) as *libc::c_void)); + CreateProxyHandler(&traps, cast::transmute(&Class))); """ % (FINALIZE_HOOK_NAME, ('Some(%s)' % TRACE_HOOK_NAME), @@ -2388,7 +2390,7 @@ class CGDefineDOMInterfaceMethod(CGAbstractMethod): body = "" #XXXjdm xray stuff isn't necessary yet return (body + """ let cx = js_info.js_context.borrow().ptr; - let receiver = js_info.js_compartment.borrow().global_obj.borrow().ptr; + let receiver = js_info.js_compartment.borrow().global_obj; let global: *JSObject = JS_GetGlobalForObject(cx, receiver); return %s(cx, global, receiver).is_not_null();""" % (getter)) @@ -2469,7 +2471,7 @@ class CGCallGenerator(CGThing): self.cgRoot.append(call) if isFallible: - self.cgRoot.append(CGGeneric("if (result_fallible.is_err()) {")) + self.cgRoot.append(CGGeneric("if result_fallible.is_err() {")) self.cgRoot.append(CGIndenter(errorReport)) self.cgRoot.append(CGGeneric("}")) if result is not None: @@ -2693,7 +2695,7 @@ class CGAbstractBindingMethod(CGAbstractExternMethod): " return false as JSBool;\n" "}\n" "\n" - "let this: *Box<%s>;" % self.descriptor.concreteType)) + "let this: *%s;" % self.descriptor.concreteType)) def generate_code(self): assert(False) # Override me @@ -2721,7 +2723,7 @@ class CGSpecializedMethod(CGAbstractExternMethod): self.method = method name = method.identifier.name args = [Argument('*JSContext', 'cx'), Argument('JSHandleObject', 'obj'), - Argument('*mut Box<%s>' % descriptor.concreteType, 'this'), + Argument('*mut %s' % descriptor.concreteType, 'this'), Argument('libc::c_uint', 'argc'), Argument('*mut JSVal', 'vp')] CGAbstractExternMethod.__init__(self, descriptor, name, 'JSBool', args) @@ -2732,13 +2734,13 @@ class CGSpecializedMethod(CGAbstractExternMethod): argsPre = [] if name in self.descriptor.needsAbstract: abstractName = re.sub(r'<\w+>', '', self.descriptor.nativeType) - extraPre = ' let mut abstract_this = %s::from_box(this);\n' % abstractName + extraPre = ' let mut abstract_this = %s::from_raw(this);\n' % abstractName argsPre = ['&mut abstract_this'] return CGWrapper(CGMethodCall(argsPre, nativeName, self.method.isStatic(), self.descriptor, self.method), pre=extraPre + - " let obj = (*obj.unnamed);\n" + - " let this = &mut (*this).data;\n").define() + " let obj = *obj.unnamed;\n" + + " let this = &mut *this;\n").define() class CGGenericGetter(CGAbstractBindingMethod): """ @@ -2776,7 +2778,7 @@ class CGSpecializedGetter(CGAbstractExternMethod): name = 'get_' + attr.identifier.name args = [ Argument('*JSContext', 'cx'), Argument('JSHandleObject', 'obj'), - Argument('*mut Box<%s>' % descriptor.concreteType, 'this'), + Argument('*mut %s' % descriptor.concreteType, 'this'), Argument('*mut JSVal', 'vp') ] CGAbstractExternMethod.__init__(self, descriptor, name, "JSBool", args) @@ -2790,15 +2792,15 @@ class CGSpecializedGetter(CGAbstractExternMethod): getter=True)) if name in self.descriptor.needsAbstract: abstractName = re.sub(r'<\w+>', '', self.descriptor.nativeType) - extraPre = ' let mut abstract_this = %s::from_box(this);\n' % abstractName + extraPre = ' let mut abstract_this = %s::from_raw(this);\n' % abstractName argsPre = ['&mut abstract_this'] if self.attr.type.nullable() or not infallible: nativeName = "Get" + nativeName return CGWrapper(CGIndenter(CGGetterCall(argsPre, self.attr.type, nativeName, self.descriptor, self.attr)), pre=extraPre + - " let obj = (*obj.unnamed);\n" + - " let this = &mut (*this).data;\n").define() + " let obj = *obj.unnamed;\n" + + " let this = &mut *this;\n").define() class CGGenericSetter(CGAbstractBindingMethod): """ @@ -2842,7 +2844,7 @@ class CGSpecializedSetter(CGAbstractExternMethod): name = 'set_' + attr.identifier.name args = [ Argument('*JSContext', 'cx'), Argument('JSHandleObject', 'obj'), - Argument('*mut Box<%s>' % descriptor.concreteType, 'this'), + Argument('*mut %s' % descriptor.concreteType, 'this'), Argument('*mut JSVal', 'argv')] CGAbstractExternMethod.__init__(self, descriptor, name, "JSBool", args) @@ -2853,13 +2855,13 @@ class CGSpecializedSetter(CGAbstractExternMethod): extraPre = '' if name in self.descriptor.needsAbstract: abstractName = re.sub(r'<\w+>', '', self.descriptor.nativeType) - extraPre = ' let mut abstract_this = %s::from_box(this);\n' % abstractName + extraPre = ' let mut abstract_this = %s::from_raw(this);\n' % abstractName argsPre = ['&mut abstract_this'] return CGWrapper(CGIndenter(CGSetterCall(argsPre, self.attr.type, nativeName, self.descriptor, self.attr)), pre=extraPre + - " let obj = (*obj.unnamed);\n" + - " let this = &mut (*this).data;\n").define() + " let obj = *obj.unnamed;\n" + + " let this = &mut *this;\n").define() def infallibleForMember(member, type, descriptorProvider): """ @@ -2970,6 +2972,34 @@ class CGEnum(CGThing): """ % (",\n ".join(map(getEnumValueName, self.enum.values())), ",\n ".join(['EnumEntry {value: &"' + val + '", length: ' + str(len(val)) + '}' for val in self.enum.values()])) + +def convertConstIDLValueToRust(value): + tag = value.type.tag() + if tag in [IDLType.Tags.int8, IDLType.Tags.uint8, + IDLType.Tags.int16, IDLType.Tags.uint16, + IDLType.Tags.int32, IDLType.Tags.uint32, + IDLType.Tags.int64, IDLType.Tags.uint64, + IDLType.Tags.float, IDLType.Tags.double]: + return str(value.value) + + if tag == IDLType.Tags.bool: + return toStringBool(value.value) + + raise TypeError("Const value of unhandled type: " + value.type) + +class CGConstant(CGThing): + def __init__(self, constants): + CGThing.__init__(self) + self.constants = constants + + def define(self): + def stringDecl(const): + name = const.identifier.name + value = convertConstIDLValueToRust(const.value) + return CGGeneric("pub static %s: %s = %s;\n" % (name, builtinNames[const.value.type.tag()], value)) + + return CGIndenter(CGList(stringDecl(m) for m in self.constants)).define() + def getUnionAccessorSignatureType(type, descriptorProvider): """ Returns the types that are used in the getter and setter signatures for @@ -3863,8 +3893,8 @@ class CGProxyUnwrap(CGAbstractMethod): obj = js::UnwrapObject(obj); }*/ //MOZ_ASSERT(IsProxy(obj)); - let box_: *Box<%s> = cast::transmute(GetProxyPrivate(obj).to_private()); - return ptr::to_unsafe_ptr(&(*box_).data);""" % (self.descriptor.concreteType) + let box_: *%s = cast::transmute(GetProxyPrivate(obj).to_private()); + return box_;""" % (self.descriptor.concreteType) class CGDOMJSProxyHandler_getOwnPropertyDescriptor(CGAbstractExternMethod): def __init__(self, descriptor): @@ -3885,7 +3915,7 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(CGAbstractExternMethod): if indexedGetter: readonly = toStringBool(self.descriptor.operations['IndexedSetter'] is None) fillDescriptor = "FillPropertyDescriptor(&mut *desc, proxy, %s);\nreturn 1;" % readonly - templateValues = {'jsvalRef': '(*desc).value', 'jsvalPtr': 'ptr::to_mut_unsafe_ptr(&mut (*desc).value)', + templateValues = {'jsvalRef': '(*desc).value', 'jsvalPtr': '&mut (*desc).value', 'obj': 'proxy', 'successCode': fillDescriptor} get = ("if index.is_some() {\n" + " let index = index.unwrap();\n" + @@ -3927,7 +3957,7 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(CGAbstractExternMethod): if namedGetter: readonly = toStringBool(self.descriptor.operations['NamedSetter'] is None) fillDescriptor = "FillPropertyDescriptor(&mut *desc, proxy, %s);\nreturn 1;" % readonly - templateValues = {'jsvalRef': '(*desc).value', 'jsvalPtr': 'ptr::to_unsafe_ptr(&(*desc).value)', + templateValues = {'jsvalRef': '(*desc).value', 'jsvalPtr': '&mut(*desc).value', 'obj': 'proxy', 'successCode': fillDescriptor} # Once we start supporting OverrideBuiltins we need to make # ResolveOwnProperty or EnumerateOwnProperties filter out named @@ -4073,7 +4103,7 @@ class CGDOMJSProxyHandler_get(CGAbstractExternMethod): getFromExpando = """let expando = GetExpandoObject(proxy); if expando.is_not_null() { let hasProp = 0; - if JS_HasPropertyById(cx, expando, id, ptr::to_unsafe_ptr(&hasProp)) == 0 { + if JS_HasPropertyById(cx, expando, id, &hasProp) == 0 { return 0; } @@ -4173,7 +4203,7 @@ class CGAbstractClassHook(CGAbstractExternMethod): def definition_body_prologue(self): return """ - let this: *%s = &(*unwrap::<*Box<%s>>(obj)).data; + let this: *%s = unwrap::<*%s>(obj); """ % (self.descriptor.concreteType, self.descriptor.concreteType) def definition_body(self): @@ -4309,6 +4339,10 @@ class CGDescriptor(CGThing): cgThings.append(CGGeneric(str(properties))) cgThings.append(CGCreateInterfaceObjectsMethod(descriptor, properties)) + cgThings.append(CGNamespace.build([descriptor.name + "Constants"], + CGConstant(m for m in descriptor.interface.members if m.isConst()), + public=True)) + # Set up our Xray callbacks as needed. if descriptor.interface.hasInterfacePrototypeObject(): if descriptor.concrete and descriptor.proxy: @@ -4375,7 +4409,7 @@ class CGNamespacedEnum(CGThing): entries.append(entry) # Append a Count. - entries.append('_' + enumName + '_Count = ' + str(len(entries))) + entries.append(enumName + 'Count = ' + str(len(entries))) # Indent. entries = [' ' + e for e in entries] @@ -4505,7 +4539,7 @@ class CGDictionary(CGThing): "\n" " pub fn Init(&mut self, cx: *JSContext, val: JSVal) -> JSBool {\n" " unsafe {\n" - " if (!initedIds && !self.InitIds(cx)) {\n" + " if !initedIds && !self.InitIds(cx) {\n" " return 0;\n" " }\n" "${initParent}" @@ -4572,15 +4606,15 @@ class CGDictionary(CGThing): if True: #XXXjdm hack until 'static mut' exists for global jsids propName = member.identifier.name - propCheck = ('"%s".to_c_str().with_ref(|s| { JS_HasProperty(cx, val.to_object(), s, ptr::to_unsafe_ptr(&found)) })' % + propCheck = ('"%s".to_c_str().with_ref(|s| { JS_HasProperty(cx, val.to_object(), s, &found) })' % propName) - propGet = ('"%s".to_c_str().with_ref(|s| { JS_GetProperty(cx, val.to_object(), s, ptr::to_unsafe_ptr(&temp)) })' % + propGet = ('"%s".to_c_str().with_ref(|s| { JS_GetProperty(cx, val.to_object(), s, &temp) })' % propName) else: propId = self.makeIdName(member.identifier.name); - propCheck = ("JS_HasPropertyById(cx, val.to_object(), %s, ptr::to_unsafe_ptr(&found))" % + propCheck = ("JS_HasPropertyById(cx, val.to_object(), %s, &found)" % propId) - propGet = ("JS_GetPropertyById(cx, val.to_object(), %s, ptr::to_unsafe_ptr(&temp))" % + propGet = ("JS_GetPropertyById(cx, val.to_object(), %s, &temp)" % propId) conversionReplacements = { @@ -4764,7 +4798,7 @@ class CGBindingRoot(CGThing): 'dom::bindings::utils::{NativePropertyHooks}', 'dom::bindings::utils::global_object_for_js_object', 'dom::bindings::utils::{Reflectable}', - 'dom::bindings::utils::{squirrel_away_unique}', + 'dom::bindings::utils::{squirrel_away_unboxed}', 'dom::bindings::utils::{ThrowingConstructor, unwrap, unwrap_jsmanaged}', 'dom::bindings::utils::{unwrap_object, VoidVal, with_gc_disabled}', 'dom::bindings::utils::{with_gc_enabled, XrayResolveProperty}', @@ -4786,12 +4820,13 @@ class CGBindingRoot(CGThing): 'servo_util::str::DOMString', 'servo_util::vec::zip_copies', 'std::cast', + 'std::cmp', 'std::libc', 'std::ptr', 'std::vec', 'std::str', 'std::num', - 'std::unstable::raw::Box', + 'std::intrinsics::uninit', ]) # Add the auto-generated comment. @@ -5191,7 +5226,7 @@ class CGCallback(CGClass): # method, insert our optional argument for deciding whether the # CallSetup should re-throw exceptions on aRv. args.append(Argument("ExceptionHandling", "aExceptionHandling", - "eReportExceptions")) + "ReportExceptions")) args[0] = Argument('&' + args[0].argType, args[0].name, args[0].default) method.args[2] = args[0] @@ -5483,7 +5518,7 @@ class CallbackMember(CGNativeMember): args.append(Argument("JSCompartment*", "aCompartment", "nullptr")) else: args.append(Argument("ExceptionHandling", "aExceptionHandling", - "eReportExceptions")) + "ReportExceptions")) return args # We want to allow the caller to pass in a "this" object, as # well as a JSContext. @@ -5498,7 +5533,7 @@ class CallbackMember(CGNativeMember): if self.rethrowContentException: # getArgs doesn't add the aExceptionHandling argument but does add # aCompartment for us. - callSetup += ", eRethrowContentExceptions, aCompartment" + callSetup += ", RethrowContentExceptions, aCompartment" else: callSetup += ", aExceptionHandling" callSetup += ");" @@ -5735,7 +5770,7 @@ class GlobalGenRoots(): CGGeneric("use dom::types::*;\n"), CGGeneric("use dom::bindings::js::JS;\n"), CGGeneric("use dom::bindings::trace::Traceable;\n"), - CGGeneric("use extra::serialize::{Encodable, Encoder};\n"), + CGGeneric("use serialize::{Encodable, Encoder};\n"), CGGeneric("use js::jsapi::JSTracer;\n\n")] for descriptor in descriptors: name = descriptor.name diff --git a/src/components/script/dom/bindings/error.rs b/src/components/script/dom/bindings/error.rs index 8ea949b28f6..da30f40588b 100644 --- a/src/components/script/dom/bindings/error.rs +++ b/src/components/script/dom/bindings/error.rs @@ -7,7 +7,7 @@ use js::jsapi::{JS_IsExceptionPending}; use js::glue::{ReportError}; -#[deriving(ToStr)] +#[deriving(Show)] pub enum Error { FailureUnknown, NotFound, diff --git a/src/components/script/dom/bindings/js.rs b/src/components/script/dom/bindings/js.rs index 9f8e44ba06f..69758f2980a 100644 --- a/src/components/script/dom/bindings/js.rs +++ b/src/components/script/dom/bindings/js.rs @@ -9,7 +9,6 @@ use layout_interface::TrustedNodeAddress; use std::cast; use std::cell::RefCell; -use std::unstable::raw::Box; pub struct JS<T> { priv ptr: RefCell<*mut T> @@ -50,13 +49,6 @@ impl<T: Reflectable> JS<T> { } - pub unsafe fn from_box(box_: *mut Box<T>) -> JS<T> { - let raw: *mut T = &mut (*box_).data; - JS { - ptr: RefCell::new(raw) - } - } - pub unsafe fn from_trusted_node_address(inner: TrustedNodeAddress) -> JS<T> { JS { ptr: RefCell::new(inner as *mut T) diff --git a/src/components/script/dom/bindings/proxyhandler.rs b/src/components/script/dom/bindings/proxyhandler.rs index aaf75a7bc7a..81c36d639ad 100644 --- a/src/components/script/dom/bindings/proxyhandler.rs +++ b/src/components/script/dom/bindings/proxyhandler.rs @@ -19,12 +19,10 @@ use std::ptr; use std::str; use std::mem::size_of; -type c_bool = libc::c_int; - static JSPROXYSLOT_EXPANDO: u32 = 0; pub extern fn getPropertyDescriptor(cx: *JSContext, proxy: *JSObject, id: jsid, - set: c_bool, desc: *mut JSPropertyDescriptor) -> c_bool { + set: libc::c_int, desc: *mut JSPropertyDescriptor) -> libc::c_int { unsafe { let handler = GetProxyHandler(proxy); if InvokeGetOwnPropertyDescriptor(handler, cx, proxy, id, set, desc) == 0 { diff --git a/src/components/script/dom/bindings/trace.rs b/src/components/script/dom/bindings/trace.rs index 342c3110f5d..1cedf246728 100644 --- a/src/components/script/dom/bindings/trace.rs +++ b/src/components/script/dom/bindings/trace.rs @@ -11,7 +11,7 @@ use std::cast; use std::libc; use std::ptr; use std::ptr::null; -use extra::serialize::{Encodable, Encoder}; +use serialize::{Encodable, Encoder}; // IMPORTANT: We rely on the fact that we never attempt to encode DOM objects using // any encoder but JSTracer. Since we derive trace hooks automatically, diff --git a/src/components/script/dom/bindings/utils.rs b/src/components/script/dom/bindings/utils.rs index 54e518fcc97..e7385fc1ddd 100644 --- a/src/components/script/dom/bindings/utils.rs +++ b/src/components/script/dom/bindings/utils.rs @@ -8,16 +8,15 @@ use dom::bindings::js::JS; use dom::window; use servo_util::str::DOMString; +use collections::hashmap::HashMap; use std::libc::c_uint; use std::cast; use std::cmp::Eq; -use std::hashmap::HashMap; use std::libc; use std::ptr; use std::ptr::null; use std::str; use std::vec; -use std::unstable::raw::Box; use js::glue::*; use js::glue::{js_IsObjectProxyClass, js_IsFunctionProxyClass, IsProxyHandlerFamily}; use js::jsapi::{JS_AlreadyHasOwnProperty, JS_NewFunction}; @@ -121,10 +120,10 @@ pub fn unwrap_object<T>(obj: *JSObject, proto_id: PrototypeList::id::ID, proto_d pub fn unwrap_jsmanaged<T: Reflectable>(obj: *JSObject, proto_id: PrototypeList::id::ID, proto_depth: uint) -> Result<JS<T>, ()> { - let result: Result<*mut Box<T>, ()> = unwrap_object(obj, proto_id, proto_depth); + let result: Result<*mut T, ()> = unwrap_object(obj, proto_id, proto_depth); result.map(|unwrapped| { unsafe { - JS::from_box(unwrapped) + JS::from_raw(unwrapped) } }) } @@ -136,10 +135,6 @@ pub fn unwrap_value<T>(val: *JSVal, proto_id: PrototypeList::id::ID, proto_depth } } -pub unsafe fn squirrel_away_unique<T>(x: ~T) -> *Box<T> { - cast::transmute(x) -} - pub unsafe fn squirrel_away_unboxed<T>(x: ~T) -> *T { cast::transmute(x) } @@ -149,7 +144,7 @@ pub fn jsstring_to_str(cx: *JSContext, s: *JSString) -> DOMString { let length = 0; let chars = JS_GetStringCharsAndLength(cx, s, &length); vec::raw::buf_as_slice(chars, length as uint, |char_vec| { - str::from_utf16(char_vec) + str::from_utf16(char_vec).unwrap() }) } } @@ -412,7 +407,7 @@ pub extern fn ThrowingConstructor(_cx: *JSContext, _argc: c_uint, _vp: *mut JSVa } pub fn initialize_global(global: *JSObject) { - let protoArray = ~([0 as *JSObject, ..PrototypeList::id::_ID_Count as uint]); + let protoArray = ~([0 as *JSObject, ..PrototypeList::id::IDCount as uint]); unsafe { let box_ = squirrel_away_unboxed(protoArray); JS_SetReservedSlot(global, @@ -437,7 +432,6 @@ pub fn reflect_dom_object<T: Reflectable> #[deriving(Eq)] pub struct Reflector { object: *JSObject, - force_box_layout: @int, } impl Reflector { @@ -455,7 +449,6 @@ impl Reflector { pub fn new() -> Reflector { Reflector { object: ptr::null(), - force_box_layout: @1, } } } @@ -470,7 +463,7 @@ pub fn GetPropertyOnPrototype(cx: *JSContext, proxy: *JSObject, id: jsid, found: return true; } let hasProp = 0; - if JS_HasPropertyById(cx, proto, id, ptr::to_unsafe_ptr(&hasProp)) == 0 { + if JS_HasPropertyById(cx, proto, id, &hasProp) == 0 { return false; } *found = hasProp != 0; @@ -651,8 +644,8 @@ pub fn global_object_for_js_object(obj: *JSObject) -> JS<window::Window> { let clasp = JS_GetClass(global); assert!(((*clasp).flags & (JSCLASS_IS_DOMJSCLASS | JSCLASS_IS_GLOBAL)) != 0); // FIXME(jdm): Either don't hardcode or sanity assert prototype stuff. - match unwrap_object::<*mut Box<window::Window>>(global, PrototypeList::id::Window, 1) { - Ok(win) => JS::from_box(win), + match unwrap_object::<*mut window::Window>(global, PrototypeList::id::Window, 1) { + Ok(win) => JS::from_raw(win), Err(_) => fail!("found DOM global that doesn't unwrap to Window"), } } diff --git a/src/components/script/dom/document.rs b/src/components/script/dom/document.rs index c39c82449c0..3cf1d35459a 100644 --- a/src/components/script/dom/document.rs +++ b/src/components/script/dom/document.rs @@ -38,12 +38,12 @@ use layout_interface::{DocumentDamageLevel, ContentChangedDocumentDamage}; use servo_util::namespace::{Namespace, Null}; use servo_util::str::DOMString; +use collections::hashmap::HashMap; use extra::url::{Url, from_str}; use js::jsapi::{JSObject, JSContext}; use std::ascii::StrAsciiExt; -use std::hashmap::HashMap; -use extra::serialize::{Encoder, Encodable}; +use serialize::{Encoder, Encodable}; #[deriving(Eq,Encodable)] pub enum IsHTMLDocument { @@ -341,17 +341,17 @@ impl Document { match title_node { Some(ref mut title_node) => { for mut title_child in title_node.children() { - title_node.RemoveChild(&mut title_child); + assert!(title_node.RemoveChild(&mut title_child).is_ok()); } let new_text = self.CreateTextNode(abstract_self, title.clone()); - title_node.AppendChild(&mut NodeCast::from(&new_text)); + assert!(title_node.AppendChild(&mut NodeCast::from(&new_text)).is_ok()); }, None => { let mut new_title: JS<Node> = NodeCast::from(&HTMLTitleElement::new(~"title", abstract_self)); let new_text = self.CreateTextNode(abstract_self, title.clone()); - new_title.AppendChild(&mut NodeCast::from(&new_text)); - head.AppendChild(&mut new_title); + assert!(new_title.AppendChild(&mut NodeCast::from(&new_text)).is_ok()); + assert!(head.AppendChild(&mut new_title).is_ok()); }, } }); @@ -418,9 +418,9 @@ impl Document { match old_body { Some(child) => { let mut child: JS<Node> = NodeCast::from(&child); - root.ReplaceChild(&mut new_body, &mut child) + assert!(root.ReplaceChild(&mut new_body, &mut child).is_ok()) } - None => root.AppendChild(&mut new_body) + None => assert!(root.AppendChild(&mut new_body).is_ok()) }; } } @@ -435,7 +435,7 @@ impl Document { } let element: JS<Element> = ElementCast::to(node); - element.get().get_attribute(Null, "name").map_default(false, |attr| { + element.get().get_attribute(Null, "name").map_or(false, |attr| { attr.get().value_ref() == name }) }) diff --git a/src/components/script/dom/domexception.rs b/src/components/script/dom/domexception.rs index 9d8142ac938..fe439a944e2 100644 --- a/src/components/script/dom/domexception.rs +++ b/src/components/script/dom/domexception.rs @@ -3,34 +3,35 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use dom::bindings::codegen::DOMExceptionBinding; +use dom::bindings::codegen::DOMExceptionBinding::DOMExceptionConstants; use dom::bindings::js::JS; use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; use dom::window::Window; use servo_util::str::DOMString; #[repr(uint)] -#[deriving(ToStr, Encodable)] +#[deriving(Show, Encodable)] enum DOMErrorName { - IndexSizeError = 1, - HierarchyRequestError = 3, - WrongDocumentError = 4, - InvalidCharacterError = 5, - NoModificationAllowedError = 7, - NotFoundError = 8, - NotSupportedError = 9, - InvalidStateError = 11, - SyntaxError = 12, - InvalidModificationError = 13, - NamespaceError = 14, - InvalidAccessError = 15, - SecurityError = 18, - NetworkError = 19, - AbortError = 20, - URLMismatchError = 21, - QuotaExceededError = 22, - TimeoutError = 23, - InvalidNodeTypeError = 24, - DataCloneError = 25, + IndexSizeError = DOMExceptionConstants::INDEX_SIZE_ERR, + HierarchyRequestError = DOMExceptionConstants::HIERARCHY_REQUEST_ERR, + WrongDocumentError = DOMExceptionConstants::WRONG_DOCUMENT_ERR, + InvalidCharacterError = DOMExceptionConstants::INVALID_CHARACTER_ERR, + NoModificationAllowedError = DOMExceptionConstants::NO_MODIFICATION_ALLOWED_ERR, + NotFoundError = DOMExceptionConstants::NOT_FOUND_ERR, + NotSupportedError = DOMExceptionConstants::NOT_SUPPORTED_ERR, + InvalidStateError = DOMExceptionConstants::INVALID_STATE_ERR, + SyntaxError = DOMExceptionConstants::SYNTAX_ERR, + InvalidModificationError = DOMExceptionConstants::INVALID_MODIFICATION_ERR, + NamespaceError = DOMExceptionConstants::NAMESPACE_ERR, + InvalidAccessError = DOMExceptionConstants::INVALID_ACCESS_ERR, + SecurityError = DOMExceptionConstants::SECURITY_ERR, + NetworkError = DOMExceptionConstants::NETWORK_ERR, + AbortError = DOMExceptionConstants::ABORT_ERR, + URLMismatchError = DOMExceptionConstants::URL_MISMATCH_ERR, + QuotaExceededError = DOMExceptionConstants::QUOTA_EXCEEDED_ERR, + TimeoutError = DOMExceptionConstants::TIMEOUT_ERR, + InvalidNodeTypeError = DOMExceptionConstants::INVALID_NODE_TYPE_ERR, + DataCloneError = DOMExceptionConstants::DATA_CLONE_ERR, EncodingError } diff --git a/src/components/script/dom/domimplementation.rs b/src/components/script/dom/domimplementation.rs index 5a11d0119d4..71f63f52066 100644 --- a/src/components/script/dom/domimplementation.rs +++ b/src/components/script/dom/domimplementation.rs @@ -72,18 +72,18 @@ impl DOMImplementation { { // Step 3. let doc_type = DocumentType::new(~"html", None, None, &doc); - doc_node.AppendChild(&mut NodeCast::from(&doc_type)); + assert!(doc_node.AppendChild(&mut NodeCast::from(&doc_type)).is_ok()); } { // Step 4. let mut doc_html = NodeCast::from(&HTMLHtmlElement::new(~"html", &doc)); - doc_node.AppendChild(&mut doc_html); + assert!(doc_node.AppendChild(&mut doc_html).is_ok()); { // Step 5. let mut doc_head = NodeCast::from(&HTMLHeadElement::new(~"head", &doc)); - doc_html.AppendChild(&mut doc_head); + assert!(doc_html.AppendChild(&mut doc_head).is_ok()); // Step 6. match title { @@ -91,18 +91,18 @@ impl DOMImplementation { Some(title_str) => { // Step 6.1. let mut doc_title = NodeCast::from(&HTMLTitleElement::new(~"title", &doc)); - doc_head.AppendChild(&mut doc_title); + assert!(doc_head.AppendChild(&mut doc_title).is_ok()); // Step 6.2. let title_text = Text::new(title_str, &doc); - doc_title.AppendChild(&mut NodeCast::from(&title_text)); + assert!(doc_title.AppendChild(&mut NodeCast::from(&title_text)).is_ok()); } } } // Step 7. let doc_body = HTMLBodyElement::new(~"body", &doc); - doc_html.AppendChild(&mut NodeCast::from(&doc_body)); + assert!(doc_html.AppendChild(&mut NodeCast::from(&doc_body)).is_ok()); } // Step 8. diff --git a/src/components/script/dom/element.rs b/src/components/script/dom/element.rs index df9ecb20430..96f5bf8f7f4 100644 --- a/src/components/script/dom/element.rs +++ b/src/components/script/dom/element.rs @@ -203,9 +203,9 @@ impl Element { let (prefix, local_name) = get_attribute_parts(name.clone()); match prefix { Some(ref prefix_str) => { - if (namespace == namespace::Null || - ("xml" == prefix_str.as_slice() && namespace != namespace::XML) || - ("xmlns" == prefix_str.as_slice() && namespace != namespace::XMLNS)) { + if namespace == namespace::Null || + ("xml" == prefix_str.as_slice() && namespace != namespace::XML) || + ("xmlns" == prefix_str.as_slice() && namespace != namespace::XMLNS) { return Err(NamespaceError); } }, @@ -410,7 +410,7 @@ impl Element { pub fn set_string_attribute(&mut self, abstract_self: &JS<Element>, name: &str, value: DOMString) { assert!(name == name.to_ascii_lower()); - self.set_attribute(abstract_self, Null, name.to_owned(), value); + assert!(self.set_attribute(abstract_self, Null, name.to_owned(), value).is_ok()); } } @@ -430,6 +430,16 @@ impl Element { self.set_string_attribute(abstract_self, "id", id); } + // http://dom.spec.whatwg.org/#dom-element-classname + pub fn ClassName(&self, _abstract_self: &JS<Element>) -> DOMString { + self.get_string_attribute("class") + } + + // http://dom.spec.whatwg.org/#dom-element-classname + pub fn SetClassName(&mut self, abstract_self: &JS<Element>, class: DOMString) { + self.set_string_attribute(abstract_self, "class", class); + } + // http://dom.spec.whatwg.org/#dom-element-attributes pub fn Attributes(&mut self, abstract_self: &JS<Element>) -> JS<AttrList> { match self.attr_list { diff --git a/src/components/script/dom/event.rs b/src/components/script/dom/event.rs index 6b612b4a220..c54688626d3 100644 --- a/src/components/script/dom/event.rs +++ b/src/components/script/dom/event.rs @@ -3,9 +3,10 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use dom::bindings::codegen::EventBinding; +use dom::bindings::codegen::EventBinding::EventConstants; use dom::bindings::js::JS; use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; -use dom::bindings::error::{Fallible, ErrorResult}; +use dom::bindings::error::Fallible; use dom::eventtarget::EventTarget; use dom::window::Window; use servo_util::str::DOMString; @@ -23,10 +24,10 @@ pub enum Event_ { #[deriving(Encodable)] pub enum EventPhase { - Phase_None = 0, - Phase_Capturing, - Phase_At_Target, - Phase_Bubbling + PhaseNone = EventConstants::NONE, + PhaseCapturing = EventConstants::CAPTURING_PHASE, + PhaseAtTarget = EventConstants::AT_TARGET, + PhaseBubbling = EventConstants::BUBBLING_PHASE, } #[deriving(Eq, Encodable)] @@ -62,7 +63,7 @@ impl Event { reflector_: Reflector::new(), current_target: None, target: None, - phase: Phase_None, + phase: PhaseNone, type_: ~"", default_prevented: false, cancelable: true, @@ -131,12 +132,11 @@ impl Event { pub fn InitEvent(&mut self, type_: DOMString, bubbles: bool, - cancelable: bool) -> ErrorResult { + cancelable: bool) { self.type_ = type_; self.cancelable = cancelable; self.bubbles = bubbles; self.initialized = true; - Ok(()) } pub fn IsTrusted(&self) -> bool { diff --git a/src/components/script/dom/eventdispatcher.rs b/src/components/script/dom/eventdispatcher.rs index 699dc1f68b5..bd55cb69909 100644 --- a/src/components/script/dom/eventdispatcher.rs +++ b/src/components/script/dom/eventdispatcher.rs @@ -2,11 +2,11 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use dom::bindings::callback::eReportExceptions; +use dom::bindings::callback::ReportExceptions; use dom::bindings::codegen::InheritTypes::{EventTargetCast, NodeCast, NodeDerived}; use dom::bindings::js::JS; use dom::eventtarget::{Capturing, Bubbling, EventTarget}; -use dom::event::{Event, Phase_At_Target, Phase_None, Phase_Bubbling, Phase_Capturing}; +use dom::event::{Event, PhaseAtTarget, PhaseNone, PhaseBubbling, PhaseCapturing}; use dom::node::{Node, NodeHelpers}; // See http://dom.spec.whatwg.org/#concept-event-dispatch for the full dispatch algorithm @@ -35,7 +35,7 @@ pub fn dispatch_event(target: &JS<EventTarget>, } } - event.get_mut().phase = Phase_Capturing; + event.get_mut().phase = PhaseCapturing; //FIXME: The "callback this value" should be currentTarget @@ -45,7 +45,9 @@ pub fn dispatch_event(target: &JS<EventTarget>, Some(listeners) => { event.get_mut().current_target = Some(cur_target.clone()); for listener in listeners.iter() { - listener.HandleEvent__(event, eReportExceptions); + //FIXME: this should have proper error handling, or explicitly + // drop the exception on the floor + assert!(listener.HandleEvent__(event, ReportExceptions).is_ok()); if event.get().stop_immediate { break; @@ -66,14 +68,16 @@ pub fn dispatch_event(target: &JS<EventTarget>, if !event.get().stop_propagation { { let event = event.get_mut(); - event.phase = Phase_At_Target; + event.phase = PhaseAtTarget; event.current_target = Some(target.clone()); } let opt_listeners = target.get().get_listeners(type_); for listeners in opt_listeners.iter() { for listener in listeners.iter() { - listener.HandleEvent__(event, eReportExceptions); + //FIXME: this should have proper error handling, or explicitly drop the + // exception on the floor. + assert!(listener.HandleEvent__(event, ReportExceptions).is_ok()); if event.get().stop_immediate { break; } @@ -83,14 +87,16 @@ pub fn dispatch_event(target: &JS<EventTarget>, /* bubbling */ if event.get().bubbles && !event.get().stop_propagation { - event.get_mut().phase = Phase_Bubbling; + event.get_mut().phase = PhaseBubbling; for cur_target in chain.iter() { let stopped = match cur_target.get().get_listeners_for(type_, Bubbling) { Some(listeners) => { event.get_mut().current_target = Some(cur_target.clone()); for listener in listeners.iter() { - listener.HandleEvent__(event, eReportExceptions); + //FIXME: this should have proper error handling or explicitly + // drop exceptions on the floor. + assert!(listener.HandleEvent__(event, ReportExceptions).is_ok()); if event.get().stop_immediate { break; @@ -109,7 +115,7 @@ pub fn dispatch_event(target: &JS<EventTarget>, let event = event.get_mut(); event.dispatching = false; - event.phase = Phase_None; + event.phase = PhaseNone; event.current_target = None; !event.DefaultPrevented() diff --git a/src/components/script/dom/eventtarget.rs b/src/components/script/dom/eventtarget.rs index 5b4d2d52412..a1a3a9d7514 100644 --- a/src/components/script/dom/eventtarget.rs +++ b/src/components/script/dom/eventtarget.rs @@ -11,7 +11,7 @@ use dom::eventdispatcher::dispatch_event; use dom::node::NodeTypeId; use servo_util::str::DOMString; -use std::hashmap::HashMap; +use collections::hashmap::HashMap; #[deriving(Eq,Encodable)] pub enum ListenerPhase { diff --git a/src/components/script/dom/formdata.rs b/src/components/script/dom/formdata.rs index bd4c7a03d6e..ac6cdac403e 100644 --- a/src/components/script/dom/formdata.rs +++ b/src/components/script/dom/formdata.rs @@ -11,7 +11,7 @@ use dom::htmlformelement::HTMLFormElement; use dom::window::Window; use servo_util::str::DOMString; -use std::hashmap::HashMap; +use collections::hashmap::HashMap; #[deriving(Encodable)] enum FormDatum { diff --git a/src/components/script/dom/htmlelement.rs b/src/components/script/dom/htmlelement.rs index 8464d23aec0..f8a1cd96a9b 100644 --- a/src/components/script/dom/htmlelement.rs +++ b/src/components/script/dom/htmlelement.rs @@ -140,13 +140,6 @@ impl HTMLElement { Ok(()) } - pub fn ClassName(&self) -> DOMString { - ~"" - } - - pub fn SetClassName(&self, _class: DOMString) { - } - pub fn GetOffsetParent(&self) -> Option<JS<Element>> { None } diff --git a/src/components/script/dom/htmliframeelement.rs b/src/components/script/dom/htmliframeelement.rs index 79f5282539c..5098972ec15 100644 --- a/src/components/script/dom/htmliframeelement.rs +++ b/src/components/script/dom/htmliframeelement.rs @@ -15,9 +15,9 @@ use dom::windowproxy::WindowProxy; use servo_util::str::DOMString; use extra::url::Url; +use serialize::{Encoder, Encodable}; use servo_msg::constellation_msg::{PipelineId, SubpageId}; use std::ascii::StrAsciiExt; -use extra::serialize::{Encoder, Encodable}; enum SandboxAllowance { AllowNothing = 0x00, diff --git a/src/components/script/dom/htmlimageelement.rs b/src/components/script/dom/htmlimageelement.rs index d5bfbbe5615..861b8ca5633 100644 --- a/src/components/script/dom/htmlimageelement.rs +++ b/src/components/script/dom/htmlimageelement.rs @@ -19,7 +19,7 @@ use servo_net::image_cache_task; use servo_util::url::parse_url; use servo_util::str::DOMString; -use extra::serialize::{Encoder, Encodable}; +use serialize::{Encoder, Encodable}; #[deriving(Encodable)] pub struct HTMLImageElement { @@ -120,8 +120,7 @@ impl HTMLImageElement { pub fn SetSrc(&mut self, abstract_self: &JS<HTMLImageElement>, src: DOMString) -> ErrorResult { let node = &mut self.htmlelement.element; - node.set_attr(&ElementCast::from(abstract_self), ~"src", src.clone()); - Ok(()) + node.set_attr(&ElementCast::from(abstract_self), ~"src", src.clone()) } pub fn CrossOrigin(&self) -> DOMString { @@ -164,8 +163,7 @@ impl HTMLImageElement { pub fn SetWidth(&mut self, abstract_self: &JS<HTMLImageElement>, width: u32) -> ErrorResult { let mut elem: JS<Element> = ElementCast::from(abstract_self); let mut elem_clone = elem.clone(); - elem.get_mut().set_attr(&mut elem_clone, ~"width", width.to_str()); - Ok(()) + elem.get_mut().set_attr(&mut elem_clone, ~"width", width.to_str()) } pub fn Height(&self, abstract_self: &JS<HTMLImageElement>) -> u32 { @@ -184,8 +182,7 @@ impl HTMLImageElement { pub fn SetHeight(&mut self, abstract_self: &JS<HTMLImageElement>, height: u32) -> ErrorResult { let node = &mut self.htmlelement.element; - node.set_attr(&ElementCast::from(abstract_self), ~"height", height.to_str()); - Ok(()) + node.set_attr(&ElementCast::from(abstract_self), ~"height", height.to_str()) } pub fn NaturalWidth(&self) -> u32 { diff --git a/src/components/script/dom/htmlserializer.rs b/src/components/script/dom/htmlserializer.rs index e6822e79215..82c215c7d2f 100644 --- a/src/components/script/dom/htmlserializer.rs +++ b/src/components/script/dom/htmlserializer.rs @@ -25,7 +25,7 @@ pub fn serialize(iterator: &mut NodeIterator) -> ~str { for node in *iterator { while open_elements.len() > iterator.depth { - html.push_str(~"</" + open_elements.pop() + ">"); + html.push_str(~"</" + open_elements.pop().unwrap().as_slice() + ">"); } html.push_str( match node.type_id() { @@ -59,7 +59,7 @@ pub fn serialize(iterator: &mut NodeIterator) -> ~str { ); } while open_elements.len() > 0 { - html.push_str(~"</" + open_elements.pop() + ">"); + html.push_str(~"</" + open_elements.pop().unwrap().as_slice() + ">"); } html } diff --git a/src/components/script/dom/location.rs b/src/components/script/dom/location.rs index 1714b59f7c1..8e7e1ca5ced 100644 --- a/src/components/script/dom/location.rs +++ b/src/components/script/dom/location.rs @@ -12,7 +12,7 @@ use servo_util::str::DOMString; use script_task::{Page}; use std::rc::Rc; -use extra::serialize::{Encoder, Encodable}; +use serialize::{Encoder, Encodable}; #[deriving(Encodable)] diff --git a/src/components/script/dom/mouseevent.rs b/src/components/script/dom/mouseevent.rs index 8741ea48a68..a261de252d7 100644 --- a/src/components/script/dom/mouseevent.rs +++ b/src/components/script/dom/mouseevent.rs @@ -5,7 +5,7 @@ use dom::bindings::codegen::MouseEventBinding; use dom::bindings::codegen::InheritTypes::MouseEventDerived; use dom::bindings::js::JS; -use dom::bindings::error::{ErrorResult, Fallible}; +use dom::bindings::error::Fallible; use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; use dom::event::{Event, MouseEventTypeId}; use dom::eventtarget::EventTarget; @@ -135,7 +135,7 @@ impl MouseEvent { shiftKeyArg: bool, metaKeyArg: bool, buttonArg: u16, - relatedTargetArg: Option<JS<EventTarget>>) -> ErrorResult { + relatedTargetArg: Option<JS<EventTarget>>) { self.mouseevent.InitUIEvent(typeArg, canBubbleArg, cancelableArg, viewArg, detailArg); self.screen_x = screenXArg; self.screen_y = screenYArg; @@ -147,7 +147,6 @@ impl MouseEvent { self.meta_key = metaKeyArg; self.button = buttonArg; self.related_target = relatedTargetArg; - Ok(()) } } diff --git a/src/components/script/dom/node.rs b/src/components/script/dom/node.rs index 21732c479bb..71b2b121136 100644 --- a/src/components/script/dom/node.rs +++ b/src/components/script/dom/node.rs @@ -9,6 +9,7 @@ use dom::bindings::codegen::InheritTypes::{CommentCast, DocumentCast, DocumentTy use dom::bindings::codegen::InheritTypes::{ElementCast, TextCast, NodeCast}; use dom::bindings::codegen::InheritTypes::{CharacterDataCast, NodeBase, NodeDerived}; use dom::bindings::codegen::InheritTypes::ProcessingInstructionCast; +use dom::bindings::codegen::NodeBinding::NodeConstants; use dom::bindings::js::JS; use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; use dom::bindings::error::{ErrorResult, Fallible, NotFound, HierarchyRequest}; @@ -36,11 +37,9 @@ use std::cast; use std::cell::{RefCell, Ref, RefMut}; use std::iter::{Map, Filter}; use std::libc::uintptr_t; -use std::ptr; -use std::unstable::raw::Box; -use std::util; +use std::mem; -use extra::serialize::{Encoder, Encodable}; +use serialize::{Encoder, Encodable}; // // The basic Node structure @@ -563,8 +562,8 @@ impl NodeHelpers for JS<Node> { if object.is_null() { fail!("Attempted to create a `JS<Node>` from an invalid pointer!") } - let boxed_node: *mut Box<Node> = utils::unwrap(object); - JS::from_box(boxed_node) + let boxed_node: *mut Node = utils::unwrap(object); + JS::from_raw(boxed_node) } } @@ -735,6 +734,8 @@ enum CloneChildrenFlag { DoNotCloneChildren } +fn as_uintptr<T>(t: &T) -> uintptr_t { t as *T as uintptr_t } + impl Node { pub fn ancestors(&self) -> AncestorIterator { AncestorIterator { @@ -807,11 +808,14 @@ impl Node { /// Sends layout data, if any, back to the script task to be destroyed. pub unsafe fn reap_layout_data(&mut self) { if self.layout_data.is_present() { - let layout_data = util::replace(&mut self.layout_data, LayoutDataRef::new()); + let layout_data = mem::replace(&mut self.layout_data, LayoutDataRef::new()); let layout_chan = layout_data.take_chan(); match layout_chan { None => {} - Some(chan) => chan.send(ReapLayoutDataMsg(layout_data)), + Some(chan) => { + let LayoutChan(chan) = chan; + chan.send(ReapLayoutDataMsg(layout_data)) + }, } } } @@ -819,13 +823,13 @@ impl Node { // http://dom.spec.whatwg.org/#dom-node-nodetype pub fn NodeType(&self) -> u16 { match self.type_id { - ElementNodeTypeId(_) => 1, - TextNodeTypeId => 3, - ProcessingInstructionNodeTypeId => 7, - CommentNodeTypeId => 8, - DocumentNodeTypeId => 9, - DoctypeNodeTypeId => 10, - DocumentFragmentNodeTypeId => 11, + ElementNodeTypeId(_) => NodeConstants::ELEMENT_NODE, + TextNodeTypeId => NodeConstants::TEXT_NODE, + ProcessingInstructionNodeTypeId => NodeConstants::PROCESSING_INSTRUCTION_NODE, + CommentNodeTypeId => NodeConstants::COMMENT_NODE, + DocumentNodeTypeId => NodeConstants::DOCUMENT_NODE, + DoctypeNodeTypeId => NodeConstants::DOCUMENT_TYPE_NODE, + DocumentFragmentNodeTypeId => NodeConstants::DOCUMENT_FRAGMENT_NODE, } } @@ -944,11 +948,10 @@ impl Node { CommentNodeTypeId | TextNodeTypeId | ProcessingInstructionNodeTypeId => { - self.SetTextContent(abstract_self, val); + self.SetTextContent(abstract_self, val) } - _ => {} + _ => Ok(()) } - Ok(()) } // http://dom.spec.whatwg.org/#dom-node-textcontent @@ -1269,7 +1272,7 @@ impl Node { // http://dom.spec.whatwg.org/#concept-node-remove fn remove(node: &mut JS<Node>, parent: &mut JS<Node>, suppress_observers: SuppressObserver) { - assert!(node.parent_node().map_default(false, |ref node_parent| node_parent == parent)); + assert!(node.parent_node().map_or(false, |ref node_parent| node_parent == parent)); // Step 1-5: ranges. // Step 6-7: mutation observers. @@ -1554,8 +1557,28 @@ impl Node { } // http://dom.spec.whatwg.org/#dom-node-normalize - pub fn Normalize(&mut self) { - // FIXME (#1823) implement. + pub fn Normalize(&mut self, abstract_self: &mut JS<Node>) { + let mut prev_text = None; + for mut child in self.children() { + if child.is_text() { + let characterdata: JS<CharacterData> = CharacterDataCast::to(&child); + if characterdata.get().Length() == 0 { + abstract_self.remove_child(&mut child); + } else { + match prev_text { + Some(ref text_node) => { + let mut prev_characterdata: JS<CharacterData> = CharacterDataCast::to(text_node); + let _ = prev_characterdata.get_mut().AppendData(characterdata.get().Data()); + abstract_self.remove_child(&mut child); + }, + None => prev_text = Some(child) + } + } + } else { + prev_text = None; + } + + } } // http://dom.spec.whatwg.org/#dom-node-clonenode @@ -1641,45 +1664,53 @@ impl Node { } // http://dom.spec.whatwg.org/#dom-node-comparedocumentposition - pub fn CompareDocumentPosition(&self, abstract_self: &JS<Node>, other: &JS<Node>) -> u16 { - static DOCUMENT_POSITION_DISCONNECTED: u16 = 0x01u16; - static DOCUMENT_POSITION_PRECEDING: u16 = 0x02u16; - static DOCUMENT_POSITION_FOLLOWING: u16 = 0x04u16; - static DOCUMENT_POSITION_CONTAINS: u16 = 0x08u16; - static DOCUMENT_POSITION_CONTAINED_BY: u16 = 0x10u16; - static DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: u16 = 0x20u16; if abstract_self == other { + // step 2. 0 } else { let mut lastself = abstract_self.clone(); let mut lastother = other.clone(); for ancestor in abstract_self.ancestors() { if &ancestor == other { - return DOCUMENT_POSITION_CONTAINS + DOCUMENT_POSITION_PRECEDING; + // step 4. + return NodeConstants::DOCUMENT_POSITION_CONTAINS + + NodeConstants::DOCUMENT_POSITION_PRECEDING; } lastself = ancestor; } for ancestor in other.ancestors() { if &ancestor == abstract_self { - return DOCUMENT_POSITION_CONTAINED_BY + DOCUMENT_POSITION_FOLLOWING; + // step 5. + return NodeConstants::DOCUMENT_POSITION_CONTAINED_BY + + NodeConstants::DOCUMENT_POSITION_FOLLOWING; } lastother = ancestor; } + if lastself != lastother { - let random = if ptr::to_unsafe_ptr(abstract_self.get()) < ptr::to_unsafe_ptr(other.get()) { - DOCUMENT_POSITION_FOLLOWING + let abstract_uint: uintptr_t = as_uintptr(&abstract_self.get()); + let other_uint: uintptr_t = as_uintptr(&other.get()); + + let random = if abstract_uint < other_uint { + NodeConstants::DOCUMENT_POSITION_FOLLOWING } else { - DOCUMENT_POSITION_PRECEDING + NodeConstants::DOCUMENT_POSITION_PRECEDING }; - return random + DOCUMENT_POSITION_DISCONNECTED + DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC; + // step 3. + return random + + NodeConstants::DOCUMENT_POSITION_DISCONNECTED + + NodeConstants::DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC; } + for child in lastself.traverse_preorder() { if &child == other { - return DOCUMENT_POSITION_PRECEDING; + // step 6. + return NodeConstants::DOCUMENT_POSITION_PRECEDING; } if &child == abstract_self { - return DOCUMENT_POSITION_FOLLOWING; + // step 7. + return NodeConstants::DOCUMENT_POSITION_FOLLOWING; } } unreachable!() diff --git a/src/components/script/dom/webidls/Document.webidl b/src/components/script/dom/webidls/Document.webidl index 98df0b2aef9..41d20631bde 100644 --- a/src/components/script/dom/webidls/Document.webidl +++ b/src/components/script/dom/webidls/Document.webidl @@ -44,6 +44,7 @@ interface Document : Node { partial interface Document { [SetterThrows] attribute DOMString title; + [SetterThrows] attribute HTMLElement? body; readonly attribute HTMLHeadElement? head; NodeList getElementsByName(DOMString elementName); diff --git a/src/components/script/dom/webidls/Element.webidl b/src/components/script/dom/webidls/Element.webidl index e26c9415d4a..2211fd5c887 100644 --- a/src/components/script/dom/webidls/Element.webidl +++ b/src/components/script/dom/webidls/Element.webidl @@ -28,10 +28,8 @@ interface Element : Node { [Pure] attribute DOMString id; -/* - FIXME Bug 810677 Move className from HTMLElement to Element + [Pure] attribute DOMString className; -*/ /*[Constant] readonly attribute DOMTokenList? classList;*/ diff --git a/src/components/script/dom/webidls/Event.webidl b/src/components/script/dom/webidls/Event.webidl index d33093d76e9..6e574427548 100644 --- a/src/components/script/dom/webidls/Event.webidl +++ b/src/components/script/dom/webidls/Event.webidl @@ -33,7 +33,6 @@ interface Event { readonly attribute boolean isTrusted; readonly attribute DOMTimeStamp timeStamp; - [Throws] void initEvent(DOMString type, boolean bubbles, boolean cancelable); }; diff --git a/src/components/script/dom/webidls/HTMLElement.webidl b/src/components/script/dom/webidls/HTMLElement.webidl index e0ce18aaff9..8f1315d011d 100644 --- a/src/components/script/dom/webidls/HTMLElement.webidl +++ b/src/components/script/dom/webidls/HTMLElement.webidl @@ -43,10 +43,6 @@ interface HTMLElement : Element { readonly attribute boolean isContentEditable; [SetterThrows, Pure] attribute boolean spellcheck; - - // Mozilla specific stuff - // FIXME Bug 810677 Move className from HTMLElement to Element - attribute DOMString className; }; // http://dev.w3.org/csswg/cssom-view/#extensions-to-the-htmlelement-interface diff --git a/src/components/script/dom/webidls/MouseEvent.webidl b/src/components/script/dom/webidls/MouseEvent.webidl index 68a273ebaaf..5bb4a84a90a 100644 --- a/src/components/script/dom/webidls/MouseEvent.webidl +++ b/src/components/script/dom/webidls/MouseEvent.webidl @@ -23,7 +23,6 @@ interface MouseEvent : UIEvent { readonly attribute unsigned short buttons; readonly attribute EventTarget? relatedTarget; // Deprecated in DOM Level 3: - [Throws] void initMouseEvent(DOMString typeArg, boolean canBubbleArg, boolean cancelableArg, diff --git a/src/components/script/dom/window.rs b/src/components/script/dom/window.rs index 867c1da8812..2ef70b0eac7 100644 --- a/src/components/script/dom/window.rs +++ b/src/components/script/dom/window.rs @@ -25,22 +25,22 @@ use js::jsval::JSVal; use js::jsval::{NullValue, ObjectValue}; use js::JSPROP_ENUMERATE; +use collections::hashmap::HashSet; use std::cast; -use std::comm::SharedChan; +use std::cmp; +use std::comm::Chan; use std::comm::Select; -use std::hashmap::HashSet; +use std::hash::{Hash, sip}; use std::io::timer::Timer; -use std::num; use std::rc::Rc; -use std::to_bytes::Cb; -use extra::serialize::{Encoder, Encodable}; +use serialize::{Encoder, Encodable}; use extra::url::{Url}; pub enum TimerControlMsg { - TimerMessage_Fire(~TimerData), - TimerMessage_Close, - TimerMessage_TriggerExit //XXXjdm this is just a quick hack to talk to the script task + TimerMessageFire(~TimerData), + TimerMessageClose, + TimerMessageTriggerExit //XXXjdm this is just a quick hack to talk to the script task } pub struct TimerHandle { @@ -53,9 +53,9 @@ impl<S: Encoder> Encodable<S> for TimerHandle { } } -impl IterBytes for TimerHandle { - fn iter_bytes(&self, lsb0: bool, f: Cb) -> bool { - self.handle.iter_bytes(lsb0, f) +impl Hash for TimerHandle { + fn hash(&self, state: &mut sip::SipState) { + self.handle.hash(state); } } @@ -87,7 +87,7 @@ pub struct Window { struct Untraceable { page: Rc<Page>, compositor: ~ScriptListener, - timer_chan: SharedChan<TimerControlMsg>, + timer_chan: Chan<TimerControlMsg>, } impl<S: Encoder> Encodable<S> for Untraceable { @@ -115,7 +115,7 @@ impl Window { #[unsafe_destructor] impl Drop for Window { fn drop(&mut self) { - self.extra.timer_chan.send(TimerMessage_Close); + self.extra.timer_chan.send(TimerMessageClose); for handle in self.active_timers.iter() { handle.cancel(); } @@ -134,11 +134,11 @@ pub struct TimerData { impl Window { pub fn Alert(&self, s: DOMString) { // Right now, just print to the console - println(format!("ALERT: {:s}", s)); + println!("ALERT: {:s}", s); } pub fn Close(&self) { - self.extra.timer_chan.send(TimerMessage_TriggerExit); + self.extra.timer_chan.send(TimerMessageTriggerExit); } pub fn Document(&self) -> JS<Document> { @@ -226,7 +226,7 @@ impl Reflectable for Window { impl Window { pub fn SetTimeout(&mut self, _cx: *JSContext, callback: JSVal, timeout: i32) -> i32 { - let timeout = num::max(0, timeout) as u64; + let timeout = cmp::max(0, timeout) as u64; let handle = self.next_timer_handle; self.next_timer_handle += 1; @@ -237,15 +237,17 @@ impl Window { let chan = self.extra.timer_chan.clone(); spawn_named("Window:SetTimeout", proc() { let mut tm = tm; - let mut timeout_port = tm.oneshot(timeout); - let mut cancel_port = cancel_port; + let timeout_port = tm.oneshot(timeout); + let cancel_port = cancel_port; let select = Select::new(); - let timeout_handle = select.add(&mut timeout_port); - let _cancel_handle = select.add(&mut cancel_port); + let mut timeout_handle = select.handle(&timeout_port); + unsafe { timeout_handle.add() }; + let mut cancel_handle = select.handle(&cancel_port); + unsafe { cancel_handle.add() }; let id = select.wait(); - if id == timeout_handle.id { - chan.send(TimerMessage_Fire(~TimerData { + if id == timeout_handle.id() { + chan.send(TimerMessageFire(~TimerData { handle: handle, funval: callback, args: ~[], @@ -290,14 +292,15 @@ impl Window { compositor: compositor, page: page.clone(), timer_chan: { - let (timer_port, timer_chan): (Port<TimerControlMsg>, SharedChan<TimerControlMsg>) = SharedChan::new(); + let (timer_port, timer_chan): (Port<TimerControlMsg>, Chan<TimerControlMsg>) = Chan::new(); let id = page.borrow().id.clone(); spawn_named("timer controller", proc() { + let ScriptChan(script_chan) = script_chan; loop { match timer_port.recv() { - TimerMessage_Close => break, - TimerMessage_Fire(td) => script_chan.send(FireTimerMsg(id, td)), - TimerMessage_TriggerExit => script_chan.send(ExitWindowMsg(id)), + TimerMessageClose => break, + TimerMessageFire(td) => script_chan.send(FireTimerMsg(id, td)), + TimerMessageTriggerExit => script_chan.send(ExitWindowMsg(id)), } } }); |