Skip to content

Commit

Permalink
Merge 254447@main - workers/interfaces/WorkerUtils/importScripts/catc…
Browse files Browse the repository at this point in the history
…h.sub.any.*.html WPT tests are failing in WebKit

https://bugs.webkit.org/show_bug.cgi?id=245098

Reviewed by Darin Adler.

Implement the "muted error" logic from:
- https://html.spec.whatwg.org/multipage/webappapis.html#fetch-a-classic-worker-imported-script (step 8)

* LayoutTests/imported/w3c/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/catch.sub.any.serviceworker-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/catch.sub.any.sharedworker-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/catch.sub.any.worker-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/report-error-cross-origin.sub.any.sharedworker-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/report-error-cross-origin.sub.any.worker-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/report-error-redirect-to-cross-origin.sub.any.sharedworker-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/report-error-redirect-to-cross-origin.sub.any.worker-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/report-error-setTimeout-cross-origin.sub.any.sharedworker-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/report-error-setTimeout-cross-origin.sub.any.worker-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/report-error-setTimeout-redirect-to-cross-origin.sub.any.sharedworker-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/workers/interfaces/WorkerUtils/importScripts/report-error-setTimeout-redirect-to-cross-origin.sub.any.worker-expected.txt:
Rebaseline tests that are now passing.

* Source/WebCore/loader/cache/CachedResource.cpp:
(WebCore::CachedResource::setResponse):
Response tainting should be "basic" for data URLs:
- https://fetch.spec.whatwg.org/#concept-main-fetch (Step 11)

* Source/WebCore/workers/WorkerGlobalScope.cpp:
(WebCore::WorkerGlobalScope::importScripts):
Implemented the "muted errors" logic from:
- https://html.spec.whatwg.org/multipage/webappapis.html#fetch-a-classic-worker-imported-script (step 8)

* Source/WebCore/workers/WorkerScriptLoader.cpp:
(WebCore::WorkerScriptLoader::didReceiveResponse):
* Source/WebCore/workers/WorkerScriptLoader.h:
(WebCore::WorkerScriptLoader::responseTainting const):
Keep track for the response's tainting so that we can use it in importScripts.

Canonical link: https://commits.webkit.org/254447@main

(cherry picked from commit d9c375a)
  • Loading branch information
cdumez authored and aperezdc committed Sep 13, 2022
1 parent 52fbb62 commit 6f60c44
Show file tree
Hide file tree
Showing 16 changed files with 31 additions and 91 deletions.
@@ -1,4 +1,4 @@
CONSOLE MESSAGE: Error: Script error.
CONSOLE MESSAGE: NetworkError: Network response is CORS-cross-origin
Test importScripts with error.


Expand All @@ -20,7 +20,7 @@ filename: http://127.0.0.1:8000/workers/resources/worker-importScripts-error.js,
initEvent: function initEvent() { [native code] },
isTrusted: true,
lineno: 2,
message: Error: Script error.,
message: NetworkError: Network response is CORS-cross-origin,
preventDefault: function preventDefault() { [native code] },
returnValue: true,
srcElement: [object Worker],
Expand Down
@@ -1,20 +1,8 @@

PASS Same-origin syntax error
PASS Same-origin throw
FAIL Cross-origin syntax error assert_throws_dom: function "function () {
importScripts(crossOrigin +
"/workers/modules/resources/syntax-error.js");
}" threw object "Error: Script error." that is not a DOMException NetworkError: property "code" is equal to undefined, expected 19
FAIL Cross-origin throw assert_throws_dom: function "function () {
importScripts(crossOrigin +
"/workers/modules/resources/throw.js");
}" threw object "Error: Script error." that is not a DOMException NetworkError: property "code" is equal to undefined, expected 19
FAIL Redirect-to-cross-origin syntax error assert_throws_dom: function "function () {
importScripts(redirectToCrossOrigin +
"/workers/modules/resources/syntax-error.js");
}" threw object "Error: Script error." that is not a DOMException NetworkError: property "code" is equal to undefined, expected 19
FAIL Redirect-to-Cross-origin throw assert_throws_dom: function "function () {
importScripts(redirectToCrossOrigin +
"/workers/modules/resources/throw.js");
}" threw object "Error: Script error." that is not a DOMException NetworkError: property "code" is equal to undefined, expected 19
PASS Cross-origin syntax error
PASS Cross-origin throw
PASS Redirect-to-cross-origin syntax error
PASS Redirect-to-Cross-origin throw

@@ -1,20 +1,8 @@

PASS Same-origin syntax error
PASS Same-origin throw
FAIL Cross-origin syntax error assert_throws_dom: function "function () {
importScripts(crossOrigin +
"/workers/modules/resources/syntax-error.js");
}" threw object "Error: Script error." that is not a DOMException NetworkError: property "code" is equal to undefined, expected 19
FAIL Cross-origin throw assert_throws_dom: function "function () {
importScripts(crossOrigin +
"/workers/modules/resources/throw.js");
}" threw object "Error: Script error." that is not a DOMException NetworkError: property "code" is equal to undefined, expected 19
FAIL Redirect-to-cross-origin syntax error assert_throws_dom: function "function () {
importScripts(redirectToCrossOrigin +
"/workers/modules/resources/syntax-error.js");
}" threw object "Error: Script error." that is not a DOMException NetworkError: property "code" is equal to undefined, expected 19
FAIL Redirect-to-Cross-origin throw assert_throws_dom: function "function () {
importScripts(redirectToCrossOrigin +
"/workers/modules/resources/throw.js");
}" threw object "Error: Script error." that is not a DOMException NetworkError: property "code" is equal to undefined, expected 19
PASS Cross-origin syntax error
PASS Cross-origin throw
PASS Redirect-to-cross-origin syntax error
PASS Redirect-to-Cross-origin throw

@@ -1,20 +1,8 @@

PASS Same-origin syntax error
PASS Same-origin throw
FAIL Cross-origin syntax error assert_throws_dom: function "function () {
importScripts(crossOrigin +
"/workers/modules/resources/syntax-error.js");
}" threw object "Error: Script error." that is not a DOMException NetworkError: property "code" is equal to undefined, expected 19
FAIL Cross-origin throw assert_throws_dom: function "function () {
importScripts(crossOrigin +
"/workers/modules/resources/throw.js");
}" threw object "Error: Script error." that is not a DOMException NetworkError: property "code" is equal to undefined, expected 19
FAIL Redirect-to-cross-origin syntax error assert_throws_dom: function "function () {
importScripts(redirectToCrossOrigin +
"/workers/modules/resources/syntax-error.js");
}" threw object "Error: Script error." that is not a DOMException NetworkError: property "code" is equal to undefined, expected 19
FAIL Redirect-to-Cross-origin throw assert_throws_dom: function "function () {
importScripts(redirectToCrossOrigin +
"/workers/modules/resources/throw.js");
}" threw object "Error: Script error." that is not a DOMException NetworkError: property "code" is equal to undefined, expected 19
PASS Cross-origin syntax error
PASS Cross-origin throw
PASS Redirect-to-cross-origin syntax error
PASS Redirect-to-Cross-origin throw

@@ -1,9 +1,5 @@

FAIL WorkerGlobalScope error event: error assert_equals: e.error should be a DOMException expected function "function DOMException() {
[native code]
}" but got function "function Error() {
[native code]
}"
PASS WorkerGlobalScope error event: error
PASS WorkerGlobalScope error event: message
PASS WorkerGlobalScope error event: filename
PASS WorkerGlobalScope error event: lineno
Expand Down
@@ -1,9 +1,5 @@

FAIL WorkerGlobalScope error event: error assert_equals: e.error should be a DOMException expected function "function DOMException() {
[native code]
}" but got function "function Error() {
[native code]
}"
PASS WorkerGlobalScope error event: error
PASS WorkerGlobalScope error event: message
PASS WorkerGlobalScope error event: filename
PASS WorkerGlobalScope error event: lineno
Expand Down
@@ -1,9 +1,5 @@

FAIL WorkerGlobalScope error event: error assert_equals: e.error should be a DOMException expected function "function DOMException() {
[native code]
}" but got function "function Error() {
[native code]
}"
PASS WorkerGlobalScope error event: error
PASS WorkerGlobalScope error event: message
PASS WorkerGlobalScope error event: filename
PASS WorkerGlobalScope error event: lineno
Expand Down
@@ -1,9 +1,5 @@

FAIL WorkerGlobalScope error event: error assert_equals: e.error should be a DOMException expected function "function DOMException() {
[native code]
}" but got function "function Error() {
[native code]
}"
PASS WorkerGlobalScope error event: error
PASS WorkerGlobalScope error event: message
PASS WorkerGlobalScope error event: filename
PASS WorkerGlobalScope error event: lineno
Expand Down
@@ -1,9 +1,5 @@

FAIL WorkerGlobalScope error event: error assert_equals: e.error should be a DOMException expected function "function DOMException() {
[native code]
}" but got function "function Error() {
[native code]
}"
PASS WorkerGlobalScope error event: error
PASS WorkerGlobalScope error event: message
PASS WorkerGlobalScope error event: filename
PASS WorkerGlobalScope error event: lineno
Expand Down
@@ -1,9 +1,5 @@

FAIL WorkerGlobalScope error event: error assert_equals: e.error should be a DOMException expected function "function DOMException() {
[native code]
}" but got function "function Error() {
[native code]
}"
PASS WorkerGlobalScope error event: error
PASS WorkerGlobalScope error event: message
PASS WorkerGlobalScope error event: filename
PASS WorkerGlobalScope error event: lineno
Expand Down
@@ -1,9 +1,5 @@

FAIL WorkerGlobalScope error event: error assert_equals: e.error should be a DOMException expected function "function DOMException() {
[native code]
}" but got function "function Error() {
[native code]
}"
PASS WorkerGlobalScope error event: error
PASS WorkerGlobalScope error event: message
PASS WorkerGlobalScope error event: filename
PASS WorkerGlobalScope error event: lineno
Expand Down
@@ -1,9 +1,5 @@

FAIL WorkerGlobalScope error event: error assert_equals: e.error should be a DOMException expected function "function DOMException() {
[native code]
}" but got function "function Error() {
[native code]
}"
PASS WorkerGlobalScope error event: error
PASS WorkerGlobalScope error event: message
PASS WorkerGlobalScope error event: filename
PASS WorkerGlobalScope error event: lineno
Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/loader/cache/CachedResource.cpp
Expand Up @@ -477,7 +477,7 @@ void CachedResource::setResponse(const ResourceResponse& response)
}
#endif
m_response.setRedirected(m_redirectChainCacheStatus.status != RedirectChainCacheStatus::Status::NoRedirection);
if (m_response.tainting() == ResourceResponse::Tainting::Basic || m_response.tainting() == ResourceResponse::Tainting::Cors)
if ((m_response.tainting() == ResourceResponse::Tainting::Basic || m_response.tainting() == ResourceResponse::Tainting::Cors) && !m_response.url().protocolIsData())
m_response.setTainting(m_responseTainting);
}

Expand Down
5 changes: 5 additions & 0 deletions Source/WebCore/workers/WorkerGlobalScope.cpp
Expand Up @@ -404,6 +404,9 @@ ExceptionOr<void> WorkerGlobalScope::importScripts(const FixedVector<String>& ur
if (auto exception = scriptLoader->loadSynchronously(this, url, WorkerScriptLoader::Source::ClassicWorkerImport, FetchOptions::Mode::NoCors, cachePolicy, cspEnforcement, resourceRequestIdentifier()))
return WTFMove(*exception);

// https://html.spec.whatwg.org/multipage/webappapis.html#fetch-a-classic-worker-imported-script (step 7).
bool mutedErrors = scriptLoader->responseTainting() == ResourceResponse::Tainting::Opaque || scriptLoader->responseTainting() == ResourceResponse::Tainting::Opaqueredirect;

InspectorInstrumentation::scriptImported(*this, scriptLoader->identifier(), scriptLoader->script().toString());

WeakPtr<ScriptBufferSourceProvider> sourceProvider;
Expand All @@ -413,6 +416,8 @@ ExceptionOr<void> WorkerGlobalScope::importScripts(const FixedVector<String>& ur
sourceProvider = static_cast<ScriptBufferSourceProvider&>(sourceCode.provider());
script()->evaluate(sourceCode, exception);
if (exception) {
if (mutedErrors)
return Exception { NetworkError, "Network response is CORS-cross-origin"_s };
script()->setException(exception);
return { };
}
Expand Down
1 change: 1 addition & 0 deletions Source/WebCore/workers/WorkerScriptLoader.cpp
Expand Up @@ -247,6 +247,7 @@ void WorkerScriptLoader::didReceiveResponse(ResourceLoaderIdentifier identifier,
m_certificateInfo = response.certificateInfo() ? *response.certificateInfo() : CertificateInfo();
m_responseMIMEType = response.mimeType();
m_responseSource = response.source();
m_responseTainting = response.tainting();
m_isRedirected = response.isRedirected();
m_contentSecurityPolicy = ContentSecurityPolicyResponseHeaders { response };
if (m_isCOEPEnabled)
Expand Down
2 changes: 2 additions & 0 deletions Source/WebCore/workers/WorkerScriptLoader.h
Expand Up @@ -81,6 +81,7 @@ class WorkerScriptLoader : public RefCounted<WorkerScriptLoader>, public Threada
bool isRedirected() const { return m_isRedirected; }
const CertificateInfo& certificateInfo() const { return m_certificateInfo; }
const String& responseMIMEType() const { return m_responseMIMEType; }
ResourceResponse::Tainting responseTainting() const { return m_responseTainting; }
bool failed() const { return m_failed; }
ResourceLoaderIdentifier identifier() const { return m_identifier; }
const ResourceError& error() const { return m_error; }
Expand Down Expand Up @@ -137,6 +138,7 @@ class WorkerScriptLoader : public RefCounted<WorkerScriptLoader>, public Threada
bool m_isRedirected { false };
bool m_isCOEPEnabled { false };
ResourceResponse::Source m_responseSource { ResourceResponse::Source::Unknown };
ResourceResponse::Tainting m_responseTainting { ResourceResponse::Tainting::Basic };
ResourceError m_error;
ScriptExecutionContextIdentifier m_clientIdentifier;
#if ENABLE(SERVICE_WORKER)
Expand Down

0 comments on commit 6f60c44

Please sign in to comment.