/* * Copyright (C) 2011 Google Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following disclaimer * in the documentation and/or other materials provided with the * distribution. * * Neither the name of Google Inc. nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef WebSocket_h #define WebSocket_h #if ENABLE(WEB_SOCKETS) #include "ActiveDOMObject.h" #include "EventListener.h" #include "EventTarget.h" #include "URL.h" #include "WebSocketChannel.h" #include "WebSocketChannelClient.h" #include #include #include namespace WebCore { class Blob; class CloseEvent; class ThreadableWebSocketChannel; class WebSocket final : public RefCounted, public EventTargetWithInlineData, public ActiveDOMObject, public WebSocketChannelClient { public: static void setIsAvailable(bool); static bool isAvailable(); static const char* subProtocolSeperator(); static Ref create(ScriptExecutionContext&); static RefPtr create(ScriptExecutionContext&, const String& url, ExceptionCode&); static RefPtr create(ScriptExecutionContext&, const String& url, const String& protocol, ExceptionCode&); static RefPtr create(ScriptExecutionContext&, const String& url, const Vector& protocols, ExceptionCode&); virtual ~WebSocket(); enum State { CONNECTING = 0, OPEN = 1, CLOSING = 2, CLOSED = 3 }; void connect(const String& url, ExceptionCode&); void connect(const String& url, const String& protocol, ExceptionCode&); void connect(const String& url, const Vector& protocols, ExceptionCode&); void send(const String& message, ExceptionCode&); void send(JSC::ArrayBuffer*, ExceptionCode&); void send(JSC::ArrayBufferView*, ExceptionCode&); void send(Blob*, ExceptionCode&); void close(int code, const String& reason, ExceptionCode&); void close(ExceptionCode& ec) { close(WebSocketChannel::CloseEventCodeNotSpecified, String(), ec); } void close(int code, ExceptionCode& ec) { close(code, String(), ec); } const URL& url() const; State readyState() const; unsigned long bufferedAmount() const; String protocol() const; String extensions() const; String binaryType() const; void setBinaryType(const String&, ExceptionCode&); // EventTarget functions. virtual EventTargetInterface eventTargetInterface() const override; virtual ScriptExecutionContext* scriptExecutionContext() const override; using RefCounted::ref; using RefCounted::deref; // WebSocketChannelClient functions. virtual void didConnect() override; virtual void didReceiveMessage(const String& message) override; void didReceiveBinaryData(Vector&&) override; virtual void didReceiveMessageError() override; virtual void didUpdateBufferedAmount(unsigned long bufferedAmount) override; virtual void didStartClosingHandshake() override; virtual void didClose(unsigned long unhandledBufferedAmount, ClosingHandshakeCompletionStatus, unsigned short code, const String& reason) override; private: explicit WebSocket(ScriptExecutionContext&); void resumeTimerFired(); void dispatchOrQueueErrorEvent(); void dispatchOrQueueEvent(Ref&&); // ActiveDOMObject API. void contextDestroyed() override; bool canSuspendForDocumentSuspension() const override; void suspend(ReasonForSuspension) override; void resume() override; void stop() override; const char* activeDOMObjectName() const override; virtual void refEventTarget() override { ref(); } virtual void derefEventTarget() override { deref(); } size_t getFramingOverhead(size_t payloadSize); enum BinaryType { BinaryTypeBlob, BinaryTypeArrayBuffer }; RefPtr m_channel; State m_state; URL m_url; unsigned long m_bufferedAmount; unsigned long m_bufferedAmountAfterClose; BinaryType m_binaryType; String m_subprotocol; String m_extensions; Timer m_resumeTimer; bool m_shouldDelayEventFiring { false }; Deque> m_pendingEvents; bool m_dispatchedErrorEvent { false }; }; } // namespace WebCore #endif // ENABLE(WEB_SOCKETS) #endif // WebSocket_h