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