| /* |
| * Copyright (C) 2003, 2006, 2008 Apple Inc. All rights reserved. |
| * Copyright (C) 2005, 2006 Alexey Proskuryakov <ap@nypop.com> |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| */ |
| |
| #ifndef XMLHttpRequest_h |
| #define XMLHttpRequest_h |
| |
| #include "ActiveDOMObject.h" |
| #include "EventListener.h" |
| #include "EventNames.h" |
| #include "EventTarget.h" |
| #include "FormData.h" |
| #include "ResourceResponse.h" |
| #include "ThreadableLoaderClient.h" |
| #include "XMLHttpRequestProgressEventThrottle.h" |
| #include <wtf/OwnPtr.h> |
| #include <wtf/text/AtomicStringHash.h> |
| #include <wtf/text/StringBuilder.h> |
| |
| namespace WebCore { |
| |
| class ArrayBuffer; |
| class Blob; |
| class Document; |
| class DOMFormData; |
| class ResourceRequest; |
| class SharedBuffer; |
| class TextResourceDecoder; |
| class ThreadableLoader; |
| |
| class XMLHttpRequest : public RefCounted<XMLHttpRequest>, public EventTarget, private ThreadableLoaderClient, public ActiveDOMObject { |
| WTF_MAKE_FAST_ALLOCATED; |
| public: |
| static PassRefPtr<XMLHttpRequest> create(ScriptExecutionContext* context) { return adoptRef(new XMLHttpRequest(context)); } |
| ~XMLHttpRequest(); |
| |
| // These exact numeric values are important because JS expects them. |
| enum State { |
| UNSENT = 0, |
| OPENED = 1, |
| HEADERS_RECEIVED = 2, |
| LOADING = 3, |
| DONE = 4 |
| }; |
| |
| enum ResponseTypeCode { |
| ResponseTypeDefault, |
| ResponseTypeText, |
| ResponseTypeDocument, |
| ResponseTypeBlob, |
| ResponseTypeArrayBuffer |
| }; |
| |
| virtual XMLHttpRequest* toXMLHttpRequest() { return this; } |
| |
| virtual void contextDestroyed(); |
| virtual bool canSuspend() const; |
| virtual void suspend(ReasonForSuspension); |
| virtual void resume(); |
| virtual void stop(); |
| |
| virtual ScriptExecutionContext* scriptExecutionContext() const; |
| |
| const KURL& url() const { return m_url; } |
| String statusText(ExceptionCode&) const; |
| int status(ExceptionCode&) const; |
| State readyState() const; |
| bool withCredentials() const { return m_includeCredentials; } |
| void setWithCredentials(bool, ExceptionCode&); |
| #if ENABLE(XHR_RESPONSE_BLOB) |
| bool asBlob() const { return responseTypeCode() == ResponseTypeBlob; } |
| void setAsBlob(bool, ExceptionCode&); |
| #endif |
| void open(const String& method, const KURL&, ExceptionCode&); |
| void open(const String& method, const KURL&, bool async, ExceptionCode&); |
| void open(const String& method, const KURL&, bool async, const String& user, ExceptionCode&); |
| void open(const String& method, const KURL&, bool async, const String& user, const String& password, ExceptionCode&); |
| void send(ExceptionCode&); |
| void send(Document*, ExceptionCode&); |
| void send(const String&, ExceptionCode&); |
| void send(Blob*, ExceptionCode&); |
| void send(DOMFormData*, ExceptionCode&); |
| void send(ArrayBuffer*, ExceptionCode&); |
| void abort(); |
| void setRequestHeader(const AtomicString& name, const String& value, ExceptionCode&); |
| void overrideMimeType(const String& override); |
| String getAllResponseHeaders(ExceptionCode&) const; |
| String getResponseHeader(const AtomicString& name, ExceptionCode&) const; |
| String responseText(ExceptionCode&); |
| Document* responseXML(ExceptionCode&); |
| Document* optionalResponseXML() const { return m_responseXML.get(); } |
| #if ENABLE(XHR_RESPONSE_BLOB) |
| Blob* responseBlob(ExceptionCode&) const; |
| Blob* optionalResponseBlob() const { return m_responseBlob.get(); } |
| #endif |
| |
| void setResponseType(const String&, ExceptionCode&); |
| String responseType(); |
| ResponseTypeCode responseTypeCode() const { return m_responseTypeCode; } |
| |
| // response attribute has custom getter. |
| ArrayBuffer* responseArrayBuffer(ExceptionCode&); |
| ArrayBuffer* optionalResponseArrayBuffer() const { return m_responseArrayBuffer.get(); } |
| |
| void setLastSendLineNumber(unsigned lineNumber) { m_lastSendLineNumber = lineNumber; } |
| void setLastSendURL(const String& url) { m_lastSendURL = url; } |
| |
| XMLHttpRequestUpload* upload(); |
| XMLHttpRequestUpload* optionalUpload() const { return m_upload.get(); } |
| |
| DEFINE_ATTRIBUTE_EVENT_LISTENER(readystatechange); |
| DEFINE_ATTRIBUTE_EVENT_LISTENER(abort); |
| DEFINE_ATTRIBUTE_EVENT_LISTENER(error); |
| DEFINE_ATTRIBUTE_EVENT_LISTENER(load); |
| DEFINE_ATTRIBUTE_EVENT_LISTENER(loadstart); |
| DEFINE_ATTRIBUTE_EVENT_LISTENER(progress); |
| |
| using RefCounted<XMLHttpRequest>::ref; |
| using RefCounted<XMLHttpRequest>::deref; |
| |
| private: |
| XMLHttpRequest(ScriptExecutionContext*); |
| |
| virtual void refEventTarget() { ref(); } |
| virtual void derefEventTarget() { deref(); } |
| virtual EventTargetData* eventTargetData(); |
| virtual EventTargetData* ensureEventTargetData(); |
| |
| Document* document() const; |
| |
| #if ENABLE(DASHBOARD_SUPPORT) |
| bool usesDashboardBackwardCompatibilityMode() const; |
| #endif |
| |
| virtual void didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent); |
| virtual void didReceiveResponse(const ResourceResponse&); |
| virtual void didReceiveData(const char* data, int dataLength); |
| virtual void didFinishLoading(unsigned long identifier, double finishTime); |
| virtual void didFail(const ResourceError&); |
| virtual void didFailRedirectCheck(); |
| virtual void didReceiveAuthenticationCancellation(const ResourceResponse&); |
| |
| String responseMIMEType() const; |
| bool responseIsXML() const; |
| |
| bool initSend(ExceptionCode&); |
| |
| String getRequestHeader(const AtomicString& name) const; |
| void setRequestHeaderInternal(const AtomicString& name, const String& value); |
| bool isSafeRequestHeader(const String&) const; |
| |
| void changeState(State newState); |
| void callReadyStateChangeListener(); |
| void dropProtection(); |
| void internalAbort(); |
| void clearResponse(); |
| void clearResponseBuffers(); |
| void clearRequest(); |
| |
| void createRequest(ExceptionCode&); |
| |
| void genericError(); |
| void networkError(); |
| void abortError(); |
| |
| RefPtr<XMLHttpRequestUpload> m_upload; |
| |
| KURL m_url; |
| String m_method; |
| HTTPHeaderMap m_requestHeaders; |
| RefPtr<FormData> m_requestEntityBody; |
| String m_mimeTypeOverride; |
| bool m_async; |
| bool m_includeCredentials; |
| #if ENABLE(XHR_RESPONSE_BLOB) |
| RefPtr<Blob> m_responseBlob; |
| #endif |
| |
| RefPtr<ThreadableLoader> m_loader; |
| State m_state; |
| |
| ResourceResponse m_response; |
| String m_responseEncoding; |
| |
| RefPtr<TextResourceDecoder> m_decoder; |
| |
| StringBuilder m_responseBuilder; |
| mutable bool m_createdDocument; |
| mutable RefPtr<Document> m_responseXML; |
| |
| RefPtr<SharedBuffer> m_binaryResponseBuilder; |
| mutable RefPtr<ArrayBuffer> m_responseArrayBuffer; |
| |
| bool m_error; |
| |
| bool m_uploadEventsAllowed; |
| bool m_uploadComplete; |
| |
| bool m_sameOriginRequest; |
| |
| // Used for onprogress tracking |
| long long m_receivedLength; |
| |
| unsigned m_lastSendLineNumber; |
| String m_lastSendURL; |
| ExceptionCode m_exceptionCode; |
| |
| EventTargetData m_eventTargetData; |
| |
| XMLHttpRequestProgressEventThrottle m_progressEventThrottle; |
| |
| // An enum corresponding to the allowed string values for the responseType attribute. |
| ResponseTypeCode m_responseTypeCode; |
| }; |
| |
| } // namespace WebCore |
| |
| #endif // XMLHttpRequest_h |