Unreviewed, fix the internal macOS 10.13 and 10.14 builds after r251171
[WebKit-https.git] / Source / WebCore / xml / XMLHttpRequest.h
1 /*
2  *  Copyright (C) 2003, 2006, 2008 Apple Inc. All rights reserved.
3  *  Copyright (C) 2005, 2006 Alexey Proskuryakov <ap@nypop.com>
4  *  Copyright (C) 2011 Google Inc. All rights reserved.
5  *  Copyright (C) 2012 Intel Corporation
6  *
7  *  This library is free software; you can redistribute it and/or
8  *  modify it under the terms of the GNU Lesser General Public
9  *  License as published by the Free Software Foundation; either
10  *  version 2 of the License, or (at your option) any later version.
11  *
12  *  This library is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  *  Lesser General Public License for more details.
16  *
17  *  You should have received a copy of the GNU Lesser General Public
18  *  License along with this library; if not, write to the Free Software
19  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
20  */
21
22 #pragma once
23
24 #include "ActiveDOMObject.h"
25 #include "ExceptionOr.h"
26 #include "FormData.h"
27 #include "ResourceResponse.h"
28 #include "ThreadableLoaderClient.h"
29 #include "UserGestureIndicator.h"
30 #include <wtf/URL.h>
31 #include "XMLHttpRequestEventTarget.h"
32 #include "XMLHttpRequestProgressEventThrottle.h"
33 #include <wtf/Variant.h>
34 #include <wtf/text/StringBuilder.h>
35
36 namespace JSC {
37 class ArrayBuffer;
38 class ArrayBufferView;
39 }
40
41 namespace WebCore {
42
43 class Blob;
44 class Document;
45 class DOMFormData;
46 class SecurityOrigin;
47 class SharedBuffer;
48 class TextResourceDecoder;
49 class ThreadableLoader;
50 class XMLHttpRequestUpload;
51 struct OwnedString;
52
53 class XMLHttpRequest final : public ActiveDOMObject, public RefCounted<XMLHttpRequest>, private ThreadableLoaderClient, public XMLHttpRequestEventTarget {
54     WTF_MAKE_ISO_ALLOCATED(XMLHttpRequest);
55 public:
56     static Ref<XMLHttpRequest> create(ScriptExecutionContext&);
57     WEBCORE_EXPORT ~XMLHttpRequest();
58
59     // Keep it in 3bits.
60     enum State : uint8_t {
61         UNSENT = 0,
62         OPENED = 1,
63         HEADERS_RECEIVED = 2,
64         LOADING = 3,
65         DONE = 4
66     };
67
68     virtual void didReachTimeout();
69
70     EventTargetInterface eventTargetInterface() const override { return XMLHttpRequestEventTargetInterfaceType; }
71     ScriptExecutionContext* scriptExecutionContext() const override { return ActiveDOMObject::scriptExecutionContext(); }
72
73     using SendTypes = Variant<RefPtr<Document>, RefPtr<Blob>, RefPtr<JSC::ArrayBufferView>, RefPtr<JSC::ArrayBuffer>, RefPtr<DOMFormData>, String>;
74
75     const URL& url() const { return m_url; }
76     String statusText() const;
77     int status() const;
78     State readyState() const;
79     bool withCredentials() const { return m_includeCredentials; }
80     ExceptionOr<void> setWithCredentials(bool);
81     ExceptionOr<void> open(const String& method, const String& url);
82     ExceptionOr<void> open(const String& method, const URL&, bool async);
83     ExceptionOr<void> open(const String& method, const String&, bool async, const String& user, const String& password);
84     ExceptionOr<void> send(Optional<SendTypes>&&);
85     void abort();
86     ExceptionOr<void> setRequestHeader(const String& name, const String& value);
87     ExceptionOr<void> overrideMimeType(const String& override);
88     bool doneWithoutErrors() const { return !m_error && readyState() == DONE; }
89     String getAllResponseHeaders() const;
90     String getResponseHeader(const String& name) const;
91     ExceptionOr<OwnedString> responseText();
92     String responseTextIgnoringResponseType() const { return m_responseBuilder.toStringPreserveCapacity(); }
93     String responseMIMEType() const;
94
95     Document* optionalResponseXML() const { return m_responseDocument.get(); }
96     ExceptionOr<Document*> responseXML();
97
98     Ref<Blob> createResponseBlob();
99     RefPtr<JSC::ArrayBuffer> createResponseArrayBuffer();
100
101     unsigned timeout() const { return m_timeoutMilliseconds; }
102     ExceptionOr<void> setTimeout(unsigned);
103
104     bool responseCacheIsValid() const { return m_responseCacheIsValid; }
105     void didCacheResponse();
106
107     // Keep it in 3bits.
108     enum class ResponseType : uint8_t {
109         EmptyString = 0,
110         Arraybuffer = 1,
111         Blob = 2,
112         Document = 3,
113         Json = 4,
114         Text = 5,
115     };
116     ExceptionOr<void> setResponseType(ResponseType);
117     ResponseType responseType() const;
118
119     String responseURL() const;
120
121     XMLHttpRequestUpload& upload();
122     XMLHttpRequestUpload* optionalUpload() const { return m_upload.get(); }
123
124     const ResourceResponse& resourceResponse() const { return m_response; }
125
126     using RefCounted<XMLHttpRequest>::ref;
127     using RefCounted<XMLHttpRequest>::deref;
128
129     size_t memoryCost() const;
130
131     WEBCORE_EXPORT void setMaximumIntervalForUserGestureForwarding(double);
132
133 private:
134     explicit XMLHttpRequest(ScriptExecutionContext&);
135
136     TextEncoding finalResponseCharset() const;
137
138     // ActiveDOMObject
139     void contextDestroyed() override;
140     bool canSuspendForDocumentSuspension() const override;
141     void suspend(ReasonForSuspension) override;
142     void resume() override;
143     void stop() override;
144     const char* activeDOMObjectName() const override;
145
146     void refEventTarget() override { ref(); }
147     void derefEventTarget() override { deref(); }
148
149     Document* document() const;
150     SecurityOrigin* securityOrigin() const;
151
152     // ThreadableLoaderClient
153     void didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent) override;
154     void didReceiveResponse(unsigned long identifier, const ResourceResponse&) override;
155     void didReceiveData(const char* data, int dataLength) override;
156     void didFinishLoading(unsigned long identifier) override;
157     void didFail(const ResourceError&) override;
158
159     bool responseIsXML() const;
160
161     Optional<ExceptionOr<void>> prepareToSend();
162     ExceptionOr<void> send(Document&);
163     ExceptionOr<void> send(const String& = { });
164     ExceptionOr<void> send(Blob&);
165     ExceptionOr<void> send(DOMFormData&);
166     ExceptionOr<void> send(JSC::ArrayBuffer&);
167     ExceptionOr<void> send(JSC::ArrayBufferView&);
168     ExceptionOr<void> sendBytesData(const void*, size_t);
169
170     void changeState(State);
171     void callReadyStateChangeListener();
172
173     // Returns false when cancelling the loader within internalAbort() triggers an event whose callback creates a new loader. 
174     // In that case, the function calling internalAbort should exit.
175     bool internalAbort();
176
177     void clearResponse();
178     void clearResponseBuffers();
179     void clearRequest();
180
181     ExceptionOr<void> createRequest();
182
183     void genericError();
184     void networkError();
185     void abortError();
186
187     void dispatchErrorEvents(const AtomString&);
188
189     using EventTarget::dispatchEvent;
190     void dispatchEvent(Event&) override;
191
192     void resumeTimerFired();
193     Ref<TextResourceDecoder> createDecoder() const;
194
195     void networkErrorTimerFired();
196
197     unsigned m_async : 1;
198     unsigned m_includeCredentials : 1;
199     unsigned m_sendFlag : 1;
200     unsigned m_createdDocument : 1;
201     unsigned m_error : 1;
202     unsigned m_uploadListenerFlag : 1;
203     unsigned m_uploadComplete : 1;
204     unsigned m_wasAbortedByClient : 1;
205     unsigned m_responseCacheIsValid : 1;
206     unsigned m_dispatchErrorOnResuming : 1;
207     unsigned m_readyState : 3; // State
208     unsigned m_responseType : 3; // ResponseType
209
210     unsigned m_timeoutMilliseconds { 0 };
211
212     std::unique_ptr<XMLHttpRequestUpload> m_upload;
213
214     URL m_url;
215     String m_method;
216     HTTPHeaderMap m_requestHeaders;
217     RefPtr<FormData> m_requestEntityBody;
218     String m_mimeTypeOverride;
219
220     RefPtr<ThreadableLoader> m_loader;
221
222     String m_responseEncoding;
223
224     ResourceResponse m_response;
225
226     RefPtr<TextResourceDecoder> m_decoder;
227
228     RefPtr<Document> m_responseDocument;
229
230     RefPtr<SharedBuffer> m_binaryResponseBuilder;
231
232     StringBuilder m_responseBuilder;
233
234     // Used for progress event tracking.
235     long long m_receivedLength { 0 };
236
237     XMLHttpRequestProgressEventThrottle m_progressEventThrottle;
238
239     mutable String m_allResponseHeaders;
240
241     Timer m_resumeTimer;
242     Timer m_networkErrorTimer;
243     Timer m_timeoutTimer;
244
245     MonotonicTime m_sendingTime;
246
247     Optional<ExceptionCode> m_exceptionCode;
248     RefPtr<UserGestureToken> m_userGestureToken;
249     Seconds m_maximumIntervalForUserGestureForwarding;
250 };
251
252 inline auto XMLHttpRequest::responseType() const -> ResponseType
253 {
254     return static_cast<ResponseType>(m_responseType);
255 }
256
257 inline auto XMLHttpRequest::readyState() const -> State
258 {
259     return static_cast<State>(m_readyState);
260 }
261
262 } // namespace WebCore