[Shadow Realms] Use WebCore module loaders for shadow realm importValue
https://bugs.webkit.org/show_bug.cgi?id=234155
Patch by Joseph Griego <[email protected]> on 2022-01-24
Reviewed by Darin Adler.
Source/JavaScriptCore:
Add hook for creating the new realm object for shadow realms, since
importValue requires the cooperation of the module loading logic to work
right.
- API/JSAPIGlobalObject.cpp:
- jsc.cpp:
- runtime/JSGlobalObject.cpp:
- runtime/JSGlobalObject.h:
(JSC::JSGlobalObject::deriveShadowRealmGlobalObject):
- runtime/ShadowRealmConstructor.cpp:
(JSC::JSC_DEFINE_HOST_FUNCTION):
- runtime/ShadowRealmObject.cpp:
(JSC::ShadowRealmObject::create):
- runtime/ShadowRealmObject.h:
Source/WebCore:
Introduces a new ShadowRealmGlobalScope that serves as the
implementation of a global object for code running in a shadow realm--to
implement the requirements of JS(DOM)GlobalObject, it simply delegates
all methods to the incubating (enclosing) realm, with the exception of
methods related to module loading, for which it uses a custom
ScriptModuleLoader configured to use the appropriate global object when
evaluating module code.
Also requires some adjustment to the IDL-driven code generation--the
current draft spec requires that the global object for the shadow realm
be an ordinary object--ShadowRealmGlobalScope is opted out of codegen
for producing a custom prototype, but can still have APIs included as
properties if they are marked as Exposed=ShadowRealm
or Exposed=*
Tests: js/ShadowRealm-evaluate.html
js/ShadowRealm-importValue.html
js/ShadowRealm-worker.html
- CMakeLists.txt:
- DerivedSources.make:
- Sources.txt:
- bindings/js/JSDOMGlobalObject.cpp:
(WebCore::JSDOMGlobalObject::scriptExecutionContext const):
(WebCore::scriptModuleLoader):
(WebCore::JSDOMGlobalObject::deriveShadowRealmGlobalObject):
- bindings/js/JSDOMGlobalObject.h:
- bindings/js/JSDOMWindowBase.cpp:
- bindings/js/JSRemoteDOMWindowBase.cpp:
- bindings/js/JSShadowRealmGlobalScopeBase.cpp: Added.
(WebCore::JSShadowRealmGlobalScopeBase::JSShadowRealmGlobalScopeBase):
(WebCore::JSShadowRealmGlobalScopeBase::finishCreation):
(WebCore::JSShadowRealmGlobalScopeBase::visitChildrenImpl):
(WebCore::JSShadowRealmGlobalScopeBase::scriptExecutionContext const):
(WebCore::JSShadowRealmGlobalScopeBase::incubating const):
(WebCore::JSShadowRealmGlobalScopeBase::destroy):
(WebCore::JSShadowRealmGlobalScopeBase::supportsRichSourceInfo):
(WebCore::JSShadowRealmGlobalScopeBase::shouldInterruptScript):
(WebCore::JSShadowRealmGlobalScopeBase::shouldInterruptScriptBeforeTimeout):
(WebCore::JSShadowRealmGlobalScopeBase::javaScriptRuntimeFlags):
(WebCore::JSShadowRealmGlobalScopeBase::scriptExecutionStatus):
(WebCore::JSShadowRealmGlobalScopeBase::reportViolationForUnsafeEval):
(WebCore::JSShadowRealmGlobalScopeBase::queueMicrotaskToEventLoop):
(WebCore::toJS):
- bindings/js/JSShadowRealmGlobalScopeBase.h: Added.
(WebCore::JSShadowRealmGlobalScopeBase::subspaceFor):
(WebCore::JSShadowRealmGlobalScopeBase::wrapped const):
(WebCore::JSShadowRealmGlobalScopeBase::incubating):
(WebCore::toJS):
- bindings/js/JSWorkerGlobalScopeBase.cpp:
- bindings/js/JSWorkletGlobalScopeBase.cpp:
- bindings/js/ScriptModuleLoader.cpp:
(WebCore::ScriptModuleLoader::shadowRealmLoader const):
(WebCore::ScriptModuleLoader::evaluate):
- bindings/js/ScriptModuleLoader.h:
- bindings/js/WebCoreJSClientData.cpp:
(WebCore::JSVMClientData::JSVMClientData):
- bindings/js/WebCoreJSClientData.h:
- bindings/scripts/CodeGeneratorJS.pm:
(IsDOMGlobalObject):
(ShouldUseOrdinaryObjectPrototype):
(GenerateHeader):
(GenerateRuntimeEnableConditionalStringForExposed):
(GenerateImplementation):
(GeneratePrototypeDeclaration):
(GenerateConstructorHelperMethods):
- bindings/scripts/preprocess-idls.pl:
- bindings/scripts/test/ShadowRealmGlobalScopeConstructors.idl: Added.
- bindings/scripts/test/SupplementalDependencies.dep:
- dom/PromiseRejectionEvent.idl:
- dom/ScriptExecutionContext.h:
(WebCore::ScriptExecutionContext::isShadowRealmGlobalScope const):
- page/ShadowRealmGlobalScope.cpp: Copied from Source/JavaScriptCore/runtime/ShadowRealmObject.h.
(WebCore::ShadowRealmGlobalScope::tryCreate):
(WebCore::ShadowRealmGlobalScope::ShadowRealmGlobalScope):
(WebCore::ShadowRealmGlobalScope::moduleLoader):
(WebCore::ShadowRealmGlobalScope::wrapper):
(WebCore::ShadowRealmGlobalScope::~ShadowRealmGlobalScope):
- page/ShadowRealmGlobalScope.h: Copied from Source/JavaScriptCore/runtime/ShadowRealmObject.h.
(WebCore::ShadowRealmGlobalScope::self):
- page/ShadowRealmGlobalScope.idl: Copied from Source/JavaScriptCore/runtime/ShadowRealmObject.h.
Tools:
- Scripts/webkitpy/bindings/main.py:
(BindingsTests.generate_supplemental_dependency):
(BindingsTests.main):
LayoutTests:
Improve test coverage a bit for shadow realms, especially running
nested, in worker contexts, or in iframes.
- js/ShadowRealm-evaluate-expected.txt: Added.
- js/ShadowRealm-evaluate.html: Added.
- js/ShadowRealm-importValue-expected.txt: Added.
- js/ShadowRealm-importValue.html: Added.
- js/ShadowRealm-worker-expected.txt: Added.
- js/ShadowRealm-worker.html: Added.
- js/script-tests/ShadowRealm-evaluate.js: Added.
(assert_closed_opener):
(promise_test.async t):
- js/script-tests/ShadowRealm-importValue.js: Added.
(wrappedLog):
(promise_test.async t):
- js/script-tests/example-module.js: Added.
(check):
(log_equal):
(check_nested):
(setValue):
- js/script-tests/shadow-realm-worker.js: Added.
(assert_equals):
(async test):
(async await):