summaryrefslogtreecommitdiffstats
path: root/dom
diff options
context:
space:
mode:
Diffstat (limited to 'dom')
-rw-r--r--dom/base/CustomElementRegistry.cpp18
1 files changed, 13 insertions, 5 deletions
diff --git a/dom/base/CustomElementRegistry.cpp b/dom/base/CustomElementRegistry.cpp
index c52d2cc98..4a803b710 100644
--- a/dom/base/CustomElementRegistry.cpp
+++ b/dom/base/CustomElementRegistry.cpp
@@ -699,7 +699,6 @@ CustomElementRegistry::Define(const nsAString& aName,
* observedAttributesIterable to a sequence<DOMString>. Rethrow
* any exceptions from the conversion.
*/
- // TODO: Bug 1293921 - Implement connected/disconnected/adopted/attributeChanged lifecycle callbacks for custom elements
if (callbacksHolder->mAttributeChangedCallback.WasPassed()) {
// Enter constructor's compartment.
JSAutoCompartment ac(cx, constructor);
@@ -712,12 +711,22 @@ CustomElementRegistry::Define(const nsAString& aName,
}
if (!observedAttributesIterable.isUndefined()) {
+ if (!observedAttributesIterable.isObject()) {
+ aRv.ThrowTypeError<MSG_NOT_SEQUENCE>(NS_LITERAL_STRING("observedAttributes"));
+ return;
+ }
+
JS::ForOfIterator iter(cx);
- if (!iter.init(observedAttributesIterable)) {
+ if (!iter.init(observedAttributesIterable, JS::ForOfIterator::AllowNonIterable)) {
aRv.StealExceptionFromJSContext(cx);
return;
}
+ if (!iter.valueIsIterable()) {
+ aRv.ThrowTypeError<MSG_NOT_SEQUENCE>(NS_LITERAL_STRING("observedAttributes"));
+ return;
+ }
+
JS::Rooted<JS::Value> attribute(cx);
while (true) {
bool done;
@@ -729,9 +738,8 @@ CustomElementRegistry::Define(const nsAString& aName,
break;
}
- JSString *attrJSStr = attribute.toString();
- nsAutoJSString attrStr;
- if (!attrStr.init(cx, attrJSStr)) {
+ nsAutoString attrStr;
+ if (!ConvertJSValueToString(cx, attribute, eStringify, eStringify, attrStr)) {
aRv.StealExceptionFromJSContext(cx);
return;
}