[Fetch API] Add basic loading of resources
[WebKit-https.git] / Source / WebCore / Modules / fetch / FetchBody.h
1 /*
2  * Copyright (C) 2016 Canon Inc.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted, provided that the following conditions
6  * are required to be met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  * 3.  Neither the name of Canon Inc. nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY CANON INC. AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL CANON INC. AND ITS CONTRIBUTORS BE LIABLE FOR
21  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
23  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
24  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
25  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #ifndef FetchBody_h
30 #define FetchBody_h
31
32 #if ENABLE(FETCH_API)
33
34 #include "Blob.h"
35 #include "DOMFormData.h"
36 #include "FetchLoader.h"
37 #include "JSDOMPromise.h"
38
39 namespace JSC {
40 class ExecState;
41 class JSValue;
42 };
43
44 namespace WebCore {
45
46 class FetchBodyOwner;
47 class FormData;
48
49 class FetchBody {
50 public:
51     void arrayBuffer(FetchBodyOwner&, DeferredWrapper&&);
52     void blob(FetchBodyOwner&, DeferredWrapper&&);
53     void json(FetchBodyOwner&, DeferredWrapper&&);
54     void text(FetchBodyOwner&, DeferredWrapper&&);
55     void formData(FetchBodyOwner&, DeferredWrapper&& promise) { promise.reject<ExceptionCode>(0); }
56
57     bool isDisturbed() const { return m_isDisturbed; }
58     bool isEmpty() const { return m_type == Type::None; }
59
60     void setMimeType(const String& mimeType) { m_mimeType = mimeType; }
61     String mimeType() const { return m_mimeType; }
62
63     static FetchBody extract(JSC::ExecState&, JSC::JSValue);
64     static FetchBody extractFromBody(FetchBody*);
65     static FetchBody loadingBody() { return { Type::Loading }; }
66     FetchBody() = default;
67
68     void loadingFailed();
69     void loadedAsArrayBuffer(RefPtr<ArrayBuffer>&&);
70     void loadedAsText(String&&);
71
72     RefPtr<FormData> bodyForInternalRequest() const;
73
74 private:
75     enum class Type { None, ArrayBuffer, Loading, Text, Blob, FormData };
76
77     FetchBody(Ref<Blob>&&);
78     FetchBody(Ref<DOMFormData>&&);
79     FetchBody(String&&);
80     FetchBody(Type type) : m_type(type) { }
81
82     struct Consumer {
83         enum class Type { Text, Blob, JSON, ArrayBuffer };
84
85         Type type;
86         DeferredWrapper promise;
87     };
88     void consume(FetchBodyOwner&, Consumer::Type, DeferredWrapper&&);
89
90     Vector<char> extractFromText() const;
91     bool processIfEmptyOrDisturbed(Consumer::Type, DeferredWrapper&);
92     void consumeArrayBuffer(Consumer::Type, DeferredWrapper&);
93     void consumeText(Consumer::Type, DeferredWrapper&);
94     void consumeBlob(FetchBodyOwner&, Consumer::Type, DeferredWrapper&&);
95     static FetchLoader::Type loadingType(Consumer::Type);
96     static void fulfillTextPromise(FetchBody::Consumer::Type, const String&, DeferredWrapper&);
97     static void fulfillArrayBufferPromise(FetchBody::Consumer::Type, const String&, DeferredWrapper&);
98
99     Type m_type { Type::None };
100     String m_mimeType;
101     bool m_isDisturbed { false };
102
103     // FIXME: Add support for BufferSource and URLSearchParams.
104     RefPtr<Blob> m_blob;
105     RefPtr<DOMFormData> m_formData;
106     RefPtr<ArrayBuffer> m_data;
107     String m_text;
108
109     Optional<Consumer> m_consumer;
110 };
111
112 } // namespace WebCore
113
114 #endif // ENABLE(FETCH_API)
115
116 #endif // FetchBody_h