summaryrefslogtreecommitdiffstats
path: root/webkit/pending/XMLHttpRequest.h
diff options
context:
space:
mode:
authortc@google.com <tc@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-10-01 22:31:35 +0000
committertc@google.com <tc@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-10-01 22:31:35 +0000
commitde56f378336660dcc848763c80267a5e063ae47d (patch)
tree7f551b88923b35bc4022ce6ab3a3f602fb60d91c /webkit/pending/XMLHttpRequest.h
parentdc4f63c80cb90efe594131030aad6776e5945fcc (diff)
downloadchromium_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.h212
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