WebSocket: Load Blob in WebSocketChannel
authoryutak@chromium.org <yutak@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 31 Aug 2011 08:35:54 +0000 (08:35 +0000)
committeryutak@chromium.org <yutak@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 31 Aug 2011 08:35:54 +0000 (08:35 +0000)
commit86e03e69856d234a147d1f2fc2007a5c6446a067
tree4c8c5ffd4bf836eef7bcf6f110d845ce52e8ffb8
parentb9a26b7615c223b5adeb1acaf4eb1d01e0b681cc
WebSocket: Load Blob in WebSocketChannel
https://bugs.webkit.org/show_bug.cgi?id=67013

Reviewed by Kent Tamura.

Add WebSocketChannel::enqueueBlobFrame(). It makes WebSocketChannel start loading a Blob
and send a WebSocket frame after the Blob is loaded.

While a Blob is being loaded, subsequent send() requests cannot be processed and are blocked.
Pending requests are stored in m_outgoingFrameQueue. When we have finished loading a Blob,
requests in the queue are allowed to get processed.

No new tests are added, because nobody uses enqueueBlobFrame() yet. New tests will be added
when WebSocket.send(Blob) is implemented, and they will cover this code change.

* websockets/WebSocketChannel.cpp:
ref() is called when m_blobLoader is allocated, and deref() is called in didFinishLoading()
or didFail(). This is necessary because WebSocketChannel must be able to receive callbacks
from FileReaderLoader even if the channel is referred from no other objects.
(WebCore::WebSocketChannel::WebSocketChannel):
(WebCore::WebSocketChannel::didStartLoading):
(WebCore::WebSocketChannel::didReceiveData):
(WebCore::WebSocketChannel::didFinishLoading):
(WebCore::WebSocketChannel::didFail):
When we have failed to load a Blob, fail() is called, and eventually didCloseSocketStream()
will be called. It will clean up the pending requests in the queue.
(WebCore::WebSocketChannel::enqueueBlobFrame):
(WebCore::WebSocketChannel::processOutgoingFrameQueue):
(WebCore::WebSocketChannel::abortOutgoingFrameQueue):
Cancel the Blob loader when the outgoing request queue is about to be aborted. The loader
will not invoke didFail() callback once it is canceled, thus we need to call didFail()
manually so that we can free up the loader and decrement the reference count.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@94162 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Source/WebCore/ChangeLog
Source/WebCore/websockets/WebSocketChannel.cpp
Source/WebCore/websockets/WebSocketChannel.h