Skip to content
  • ukai@chromium.org's avatar
    2010-05-10 Fumitoshi Ukai <ukai@chromium.org> · 00bba7de
    ukai@chromium.org authored
            Reviewed by Alexey Proskuryakov.
    
            WebSocket needs to suspend/resume as Active DOM object.
            https://bugs.webkit.org/show_bug.cgi?id=38171
    
            Implement suspend()/resume() in WebSocket and WebSocketChannel.
            While WebSocketChannel is suspended, it only adds received data in m_buffer
            or record the handle was closed, and report no event to WebSocket.
            When resumed, it will process buffer or handle closing.
            Since suspend/resume would be called while processing JavaScript event handler (e.g. before/after alert()), WebSocketChannel method that would fire an event need to be reentrant.
            So, WebSocketChannel::processBuffer() call WebSocket to fire an event at most once and skips buffer before the calling,
            so that next call of processBuffer() would process the next frame.
    
            * websockets/ThreadableWebSocketChannel.h:
            * websockets/ThreadableWebSocketChannelClientWrapper.h:
            (WebCore::ThreadableWebSocketChannelClientWrapper::didConnect):
              Mark channel is opened, and process pending events if not suspended.
            (WebCore::ThreadableWebSocketChannelClientWrapper::didReceiveMessage):
              Push message back in pending queue, and process pending events if not suspended.
            (WebCore::ThreadableWebSocketChannelClientWrapper::didClose):
              Mark channel is closed, and process pending events if not suspended.
            (WebCore::ThreadableWebSocketChannelClientWrapper::suspend):
              Mark suspended.
            (WebCore::ThreadableWebSocketChannelClientWrapper::resume):
              Unmark suspended, and process pending events.
            (WebCore::ThreadableWebSocketChannelClientWrapper::ThreadableWebSocketChannelClientWrapper):
            (WebCore::ThreadableWebSocketChannelClientWrapper::processPendingEvents):
            * websockets/WebSocket.cpp:
            (WebCore::WebSocket::canSuspend):
            (WebCore::WebSocket::suspend):
            (WebCore::WebSocket::resume):
            (WebCore::WebSocket::didClose):
            * websockets/WebSocket.h:
            * websockets/WebSocketChannel.cpp:
            (WebCore::WebSocketChannel::WebSocketChannel):
            (WebCore::WebSocketChannel::connect):
            (WebCore::WebSocketChannel::send):
            (WebCore::WebSocketChannel::bufferedAmount):
            (WebCore::WebSocketChannel::close):
            (WebCore::WebSocketChannel::suspend):
            (WebCore::WebSocketChannel::resume):
             When resumed, it will process buffer and
             handle closing if handle was already closed while suspended.
            (WebCore::WebSocketChannel::didClose):
             If suspended, record unhandled bufferedAmount and set m_closed true, so that closing will be processed when resumed.
            (WebCore::WebSocketChannel::didReceiveData):
             Add received data in buffer and process buffer while it is not suspended.
            (WebCore::WebSocketChannel::processBuffer):
             Process handshake header or one frame message.
             Return true if there are more data to be processed.
             Return false otherwise (e.g. incomplete handshake header or incomplete frame).
            * websockets/WebSocketChannel.h:
            * websockets/WorkerThreadableWebSocketChannel.cpp:
            (WebCore::WorkerThreadableWebSocketChannel::suspend):
            (WebCore::WorkerThreadableWebSocketChannel::resume):
            (WebCore::WorkerThreadableWebSocketChannel::Peer::suspend):
            (WebCore::WorkerThreadableWebSocketChannel::Peer::resume):
            (WebCore::WorkerThreadableWebSocketChannel::mainThreadSuspend):
            (WebCore::WorkerThreadableWebSocketChannel::Bridge::suspend):
            (WebCore::WorkerThreadableWebSocketChannel::mainThreadResume):
            (WebCore::WorkerThreadableWebSocketChannel::Bridge::resume):
            * websockets/WorkerThreadableWebSocketChannel.h:
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@59116 268f45cc-cd09-0410-ab3c-d52691b4dbfc
    00bba7de