Unreviewed, rolling out r161532.
[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 #ifndef XMLHttpRequest_h
23 #define XMLHttpRequest_h
24
25 #include "ActiveDOMObject.h"
26 #include "EventListener.h"
27 #include "EventNames.h"
28 #include "EventTarget.h"
29 #include "FormData.h"
30 #include "ResourceResponse.h"
31 #include "ScriptWrappable.h"
32 #include "ThreadableLoaderClient.h"
33 #include "XMLHttpRequestProgressEventThrottle.h"
34 #include <wtf/text/AtomicStringHash.h>
35 #include <wtf/text/StringBuilder.h>
36
37 namespace JSC {
38 class ArrayBuffer;
39 class ArrayBufferView;
40 }
41
42 namespace WebCore {
43
44 class Blob;
45 class Document;
46 class DOMFormData;
47 class ResourceRequest;
48 class SecurityOrigin;
49 class SharedBuffer;
50 class TextResourceDecoder;
51 class ThreadableLoader;
52
53 class XMLHttpRequest FINAL : public ScriptWrappable, public RefCounted<XMLHttpRequest>, public EventTargetWithInlineData, private ThreadableLoaderClient, public ActiveDOMObject {
54     WTF_MAKE_FAST_ALLOCATED;
55 public:
56     static PassRefPtr<XMLHttpRequest> create(ScriptExecutionContext&);
57     ~XMLHttpRequest();
58
59     // These exact numeric values are important because JS expects them.
60     enum State {
61         UNSENT = 0,
62         OPENED = 1,
63         HEADERS_RECEIVED = 2,
64         LOADING = 3,
65         DONE = 4
66     };
67     
68     enum ResponseTypeCode {
69         ResponseTypeDefault,
70         ResponseTypeText,
71         ResponseTypeJSON,
72         ResponseTypeDocument,
73
74         // Binary format
75         ResponseTypeBlob,
76         ResponseTypeArrayBuffer
77     };
78     static const ResponseTypeCode FirstBinaryResponseType = ResponseTypeBlob;
79
80 #if ENABLE(XHR_TIMEOUT)
81     virtual void didTimeout();
82 #endif
83
84     virtual EventTargetInterface eventTargetInterface() const OVERRIDE { return XMLHttpRequestEventTargetInterfaceType; }
85     virtual ScriptExecutionContext* scriptExecutionContext() const OVERRIDE { return ActiveDOMObject::scriptExecutionContext(); }
86
87     const URL& url() const { return m_url; }
88     String statusText(ExceptionCode&) const;
89     int status(ExceptionCode&) const;
90     State readyState() const;
91     bool withCredentials() const { return m_includeCredentials; }
92     void setWithCredentials(bool, ExceptionCode&);
93     void open(const String& method, const URL&, ExceptionCode&);
94     void open(const String& method, const URL&, bool async, ExceptionCode&);
95     void open(const String& method, const URL&, bool async, const String& user, ExceptionCode&);
96     void open(const String& method, const URL&, bool async, const String& user, const String& password, ExceptionCode&);
97     void send(ExceptionCode&);
98     void send(Document*, ExceptionCode&);
99     void send(const String&, ExceptionCode&);
100     void send(Blob*, ExceptionCode&);
101     void send(DOMFormData*, ExceptionCode&);
102     void send(JSC::ArrayBuffer*, ExceptionCode&);
103     void send(JSC::ArrayBufferView*, ExceptionCode&);
104     void abort();
105     void setRequestHeader(const AtomicString& name, const String& value, ExceptionCode&);
106     void overrideMimeType(const String& override);
107     bool doneWithoutErrors() const { return !m_error && m_state == DONE; }
108     String getAllResponseHeaders(ExceptionCode&) const;
109     String getResponseHeader(const AtomicString& name, ExceptionCode&) const;
110     String responseText(ExceptionCode&);
111     String responseTextIgnoringResponseType() const { return m_responseBuilder.toStringPreserveCapacity(); }
112     Document* responseXML(ExceptionCode&);
113     Document* optionalResponseXML() const { return m_responseDocument.get(); }
114     Blob* responseBlob();
115     Blob* optionalResponseBlob() const { return m_responseBlob.get(); }
116 #if ENABLE(XHR_TIMEOUT)
117     unsigned long timeout() const { return m_timeoutMilliseconds; }
118     void setTimeout(unsigned long timeout, ExceptionCode&);
119 #endif
120
121     bool responseCacheIsValid() const { return m_responseCacheIsValid; }
122     void didCacheResponseJSON();
123
124     void sendFromInspector(PassRefPtr<FormData>, ExceptionCode&);
125
126     // Expose HTTP validation methods for other untrusted requests.
127     static bool isAllowedHTTPMethod(const String&);
128     static String uppercaseKnownHTTPMethod(const String&);
129     static bool isAllowedHTTPHeader(const String&);
130
131     void setResponseType(const String&, ExceptionCode&);
132     String responseType();
133     ResponseTypeCode responseTypeCode() const { return m_responseTypeCode; }
134
135     // response attribute has custom getter.
136     JSC::ArrayBuffer* responseArrayBuffer();
137     JSC::ArrayBuffer* optionalResponseArrayBuffer() const { return m_responseArrayBuffer.get(); }
138
139     void setLastSendLineAndColumnNumber(unsigned lineNumber, unsigned columnNumber);
140     void setLastSendURL(const String& url) { m_lastSendURL = url; }
141
142     XMLHttpRequestUpload* upload();
143     XMLHttpRequestUpload* optionalUpload() const { return m_upload.get(); }
144
145     DEFINE_ATTRIBUTE_EVENT_LISTENER(readystatechange);
146     DEFINE_ATTRIBUTE_EVENT_LISTENER(abort);
147     DEFINE_ATTRIBUTE_EVENT_LISTENER(error);
148     DEFINE_ATTRIBUTE_EVENT_LISTENER(load);
149     DEFINE_ATTRIBUTE_EVENT_LISTENER(loadend);
150     DEFINE_ATTRIBUTE_EVENT_LISTENER(loadstart);
151     DEFINE_ATTRIBUTE_EVENT_LISTENER(progress);
152 #if ENABLE(XHR_TIMEOUT)
153     DEFINE_ATTRIBUTE_EVENT_LISTENER(timeout);
154 #endif
155
156     using RefCounted<XMLHttpRequest>::ref;
157     using RefCounted<XMLHttpRequest>::deref;
158
159 private:
160     explicit XMLHttpRequest(ScriptExecutionContext&);
161
162     // ActiveDOMObject
163     virtual void contextDestroyed() OVERRIDE;
164     virtual bool canSuspend() const OVERRIDE;
165     virtual void suspend(ReasonForSuspension) OVERRIDE;
166     virtual void resume() OVERRIDE;
167     virtual void stop() OVERRIDE;
168
169     virtual void refEventTarget() OVERRIDE { ref(); }
170     virtual void derefEventTarget() OVERRIDE { deref(); }
171
172     Document* document() const;
173     SecurityOrigin* securityOrigin() const;
174
175 #if ENABLE(DASHBOARD_SUPPORT)
176     bool usesDashboardBackwardCompatibilityMode() const;
177 #endif
178
179     virtual void didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent) OVERRIDE;
180     virtual void didReceiveResponse(unsigned long identifier, const ResourceResponse&) OVERRIDE;
181     virtual void didReceiveData(const char* data, int dataLength) OVERRIDE;
182     virtual void didFinishLoading(unsigned long identifier, double finishTime) OVERRIDE;
183     virtual void didFail(const ResourceError&) OVERRIDE;
184     virtual void didFailRedirectCheck() OVERRIDE;
185
186     String responseMIMEType() const;
187     bool responseIsXML() const;
188
189     bool initSend(ExceptionCode&);
190     void sendBytesData(const void*, size_t, ExceptionCode&);
191
192     String getRequestHeader(const AtomicString& name) const;
193     void setRequestHeaderInternal(const AtomicString& name, const String& value);
194
195     void changeState(State newState);
196     void callReadyStateChangeListener();
197     void dropProtection();
198     void internalAbort();
199     void clearResponse();
200     void clearResponseBuffers();
201     void clearRequest();
202
203     void createRequest(ExceptionCode&);
204
205     void genericError();
206     void networkError();
207     void abortError();
208
209     bool shouldDecodeResponse() const { return m_responseTypeCode < FirstBinaryResponseType; }
210
211     std::unique_ptr<XMLHttpRequestUpload> m_upload;
212
213     URL m_url;
214     String m_method;
215     HTTPHeaderMap m_requestHeaders;
216     RefPtr<FormData> m_requestEntityBody;
217     String m_mimeTypeOverride;
218     bool m_async;
219     bool m_includeCredentials;
220 #if ENABLE(XHR_TIMEOUT)
221     unsigned long m_timeoutMilliseconds;
222 #endif
223     RefPtr<Blob> m_responseBlob;
224
225     RefPtr<ThreadableLoader> m_loader;
226     State m_state;
227
228     ResourceResponse m_response;
229     String m_responseEncoding;
230
231     RefPtr<TextResourceDecoder> m_decoder;
232
233     StringBuilder m_responseBuilder;
234     bool m_createdDocument;
235     RefPtr<Document> m_responseDocument;
236     
237     RefPtr<SharedBuffer> m_binaryResponseBuilder;
238     RefPtr<JSC::ArrayBuffer> m_responseArrayBuffer;
239
240     bool m_error;
241
242     bool m_uploadEventsAllowed;
243     bool m_uploadComplete;
244
245     bool m_sameOriginRequest;
246
247     // Used for onprogress tracking
248     long long m_receivedLength;
249
250     unsigned m_lastSendLineNumber;
251     unsigned m_lastSendColumnNumber;
252     String m_lastSendURL;
253     ExceptionCode m_exceptionCode;
254
255     XMLHttpRequestProgressEventThrottle m_progressEventThrottle;
256
257     // An enum corresponding to the allowed string values for the responseType attribute.
258     ResponseTypeCode m_responseTypeCode;
259     bool m_responseCacheIsValid;
260 };
261
262 } // namespace WebCore
263
264 #endif // XMLHttpRequest_h