Get rid of unnecessary null check in wrap(JSDOMGlobalObject*, DOMClass*)
[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 FetchResponseSource;
48 class FormData;
49
50 class FetchBody {
51 public:
52     void arrayBuffer(FetchBodyOwner&, DeferredWrapper&&);
53     void blob(FetchBodyOwner&, DeferredWrapper&&);
54     void json(FetchBodyOwner&, DeferredWrapper&&);
55     void text(FetchBodyOwner&, DeferredWrapper&&);
56     void formData(FetchBodyOwner&, DeferredWrapper&& promise) { promise.reject<ExceptionCode>(0); }
57
58 #if ENABLE(STREAMS_API)
59     void consumeAsStream(FetchBodyOwner&, FetchResponseSource&);
60 #endif
61
62     bool isEmpty() const { return m_type == Type::None; }
63
64     void setMimeType(const String& mimeType) { m_mimeType = mimeType; }
65     String mimeType() const { return m_mimeType; }
66
67     static FetchBody extract(JSC::ExecState&, JSC::JSValue);
68     static FetchBody extractFromBody(FetchBody*);
69     static FetchBody loadingBody() { return { Type::Loading }; }
70     FetchBody() = default;
71
72     void loadingFailed();
73     void loadedAsArrayBuffer(RefPtr<ArrayBuffer>&&);
74     void loadedAsText(String&&);
75
76     RefPtr<FormData> bodyForInternalRequest() const;
77
78     enum class Type { None, ArrayBuffer, Loading, Text, Blob, FormData };
79     Type type() const { return m_type; }
80
81 private:
82     FetchBody(Ref<Blob>&&);
83     FetchBody(Ref<DOMFormData>&&);
84     FetchBody(String&&);
85     FetchBody(Type type) : m_type(type) { }
86
87     struct Consumer {
88         enum class Type { Text, Blob, JSON, ArrayBuffer };
89
90         Type type;
91         DeferredWrapper promise;
92     };
93     void consume(FetchBodyOwner&, Consumer::Type, DeferredWrapper&&);
94
95     Vector<uint8_t> extractFromText() const;
96     void consumeArrayBuffer(Consumer::Type, DeferredWrapper&);
97     void consumeText(Consumer::Type, DeferredWrapper&);
98     void consumeBlob(FetchBodyOwner&, Consumer::Type, DeferredWrapper&&);
99     static FetchLoader::Type loadingType(Consumer::Type);
100     static void fulfillTextPromise(FetchBody::Consumer::Type, const String&, DeferredWrapper&);
101     static void fulfillArrayBufferPromise(FetchBody::Consumer::Type, const String&, DeferredWrapper&);
102
103     Type m_type { Type::None };
104     String m_mimeType;
105
106     // FIXME: Add support for BufferSource and URLSearchParams.
107     RefPtr<Blob> m_blob;
108     RefPtr<DOMFormData> m_formData;
109     RefPtr<ArrayBuffer> m_data;
110     String m_text;
111
112     Optional<Consumer> m_consumer;
113 };
114
115 } // namespace WebCore
116
117 #endif // ENABLE(FETCH_API)
118
119 #endif // FetchBody_h