Changeset 200235 in webkit


Ignore:
Timestamp:
Apr 29, 2016 1:15:10 AM (8 years ago)
Author:
youenn.fablet@crf.canon.fr
Message:

FetchResponse should return a ReadableStream even if disturbed
https://bugs.webkit.org/show_bug.cgi?id=156911

Reviewed by Darin Adler.

LayoutTests/imported/w3c:

  • web-platform-tests/fetch/api/response/response-stream-disturbed-5-expected.txt: Rebasing test.

Source/WebCore:

Covered by rebased test.

  • Modules/fetch/FetchResponse.cpp:

(WebCore::FetchResponse::createReadableStreamSource): Asserting in case response is disturbed.

  • bindings/js/JSFetchResponseCustom.cpp:

(WebCore::JSFetchResponse::body): Creating a locked empty readable stream if response is disturbed.

  • bindings/js/ReadableStreamController.cpp:

(WebCore::createReadableStream): Constructing a readable stream even if source is null.
(WebCore::getReadableStreamReader): Retrieving the reader from a readable stream. Stream must not be locked.

  • bindings/js/ReadableStreamController.h:
Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r200234 r200235  
     12016-04-29  Youenn Fablet  <youenn.fablet@crf.canon.fr>
     2
     3        FetchResponse should return a ReadableStream even if disturbed
     4        https://bugs.webkit.org/show_bug.cgi?id=156911
     5
     6        Reviewed by Darin Adler.
     7
     8        * web-platform-tests/fetch/api/response/response-stream-disturbed-5-expected.txt: Rebasing test.
     9
    1102016-04-29  Ryosuke Niwa  <rniwa@webkit.org>
    211
  • trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/response/response-stream-disturbed-5-expected.txt

    r199825 r200235  
    11
    2 FAIL Getting a body reader after consuming as blob assert_not_equals: got disallowed value null
    3 FAIL Getting a body reader after consuming as text assert_not_equals: got disallowed value null
    4 FAIL Getting a body reader after consuming as json assert_not_equals: got disallowed value null
    5 FAIL Getting a body reader after consuming as arrayBuffer assert_not_equals: got disallowed value null
     2PASS Getting a body reader after consuming as blob
     3PASS Getting a body reader after consuming as text
     4PASS Getting a body reader after consuming as json
     5PASS Getting a body reader after consuming as arrayBuffer
    66
  • trunk/Source/WebCore/ChangeLog

    r200232 r200235  
     12016-04-29  Youenn Fablet  <youenn.fablet@crf.canon.fr>
     2
     3        FetchResponse should return a ReadableStream even if disturbed
     4        https://bugs.webkit.org/show_bug.cgi?id=156911
     5
     6        Reviewed by Darin Adler.
     7
     8        Covered by rebased test.
     9
     10        * Modules/fetch/FetchResponse.cpp:
     11        (WebCore::FetchResponse::createReadableStreamSource): Asserting in case response is disturbed.
     12        * bindings/js/JSFetchResponseCustom.cpp:
     13        (WebCore::JSFetchResponse::body): Creating a locked empty readable stream if response is disturbed.
     14        * bindings/js/ReadableStreamController.cpp:
     15        (WebCore::createReadableStream): Constructing a readable stream even if source is null.
     16        (WebCore::getReadableStreamReader): Retrieving the reader from a readable stream. Stream must not be locked.
     17        * bindings/js/ReadableStreamController.h:
     18
    1192016-04-29  Yoav Weiss  <yoav@yoav.ws>
    220
  • trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp

    r199641 r200235  
    294294{
    295295    ASSERT(!m_readableStreamSource);
    296     if (body().isEmpty() || isDisturbed())
     296    ASSERT(!isDisturbed());
     297
     298    if (body().isEmpty())
    297299        return nullptr;
    298300
  • trunk/Source/WebCore/bindings/js/JSFetchResponseCustom.cpp

    r199641 r200235  
    3939{
    4040#if ENABLE(STREAMS_API)
    41     if (!m_body)
    42         m_body.set(state.vm(), this, createReadableStream(state, globalObject(), wrapped().createReadableStreamSource()));
     41    if (!m_body) {
     42        JSC::JSValue readableStream;
     43        if (wrapped().isDisturbed()) {
     44            readableStream = createReadableStream(state, globalObject(), nullptr);
     45            // Let's get the reader to lock it.
     46            getReadableStreamReader(state, readableStream);
     47        } else {
     48            ReadableStreamSource* source = wrapped().createReadableStreamSource();
     49            readableStream = source ? createReadableStream(state, globalObject(), source) : JSC::jsNull();
     50        }
     51        m_body.set(state.vm(), this, readableStream);
     52    }
    4353    return m_body.get();
    4454#else
  • trunk/Source/WebCore/bindings/js/ReadableStreamController.cpp

    r199641 r200235  
    8787JSC::JSValue createReadableStream(JSC::ExecState& state, JSDOMGlobalObject* globalObject, ReadableStreamSource* source)
    8888{
    89     if (!source)
    90         return JSC::jsNull();
    91 
    9289    JSC::JSLockHolder lock(&state);
    9390
    94     JSC::JSValue jsSource = toJS(&state, globalObject, source);
     91    JSC::JSValue jsSource = source ? toJS(&state, globalObject, source) : JSC::jsUndefined();
    9592    JSC::Strong<JSC::Unknown> protect(state.vm(), jsSource);
    9693
     
    107104}
    108105
     106JSC::JSValue getReadableStreamReader(JSC::ExecState& state, JSC::JSValue readableStream)
     107{
     108    ASSERT(readableStream.isObject());
     109
     110    JSC::JSValue getReader = readableStream.getObject()->get(&state, JSC::Identifier::fromString(&state, "getReader"));
     111    ASSERT(!state.hadException());
     112
     113    JSC::JSValue reader = callFunction(state, getReader, readableStream, JSC::MarkedArgumentBuffer());
     114    ASSERT(!state.hadException());
     115
     116    return reader;
     117}
     118
    109119} // namespace WebCore
    110120
  • trunk/Source/WebCore/bindings/js/ReadableStreamController.h

    r199641 r200235  
    6868
    6969JSC::JSValue createReadableStream(JSC::ExecState&, JSDOMGlobalObject*, ReadableStreamSource*);
     70JSC::JSValue getReadableStreamReader(JSC::ExecState&, JSC::JSValue);
    7071
    7172inline JSDOMGlobalObject* ReadableStreamController::globalObject() const
Note: See TracChangeset for help on using the changeset viewer.