diff options
Diffstat (limited to 'components/script/dom')
84 files changed, 597 insertions, 259 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index eaf2bbe0fe7..d88e6d9fa32 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -21,7 +21,12 @@ from WebIDL import ( IDLUndefinedValue, ) -from Configuration import getTypesFromDescriptor, getTypesFromDictionary, getTypesFromCallback +from Configuration import ( + MemberIsUnforgeable, + getTypesFromCallback, + getTypesFromDescriptor, + getTypesFromDictionary, +) AUTOGENERATED_WARNING_COMMENT = \ "/* THIS FILE IS AUTOGENERATED - DO NOT EDIT */\n\n" @@ -1380,7 +1385,8 @@ class MethodDefiner(PropertyDefiner): """ A class for defining methods on a prototype object. """ - def __init__(self, descriptor, name, static): + def __init__(self, descriptor, name, static, unforgeable): + assert not (static and unforgeable) PropertyDefiner.__init__(self, descriptor, name) # FIXME https://bugzilla.mozilla.org/show_bug.cgi?id=772822 @@ -1391,36 +1397,40 @@ class MethodDefiner(PropertyDefiner): if not descriptor.interface.isCallback() or static: methods = [m for m in descriptor.interface.members if m.isMethod() and m.isStatic() == static and - not m.isIdentifierLess()] + not m.isIdentifierLess() and + MemberIsUnforgeable(m, descriptor) == unforgeable] else: methods = [] self.regular = [{"name": m.identifier.name, "methodInfo": not m.isStatic(), - "length": methodLength(m), - "flags": "JSPROP_ENUMERATE"} for m in methods] + "length": methodLength(m)} for m in methods] # FIXME Check for an existing iterator on the interface first. if any(m.isGetter() and m.isIndexed() for m in methods): self.regular.append({"name": '@@iterator', "methodInfo": False, "selfHostedName": "ArrayValues", - "length": 0, - "flags": "JSPROP_ENUMERATE"}) + "length": 0}) - if not static: + isUnforgeableInterface = bool(descriptor.interface.getExtendedAttribute("Unforgeable")) + if not static and unforgeable == isUnforgeableInterface: stringifier = descriptor.operations['Stringifier'] if stringifier: self.regular.append({ "name": "toString", "nativeName": stringifier.identifier.name, "length": 0, - "flags": "JSPROP_ENUMERATE" }) + self.unforgeable = unforgeable def generateArray(self, array, name): if len(array) == 0: return "" + flags = "JSPROP_ENUMERATE" + if self.unforgeable: + flags += " | JSPROP_PERMANENT | JSPROP_READONLY" + def specData(m): # TODO: Use something like JS_FNSPEC # https://github.com/servo/servo/issues/6391 @@ -1444,16 +1454,16 @@ class MethodDefiner(PropertyDefiner): accessor = 'Some(%s)' % m.get("nativeName", m["name"]) if m["name"].startswith("@@"): return ('(SymbolCode::%s as i32 + 1)' - % m["name"][2:], accessor, jitinfo, m["length"], m["flags"], selfHostedName) - return (str_to_const_array(m["name"]), accessor, jitinfo, m["length"], m["flags"], selfHostedName) + % m["name"][2:], accessor, jitinfo, m["length"], flags, selfHostedName) + return (str_to_const_array(m["name"]), accessor, jitinfo, m["length"], flags, selfHostedName) return self.generatePrefableArray( array, name, ' JSFunctionSpec {\n' ' name: %s as *const u8 as *const libc::c_char,\n' - ' call: JSNativeWrapper {op: %s, info: %s},\n' + ' call: JSNativeWrapper { op: %s, info: %s },\n' ' nargs: %s,\n' - ' flags: %s as u16,\n' + ' flags: (%s) as u16,\n' ' selfHostedName: %s\n' ' }', ' JSFunctionSpec {\n' @@ -1468,23 +1478,27 @@ class MethodDefiner(PropertyDefiner): class AttrDefiner(PropertyDefiner): - def __init__(self, descriptor, name, static): + def __init__(self, descriptor, name, static, unforgeable): + assert not (static and unforgeable) PropertyDefiner.__init__(self, descriptor, name) self.name = name self.descriptor = descriptor self.regular = [ m - for m in descriptor.interface.members - if m.isAttr() and m.isStatic() == static + for m in descriptor.interface.members if + m.isAttr() and m.isStatic() == static and + MemberIsUnforgeable(m, descriptor) == unforgeable ] self.static = static + self.unforgeable = unforgeable def generateArray(self, array, name): if len(array) == 0: return "" - def flags(attr): - return "JSPROP_SHARED | JSPROP_ENUMERATE" + flags = "JSPROP_ENUMERATE | JSPROP_SHARED" + if self.unforgeable: + flags += " | JSPROP_READONLY | JSPROP_PERMANENT" def getter(attr): if self.static: @@ -1520,7 +1534,7 @@ class AttrDefiner(PropertyDefiner): "native": accessor}) def specData(attr): - return (str_to_const_array(attr.identifier.name), flags(attr), getter(attr), + return (str_to_const_array(attr.identifier.name), flags, getter(attr), setter(attr)) return self.generatePrefableArray( @@ -1844,10 +1858,16 @@ class CGPrototypeJSClass(CGThing): self.descriptor = descriptor def define(self): + name = str_to_const_array(self.descriptor.interface.identifier.name + "Prototype") + slotCount = 0 + if self.descriptor.hasUnforgeableMembers: + slotCount += 1 return """\ static PrototypeClass: JSClass = JSClass { - name: %s as *const u8 as *const libc::c_char, - flags: 0, + name: %(name)s as *const u8 as *const libc::c_char, + flags: + // JSCLASS_HAS_RESERVED_SLOTS(%(slotCount)s) + (%(slotCount)s & JSCLASS_RESERVED_SLOTS_MASK) << JSCLASS_RESERVED_SLOTS_SHIFT, addProperty: None, delProperty: None, getProperty: None, @@ -1862,7 +1882,7 @@ static PrototypeClass: JSClass = JSClass { trace: None, reserved: [0 as *mut libc::c_void; 25] }; -""" % str_to_const_array(self.descriptor.interface.identifier.name + "Prototype") +""" % {'name': name, 'slotCount': slotCount} class CGInterfaceObjectJSClass(CGThing): @@ -2181,6 +2201,68 @@ JS_SetReservedSlot(obj.ptr, DOM_WEAK_SLOT, PrivateValue(ptr::null()));""" return create +def InitUnforgeablePropertiesOnHolder(descriptor, properties): + """ + Define the unforgeable properties on the unforgeable holder for + the interface represented by descriptor. + + properties is a PropertyArrays instance. + """ + unforgeables = [] + + defineUnforgeableAttrs = "define_properties(cx, unforgeable_holder.handle(), %s).unwrap();" + defineUnforgeableMethods = "define_methods(cx, unforgeable_holder.handle(), %s).unwrap();" + + unforgeableMembers = [ + (defineUnforgeableAttrs, properties.unforgeable_attrs), + (defineUnforgeableMethods, properties.unforgeable_methods), + ] + for template, array in unforgeableMembers: + if array.length() > 0: + unforgeables.append(CGGeneric(template % array.variableName())) + return CGList(unforgeables, "\n") + + +def CopyUnforgeablePropertiesToInstance(descriptor): + """ + Copy the unforgeable properties from the unforgeable holder for + this interface to the instance object we have. + """ + if not descriptor.hasUnforgeableMembers: + return "" + copyCode = "" + + # For proxies, we want to define on the expando object, not directly on the + # reflector, so we can make sure we don't get confused by named getters. + if descriptor.proxy: + copyCode += """\ +let mut expando = RootedObject::new(cx, ptr::null_mut()); +{ + let _ac = JSAutoCompartment::new(cx, scope.get()); + expando.handle_mut().set(ensure_expando_object(cx, obj.handle())); +} +""" + obj = "expando" + else: + obj = "obj" + + # We can't do the fast copy for globals, because we can't allocate the + # unforgeable holder for those with the right JSClass. Luckily, there + # aren't too many globals being created. + if descriptor.isGlobal(): + copyFunc = "JS_CopyPropertiesFrom" + else: + copyFunc = "JS_InitializePropertiesFromCompatibleNativeObject" + copyCode += """\ +let mut unforgeable_holder = RootedObject::new(cx, ptr::null_mut()); +unforgeable_holder.handle_mut().set( + JS_GetReservedSlot(proto.ptr, DOM_PROTO_UNFORGEABLE_HOLDER_SLOT).to_object()); +assert!(%(copyFunc)s(cx, %(obj)s.handle(), unforgeable_holder.handle())); +""" % {'copyFunc': copyFunc, 'obj': obj} + + return copyCode + + class CGWrapMethod(CGAbstractMethod): """ Class that generates the FooBinding::Wrap function for non-callback @@ -2199,7 +2281,9 @@ class CGWrapMethod(CGAbstractMethod): pub=True, unsafe=True) def definition_body(self): + unforgeable = CopyUnforgeablePropertiesToInstance(self.descriptor) if not self.descriptor.isGlobal(): + create = CreateBindingJSObject(self.descriptor, "scope") return CGGeneric("""\ let _ar = JSAutoRequest::new(cx); let scope = scope.reflector().get_jsobject(); @@ -2213,28 +2297,31 @@ let mut proto = RootedObject::new(cx, ptr::null_mut()); } assert!(!proto.ptr.is_null()); -%s +%(createObject)s +%(copyUnforgeable)s (*raw).init_reflector(obj.ptr); -Root::from_ref(&*raw)""" % CreateBindingJSObject(self.descriptor, "scope")) +Root::from_ref(&*raw)""" % {'copyUnforgeable': unforgeable, 'createObject': create}) else: + create = CreateBindingJSObject(self.descriptor) return CGGeneric("""\ let _ar = JSAutoRequest::new(cx); -%s +%(createObject)s let _ac = JSAutoCompartment::new(cx, obj.ptr); let mut proto = RootedObject::new(cx, ptr::null_mut()); GetProtoObject(cx, obj.handle(), obj.handle(), proto.handle_mut()); JS_SetPrototype(cx, obj.handle(), proto.handle()); +%(copyUnforgeable)s (*raw).init_reflector(obj.ptr); let ret = Root::from_ref(&*raw); RegisterBindings::Register(cx, obj.handle()); -ret""" % CreateBindingJSObject(self.descriptor)) +ret""" % {'copyUnforgeable': unforgeable, 'createObject': create}) class CGIDLInterface(CGThing): @@ -2279,17 +2366,29 @@ class CGAbstractExternMethod(CGAbstractMethod): class PropertyArrays(): def __init__(self, descriptor): self.static_methods = MethodDefiner(descriptor, "StaticMethods", - static=True) + static=True, unforgeable=False) self.static_attrs = AttrDefiner(descriptor, "StaticAttributes", - static=True) - self.methods = MethodDefiner(descriptor, "Methods", static=False) - self.attrs = AttrDefiner(descriptor, "Attributes", static=False) + static=True, unforgeable=False) + self.methods = MethodDefiner(descriptor, "Methods", static=False, unforgeable=False) + self.unforgeable_methods = MethodDefiner(descriptor, "UnforgeableMethods", + static=False, unforgeable=True) + self.attrs = AttrDefiner(descriptor, "Attributes", static=False, unforgeable=False) + self.unforgeable_attrs = AttrDefiner(descriptor, "UnforgeableAttributes", + static=False, unforgeable=True) self.consts = ConstDefiner(descriptor, "Constants") pass @staticmethod def arrayNames(): - return ["static_methods", "static_attrs", "methods", "attrs", "consts"] + return [ + "static_methods", + "static_attrs", + "methods", + "unforgeable_methods", + "attrs", + "unforgeable_attrs", + "consts", + ] def variableNames(self): names = {} @@ -2392,10 +2491,54 @@ let named_constructors: [(NonNullJSNative, &'static str, u32); %d] = [ createArray += "," createArray += "];" + if self.descriptor.hasUnforgeableMembers: + # We want to use the same JSClass and prototype as the object we'll + # end up defining the unforgeable properties on in the end, so that + # we can use JS_InitializePropertiesFromCompatibleNativeObject to do + # a fast copy. In the case of proxies that's null, because the + # expando object is a vanilla object, but in the case of other DOM + # objects it's whatever our class is. + # + # Also, for a global we can't use the global's class; just use + # nullpr and when we do the copy off the holder we'll take a slower + # path. This also means that we don't need to worry about matching + # the prototype. + if self.descriptor.proxy or self.descriptor.isGlobal(): + holderClass = "ptr::null()" + holderProto = "ptr::null_mut()" + else: + holderClass = "&Class.base as *const js::jsapi::Class as *const JSClass" + holderProto = "rval.get()" + # JS_NewObjectWithoutMetadata() is unsafe. + self.unsafe = True + createUnforgeableHolder = CGGeneric(""" +let mut unforgeable_holder = RootedObject::new(cx, ptr::null_mut()); +{ + let holder_class = %(holderClass)s; + let holder_proto = RootedObject::new(cx, %(holderProto)s); + unforgeable_holder.handle_mut().set( + JS_NewObjectWithoutMetadata(cx, holder_class, holder_proto.handle())); + assert!(!unforgeable_holder.ptr.is_null()); +}""" % {'holderClass': holderClass, 'holderProto': holderProto}) + defineUnforgeables = InitUnforgeablePropertiesOnHolder(self.descriptor, + self.properties) + createUnforgeableHolder = CGList( + [createUnforgeableHolder, defineUnforgeables], "\n") + + installUnforgeableHolder = CGGeneric("""\ +JS_SetReservedSlot(rval.get(), DOM_PROTO_UNFORGEABLE_HOLDER_SLOT, + ObjectValue(&*unforgeable_holder.ptr))""") + + unforgeableHolderSetup = CGList( + [createUnforgeableHolder, installUnforgeableHolder], "\n") + else: + unforgeableHolderSetup = None + return CGList([ CGGeneric(getParentProto), CGGeneric(createArray), - CGGeneric(call % self.properties.variableNames()) + CGGeneric(call % self.properties.variableNames()), + unforgeableHolderSetup, ], "\n") @@ -4269,6 +4412,9 @@ class CGDOMJSProxyHandler_defineProperty(CGAbstractExternMethod): namedSetter = self.descriptor.operations['NamedSetter'] if namedSetter: + if self.descriptor.hasUnforgeableMembers: + raise TypeError("Can't handle a named setter on an interface that has " + "unforgeables. Figure out how that should work!") set += ("if RUST_JSID_IS_STRING(id) {\n" + CGIndenter(CGProxyNamedSetter(self.descriptor)).define() + " (*opresult).code_ = 0; /* SpecialCodes::OkCode */\n" + @@ -4308,6 +4454,9 @@ class CGDOMJSProxyHandler_delete(CGAbstractExternMethod): def getBody(self): set = "" if self.descriptor.operations['NamedDeleter']: + if self.descriptor.hasUnforgeableMembers: + raise TypeError("Can't handle a deleter on an interface that has " + "unforgeables. Figure out how that should work!") set += CGProxyNamedDeleter(self.descriptor).define() set += "return proxyhandler::delete(%s);" % ", ".join(a.name for a in self.args) return set @@ -4422,7 +4571,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('HandleObject', 'receiver'), Argument('HandleId', 'id'), Argument('MutableHandleValue', 'vp')] CGAbstractExternMethod.__init__(self, descriptor, "get", "bool", args) self.descriptor = descriptor @@ -4437,7 +4586,7 @@ if !expando.ptr.is_null() { } if hasProp { - return JS_GetPropertyById(cx, expando.handle(), id, vp); + return JS_ForwardGetPropertyTo(cx, expando.handle(), id, receiver, vp); } }""" @@ -4554,7 +4703,10 @@ if !weak_box_ptr.is_null() { } """ % descriptor.concreteType release += """\ -let _ = Box::from_raw(this as *mut %s); +if !this.is_null() { + // The pointer can be null if the object is the unforgeable holder of that interface. + let _ = Box::from_raw(this as *mut %s); +} debug!("%s finalize: {:p}", this);\ """ % (descriptor.concreteType, descriptor.concreteType) return release @@ -5177,30 +5329,31 @@ class CGBindingRoot(CGThing): # Add imports curr = CGImports(curr, descriptors + callbackDescriptors, mainCallbacks, [ 'js', - 'js::JS_CALLEE', - 'js::{JSCLASS_GLOBAL_SLOT_COUNT, JSCLASS_IS_DOMJSCLASS, JSCLASS_IMPLEMENTS_BARRIERS}', - 'js::{JSCLASS_IS_GLOBAL, JSCLASS_RESERVED_SLOTS_SHIFT}', - 'js::{JSCLASS_RESERVED_SLOTS_MASK}', - 'js::{JSPROP_ENUMERATE, JSPROP_SHARED}', - 'js::{JSITER_OWNONLY, JSITER_HIDDEN, JSITER_SYMBOLS}', + 'js::{JSCLASS_GLOBAL_SLOT_COUNT, JSCLASS_IMPLEMENTS_BARRIERS}', + '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::{JS_CallFunctionValue, JS_GetClass, JS_GetGlobalForObject}', - 'js::jsapi::{JS_GetObjectPrototype, JS_GetProperty, JS_GetPropertyById}', - 'js::jsapi::{JS_GetPropertyDescriptorById, JS_GetReservedSlot}', - 'js::jsapi::{JS_HasProperty, JS_HasPropertyById, JS_IsExceptionPending}', - 'js::jsapi::{JS_NewObjectWithGivenProto, JS_NewObject, IsCallable, JS_SetProperty, JS_SetPrototype}', - 'js::jsapi::{JS_SetReservedSlot, JS_WrapValue, JSContext}', - 'js::jsapi::{JSClass, FreeOp, JSFreeOp, JSFunctionSpec, jsid}', - 'js::jsapi::{MutableHandleValue, MutableHandleObject, HandleObject, HandleValue, RootedObject}', - 'js::jsapi::{RootedValue, JSNativeWrapper, JSNative, JSObject, JSPropertyDescriptor}', - 'js::jsapi::{RootedId, JS_InternString, RootedString, INTERNED_STRING_TO_JSID}', - 'js::jsapi::{JSPropertySpec}', - 'js::jsapi::{JSString, JSTracer, JSJitInfo, JSTypedMethodJitInfo, OpType, AliasSet, ArgType}', - 'js::jsapi::{MutableHandle, Handle, HandleId, JSType, JSValueType}', - 'js::jsapi::{SymbolCode, ObjectOpResult, HandleValueArray}', - 'js::jsapi::{JSJitGetterCallArgs, JSJitSetterCallArgs, JSJitMethodCallArgs, CallArgs}', - 'js::jsapi::{JSAutoCompartment, JSAutoRequest, JS_ComputeThis}', - 'js::jsapi::{GetGlobalForObjectCrossCompartment, AutoIdVector, GetPropertyKeys}', + 'js::jsapi::{AliasSet, ArgType, AutoIdVector, CallArgs, FreeOp}', + 'js::jsapi::{GetGlobalForObjectCrossCompartment , GetPropertyKeys, Handle}', + 'js::jsapi::{HandleId, HandleObject, HandleValue, HandleValueArray}', + 'js::jsapi::{INTERNED_STRING_TO_JSID, IsCallable, JS_CallFunctionValue}', + 'js::jsapi::{JS_ComputeThis, JS_CopyPropertiesFrom, JS_ForwardGetPropertyTo}', + 'js::jsapi::{JS_GetClass, JS_GetGlobalForObject, JS_GetObjectPrototype}', + 'js::jsapi::{JS_GetProperty, JS_GetPropertyById, JS_GetPropertyDescriptorById}', + 'js::jsapi::{JS_GetReservedSlot, JS_HasProperty, JS_HasPropertyById}', + 'js::jsapi::{JS_InitializePropertiesFromCompatibleNativeObject, JS_InternString}', + 'js::jsapi::{JS_IsExceptionPending, JS_NewObject, JS_NewObjectWithGivenProto}', + 'js::jsapi::{JS_NewObjectWithoutMetadata, JS_SetProperty, JS_SetPrototype}', + 'js::jsapi::{JS_SetReservedSlot, JS_WrapValue, JSAutoCompartment, JSAutoRequest}', + 'js::jsapi::{JSContext, JSClass, JSFreeOp, JSFunctionSpec, JSJitGetterCallArgs}', + 'js::jsapi::{JSJitInfo, JSJitMethodCallArgs, JSJitSetterCallArgs, JSNative}', + 'js::jsapi::{JSObject, JSNativeWrapper, JSPropertyDescriptor, 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::jsval::JSVal', 'js::jsval::{ObjectValue, ObjectOrNullValue, PrivateValue}', 'js::jsval::{NullValue, UndefinedValue}', @@ -5209,30 +5362,24 @@ class CGBindingRoot(CGThing): 'js::glue::{RUST_FUNCTION_VALUE_TO_JITINFO}', 'js::glue::{RUST_JS_NumberValue, RUST_JSID_IS_STRING, int_to_jsid}', 'js::glue::AppendToAutoIdVector', - 'js::rust::GCMethods', + 'js::rust::{GCMethods, define_methods, define_properties}', 'dom::bindings', 'dom::bindings::global::{GlobalRef, global_root_from_object, global_root_from_reflector}', 'dom::bindings::js::{JS, Root, RootedReference}', 'dom::bindings::js::{OptionalRootedReference}', 'dom::bindings::reflector::{Reflectable}', - 'dom::bindings::utils::{create_dom_global, do_create_interface_objects}', - 'dom::bindings::utils::ConstantSpec', - 'dom::bindings::utils::{DOMClass}', - 'dom::bindings::utils::{DOMJSClass, JSCLASS_DOM_GLOBAL}', - 'dom::bindings::utils::{find_enum_string_index, get_array_index_from_id}', - 'dom::bindings::utils::{get_property_on_prototype, get_proto_or_iface_array}', - 'dom::bindings::utils::{finalize_global, trace_global}', - 'dom::bindings::utils::has_property_on_prototype', - 'dom::bindings::utils::is_platform_object', - 'dom::bindings::utils::throwing_constructor', - 'dom::bindings::utils::get_dictionary_property', - 'dom::bindings::utils::set_dictionary_property', - 'dom::bindings::utils::{NativeProperties, NativePropertyHooks}', + 'dom::bindings::utils::{ConstantSpec, DOMClass, DOMJSClass}', + 'dom::bindings::utils::{DOM_PROTO_UNFORGEABLE_HOLDER_SLOT, JSCLASS_DOM_GLOBAL}', + 'dom::bindings::utils::{NativeProperties, NativePropertyHooks, NonNullJSNative}', + 'dom::bindings::utils::{create_dom_global, do_create_interface_objects, finalize_global}', + 'dom::bindings::utils::{find_enum_string_index, generic_getter}', + 'dom::bindings::utils::{generic_lenient_getter, generic_lenient_setter}', + 'dom::bindings::utils::{generic_method, generic_setter, get_array_index_from_id}', + 'dom::bindings::utils::{get_dictionary_property, get_property_on_prototype}', + 'dom::bindings::utils::{get_proto_or_iface_array, has_property_on_prototype}', + 'dom::bindings::utils::{is_platform_object, set_dictionary_property}', + 'dom::bindings::utils::{throwing_constructor, trace_global}', 'dom::bindings::utils::ConstantVal::{IntVal, UintVal}', - 'dom::bindings::utils::NonNullJSNative', - 'dom::bindings::utils::{generic_getter, generic_lenient_getter}', - 'dom::bindings::utils::{generic_lenient_setter, generic_method}', - 'dom::bindings::utils::generic_setter', 'dom::bindings::trace::{JSTraceable, RootedTraceable}', 'dom::bindings::callback::{CallbackContainer,CallbackInterface,CallbackFunction}', 'dom::bindings::callback::{CallSetup,ExceptionHandling}', @@ -5248,8 +5395,8 @@ class CGBindingRoot(CGThing): 'dom::bindings::error::Error::JSFailed', 'dom::bindings::error::throw_dom_exception', 'dom::bindings::proxyhandler', - 'dom::bindings::proxyhandler::{fill_property_descriptor, get_expando_object}', - 'dom::bindings::proxyhandler::{get_property_descriptor}', + 'dom::bindings::proxyhandler::{ensure_expando_object, fill_property_descriptor}', + 'dom::bindings::proxyhandler::{get_expando_object, get_property_descriptor}', 'dom::bindings::num::Finite', 'dom::bindings::str::ByteString', 'dom::bindings::str::USVString', diff --git a/components/script/dom/bindings/codegen/Configuration.py b/components/script/dom/bindings/codegen/Configuration.py index 4f59ff09f5b..d0af7e37929 100644 --- a/components/script/dom/bindings/codegen/Configuration.py +++ b/components/script/dom/bindings/codegen/Configuration.py @@ -139,6 +139,13 @@ class DescriptorProvider: return self.config.getDescriptor(interfaceName) +def MemberIsUnforgeable(member, descriptor): + return ((member.isAttr() or member.isMethod()) and + not member.isStatic() and + (member.isUnforgeable() or + bool(descriptor.interface.getExtendedAttribute("Unforgeable")))) + + class Descriptor(DescriptorProvider): """ Represents a single descriptor for an interface. See Bindings.conf. @@ -174,6 +181,9 @@ class Descriptor(DescriptorProvider): # them as having a concrete descendant. self.concrete = (not self.interface.isCallback() and desc.get('concrete', True)) + self.hasUnforgeableMembers = (self.concrete and + any(MemberIsUnforgeable(m, self) for m in + self.interface.members)) self.operations = { 'IndexedGetter': None, diff --git a/components/script/dom/bindings/utils.rs b/components/script/dom/bindings/utils.rs index 97d5bb12eba..fe7c8030baa 100644 --- a/components/script/dom/bindings/utils.rs +++ b/components/script/dom/bindings/utils.rs @@ -78,6 +78,10 @@ impl GlobalStaticData { } } +/// The index of the slot where the object holder of that interface's +/// unforgeable members are defined. +pub const DOM_PROTO_UNFORGEABLE_HOLDER_SLOT: u32 = 0; + /// The index of the slot that contains a reference to the ProtoOrIfaceArray. // All DOM globals must have a slot at DOM_PROTOTYPE_SLOT. pub const DOM_PROTOTYPE_SLOT: u32 = js::JSCLASS_GLOBAL_SLOT_COUNT; @@ -181,8 +185,12 @@ pub fn get_proto_or_iface_array(global: *mut JSObject) -> *mut ProtoOrIfaceArray pub struct NativeProperties { /// Instance methods for the interface. pub methods: Option<&'static [JSFunctionSpec]>, + /// Unforgeable instance methods for the interface. + pub unforgeable_methods: Option<&'static [JSFunctionSpec]>, /// Instance attributes for the interface. pub attrs: Option<&'static [JSPropertySpec]>, + /// Unforgeable instance attributes for the interface. + pub unforgeable_attrs: Option<&'static [JSPropertySpec]>, /// Constants for the interface. pub consts: Option<&'static [ConstantSpec]>, /// Static methods for the interface. diff --git a/components/script/dom/create.rs b/components/script/dom/create.rs index 655c6a8d786..75a08464af7 100644 --- a/components/script/dom/create.rs +++ b/components/script/dom/create.rs @@ -87,16 +87,16 @@ pub fn create_element(name: QualName, let prefix = prefix.map(|p| DOMString::from(&*p)); if name.ns != ns!(html) { - return Element::new(DOMString::from(&*name.local), name.ns, prefix, document); + return Element::new(name.local, name.ns, prefix, document); } macro_rules! make( ($ctor:ident) => ({ - let obj = $ctor::new(DOMString::from(&*name.local), prefix, document); + let obj = $ctor::new(name.local, prefix, document); Root::upcast(obj) }); ($ctor:ident, $($arg:expr),+) => ({ - let obj = $ctor::new(DOMString::from(&*name.local), prefix, document, $($arg),+); + let obj = $ctor::new(name.local, prefix, document, $($arg),+); Root::upcast(obj) }) ); diff --git a/components/script/dom/domimplementation.rs b/components/script/dom/domimplementation.rs index 13cbeedd565..d994b111b69 100644 --- a/components/script/dom/domimplementation.rs +++ b/components/script/dom/domimplementation.rs @@ -132,14 +132,14 @@ impl DOMImplementationMethods for DOMImplementation { { // Step 4. let doc_node = doc.upcast::<Node>(); - let doc_html = Root::upcast::<Node>(HTMLHtmlElement::new(DOMString::from("html"), + let doc_html = Root::upcast::<Node>(HTMLHtmlElement::new(atom!("html"), None, doc.r())); doc_node.AppendChild(&doc_html).expect("Appending failed"); { // Step 5. - let doc_head = Root::upcast::<Node>(HTMLHeadElement::new(DOMString::from("head"), + let doc_head = Root::upcast::<Node>(HTMLHeadElement::new(atom!("head"), None, doc.r())); doc_html.AppendChild(&doc_head).unwrap(); @@ -150,7 +150,7 @@ impl DOMImplementationMethods for DOMImplementation { Some(title_str) => { // Step 6.1. let doc_title = - Root::upcast::<Node>(HTMLTitleElement::new(DOMString::from("title"), + Root::upcast::<Node>(HTMLTitleElement::new(atom!("title"), None, doc.r())); doc_head.AppendChild(&doc_title).unwrap(); @@ -163,7 +163,7 @@ impl DOMImplementationMethods for DOMImplementation { } // Step 7. - let doc_body = HTMLBodyElement::new(DOMString::from("body"), None, doc.r()); + let doc_body = HTMLBodyElement::new(atom!("body"), None, doc.r()); doc_html.AppendChild(doc_body.upcast()).unwrap(); } diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index e7d6a47076f..b343b1859a7 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -126,20 +126,20 @@ impl Element { } - pub fn new_inherited(local_name: DOMString, + pub fn new_inherited(local_name: Atom, namespace: Namespace, prefix: Option<DOMString>, document: &Document) -> Element { Element::new_inherited_with_state(ElementState::empty(), local_name, namespace, prefix, document) } - pub fn new_inherited_with_state(state: ElementState, local_name: DOMString, + pub fn new_inherited_with_state(state: ElementState, local_name: Atom, namespace: Namespace, prefix: Option<DOMString>, document: &Document) -> Element { Element { node: Node::new_inherited(document), - local_name: Atom::from(&*local_name), + local_name: local_name, namespace: namespace, prefix: prefix, attrs: DOMRefCell::new(vec![]), @@ -151,7 +151,7 @@ impl Element { } } - pub fn new(local_name: DOMString, + pub fn new(local_name: Atom, namespace: Namespace, prefix: Option<DOMString>, document: &Document) -> Root<Element> { @@ -1090,6 +1090,30 @@ impl Element { self.set_attribute(local_name, AttrValue::from_atomic_tokens(tokens)); } + pub fn get_int_attribute(&self, local_name: &Atom, default: i32) -> i32 { + // TODO: Is this assert necessary? + assert!(local_name.chars().all(|ch| { + !ch.is_ascii() || ch.to_ascii_lowercase() == ch + })); + let attribute = self.get_attribute(&ns!(), local_name); + + match attribute { + Some(ref attribute) => { + match *attribute.r().value() { + AttrValue::Int(_, value) => value, + _ => panic!("Expected an AttrValue::Int: \ + implement parse_plain_attribute"), + } + } + None => default, + } + } + + pub fn set_int_attribute(&self, local_name: &Atom, value: i32) { + assert!(&**local_name == local_name.to_ascii_lowercase()); + self.set_attribute(local_name, AttrValue::Int(DOMString::from(value.to_string()), value)); + } + pub fn get_uint_attribute(&self, local_name: &Atom, default: u32) -> u32 { assert!(local_name.chars().all(|ch| !ch.is_ascii() || ch.to_ascii_lowercase() == ch)); let attribute = self.get_attribute(&ns!(), local_name); diff --git a/components/script/dom/htmlanchorelement.rs b/components/script/dom/htmlanchorelement.rs index cd6aa841068..33fbdca845b 100644 --- a/components/script/dom/htmlanchorelement.rs +++ b/components/script/dom/htmlanchorelement.rs @@ -35,7 +35,7 @@ pub struct HTMLAnchorElement { } impl HTMLAnchorElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLAnchorElement { HTMLAnchorElement { @@ -46,7 +46,7 @@ impl HTMLAnchorElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLAnchorElement> { let element = HTMLAnchorElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlappletelement.rs b/components/script/dom/htmlappletelement.rs index 5f435b3c6c8..1648e07dc11 100644 --- a/components/script/dom/htmlappletelement.rs +++ b/components/script/dom/htmlappletelement.rs @@ -20,7 +20,7 @@ pub struct HTMLAppletElement { } impl HTMLAppletElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLAppletElement { HTMLAppletElement { @@ -30,7 +30,7 @@ impl HTMLAppletElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLAppletElement> { let element = HTMLAppletElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlareaelement.rs b/components/script/dom/htmlareaelement.rs index cd01baf4930..a19e0cc408e 100644 --- a/components/script/dom/htmlareaelement.rs +++ b/components/script/dom/htmlareaelement.rs @@ -24,7 +24,7 @@ pub struct HTMLAreaElement { } impl HTMLAreaElement { - fn new_inherited(localName: DOMString, prefix: Option<DOMString>, document: &Document) -> HTMLAreaElement { + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLAreaElement { HTMLAreaElement { htmlelement: HTMLElement::new_inherited(localName, prefix, document), rel_list: Default::default(), @@ -32,7 +32,7 @@ impl HTMLAreaElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLAreaElement> { let element = HTMLAreaElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlaudioelement.rs b/components/script/dom/htmlaudioelement.rs index ed0b89cca27..98ee31fb299 100644 --- a/components/script/dom/htmlaudioelement.rs +++ b/components/script/dom/htmlaudioelement.rs @@ -7,6 +7,7 @@ use dom::bindings::js::Root; use dom::document::Document; use dom::htmlmediaelement::HTMLMediaElement; use dom::node::Node; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -15,7 +16,7 @@ pub struct HTMLAudioElement { } impl HTMLAudioElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLAudioElement { HTMLAudioElement { @@ -25,7 +26,7 @@ impl HTMLAudioElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLAudioElement> { let element = HTMLAudioElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlbaseelement.rs b/components/script/dom/htmlbaseelement.rs index a537b06b27a..e35469d5038 100644 --- a/components/script/dom/htmlbaseelement.rs +++ b/components/script/dom/htmlbaseelement.rs @@ -11,6 +11,7 @@ use dom::element::{AttributeMutation, Element}; use dom::htmlelement::HTMLElement; use dom::node::{Node, document_from_node}; use dom::virtualmethods::VirtualMethods; +use string_cache::Atom; use url::{Url, UrlParser}; use util::str::DOMString; @@ -20,14 +21,14 @@ pub struct HTMLBaseElement { } impl HTMLBaseElement { - fn new_inherited(localName: DOMString, prefix: Option<DOMString>, document: &Document) -> HTMLBaseElement { + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLBaseElement { HTMLBaseElement { htmlelement: HTMLElement::new_inherited(localName, prefix, document) } } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLBaseElement> { let element = HTMLBaseElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlbodyelement.rs b/components/script/dom/htmlbodyelement.rs index 6c9a9f3be5d..f7605ed5aa3 100644 --- a/components/script/dom/htmlbodyelement.rs +++ b/components/script/dom/htmlbodyelement.rs @@ -36,7 +36,7 @@ pub struct HTMLBodyElement { } impl HTMLBodyElement { - fn new_inherited(localName: DOMString, prefix: Option<DOMString>, document: &Document) + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLBodyElement { HTMLBodyElement { htmlelement: HTMLElement::new_inherited(localName, prefix, document), @@ -45,7 +45,7 @@ impl HTMLBodyElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, prefix: Option<DOMString>, document: &Document) + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLBodyElement> { let element = HTMLBodyElement::new_inherited(localName, prefix, document); Node::reflect_node(box element, document, HTMLBodyElementBinding::Wrap) diff --git a/components/script/dom/htmlbrelement.rs b/components/script/dom/htmlbrelement.rs index 3007e772515..e9b31954f9f 100644 --- a/components/script/dom/htmlbrelement.rs +++ b/components/script/dom/htmlbrelement.rs @@ -7,6 +7,7 @@ use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; use dom::node::Node; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -15,14 +16,14 @@ pub struct HTMLBRElement { } impl HTMLBRElement { - fn new_inherited(localName: DOMString, prefix: Option<DOMString>, document: &Document) -> HTMLBRElement { + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLBRElement { HTMLBRElement { htmlelement: HTMLElement::new_inherited(localName, prefix, document) } } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLBRElement> { let element = HTMLBRElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlbuttonelement.rs b/components/script/dom/htmlbuttonelement.rs index d2358ad0ee5..356f094f052 100644 --- a/components/script/dom/htmlbuttonelement.rs +++ b/components/script/dom/htmlbuttonelement.rs @@ -23,6 +23,7 @@ use dom::virtualmethods::VirtualMethods; use selectors::states::*; use std::ascii::AsciiExt; use std::cell::Cell; +use string_cache::Atom; use util::str::DOMString; #[derive(JSTraceable, PartialEq, Copy, Clone)] @@ -42,7 +43,7 @@ pub struct HTMLButtonElement { } impl HTMLButtonElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLButtonElement { HTMLButtonElement { @@ -55,7 +56,7 @@ impl HTMLButtonElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLButtonElement> { let element = HTMLButtonElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlcanvaselement.rs b/components/script/dom/htmlcanvaselement.rs index 325a324b3c7..472f7beee28 100644 --- a/components/script/dom/htmlcanvaselement.rs +++ b/components/script/dom/htmlcanvaselement.rs @@ -60,7 +60,7 @@ impl PartialEq for HTMLCanvasElement { } impl HTMLCanvasElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLCanvasElement { HTMLCanvasElement { @@ -70,7 +70,7 @@ impl HTMLCanvasElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLCanvasElement> { let element = HTMLCanvasElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmldataelement.rs b/components/script/dom/htmldataelement.rs index dbbd1c5cdcf..9f949afb1fb 100644 --- a/components/script/dom/htmldataelement.rs +++ b/components/script/dom/htmldataelement.rs @@ -7,6 +7,7 @@ use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; use dom::node::Node; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -15,7 +16,7 @@ pub struct HTMLDataElement { } impl HTMLDataElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLDataElement { HTMLDataElement { @@ -24,7 +25,7 @@ impl HTMLDataElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLDataElement> { let element = HTMLDataElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmldatalistelement.rs b/components/script/dom/htmldatalistelement.rs index d0a9a51dce1..064b3d50b56 100644 --- a/components/script/dom/htmldatalistelement.rs +++ b/components/script/dom/htmldatalistelement.rs @@ -12,6 +12,7 @@ use dom::htmlcollection::{CollectionFilter, HTMLCollection}; use dom::htmlelement::HTMLElement; use dom::htmloptionelement::HTMLOptionElement; use dom::node::{Node, window_from_node}; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -20,7 +21,7 @@ pub struct HTMLDataListElement { } impl HTMLDataListElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLDataListElement { HTMLDataListElement { @@ -30,7 +31,7 @@ impl HTMLDataListElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLDataListElement> { let element = HTMLDataListElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmldialogelement.rs b/components/script/dom/htmldialogelement.rs index 108e9cbc4ea..f6d10f33a9f 100644 --- a/components/script/dom/htmldialogelement.rs +++ b/components/script/dom/htmldialogelement.rs @@ -9,6 +9,7 @@ use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; use dom::node::Node; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -18,7 +19,7 @@ pub struct HTMLDialogElement { } impl HTMLDialogElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLDialogElement { HTMLDialogElement { @@ -29,7 +30,7 @@ impl HTMLDialogElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLDialogElement> { let element = HTMLDialogElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmldirectoryelement.rs b/components/script/dom/htmldirectoryelement.rs index 231fb3a711d..2c48231beff 100644 --- a/components/script/dom/htmldirectoryelement.rs +++ b/components/script/dom/htmldirectoryelement.rs @@ -7,6 +7,7 @@ use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; use dom::node::Node; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -15,7 +16,7 @@ pub struct HTMLDirectoryElement { } impl HTMLDirectoryElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLDirectoryElement { HTMLDirectoryElement { @@ -25,7 +26,7 @@ impl HTMLDirectoryElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLDirectoryElement> { let element = HTMLDirectoryElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmldivelement.rs b/components/script/dom/htmldivelement.rs index 6d682317e65..eaa99f3e100 100644 --- a/components/script/dom/htmldivelement.rs +++ b/components/script/dom/htmldivelement.rs @@ -7,6 +7,7 @@ use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; use dom::node::Node; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -15,7 +16,7 @@ pub struct HTMLDivElement { } impl HTMLDivElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLDivElement { HTMLDivElement { @@ -24,7 +25,7 @@ impl HTMLDivElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLDivElement> { let element = HTMLDivElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmldlistelement.rs b/components/script/dom/htmldlistelement.rs index 5c42844a717..bfc36d67d38 100644 --- a/components/script/dom/htmldlistelement.rs +++ b/components/script/dom/htmldlistelement.rs @@ -7,6 +7,7 @@ use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; use dom::node::Node; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -15,7 +16,7 @@ pub struct HTMLDListElement { } impl HTMLDListElement { - fn new_inherited(localName: DOMString, prefix: Option<DOMString>, document: &Document) -> HTMLDListElement { + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLDListElement { HTMLDListElement { htmlelement: HTMLElement::new_inherited(localName, prefix, document) @@ -23,7 +24,7 @@ impl HTMLDListElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLDListElement> { let element = HTMLDListElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlelement.rs b/components/script/dom/htmlelement.rs index c40b4477e5a..4b5fb69cf88 100644 --- a/components/script/dom/htmlelement.rs +++ b/components/script/dom/htmlelement.rs @@ -54,12 +54,12 @@ impl PartialEq for HTMLElement { } impl HTMLElement { - pub fn new_inherited(tag_name: DOMString, prefix: Option<DOMString>, + pub fn new_inherited(tag_name: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLElement { HTMLElement::new_inherited_with_state(ElementState::empty(), tag_name, prefix, document) } - pub fn new_inherited_with_state(state: ElementState, tag_name: DOMString, + pub fn new_inherited_with_state(state: ElementState, tag_name: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLElement { HTMLElement { @@ -71,7 +71,7 @@ impl HTMLElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, prefix: Option<DOMString>, document: &Document) -> Root<HTMLElement> { + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLElement> { let element = HTMLElement::new_inherited(localName, prefix, document); Node::reflect_node(box element, document, HTMLElementBinding::Wrap) } diff --git a/components/script/dom/htmlembedelement.rs b/components/script/dom/htmlembedelement.rs index 7af4dac4da7..f5c96bfc583 100644 --- a/components/script/dom/htmlembedelement.rs +++ b/components/script/dom/htmlembedelement.rs @@ -7,6 +7,7 @@ use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; use dom::node::Node; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -15,14 +16,14 @@ pub struct HTMLEmbedElement { } impl HTMLEmbedElement { - fn new_inherited(localName: DOMString, prefix: Option<DOMString>, document: &Document) -> HTMLEmbedElement { + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLEmbedElement { HTMLEmbedElement { htmlelement: HTMLElement::new_inherited(localName, prefix, document) } } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLEmbedElement> { let element = HTMLEmbedElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlfieldsetelement.rs b/components/script/dom/htmlfieldsetelement.rs index a2c45a1b46c..8dc1cc043ee 100644 --- a/components/script/dom/htmlfieldsetelement.rs +++ b/components/script/dom/htmlfieldsetelement.rs @@ -17,6 +17,7 @@ use dom::node::{Node, window_from_node}; use dom::validitystate::ValidityState; use dom::virtualmethods::VirtualMethods; use selectors::states::*; +use string_cache::Atom; use util::str::{DOMString, StaticStringVec}; #[dom_struct] @@ -25,7 +26,7 @@ pub struct HTMLFieldSetElement { } impl HTMLFieldSetElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLFieldSetElement { HTMLFieldSetElement { @@ -36,7 +37,7 @@ impl HTMLFieldSetElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLFieldSetElement> { let element = HTMLFieldSetElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlfontelement.rs b/components/script/dom/htmlfontelement.rs index c8faf248f41..5d7dbe7ed34 100644 --- a/components/script/dom/htmlfontelement.rs +++ b/components/script/dom/htmlfontelement.rs @@ -24,14 +24,14 @@ pub struct HTMLFontElement { impl HTMLFontElement { - fn new_inherited(localName: DOMString, prefix: Option<DOMString>, document: &Document) -> HTMLFontElement { + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLFontElement { HTMLFontElement { htmlelement: HTMLElement::new_inherited(localName, prefix, document), } } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLFontElement> { let element = HTMLFontElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlformelement.rs b/components/script/dom/htmlformelement.rs index 6d37719a862..8069cafe932 100644 --- a/components/script/dom/htmlformelement.rs +++ b/components/script/dom/htmlformelement.rs @@ -49,7 +49,7 @@ impl PartialEq for HTMLFormElement { } impl HTMLFormElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLFormElement { HTMLFormElement { @@ -59,7 +59,7 @@ impl HTMLFormElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLFormElement> { let element = HTMLFormElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlframeelement.rs b/components/script/dom/htmlframeelement.rs index 72b6307096a..2907fea4168 100644 --- a/components/script/dom/htmlframeelement.rs +++ b/components/script/dom/htmlframeelement.rs @@ -7,6 +7,7 @@ use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; use dom::node::Node; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -15,14 +16,14 @@ pub struct HTMLFrameElement { } impl HTMLFrameElement { - fn new_inherited(localName: DOMString, prefix: Option<DOMString>, document: &Document) -> HTMLFrameElement { + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLFrameElement { HTMLFrameElement { htmlelement: HTMLElement::new_inherited(localName, prefix, document) } } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLFrameElement> { let element = HTMLFrameElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlframesetelement.rs b/components/script/dom/htmlframesetelement.rs index 9db91262264..92170a0baf4 100644 --- a/components/script/dom/htmlframesetelement.rs +++ b/components/script/dom/htmlframesetelement.rs @@ -7,6 +7,7 @@ use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; use dom::node::Node; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -15,7 +16,7 @@ pub struct HTMLFrameSetElement { } impl HTMLFrameSetElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLFrameSetElement { HTMLFrameSetElement { @@ -25,7 +26,7 @@ impl HTMLFrameSetElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLFrameSetElement> { let element = HTMLFrameSetElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlheadelement.rs b/components/script/dom/htmlheadelement.rs index 7bb42b0cfea..4f87db1d824 100644 --- a/components/script/dom/htmlheadelement.rs +++ b/components/script/dom/htmlheadelement.rs @@ -10,6 +10,7 @@ use dom::htmlelement::HTMLElement; use dom::node::Node; use dom::userscripts::load_script; use dom::virtualmethods::VirtualMethods; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -18,7 +19,7 @@ pub struct HTMLHeadElement { } impl HTMLHeadElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLHeadElement { HTMLHeadElement { @@ -27,7 +28,7 @@ impl HTMLHeadElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLHeadElement> { let element = HTMLHeadElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlheadingelement.rs b/components/script/dom/htmlheadingelement.rs index f0aa4c046c7..5f219b54f34 100644 --- a/components/script/dom/htmlheadingelement.rs +++ b/components/script/dom/htmlheadingelement.rs @@ -7,6 +7,7 @@ use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; use dom::node::Node; +use string_cache::Atom; use util::str::DOMString; #[derive(JSTraceable, HeapSizeOf)] @@ -26,7 +27,7 @@ pub struct HTMLHeadingElement { } impl HTMLHeadingElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document, level: HeadingLevel) -> HTMLHeadingElement { @@ -38,7 +39,7 @@ impl HTMLHeadingElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document, level: HeadingLevel) -> Root<HTMLHeadingElement> { diff --git a/components/script/dom/htmlhrelement.rs b/components/script/dom/htmlhrelement.rs index 84c409506e8..93fdebbc954 100644 --- a/components/script/dom/htmlhrelement.rs +++ b/components/script/dom/htmlhrelement.rs @@ -21,14 +21,14 @@ pub struct HTMLHRElement { } impl HTMLHRElement { - fn new_inherited(localName: DOMString, prefix: Option<DOMString>, document: &Document) -> HTMLHRElement { + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLHRElement { HTMLHRElement { htmlelement: HTMLElement::new_inherited(localName, prefix, document) } } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLHRElement> { let element = HTMLHRElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlhtmlelement.rs b/components/script/dom/htmlhtmlelement.rs index 85f94051547..2ae0e3d5fb3 100644 --- a/components/script/dom/htmlhtmlelement.rs +++ b/components/script/dom/htmlhtmlelement.rs @@ -7,6 +7,7 @@ use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; use dom::node::Node; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -15,14 +16,14 @@ pub struct HTMLHtmlElement { } impl HTMLHtmlElement { - fn new_inherited(localName: DOMString, prefix: Option<DOMString>, document: &Document) -> HTMLHtmlElement { + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLHtmlElement { HTMLHtmlElement { htmlelement: HTMLElement::new_inherited(localName, prefix, document) } } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLHtmlElement> { let element = HTMLHtmlElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmliframeelement.rs b/components/script/dom/htmliframeelement.rs index 78400b6d49a..4c7f7276ca7 100644 --- a/components/script/dom/htmliframeelement.rs +++ b/components/script/dom/htmliframeelement.rs @@ -160,7 +160,7 @@ impl HTMLIFrameElement { self.subpage_id.set(Some(new_subpage_id)); } - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLIFrameElement { HTMLIFrameElement { @@ -173,7 +173,7 @@ impl HTMLIFrameElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLIFrameElement> { let element = HTMLIFrameElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs index 06603de0e00..fa9a7e5d69b 100644 --- a/components/script/dom/htmlimageelement.rs +++ b/components/script/dom/htmlimageelement.rs @@ -128,7 +128,7 @@ impl HTMLImageElement { } } - fn new_inherited(localName: DOMString, prefix: Option<DOMString>, document: &Document) -> HTMLImageElement { + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLImageElement { HTMLImageElement { htmlelement: HTMLElement::new_inherited(localName, prefix, document), url: DOMRefCell::new(None), @@ -137,7 +137,7 @@ impl HTMLImageElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLImageElement> { let element = HTMLImageElement::new_inherited(localName, prefix, document); @@ -148,7 +148,7 @@ impl HTMLImageElement { width: Option<u32>, height: Option<u32>) -> Fallible<Root<HTMLImageElement>> { let document = global.as_window().Document(); - let image = HTMLImageElement::new(DOMString::from("img"), None, document.r()); + let image = HTMLImageElement::new(atom!("img"), None, document.r()); if let Some(w) = width { image.SetWidth(w); } diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs index 524f70e1288..cd640b83287 100644 --- a/components/script/dom/htmlinputelement.rs +++ b/components/script/dom/htmlinputelement.rs @@ -64,6 +64,7 @@ pub struct HTMLInputElement { placeholder: DOMRefCell<DOMString>, value_changed: Cell<bool>, size: Cell<u32>, + maxlength: Cell<i32>, #[ignore_heap_size_of = "#7193"] textinput: DOMRefCell<TextInput<ConstellationChan<ConstellationMsg>>>, activation_state: DOMRefCell<InputActivationState>, @@ -103,9 +104,10 @@ impl InputActivationState { } static DEFAULT_INPUT_SIZE: u32 = 20; +static DEFAULT_MAX_LENGTH: i32 = -1; impl HTMLInputElement { - fn new_inherited(localName: DOMString, prefix: Option<DOMString>, document: &Document) -> HTMLInputElement { + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLInputElement { let chan = document.window().constellation_chan(); HTMLInputElement { htmlelement: @@ -115,14 +117,15 @@ impl HTMLInputElement { placeholder: DOMRefCell::new(DOMString::new()), checked_changed: Cell::new(false), value_changed: Cell::new(false), + maxlength: Cell::new(DEFAULT_MAX_LENGTH), size: Cell::new(DEFAULT_INPUT_SIZE), - textinput: DOMRefCell::new(TextInput::new(Single, DOMString::new(), chan)), + textinput: DOMRefCell::new(TextInput::new(Single, DOMString::new(), chan, None)), activation_state: DOMRefCell::new(InputActivationState::new()) } } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLInputElement> { let element = HTMLInputElement::new_inherited(localName, prefix, document); @@ -337,6 +340,12 @@ impl HTMLInputElementMethods for HTMLInputElement { // https://html.spec.whatwg.org/multipage/#dom-input-formtarget make_setter!(SetFormTarget, "formtarget"); + // https://html.spec.whatwg.org/multipage/#dom-input-maxlength + make_int_getter!(MaxLength, "maxlength", DEFAULT_MAX_LENGTH); + + // https://html.spec.whatwg.org/multipage/#dom-input-maxlength + make_limited_int_setter!(SetMaxLength, "maxlength", DEFAULT_MAX_LENGTH); + // https://html.spec.whatwg.org/multipage/#dom-input-indeterminate fn Indeterminate(&self) -> bool { self.upcast::<Element>().get_state().contains(IN_INDETERMINATE_STATE) @@ -511,6 +520,7 @@ impl VirtualMethods for HTMLInputElement { fn attribute_mutated(&self, attr: &Attr, mutation: AttributeMutation) { self.super_type().unwrap().attribute_mutated(attr, mutation); + match attr.local_name() { &atom!("disabled") => { let disabled_state = match mutation { @@ -581,6 +591,18 @@ impl VirtualMethods for HTMLInputElement { self.radio_group_updated( mutation.new_value(attr).as_ref().map(|name| name.as_atom())); }, + &atom!("maxlength") => { + match *attr.value() { + AttrValue::Int(_, value) => { + if value < 0 { + self.textinput.borrow_mut().max_length = None + } else { + self.textinput.borrow_mut().max_length = Some(value as usize) + } + }, + _ => panic!("Expected an AttrValue::Int"), + } + } &atom!("placeholder") => { // FIXME(ajeffrey): Should we do in-place mutation of the placeholder? let mut placeholder = self.placeholder.borrow_mut(); @@ -599,6 +621,7 @@ impl VirtualMethods for HTMLInputElement { &atom!("name") => AttrValue::from_atomic(value), &atom!("size") => AttrValue::from_limited_u32(value, DEFAULT_INPUT_SIZE), &atom!("type") => AttrValue::from_atomic(value), + &atom!("maxlength") => AttrValue::from_limited_i32(value, DEFAULT_MAX_LENGTH), _ => self.super_type().unwrap().parse_plain_attribute(name, value), } } diff --git a/components/script/dom/htmllabelelement.rs b/components/script/dom/htmllabelelement.rs index 69fac1871b1..fb32405084d 100644 --- a/components/script/dom/htmllabelelement.rs +++ b/components/script/dom/htmllabelelement.rs @@ -25,7 +25,7 @@ pub struct HTMLLabelElement { } impl HTMLLabelElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLLabelElement { HTMLLabelElement { @@ -35,7 +35,7 @@ impl HTMLLabelElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLLabelElement> { let element = HTMLLabelElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmllegendelement.rs b/components/script/dom/htmllegendelement.rs index bc99bcec2b1..8686c5a4c10 100644 --- a/components/script/dom/htmllegendelement.rs +++ b/components/script/dom/htmllegendelement.rs @@ -7,6 +7,7 @@ use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; use dom::node::Node; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -15,7 +16,7 @@ pub struct HTMLLegendElement { } impl HTMLLegendElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLLegendElement { HTMLLegendElement { @@ -25,7 +26,7 @@ impl HTMLLegendElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLLegendElement> { let element = HTMLLegendElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmllielement.rs b/components/script/dom/htmllielement.rs index 00a99791b8f..e0deac587fc 100644 --- a/components/script/dom/htmllielement.rs +++ b/components/script/dom/htmllielement.rs @@ -7,6 +7,7 @@ use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; use dom::node::Node; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -15,14 +16,14 @@ pub struct HTMLLIElement { } impl HTMLLIElement { - fn new_inherited(localName: DOMString, prefix: Option<DOMString>, document: &Document) -> HTMLLIElement { + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLLIElement { HTMLLIElement { htmlelement: HTMLElement::new_inherited(localName, prefix, document) } } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLLIElement> { let element = HTMLLIElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmllinkelement.rs b/components/script/dom/htmllinkelement.rs index b368bff3f26..b8d757920a8 100644 --- a/components/script/dom/htmllinkelement.rs +++ b/components/script/dom/htmllinkelement.rs @@ -53,7 +53,7 @@ pub struct HTMLLinkElement { } impl HTMLLinkElement { - fn new_inherited(localName: DOMString, prefix: Option<DOMString>, document: &Document, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document, creator: ElementCreator) -> HTMLLinkElement { HTMLLinkElement { htmlelement: HTMLElement::new_inherited(localName, prefix, document), @@ -64,7 +64,7 @@ impl HTMLLinkElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document, creator: ElementCreator) -> Root<HTMLLinkElement> { diff --git a/components/script/dom/htmlmapelement.rs b/components/script/dom/htmlmapelement.rs index 30816c51409..278b0eb66ab 100644 --- a/components/script/dom/htmlmapelement.rs +++ b/components/script/dom/htmlmapelement.rs @@ -7,6 +7,7 @@ use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; use dom::node::Node; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -15,7 +16,7 @@ pub struct HTMLMapElement { } impl HTMLMapElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLMapElement { HTMLMapElement { @@ -24,7 +25,7 @@ impl HTMLMapElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLMapElement> { let element = HTMLMapElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs index 06c2f32a7a4..7b21703341d 100644 --- a/components/script/dom/htmlmediaelement.rs +++ b/components/script/dom/htmlmediaelement.rs @@ -4,6 +4,7 @@ use dom::document::Document; use dom::htmlelement::HTMLElement; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -12,7 +13,7 @@ pub struct HTMLMediaElement { } impl HTMLMediaElement { - pub fn new_inherited(tag_name: DOMString, + pub fn new_inherited(tag_name: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLMediaElement { HTMLMediaElement { diff --git a/components/script/dom/htmlmetaelement.rs b/components/script/dom/htmlmetaelement.rs index 0d2730c5f42..d39f37abd7a 100644 --- a/components/script/dom/htmlmetaelement.rs +++ b/components/script/dom/htmlmetaelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, document_from_node}; use dom::virtualmethods::VirtualMethods; use std::ascii::AsciiExt; use std::sync::Arc; +use string_cache::Atom; use style::stylesheets::{CSSRule, Origin, Stylesheet}; use style::viewport::ViewportRule; use util::str::{DOMString, HTML_SPACE_CHARACTERS}; @@ -25,7 +26,7 @@ pub struct HTMLMetaElement { } impl HTMLMetaElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLMetaElement { HTMLMetaElement { @@ -35,7 +36,7 @@ impl HTMLMetaElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLMetaElement> { let element = HTMLMetaElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlmeterelement.rs b/components/script/dom/htmlmeterelement.rs index 91006fb486b..e41af546790 100644 --- a/components/script/dom/htmlmeterelement.rs +++ b/components/script/dom/htmlmeterelement.rs @@ -9,6 +9,7 @@ use dom::document::Document; use dom::htmlelement::HTMLElement; use dom::node::Node; use dom::nodelist::NodeList; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -17,7 +18,7 @@ pub struct HTMLMeterElement { } impl HTMLMeterElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLMeterElement { HTMLMeterElement { @@ -26,7 +27,7 @@ impl HTMLMeterElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLMeterElement> { let element = HTMLMeterElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlmodelement.rs b/components/script/dom/htmlmodelement.rs index d05971998bb..3961f3ae35c 100644 --- a/components/script/dom/htmlmodelement.rs +++ b/components/script/dom/htmlmodelement.rs @@ -7,6 +7,7 @@ use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; use dom::node::Node; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -15,7 +16,7 @@ pub struct HTMLModElement { } impl HTMLModElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLModElement { HTMLModElement { @@ -25,7 +26,7 @@ impl HTMLModElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLModElement> { let element = HTMLModElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlobjectelement.rs b/components/script/dom/htmlobjectelement.rs index 0bbb86b5ffc..c60c4dd1d13 100644 --- a/components/script/dom/htmlobjectelement.rs +++ b/components/script/dom/htmlobjectelement.rs @@ -17,6 +17,7 @@ use dom::validitystate::ValidityState; use dom::virtualmethods::VirtualMethods; use net_traits::image::base::Image; use std::sync::Arc; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -26,7 +27,7 @@ pub struct HTMLObjectElement { } impl HTMLObjectElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLObjectElement { HTMLObjectElement { @@ -37,7 +38,7 @@ impl HTMLObjectElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLObjectElement> { let element = HTMLObjectElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlolistelement.rs b/components/script/dom/htmlolistelement.rs index 4ac17a95d14..d8aa78e3bc6 100644 --- a/components/script/dom/htmlolistelement.rs +++ b/components/script/dom/htmlolistelement.rs @@ -7,6 +7,7 @@ use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; use dom::node::Node; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -15,7 +16,7 @@ pub struct HTMLOListElement { } impl HTMLOListElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLOListElement { HTMLOListElement { @@ -24,7 +25,7 @@ impl HTMLOListElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLOListElement> { let element = HTMLOListElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmloptgroupelement.rs b/components/script/dom/htmloptgroupelement.rs index 3b146e62091..b0624d426f9 100644 --- a/components/script/dom/htmloptgroupelement.rs +++ b/components/script/dom/htmloptgroupelement.rs @@ -14,6 +14,7 @@ use dom::htmloptionelement::HTMLOptionElement; use dom::node::Node; use dom::virtualmethods::VirtualMethods; use selectors::states::*; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -22,7 +23,7 @@ pub struct HTMLOptGroupElement { } impl HTMLOptGroupElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLOptGroupElement { HTMLOptGroupElement { @@ -33,7 +34,7 @@ impl HTMLOptGroupElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLOptGroupElement> { let element = HTMLOptGroupElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmloptionelement.rs b/components/script/dom/htmloptionelement.rs index c73138be9c0..67e58b3d46e 100644 --- a/components/script/dom/htmloptionelement.rs +++ b/components/script/dom/htmloptionelement.rs @@ -20,6 +20,7 @@ use dom::text::Text; use dom::virtualmethods::VirtualMethods; use selectors::states::*; use std::cell::Cell; +use string_cache::Atom; use util::str::{DOMString, split_html_space_chars, str_join}; #[dom_struct] @@ -34,7 +35,7 @@ pub struct HTMLOptionElement { } impl HTMLOptionElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLOptionElement { HTMLOptionElement { @@ -47,7 +48,7 @@ impl HTMLOptionElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLOptionElement> { let element = HTMLOptionElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmloutputelement.rs b/components/script/dom/htmloutputelement.rs index 9049262aa8c..0a018f4217d 100644 --- a/components/script/dom/htmloutputelement.rs +++ b/components/script/dom/htmloutputelement.rs @@ -12,6 +12,7 @@ use dom::htmlformelement::{FormControl, HTMLFormElement}; use dom::node::{Node, window_from_node}; use dom::nodelist::NodeList; use dom::validitystate::ValidityState; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -20,7 +21,7 @@ pub struct HTMLOutputElement { } impl HTMLOutputElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLOutputElement { HTMLOutputElement { @@ -30,7 +31,7 @@ impl HTMLOutputElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLOutputElement> { let element = HTMLOutputElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlparagraphelement.rs b/components/script/dom/htmlparagraphelement.rs index c6f867d9cfb..828e2f37742 100644 --- a/components/script/dom/htmlparagraphelement.rs +++ b/components/script/dom/htmlparagraphelement.rs @@ -7,6 +7,7 @@ use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; use dom::node::Node; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -15,7 +16,7 @@ pub struct HTMLParagraphElement { } impl HTMLParagraphElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLParagraphElement { HTMLParagraphElement { @@ -25,7 +26,7 @@ impl HTMLParagraphElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLParagraphElement> { let element = HTMLParagraphElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlparamelement.rs b/components/script/dom/htmlparamelement.rs index 4cf7f1b2672..6e9da2e787b 100644 --- a/components/script/dom/htmlparamelement.rs +++ b/components/script/dom/htmlparamelement.rs @@ -7,6 +7,7 @@ use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; use dom::node::Node; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -15,7 +16,7 @@ pub struct HTMLParamElement { } impl HTMLParamElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLParamElement { HTMLParamElement { @@ -25,7 +26,7 @@ impl HTMLParamElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLParamElement> { let element = HTMLParamElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlpreelement.rs b/components/script/dom/htmlpreelement.rs index 71ba4d8d8a1..d227c70cb83 100644 --- a/components/script/dom/htmlpreelement.rs +++ b/components/script/dom/htmlpreelement.rs @@ -7,6 +7,7 @@ use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; use dom::node::Node; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -15,7 +16,7 @@ pub struct HTMLPreElement { } impl HTMLPreElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLPreElement { HTMLPreElement { @@ -25,7 +26,7 @@ impl HTMLPreElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLPreElement> { let element = HTMLPreElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlprogresselement.rs b/components/script/dom/htmlprogresselement.rs index 904055a21a0..8af60fdd1ba 100644 --- a/components/script/dom/htmlprogresselement.rs +++ b/components/script/dom/htmlprogresselement.rs @@ -9,6 +9,7 @@ use dom::document::Document; use dom::htmlelement::HTMLElement; use dom::node::Node; use dom::nodelist::NodeList; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -17,7 +18,7 @@ pub struct HTMLProgressElement { } impl HTMLProgressElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLProgressElement { HTMLProgressElement { @@ -27,7 +28,7 @@ impl HTMLProgressElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLProgressElement> { let element = HTMLProgressElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlquoteelement.rs b/components/script/dom/htmlquoteelement.rs index bc8df25c351..dd5b9301f71 100644 --- a/components/script/dom/htmlquoteelement.rs +++ b/components/script/dom/htmlquoteelement.rs @@ -7,6 +7,7 @@ use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; use dom::node::Node; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -15,7 +16,7 @@ pub struct HTMLQuoteElement { } impl HTMLQuoteElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLQuoteElement { HTMLQuoteElement { @@ -25,7 +26,7 @@ impl HTMLQuoteElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLQuoteElement> { let element = HTMLQuoteElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index d162605baec..0d2da397406 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -40,6 +40,7 @@ use std::ascii::AsciiExt; use std::cell::Cell; use std::mem; use std::sync::{Arc, Mutex}; +use string_cache::Atom; use url::{Url, UrlParser}; use util::str::{DOMString, HTML_SPACE_CHARACTERS, StaticStringVec}; @@ -73,7 +74,7 @@ pub struct HTMLScriptElement { } impl HTMLScriptElement { - fn new_inherited(localName: DOMString, prefix: Option<DOMString>, document: &Document, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document, creator: ElementCreator) -> HTMLScriptElement { HTMLScriptElement { htmlelement: @@ -89,7 +90,7 @@ impl HTMLScriptElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, prefix: Option<DOMString>, document: &Document, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document, creator: ElementCreator) -> Root<HTMLScriptElement> { let element = HTMLScriptElement::new_inherited(localName, prefix, document, creator); Node::reflect_node(box element, document, HTMLScriptElementBinding::Wrap) diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index 903237b46ea..a9310997851 100644 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -32,7 +32,7 @@ pub struct HTMLSelectElement { static DEFAULT_SELECT_SIZE: u32 = 0; impl HTMLSelectElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLSelectElement { HTMLSelectElement { @@ -43,7 +43,7 @@ impl HTMLSelectElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLSelectElement> { let element = HTMLSelectElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlsourceelement.rs b/components/script/dom/htmlsourceelement.rs index b28d82f32ec..37c1fbf8d11 100644 --- a/components/script/dom/htmlsourceelement.rs +++ b/components/script/dom/htmlsourceelement.rs @@ -7,6 +7,7 @@ use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; use dom::node::Node; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -15,7 +16,7 @@ pub struct HTMLSourceElement { } impl HTMLSourceElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLSourceElement { HTMLSourceElement { @@ -25,7 +26,7 @@ impl HTMLSourceElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLSourceElement> { let element = HTMLSourceElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlspanelement.rs b/components/script/dom/htmlspanelement.rs index 7f5d80361cb..771defdb818 100644 --- a/components/script/dom/htmlspanelement.rs +++ b/components/script/dom/htmlspanelement.rs @@ -7,6 +7,7 @@ use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; use dom::node::Node; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -15,14 +16,14 @@ pub struct HTMLSpanElement { } impl HTMLSpanElement { - fn new_inherited(localName: DOMString, prefix: Option<DOMString>, document: &Document) -> HTMLSpanElement { + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLSpanElement { HTMLSpanElement { htmlelement: HTMLElement::new_inherited(localName, prefix, document) } } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLSpanElement> { let element = HTMLSpanElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlstyleelement.rs b/components/script/dom/htmlstyleelement.rs index 8eba6b5982f..4b423b920b7 100644 --- a/components/script/dom/htmlstyleelement.rs +++ b/components/script/dom/htmlstyleelement.rs @@ -15,6 +15,7 @@ use dom::node::{ChildrenMutation, Node, document_from_node, window_from_node}; use dom::virtualmethods::VirtualMethods; use layout_interface::{LayoutChan, Msg}; use std::sync::Arc; +use string_cache::Atom; use style::media_queries::parse_media_query_list; use style::stylesheets::{Origin, Stylesheet}; use util::str::DOMString; @@ -26,7 +27,7 @@ pub struct HTMLStyleElement { } impl HTMLStyleElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLStyleElement { HTMLStyleElement { @@ -36,7 +37,7 @@ impl HTMLStyleElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLStyleElement> { let element = HTMLStyleElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmltablecaptionelement.rs b/components/script/dom/htmltablecaptionelement.rs index 7b43fe0aece..46b841f3a43 100644 --- a/components/script/dom/htmltablecaptionelement.rs +++ b/components/script/dom/htmltablecaptionelement.rs @@ -7,6 +7,7 @@ use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; use dom::node::Node; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -15,7 +16,7 @@ pub struct HTMLTableCaptionElement { } impl HTMLTableCaptionElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLTableCaptionElement { HTMLTableCaptionElement { @@ -25,7 +26,7 @@ impl HTMLTableCaptionElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLTableCaptionElement> { let element = HTMLTableCaptionElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmltablecellelement.rs b/components/script/dom/htmltablecellelement.rs index 25a0806b10d..f73ebd6a72c 100644 --- a/components/script/dom/htmltablecellelement.rs +++ b/components/script/dom/htmltablecellelement.rs @@ -27,7 +27,7 @@ pub struct HTMLTableCellElement { } impl HTMLTableCellElement { - pub fn new_inherited(tag_name: DOMString, + pub fn new_inherited(tag_name: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLTableCellElement { diff --git a/components/script/dom/htmltablecolelement.rs b/components/script/dom/htmltablecolelement.rs index 25ca4ed8111..53825357066 100644 --- a/components/script/dom/htmltablecolelement.rs +++ b/components/script/dom/htmltablecolelement.rs @@ -7,6 +7,7 @@ use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; use dom::node::Node; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -15,7 +16,7 @@ pub struct HTMLTableColElement { } impl HTMLTableColElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLTableColElement { HTMLTableColElement { @@ -25,7 +26,7 @@ impl HTMLTableColElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLTableColElement> { let element = HTMLTableColElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmltabledatacellelement.rs b/components/script/dom/htmltabledatacellelement.rs index 304af9dd844..c7081466932 100644 --- a/components/script/dom/htmltabledatacellelement.rs +++ b/components/script/dom/htmltabledatacellelement.rs @@ -7,6 +7,7 @@ use dom::bindings::js::Root; use dom::document::Document; use dom::htmltablecellelement::HTMLTableCellElement; use dom::node::Node; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -15,7 +16,7 @@ pub struct HTMLTableDataCellElement { } impl HTMLTableDataCellElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLTableDataCellElement { HTMLTableDataCellElement { @@ -25,7 +26,7 @@ impl HTMLTableDataCellElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, prefix: Option<DOMString>, document: &Document) + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLTableDataCellElement> { Node::reflect_node(box HTMLTableDataCellElement::new_inherited(localName, prefix, diff --git a/components/script/dom/htmltableelement.rs b/components/script/dom/htmltableelement.rs index b4c87d54866..0de4c81fd9d 100644 --- a/components/script/dom/htmltableelement.rs +++ b/components/script/dom/htmltableelement.rs @@ -29,7 +29,7 @@ pub struct HTMLTableElement { } impl HTMLTableElement { - fn new_inherited(localName: DOMString, prefix: Option<DOMString>, document: &Document) + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLTableElement { HTMLTableElement { htmlelement: HTMLElement::new_inherited(localName, prefix, document), @@ -40,7 +40,7 @@ impl HTMLTableElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, prefix: Option<DOMString>, document: &Document) + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLTableElement> { let element = HTMLTableElement::new_inherited(localName, prefix, document); Node::reflect_node(box element, document, HTMLTableElementBinding::Wrap) @@ -75,7 +75,7 @@ impl HTMLTableElementMethods for HTMLTableElement { let caption = match self.GetCaption() { Some(caption) => caption, None => { - let caption = HTMLTableCaptionElement::new(DOMString::from("caption"), + let caption = HTMLTableCaptionElement::new(atom!("caption"), None, document_from_node(self).r()); self.SetCaption(Some(caption.r())); @@ -94,7 +94,7 @@ impl HTMLTableElementMethods for HTMLTableElement { // https://html.spec.whatwg.org/multipage/#dom-table-createtbody fn CreateTBody(&self) -> Root<HTMLTableSectionElement> { - let tbody = HTMLTableSectionElement::new(DOMString::from("tbody"), + let tbody = HTMLTableSectionElement::new(atom!("tbody"), None, document_from_node(self).r()); let node = self.upcast::<Node>(); diff --git a/components/script/dom/htmltableheadercellelement.rs b/components/script/dom/htmltableheadercellelement.rs index 10803eadf14..dd14d75530c 100644 --- a/components/script/dom/htmltableheadercellelement.rs +++ b/components/script/dom/htmltableheadercellelement.rs @@ -7,6 +7,7 @@ use dom::bindings::js::Root; use dom::document::Document; use dom::htmltablecellelement::HTMLTableCellElement; use dom::node::Node; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -15,7 +16,7 @@ pub struct HTMLTableHeaderCellElement { } impl HTMLTableHeaderCellElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLTableHeaderCellElement { HTMLTableHeaderCellElement { @@ -25,7 +26,7 @@ impl HTMLTableHeaderCellElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLTableHeaderCellElement> { let element = HTMLTableHeaderCellElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmltablerowelement.rs b/components/script/dom/htmltablerowelement.rs index 7f35b88c4dc..be0a9c9f5fb 100644 --- a/components/script/dom/htmltablerowelement.rs +++ b/components/script/dom/htmltablerowelement.rs @@ -37,7 +37,7 @@ pub struct HTMLTableRowElement { } impl HTMLTableRowElement { - fn new_inherited(localName: DOMString, prefix: Option<DOMString>, document: &Document) + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLTableRowElement { HTMLTableRowElement { htmlelement: HTMLElement::new_inherited(localName, prefix, document), @@ -46,7 +46,7 @@ impl HTMLTableRowElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, prefix: Option<DOMString>, document: &Document) + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLTableRowElement> { Node::reflect_node(box HTMLTableRowElement::new_inherited(localName, prefix, document), document, @@ -76,7 +76,7 @@ impl HTMLTableRowElementMethods for HTMLTableRowElement { node.insert_cell_or_row( index, || self.Cells(), - || HTMLTableDataCellElement::new(DOMString::from("td"), None, node.owner_doc().r())) + || HTMLTableDataCellElement::new(atom!("td"), None, node.owner_doc().r())) } // https://html.spec.whatwg.org/multipage/#dom-tr-deletecell diff --git a/components/script/dom/htmltablesectionelement.rs b/components/script/dom/htmltablesectionelement.rs index 78d21d7ec86..e51caa9f30e 100644 --- a/components/script/dom/htmltablesectionelement.rs +++ b/components/script/dom/htmltablesectionelement.rs @@ -25,7 +25,7 @@ pub struct HTMLTableSectionElement { } impl HTMLTableSectionElement { - fn new_inherited(localName: DOMString, prefix: Option<DOMString>, document: &Document) + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLTableSectionElement { HTMLTableSectionElement { htmlelement: HTMLElement::new_inherited(localName, prefix, document), @@ -33,7 +33,7 @@ impl HTMLTableSectionElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, prefix: Option<DOMString>, document: &Document) + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLTableSectionElement> { let element = HTMLTableSectionElement::new_inherited(localName, prefix, document); Node::reflect_node(box element, document, HTMLTableSectionElementBinding::Wrap) @@ -61,7 +61,7 @@ impl HTMLTableSectionElementMethods for HTMLTableSectionElement { node.insert_cell_or_row( index, || self.Rows(), - || HTMLTableRowElement::new(DOMString::from("tr"), None, node.owner_doc().r())) + || HTMLTableRowElement::new(atom!("tr"), None, node.owner_doc().r())) } // https://html.spec.whatwg.org/multipage/#dom-tbody-deleterow diff --git a/components/script/dom/htmltemplateelement.rs b/components/script/dom/htmltemplateelement.rs index 77e7843d0e5..411a46b4b90 100644 --- a/components/script/dom/htmltemplateelement.rs +++ b/components/script/dom/htmltemplateelement.rs @@ -13,6 +13,7 @@ use dom::documentfragment::DocumentFragment; use dom::htmlelement::HTMLElement; use dom::node::{CloneChildrenFlag, Node, document_from_node}; use dom::virtualmethods::VirtualMethods; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -24,7 +25,7 @@ pub struct HTMLTemplateElement { } impl HTMLTemplateElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLTemplateElement { HTMLTemplateElement { @@ -35,7 +36,7 @@ impl HTMLTemplateElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLTemplateElement> { let element = HTMLTemplateElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmltextareaelement.rs b/components/script/dom/htmltextareaelement.rs index d4e1729f662..17155a44983 100644 --- a/components/script/dom/htmltextareaelement.rs +++ b/components/script/dom/htmltextareaelement.rs @@ -91,7 +91,7 @@ static DEFAULT_COLS: u32 = 20; static DEFAULT_ROWS: u32 = 2; impl HTMLTextAreaElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLTextAreaElement { let chan = document.window().constellation_chan(); @@ -99,7 +99,7 @@ impl HTMLTextAreaElement { htmlelement: HTMLElement::new_inherited_with_state(IN_ENABLED_STATE, localName, prefix, document), - textinput: DOMRefCell::new(TextInput::new(Lines::Multiple, DOMString::new(), chan)), + textinput: DOMRefCell::new(TextInput::new(Lines::Multiple, DOMString::new(), chan, None)), cols: Cell::new(DEFAULT_COLS), rows: Cell::new(DEFAULT_ROWS), value_changed: Cell::new(false), @@ -107,7 +107,7 @@ impl HTMLTextAreaElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLTextAreaElement> { let element = HTMLTextAreaElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmltimeelement.rs b/components/script/dom/htmltimeelement.rs index 93434c45685..cf261e691b7 100644 --- a/components/script/dom/htmltimeelement.rs +++ b/components/script/dom/htmltimeelement.rs @@ -7,6 +7,7 @@ use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; use dom::node::Node; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -15,14 +16,14 @@ pub struct HTMLTimeElement { } impl HTMLTimeElement { - fn new_inherited(localName: DOMString, prefix: Option<DOMString>, document: &Document) -> HTMLTimeElement { + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLTimeElement { HTMLTimeElement { htmlelement: HTMLElement::new_inherited(localName, prefix, document) } } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLTimeElement> { let element = HTMLTimeElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmltitleelement.rs b/components/script/dom/htmltitleelement.rs index 374074bda30..5a57a2f5cab 100644 --- a/components/script/dom/htmltitleelement.rs +++ b/components/script/dom/htmltitleelement.rs @@ -13,6 +13,7 @@ use dom::htmlelement::HTMLElement; use dom::node::{ChildrenMutation, Node}; use dom::text::Text; use dom::virtualmethods::VirtualMethods; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -21,14 +22,14 @@ pub struct HTMLTitleElement { } impl HTMLTitleElement { - fn new_inherited(localName: DOMString, prefix: Option<DOMString>, document: &Document) -> HTMLTitleElement { + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLTitleElement { HTMLTitleElement { htmlelement: HTMLElement::new_inherited(localName, prefix, document) } } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLTitleElement> { let element = HTMLTitleElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmltrackelement.rs b/components/script/dom/htmltrackelement.rs index 32522c18b8e..62e210e9b4e 100644 --- a/components/script/dom/htmltrackelement.rs +++ b/components/script/dom/htmltrackelement.rs @@ -7,6 +7,7 @@ use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; use dom::node::Node; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -15,14 +16,14 @@ pub struct HTMLTrackElement { } impl HTMLTrackElement { - fn new_inherited(localName: DOMString, prefix: Option<DOMString>, document: &Document) -> HTMLTrackElement { + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLTrackElement { HTMLTrackElement { htmlelement: HTMLElement::new_inherited(localName, prefix, document) } } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLTrackElement> { let element = HTMLTrackElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlulistelement.rs b/components/script/dom/htmlulistelement.rs index ccbeb9fe2b3..baf4830def4 100644 --- a/components/script/dom/htmlulistelement.rs +++ b/components/script/dom/htmlulistelement.rs @@ -7,6 +7,7 @@ use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; use dom::node::Node; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -15,14 +16,14 @@ pub struct HTMLUListElement { } impl HTMLUListElement { - fn new_inherited(localName: DOMString, prefix: Option<DOMString>, document: &Document) -> HTMLUListElement { + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLUListElement { HTMLUListElement { htmlelement: HTMLElement::new_inherited(localName, prefix, document) } } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLUListElement> { let element = HTMLUListElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlunknownelement.rs b/components/script/dom/htmlunknownelement.rs index e402048cc58..da2eab2fd88 100644 --- a/components/script/dom/htmlunknownelement.rs +++ b/components/script/dom/htmlunknownelement.rs @@ -7,6 +7,7 @@ use dom::bindings::js::Root; use dom::document::Document; use dom::htmlelement::HTMLElement; use dom::node::Node; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -15,7 +16,7 @@ pub struct HTMLUnknownElement { } impl HTMLUnknownElement { - fn new_inherited(localName: DOMString, + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLUnknownElement { HTMLUnknownElement { @@ -25,7 +26,7 @@ impl HTMLUnknownElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLUnknownElement> { let element = HTMLUnknownElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/htmlvideoelement.rs b/components/script/dom/htmlvideoelement.rs index 6ca2028161a..f2f2fb2b5db 100644 --- a/components/script/dom/htmlvideoelement.rs +++ b/components/script/dom/htmlvideoelement.rs @@ -7,6 +7,7 @@ use dom::bindings::js::Root; use dom::document::Document; use dom::htmlmediaelement::HTMLMediaElement; use dom::node::Node; +use string_cache::Atom; use util::str::DOMString; #[dom_struct] @@ -15,7 +16,7 @@ pub struct HTMLVideoElement { } impl HTMLVideoElement { - fn new_inherited(localName: DOMString, prefix: Option<DOMString>, document: &Document) -> HTMLVideoElement { + fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLVideoElement { HTMLVideoElement { htmlmediaelement: HTMLMediaElement::new_inherited(localName, prefix, document) @@ -23,7 +24,7 @@ impl HTMLVideoElement { } #[allow(unrooted_must_root)] - pub fn new(localName: DOMString, + pub fn new(localName: Atom, prefix: Option<DOMString>, document: &Document) -> Root<HTMLVideoElement> { let element = HTMLVideoElement::new_inherited(localName, prefix, document); diff --git a/components/script/dom/macros.rs b/components/script/dom/macros.rs index 166b52d82d5..99b4e484752 100644 --- a/components/script/dom/macros.rs +++ b/components/script/dom/macros.rs @@ -27,6 +27,42 @@ macro_rules! make_bool_getter( ); #[macro_export] +macro_rules! make_limited_int_setter( + ($attr:ident, $htmlname:tt, $default:expr) => ( + fn $attr(&self, value: i32) -> $crate::dom::bindings::error::ErrorResult { + use dom::bindings::inheritance::Castable; + use dom::element::Element; + + let value = if value < 0 { + return Err($crate::dom::bindings::error::Error::IndexSize); + } else { + value + }; + + let element = self.upcast::<Element>(); + element.set_int_attribute(&atom!($htmlname), value); + Ok(()) + } + ); +); + +#[macro_export] +macro_rules! make_int_getter( + ($attr:ident, $htmlname:tt, $default:expr) => ( + fn $attr(&self) -> i32 { + use dom::bindings::inheritance::Castable; + use dom::element::Element; + let element = self.upcast::<Element>(); + element.get_int_attribute(&atom!($htmlname), $default) + } + ); + + ($attr:ident, $htmlname:tt) => { + make_int_getter!($attr, $htmlname, 0); + }; +); + +#[macro_export] macro_rules! make_uint_getter( ($attr:ident, $htmlname:tt, $default:expr) => ( fn $attr(&self) -> u32 { diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index 1e08cac6083..30aa8e78eea 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -51,6 +51,7 @@ use js::jsapi::{JSContext, JSObject, JSRuntime}; use layout_interface::{LayoutChan, Msg}; use libc::{self, c_void, uintptr_t}; use parse::html::parse_html_fragment; +use ref_slice::ref_slice; use script_traits::UntrustedNodeAddress; use selectors::matching::matches; use selectors::parser::Selector; @@ -61,7 +62,6 @@ use std::cmp::max; use std::default::Default; use std::iter::{self, FilterMap, Peekable}; use std::mem; -use std::slice::ref_slice; use std::sync::Arc; use string_cache::{Atom, Namespace, QualName}; use style::properties::ComputedValues; diff --git a/components/script/dom/webidls/Document.webidl b/components/script/dom/webidls/Document.webidl index 69cb136749f..10199205537 100644 --- a/components/script/dom/webidls/Document.webidl +++ b/components/script/dom/webidls/Document.webidl @@ -79,7 +79,7 @@ enum DocumentReadyState { "loading", "interactive", "complete" }; // [OverrideBuiltins] partial /*sealed*/ interface Document { // resource metadata management - // [PutForwards=href, Unforgeable] + [/*PutForwards=href, */Unforgeable] readonly attribute Location/*?*/ location; readonly attribute DOMString domain; // readonly attribute DOMString referrer; diff --git a/components/script/dom/webidls/HTMLInputElement.webidl b/components/script/dom/webidls/HTMLInputElement.webidl index a5472818afe..274a10ce957 100644 --- a/components/script/dom/webidls/HTMLInputElement.webidl +++ b/components/script/dom/webidls/HTMLInputElement.webidl @@ -25,7 +25,8 @@ interface HTMLInputElement : HTMLElement { // attribute DOMString inputMode; //readonly attribute HTMLElement? list; // attribute DOMString max; - // attribute long maxLength; + [SetterThrows] + attribute long maxLength; // attribute DOMString min; // attribute long minLength; // attribute boolean multiple; diff --git a/components/script/dom/webidls/Location.webidl b/components/script/dom/webidls/Location.webidl index f82031ac74b..8af05fbd178 100644 --- a/components/script/dom/webidls/Location.webidl +++ b/components/script/dom/webidls/Location.webidl @@ -4,7 +4,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ // https://html.spec.whatwg.org/multipage/#location -/*[Unforgeable]*/ interface Location { +[Unforgeable] interface Location { /*stringifier*/ attribute USVString href; // attribute USVString origin; attribute USVString protocol; diff --git a/components/script/dom/webidls/Window.webidl b/components/script/dom/webidls/Window.webidl index 82a2f3fd34f..21ac6bf31a8 100644 --- a/components/script/dom/webidls/Window.webidl +++ b/components/script/dom/webidls/Window.webidl @@ -11,9 +11,9 @@ //[Replaceable] readonly attribute WindowProxy self; readonly attribute Window window; [BinaryName="Self_"] readonly attribute Window self; - /*[Unforgeable]*/ readonly attribute Document document; + [Unforgeable] readonly attribute Document document; // attribute DOMString name; - /*[PutForwards=href, Unforgeable]*/ readonly attribute Location location; + [/*PutForwards=href, */Unforgeable] readonly attribute Location location; //readonly attribute History history; //[Replaceable] readonly attribute BarProp locationbar; //[Replaceable] readonly attribute BarProp menubar; diff --git a/components/script/dom/websocket.rs b/components/script/dom/websocket.rs index f2060566877..d75662c157e 100644 --- a/components/script/dom/websocket.rs +++ b/components/script/dom/websocket.rs @@ -27,12 +27,13 @@ use js::jsapi::{JS_GetArrayBufferData, JS_NewArrayBuffer}; use js::jsval::UndefinedValue; use libc::{uint32_t, uint8_t}; use net_traits::hosts::replace_hosts; +use ref_slice::ref_slice; use script_task::ScriptTaskEventCategory::WebSocketEvent; use script_task::{CommonScriptMsg, Runnable}; use std::borrow::ToOwned; use std::cell::Cell; +use std::ptr; use std::sync::{Arc, Mutex}; -use std::{ptr, slice}; use util::str::DOMString; use util::task::spawn_named; use websocket::client::receiver::Receiver; @@ -126,6 +127,24 @@ const BLOCKED_PORTS_LIST: &'static [u16] = &[ 6000, // x11 ]; +// Close codes defined in https://tools.ietf.org/html/rfc6455#section-7.4.1 +// Names are from https://github.com/mozilla/gecko-dev/blob/master/netwerk/protocol/websocket/nsIWebSocketChannel.idl +#[allow(dead_code)] +mod close_code { + pub const NORMAL: u16 = 1000; + pub const GOING_AWAY: u16 = 1001; + pub const PROTOCOL_ERROR: u16 = 1002; + pub const UNSUPPORTED_DATATYPE: u16 = 1003; + pub const NO_STATUS: u16 = 1005; + pub const ABNORMAL: u16 = 1006; + pub const INVALID_PAYLOAD: u16 = 1007; + pub const POLICY_VIOLATION: u16 = 1008; + pub const TOO_LARGE: u16 = 1009; + pub const EXTENSION_MISSING: u16 = 1010; + pub const INTERNAL_ERROR: u16 = 1011; + pub const TLS_FAILED: u16 = 1015; +} + #[dom_struct] pub struct WebSocket { eventtarget: EventTarget, @@ -212,7 +231,7 @@ impl WebSocket { // Step 4. let protocols: &[DOMString] = protocols .as_ref() - .map_or(&[], |ref string| slice::ref_slice(string)); + .map_or(&[], |ref string| ref_slice(string)); // Step 5. for (i, protocol) in protocols.iter().enumerate() { @@ -430,8 +449,8 @@ impl WebSocketMethods for WebSocket { if let Some(code) = code { - //Check code is NOT 1000 NOR in the range of 3000-4999 (inclusive) - if code != 1000 && (code < 3000 || code > 4999) { + //Fail if the supplied code isn't normal and isn't reserved for libraries, frameworks, and applications + if code != close_code::NORMAL && (code < 3000 || code > 4999) { return Err(Error::InvalidAccess); } } @@ -454,9 +473,7 @@ impl WebSocketMethods for WebSocket { WebSocketRequestState::Open => { //Closing handshake not started - still in open //Start the closing by setting the code and reason if they exist - if let Some(code) = code { - self.code.set(code); - } + self.code.set(code.unwrap_or(close_code::NO_STATUS)); if let Some(reason) = reason { *self.reason.borrow_mut() = reason.0; } diff --git a/components/script/dom/xmldocument.rs b/components/script/dom/xmldocument.rs index 0553760ca6c..6f73ecbf8ea 100644 --- a/components/script/dom/xmldocument.rs +++ b/components/script/dom/xmldocument.rs @@ -12,6 +12,7 @@ use dom::bindings::inheritance::Castable; use dom::bindings::js::{Root, RootedReference}; use dom::bindings::reflector::{Reflectable, reflect_dom_object}; use dom::document::{Document, DocumentSource, IsHTMLDocument}; +use dom::location::Location; use dom::node::Node; use dom::window::Window; use js::jsapi::{JSContext, JSObject}; @@ -85,6 +86,11 @@ impl XMLDocument { } impl XMLDocumentMethods for XMLDocument { + // https://html.spec.whatwg.org/multipage/#dom-document-location + fn Location(&self) -> Root<Location> { + self.document.Location() + } + // https://html.spec.whatwg.org/multipage/#dom-tree-accessors:supported-property-names fn SupportedPropertyNames(&self) -> Vec<DOMString> { self.document.SupportedPropertyNames() diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index 24a93225d2b..24bd012f105 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -995,20 +995,9 @@ impl XMLHttpRequest { } } - //FIXME: add support for override_mime_type and override_charset + //FIXME: add support for XML encoding guess stuff using XML spec fn text_response(&self) -> String { - let mut encoding = UTF_8 as EncodingRef; - match self.response_headers.borrow().get() { - Some(&ContentType(mime::Mime(_, _, ref params))) => { - for &(ref name, ref value) in params { - if name == &mime::Attr::Charset { - encoding = encoding_from_whatwg_label(&value.to_string()).unwrap_or(encoding); - } - } - }, - None => {} - } - + let encoding = self.final_charset().unwrap_or(UTF_8); // According to Simon, decode() should never return an error, so unwrap()ing // the result should be fine. XXXManishearth have a closer look at this later @@ -1102,6 +1091,34 @@ impl XMLHttpRequest { } Ok(()) } + + fn final_charset(&self) -> Option<EncodingRef> { + if self.override_charset.borrow().is_some() { + self.override_charset.borrow().clone() + } else { + match self.response_headers.borrow().get() { + Some(&ContentType(ref mime)) => { + let value = mime.get_param(mime::Attr::Charset); + value.and_then(|value|{ + encoding_from_whatwg_label(value) + }) + } + None => { None } + } + } + } + + #[allow(dead_code)] + fn final_mime_type(&self) -> Option<Mime> { + if self.override_mime_type.borrow().is_some() { + self.override_mime_type.borrow().clone() + } else { + match self.response_headers.borrow().get() { + Some(&ContentType(ref mime)) => { Some(mime.clone()) }, + None => { None } + } + } + } } trait Extractable { |