Changeset 232739 in webkit


Ignore:
Timestamp:
Jun 11, 2018 7:37:17 PM (6 years ago)
Author:
youenn@apple.com
Message:

Improve error messages in case FetchEvent.respondWith has a rejected promise
https://bugs.webkit.org/show_bug.cgi?id=186368

Reviewed by Chris Dumez.

LayoutTests/imported/w3c:

  • web-platform-tests/service-workers/service-worker/fetch-event-network-error.https-expected.txt:
  • web-platform-tests/service-workers/service-worker/fetch-event-redirect.https-expected.txt:
  • web-platform-tests/service-workers/service-worker/fetch-event-respond-with-argument.https-expected.txt:
  • web-platform-tests/service-workers/service-worker/fetch-event-respond-with-response-body-with-invalid-chunk.https-expected.txt:
  • web-platform-tests/service-workers/service-worker/fetch-frame-resource.https-expected.txt:
  • web-platform-tests/service-workers/service-worker/fetch-mixed-content-to-inscope.https-expected.txt:
  • web-platform-tests/service-workers/service-worker/fetch-mixed-content-to-outscope.https-expected.txt:
  • web-platform-tests/service-workers/service-worker/fetch-request-css-images.https-expected.txt:
  • web-platform-tests/service-workers/service-worker/fetch-request-resources.https-expected.txt:
  • web-platform-tests/service-workers/service-worker/invalid-header.https-expected.txt:
  • web-platform-tests/service-workers/service-worker/update-recovery.https-expected.txt:

Source/WebCore:

Covered by rebased tests.

Introduce a new error domain for service worker ResourceError.
Used this domain to log in the console any such error.

Update FetchEvent implementation to get meaningful error messages for respondWith error cases.
In particular, convert the rejected promise JS value as a string to populate the error message.

  • loader/SubresourceLoader.cpp:

(WebCore::SubresourceLoader::didFail):

  • platform/network/ResourceErrorBase.cpp:
  • platform/network/ResourceErrorBase.h:
  • testing/ServiceWorkerInternals.cpp:

(WebCore::ServiceWorkerInternals::waitForFetchEventToFinish):

  • workers/service/FetchEvent.cpp:

(WebCore::FetchEvent::~FetchEvent):
(WebCore::FetchEvent::createResponseError):
(WebCore::FetchEvent::onResponse):
(WebCore::FetchEvent::respondWithError):
(WebCore::FetchEvent::processResponse):
(WebCore::FetchEvent::promiseIsSettled):

  • workers/service/FetchEvent.h:
  • workers/service/context/ServiceWorkerFetch.cpp:

(WebCore::ServiceWorkerFetch::processResponse):
(WebCore::ServiceWorkerFetch::dispatchFetchEvent):

Source/WebKit:

Log in JS console in case of failures.
Rely on ThreadableLoader to log which client actually failed.

  • WebProcess/Storage/ServiceWorkerClientFetch.cpp:

(WebKit::ServiceWorkerClientFetch::didFail):

LayoutTests:

Location:
trunk
Files:
23 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r232737 r232739  
     12018-06-11  Youenn Fablet  <youenn@apple.com>
     2
     3        Improve error messages in case FetchEvent.respondWith has a rejected promise
     4        https://bugs.webkit.org/show_bug.cgi?id=186368
     5
     6        Reviewed by Chris Dumez.
     7
     8        * TestExpectations:
     9        * http/tests/workers/service/basic-fetch.https-expected.txt:
     10
    1112018-06-11  Chris Dumez  <cdumez@apple.com>
    212
  • trunk/LayoutTests/TestExpectations

    r232699 r232739  
    219219imported/w3c/web-platform-tests/service-workers/service-worker/register-closed-window.https.html [ DumpJSConsoleLogInStdErr ]
    220220imported/w3c/web-platform-tests/service-workers/service-worker/registration-security-error.https.html [ DumpJSConsoleLogInStdErr ]
     221imported/w3c/web-platform-tests/service-workers/service-worker/fetch-request-css-images.https.html [ DumpJSConsoleLogInStdErr ]
    221222imported/w3c/web-platform-tests/service-workers/service-worker/fetch-request-redirect.https.html [ DumpJSConsoleLogInStdErr Slow ]
     223imported/w3c/web-platform-tests/service-workers/service-worker/fetch-request-resources.https.html [ DumpJSConsoleLogInStdErr ]
    222224[ Debug ] imported/w3c/web-platform-tests/service-workers/service-worker/clients-matchall-order.https.html [ Slow ]
    223225[ Debug ] imported/w3c/web-platform-tests/service-workers/service-worker/getregistrations.https.html [ Slow ]
  • trunk/LayoutTests/http/tests/workers/service/basic-fetch.https-expected.txt

    r232484 r232739  
     1CONSOLE MESSAGE: Fetch event was canceled
    12CONSOLE MESSAGE: Fetch API cannot load https://127.0.0.1:8443/workers/service/resources/test5.
    23
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r232641 r232739  
     12018-06-11  Youenn Fablet  <youenn@apple.com>
     2
     3        Improve error messages in case FetchEvent.respondWith has a rejected promise
     4        https://bugs.webkit.org/show_bug.cgi?id=186368
     5
     6        Reviewed by Chris Dumez.
     7
     8        * web-platform-tests/service-workers/service-worker/fetch-event-network-error.https-expected.txt:
     9        * web-platform-tests/service-workers/service-worker/fetch-event-redirect.https-expected.txt:
     10        * web-platform-tests/service-workers/service-worker/fetch-event-respond-with-argument.https-expected.txt:
     11        * web-platform-tests/service-workers/service-worker/fetch-event-respond-with-response-body-with-invalid-chunk.https-expected.txt:
     12        * web-platform-tests/service-workers/service-worker/fetch-frame-resource.https-expected.txt:
     13        * web-platform-tests/service-workers/service-worker/fetch-mixed-content-to-inscope.https-expected.txt:
     14        * web-platform-tests/service-workers/service-worker/fetch-mixed-content-to-outscope.https-expected.txt:
     15        * web-platform-tests/service-workers/service-worker/fetch-request-css-images.https-expected.txt:
     16        * web-platform-tests/service-workers/service-worker/fetch-request-resources.https-expected.txt:
     17        * web-platform-tests/service-workers/service-worker/invalid-header.https-expected.txt:
     18        * web-platform-tests/service-workers/service-worker/update-recovery.https-expected.txt:
     19
    1202018-06-08  Brendan McLoughlin  <brendan@bocoup.com>
    221
  • trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-network-error.https-expected.txt

    r232484 r232739  
     1CONSOLE MESSAGE: Fetch event was canceled
    12CONSOLE MESSAGE: XMLHttpRequest cannot load https://localhost:9443/service-workers/service-worker/resources/fetch-event-network-error-controllee-iframe.html?prevent-default.
     3CONSOLE MESSAGE: FetchEvent.respondWith received an error: undefined
     4CONSOLE MESSAGE: XMLHttpRequest cannot load https://localhost:9443/service-workers/service-worker/resources/fetch-event-network-error-controllee-iframe.html?reject.
     5CONSOLE MESSAGE: FetchEvent.respondWith received an error: Response is disturbed or locked.
     6CONSOLE MESSAGE: XMLHttpRequest cannot load https://localhost:9443/service-workers/service-worker/resources/fetch-event-network-error-controllee-iframe.html?used-body.
     7CONSOLE MESSAGE: FetchEvent.respondWith received an error: Response is disturbed or locked.
     8CONSOLE MESSAGE: XMLHttpRequest cannot load https://localhost:9443/service-workers/service-worker/resources/fetch-event-network-error-controllee-iframe.html?used-fetched-body.
    29
    310PASS Rejecting the fetch event or using preventDefault() causes a network error
  • trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-redirect.https-expected.txt

    r231000 r232739  
    22CONSOLE MESSAGE: line 51: Not allowed to request resource
    33CONSOLE MESSAGE: line 51: Fetch API cannot load https://localhost:9443/nonav-manual-nocors-redirects-to-sameorigin-nocreds?url=redirect.py%3FRedirect%3Dhttps%253A%252F%252Flocalhost%253A9443%252Fservice-workers%252Fservice-worker%252Fresources%252Fsuccess.py&expected_type=opaqueredirect due to access control checks.
     4CONSOLE MESSAGE: FetchEvent.respondWith received an error: TypeError: Origin https://localhost:9443 is not allowed by Access-Control-Allow-Origin.
     5CONSOLE MESSAGE: Fetch API cannot load https://localhost:9443/nonav-follow-cors-redirects-to-nocors-nocreds?url=redirect.py%3FRedirect%3Dhttps%253A%252F%252F127.0.0.1%253A9443%252Fservice-workers%252Fservice-worker%252Fresources%252Fsuccess.py.
     6CONSOLE MESSAGE: FetchEvent.respondWith received an error: TypeError: Unsafe attempt to load URL https://127.0.0.1:9443/service-workers/service-worker/resources/success.py from origin https://localhost:9443. Domains, protocols and ports must match.
     7
     8CONSOLE MESSAGE: Fetch API cannot load https://localhost:9443/nonav-follow-sameorigin-redirects-to-nocors-nocreds?url=redirect.py%3FRedirect%3Dhttps%253A%252F%252F127.0.0.1%253A9443%252Fservice-workers%252Fservice-worker%252Fresources%252Fsuccess.py.
     9CONSOLE MESSAGE: FetchEvent.respondWith received an error: TypeError: Unsafe attempt to load URL https://127.0.0.1:9443/service-workers/service-worker/resources/success.py?ACAOrigin=https%3A%2F%2Flocalhost%3A9443 from origin https://localhost:9443. Domains, protocols and ports must match.
     10
     11CONSOLE MESSAGE: Fetch API cannot load https://localhost:9443/nonav-follow-sameorigin-redirects-to-cors-nocreds?url=redirect.py%3FRedirect%3Dhttps%253A%252F%252F127.0.0.1%253A9443%252Fservice-workers%252Fservice-worker%252Fresources%252Fsuccess.py%253FACAOrigin%253Dhttps%25253A%25252F%25252Flocalhost%25253A9443.
     12CONSOLE MESSAGE: FetchEvent.respondWith received an error: TypeError: Origin https://localhost:9443 is not allowed by Access-Control-Allow-Origin.
     13CONSOLE MESSAGE: Fetch API cannot load https://localhost:9443/nonav-follow-cors-redirects-to-nocors-creds?url=redirect.py%3FRedirect%3Dhttps%253A%252F%252Ffoo%253Abar%2540127.0.0.1%253A9443%252Fservice-workers%252Fservice-worker%252Fresources%252Fsuccess.py.
     14CONSOLE MESSAGE: FetchEvent.respondWith received an error: TypeError: Unsafe attempt to load URL https://127.0.0.1:9443/service-workers/service-worker/resources/success.py from origin https://localhost:9443. Domains, protocols and ports must match.
     15
     16CONSOLE MESSAGE: Fetch API cannot load https://localhost:9443/nonav-follow-sameorigin-redirects-to-nocors-creds?url=redirect.py%3FRedirect%3Dhttps%253A%252F%252Ffoo%253Abar%2540127.0.0.1%253A9443%252Fservice-workers%252Fservice-worker%252Fresources%252Fsuccess.py.
     17CONSOLE MESSAGE: FetchEvent.respondWith received an error: TypeError: Unsafe attempt to load URL https://127.0.0.1:9443/service-workers/service-worker/resources/success.py?ACAOrigin=https%3A%2F%2Flocalhost%3A9443 from origin https://localhost:9443. Domains, protocols and ports must match.
     18
     19CONSOLE MESSAGE: Fetch API cannot load https://localhost:9443/nonav-follow-sameorigin-redirects-to-cors-creds?url=redirect.py%3FRedirect%3Dhttps%253A%252F%252Ffoo%253Abar%2540127.0.0.1%253A9443%252Fservice-workers%252Fservice-worker%252Fresources%252Fsuccess.py%253FACAOrigin%253Dhttps%25253A%25252F%25252Flocalhost%25253A9443.
     20CONSOLE MESSAGE: FetchEvent.respondWith received an error: TypeError: Not allowed to follow a redirection while loading https://localhost:9443/service-workers/service-worker/resources/redirect.py?Redirect=https%3A%2F%2Flocalhost%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Fsuccess.py
     21CONSOLE MESSAGE: Fetch API cannot load https://localhost:9443/nonav-error-cors-redirects-to-sameorigin-nocreds?url=redirect.py%3FRedirect%3Dhttps%253A%252F%252Flocalhost%253A9443%252Fservice-workers%252Fservice-worker%252Fresources%252Fsuccess.py.
     22CONSOLE MESSAGE: FetchEvent.respondWith received an error: TypeError: Not allowed to follow a redirection while loading https://localhost:9443/service-workers/service-worker/resources/redirect.py?Redirect=https%3A%2F%2F127.0.0.1%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Fsuccess.py
     23CONSOLE MESSAGE: Fetch API cannot load https://localhost:9443/nonav-error-cors-redirects-to-nocors-nocreds?url=redirect.py%3FRedirect%3Dhttps%253A%252F%252F127.0.0.1%253A9443%252Fservice-workers%252Fservice-worker%252Fresources%252Fsuccess.py.
     24CONSOLE MESSAGE: FetchEvent.respondWith received an error: TypeError: Not allowed to follow a redirection while loading https://localhost:9443/service-workers/service-worker/resources/redirect.py?Redirect=https%3A%2F%2F127.0.0.1%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Fsuccess.py%3FACAOrigin%3Dhttps%253A%252F%252Flocalhost%253A9443
     25CONSOLE MESSAGE: Fetch API cannot load https://localhost:9443/nonav-error-cors-redirects-to-cors-nocreds?url=redirect.py%3FRedirect%3Dhttps%253A%252F%252F127.0.0.1%253A9443%252Fservice-workers%252Fservice-worker%252Fresources%252Fsuccess.py%253FACAOrigin%253Dhttps%25253A%25252F%25252Flocalhost%25253A9443.
     26CONSOLE MESSAGE: FetchEvent.respondWith received an error: TypeError: Not allowed to follow a redirection while loading https://localhost:9443/service-workers/service-worker/resources/redirect.py?Redirect=https%3A%2F%2Flocalhost%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Fsuccess.py
     27CONSOLE MESSAGE: Fetch API cannot load https://localhost:9443/nonav-error-sameorigin-redirects-to-sameorigin-nocreds?url=redirect.py%3FRedirect%3Dhttps%253A%252F%252Flocalhost%253A9443%252Fservice-workers%252Fservice-worker%252Fresources%252Fsuccess.py.
     28CONSOLE MESSAGE: FetchEvent.respondWith received an error: TypeError: Not allowed to follow a redirection while loading https://localhost:9443/service-workers/service-worker/resources/redirect.py?Redirect=https%3A%2F%2F127.0.0.1%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Fsuccess.py
     29CONSOLE MESSAGE: Fetch API cannot load https://localhost:9443/nonav-error-sameorigin-redirects-to-nocors-nocreds?url=redirect.py%3FRedirect%3Dhttps%253A%252F%252F127.0.0.1%253A9443%252Fservice-workers%252Fservice-worker%252Fresources%252Fsuccess.py.
     30CONSOLE MESSAGE: FetchEvent.respondWith received an error: TypeError: Not allowed to follow a redirection while loading https://localhost:9443/service-workers/service-worker/resources/redirect.py?Redirect=https%3A%2F%2F127.0.0.1%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Fsuccess.py%3FACAOrigin%3Dhttps%253A%252F%252Flocalhost%253A9443
     31CONSOLE MESSAGE: Fetch API cannot load https://localhost:9443/nonav-error-sameorigin-redirects-to-cors-nocreds?url=redirect.py%3FRedirect%3Dhttps%253A%252F%252F127.0.0.1%253A9443%252Fservice-workers%252Fservice-worker%252Fresources%252Fsuccess.py%253FACAOrigin%253Dhttps%25253A%25252F%25252Flocalhost%25253A9443.
    432CONSOLE MESSAGE: line 51: No-Cors mode requires follow redirect mode
    533CONSOLE MESSAGE: line 51: Not allowed to request resource
    634CONSOLE MESSAGE: line 51: Fetch API cannot load https://localhost:9443/nonav-error-nocors-redirects-to-sameorigin-nocreds?url=redirect.py%3FRedirect%3Dhttps%253A%252F%252Flocalhost%253A9443%252Fservice-workers%252Fservice-worker%252Fresources%252Fsuccess.py due to access control checks.
     35CONSOLE MESSAGE: FetchEvent.respondWith received an error: TypeError: Not allowed to follow a redirection while loading https://localhost:9443/service-workers/service-worker/resources/redirect.py?Redirect=https%3A%2F%2Ffoo%3Abar%40localhost%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Fsuccess.py
     36CONSOLE MESSAGE: Fetch API cannot load https://localhost:9443/nonav-error-cors-redirects-to-sameorigin-creds?url=redirect.py%3FRedirect%3Dhttps%253A%252F%252Ffoo%253Abar%2540localhost%253A9443%252Fservice-workers%252Fservice-worker%252Fresources%252Fsuccess.py.
     37CONSOLE MESSAGE: FetchEvent.respondWith received an error: TypeError: Not allowed to follow a redirection while loading https://localhost:9443/service-workers/service-worker/resources/redirect.py?Redirect=https%3A%2F%2Ffoo%3Abar%40127.0.0.1%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Fsuccess.py
     38CONSOLE MESSAGE: Fetch API cannot load https://localhost:9443/nonav-error-cors-redirects-to-nocors-creds?url=redirect.py%3FRedirect%3Dhttps%253A%252F%252Ffoo%253Abar%2540127.0.0.1%253A9443%252Fservice-workers%252Fservice-worker%252Fresources%252Fsuccess.py.
     39CONSOLE MESSAGE: FetchEvent.respondWith received an error: TypeError: Not allowed to follow a redirection while loading https://localhost:9443/service-workers/service-worker/resources/redirect.py?Redirect=https%3A%2F%2Ffoo%3Abar%40127.0.0.1%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Fsuccess.py%3FACAOrigin%3Dhttps%253A%252F%252Flocalhost%253A9443
     40CONSOLE MESSAGE: Fetch API cannot load https://localhost:9443/nonav-error-cors-redirects-to-cors-creds?url=redirect.py%3FRedirect%3Dhttps%253A%252F%252Ffoo%253Abar%2540127.0.0.1%253A9443%252Fservice-workers%252Fservice-worker%252Fresources%252Fsuccess.py%253FACAOrigin%253Dhttps%25253A%25252F%25252Flocalhost%25253A9443.
     41CONSOLE MESSAGE: FetchEvent.respondWith received an error: TypeError: Not allowed to follow a redirection while loading https://localhost:9443/service-workers/service-worker/resources/redirect.py?Redirect=https%3A%2F%2Ffoo%3Abar%40localhost%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Fsuccess.py
     42CONSOLE MESSAGE: Fetch API cannot load https://localhost:9443/nonav-error-sameorigin-redirects-to-sameorigin-creds?url=redirect.py%3FRedirect%3Dhttps%253A%252F%252Ffoo%253Abar%2540localhost%253A9443%252Fservice-workers%252Fservice-worker%252Fresources%252Fsuccess.py.
     43CONSOLE MESSAGE: FetchEvent.respondWith received an error: TypeError: Not allowed to follow a redirection while loading https://localhost:9443/service-workers/service-worker/resources/redirect.py?Redirect=https%3A%2F%2Ffoo%3Abar%40127.0.0.1%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Fsuccess.py
     44CONSOLE MESSAGE: Fetch API cannot load https://localhost:9443/nonav-error-sameorigin-redirects-to-nocors-creds?url=redirect.py%3FRedirect%3Dhttps%253A%252F%252Ffoo%253Abar%2540127.0.0.1%253A9443%252Fservice-workers%252Fservice-worker%252Fresources%252Fsuccess.py.
     45CONSOLE MESSAGE: FetchEvent.respondWith received an error: TypeError: Not allowed to follow a redirection while loading https://localhost:9443/service-workers/service-worker/resources/redirect.py?Redirect=https%3A%2F%2Ffoo%3Abar%40127.0.0.1%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Fsuccess.py%3FACAOrigin%3Dhttps%253A%252F%252Flocalhost%253A9443
     46CONSOLE MESSAGE: Fetch API cannot load https://localhost:9443/nonav-error-sameorigin-redirects-to-cors-creds?url=redirect.py%3FRedirect%3Dhttps%253A%252F%252Ffoo%253Abar%2540127.0.0.1%253A9443%252Fservice-workers%252Fservice-worker%252Fresources%252Fsuccess.py%253FACAOrigin%253Dhttps%25253A%25252F%25252Flocalhost%25253A9443.
    747
    848PASS initialize global state
  • trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-respond-with-argument.https-expected.txt

    r224852 r232739  
     1CONSOLE MESSAGE: FetchEvent.respondWith received an error: Returned response is null.
     2CONSOLE MESSAGE: XMLHttpRequest cannot load https://localhost:9443/service-workers/service-worker/resources/fetch-event-respond-with-argument-iframe.html?other-value.
    13
    24PASS respondWith() takes either a Response or a promise that resolves with a Response. Other values should raise a network error.
  • trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-respond-with-response-body-with-invalid-chunk.https-expected.txt

    r224852 r232739  
     1CONSOLE MESSAGE: FetchEvent.respondWith received an error: ReadableStream chunk enqueueing in the sink failed
    12
    23PASS Response with a ReadableStream having non-Uint8Array chunks should be transferred as errored
  • trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-frame-resource.https-expected.txt

    r226084 r232739  
     1CONSOLE MESSAGE: FetchEvent.respondWith received an error: TypeError: Not allowed to request resource
     2CONSOLE MESSAGE: Cannot load https://localhost:9443/service-workers/service-worker/resources/fetch-frame-resource/frame-opaque?mode=no-cors&url=https%3A%2F%2F127.0.0.1%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py.
     3CONSOLE MESSAGE: FetchEvent.respondWith received an error: TypeError: Not allowed to request resource
     4CONSOLE MESSAGE: Cannot load https://localhost:9443/service-workers/service-worker/resources/fetch-frame-resource/window-opaque?mode=no-cors&url=https%3A%2F%2F127.0.0.1%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py.
    15
    26PASS Basic type response could be loaded in the iframe.
  • trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-mixed-content-to-inscope.https-expected.txt

    r224852 r232739  
     1CONSOLE MESSAGE: FetchEvent.respondWith received an error: TypeError: Not allowed to request resource
     2CONSOLE MESSAGE: Cannot load https://localhost:9443/service-workers/service-worker/resources/dummy?mode=no-cors&url=http%3A%2F%2Flocalhost%3A8800%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FPNGIMAGE.
     3CONSOLE MESSAGE: FetchEvent.respondWith received an error: TypeError: Not allowed to request resource
     4CONSOLE MESSAGE: Cannot load https://localhost:9443/service-workers/service-worker/resources/dummy?mode=no-cors&url=http%3A%2F%2F127.0.0.1%3A8800%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FPNGIMAGE.
    15
    26
  • trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-mixed-content-to-outscope.https-expected.txt

    r226066 r232739  
    11CONSOLE MESSAGE: line 25: The page at https://localhost:9443/service-workers/service-worker/fetch-mixed-content-to-outscope.https.html was allowed to display insecure content from http://localhost:8800/service-workers/service-worker/resources/fetch-access-control.py?PNGIMAGE.
    22
     3CONSOLE MESSAGE: FetchEvent.respondWith received an error: TypeError: Not allowed to request resource
     4CONSOLE MESSAGE: Cannot load http://localhost:8800/service-workers/service-worker/resources/fetch-access-control.py?PNGIMAGE.
    35CONSOLE MESSAGE: line 42: The page at https://localhost:9443/service-workers/service-worker/fetch-mixed-content-to-outscope.https.html was allowed to display insecure content from http://127.0.0.1:8800/service-workers/service-worker/resources/fetch-access-control.py?PNGIMAGE.
    46
     7CONSOLE MESSAGE: FetchEvent.respondWith received an error: TypeError: Not allowed to request resource
     8CONSOLE MESSAGE: Cannot load http://127.0.0.1:8800/service-workers/service-worker/resources/fetch-access-control.py?PNGIMAGE.
    59
    610
  • trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/invalid-header.https-expected.txt

    r224852 r232739  
     1CONSOLE MESSAGE: FetchEvent.respondWith received an error: TypeError: Header 'foo' has invalid value: 'b
     2CONSOLE MESSAGE: XMLHttpRequest cannot load https://localhost:9443/service-workers/service-worker/resources/dummy?test.
    13
    24PASS Verify the response of FetchEvent using XMLHttpRequest
  • trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/update-recovery.https-expected.txt

    r227543 r232739  
     1CONSOLE MESSAGE: FetchEvent.respondWith received an error: undefined
     2CONSOLE MESSAGE: Cannot load https://localhost:9443/service-workers/service-worker/resources/simple.txt.
    13
    24PASS Recover from a bad service worker by updating after a failed navigation.
  • trunk/Source/WebCore/ChangeLog

    r232737 r232739  
     12018-06-11  Youenn Fablet  <youenn@apple.com>
     2
     3        Improve error messages in case FetchEvent.respondWith has a rejected promise
     4        https://bugs.webkit.org/show_bug.cgi?id=186368
     5
     6        Reviewed by Chris Dumez.
     7
     8        Covered by rebased tests.
     9
     10        Introduce a new error domain for service worker ResourceError.
     11        Used this domain to log in the console any such error.
     12
     13        Update FetchEvent implementation to get meaningful error messages for respondWith error cases.
     14        In particular, convert the rejected promise JS value as a string to populate the error message.
     15
     16        * loader/SubresourceLoader.cpp:
     17        (WebCore::SubresourceLoader::didFail):
     18        * platform/network/ResourceErrorBase.cpp:
     19        * platform/network/ResourceErrorBase.h:
     20        * testing/ServiceWorkerInternals.cpp:
     21        (WebCore::ServiceWorkerInternals::waitForFetchEventToFinish):
     22        * workers/service/FetchEvent.cpp:
     23        (WebCore::FetchEvent::~FetchEvent):
     24        (WebCore::FetchEvent::createResponseError):
     25        (WebCore::FetchEvent::onResponse):
     26        (WebCore::FetchEvent::respondWithError):
     27        (WebCore::FetchEvent::processResponse):
     28        (WebCore::FetchEvent::promiseIsSettled):
     29        * workers/service/FetchEvent.h:
     30        * workers/service/context/ServiceWorkerFetch.cpp:
     31        (WebCore::ServiceWorkerFetch::processResponse):
     32        (WebCore::ServiceWorkerFetch::dispatchFetchEvent):
     33
    1342018-06-11  Chris Dumez  <cdumez@apple.com>
    235
  • trunk/Source/WebCore/loader/ThreadableLoader.cpp

    r231000 r232739  
    132132    // We further reduce logging to some errors.
    133133    // FIXME: Log more errors when making so do not make some layout tests flaky.
    134     if (error.domain() != errorDomainWebKitInternal && !error.isAccessControl())
     134    if (error.domain() != errorDomainWebKitInternal && error.domain() != errorDomainWebKitServiceWorker && !error.isAccessControl())
    135135        return;
    136136
  • trunk/Source/WebCore/platform/network/ResourceErrorBase.cpp

    r224638 r232739  
    3131
    3232const char* const errorDomainWebKitInternal = "WebKitInternal";
     33const char* const errorDomainWebKitServiceWorker = "WebKitServiceWorker";
    3334
    3435inline const ResourceError& ResourceErrorBase::asResourceError() const
  • trunk/Source/WebCore/platform/network/ResourceErrorBase.h

    r226084 r232739  
    3535
    3636WEBCORE_EXPORT extern const char* const errorDomainWebKitInternal; // Used for errors that won't be exposed to clients.
     37WEBCORE_EXPORT extern const char* const errorDomainWebKitServiceWorker; // Used for errors that happen when loading a resource from a service worker.
    3738
    3839class ResourceErrorBase {
  • trunk/Source/WebCore/testing/ServiceWorkerInternals.cpp

    r230365 r232739  
    5252void ServiceWorkerInternals::waitForFetchEventToFinish(FetchEvent& event, DOMPromiseDeferred<IDLInterface<FetchResponse>>&& promise)
    5353{
    54     event.onResponse([promise = WTFMove(promise), event = makeRef(event)] (FetchResponse* response) mutable {
    55         if (response)
    56             promise.resolve(*response);
     54    event.onResponse([promise = WTFMove(promise), event = makeRef(event)] (auto&& result) mutable {
     55        if (result.has_value())
     56            promise.resolve(WTFMove(result.value()));
    5757        else
    58             promise.reject(TypeError, ASCIILiteral("fetch event responded with error"));
     58            promise.reject(TypeError, result.error().localizedDescription());
    5959    });
    6060}
  • trunk/Source/WebCore/workers/service/FetchEvent.cpp

    r232613 r232739  
    5353{
    5454    if (auto callback = WTFMove(m_onResponse))
    55         callback(nullptr);
     55        callback(makeUnexpected(ResourceError { errorDomainWebKitServiceWorker, 0, m_request->url(), ASCIILiteral("Fetch event is destroyed."), ResourceError::Type::Cancellation }));
     56}
     57
     58ResourceError FetchEvent::createResponseError(const URL& url, const String& errorMessage)
     59{
     60    return ResourceError { errorDomainWebKitServiceWorker, 0, url, makeString("FetchEvent.respondWith received an error: ", errorMessage), ResourceError::Type::General };
     61
    5662}
    5763
     
    8288}
    8389
    84 void FetchEvent::onResponse(CompletionHandler<void(FetchResponse*)>&& callback)
     90void FetchEvent::onResponse(ResponseCallback&& callback)
    8591{
    8692    ASSERT(!m_onResponse);
     
    8894}
    8995
    90 void FetchEvent::respondWithError()
     96void FetchEvent::respondWithError(ResourceError&& error)
    9197{
    9298    m_respondWithError = true;
    93     processResponse(nullptr);
     99    processResponse(makeUnexpected(WTFMove(error)));
    94100}
    95101
    96 void FetchEvent::processResponse(FetchResponse* response)
     102void FetchEvent::processResponse(Expected<Ref<FetchResponse>, ResourceError>&& result)
    97103{
    98104    m_respondPromise = nullptr;
    99105    m_waitToRespond = false;
    100106    if (auto callback = WTFMove(m_onResponse))
    101         callback(response);
     107        callback(WTFMove(result));
    102108}
    103109
     
    105111{
    106112    if (m_respondPromise->status() == DOMPromise::Status::Rejected) {
    107         respondWithError();
     113        auto reason = m_respondPromise->result().toWTFString(m_respondPromise->globalObject()->globalExec());
     114        respondWithError(createResponseError(m_request->url(), reason));
    108115        return;
    109116    }
     
    112119    auto response = JSFetchResponse::toWrapped(m_respondPromise->globalObject()->globalExec()->vm(), m_respondPromise->result());
    113120    if (!response) {
    114         respondWithError();
     121        respondWithError(createResponseError(m_request->url(), ASCIILiteral("Returned response is null.")));
    115122        return;
    116123    }
    117124
    118125    if (response->isDisturbedOrLocked()) {
    119         respondWithError();
     126        respondWithError(createResponseError(m_request->url(), ASCIILiteral("Response is disturbed or locked.")));
    120127        return;
    121128    }
    122129
    123     processResponse(response);
     130    processResponse(makeRef(*response));
    124131}
    125132
  • trunk/Source/WebCore/workers/service/FetchEvent.h

    r224532 r232739  
    3131#include "FetchRequest.h"
    3232#include <wtf/CompletionHandler.h>
     33#include <wtf/Expected.h>
    3334
    3435namespace WebCore {
    3536
    3637class FetchResponse;
     38class ResourceError;
    3739
    3840class FetchEvent final : public ExtendableEvent {
     
    5759    ExceptionOr<void> respondWith(Ref<DOMPromise>&&);
    5860
    59     WEBCORE_EXPORT void onResponse(CompletionHandler<void(FetchResponse*)>&&);
     61    using ResponseCallback = CompletionHandler<void(Expected<Ref<FetchResponse>, ResourceError>&&)>;
     62    WEBCORE_EXPORT void onResponse(ResponseCallback&&);
    6063
    6164    FetchRequest& request() { return m_request.get(); }
     
    6669    bool respondWithEntered() const { return m_respondWithEntered; }
    6770
     71    static ResourceError createResponseError(const URL&, const String&);
     72
    6873private:
    6974    WEBCORE_EXPORT FetchEvent(const AtomicString&, Init&&, IsTrusted);
    7075
    7176    void promiseIsSettled();
    72     void processResponse(FetchResponse*);
    73     void respondWithError();
     77    void processResponse(Expected<Ref<FetchResponse>, ResourceError>&&);
     78    void respondWithError(ResourceError&&);
    7479
    7580    Ref<FetchRequest> m_request;
     
    8388    RefPtr<DOMPromise> m_respondPromise;
    8489
    85     CompletionHandler<void(FetchResponse*)> m_onResponse;
     90    ResponseCallback m_onResponse;
    8691};
    8792
  • trunk/Source/WebCore/workers/service/context/ServiceWorkerFetch.cpp

    r232484 r232739  
    4444namespace ServiceWorkerFetch {
    4545
    46 static void processResponse(Ref<Client>&& client, FetchResponse* response)
     46static void processResponse(Ref<Client>&& client, Expected<Ref<FetchResponse>, ResourceError>&& result)
    4747{
    48     if (!response) {
    49         client->didFail(ResourceError { errorDomainWebKitInternal, 0, URL(), ASCIILiteral("Response is null") });
     48    if (!result.has_value()) {
     49        client->didFail(result.error());
    5050        return;
    5151    }
    52     auto protectedResponse = makeRef(*response);
     52    auto response = WTFMove(result.value());
    5353
    5454    client->didReceiveResponse(response->resourceResponse());
     
    6262        response->consumeBodyReceivedByChunk([client = WTFMove(client)] (auto&& result) mutable {
    6363            if (result.hasException()) {
    64                 client->didFail(ResourceError { errorDomainWebKitInternal, 0, URL(), result.exception().message() });
     64                client->didFail(FetchEvent::createResponseError(URL { }, result.exception().message()));
    6565                return;
    6666            }
     
    123123    auto event = FetchEvent::create(eventNames().fetchEvent, WTFMove(init), Event::IsTrusted::Yes);
    124124
    125     event->onResponse([client = client.copyRef()] (FetchResponse* response) mutable {
    126         processResponse(WTFMove(client), response);
     125    event->onResponse([client = client.copyRef()] (auto&& result) mutable {
     126        processResponse(WTFMove(client), WTFMove(result));
    127127    });
    128128
  • trunk/Source/WebKit/ChangeLog

    r232737 r232739  
     12018-06-11  Youenn Fablet  <youenn@apple.com>
     2
     3        Improve error messages in case FetchEvent.respondWith has a rejected promise
     4        https://bugs.webkit.org/show_bug.cgi?id=186368
     5
     6        Reviewed by Chris Dumez.
     7
     8        Log in JS console in case of failures.
     9        Rely on ThreadableLoader to log which client actually failed.
     10
     11        * WebProcess/Storage/ServiceWorkerClientFetch.cpp:
     12        (WebKit::ServiceWorkerClientFetch::didFail):
     13
    1142018-06-11  Chris Dumez  <cdumez@apple.com>
    215
  • trunk/Source/WebKit/WebProcess/Storage/ServiceWorkerClientFetch.cpp

    r232484 r232739  
    3333#include "WebServiceWorkerProvider.h"
    3434#include <WebCore/CrossOriginAccessControl.h>
     35#include <WebCore/Document.h>
     36#include <WebCore/Frame.h>
    3537#include <WebCore/MIMETypeRegistry.h>
    3638#include <WebCore/NotImplemented.h>
     
    234236            return;
    235237
     238        auto* document = m_loader->frame() ? m_loader->frame()->document() : nullptr;
     239        if (document) {
     240            document->addConsoleMessage(MessageSource::JS, MessageLevel::Error, m_error.localizedDescription());
     241            if (m_loader->options().destination != FetchOptions::Destination::EmptyString)
     242                document->addConsoleMessage(MessageSource::JS, MessageLevel::Error, makeString("Cannot load ", m_error.failingURL().string(), "."));
     243        }
     244
    236245        m_loader->didFail(m_error);
    237246
Note: See TracChangeset for help on using the changeset viewer.