aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/bindings/codegen/CodegenRust.py303
-rw-r--r--components/script/dom/bindings/codegen/Configuration.py10
-rw-r--r--components/script/dom/bindings/utils.rs8
-rw-r--r--components/script/dom/create.rs6
-rw-r--r--components/script/dom/domimplementation.rs8
-rw-r--r--components/script/dom/element.rs32
-rw-r--r--components/script/dom/htmlanchorelement.rs4
-rw-r--r--components/script/dom/htmlappletelement.rs4
-rw-r--r--components/script/dom/htmlareaelement.rs4
-rw-r--r--components/script/dom/htmlaudioelement.rs5
-rw-r--r--components/script/dom/htmlbaseelement.rs5
-rw-r--r--components/script/dom/htmlbodyelement.rs4
-rw-r--r--components/script/dom/htmlbrelement.rs5
-rw-r--r--components/script/dom/htmlbuttonelement.rs5
-rw-r--r--components/script/dom/htmlcanvaselement.rs4
-rw-r--r--components/script/dom/htmldataelement.rs5
-rw-r--r--components/script/dom/htmldatalistelement.rs5
-rw-r--r--components/script/dom/htmldialogelement.rs5
-rw-r--r--components/script/dom/htmldirectoryelement.rs5
-rw-r--r--components/script/dom/htmldivelement.rs5
-rw-r--r--components/script/dom/htmldlistelement.rs5
-rw-r--r--components/script/dom/htmlelement.rs6
-rw-r--r--components/script/dom/htmlembedelement.rs5
-rw-r--r--components/script/dom/htmlfieldsetelement.rs5
-rw-r--r--components/script/dom/htmlfontelement.rs4
-rw-r--r--components/script/dom/htmlformelement.rs4
-rw-r--r--components/script/dom/htmlframeelement.rs5
-rw-r--r--components/script/dom/htmlframesetelement.rs5
-rw-r--r--components/script/dom/htmlheadelement.rs5
-rw-r--r--components/script/dom/htmlheadingelement.rs5
-rw-r--r--components/script/dom/htmlhrelement.rs4
-rw-r--r--components/script/dom/htmlhtmlelement.rs5
-rw-r--r--components/script/dom/htmliframeelement.rs4
-rw-r--r--components/script/dom/htmlimageelement.rs6
-rw-r--r--components/script/dom/htmlinputelement.rs29
-rw-r--r--components/script/dom/htmllabelelement.rs4
-rw-r--r--components/script/dom/htmllegendelement.rs5
-rw-r--r--components/script/dom/htmllielement.rs5
-rw-r--r--components/script/dom/htmllinkelement.rs4
-rw-r--r--components/script/dom/htmlmapelement.rs5
-rw-r--r--components/script/dom/htmlmediaelement.rs3
-rw-r--r--components/script/dom/htmlmetaelement.rs5
-rw-r--r--components/script/dom/htmlmeterelement.rs5
-rw-r--r--components/script/dom/htmlmodelement.rs5
-rw-r--r--components/script/dom/htmlobjectelement.rs5
-rw-r--r--components/script/dom/htmlolistelement.rs5
-rw-r--r--components/script/dom/htmloptgroupelement.rs5
-rw-r--r--components/script/dom/htmloptionelement.rs5
-rw-r--r--components/script/dom/htmloutputelement.rs5
-rw-r--r--components/script/dom/htmlparagraphelement.rs5
-rw-r--r--components/script/dom/htmlparamelement.rs5
-rw-r--r--components/script/dom/htmlpreelement.rs5
-rw-r--r--components/script/dom/htmlprogresselement.rs5
-rw-r--r--components/script/dom/htmlquoteelement.rs5
-rw-r--r--components/script/dom/htmlscriptelement.rs5
-rw-r--r--components/script/dom/htmlselectelement.rs4
-rw-r--r--components/script/dom/htmlsourceelement.rs5
-rw-r--r--components/script/dom/htmlspanelement.rs5
-rw-r--r--components/script/dom/htmlstyleelement.rs5
-rw-r--r--components/script/dom/htmltablecaptionelement.rs5
-rw-r--r--components/script/dom/htmltablecellelement.rs2
-rw-r--r--components/script/dom/htmltablecolelement.rs5
-rw-r--r--components/script/dom/htmltabledatacellelement.rs5
-rw-r--r--components/script/dom/htmltableelement.rs8
-rw-r--r--components/script/dom/htmltableheadercellelement.rs5
-rw-r--r--components/script/dom/htmltablerowelement.rs6
-rw-r--r--components/script/dom/htmltablesectionelement.rs6
-rw-r--r--components/script/dom/htmltemplateelement.rs5
-rw-r--r--components/script/dom/htmltextareaelement.rs6
-rw-r--r--components/script/dom/htmltimeelement.rs5
-rw-r--r--components/script/dom/htmltitleelement.rs5
-rw-r--r--components/script/dom/htmltrackelement.rs5
-rw-r--r--components/script/dom/htmlulistelement.rs5
-rw-r--r--components/script/dom/htmlunknownelement.rs5
-rw-r--r--components/script/dom/htmlvideoelement.rs5
-rw-r--r--components/script/dom/macros.rs36
-rw-r--r--components/script/dom/node.rs2
-rw-r--r--components/script/dom/webidls/Document.webidl2
-rw-r--r--components/script/dom/webidls/HTMLInputElement.webidl3
-rw-r--r--components/script/dom/webidls/Location.webidl2
-rw-r--r--components/script/dom/webidls/Window.webidl4
-rw-r--r--components/script/dom/websocket.rs31
-rw-r--r--components/script/dom/xmldocument.rs6
-rw-r--r--components/script/dom/xmlhttprequest.rs43
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 {