Changeset 198133 in webkit


Ignore:
Timestamp:
Mar 14, 2016 8:58:14 AM (8 years ago)
Author:
youenn.fablet@crf.canon.fr
Message:

[Fetch API] Implement data resolution for blob stored in Body
https://bugs.webkit.org/show_bug.cgi?id=155359

Reviewed by Darin Adler.

LayoutTests/imported/w3c:

  • web-platform-tests/fetch/api/request/request-consume-expected.txt:
  • web-platform-tests/fetch/api/request/request-consume.html:
  • web-platform-tests/fetch/api/request/request-init-002-expected.txt:
  • web-platform-tests/fetch/api/response/response-consume-expected.txt:
  • web-platform-tests/fetch/api/response/response-consume.html:
  • web-platform-tests/fetch/api/response/response-init-002-expected.txt:

Source/WebCore:

Introducing FetchLoader as a wrapper around ThreadableLoader to load resources.
FetchLoader can retrieve data as text or array buffer. It only supports blob currently.

Introducing FetchLoaderClient interface and FetchBodyOwner::BlobLoader as specifc blob loader client.

Covered by existing rebased tests.

  • CMakeLists.txt:
  • Modules/fetch/FetchBody.cpp:

(WebCore::FetchBody::loadingType):
(WebCore::FetchBody::loadedAsArrayBuffer):
(WebCore::FetchBody::loadedAsText):

  • Modules/fetch/FetchBody.h:
  • Modules/fetch/FetchBodyOwner.cpp: Added.

(WebCore::FetchBodyOwner::FetchBodyOwner):
(WebCore::FetchBodyOwner::loadBlob):
(WebCore::FetchBodyOwner::finishBlobLoading):
(WebCore::FetchBodyOwner::blobLoadingFailed):
(WebCore::FetchBodyOwner::BlobLoader::didReceiveResponse):

  • Modules/fetch/FetchBodyOwner.h:

(WebCore::FetchBodyOwner::loadedBlobAsText):
(WebCore::FetchBodyOwner::loadedBlobAsArrayBuffer):
(WebCore::FetchBodyOwner::blobLoadingSucceeded):

  • Modules/fetch/FetchLoader.cpp: Added.

(WebCore::FetchLoader::start):
(WebCore::FetchLoader::FetchLoader):
(WebCore::FetchLoader::stop):
(WebCore::FetchLoader::didReceiveResponse):
(WebCore::FetchLoader::didReceiveData):
(WebCore::FetchLoader::didFinishLoading):
(WebCore::FetchLoader::didFail):

  • Modules/fetch/FetchLoader.h: Added.
  • Modules/fetch/FetchLoaderClient.h: Added.

(WebCore::FetchLoaderClient::~FetchLoaderClient):
(WebCore::FetchLoaderClient::didReceiveResponse):
(WebCore::FetchLoaderClient::didFinishLoadingAsText):
(WebCore::FetchLoaderClient::didFinishLoadingAsArrayBuffer):

  • WebCore.xcodeproj/project.pbxproj:
Location:
trunk
Files:
1 added
15 edited
3 copied

Legend:

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

    r198116 r198133  
     12016-03-14  Youenn Fablet  <youenn.fablet@crf.canon.fr>
     2
     3        [Fetch API] Implement data resolution for blob stored in Body
     4        https://bugs.webkit.org/show_bug.cgi?id=155359
     5
     6        Reviewed by Darin Adler.
     7
     8        * web-platform-tests/fetch/api/request/request-consume-expected.txt:
     9        * web-platform-tests/fetch/api/request/request-consume.html:
     10        * web-platform-tests/fetch/api/request/request-init-002-expected.txt:
     11        * web-platform-tests/fetch/api/response/response-consume-expected.txt:
     12        * web-platform-tests/fetch/api/response/response-consume.html:
     13        * web-platform-tests/fetch/api/response/response-init-002-expected.txt:
     14
    1152016-03-14  Youenn Fablet  <youenn.fablet@crf.canon.fr>
    216
  • trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/request/request-consume-expected.txt

    r197396 r198133  
    66FAIL Consume request's body as formData promise_test: Unhandled rejection with value: undefined
    77PASS Consume blob response's body as blob
    8 FAIL Consume blob response's body as text promise_test: Unhandled rejection with value: undefined
    9 FAIL Consume blob response's body as json promise_test: Unhandled rejection with value: undefined
    10 FAIL Consume blob response's body as arrayBuffer promise_test: Unhandled rejection with value: undefined
     8PASS Consume blob response's body as text
     9PASS Consume blob response's body as json
     10PASS Consume blob response's body as arrayBuffer
    1111PASS Consume JSON from text: '"null"'
    1212PASS Consume JSON from text: '"1"'
  • trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/request/request-consume.html

    r197396 r198133  
    8080    var formData = new FormData();
    8181    formData.append("name", "value")
    82     var textData = "This is response's body";
     82    var textData = JSON.stringify("This is response's body");
    8383    var blob = new Blob([textData], { "type" : "text/plain" });
    8484
  • trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/request/request-init-002-expected.txt

    r195954 r198133  
    11
    22PASS Initialize Request with headers values
    3 FAIL Initialize Request's body with application/octet-binary promise_test: Unhandled rejection with value: undefined
     3PASS Initialize Request's body with application/octet-binary
    44FAIL Initialize Request's body with multipart/form-data promise_test: Unhandled rejection with value: undefined
    55PASS Initialize Request's body with text/plain;charset=UTF-8
  • trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/response/response-consume-expected.txt

    r197396 r198133  
    66FAIL Consume response's body as formData promise_test: Unhandled rejection with value: undefined
    77PASS Consume blob response's body as blob
    8 FAIL Consume blob response's body as text promise_test: Unhandled rejection with value: undefined
    9 FAIL Consume blob response's body as json promise_test: Unhandled rejection with value: undefined
    10 FAIL Consume blob response's body as arrayBuffer promise_test: Unhandled rejection with value: undefined
     8PASS Consume blob response's body as text
     9PASS Consume blob response's body as json
     10PASS Consume blob response's body as arrayBuffer
    1111
  • trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/response/response-consume.html

    r197396 r198133  
    8080    var formData = new FormData();
    8181    formData.append("name", "value");
    82     var textData = "This is response's body";
     82    var textData = JSON.stringify("This is response's body");
    8383    var blob = new Blob([textData], { "type" : "text/plain" });
    8484
  • trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/response/response-init-002-expected.txt

    r197049 r198133  
    11
    22PASS Initialize Response with headers values
    3 FAIL Initialize Response's body with application/octet-binary promise_test: Unhandled rejection with value: undefined
     3PASS Initialize Response's body with application/octet-binary
    44FAIL Initialize Response's body with multipart/form-data promise_test: Unhandled rejection with value: undefined
    55FAIL Initialize Response's body with application/x-www-form-urlencoded;charset=UTF-8 assert_true: Content-Type header should be "application/x-www-form-urlencoded;charset=UTF-8"  expected true got false
  • trunk/Source/WebCore/CMakeLists.txt

    r198074 r198133  
    817817    Modules/fetch/DOMWindowFetch.cpp
    818818    Modules/fetch/FetchBody.cpp
     819    Modules/fetch/FetchBodyOwner.cpp
    819820    Modules/fetch/FetchHeaders.cpp
     821    Modules/fetch/FetchLoader.cpp
    820822    Modules/fetch/FetchRequest.cpp
    821823    Modules/fetch/FetchResponse.cpp
  • trunk/Source/WebCore/ChangeLog

    r198129 r198133  
     12016-03-14  Youenn Fablet  <youenn.fablet@crf.canon.fr>
     2
     3        [Fetch API] Implement data resolution for blob stored in Body
     4        https://bugs.webkit.org/show_bug.cgi?id=155359
     5
     6        Reviewed by Darin Adler.
     7
     8        Introducing FetchLoader as a wrapper around ThreadableLoader to load resources.
     9        FetchLoader can retrieve data as text or array buffer. It only supports blob currently.
     10
     11        Introducing FetchLoaderClient interface and FetchBodyOwner::BlobLoader as specifc blob loader client.
     12
     13        Covered by existing rebased tests.
     14
     15        * CMakeLists.txt:
     16        * Modules/fetch/FetchBody.cpp:
     17        (WebCore::FetchBody::loadingType):
     18        (WebCore::FetchBody::loadedAsArrayBuffer):
     19        (WebCore::FetchBody::loadedAsText):
     20        * Modules/fetch/FetchBody.h:
     21        * Modules/fetch/FetchBodyOwner.cpp: Added.
     22        (WebCore::FetchBodyOwner::FetchBodyOwner):
     23        (WebCore::FetchBodyOwner::loadBlob):
     24        (WebCore::FetchBodyOwner::finishBlobLoading):
     25        (WebCore::FetchBodyOwner::blobLoadingFailed):
     26        (WebCore::FetchBodyOwner::BlobLoader::didReceiveResponse):
     27        * Modules/fetch/FetchBodyOwner.h:
     28        (WebCore::FetchBodyOwner::loadedBlobAsText):
     29        (WebCore::FetchBodyOwner::loadedBlobAsArrayBuffer):
     30        (WebCore::FetchBodyOwner::blobLoadingSucceeded):
     31        * Modules/fetch/FetchLoader.cpp: Added.
     32        (WebCore::FetchLoader::start):
     33        (WebCore::FetchLoader::FetchLoader):
     34        (WebCore::FetchLoader::stop):
     35        (WebCore::FetchLoader::didReceiveResponse):
     36        (WebCore::FetchLoader::didReceiveData):
     37        (WebCore::FetchLoader::didFinishLoading):
     38        (WebCore::FetchLoader::didFail):
     39        * Modules/fetch/FetchLoader.h: Added.
     40        * Modules/fetch/FetchLoaderClient.h: Added.
     41        (WebCore::FetchLoaderClient::~FetchLoaderClient):
     42        (WebCore::FetchLoaderClient::didReceiveResponse):
     43        (WebCore::FetchLoaderClient::didFinishLoadingAsText):
     44        (WebCore::FetchLoaderClient::didFinishLoadingAsArrayBuffer):
     45        * WebCore.xcodeproj/project.pbxproj:
     46
    1472016-03-14  Frederic Wang  <fwang@igalia.com>
    248
  • trunk/Source/WebCore/Modules/fetch/FetchBody.cpp

    r198005 r198133  
    136136        return;
    137137
     138    if (!owner.scriptExecutionContext())
     139        return;
     140
    138141    if (m_type == Type::Text) {
    139         resolveAsJSON(owner.scriptExecutionContext(), m_text, WTFMove(promise));
     142        resolveAsJSON(*owner.scriptExecutionContext(), m_text, WTFMove(promise));
    140143        return;
    141144    }
     
    183186}
    184187
    185 FetchLoadingType FetchBody::loadingType(Consumer::Type type)
     188FetchLoader::Type FetchBody::loadingType(Consumer::Type type)
    186189{
    187190    switch (type) {
    188191    case Consumer::Type::JSON:
    189192    case Consumer::Type::Text:
    190         return FetchLoadingType::Text;
     193        return FetchLoader::Type::Text;
    191194    case Consumer::Type::Blob:
    192         return FetchLoadingType::Blob;
    193195    case Consumer::Type::ArrayBuffer:
    194         return FetchLoadingType::ArrayBuffer;
     196        return FetchLoader::Type::ArrayBuffer;
    195197    default:
    196198        ASSERT_NOT_REACHED();
    197         return FetchLoadingType::ArrayBuffer;
     199        return FetchLoader::Type::ArrayBuffer;
    198200    };
    199201}
     
    207209}
    208210
    209 void FetchBody::resolveAsJSON(ScriptExecutionContext* context, const String& data, DeferredWrapper&& promise)
    210 {
    211     DOMRequestState state(context);
     211void FetchBody::resolveAsJSON(ScriptExecutionContext& context, const String& data, DeferredWrapper&& promise)
     212{
     213    DOMRequestState state(&context);
    212214    JSC::JSValue value = JSC::JSONParse(state.exec(), data);
    213215    if (!value)
     
    234236}
    235237
    236 void FetchBody::loadedAsBlob(Blob& blob)
     238void FetchBody::loadedAsArrayBuffer(RefPtr<ArrayBuffer>&& buffer)
    237239{
    238240    ASSERT(m_consumer);
    239     m_consumer->promise.resolve(&blob);
     241    ASSERT(m_consumer->type == Consumer::Type::Blob || m_consumer->type == Consumer::Type::ArrayBuffer);
     242    if (m_consumer->type == Consumer::Type::ArrayBuffer)
     243        m_consumer->promise.resolve(buffer);
     244    else {
     245        ASSERT(m_blob);
     246        Vector<char> data;
     247        data.reserveCapacity(buffer->byteLength());
     248        data.append(static_cast<const char*>(buffer->data()), buffer->byteLength());
     249        m_consumer->promise.resolve<RefPtr<Blob>>(Blob::create(WTFMove(data), m_blob->type()));
     250    }
    240251    m_consumer = Nullopt;
    241252}
    242253
     254void FetchBody::loadedAsText(ScriptExecutionContext& context, String&& text)
     255{
     256    ASSERT(m_consumer);
     257    ASSERT(m_consumer->type == Consumer::Type::Text || m_consumer->type == Consumer::Type::JSON);
     258    if (m_consumer->type == Consumer::Type::Text)
     259        m_consumer->promise.resolve(text);
     260    else
     261        resolveAsJSON(context, text, WTFMove(m_consumer->promise));
     262    m_consumer = Nullopt;
     263}
     264
    243265}
    244266
  • trunk/Source/WebCore/Modules/fetch/FetchBody.h

    r198005 r198133  
    3434#include "Blob.h"
    3535#include "DOMFormData.h"
     36#include "FetchLoader.h"
    3637#include "JSDOMPromise.h"
    3738
     
    4445
    4546class FetchBodyOwner;
    46 enum class FetchLoadingType;
    4747
    4848class FetchBody {
     
    6565
    6666    void loadingFailed();
    67     void loadedAsBlob(Blob&);
     67    void loadedAsArrayBuffer(RefPtr<ArrayBuffer>&&);
     68    void loadedAsText(ScriptExecutionContext&, String&&);
    6869
    6970private:
     
    8687    void consumeText(Consumer::Type, DeferredWrapper&&);
    8788    void consumeBlob(FetchBodyOwner&, Consumer::Type, DeferredWrapper&&);
    88     void resolveAsJSON(ScriptExecutionContext*, const String&, DeferredWrapper&&);
    89     static FetchLoadingType loadingType(Consumer::Type);
     89    void resolveAsJSON(ScriptExecutionContext&, const String&, DeferredWrapper&&);
     90    static FetchLoader::Type loadingType(Consumer::Type);
    9091
    9192    Type m_type = Type::None;
  • trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp

    r198132 r198133  
    2727 */
    2828
    29 #ifndef FetchBodyOwner_h
    30 #define FetchBodyOwner_h
     29#include "config.h"
     30#include "FetchBodyOwner.h"
    3131
    3232#if ENABLE(FETCH_API)
    3333
    34 #include "ActiveDOMObject.h"
    35 #include "FetchBody.h"
     34#include "FetchLoader.h"
     35#include "ResourceResponse.h"
    3636
    3737namespace WebCore {
    3838
    39 enum class FetchLoadingType { Text, ArrayBuffer, Blob };
    40 
    41 class FetchBodyOwner : public RefCounted<FetchBodyOwner>, public ActiveDOMObject {
    42 public:
    43     FetchBodyOwner(ScriptExecutionContext&, FetchBody&&);
    44 
    45     // Exposed Body API
    46     bool isDisturbed() const { return m_body.isDisturbed(); }
    47     void arrayBuffer(DeferredWrapper&& promise) { m_body.arrayBuffer(*this, WTFMove(promise)); }
    48     void blob(DeferredWrapper&& promise) { m_body.blob(*this, WTFMove(promise)); }
    49     void formData(DeferredWrapper&& promise) { m_body.formData(*this, WTFMove(promise)); }
    50     void json(DeferredWrapper&& promise) { m_body.json(*this, WTFMove(promise)); }
    51     void text(DeferredWrapper&& promise) { m_body.text(*this, WTFMove(promise)); }
    52 
    53     void loadBlob(Blob&, FetchLoadingType);
    54 
    55 protected:
    56     FetchBody m_body;
    57 };
    58 
    59 inline FetchBodyOwner::FetchBodyOwner(ScriptExecutionContext& context, FetchBody&& body)
     39FetchBodyOwner::FetchBodyOwner(ScriptExecutionContext& context, FetchBody&& body)
    6040    : ActiveDOMObject(&context)
    6141    , m_body(WTFMove(body))
     
    6444}
    6545
    66 inline void FetchBodyOwner::loadBlob(Blob& blob, FetchLoadingType type)
     46void FetchBodyOwner::stop()
    6747{
    68     if (type == FetchLoadingType::Blob) {
    69         // FIXME: Clone blob.
    70         m_body.loadedAsBlob(blob);
    71         return;
     48    if (m_blobLoader) {
     49        if (m_blobLoader->loader)
     50            m_blobLoader->loader->stop();
     51        finishBlobLoading();
    7252    }
    73     // FIXME: Implement blob loading.
     53    ASSERT(!m_blobLoader);
     54}
     55
     56void FetchBodyOwner::loadBlob(Blob& blob, FetchLoader::Type type)
     57{
     58    // Can only be called once for a body instance.
     59    ASSERT(m_body.isDisturbed());
     60    ASSERT(!m_blobLoader);
     61
     62    m_blobLoader = { *this };
     63    m_blobLoader->loader = std::make_unique<FetchLoader>(type, *m_blobLoader);
     64
     65    setPendingActivity(this);
     66    if (!scriptExecutionContext() || !m_blobLoader->loader->start(*scriptExecutionContext(), blob))
     67        blobLoadingFailed();
     68}
     69
     70void FetchBodyOwner::loadedBlobAsText(String&& text)
     71{
     72    ASSERT(*scriptExecutionContext());
     73
     74    m_body.loadedAsText(*scriptExecutionContext(), WTFMove(text));
     75}
     76
     77void FetchBodyOwner::finishBlobLoading()
     78{
     79    ASSERT(m_blobLoader);
     80
     81    m_blobLoader = Nullopt;
     82    unsetPendingActivity(this);
     83}
     84
     85void FetchBodyOwner::blobLoadingFailed()
     86{
    7487    m_body.loadingFailed();
     88    finishBlobLoading();
     89}
     90
     91FetchBodyOwner::BlobLoader::BlobLoader(FetchBodyOwner& owner)
     92    : owner(owner)
     93{
     94}
     95
     96void FetchBodyOwner::BlobLoader::didReceiveResponse(const ResourceResponse& response)
     97{
     98    if (response.httpStatusCode() != 200)
     99        didFail();
    75100}
    76101
     
    78103
    79104#endif // ENABLE(FETCH_API)
    80 
    81 #endif // FetchBodyOwner_h
  • trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.h

    r198005 r198133  
    3434#include "ActiveDOMObject.h"
    3535#include "FetchBody.h"
     36#include "FetchLoader.h"
     37#include "FetchLoaderClient.h"
    3638
    3739namespace WebCore {
    38 
    39 enum class FetchLoadingType { Text, ArrayBuffer, Blob };
    4040
    4141class FetchBodyOwner : public RefCounted<FetchBodyOwner>, public ActiveDOMObject {
     
    5151    void text(DeferredWrapper&& promise) { m_body.text(*this, WTFMove(promise)); }
    5252
    53     void loadBlob(Blob&, FetchLoadingType);
     53    void loadBlob(Blob&, FetchLoader::Type);
     54
     55    bool isActive() const { return !!m_blobLoader; }
     56
     57private:
     58    // Blob loading routines
     59    void loadedBlobAsText(String&&);
     60    void loadedBlobAsArrayBuffer(RefPtr<ArrayBuffer>&& buffer) { m_body.loadedAsArrayBuffer(WTFMove(buffer)); }
     61    void blobLoadingSucceeded() { finishBlobLoading(); }
     62    void blobLoadingFailed();
     63    void finishBlobLoading();
     64
     65    // ActiveDOMObject API
     66    void stop() override;
     67
     68    struct BlobLoader final : FetchLoaderClient {
     69        BlobLoader(FetchBodyOwner&);
     70
     71        // FetchLoaderClient API
     72        void didFinishLoadingAsText(String&& text) final { owner.loadedBlobAsText(WTFMove(text)); }
     73        void didFinishLoadingAsArrayBuffer(RefPtr<ArrayBuffer>&& buffer) final { owner.loadedBlobAsArrayBuffer(WTFMove(buffer)); }
     74        void didReceiveResponse(const ResourceResponse&) final;
     75        void didFail() final { owner.blobLoadingFailed(); };
     76        void didSucceed() final { owner.blobLoadingSucceeded(); }
     77
     78        FetchBodyOwner& owner;
     79        std::unique_ptr<FetchLoader> loader;
     80    };
    5481
    5582protected:
    5683    FetchBody m_body;
     84
     85private:
     86    Optional<BlobLoader> m_blobLoader;
    5787};
    58 
    59 inline FetchBodyOwner::FetchBodyOwner(ScriptExecutionContext& context, FetchBody&& body)
    60     : ActiveDOMObject(&context)
    61     , m_body(WTFMove(body))
    62 {
    63     suspendIfNeeded();
    64 }
    65 
    66 inline void FetchBodyOwner::loadBlob(Blob& blob, FetchLoadingType type)
    67 {
    68     if (type == FetchLoadingType::Blob) {
    69         // FIXME: Clone blob.
    70         m_body.loadedAsBlob(blob);
    71         return;
    72     }
    73     // FIXME: Implement blob loading.
    74     m_body.loadingFailed();
    75 }
    7688
    7789} // namespace WebCore
  • trunk/Source/WebCore/Modules/fetch/FetchLoader.h

    r198132 r198133  
    2727 */
    2828
    29 #ifndef FetchBodyOwner_h
    30 #define FetchBodyOwner_h
     29#ifndef FetchLoader_h
     30#define FetchLoader_h
    3131
    3232#if ENABLE(FETCH_API)
    3333
    34 #include "ActiveDOMObject.h"
    35 #include "FetchBody.h"
     34#include "SharedBuffer.h"
     35#include "ThreadableLoader.h"
     36#include "ThreadableLoaderClient.h"
    3637
    3738namespace WebCore {
    3839
    39 enum class FetchLoadingType { Text, ArrayBuffer, Blob };
     40class Blob;
     41class FetchLoaderClient;
     42class ScriptExecutionContext;
    4043
    41 class FetchBodyOwner : public RefCounted<FetchBodyOwner>, public ActiveDOMObject {
     44class FetchLoader final : public ThreadableLoaderClient {
    4245public:
    43     FetchBodyOwner(ScriptExecutionContext&, FetchBody&&);
     46    enum class Type { ArrayBuffer, Text };
    4447
    45     // Exposed Body API
    46     bool isDisturbed() const { return m_body.isDisturbed(); }
    47     void arrayBuffer(DeferredWrapper&& promise) { m_body.arrayBuffer(*this, WTFMove(promise)); }
    48     void blob(DeferredWrapper&& promise) { m_body.blob(*this, WTFMove(promise)); }
    49     void formData(DeferredWrapper&& promise) { m_body.formData(*this, WTFMove(promise)); }
    50     void json(DeferredWrapper&& promise) { m_body.json(*this, WTFMove(promise)); }
    51     void text(DeferredWrapper&& promise) { m_body.text(*this, WTFMove(promise)); }
     48    FetchLoader(Type, FetchLoaderClient&);
    5249
    53     void loadBlob(Blob&, FetchLoadingType);
     50    bool start(ScriptExecutionContext&, Blob&);
     51    void stop();
    5452
    55 protected:
    56     FetchBody m_body;
     53private:
     54    // ThreadableLoaderClient API.
     55    void didReceiveResponse(unsigned long, const ResourceResponse&) final;
     56    void didReceiveData(const char*, int) final;
     57    void didFinishLoading(unsigned long, double) final;
     58    void didFail(const ResourceError&) final;
     59
     60private:
     61    Type m_type { Type::ArrayBuffer };
     62    FetchLoaderClient& m_client;
     63    RefPtr<ThreadableLoader> m_loader;
     64    RefPtr<SharedBuffer> m_data;
    5765};
    58 
    59 inline FetchBodyOwner::FetchBodyOwner(ScriptExecutionContext& context, FetchBody&& body)
    60     : ActiveDOMObject(&context)
    61     , m_body(WTFMove(body))
    62 {
    63     suspendIfNeeded();
    64 }
    65 
    66 inline void FetchBodyOwner::loadBlob(Blob& blob, FetchLoadingType type)
    67 {
    68     if (type == FetchLoadingType::Blob) {
    69         // FIXME: Clone blob.
    70         m_body.loadedAsBlob(blob);
    71         return;
    72     }
    73     // FIXME: Implement blob loading.
    74     m_body.loadingFailed();
    75 }
    7666
    7767} // namespace WebCore
     
    7969#endif // ENABLE(FETCH_API)
    8070
    81 #endif // FetchBodyOwner_h
     71#endif // FetchLoader_h
  • trunk/Source/WebCore/Modules/fetch/FetchLoaderClient.h

    r198132 r198133  
    2727 */
    2828
    29 #ifndef FetchBodyOwner_h
    30 #define FetchBodyOwner_h
     29#ifndef FetchLoaderClient_h
     30#define FetchLoaderClient_h
    3131
    3232#if ENABLE(FETCH_API)
    3333
    34 #include "ActiveDOMObject.h"
    35 #include "FetchBody.h"
     34#include <wtf/Forward.h>
     35
     36namespace JSC {
     37class ArrayBuffer;
     38}
    3639
    3740namespace WebCore {
    3841
    39 enum class FetchLoadingType { Text, ArrayBuffer, Blob };
     42class ResourceResponse;
    4043
    41 class FetchBodyOwner : public RefCounted<FetchBodyOwner>, public ActiveDOMObject {
     44class FetchLoaderClient {
    4245public:
    43     FetchBodyOwner(ScriptExecutionContext&, FetchBody&&);
     46    virtual ~FetchLoaderClient() { }
    4447
    45     // Exposed Body API
    46     bool isDisturbed() const { return m_body.isDisturbed(); }
    47     void arrayBuffer(DeferredWrapper&& promise) { m_body.arrayBuffer(*this, WTFMove(promise)); }
    48     void blob(DeferredWrapper&& promise) { m_body.blob(*this, WTFMove(promise)); }
    49     void formData(DeferredWrapper&& promise) { m_body.formData(*this, WTFMove(promise)); }
    50     void json(DeferredWrapper&& promise) { m_body.json(*this, WTFMove(promise)); }
    51     void text(DeferredWrapper&& promise) { m_body.text(*this, WTFMove(promise)); }
     48    virtual void didReceiveResponse(const ResourceResponse&) { }
    5249
    53     void loadBlob(Blob&, FetchLoadingType);
     50    virtual void didFinishLoadingAsText(String&&) { }
     51    virtual void didFinishLoadingAsArrayBuffer(RefPtr<JSC::ArrayBuffer>&&) { }
    5452
    55 protected:
    56     FetchBody m_body;
     53    virtual void didSucceed() = 0;
     54    virtual void didFail() = 0;
    5755};
    58 
    59 inline FetchBodyOwner::FetchBodyOwner(ScriptExecutionContext& context, FetchBody&& body)
    60     : ActiveDOMObject(&context)
    61     , m_body(WTFMove(body))
    62 {
    63     suspendIfNeeded();
    64 }
    65 
    66 inline void FetchBodyOwner::loadBlob(Blob& blob, FetchLoadingType type)
    67 {
    68     if (type == FetchLoadingType::Blob) {
    69         // FIXME: Clone blob.
    70         m_body.loadedAsBlob(blob);
    71         return;
    72     }
    73     // FIXME: Implement blob loading.
    74     m_body.loadingFailed();
    75 }
    7656
    7757} // namespace WebCore
     
    7959#endif // ENABLE(FETCH_API)
    8060
    81 #endif // FetchBodyOwner_h
     61#endif // FetchLoaderClient_h
  • trunk/Source/WebCore/Modules/fetch/FetchRequest.cpp

    r198002 r198133  
    454454bool FetchRequest::canSuspendForDocumentSuspension() const
    455455{
    456     return true;
     456    // FIXME: We can probably do the same strategy as XHR.
     457    return !isActive();
    457458}
    458459
  • trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp

    r198002 r198133  
    161161bool FetchResponse::canSuspendForDocumentSuspension() const
    162162{
    163     return true;
     163    // FIXME: We can probably do the same strategy as XHR.
     164    return !isActive();
    164165}
    165166
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r198092 r198133  
    15221522                4138D3361244054800323D33 /* EventContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4138D3341244054800323D33 /* EventContext.cpp */; };
    15231523                413C2C341BC29A8F0075204C /* JSDOMConstructor.h in Headers */ = {isa = PBXBuildFile; fileRef = 413C2C331BC29A7B0075204C /* JSDOMConstructor.h */; };
     1524                4147E2B71C89912C00A7E715 /* FetchLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4147E2B41C89912600A7E715 /* FetchLoader.cpp */; };
     1525                4147E2B81C89912F00A7E715 /* FetchBodyOwner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4147E2B31C89912600A7E715 /* FetchBodyOwner.cpp */; };
    15241526                415071571685067300C3C7B3 /* SelectorFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 415071551685067300C3C7B3 /* SelectorFilter.cpp */; };
    15251527                415071581685067300C3C7B3 /* SelectorFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 415071561685067300C3C7B3 /* SelectorFilter.h */; };
     
    90029004                413C2C331BC29A7B0075204C /* JSDOMConstructor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSDOMConstructor.h; sourceTree = "<group>"; };
    90039005                4147E2B21C88337F00A7E715 /* FetchBodyOwner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FetchBodyOwner.h; sourceTree = "<group>"; };
     9006                4147E2B31C89912600A7E715 /* FetchBodyOwner.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FetchBodyOwner.cpp; sourceTree = "<group>"; };
     9007                4147E2B41C89912600A7E715 /* FetchLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FetchLoader.cpp; sourceTree = "<group>"; };
     9008                4147E2B51C89912600A7E715 /* FetchLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FetchLoader.h; sourceTree = "<group>"; };
     9009                4147E2B61C89912600A7E715 /* FetchLoaderClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FetchLoaderClient.h; sourceTree = "<group>"; };
    90049010                415071551685067300C3C7B3 /* SelectorFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SelectorFilter.cpp; sourceTree = "<group>"; };
    90059011                415071561685067300C3C7B3 /* SelectorFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SelectorFilter.h; sourceTree = "<group>"; };
     
    1682416830                                41F54F7E1C50C4F600338488 /* FetchBody.h */,
    1682516831                                41F54F7F1C50C4F600338488 /* FetchBody.idl */,
     16832                                4147E2B31C89912600A7E715 /* FetchBodyOwner.cpp */,
    1682616833                                4147E2B21C88337F00A7E715 /* FetchBodyOwner.h */,
    1682716834                                41F54F821C50C4F600338488 /* FetchHeaders.cpp */,
     
    1682916836                                41F54F841C50C4F600338488 /* FetchHeaders.idl */,
    1683016837                                41F54F851C50C4F600338488 /* FetchHeaders.js */,
     16838                                4147E2B41C89912600A7E715 /* FetchLoader.cpp */,
     16839                                4147E2B51C89912600A7E715 /* FetchLoader.h */,
     16840                                4147E2B61C89912600A7E715 /* FetchLoaderClient.h */,
    1683116841                                41F54F861C50C4F600338488 /* FetchOptions.h */,
    1683216842                                41F54F871C50C4F600338488 /* FetchRequest.cpp */,
     
    3054830558                                07969DC317D14151007FF842 /* JSRTCStatsResponse.cpp in Sources */,
    3054930559                                07DC5FD417D3EEE90099F890 /* JSRTCStatsResponseCustom.cpp in Sources */,
     30560                                4147E2B81C89912F00A7E715 /* FetchBodyOwner.cpp in Sources */,
    3055030561                                5E2C436B1BCF071E0001E2BC /* JSRTCTrackEvent.cpp in Sources */,
    3055130562                                BCEC01C20C274DDD009F4EC9 /* JSScreen.cpp in Sources */,
     
    3188231893                                854FE7380A2297BE0058D7AD /* TreeWalker.cpp in Sources */,
    3188331894                                C375D7FD16639519006184AB /* TypeAhead.cpp in Sources */,
     31895                                4147E2B71C89912C00A7E715 /* FetchLoader.cpp in Sources */,
    3188431896                                93309E19099E64920056E581 /* TypingCommand.cpp in Sources */,
    3188531897                                85031B4D0A44EFC700F992E0 /* UIEvent.cpp in Sources */,
Note: See TracChangeset for help on using the changeset viewer.