XHR_RESPONSE_BLOB is not enabled on some platforms
[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     void open(const String& method, const KURL&, ExceptionCode&);
87     void open(const String& method, const KURL&, bool async, ExceptionCode&);
88     void open(const String& method, const KURL&, bool async, const String& user, ExceptionCode&);
89     void open(const String& method, const KURL&, bool async, const String& user, const String& password, ExceptionCode&);
90     void send(ExceptionCode&);
91     void send(Document*, ExceptionCode&);
92     void send(const String&, ExceptionCode&);
93     void send(Blob*, ExceptionCode&);
94     void send(DOMFormData*, ExceptionCode&);
95     void send(ArrayBuffer*, ExceptionCode&);
96     void abort();
97     void setRequestHeader(const AtomicString& name, const String& value, ExceptionCode&);
98     void overrideMimeType(const String& override);
99     String getAllResponseHeaders(ExceptionCode&) const;
100     String getResponseHeader(const AtomicString& name, ExceptionCode&) const;
101     String responseText(ExceptionCode&);
102     Document* responseXML(ExceptionCode&);
103     Document* optionalResponseXML() const { return m_responseDocument.get(); }
104     Blob* responseBlob(ExceptionCode&);
105     Blob* optionalResponseBlob() const { return m_responseBlob.get(); }
106
107     // Expose HTTP validation methods for other untrusted requests.
108     static bool isAllowedHTTPMethod(const String&);
109     static String uppercaseKnownHTTPMethod(const String&);
110     static bool isAllowedHTTPHeader(const String&);
111
112     void setResponseType(const String&, ExceptionCode&);
113     String responseType();
114     ResponseTypeCode responseTypeCode() const { return m_responseTypeCode; }
115     
116     // response attribute has custom getter.
117     ArrayBuffer* responseArrayBuffer(ExceptionCode&);
118     ArrayBuffer* optionalResponseArrayBuffer() const { return m_responseArrayBuffer.get(); }
119
120     void setLastSendLineNumber(unsigned lineNumber) { m_lastSendLineNumber = lineNumber; }
121     void setLastSendURL(const String& url) { m_lastSendURL = url; }
122
123     XMLHttpRequestUpload* upload();
124     XMLHttpRequestUpload* optionalUpload() const { return m_upload.get(); }
125
126     DEFINE_ATTRIBUTE_EVENT_LISTENER(readystatechange);
127     DEFINE_ATTRIBUTE_EVENT_LISTENER(abort);
128     DEFINE_ATTRIBUTE_EVENT_LISTENER(error);
129     DEFINE_ATTRIBUTE_EVENT_LISTENER(load);
130     DEFINE_ATTRIBUTE_EVENT_LISTENER(loadend);
131     DEFINE_ATTRIBUTE_EVENT_LISTENER(loadstart);
132     DEFINE_ATTRIBUTE_EVENT_LISTENER(progress);
133
134     using RefCounted<XMLHttpRequest>::ref;
135     using RefCounted<XMLHttpRequest>::deref;
136
137 private:
138     XMLHttpRequest(ScriptExecutionContext*, PassRefPtr<SecurityOrigin>);
139
140     virtual void refEventTarget() { ref(); }
141     virtual void derefEventTarget() { deref(); }
142     virtual EventTargetData* eventTargetData();
143     virtual EventTargetData* ensureEventTargetData();
144
145     Document* document() const;
146     SecurityOrigin* securityOrigin() const;
147
148 #if ENABLE(DASHBOARD_SUPPORT)
149     bool usesDashboardBackwardCompatibilityMode() const;
150 #endif
151
152     virtual void didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent);
153     virtual void didReceiveResponse(unsigned long identifier, const ResourceResponse&);
154     virtual void didReceiveData(const char* data, int dataLength);
155     virtual void didFinishLoading(unsigned long identifier, double finishTime);
156     virtual void didFail(const ResourceError&);
157     virtual void didFailRedirectCheck();
158
159     String responseMIMEType() const;
160     bool responseIsXML() const;
161
162     bool initSend(ExceptionCode&);
163
164     String getRequestHeader(const AtomicString& name) const;
165     void setRequestHeaderInternal(const AtomicString& name, const String& value);
166
167     void changeState(State newState);
168     void callReadyStateChangeListener();
169     void dropProtection();
170     void internalAbort();
171     void clearResponse();
172     void clearResponseBuffers();
173     void clearRequest();
174
175     void createRequest(ExceptionCode&);
176
177     void genericError();
178     void networkError();
179     void abortError();
180
181     OwnPtr<XMLHttpRequestUpload> m_upload;
182
183     KURL m_url;
184     String m_method;
185     HTTPHeaderMap m_requestHeaders;
186     RefPtr<FormData> m_requestEntityBody;
187     String m_mimeTypeOverride;
188     bool m_async;
189     bool m_includeCredentials;
190     RefPtr<Blob> m_responseBlob;
191
192     RefPtr<ThreadableLoader> m_loader;
193     State m_state;
194
195     ResourceResponse m_response;
196     String m_responseEncoding;
197
198     RefPtr<TextResourceDecoder> m_decoder;
199
200     StringBuilder m_responseBuilder;
201     mutable bool m_createdDocument;
202     mutable RefPtr<Document> m_responseDocument;
203     
204     RefPtr<SharedBuffer> m_binaryResponseBuilder;
205     mutable RefPtr<ArrayBuffer> m_responseArrayBuffer;
206
207     bool m_error;
208
209     bool m_uploadEventsAllowed;
210     bool m_uploadComplete;
211
212     bool m_sameOriginRequest;
213
214     // Used for onprogress tracking
215     long long m_receivedLength;
216
217     unsigned m_lastSendLineNumber;
218     String m_lastSendURL;
219     ExceptionCode m_exceptionCode;
220
221     EventTargetData m_eventTargetData;
222
223     XMLHttpRequestProgressEventThrottle m_progressEventThrottle;
224
225     // An enum corresponding to the allowed string values for the responseType attribute.
226     ResponseTypeCode m_responseTypeCode;
227
228     RefPtr<SecurityOrigin> m_securityOrigin;
229 };
230
231 } // namespace WebCore
232
233 #endif // XMLHttpRequest_h