Unreviewed, rolling out r243551.
[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 <wtf/URL.h>
30 #include "XMLHttpRequestEventTarget.h"
31 #include "XMLHttpRequestProgressEventThrottle.h"
32 #include <wtf/Variant.h>
33 #include <wtf/text/StringBuilder.h>
34
35 namespace JSC {
36 class ArrayBuffer;
37 class ArrayBufferView;
38 }
39
40 namespace WebCore {
41
42 class Blob;
43 class Document;
44 class DOMFormData;
45 class SecurityOrigin;
46 class SharedBuffer;
47 class TextResourceDecoder;
48 class ThreadableLoader;
49 class XMLHttpRequestUpload;
50 struct OwnedString;
51
52 class XMLHttpRequest final : public ActiveDOMObject, public RefCounted<XMLHttpRequest>, private ThreadableLoaderClient, public XMLHttpRequestEventTarget {
53     WTF_MAKE_FAST_ALLOCATED;
54 public:
55     static Ref<XMLHttpRequest> create(ScriptExecutionContext&);
56     WEBCORE_EXPORT ~XMLHttpRequest();
57
58     // Keep it in 3bits.
59     enum State : uint8_t {
60         UNSENT = 0,
61         OPENED = 1,
62         HEADERS_RECEIVED = 2,
63         LOADING = 3,
64         DONE = 4
65     };
66
67     virtual void didReachTimeout();
68
69     EventTargetInterface eventTargetInterface() const override { return XMLHttpRequestEventTargetInterfaceType; }
70     ScriptExecutionContext* scriptExecutionContext() const override { return ActiveDOMObject::scriptExecutionContext(); }
71
72     using SendTypes = Variant<RefPtr<Document>, RefPtr<Blob>, RefPtr<JSC::ArrayBufferView>, RefPtr<JSC::ArrayBuffer>, RefPtr<DOMFormData>, String>;
73
74     const URL& url() const { return m_url; }
75     String statusText() const;
76     int status() const;
77     State readyState() const;
78     bool withCredentials() const { return m_includeCredentials; }
79     ExceptionOr<void> setWithCredentials(bool);
80     ExceptionOr<void> open(const String& method, const String& url);
81     ExceptionOr<void> open(const String& method, const URL&, bool async);
82     ExceptionOr<void> open(const String& method, const String&, bool async, const String& user, const String& password);
83     ExceptionOr<void> send(Optional<SendTypes>&&);
84     void abort();
85     ExceptionOr<void> setRequestHeader(const String& name, const String& value);
86     ExceptionOr<void> overrideMimeType(const String& override);
87     bool doneWithoutErrors() const { return !m_error && readyState() == DONE; }
88     String getAllResponseHeaders() const;
89     String getResponseHeader(const String& name) const;
90     ExceptionOr<OwnedString> responseText();
91     String responseTextIgnoringResponseType() const { return m_responseBuilder.toStringPreserveCapacity(); }
92     String responseMIMEType() const;
93
94     Document* optionalResponseXML() const { return m_responseDocument.get(); }
95     ExceptionOr<Document*> responseXML();
96
97     Ref<Blob> createResponseBlob();
98     RefPtr<JSC::ArrayBuffer> createResponseArrayBuffer();
99
100     unsigned timeout() const { return m_timeoutMilliseconds; }
101     ExceptionOr<void> setTimeout(unsigned);
102
103     bool responseCacheIsValid() const { return m_responseCacheIsValid; }
104     void didCacheResponse();
105
106     // Keep it in 3bits.
107     enum class ResponseType : uint8_t {
108         EmptyString = 0,
109         Arraybuffer = 1,
110         Blob = 2,
111         Document = 3,
112         Json = 4,
113         Text = 5,
114     };
115     ExceptionOr<void> setResponseType(ResponseType);
116     ResponseType responseType() const;
117
118     String responseURL() const;
119
120     XMLHttpRequestUpload& upload();
121     XMLHttpRequestUpload* optionalUpload() const { return m_upload.get(); }
122
123     const ResourceResponse& resourceResponse() const { return m_response; }
124
125     using RefCounted<XMLHttpRequest>::ref;
126     using RefCounted<XMLHttpRequest>::deref;
127
128     size_t memoryCost() const;
129
130 private:
131     explicit XMLHttpRequest(ScriptExecutionContext&);
132
133     // ActiveDOMObject
134     void contextDestroyed() override;
135     bool canSuspendForDocumentSuspension() const override;
136     void suspend(ReasonForSuspension) override;
137     void resume() override;
138     void stop() override;
139     const char* activeDOMObjectName() const override;
140
141     void refEventTarget() override { ref(); }
142     void derefEventTarget() override { deref(); }
143
144     Document* document() const;
145     SecurityOrigin* securityOrigin() const;
146
147 #if ENABLE(DASHBOARD_SUPPORT)
148     bool usesDashboardBackwardCompatibilityMode() const;
149 #endif
150
151     // ThreadableLoaderClient
152     void didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent) override;
153     void didReceiveResponse(unsigned long identifier, const ResourceResponse&) override;
154     void didReceiveData(const char* data, int dataLength) override;
155     void didFinishLoading(unsigned long identifier) override;
156     void didFail(const ResourceError&) override;
157
158     bool responseIsXML() const;
159
160     Optional<ExceptionOr<void>> prepareToSend();
161     ExceptionOr<void> send(Document&);
162     ExceptionOr<void> send(const String& = { });
163     ExceptionOr<void> send(Blob&);
164     ExceptionOr<void> send(DOMFormData&);
165     ExceptionOr<void> send(JSC::ArrayBuffer&);
166     ExceptionOr<void> send(JSC::ArrayBufferView&);
167     ExceptionOr<void> sendBytesData(const void*, size_t);
168
169     void changeState(State);
170     void callReadyStateChangeListener();
171
172     // Returns false when cancelling the loader within internalAbort() triggers an event whose callback creates a new loader. 
173     // In that case, the function calling internalAbort should exit.
174     bool internalAbort();
175
176     void clearResponse();
177     void clearResponseBuffers();
178     void clearRequest();
179
180     ExceptionOr<void> createRequest();
181
182     void genericError();
183     void networkError();
184     void abortError();
185
186     void dispatchErrorEvents(const AtomicString&);
187
188     void resumeTimerFired();
189     Ref<TextResourceDecoder> createDecoder() const;
190
191     void networkErrorTimerFired();
192
193     unsigned m_async : 1;
194     unsigned m_includeCredentials : 1;
195     unsigned m_sendFlag : 1;
196     unsigned m_createdDocument : 1;
197     unsigned m_error : 1;
198     unsigned m_uploadListenerFlag : 1;
199     unsigned m_uploadComplete : 1;
200     unsigned m_wasAbortedByClient : 1;
201     unsigned m_responseCacheIsValid : 1;
202     unsigned m_dispatchErrorOnResuming : 1;
203     unsigned m_readyState : 3; // State
204     unsigned m_responseType : 3; // ResponseType
205
206     unsigned m_timeoutMilliseconds { 0 };
207
208     std::unique_ptr<XMLHttpRequestUpload> m_upload;
209
210     URL m_url;
211     String m_method;
212     HTTPHeaderMap m_requestHeaders;
213     RefPtr<FormData> m_requestEntityBody;
214     String m_mimeTypeOverride;
215
216     RefPtr<ThreadableLoader> m_loader;
217
218     String m_responseEncoding;
219
220     ResourceResponse m_response;
221
222     RefPtr<TextResourceDecoder> m_decoder;
223
224     RefPtr<Document> m_responseDocument;
225
226     RefPtr<SharedBuffer> m_binaryResponseBuilder;
227
228     StringBuilder m_responseBuilder;
229
230     // Used for progress event tracking.
231     long long m_receivedLength { 0 };
232
233     XMLHttpRequestProgressEventThrottle m_progressEventThrottle;
234
235     mutable String m_allResponseHeaders;
236
237     Timer m_resumeTimer;
238     Timer m_networkErrorTimer;
239     Timer m_timeoutTimer;
240
241     MonotonicTime m_sendingTime;
242
243     Optional<ExceptionCode> m_exceptionCode;
244 };
245
246 inline auto XMLHttpRequest::responseType() const -> ResponseType
247 {
248     return static_cast<ResponseType>(m_responseType);
249 }
250
251 inline auto XMLHttpRequest::readyState() const -> State
252 {
253     return static_cast<State>(m_readyState);
254 }
255
256 } // namespace WebCore