diff options
author | Brian Smith <brian@dbsoft.org> | 2023-04-21 17:55:33 -0500 |
---|---|---|
committer | Brian Smith <brian@dbsoft.org> | 2023-04-27 13:35:01 -0500 |
commit | 30a6828f475a76f88c292b8b3fd0163839db5b29 (patch) | |
tree | 525045fbce02c54b3d0cf3efe9e4290b81cbc6b4 | |
parent | 914299b8ba22bb40fc30f83fe5481ebf4598ab48 (diff) | |
download | uxp-30a6828f475a76f88c292b8b3fd0163839db5b29.tar.gz |
Issue #1691 - Part 9: Make import() work when the active script is in another document.
https://bugzilla.mozilla.org/show_bug.cgi?id=1342012
Associate event handler with active script when they are compiled.
(cherry picked from commit 1a3cc5d6828a05a6309d959fad3c7e959ab9eb8d)
-rw-r--r-- | dom/events/EventListenerManager.cpp | 11 | ||||
-rw-r--r-- | dom/script/ModuleScript.cpp | 2 | ||||
-rw-r--r-- | dom/script/ScriptLoader.cpp | 8 |
3 files changed, 17 insertions, 4 deletions
diff --git a/dom/events/EventListenerManager.cpp b/dom/events/EventListenerManager.cpp index af268f24bb..058e6916b5 100644 --- a/dom/events/EventListenerManager.cpp +++ b/dom/events/EventListenerManager.cpp @@ -22,6 +22,8 @@ #include "mozilla/dom/Element.h" #include "mozilla/dom/Event.h" #include "mozilla/dom/EventTargetBinding.h" +#include "mozilla/dom/ModuleScript.h" +#include "mozilla/dom/ScriptLoader.h" #include "mozilla/dom/TouchEvent.h" #include "mozilla/TimelineConsumers.h" #include "mozilla/EventTimelineMarker.h" @@ -1018,6 +1020,15 @@ EventListenerManager::CompileEventHandlerInternal(Listener* aListener, NS_ENSURE_SUCCESS(result, result); NS_ENSURE_TRUE(handler, NS_ERROR_FAILURE); + JS::Rooted<JSFunction*> func(cx, JS_GetObjectFunction(handler)); + MOZ_ASSERT(func); + JS::Rooted<JSScript*> jsScript(cx, JS_GetFunctionScript(cx, func)); + MOZ_ASSERT(jsScript); + RefPtr<LoadedScript> loaderScript = ScriptLoader::GetActiveScript(cx); + if (loaderScript) { + loaderScript->AssociateWithScript(jsScript); + } + if (jsEventHandler->EventName() == nsGkAtoms::onerror && win) { RefPtr<OnErrorEventHandlerNonNull> handlerCallback = new OnErrorEventHandlerNonNull(nullptr, handler, /* aIncumbentGlobal = */ nullptr); diff --git a/dom/script/ModuleScript.cpp b/dom/script/ModuleScript.cpp index e8f2802e14..8004ede3c6 100644 --- a/dom/script/ModuleScript.cpp +++ b/dom/script/ModuleScript.cpp @@ -72,7 +72,7 @@ void HostFinalizeTopLevelScript(JSFreeOp* aFop, const JS::Value& aPrivate) { #ifdef DEBUG if (script->IsModuleScript()) { JSObject* module = script->AsModuleScript()->mModuleRecord.unbarrieredGet(); - MOZ_ASSERT(JS::GetModulePrivate(module) == aPrivate); + MOZ_ASSERT_IF(module, JS::GetModulePrivate(module) == aPrivate); } #endif diff --git a/dom/script/ScriptLoader.cpp b/dom/script/ScriptLoader.cpp index 993b796053..02edb7850c 100644 --- a/dom/script/ScriptLoader.cpp +++ b/dom/script/ScriptLoader.cpp @@ -2258,9 +2258,11 @@ ScriptLoader::EvaluateScript(ScriptLoadRequest* aRequest) return NS_ERROR_FAILURE; } - nsCOMPtr<nsIContent> scriptContent(do_QueryInterface(aRequest->Element())); - MOZ_ASSERT_IF(!scriptContent, aRequest->AsModuleRequest()->IsDynamicImport()); - if (scriptContent) { + bool isDynamicImport = aRequest->IsModuleRequest() && + aRequest->AsModuleRequest()->IsDynamicImport(); + if (!isDynamicImport) { + nsCOMPtr<nsIContent> scriptContent(do_QueryInterface(aRequest->Element())); + MOZ_ASSERT(scriptContent); nsIDocument* ownerDoc = scriptContent->OwnerDoc(); if (ownerDoc != mDocument) { // Willful violation of HTML5 as of 2010-12-01 |