#ifndef EventSource_h
#define EventSource_h
#include "bindings/v8/ScriptWrappable.h"
#include "core/dom/ActiveDOMObject.h"
#include "core/events/EventTarget.h"
#include "core/loader/ThreadableLoaderClient.h"
#include "heap/Handle.h"
#include "platform/Timer.h"
#include "platform/weborigin/KURL.h"
#include "wtf/RefPtr.h"
#include "wtf/Vector.h"
namespace WebCore {
class Dictionary;
class ExceptionState;
class MessageEvent;
class ResourceResponse;
class TextResourceDecoder;
class ThreadableLoader;
class EventSource FINAL : public RefCountedWillBeRefCountedGarbageCollected<EventSource>, public ScriptWrappable, public EventTargetWithInlineData, private ThreadableLoaderClient, public ActiveDOMObject {
WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED;
DEFINE_EVENT_TARGET_REFCOUNTING(RefCountedWillBeRefCountedGarbageCollected<EventSource>);
public:
static PassRefPtrWillBeRawPtr<EventSource> create(ExecutionContext*, const String& url, const Dictionary&, ExceptionState&);
virtual ~EventSource();
static const unsigned long long defaultReconnectDelay;
String url() const;
bool withCredentials() const;
typedef short State;
static const State CONNECTING = 0;
static const State OPEN = 1;
static const State CLOSED = 2;
State readyState() const;
DEFINE_ATTRIBUTE_EVENT_LISTENER(open);
DEFINE_ATTRIBUTE_EVENT_LISTENER(message);
DEFINE_ATTRIBUTE_EVENT_LISTENER(error);
void close();
virtual const AtomicString& interfaceName() const OVERRIDE;
virtual ExecutionContext* executionContext() const OVERRIDE;
virtual void stop() OVERRIDE;
void trace(Visitor*) { }
private:
EventSource(ExecutionContext*, const KURL&, const Dictionary&);
virtual void didReceiveResponse(unsigned long, const ResourceResponse&) OVERRIDE;
virtual void didReceiveData(const char*, int) OVERRIDE;
virtual void didFinishLoading(unsigned long, double) OVERRIDE;
virtual void didFail(const ResourceError&) OVERRIDE;
virtual void didFailAccessControlCheck(const ResourceError&) OVERRIDE;
virtual void didFailRedirectCheck() OVERRIDE;
void scheduleInitialConnect();
void connect();
void networkRequestEnded();
void scheduleReconnect();
void connectTimerFired(Timer<EventSource>*);
void abortConnectionAttempt();
void parseEventStream();
void parseEventStreamLine(unsigned pos, int fieldLength, int lineLength);
PassRefPtrWillBeRawPtr<MessageEvent> createMessageEvent();
KURL m_url;
bool m_withCredentials;
State m_state;
OwnPtr<TextResourceDecoder> m_decoder;
RefPtr<ThreadableLoader> m_loader;
Timer<EventSource> m_connectTimer;
Vector<UChar> m_receiveBuf;
bool m_discardTrailingNewline;
bool m_requestInFlight;
AtomicString m_eventName;
Vector<UChar> m_data;
AtomicString m_currentlyParsedEventId;
AtomicString m_lastEventId;
unsigned long long m_reconnectDelay;
String m_eventStreamOrigin;
};
}
#endif