Make some things that return never-null pointers return references instead.
[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         ResponseTypeDocument,
73         ResponseTypeBlob,
74         ResponseTypeArrayBuffer
75     };
76
77 #if ENABLE(XHR_TIMEOUT)
78     virtual void didTimeout();
79 #endif
80
81     virtual const AtomicString& interfaceName() const;
82     virtual ScriptExecutionContext* scriptExecutionContext() const;
83
84     const KURL& url() const { return m_url; }
85     String statusText(ExceptionCode&) const;
86     int status(ExceptionCode&) const;
87     State readyState() const;
88     bool withCredentials() const { return m_includeCredentials; }
89     void setWithCredentials(bool, ExceptionCode&);
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(JSC::ArrayBuffer*, ExceptionCode&);
100     void send(JSC::ArrayBufferView*, ExceptionCode&);
101     void abort();
102     void setRequestHeader(const AtomicString& name, const String& value, ExceptionCode&);
103     void overrideMimeType(const String& override);
104     String getAllResponseHeaders(ExceptionCode&) const;
105     String getResponseHeader(const AtomicString& name, ExceptionCode&) const;
106     String responseText(ExceptionCode&);
107     Document* responseXML(ExceptionCode&);
108     Document* optionalResponseXML() const { return m_responseDocument.get(); }
109     Blob* responseBlob(ExceptionCode&);
110     Blob* optionalResponseBlob() const { return m_responseBlob.get(); }
111 #if ENABLE(XHR_TIMEOUT)
112     unsigned long timeout() const { return m_timeoutMilliseconds; }
113     void setTimeout(unsigned long timeout, ExceptionCode&);
114 #endif
115
116     void sendFromInspector(PassRefPtr<FormData>, ExceptionCode&);
117
118     // Expose HTTP validation methods for other untrusted requests.
119     static bool isAllowedHTTPMethod(const String&);
120     static String uppercaseKnownHTTPMethod(const String&);
121     static bool isAllowedHTTPHeader(const String&);
122
123     void setResponseType(const String&, ExceptionCode&);
124     String responseType();
125     ResponseTypeCode responseTypeCode() const { return m_responseTypeCode; }
126     
127     // response attribute has custom getter.
128     JSC::ArrayBuffer* responseArrayBuffer(ExceptionCode&);
129     JSC::ArrayBuffer* optionalResponseArrayBuffer() const { return m_responseArrayBuffer.get(); }
130
131     void setLastSendLineNumber(unsigned lineNumber) { m_lastSendLineNumber = lineNumber; }
132     void setLastSendURL(const String& url) { m_lastSendURL = url; }
133
134     XMLHttpRequestUpload* upload();
135     XMLHttpRequestUpload* optionalUpload() const { return m_upload.get(); }
136
137     DEFINE_ATTRIBUTE_EVENT_LISTENER(readystatechange);
138     DEFINE_ATTRIBUTE_EVENT_LISTENER(abort);
139     DEFINE_ATTRIBUTE_EVENT_LISTENER(error);
140     DEFINE_ATTRIBUTE_EVENT_LISTENER(load);
141     DEFINE_ATTRIBUTE_EVENT_LISTENER(loadend);
142     DEFINE_ATTRIBUTE_EVENT_LISTENER(loadstart);
143     DEFINE_ATTRIBUTE_EVENT_LISTENER(progress);
144 #if ENABLE(XHR_TIMEOUT)
145     DEFINE_ATTRIBUTE_EVENT_LISTENER(timeout);
146 #endif
147
148     using RefCounted<XMLHttpRequest>::ref;
149     using RefCounted<XMLHttpRequest>::deref;
150
151 private:
152     XMLHttpRequest(ScriptExecutionContext*);
153
154     // ActiveDOMObject
155     virtual void contextDestroyed() OVERRIDE;
156     virtual bool canSuspend() const OVERRIDE;
157     virtual void suspend(ReasonForSuspension) OVERRIDE;
158     virtual void resume() OVERRIDE;
159     virtual void stop() OVERRIDE;
160
161     virtual void refEventTarget() OVERRIDE { ref(); }
162     virtual void derefEventTarget() OVERRIDE { deref(); }
163     virtual EventTargetData* eventTargetData() OVERRIDE;
164     virtual EventTargetData& ensureEventTargetData() OVERRIDE;
165
166     Document* document() const;
167     SecurityOrigin* securityOrigin() const;
168
169 #if ENABLE(DASHBOARD_SUPPORT)
170     bool usesDashboardBackwardCompatibilityMode() const;
171 #endif
172
173     virtual void didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent);
174     virtual void didReceiveResponse(unsigned long identifier, const ResourceResponse&);
175     virtual void didReceiveData(const char* data, int dataLength);
176     virtual void didFinishLoading(unsigned long identifier, double finishTime);
177     virtual void didFail(const ResourceError&);
178     virtual void didFailRedirectCheck();
179
180     String responseMIMEType() const;
181     bool responseIsXML() const;
182
183     bool initSend(ExceptionCode&);
184     void sendBytesData(const void*, size_t, ExceptionCode&);
185
186     String getRequestHeader(const AtomicString& name) const;
187     void setRequestHeaderInternal(const AtomicString& name, const String& value);
188
189     void changeState(State newState);
190     void callReadyStateChangeListener();
191     void dropProtection();
192     void internalAbort();
193     void clearResponse();
194     void clearResponseBuffers();
195     void clearRequest();
196
197     void createRequest(ExceptionCode&);
198
199     void genericError();
200     void networkError();
201     void abortError();
202
203     OwnPtr<XMLHttpRequestUpload> m_upload;
204
205     KURL m_url;
206     String m_method;
207     HTTPHeaderMap m_requestHeaders;
208     RefPtr<FormData> m_requestEntityBody;
209     String m_mimeTypeOverride;
210     bool m_async;
211     bool m_includeCredentials;
212 #if ENABLE(XHR_TIMEOUT)
213     unsigned long m_timeoutMilliseconds;
214 #endif
215     RefPtr<Blob> m_responseBlob;
216
217     RefPtr<ThreadableLoader> m_loader;
218     State m_state;
219
220     ResourceResponse m_response;
221     String m_responseEncoding;
222
223     RefPtr<TextResourceDecoder> m_decoder;
224
225     StringBuilder m_responseBuilder;
226     mutable bool m_createdDocument;
227     mutable RefPtr<Document> m_responseDocument;
228     
229     RefPtr<SharedBuffer> m_binaryResponseBuilder;
230     mutable RefPtr<JSC::ArrayBuffer> m_responseArrayBuffer;
231
232     bool m_error;
233
234     bool m_uploadEventsAllowed;
235     bool m_uploadComplete;
236
237     bool m_sameOriginRequest;
238
239     // Used for onprogress tracking
240     long long m_receivedLength;
241
242     unsigned m_lastSendLineNumber;
243     String m_lastSendURL;
244     ExceptionCode m_exceptionCode;
245
246     EventTargetData m_eventTargetData;
247
248     XMLHttpRequestProgressEventThrottle m_progressEventThrottle;
249
250     // An enum corresponding to the allowed string values for the responseType attribute.
251     ResponseTypeCode m_responseTypeCode;
252 };
253
254 } // namespace WebCore
255
256 #endif // XMLHttpRequest_h