Changeset 225702 in webkit


Ignore:
Timestamp:
Dec 8, 2017 2:41:48 PM (6 years ago)
Author:
commit-queue@webkit.org
Message:

FetchResponse should keep unfiltered ResourceResponse so that it can be used in Service Worker
https://bugs.webkit.org/show_bug.cgi?id=179641
<rdar://problem/35923570>

Patch by Youenn Fablet <youenn@apple.com> on 2017-12-08
Reviewed by Alex Christensen.

LayoutTests/imported/w3c:

  • web-platform-tests/service-workers/service-worker/fetch-request-css-cross-origin-mime-check.https-expected.txt:
  • web-platform-tests/service-workers/service-worker/fetch-response-taint.https-expected.txt:

Source/WebCore:

Covered by existing rebased tests.

FetchResponse will now store an unfiltered response.
If it needs to expose it to JavaScript, it will create a filtered response lazily.
This allows service worker to send back to web pages, opaque responses containing every information.

Updating Document::initSecurityContext so that any document loaded with a response whose tainting is Opaque gets a unique origin.
This ensures cross-origin checks to work if service worker returns such a response on a same origin URL.

Updated SubresourceLoader to check cross origin service worker responses based on their tainting.

  • Modules/fetch/FetchResponse.cpp:

(WebCore::FetchResponse::create):
(WebCore::FetchResponse::error):
(WebCore::FetchResponse::redirect):
(WebCore::FetchResponse::FetchResponse):
(WebCore::FetchResponse::clone):
(WebCore::FetchResponse::url const):
(WebCore::FetchResponse::filteredResponse const):
(WebCore::FetchResponse::BodyLoader::didReceiveResponse):
(WebCore::FetchResponse::resourceResponse const):

  • Modules/fetch/FetchResponse.h:

(WebCore::FetchResponse::create): Deleted.

  • dom/Document.cpp:

(WebCore::Document::initSecurityContext):

  • loader/SubresourceLoader.cpp:

(WebCore::SubresourceLoader::willSendRequestInternal):
(WebCore::SubresourceLoader::checkResponseCrossOriginAccessControl):

Source/WebKit:

  • WebProcess/Storage/ServiceWorkerClientFetch.cpp:

(WebKit::ServiceWorkerClientFetch::didReceiveResponse): In case of opaque redirected response, handle it as a regular response.

LayoutTests:

Location:
trunk
Files:
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r225698 r225702  
     12017-12-08  Youenn Fablet  <youenn@apple.com>
     2
     3        FetchResponse should keep unfiltered ResourceResponse so that it can be used in Service Worker
     4        https://bugs.webkit.org/show_bug.cgi?id=179641
     5        <rdar://problem/35923570>
     6
     7        Reviewed by Alex Christensen.
     8
     9        * TestExpectations:
     10
    1112017-12-08  Konstantin Tokarev  <annulen@yandex.ru>
    212
  • trunk/LayoutTests/TestExpectations

    r225644 r225702  
    191191imported/w3c/web-platform-tests/service-workers/service-worker/fetch-cors-xhr.https.html [ DumpJSConsoleLogInStdErr Pass Failure ]
    192192imported/w3c/web-platform-tests/service-workers/service-worker/update.https.html [ Pass Failure Timeout ]
     193
     194imported/w3c/web-platform-tests/service-workers/service-worker/fetch-response-taint.https.html [ DumpJSConsoleLogInStdErr ]
    193195
    194196# Skip workers tests that are timing out or are SharedWorker related only
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r225644 r225702  
     12017-12-08  Youenn Fablet  <youenn@apple.com>
     2
     3        FetchResponse should keep unfiltered ResourceResponse so that it can be used in Service Worker
     4        https://bugs.webkit.org/show_bug.cgi?id=179641
     5        <rdar://problem/35923570>
     6
     7        Reviewed by Alex Christensen.
     8
     9        * web-platform-tests/service-workers/service-worker/fetch-request-css-cross-origin-mime-check.https-expected.txt:
     10        * web-platform-tests/service-workers/service-worker/fetch-response-taint.https-expected.txt:
     11
    1122017-12-07  Youenn Fablet  <youenn@apple.com>
    213
  • trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-frame-resource.https-expected.txt

    r224852 r225702  
     1CONSOLE MESSAGE: line 51: Blocked a frame with origin "https://localhost:9443" from accessing a frame with origin "null".  The frame requesting access has a protocol of "https", the frame being accessed has a protocol of "https". Protocols must match.
     2
    13
    24PASS Basic type response could be loaded in the iframe.
  • trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-request-css-cross-origin-mime-check.https-expected.txt

    r224852 r225702  
     1CONSOLE MESSAGE: Did not parse stylesheet at 'https://localhost:9443/service-workers/service-worker/resources/cross-origin-html.css' because non CSS MIME types are not allowed for cross-origin stylesheets.
    12
     3PASS Mime type checking of CSS files fetched via SW.
    24
    3 FAIL Mime type checking of CSS files fetched via SW. assert_equals: The color must not be overridden by cross origin non CSS file. expected "rgb(0, 0, 255)" but got "rgb(255, 0, 0)"
    4 
  • trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-response-taint.https-expected.txt

    r225574 r225702  
    1 CONSOLE MESSAGE: line 20: Fetch API cannot load https://127.0.0.1:9443/service-workers/service-worker/resources/fetch-access-control.py?. Cross origin requests are not allowed when using same-origin fetch mode.
    2 CONSOLE MESSAGE: line 20: Fetch API cannot load https://127.0.0.1:9443/service-workers/service-worker/resources/fetch-access-control.py?. Cross origin requests are not allowed when using same-origin fetch mode.
    3 CONSOLE MESSAGE: line 20: Fetch API cannot load https://127.0.0.1:9443/service-workers/service-worker/resources/fetch-access-control.py?. Cross origin requests are not allowed when using same-origin fetch mode.
    4 CONSOLE MESSAGE: line 20: Fetch API cannot load https://127.0.0.1:9443/?url=https%3A%2F%2Flocalhost%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&. Cross origin requests are not allowed when using same-origin fetch mode.
    5 CONSOLE MESSAGE: line 20: Fetch API cannot load https://127.0.0.1:9443/?url=https%3A%2F%2Flocalhost%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&. Cross origin requests are not allowed when using same-origin fetch mode.
    6 CONSOLE MESSAGE: line 20: Fetch API cannot load https://127.0.0.1:9443/?url=https%3A%2F%2Flocalhost%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&. Cross origin requests are not allowed when using same-origin fetch mode.
    7 CONSOLE MESSAGE: line 20: Fetch API cannot load https://127.0.0.1:9443/?url=https%3A%2F%2Flocalhost%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=same-origin&. Cross origin requests are not allowed when using same-origin fetch mode.
    8 CONSOLE MESSAGE: line 20: Fetch API cannot load https://127.0.0.1:9443/?url=https%3A%2F%2Flocalhost%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=same-origin&. Cross origin requests are not allowed when using same-origin fetch mode.
    9 CONSOLE MESSAGE: line 20: Fetch API cannot load https://127.0.0.1:9443/?url=https%3A%2F%2Flocalhost%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=same-origin&. Cross origin requests are not allowed when using same-origin fetch mode.
    10 CONSOLE MESSAGE: line 20: Fetch API cannot load https://127.0.0.1:9443/?url=https%3A%2F%2F127.0.0.1%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&. Cross origin requests are not allowed when using same-origin fetch mode.
    11 CONSOLE MESSAGE: line 20: Fetch API cannot load https://127.0.0.1:9443/?url=https%3A%2F%2F127.0.0.1%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&. Cross origin requests are not allowed when using same-origin fetch mode.
    12 CONSOLE MESSAGE: line 20: Fetch API cannot load https://127.0.0.1:9443/?url=https%3A%2F%2F127.0.0.1%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&. Cross origin requests are not allowed when using same-origin fetch mode.
    13 CONSOLE MESSAGE: line 20: Fetch API cannot load https://127.0.0.1:9443/?url=https%3A%2F%2F127.0.0.1%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=no-cors&credentials=omit&. Cross origin requests are not allowed when using same-origin fetch mode.
    14 CONSOLE MESSAGE: line 20: Fetch API cannot load https://127.0.0.1:9443/?url=https%3A%2F%2F127.0.0.1%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=no-cors&credentials=omit&. Cross origin requests are not allowed when using same-origin fetch mode.
    15 CONSOLE MESSAGE: line 20: Fetch API cannot load https://127.0.0.1:9443/?url=https%3A%2F%2F127.0.0.1%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=no-cors&credentials=omit&. Cross origin requests are not allowed when using same-origin fetch mode.
    16 CONSOLE MESSAGE: line 20: Fetch API cannot load https://127.0.0.1:9443/?url=https%3A%2F%2F127.0.0.1%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3D*&mode=cors&credentials=omit&. Cross origin requests are not allowed when using same-origin fetch mode.
    17 CONSOLE MESSAGE: line 20: Fetch API cannot load https://127.0.0.1:9443/?url=https%3A%2F%2F127.0.0.1%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3D*&mode=cors&credentials=omit&. Cross origin requests are not allowed when using same-origin fetch mode.
    18 CONSOLE MESSAGE: line 20: Fetch API cannot load https://127.0.0.1:9443/?url=https%3A%2F%2F127.0.0.1%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3D*&mode=cors&credentials=omit&. Cross origin requests are not allowed when using same-origin fetch mode.
    19 CONSOLE MESSAGE: line 20: Fetch API cannot load https://127.0.0.1:9443/?url=https%3A%2F%2F127.0.0.1%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3Dhttps%3A%2F%2Flocalhost%3A9443%26ACACredentials%3Dtrue&mode=cors&credentials=include&. Cross origin requests are not allowed when using same-origin fetch mode.
    20 CONSOLE MESSAGE: line 20: Fetch API cannot load https://127.0.0.1:9443/?url=https%3A%2F%2F127.0.0.1%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3Dhttps%3A%2F%2Flocalhost%3A9443%26ACACredentials%3Dtrue&mode=cors&credentials=include&. Cross origin requests are not allowed when using same-origin fetch mode.
    21 CONSOLE MESSAGE: line 20: Fetch API cannot load https://127.0.0.1:9443/?url=https%3A%2F%2F127.0.0.1%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3Dhttps%3A%2F%2Flocalhost%3A9443%26ACACredentials%3Dtrue&mode=cors&credentials=include&. Cross origin requests are not allowed when using same-origin fetch mode.
    221
    232PASS initialize global state
     
    11392PASS fetching url:"https://127.0.0.1:9443/?url=https%3A%2F%2F127.0.0.1%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=no-cors&credentials=omit&" mode:"no-cors" credentials:"same-origin" should succeed.
    11493PASS fetching url:"https://127.0.0.1:9443/?url=https%3A%2F%2F127.0.0.1%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=no-cors&credentials=omit&" mode:"no-cors" credentials:"include" should succeed.
    115 FAIL url:"https://127.0.0.1:9443/?url=https%3A%2F%2F127.0.0.1%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=no-cors&credentials=omit&" mode:"cors" credentials:"omit" should fail. assert_unreached: Should have rejected: undefined Reached unreachable code
    116 FAIL url:"https://127.0.0.1:9443/?url=https%3A%2F%2F127.0.0.1%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=no-cors&credentials=omit&" mode:"cors" credentials:"same-origin" should fail. assert_unreached: Should have rejected: undefined Reached unreachable code
    117 FAIL url:"https://127.0.0.1:9443/?url=https%3A%2F%2F127.0.0.1%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=no-cors&credentials=omit&" mode:"cors" credentials:"include" should fail. assert_unreached: Should have rejected: undefined Reached unreachable code
     94PASS url:"https://127.0.0.1:9443/?url=https%3A%2F%2F127.0.0.1%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=no-cors&credentials=omit&" mode:"cors" credentials:"omit" should fail.
     95PASS url:"https://127.0.0.1:9443/?url=https%3A%2F%2F127.0.0.1%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=no-cors&credentials=omit&" mode:"cors" credentials:"same-origin" should fail.
     96PASS url:"https://127.0.0.1:9443/?url=https%3A%2F%2F127.0.0.1%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=no-cors&credentials=omit&" mode:"cors" credentials:"include" should fail.
    11897FAIL fetching url:"https://localhost:9443/?url=https%3A%2F%2F127.0.0.1%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3D*&mode=cors&credentials=omit&" mode:"same-origin" credentials:"omit" should succeed. assert_equals: response type expected "cors" but got "basic"
    11998FAIL fetching url:"https://localhost:9443/?url=https%3A%2F%2F127.0.0.1%3A9443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3D*&mode=cors&credentials=omit&" mode:"same-origin" credentials:"same-origin" should succeed. assert_equals: response type expected "cors" but got "basic"
  • trunk/Source/WebCore/ChangeLog

    r225699 r225702  
     12017-12-08  Youenn Fablet  <youenn@apple.com>
     2
     3        FetchResponse should keep unfiltered ResourceResponse so that it can be used in Service Worker
     4        https://bugs.webkit.org/show_bug.cgi?id=179641
     5        <rdar://problem/35923570>
     6
     7        Reviewed by Alex Christensen.
     8
     9        Covered by existing rebased tests.
     10
     11        FetchResponse will now store an unfiltered response.
     12        If it needs to expose it to JavaScript, it will create a filtered response lazily.
     13        This allows service worker to send back to web pages, opaque responses containing every information.
     14
     15        Updating Document::initSecurityContext so that any document loaded with a response whose tainting is Opaque gets a unique origin.
     16        This ensures cross-origin checks to work if service worker returns such a response on a same origin URL.
     17
     18        Updated SubresourceLoader to check cross origin service worker responses based on their tainting.
     19
     20        * Modules/fetch/FetchResponse.cpp:
     21        (WebCore::FetchResponse::create):
     22        (WebCore::FetchResponse::error):
     23        (WebCore::FetchResponse::redirect):
     24        (WebCore::FetchResponse::FetchResponse):
     25        (WebCore::FetchResponse::clone):
     26        (WebCore::FetchResponse::url const):
     27        (WebCore::FetchResponse::filteredResponse const):
     28        (WebCore::FetchResponse::BodyLoader::didReceiveResponse):
     29        (WebCore::FetchResponse::resourceResponse const):
     30        * Modules/fetch/FetchResponse.h:
     31        (WebCore::FetchResponse::create): Deleted.
     32        * dom/Document.cpp:
     33        (WebCore::Document::initSecurityContext):
     34        * loader/SubresourceLoader.cpp:
     35        (WebCore::SubresourceLoader::willSendRequestInternal):
     36        (WebCore::SubresourceLoader::checkResponseCrossOriginAccessControl):
     37
    1382017-12-08  David Quesada  <david_quesada@apple.com>
    239
  • trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp

    r225297 r225702  
    4545}
    4646
     47Ref<FetchResponse> FetchResponse::create(ScriptExecutionContext& context, std::optional<FetchBody>&& body, Ref<FetchHeaders>&& headers, ResourceResponse&& response)
     48{
     49    auto fetchResponse = adoptRef(*new FetchResponse(context, WTFMove(body), WTFMove(headers), WTFMove(response)));
     50    fetchResponse->m_filteredResponse = ResourceResponseBase::filter(fetchResponse->m_internalResponse);
     51    return fetchResponse;
     52}
     53
    4754ExceptionOr<Ref<FetchResponse>> FetchResponse::create(ScriptExecutionContext& context, std::optional<FetchBody::Init>&& body, Init&& init)
    4855{
     
    109116    r->m_contentType = contentType;
    110117    auto mimeType = extractMIMETypeFromMediaType(contentType);
    111     r->m_response.setMimeType(mimeType.isEmpty() ? defaultMIMEType() : mimeType);
    112 
    113     r->m_response.setHTTPStatusCode(status);
    114     r->m_response.setHTTPStatusText(statusText);
     118    r->m_internalResponse.setMimeType(mimeType.isEmpty() ? defaultMIMEType() : mimeType);
     119
     120    r->m_internalResponse.setHTTPStatusCode(status);
     121    r->m_internalResponse.setHTTPStatusText(statusText);
    115122
    116123    return WTFMove(r);
     
    120127{
    121128    auto response = adoptRef(*new FetchResponse(context, { }, FetchHeaders::create(FetchHeaders::Guard::Immutable), { }));
    122     response->m_response.setType(Type::Error);
     129    response->m_internalResponse.setType(Type::Error);
    123130    return response;
    124131}
     
    133140        return Exception { RangeError };
    134141    auto redirectResponse = adoptRef(*new FetchResponse(context, { }, FetchHeaders::create(FetchHeaders::Guard::Immutable), { }));
    135     redirectResponse->m_response.setHTTPStatusCode(status);
     142    redirectResponse->m_internalResponse.setHTTPStatusCode(status);
     143    redirectResponse->m_internalResponse.setHTTPHeaderField(HTTPHeaderName::Location, requestURL.string());
    136144    redirectResponse->m_headers->fastSet(HTTPHeaderName::Location, requestURL.string());
    137145    return WTFMove(redirectResponse);
     
    140148FetchResponse::FetchResponse(ScriptExecutionContext& context, std::optional<FetchBody>&& body, Ref<FetchHeaders>&& headers, ResourceResponse&& response)
    141149    : FetchBodyOwner(context, WTFMove(body), WTFMove(headers))
    142     , m_response(WTFMove(response))
     150    , m_internalResponse(WTFMove(response))
    143151{
    144152}
     
    155163        readableStream(*context.execState());
    156164
    157     auto clone = adoptRef(*new FetchResponse(context, std::nullopt, FetchHeaders::create(headers()), ResourceResponse(m_response)));
     165    auto clone = adoptRef(*new FetchResponse(context, std::nullopt, FetchHeaders::create(headers()), ResourceResponse(m_internalResponse)));
    158166    clone->cloneBody(*this);
    159167    if (isBodyOpaque())
     
    183191{
    184192    if (m_responseURL.isNull()) {
    185         URL url = m_response.url();
     193        URL url = m_internalResponse.url();
    186194        url.removeFragmentIdentifier();
    187195        m_responseURL = url.string();
    188196    }
    189197    return m_responseURL;
     198}
     199
     200const ResourceResponse& FetchResponse::filteredResponse() const
     201{
     202    if (m_filteredResponse)
     203        return m_filteredResponse.value();
     204    return m_internalResponse;
    190205}
    191206
     
    247262void FetchResponse::BodyLoader::didReceiveResponse(const ResourceResponse& resourceResponse)
    248263{
    249     m_response.m_response = ResourceResponseBase::filter(resourceResponse);
     264    m_response.m_filteredResponse = ResourceResponseBase::filter(resourceResponse);
     265    m_response.m_internalResponse = resourceResponse;
     266    m_response.m_internalResponse.setType(m_response.m_filteredResponse->type());
    250267    if (resourceResponse.tainting() == ResourceResponse::Tainting::Opaque) {
    251268        m_response.m_opaqueLoadIdentifier = ++nextOpaqueLoadIdentifier;
     
    253270    }
    254271
    255     m_response.m_headers->filterAndFill(m_response.m_response.httpHeaderFields(), FetchHeaders::Guard::Response);
     272    m_response.m_headers->filterAndFill(m_response.m_filteredResponse->httpHeaderFields(), FetchHeaders::Guard::Response);
    256273    m_response.updateContentType();
    257274
     
    443460ResourceResponse FetchResponse::resourceResponse() const
    444461{
    445     auto response = m_response;
    446     // FIXME: Add a setHTTPHeaderFields on ResourceResponseBase.
    447     for (auto& header : headers().internalHeaders())
    448         response.setHTTPHeaderField(header.key, header.value);
     462    auto response = m_internalResponse;
     463
     464    if (headers().guard() != FetchHeaders::Guard::Immutable) {
     465        // FIXME: Add a setHTTPHeaderFields on ResourceResponseBase.
     466        for (auto& header : headers().internalHeaders())
     467            response.setHTTPHeaderField(header.key, header.value);
     468    }
     469
    449470    return response;
    450471}
  • trunk/Source/WebCore/Modules/fetch/FetchResponse.h

    r224344 r225702  
    6969#endif
    7070
    71     Type type() const { return m_response.type(); }
     71    Type type() const { return filteredResponse().type(); }
    7272    const String& url() const;
    73     bool redirected() const { return m_response.isRedirected(); }
    74     int status() const { return m_response.httpStatusCode(); }
    75     bool ok() const { return m_response.isSuccessful(); }
    76     const String& statusText() const { return m_response.httpStatusText(); }
     73    bool redirected() const { return filteredResponse().isRedirected(); }
     74    int status() const { return filteredResponse().httpStatusCode(); }
     75    bool ok() const { return filteredResponse().isSuccessful(); }
     76    const String& statusText() const { return filteredResponse().httpStatusText(); }
    7777
    7878    const FetchHeaders& headers() const { return m_headers; }
     
    109109    bool canSuspendForDocumentSuspension() const final;
    110110
     111    const ResourceResponse& filteredResponse() const;
     112
    111113#if ENABLE(STREAMS_API)
    112114    void closeStream();
     
    140142    };
    141143
    142     ResourceResponse m_response;
     144    mutable std::optional<ResourceResponse> m_filteredResponse;
     145    ResourceResponse m_internalResponse;
    143146    std::optional<BodyLoader> m_bodyLoader;
    144147    mutable String m_responseURL;
     
    148151};
    149152
    150 inline Ref<FetchResponse> FetchResponse::create(ScriptExecutionContext& context, std::optional<FetchBody>&& body, Ref<FetchHeaders>&& headers, ResourceResponse&& response)
    151 {
    152     return adoptRef(*new FetchResponse(context, WTFMove(body), WTFMove(headers), WTFMove(response)));
    153 }
    154 
    155153} // namespace WebCore
  • trunk/Source/WebCore/dom/Document.cpp

    r225696 r225702  
    54655465        applyContentDispositionAttachmentSandbox();
    54665466
    5467     setSecurityOriginPolicy(SecurityOriginPolicy::create(isSandboxed(SandboxOrigin) ? SecurityOrigin::createUnique() : SecurityOrigin::create(m_url)));
     5467    bool isSecurityOriginUnique = isSandboxed(SandboxOrigin);
     5468    if (!isSecurityOriginUnique) {
     5469        auto* loader = m_frame->loader().documentLoader();
     5470        isSecurityOriginUnique = loader && loader->response().tainting() == ResourceResponse::Tainting::Opaque;
     5471    }
     5472
     5473    setSecurityOriginPolicy(SecurityOriginPolicy::create(isSecurityOriginUnique ? SecurityOrigin::createUnique() : SecurityOrigin::create(m_url)));
    54685474    setContentSecurityPolicy(std::make_unique<ContentSecurityPolicy>(*this));
    54695475
  • trunk/Source/WebCore/loader/SubresourceLoader.cpp

    r225564 r225702  
    215215            opaqueRedirectedResponse.setTainting(ResourceResponse::Tainting::Opaqueredirect);
    216216            m_resource->responseReceived(opaqueRedirectedResponse);
     217            if (reachedTerminalState())
     218                return;
    217219
    218220            NetworkLoadMetrics emptyMetrics;
     
    498500#if ENABLE(SERVICE_WORKER)
    499501    if (response.source() == ResourceResponse::Source::ServiceWorker)
    500         return true;
     502        return response.tainting() != ResourceResponse::Tainting::Opaque;
    501503#endif
    502504
  • trunk/Source/WebKit/ChangeLog

    r225700 r225702  
     12017-12-08  Youenn Fablet  <youenn@apple.com>
     2
     3        FetchResponse should keep unfiltered ResourceResponse so that it can be used in Service Worker
     4        https://bugs.webkit.org/show_bug.cgi?id=179641
     5        <rdar://problem/35923570>
     6
     7        Reviewed by Alex Christensen.
     8
     9        * WebProcess/Storage/ServiceWorkerClientFetch.cpp:
     10        (WebKit::ServiceWorkerClientFetch::didReceiveResponse): In case of opaque redirected response, handle it as a regular response.
     11
    1122017-12-08  Alex Christensen  <achristensen@webkit.org>
    213
  • trunk/Source/WebKit/WebProcess/Storage/ServiceWorkerClientFetch.cpp

    r225297 r225702  
    6666}
    6767
    68 void ServiceWorkerClientFetch::didReceiveResponse(WebCore::ResourceResponse&& response)
     68void ServiceWorkerClientFetch::didReceiveResponse(ResourceResponse&& response)
    6969{
    7070    auto protectedThis = makeRef(*this);
    7171
    72     if (response.isRedirection()) {
     72    if (response.isRedirection() && response.tainting() != ResourceResponse::Tainting::Opaqueredirect) {
    7373        m_redirectionStatus = RedirectionStatus::Receiving;
    7474        // FIXME: Get shouldClearReferrerOnHTTPSToHTTPRedirect value from
Note: See TracChangeset for help on using the changeset viewer.