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