diff --git a/dom/base/ScriptSettings.cpp b/dom/base/ScriptSettings.cpp index 0050a124174e..7f863469e0a4 100644 --- a/dom/base/ScriptSettings.cpp +++ b/dom/base/ScriptSettings.cpp @@ -94,6 +94,8 @@ void DestroyScriptSettings() AutoEntryScript::AutoEntryScript(nsIGlobalObject* aGlobalObject, bool aIsMainThread, JSContext* aCx) + : mStack(ScriptSettingsStack::Ref()) + , mEntry(aGlobalObject, /* aCandidate = */ true) { MOZ_ASSERT(aGlobalObject); if (!aCx) { @@ -114,18 +116,40 @@ AutoEntryScript::AutoEntryScript(nsIGlobalObject* aGlobalObject, mCxPusher.Push(aCx); } mAc.construct(aCx, aGlobalObject->GetGlobalJSObject()); + mStack.Push(&mEntry); +} + +AutoEntryScript::~AutoEntryScript() +{ + MOZ_ASSERT(mStack.Incumbent() == mEntry.mGlobalObject); + mStack.Pop(); } AutoIncumbentScript::AutoIncumbentScript(nsIGlobalObject* aGlobalObject) + : mStack(ScriptSettingsStack::Ref()) + , mEntry(aGlobalObject, /* aCandidate = */ false) { - MOZ_ASSERT(aGlobalObject); + mStack.Push(&mEntry); +} + +AutoIncumbentScript::~AutoIncumbentScript() +{ + MOZ_ASSERT(mStack.Incumbent() == mEntry.mGlobalObject); + mStack.Pop(); } AutoSystemCaller::AutoSystemCaller(bool aIsMainThread) + : mStack(ScriptSettingsStack::Ref()) { if (aIsMainThread) { mCxPusher.PushNull(); } + mStack.PushSystem(); +} + +AutoSystemCaller::~AutoSystemCaller() +{ + mStack.Pop(); } } // namespace dom diff --git a/dom/base/ScriptSettings.h b/dom/base/ScriptSettings.h index e5a25426a764..632485959c9b 100644 --- a/dom/base/ScriptSettings.h +++ b/dom/base/ScriptSettings.h @@ -27,6 +27,7 @@ namespace dom { void InitScriptSettings(); void DestroyScriptSettings(); +class ScriptSettingsStack; struct ScriptSettingsStackEntry { nsCOMPtr mGlobalObject; bool mIsCandidateEntryPoint; @@ -65,8 +66,11 @@ public: bool aIsMainThread = NS_IsMainThread(), // Note: aCx is mandatory off-main-thread. JSContext* aCx = nullptr); + ~AutoEntryScript(); private: + dom::ScriptSettingsStack& mStack; + dom::ScriptSettingsStackEntry mEntry; nsCxPusher mCxPusher; mozilla::Maybe mAc; // This can de-Maybe-fy when mCxPusher // goes away. @@ -78,6 +82,10 @@ private: class AutoIncumbentScript { public: AutoIncumbentScript(nsIGlobalObject* aGlobalObject); + ~AutoIncumbentScript(); +private: + dom::ScriptSettingsStack& mStack; + dom::ScriptSettingsStackEntry mEntry; }; /* @@ -88,7 +96,9 @@ public: class AutoSystemCaller { public: AutoSystemCaller(bool aIsMainThread = NS_IsMainThread()); + ~AutoSystemCaller(); private: + dom::ScriptSettingsStack& mStack; nsCxPusher mCxPusher; };