Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Implement importmaps
https://bugs.webkit.org/show_bug.cgi?id=220823 <rdar://73478498> Reviewed by Youenn Fablet. This patch implements import-maps[1], which integrates mapping between module specifier and actual URL so that we can import modules with arbitrary module specifier. This helps integrating existing node.js / bun etc. modules into the web page without bundlers. 1. JSC integrates importMapStatusPromise into its module loader pipeline. This makes us to wait for the importmap loading cleanly. 2. Fix a bug that <script type="module" src="URL">'s src is resolved. The spec does not resolve this URL and handle it as normal URL. The reason is that we would like to preload this resource so we need to have an URL here. 3. Fix WCIG import-mpas' tests in WPT. These tests are indeterministic, so we modified WPT testharness.js and tests to make it deterministic. 4. For now, we workaround the iframe 'load' event issue which blocks testing in WPT import-maps by modifying testharness.js. We should fix this issue in WebKit side later. They are located in LayoutTests/http/wpt/import-maps/data-driven. It should be removed once the issues are solved. https://bugs.webkit.org/show_bug.cgi?id=245772 5. "importmap" <script> type and LoadableImportMap is integrated in WebCore. We share most of code with LoadableClassicScript by factoring out the common part as LoadableNonModuleScriptBase. 6. Core algorithm of ImportMap resolution is defined in JSC::ImportMap in runtime/ImportMap.h. This map is per JSGlobalObject, and implements the resolution algorithm. We would like to integrate this well in normal JSC framework in the future. 7. HTML script preloader is correctly configured to preload importmap as well. 8. Some of WPT tests are failing because of www1.localhost domain resolution issue. [1]: https://github.com/WICG/import-maps * LayoutTests/TestExpectations: * LayoutTests/imported/w3c/resources/import-expectations.json: * LayoutTests/imported/w3c/web-platform-tests/html/semantics/scripting-1/the-script-element/module/import-meta/import-meta-resolve-importmap-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/html/semantics/scripting-1/the-script-element/module/specifier-error-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/import-maps/META.yml: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/acquiring/README.md: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/acquiring/dynamic-import-expected.txt: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/acquiring/dynamic-import.html: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/acquiring/modulepreload-expected.txt: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/acquiring/modulepreload-link-header-expected.txt: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/acquiring/modulepreload-link-header.html: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/acquiring/modulepreload-link-header.html.headers: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/acquiring/modulepreload.html: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/acquiring/script-tag-expected.txt: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/acquiring/script-tag-inline-expected.txt: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/acquiring/script-tag-inline.html: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/acquiring/script-tag.html: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/acquiring/w3c-import.log: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/acquiring/worker-request-expected.txt: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/acquiring/worker-request.html: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/bare-specifiers.sub-expected.txt: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/bare-specifiers.sub.html: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/bare/README.md: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/bare/__dir__.headers: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/bare/bare: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/bare/cross-origin-bare: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/bare/to-bare: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/bare/to-data: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/bare/w3c-import.log: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/csp/applied-to-target-dynamic.sub-expected.txt: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/csp/applied-to-target-dynamic.sub.html: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/csp/applied-to-target.sub-expected.txt: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/csp/applied-to-target.sub.html: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/csp/hash-expected.txt: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/csp/hash-failure-expected.txt: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/csp/hash-failure.html: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/csp/hash.html: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/csp/nonce-expected.txt: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/csp/nonce-failure-expected.txt: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/csp/nonce-failure.html: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/csp/nonce.html: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/csp/unsafe-inline-expected.txt: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/csp/unsafe-inline.html: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/csp/w3c-import.log: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/data-driven/README.md: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/data-driven/resolving-expected.txt: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/data-driven/resolving.html: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/data-driven/resources/test-helper-iframe.js: Added. (event.catch): * LayoutTests/imported/w3c/web-platform-tests/import-maps/data-driven/resources/test-helper.js: Added. (createTestIframe): (resolve): (async runTests): (async export.async runTestsFromJSON): * LayoutTests/imported/w3c/web-platform-tests/import-maps/data-driven/resources/w3c-import.log: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/data-driven/tools/format_json.py: Added. (main): * LayoutTests/imported/w3c/web-platform-tests/import-maps/data-driven/tools/w3c-import.log: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/data-driven/w3c-import.log: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/data-url-specifiers.sub-expected.txt: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/data-url-specifiers.sub.html: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/http-url-like-specifiers.sub-expected.txt: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/http-url-like-specifiers.sub.html: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/import-maps-base-url.sub-expected.txt: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/import-maps-base-url.sub.html: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/module-map-key-expected.txt: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/module-map-key.html: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/multiple-import-maps/basic-expected.txt: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/multiple-import-maps/basic.html: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/multiple-import-maps/w3c-import.log: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/multiple-import-maps/with-errors-expected.txt: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/multiple-import-maps/with-errors.html: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/not-as-classic-script-expected.txt: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/not-as-classic-script.html: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/resources/empty.js: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/resources/inject-base.js: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/resources/log.js: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/resources/log.js.headers: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/resources/test-helper.js: Added. (getHandlers): (testInIframe): (testScriptElement): (testStaticImportInjectBase): * LayoutTests/imported/w3c/web-platform-tests/import-maps/resources/w3c-import.log: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/script-supports-importmap-expected.txt: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/script-supports-importmap.html: Added. * LayoutTests/imported/w3c/web-platform-tests/import-maps/static-import.py: Added. (main): * LayoutTests/imported/w3c/web-platform-tests/import-maps/w3c-import.log: Added. * LayoutTests/tests-options.json: * Source/JavaScriptCore/API/JSAPIGlobalObject.mm: (JSC::JSAPIGlobalObject::moduleLoaderImportModule): (JSC::JSAPIGlobalObject::loadAndEvaluateJSScriptModule): * Source/JavaScriptCore/CMakeLists.txt: * Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj: * Source/JavaScriptCore/Sources.txt: * Source/JavaScriptCore/builtins/BuiltinNames.h: * Source/JavaScriptCore/builtins/ModuleLoader.js: (visibility.PrivateRecursive.async loadModule): (visibility.PrivateRecursive.async loadAndEvaluateModule): (visibility.PrivateRecursive.async requestImportModule): * Source/JavaScriptCore/bytecode/LinkTimeConstant.h: * Source/JavaScriptCore/jsc.cpp: (GlobalObject::moduleLoaderImportModule): * Source/JavaScriptCore/parser/SourceProvider.h: * Source/JavaScriptCore/runtime/Completion.cpp: (JSC::loadModule): (JSC::importModule): * Source/JavaScriptCore/runtime/Completion.h: * Source/JavaScriptCore/runtime/ImportMap.cpp: Added. (JSC::ImportMap::resolveImportMatch): (JSC::parseURLLikeModuleSpecifier): (JSC::ImportMap::resolve const): (JSC::normalizeSpecifierKey): (JSC::sortAndNormalizeSpecifierMap): (JSC::ImportMap::registerImportMap): * Source/JavaScriptCore/runtime/ImportMap.h: Copied from Source/WebCore/dom/ScriptElementCachedScriptFetcher.h. * Source/JavaScriptCore/runtime/JSGlobalObject.cpp: (JSC::JSGlobalObject::JSGlobalObject): (JSC::JSGlobalObject::init): (JSC::JSGlobalObject::visitChildrenImpl): (JSC::JSGlobalObject::isAcquiringImportMaps const): (JSC::JSGlobalObject::setAcquiringImportMaps): (JSC::JSGlobalObject::setPendingImportMaps): (JSC::JSGlobalObject::clearPendingImportMaps): * Source/JavaScriptCore/runtime/JSGlobalObject.h: (JSC::JSGlobalObject::importMap const): (JSC::JSGlobalObject::importMap): (JSC::JSGlobalObject::importMapStatusPromise const): * Source/JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp: (JSC::JSC_DEFINE_HOST_FUNCTION): * Source/JavaScriptCore/runtime/JSGlobalObjectFunctions.h: * Source/JavaScriptCore/runtime/JSModuleLoader.cpp: (JSC::JSModuleLoader::loadModule): (JSC::JSModuleLoader::requestImportModule): * Source/JavaScriptCore/runtime/JSModuleLoader.h: * Source/JavaScriptCore/runtime/LazyProperty.h: (JSC::LazyProperty::isInitialized const): * Source/WTF/wtf/JSONValues.cpp: (WTF::JSONImpl::Value::parseJSON): * Source/WTF/wtf/JSONValues.h: * Source/WebCore/Headers.cmake: * Source/WebCore/Sources.txt: * Source/WebCore/WebCore.xcodeproj/project.pbxproj: * Source/WebCore/bindings/js/JSExecState.h: (WebCore::JSExecState::loadModule): * Source/WebCore/bindings/js/ModuleFetchFailureKind.h: * Source/WebCore/bindings/js/ScriptController.cpp: (WebCore::ScriptController::loadModuleScriptInWorld): (WebCore::ScriptController::loadModuleScript): (WebCore::ScriptController::setupModuleScriptHandlers): (WebCore::ScriptController::reportExceptionFromScriptError): (WebCore::ScriptController::registerImportMap): (WebCore::ScriptController::isAcquiringImportMaps): (WebCore::ScriptController::setAcquiringImportMaps): (WebCore::ScriptController::setPendingImportMaps): (WebCore::ScriptController::clearPendingImportMaps): * Source/WebCore/bindings/js/ScriptController.h: * Source/WebCore/bindings/js/ScriptModuleLoader.cpp: (WebCore::resolveModuleSpecifier): (WebCore::ScriptModuleLoader::resolve): (WebCore::ScriptModuleLoader::responseURLFromRequestURL): (WebCore::ScriptModuleLoader::importModule): (WebCore::ScriptModuleLoader::createImportMetaProperties): * Source/WebCore/dom/CurrentScriptIncrementer.h: (WebCore::CurrentScriptIncrementer::CurrentScriptIncrementer): * Source/WebCore/dom/Document.cpp: (WebCore::Document::baseURLForComplete const): (WebCore::Document::completeURL const): * Source/WebCore/dom/Document.h: * Source/WebCore/dom/InlineClassicScript.h: * Source/WebCore/dom/LoadableClassicScript.cpp: (WebCore::LoadableClassicScript::takeError): (WebCore::LoadableClassicScript::notifyFinished): (WebCore::LoadableClassicScript::error const): Deleted. * Source/WebCore/dom/LoadableClassicScript.h: * Source/WebCore/dom/LoadableImportMap.cpp: Copied from Source/WebCore/dom/LoadableClassicScript.cpp. (WebCore::LoadableImportMap::create): (WebCore::LoadableImportMap::LoadableImportMap): (WebCore::LoadableImportMap::~LoadableImportMap): (WebCore::LoadableImportMap::isLoaded const): (WebCore::LoadableImportMap::takeError): (WebCore::LoadableImportMap::wasCanceled const): (WebCore::LoadableImportMap::notifyFinished): (WebCore::LoadableImportMap::execute): (WebCore::LoadableImportMap::load): * Source/WebCore/dom/LoadableImportMap.h: Copied from Source/WebCore/dom/LoadableClassicScript.h. (isType): * Source/WebCore/dom/LoadableModuleScript.cpp: (WebCore::LoadableModuleScript::takeError): (WebCore::LoadableModuleScript::error const): Deleted. * Source/WebCore/dom/LoadableModuleScript.h: * Source/WebCore/dom/LoadableScript.h: * Source/WebCore/dom/PendingScript.cpp: (WebCore::PendingScript::takeError): (WebCore::PendingScript::error const): Deleted. * Source/WebCore/dom/PendingScript.h: * Source/WebCore/dom/ScriptElement.cpp: (WebCore::ScriptElement::ScriptElement): (WebCore::ScriptElement::determineScriptType const): (WebCore::ScriptElement::prepareScript): (WebCore::ScriptElement::requestModuleScript): (WebCore::ScriptElement::requestImportMap): (WebCore::ScriptElement::registerImportMap): (WebCore::ScriptElement::executeModuleScript): (WebCore::ScriptElement::executeScriptAndDispatchEvent): (WebCore::ScriptElement::executePendingScript): * Source/WebCore/dom/ScriptElement.h: (WebCore::ScriptElement::scriptType const): * Source/WebCore/dom/ScriptElementCachedScriptFetcher.h: (WebCore::ScriptElementCachedScriptFetcher::isClassicScript const): (WebCore::ScriptElementCachedScriptFetcher::isModuleScript const): (WebCore::ScriptElementCachedScriptFetcher::isImportMap const): * Source/WebCore/dom/ScriptType.h: Copied from Source/WebCore/dom/InlineClassicScript.h. * Source/WebCore/html/HTMLScriptElement.h: * Source/WebCore/html/parser/CSSPreloadScanner.cpp: (WebCore::CSSPreloadScanner::emitRule): * Source/WebCore/html/parser/HTMLPreloadScanner.cpp: (WebCore::TokenPreloadScanner::StartTagScanner::createPreloadRequest): (WebCore::TokenPreloadScanner::StartTagScanner::processAttribute): (WebCore::TokenPreloadScanner::StartTagScanner::shouldPreload): * Source/WebCore/html/parser/HTMLResourcePreloader.cpp: (WebCore::PreloadRequest::resourceRequest): * Source/WebCore/html/parser/HTMLResourcePreloader.h: (WebCore::PreloadRequest::PreloadRequest): * Source/WebCore/html/parser/HTMLScriptRunner.cpp: (WebCore::HTMLScriptRunner::runScript): * Source/WebCore/page/csp/ContentSecurityPolicy.h: * Source/WebCore/workers/WorkerOrWorkletScriptController.cpp: (WebCore::WorkerOrWorkletScriptController::loadModuleSynchronously): (WebCore::WorkerOrWorkletScriptController::loadAndEvaluateModule): * Source/WebCore/xml/parser/XMLDocumentParserLibxml2.cpp: (WebCore::XMLDocumentParser::endElementNs): Canonical link: https://commits.webkit.org/254987@main
- Loading branch information