Start migrating typed array impl types to WTF
[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  *
6  *  This library is free software; you can redistribute it and/or
7  *  modify it under the terms of the GNU Lesser General Public
8  *  License as published by the Free Software Foundation; either
9  *  version 2 of the License, or (at your option) any later version.
10  *
11  *  This library is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  *  Lesser General Public License for more details.
15  *
16  *  You should have received a copy of the GNU Lesser General Public
17  *  License along with this library; if not, write to the Free Software
18  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
19  */
20
21 #ifndef XMLHttpRequest_h
22 #define XMLHttpRequest_h
23
24 #include "ActiveDOMObject.h"
25 #include "EventListener.h"
26 #include "EventNames.h"
27 #include "EventTarget.h"
28 #include "FormData.h"
29 #include "ResourceResponse.h"
30 #include "SecurityOrigin.h"
31 #include "ThreadableLoaderClient.h"
32 #include "XMLHttpRequestProgressEventThrottle.h"
33 #include <wtf/OwnPtr.h>
34 #include <wtf/text/AtomicStringHash.h>
35 #include <wtf/text/StringBuilder.h>
36
37 namespace WebCore {
38
39 class Blob;
40 class Document;
41 class DOMFormData;
42 class ResourceRequest;
43 class SecurityOrigin;
44 class SharedBuffer;
45 class TextResourceDecoder;
46 class ThreadableLoader;
47
48 class XMLHttpRequest : public RefCounted<XMLHttpRequest>, public EventTarget, private ThreadableLoaderClient, public ActiveDOMObject {
49     WTF_MAKE_FAST_ALLOCATED;
50 public:
51     static PassRefPtr<XMLHttpRequest> create(ScriptExecutionContext*, PassRefPtr<SecurityOrigin> = 0);
52     ~XMLHttpRequest();
53
54     // These exact numeric values are important because JS expects them.
55     enum State {
56         UNSENT = 0,
57         OPENED = 1,
58         HEADERS_RECEIVED = 2,
59         LOADING = 3,
60         DONE = 4
61     };
62     
63     enum ResponseTypeCode {
64         ResponseTypeDefault,
65         ResponseTypeText, 
66         ResponseTypeDocument,
67         ResponseTypeBlob,
68         ResponseTypeArrayBuffer
69     };
70
71     virtual void contextDestroyed();
72     virtual bool canSuspend() const;
73     virtual void suspend(ReasonForSuspension);
74     virtual void resume();
75     virtual void stop();
76
77     virtual const AtomicString& interfaceName() const;
78     virtual ScriptExecutionContext* scriptExecutionContext() const;
79
80     const KURL& url() const { return m_url; }
81     String statusText(ExceptionCode&) const;
82     int status(ExceptionCode&) const;
83     State readyState() const;
84     bool withCredentials() const { return m_includeCredentials; }
85     void setWithCredentials(bool, ExceptionCode&);
86 #if ENABLE(XHR_RESPONSE_BLOB)
87     bool asBlob() const { return responseTypeCode() == ResponseTypeBlob; }
88     void setAsBlob(bool, ExceptionCode&);
89 #endif
90     void open(const String& method, const KURL&, ExceptionCode&);
91     void open(const String& method, const KURL&, bool async, ExceptionCode&);
92     void open(const String& method, const KURL&, bool async, const String& user, ExceptionCode&);
93     void open(const String& method, const KURL&, bool async, const String& user, const String& password, ExceptionCode&);
94     void send(ExceptionCode&);
95     void send(Document*, ExceptionCode&);
96     void send(const String&, ExceptionCode&);
97     void send(Blob*, ExceptionCode&);
98     void send(DOMFormData*, ExceptionCode&);
99     void send(ArrayBuffer*, ExceptionCode&);
100     void abort();
101     void setRequestHeader(const AtomicString& name, const String& value, ExceptionCode&);
102     void overrideMimeType(const String& override);
103     String getAllResponseHeaders(ExceptionCode&) const;
104     String getResponseHeader(const AtomicString& name, ExceptionCode&) const;
105     String responseText(ExceptionCode&);
106     Document* responseXML(ExceptionCode&);
107     Document* optionalResponseXML() const { return m_responseXML.get(); }
108 #if ENABLE(XHR_RESPONSE_BLOB)
109     Blob* responseBlob(ExceptionCode&) const;
110     Blob* optionalResponseBlob() const { return m_responseBlob.get(); }
111 #endif
112
113     // Expose HTTP validation methods for other untrusted requests.
114     static bool isAllowedHTTPMethod(const String&);
115     static String uppercaseKnownHTTPMethod(const String&);
116     static bool isAllowedHTTPHeader(const String&);
117
118     void setResponseType(const String&, ExceptionCode&);
119     String responseType();
120     ResponseTypeCode responseTypeCode() const { return m_responseTypeCode; }
121     
122     // response attribute has custom getter.
123     ArrayBuffer* responseArrayBuffer(ExceptionCode&);
124     ArrayBuffer* optionalResponseArrayBuffer() const { return m_responseArrayBuffer.get(); }
125
126     void setLastSendLineNumber(unsigned lineNumber) { m_lastSendLineNumber = lineNumber; }
127     void setLastSendURL(const String& url) { m_lastSendURL = url; }
128
129     XMLHttpRequestUpload* upload();
130     XMLHttpRequestUpload* optionalUpload() const { return m_upload.get(); }
131
132     DEFINE_ATTRIBUTE_EVENT_LISTENER(readystatechange);
133     DEFINE_ATTRIBUTE_EVENT_LISTENER(abort);
134     DEFINE_ATTRIBUTE_EVENT_LISTENER(error);
135     DEFINE_ATTRIBUTE_EVENT_LISTENER(load);
136     DEFINE_ATTRIBUTE_EVENT_LISTENER(loadstart);
137     DEFINE_ATTRIBUTE_EVENT_LISTENER(progress);
138
139     using RefCounted<XMLHttpRequest>::ref;
140     using RefCounted<XMLHttpRequest>::deref;
141
142 private:
143     XMLHttpRequest(ScriptExecutionContext*, PassRefPtr<SecurityOrigin>);
144
145     virtual void refEventTarget() { ref(); }
146     virtual void derefEventTarget() { deref(); }
147     virtual EventTargetData* eventTargetData();
148     virtual EventTargetData* ensureEventTargetData();
149
150     Document* document() const;
151     SecurityOrigin* securityOrigin() const;
152
153 #if ENABLE(DASHBOARD_SUPPORT)
154     bool usesDashboardBackwardCompatibilityMode() const;
155 #endif
156
157     virtual void didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent);
158     virtual void didReceiveResponse(unsigned long identifier, const ResourceResponse&);
159     virtual void didReceiveData(const char* data, int dataLength);
160     virtual void didFinishLoading(unsigned long identifier, double finishTime);
161     virtual void didFail(const ResourceError&);
162     virtual void didFailRedirectCheck();
163
164     String responseMIMEType() const;
165     bool responseIsXML() const;
166
167     bool initSend(ExceptionCode&);
168
169     String getRequestHeader(const AtomicString& name) const;
170     void setRequestHeaderInternal(const AtomicString& name, const String& value);
171
172     void changeState(State newState);
173     void callReadyStateChangeListener();
174     void dropProtection();
175     void internalAbort();
176     void clearResponse();
177     void clearResponseBuffers();
178     void clearRequest();
179
180     void createRequest(ExceptionCode&);
181
182     void genericError();
183     void networkError();
184     void abortError();
185
186     OwnPtr<XMLHttpRequestUpload> m_upload;
187
188     KURL m_url;
189     String m_method;
190     HTTPHeaderMap m_requestHeaders;
191     RefPtr<FormData> m_requestEntityBody;
192     String m_mimeTypeOverride;
193     bool m_async;
194     bool m_includeCredentials;
195 #if ENABLE(XHR_RESPONSE_BLOB)
196     RefPtr<Blob> m_responseBlob;
197 #endif
198
199     RefPtr<ThreadableLoader> m_loader;
200     State m_state;
201
202     ResourceResponse m_response;
203     String m_responseEncoding;
204
205     RefPtr<TextResourceDecoder> m_decoder;
206
207     StringBuilder m_responseBuilder;
208     mutable bool m_createdDocument;
209     mutable RefPtr<Document> m_responseXML;
210     
211     RefPtr<SharedBuffer> m_binaryResponseBuilder;
212     mutable RefPtr<ArrayBuffer> m_responseArrayBuffer;
213
214     bool m_error;
215
216     bool m_uploadEventsAllowed;
217     bool m_uploadComplete;
218
219     bool m_sameOriginRequest;
220
221     // Used for onprogress tracking
222     long long m_receivedLength;
223
224     unsigned m_lastSendLineNumber;
225     String m_lastSendURL;
226     ExceptionCode m_exceptionCode;
227
228     EventTargetData m_eventTargetData;
229
230     XMLHttpRequestProgressEventThrottle m_progressEventThrottle;
231
232     // An enum corresponding to the allowed string values for the responseType attribute.
233     ResponseTypeCode m_responseTypeCode;
234
235     RefPtr<SecurityOrigin> m_securityOrigin;
236 };
237
238 } // namespace WebCore
239
240 #endif // XMLHttpRequest_h