summaryrefslogtreecommitdiff
path: root/dom
diff options
context:
space:
mode:
authorGaming4JC <g4jc@hyperbola.info>2020-01-20 20:14:59 -0500
committerGaming4JC <g4jc@hyperbola.info>2020-01-26 15:50:48 -0500
commit8d456c7508882933502dd435a4ae91ee0b5c82c1 (patch)
treedd1ef38691c25a80787dfcdca06038a7fac18c7e /dom
parentc99209cfd7d2ae15e2579910a45242958d8ca5ed (diff)
downloaduxp-8d456c7508882933502dd435a4ae91ee0b5c82c1.tar.gz
Bug 1415761 - Catch the exception and rethrow it after invoking custom elements reactions;
The spec was unclear on how CEReactions interact with thrown exceptions; see https://github.com/whatwg/html/issues/3217. The spec is now being clarified in https://github.com/whatwg/html/pull/3235. Tag UXP Issue mcp-graveyard/UXP#1344
Diffstat (limited to 'dom')
-rw-r--r--dom/base/CustomElementRegistry.h13
-rw-r--r--dom/base/nsDocument.cpp3
-rw-r--r--dom/bindings/Codegen.py2
3 files changed, 14 insertions, 4 deletions
diff --git a/dom/base/CustomElementRegistry.h b/dom/base/CustomElementRegistry.h
index c180a10af3..51c97fd5e2 100644
--- a/dom/base/CustomElementRegistry.h
+++ b/dom/base/CustomElementRegistry.h
@@ -472,15 +472,24 @@ public:
class MOZ_RAII AutoCEReaction final {
public:
- explicit AutoCEReaction(CustomElementReactionsStack* aReactionsStack)
- : mReactionsStack(aReactionsStack) {
+ // JSContext is allowed to be a nullptr if we are guaranteeing that we're
+ // not doing something that might throw but not finish reporting a JS
+ // exception during the lifetime of the AutoCEReaction.
+ AutoCEReaction(CustomElementReactionsStack* aReactionsStack, JSContext* aCx)
+ : mReactionsStack(aReactionsStack)
+ , mCx(aCx) {
mReactionsStack->CreateAndPushElementQueue();
}
~AutoCEReaction() {
+ Maybe<JS::AutoSaveExceptionState> ases;
+ if (mCx) {
+ ases.emplace(mCx);
+ }
mReactionsStack->PopAndInvokeElementQueue();
}
private:
RefPtr<CustomElementReactionsStack> mReactionsStack;
+ JSContext* mCx;
};
} // namespace dom
diff --git a/dom/base/nsDocument.cpp b/dom/base/nsDocument.cpp
index 9043e409ae..f3e4925893 100644
--- a/dom/base/nsDocument.cpp
+++ b/dom/base/nsDocument.cpp
@@ -5809,7 +5809,8 @@ nsDocument::RegisterElement(JSContext* aCx, const nsAString& aType,
return;
}
- AutoCEReaction ceReaction(this->GetDocGroup()->CustomElementReactionsStack());
+ AutoCEReaction ceReaction(this->GetDocGroup()->CustomElementReactionsStack(),
+ aCx);
// Unconditionally convert TYPE to lowercase.
nsAutoString lcType;
nsContentUtils::ASCIIToLower(aType, lcType);
diff --git a/dom/bindings/Codegen.py b/dom/bindings/Codegen.py
index 730465fee7..8ee732cca3 100644
--- a/dom/bindings/Codegen.py
+++ b/dom/bindings/Codegen.py
@@ -7679,7 +7679,7 @@ class CGPerSignatureCall(CGThing):
CustomElementReactionsStack* reactionsStack = GetCustomElementReactionsStack(${obj});
Maybe<AutoCEReaction> ceReaction;
if (reactionsStack) {
- ceReaction.emplace(reactionsStack);
+ ceReaction.emplace(reactionsStack, cx);
}
""", obj=objectName)))