Browse Source

Issue #618 - Clear the module map when changing a Document's global and add

release build assertions for mismatching compartments.
pull/24/head
Moonchild 2 years ago committed by roytam1
parent
commit
ef11a4d7e8
  1. 3
      dom/html/nsHTMLDocument.cpp
  2. 5
      dom/script/ScriptLoader.cpp
  3. 6
      dom/script/ScriptLoader.h
  4. 6
      js/src/jsapi.cpp

3
dom/html/nsHTMLDocument.cpp

@ -1471,6 +1471,9 @@ nsHTMLDocument::Open(JSContext* cx,
// document again otherwise the document could have a non-zero onload block
// count without the onload blocker request being in the loadgroup.
EnsureOnloadBlocker();
// Throw away loaded modules created for the previous global.
ScriptLoader()->ClearModuleMap();
}
// Step 8 - Clear all event listeners out of our DOM tree

5
dom/script/ScriptLoader.cpp

@ -477,6 +477,11 @@ ScriptLoader::GetFetchedModule(nsIURI* aURL) const
return ms;
}
void ScriptLoader::ClearModuleMap() {
MOZ_ASSERT(mFetchingModules.IsEmpty());
mFetchedModules.Clear();
}
nsresult
ScriptLoader::ProcessFetchedModuleSource(ModuleLoadRequest* aRequest)
{

6
dom/script/ScriptLoader.h

@ -506,6 +506,12 @@ public:
return mPendingChildLoaders.AppendElement(aChild) != nullptr;
}
/*
* Clear the map of loaded modules. Called when a Document object is reused
* for a different global.
*/
void ClearModuleMap();
private:
virtual ~ScriptLoader();

6
js/src/jsapi.cpp

@ -4708,7 +4708,7 @@ JS::ModuleInstantiate(JSContext* cx, JS::HandleObject moduleArg)
{
AssertHeapIsIdle(cx);
CHECK_REQUEST(cx);
assertSameCompartment(cx, moduleArg);
releaseAssertSameCompartment(cx, moduleArg);
return ModuleObject::Instantiate(cx, moduleArg.as<ModuleObject>());
}
@ -4717,7 +4717,7 @@ JS::ModuleEvaluate(JSContext* cx, JS::HandleObject moduleArg)
{
AssertHeapIsIdle(cx);
CHECK_REQUEST(cx);
assertSameCompartment(cx, moduleArg);
releaseAssertSameCompartment(cx, moduleArg);
return ModuleObject::Evaluate(cx, moduleArg.as<ModuleObject>());
}
@ -6204,7 +6204,7 @@ JS_SetPendingException(JSContext* cx, HandleValue value)
{
AssertHeapIsIdle(cx);
CHECK_REQUEST(cx);
assertSameCompartment(cx, value);
releaseAssertSameCompartment(cx, value);
cx->setPendingException(value);
}

Loading…
Cancel
Save