diff options
-rw-r--r-- | components/script/dom/bindings/codegen/CodegenRust.py | 15 | ||||
-rw-r--r-- | components/script/dom/bindings/codegen/Configuration.py | 3 | ||||
-rw-r--r-- | components/script/dom/bindings/proxyhandler.rs | 7 | ||||
-rw-r--r-- | components/script/dom/domstringmap.rs | 66 | ||||
-rw-r--r-- | components/script/dom/webidls/DOMStringMap.webidl | 12 | ||||
-rw-r--r-- | components/script/lib.rs | 1 | ||||
-rw-r--r-- | tests/content/test_interfaces.html | 1 | ||||
-rw-r--r-- | tests/wpt/metadata/html/dom/interfaces.html.ini | 9 |
8 files changed, 91 insertions, 23 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index 6d82dedb510..72bc0f4fdb4 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -2091,7 +2091,7 @@ class CGDefineProxyHandler(CGAbstractMethod): let traps = ProxyTraps { getPropertyDescriptor: Some(getPropertyDescriptor), getOwnPropertyDescriptor: Some(getOwnPropertyDescriptor), - defineProperty: Some(defineProperty), + defineProperty: Some(defineProperty_), getOwnPropertyNames: ptr::null(), delete_: Some(delete_), enumerate: ptr::null(), @@ -3506,7 +3506,8 @@ class CGProxySpecialOperation(CGPerSignatureCall): # arguments[0] is the index or name of the item that we're setting. argument = arguments[1] template, _, declType, needsRooting = getJSToNativeConversionTemplate( - argument.type, descriptor, treatNullAs=argument.treatNullAs) + argument.type, descriptor, treatNullAs=argument.treatNullAs, + exceptionCode="return false;") templateValues = { "val": "(*desc).value", } @@ -4033,7 +4034,8 @@ class CGInterfaceTrait(CGThing): def members(): for m in descriptor.interface.members: - if m.isMethod() and not m.isStatic(): + if m.isMethod() and not m.isStatic() \ + and not m.isIdentifierLess(): name = CGSpecializedMethod.makeNativeName(descriptor, m) infallible = 'infallible' in descriptor.getExtendedAttributes(m) for idx, (rettype, arguments) in enumerate(m.signatures()): @@ -4064,7 +4066,10 @@ class CGInterfaceTrait(CGThing): rettype, arguments = operation.signatures()[0] infallible = 'infallible' in descriptor.getExtendedAttributes(operation) - arguments = method_arguments(rettype, arguments, ("found", "&mut bool")) + if operation.isGetter(): + arguments = method_arguments(rettype, arguments, ("found", "&mut bool")) + else: + arguments = method_arguments(rettype, arguments) rettype = return_type(rettype, infallible) yield name, arguments, rettype @@ -4551,7 +4556,7 @@ class CGBindingRoot(CGThing): 'dom::bindings::error::throw_dom_exception', 'dom::bindings::error::throw_type_error', 'dom::bindings::proxyhandler', - 'dom::bindings::proxyhandler::{_obj_toString, defineProperty}', + 'dom::bindings::proxyhandler::{_obj_toString, defineProperty_}', 'dom::bindings::proxyhandler::{FillPropertyDescriptor, GetExpandoObject}', 'dom::bindings::proxyhandler::{delete_, getPropertyDescriptor}', 'dom::bindings::str::ByteString', diff --git a/components/script/dom/bindings/codegen/Configuration.py b/components/script/dom/bindings/codegen/Configuration.py index e76719b3edf..be3ff10ab68 100644 --- a/components/script/dom/bindings/codegen/Configuration.py +++ b/components/script/dom/bindings/codegen/Configuration.py @@ -208,9 +208,6 @@ class Descriptor(DescriptorProvider): addIndexedOrNamedOperation('Creator', m) if m.isDeleter(): addIndexedOrNamedOperation('Deleter', m) - raise TypeError("deleter specified on %s but we " - "don't support deleters yet" % - self.interface.identifier.name) iface.setUserData('hasConcreteDescendant', True) iface = iface.parent diff --git a/components/script/dom/bindings/proxyhandler.rs b/components/script/dom/bindings/proxyhandler.rs index 3c26206c373..3321c1f617f 100644 --- a/components/script/dom/bindings/proxyhandler.rs +++ b/components/script/dom/bindings/proxyhandler.rs @@ -48,7 +48,7 @@ pub unsafe extern fn getPropertyDescriptor(cx: *mut JSContext, proxy: *mut JSObj JS_GetPropertyDescriptorById(cx, proto, id, JSRESOLVE_QUALIFIED, desc) != 0 } -pub unsafe fn defineProperty_(cx: *mut JSContext, proxy: *mut JSObject, id: jsid, +pub unsafe extern fn defineProperty_(cx: *mut JSContext, proxy: *mut JSObject, id: jsid, desc: *mut JSPropertyDescriptor) -> bool { static JSMSG_GETTER_ONLY: libc::c_uint = 160; @@ -72,11 +72,6 @@ pub unsafe fn defineProperty_(cx: *mut JSContext, proxy: *mut JSObject, id: jsid (*desc).setter, (*desc).attrs) != 0; } -pub unsafe extern fn defineProperty(cx: *mut JSContext, proxy: *mut JSObject, id: jsid, - desc: *mut JSPropertyDescriptor) -> bool { - defineProperty_(cx, proxy, id, desc) -} - pub unsafe extern fn delete_(cx: *mut JSContext, proxy: *mut JSObject, id: jsid, bp: *mut bool) -> bool { let expando = EnsureExpandoObject(cx, proxy); diff --git a/components/script/dom/domstringmap.rs b/components/script/dom/domstringmap.rs new file mode 100644 index 00000000000..630b33f6a6b --- /dev/null +++ b/components/script/dom/domstringmap.rs @@ -0,0 +1,66 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use dom::bindings::cell::DOMRefCell; +use dom::bindings::codegen::Bindings::DOMStringMapBinding; +use dom::bindings::codegen::Bindings::DOMStringMapBinding::DOMStringMapMethods; +use dom::bindings::global::GlobalRef; +use dom::bindings::js::{JSRef, Temporary}; +use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; +use servo_util::str::DOMString; + +use std::collections::hashmap::HashMap; + +#[dom_struct] +pub struct DOMStringMap { + map: DOMRefCell<HashMap<DOMString, DOMString>>, + reflector_: Reflector, +} + +impl DOMStringMap { + fn new_inherited() -> DOMStringMap { + DOMStringMap { + map: DOMRefCell::new(HashMap::new()), + reflector_: Reflector::new(), + } + } + + pub fn new(global: &GlobalRef) -> Temporary<DOMStringMap> { + reflect_dom_object(box DOMStringMap::new_inherited(), + global, DOMStringMapBinding::Wrap) + } +} + +impl<'a> DOMStringMapMethods for JSRef<'a, DOMStringMap> { + fn NamedCreator(self, name: DOMString, value: DOMString) { + self.map.borrow_mut().insert(name, value); + } + + fn NamedDeleter(self, name: DOMString) { + self.map.borrow_mut().remove(&name); + } + + fn NamedSetter(self, name: DOMString, value: DOMString) { + self.map.borrow_mut().insert(name, value); + } + + fn NamedGetter(self, name: DOMString, found: &mut bool) -> DOMString { + match self.map.borrow().find(&name) { + Some(value) => { + *found = true; + value.clone() + }, + None => { + *found = false; + String::new() + } + } + } +} + +impl Reflectable for DOMStringMap { + fn reflector<'a>(&'a self) -> &'a Reflector { + &self.reflector_ + } +} diff --git a/components/script/dom/webidls/DOMStringMap.webidl b/components/script/dom/webidls/DOMStringMap.webidl new file mode 100644 index 00000000000..aa4d3ed9673 --- /dev/null +++ b/components/script/dom/webidls/DOMStringMap.webidl @@ -0,0 +1,12 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// https://html.spec.whatwg.org/#the-domstringmap-interface +[OverrideBuiltins] +interface DOMStringMap { + getter DOMString (DOMString name); + setter creator void (DOMString name, DOMString value); + deleter void (DOMString name); +}; diff --git a/components/script/lib.rs b/components/script/lib.rs index e93ddd9dc29..64fd584c757 100644 --- a/components/script/lib.rs +++ b/components/script/lib.rs @@ -89,6 +89,7 @@ pub mod dom { pub mod characterdata; pub mod domrect; pub mod domrectlist; + pub mod domstringmap; pub mod comment; pub mod console; mod create; diff --git a/tests/content/test_interfaces.html b/tests/content/test_interfaces.html index 825356e7d39..5d544ebeaca 100644 --- a/tests/content/test_interfaces.html +++ b/tests/content/test_interfaces.html @@ -67,6 +67,7 @@ var interfaceNamesInGlobalScope = [ "DOMImplementation", "DOMParser", "DOMTokenList", + "DOMStringMap", "Element", "Event", "EventTarget", diff --git a/tests/wpt/metadata/html/dom/interfaces.html.ini b/tests/wpt/metadata/html/dom/interfaces.html.ini index a2367497351..ab044ab945f 100644 --- a/tests/wpt/metadata/html/dom/interfaces.html.ini +++ b/tests/wpt/metadata/html/dom/interfaces.html.ini @@ -1692,18 +1692,9 @@ [PropertyNodeList interface: operation getValues()] expected: FAIL - [DOMStringMap interface: existence and properties of interface object] - expected: FAIL - [DOMStringMap interface object length] expected: FAIL - [DOMStringMap interface: existence and properties of interface prototype object] - expected: FAIL - - [DOMStringMap interface: existence and properties of interface prototype object\'s "constructor" property] - expected: FAIL - [DOMStringMap must be primary interface of document.head.dataset] expected: FAIL |