summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGaming4JC <g4jc@hyperbola.info>2020-01-05 18:38:55 -0500
committerGaming4JC <g4jc@hyperbola.info>2020-01-26 15:50:31 -0500
commit4dda3f6039c4432a3545986ebc698a725c6c057c (patch)
tree491c34302e208c1cf52604949fa85eaf828d8bc6
parent6ec385fbdb2523fb2876055a054ba1cdf6916784 (diff)
downloaduxp-4dda3f6039c4432a3545986ebc698a725c6c057c.tar.gz
Bug 1406297 - Fix Document.createElement must report an exception.
Tag UXP Issue #1344
-rw-r--r--dom/base/CustomElementRegistry.cpp4
-rw-r--r--dom/html/nsHTMLContentSink.cpp18
2 files changed, 13 insertions, 9 deletions
diff --git a/dom/base/CustomElementRegistry.cpp b/dom/base/CustomElementRegistry.cpp
index bad100cf59..7fd295201d 100644
--- a/dom/base/CustomElementRegistry.cpp
+++ b/dom/base/CustomElementRegistry.cpp
@@ -111,13 +111,11 @@ CustomElementConstructor::Construct(const char* aExecutionReason,
JS::Rooted<JSObject*> result(cx);
JS::Rooted<JS::Value> constructor(cx, JS::ObjectValue(*mCallback));
if (!JS::Construct(cx, constructor, JS::HandleValueArray::empty(), &result)) {
- aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
return nullptr;
}
RefPtr<Element> element;
if (NS_FAILED(UNWRAP_OBJECT(Element, &result, element))) {
- aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
return nullptr;
}
@@ -894,7 +892,7 @@ DoUpgrade(Element* aElement,
return;
}
- if (constructResult.get() != aElement) {
+ if (!constructResult || constructResult.get() != aElement) {
aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
return;
}
diff --git a/dom/html/nsHTMLContentSink.cpp b/dom/html/nsHTMLContentSink.cpp
index ef160cf21a..87ae2a4ac5 100644
--- a/dom/html/nsHTMLContentSink.cpp
+++ b/dom/html/nsHTMLContentSink.cpp
@@ -233,18 +233,23 @@ public:
};
static void
-DoCustomElementCreate(Element** aElement, nsIDocument* aDoc,
+DoCustomElementCreate(Element** aElement, nsIDocument* aDoc, nsIAtom* aLocalName,
CustomElementConstructor* aConstructor, ErrorResult& aRv)
{
RefPtr<Element> element =
aConstructor->Construct("Custom Element Create", aRv);
- if (aRv.Failed() || !element->IsHTMLElement()) {
+ if (aRv.Failed()) {
+ return;
+ }
+
+ if (!element || !element->IsHTMLElement()) {
aRv.ThrowTypeError<MSG_THIS_DOES_NOT_IMPLEMENT_INTERFACE>(NS_LITERAL_STRING("HTMLElement"));
return;
}
if (aDoc != element->OwnerDoc() || element->GetParentNode() ||
- element->HasChildren() || element->GetAttrCount()) {
+ element->HasChildren() || element->GetAttrCount() ||
+ element->NodeInfo()->NameAtom() != aLocalName) {
aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
return;
}
@@ -320,19 +325,20 @@ NS_NewHTMLElement(Element** aResult, already_AddRefed<mozilla::dom::NodeInfo>&&
(*aResult)->SetCustomElementData(new CustomElementData(typeAtom));
if (synchronousCustomElements) {
CustomElementRegistry::Upgrade(*aResult, definition, rv);
+ if (rv.MaybeSetPendingException(cx)) {
+ aes.ReportException();
+ }
} else {
nsContentUtils::EnqueueUpgradeReaction(*aResult, definition);
}
- if (rv.MaybeSetPendingException(cx)) {
- aes.ReportException();
- }
return NS_OK;
}
// Step 6.1.
if (synchronousCustomElements) {
DoCustomElementCreate(aResult, nodeInfo->GetDocument(),
+ nodeInfo->NameAtom(),
definition->mConstructor, rv);
if (rv.MaybeSetPendingException(cx)) {
NS_IF_ADDREF(*aResult = NS_NewHTMLUnknownElement(nodeInfo.forget(), aFromParser));