diff options
author | tc@google.com <tc@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-10-01 22:31:35 +0000 |
---|---|---|
committer | tc@google.com <tc@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-10-01 22:31:35 +0000 |
commit | de56f378336660dcc848763c80267a5e063ae47d (patch) | |
tree | 7f551b88923b35bc4022ce6ab3a3f602fb60d91c /webkit/pending/XMLHttpRequest.h | |
parent | dc4f63c80cb90efe594131030aad6776e5945fcc (diff) | |
download | chromium_src-de56f378336660dcc848763c80267a5e063ae47d.zip chromium_src-de56f378336660dcc848763c80267a5e063ae47d.tar.gz chromium_src-de56f378336660dcc848763c80267a5e063ae47d.tar.bz2 |
Merge the chrome_webkit_merge_branch back on to trunk. This brings us
up to webkit@36102.
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@2778 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/pending/XMLHttpRequest.h')
-rw-r--r-- | webkit/pending/XMLHttpRequest.h | 212 |
1 files changed, 136 insertions, 76 deletions
diff --git a/webkit/pending/XMLHttpRequest.h b/webkit/pending/XMLHttpRequest.h index 04ca51b..77d32e6 100644 --- a/webkit/pending/XMLHttpRequest.h +++ b/webkit/pending/XMLHttpRequest.h @@ -1,7 +1,5 @@ -// -*- c-basic-offset: 2 -*- /* - * This file is part of the KDE libraries - * Copyright (C) 2003, 2006 Apple Computer, Inc. + * 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 @@ -22,95 +20,99 @@ #ifndef XMLHttpRequest_h #define XMLHttpRequest_h +#include "EventListener.h" #include "EventTarget.h" -#include "HTTPHeaderMap.h" -#include "JSBridge.h" -#include "KURL.h" -#include "PlatformString.h" +#include "FormData.h" #include "ResourceResponse.h" -#include "StringHash.h" #include "SubresourceLoaderClient.h" - -#include <wtf/HashMap.h> -#include <wtf/Vector.h> +#include "ScriptController.h" +#include <wtf/OwnPtr.h> namespace WebCore { -class TextResourceDecoder; class Document; -class Event; -class EventListener; -class String; - -typedef int ExceptionCode; - -// these exact numeric values are important because JS expects them -enum XMLHttpRequestState { - Uninitialized = 0, // The initial value. - Open = 1, // The open() method has been successfully called. - Sent = 2, // The user agent successfully completed the request, but no data has yet been received. - Receiving = 3, // Immediately before receiving the message body (if any). All HTTP headers have been received. - Loaded = 4 // The data transfer has been completed. -}; +class File; +class TextResourceDecoder; class XMLHttpRequest : public RefCounted<XMLHttpRequest>, public EventTarget, private SubresourceLoaderClient { public: - XMLHttpRequest(Document*); + static PassRefPtr<XMLHttpRequest> create(Document* document) { return adoptRef(new XMLHttpRequest(document)); } ~XMLHttpRequest(); + // These exact numeric values are important because JS expects them. + enum State { + UNSENT = 0, + OPENED = 1, + HEADERS_RECEIVED = 2, + LOADING = 3, + DONE = 4 + }; + virtual XMLHttpRequest* toXMLHttpRequest() { return this; } static void detachRequests(Document*); static void cancelRequests(Document*); - String getStatusText(ExceptionCode&) const; - int getStatus(ExceptionCode&) const; - XMLHttpRequestState getReadyState() const; + String statusText(ExceptionCode&) const; + int status(ExceptionCode&) const; + State readyState() const; 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(const String& body, ExceptionCode&); + void send(ExceptionCode&); + void send(Document*, ExceptionCode&); + void send(const String&, ExceptionCode&); + void send(File*, ExceptionCode&); void abort(); void setRequestHeader(const String& name, const String& value, ExceptionCode&); - void overrideMIMEType(const String& override); + void overrideMimeType(const String& override); String getAllResponseHeaders(ExceptionCode&) const; String getResponseHeader(const String& name, ExceptionCode&) const; - const JSString& getResponseText(ExceptionCode&) const; - Document* getResponseXML(ExceptionCode&) const; - - void setOnReadyStateChangeListener(EventListener*); - EventListener* onReadyStateChangeListener() const; - void setOnLoadListener(EventListener*); - EventListener* onLoadListener() const; - - // Extra wrapper methods for bindings - void setOnreadystatechange(EventListener* listener) { - setOnReadyStateChangeListener(listener); - } - EventListener* onreadystatechange() const { - return onReadyStateChangeListener(); - } - void setOnload(EventListener* listener) { - setOnLoadListener(listener); - } - EventListener* onload() const { - return onLoadListener(); - } - unsigned short readyState() const { - return static_cast<unsigned short>(getReadyState()); - } - String responseText(ExceptionCode& ec) const { - return getResponseText(ec); - } - Document* responseXML(ExceptionCode& ec) const { - return getResponseXML(ec); - } - unsigned short status(ExceptionCode& ec) const { - return static_cast<unsigned short>(getStatus(ec)); - } - String statusText(ExceptionCode& ec) const { - return getStatusText(ec); - } + const JSString& responseText() const; + Document* responseXML() const; + + XMLHttpRequestUpload* upload(); + XMLHttpRequestUpload* optionalUpload() const { return m_upload.get(); } + + void setOnReadyStateChangeListener(PassRefPtr<EventListener> eventListener) { m_onReadyStateChangeListener = eventListener; } + EventListener* onReadyStateChangeListener() const { return m_onReadyStateChangeListener.get(); } + + void setOnAbortListener(PassRefPtr<EventListener> eventListener) { m_onAbortListener = eventListener; } + EventListener* onAbortListener() const { return m_onAbortListener.get(); } + + void setOnErrorListener(PassRefPtr<EventListener> eventListener) { m_onErrorListener = eventListener; } + EventListener* onErrorListener() const { return m_onErrorListener.get(); } + + void setOnLoadListener(PassRefPtr<EventListener> eventListener) { m_onLoadListener = eventListener; } + EventListener* onLoadListener() const { return m_onLoadListener.get(); } + + void setOnLoadStartListener(PassRefPtr<EventListener> eventListener) { m_onLoadStartListener = eventListener; } + EventListener* onLoadStartListener() const { return m_onLoadStartListener.get(); } + + void setOnProgressListener(PassRefPtr<EventListener> eventListener) { m_onProgressListener = eventListener; } + EventListener* onProgressListener() const { return m_onProgressListener.get(); } + +#if USE(V8) + // Sam Weinig says that upstream WebKit plans to rename the above methods + // to have these same names for the bindings as well. + void setOnreadystatechange(EventListener* listener) { setOnReadyStateChangeListener(listener); } + EventListener* onreadystatechange() const { return onReadyStateChangeListener(); } + + void setOnabort(PassRefPtr<EventListener> eventListener) { m_onAbortListener = eventListener; } + EventListener* onabort() const { return m_onAbortListener.get(); } + + void setOnerror(PassRefPtr<EventListener> eventListener) { m_onErrorListener = eventListener; } + EventListener* onerror() const { return m_onErrorListener.get(); } + + void setOnload(EventListener* listener) { setOnLoadListener(listener); } + EventListener* onload() const { return onLoadListener(); } + + void setOnloadstart(PassRefPtr<EventListener> eventListener) { m_onLoadStartListener = eventListener; } + EventListener* onloadstart() const { return m_onLoadStartListener.get(); } + + void setOnprogress(PassRefPtr<EventListener> eventListener) { m_onProgressListener = eventListener; } + EventListener* onprogress() const { return m_onProgressListener.get(); } +#endif typedef Vector<RefPtr<EventListener> > ListenerVector; typedef HashMap<AtomicStringImpl*, ListenerVector> EventListenersMap; @@ -129,48 +131,97 @@ public: Document* getOwnerDocument() { return m_doc; } private: + XMLHttpRequest(Document*); + virtual void refEventTarget() { ref(); } virtual void derefEventTarget() { deref(); } - bool urlMatchesDocumentDomain(const KURL&) const; - virtual void willSendRequest(SubresourceLoader*, ResourceRequest& request, const ResourceResponse& redirectResponse); + virtual void didSendData(SubresourceLoader*, unsigned long long bytesSent, unsigned long long totalBytesToBeSent); virtual void didReceiveResponse(SubresourceLoader*, const ResourceResponse&); virtual void didReceiveData(SubresourceLoader*, const char* data, int size); virtual void didFail(SubresourceLoader*, const ResourceError&); virtual void didFinishLoading(SubresourceLoader*); virtual void receivedCancellation(SubresourceLoader*, const AuthenticationChallenge&); - void processSyncLoadResults(const Vector<char>& data, const ResourceResponse&); + // Special versions for the preflight + void didReceiveResponsePreflight(SubresourceLoader*, const ResourceResponse&); + void didFinishLoadingPreflight(SubresourceLoader*); + + void processSyncLoadResults(const Vector<char>& data, const ResourceResponse&, ExceptionCode&); + void updateAndDispatchOnProgress(unsigned int len); String responseMIMEType() const; bool responseIsXML() const; + bool initSend(ExceptionCode&); + String getRequestHeader(const String& name) const; + void setRequestHeaderInternal(const String& name, const String& value); - void changeState(XMLHttpRequestState newState); + void changeState(State newState); void callReadyStateChangeListener(); void dropProtection(); + void internalAbort(); + void clearResponse(); + void clearRequest(); + + void createRequest(ExceptionCode&); + + void makeSameOriginRequest(ExceptionCode&); + void makeCrossSiteAccessRequest(ExceptionCode&); + + void makeSimpleCrossSiteAccessRequest(ExceptionCode&); + void makeCrossSiteAccessRequestWithPreflight(ExceptionCode&); + void handleAsynchronousPreflightResult(); + + void loadRequestSynchronously(ResourceRequest&, ExceptionCode&); + void loadRequestAsynchronously(ResourceRequest&); + + bool isSimpleCrossSiteAccessRequest() const; + String accessControlOrigin() const; + bool accessControlCheck(const ResourceResponse&); + + void genericError(); + void networkError(); + void abortError(); + + void dispatchReadyStateChangeEvent(); + void dispatchXMLHttpRequestProgressEvent(EventListener* listener, const AtomicString& type, bool lengthComputable, unsigned loaded, unsigned total); + void dispatchAbortEvent(); + void dispatchErrorEvent(); + void dispatchLoadEvent(); + void dispatchLoadStartEvent(); + void dispatchProgressEvent(long long expectedLength); Document* m_doc; RefPtr<EventListener> m_onReadyStateChangeListener; + RefPtr<EventListener> m_onAbortListener; + RefPtr<EventListener> m_onErrorListener; RefPtr<EventListener> m_onLoadListener; + RefPtr<EventListener> m_onLoadStartListener; + RefPtr<EventListener> m_onProgressListener; EventListenersMap m_eventListeners; + RefPtr<XMLHttpRequestUpload> m_upload; + KURL m_url; - DeprecatedString m_method; + String m_method; HTTPHeaderMap m_requestHeaders; + RefPtr<FormData> m_requestEntityBody; String m_mimeTypeOverride; bool m_async; + bool m_includeCredentials; RefPtr<SubresourceLoader> m_loader; - XMLHttpRequestState m_state; + State m_state; ResourceResponse m_response; - String m_encoding; + String m_responseEncoding; RefPtr<TextResourceDecoder> m_decoder; + unsigned long m_identifier; // Unlike most strings in the DOM, we keep this as a KJS::UString, not a WebCore::String. // That's because these strings can easily get huge (they are filled from the network with @@ -182,7 +233,16 @@ private: mutable bool m_createdDocument; mutable RefPtr<Document> m_responseXML; - bool m_aborted; + bool m_error; + + bool m_uploadComplete; + + bool m_sameOriginRequest; + bool m_allowAccess; + bool m_inPreflight; + + // Used for onprogress tracking + long long m_receivedLength; }; } // namespace WebCore |