Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(160)

Side by Side Diff: Source/modules/websockets/NewWebSocketChannelImpl.cpp

Issue 23992003: blob hacking webcore style (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
132 { 132 {
133 return code == WebSocketChannel::CloseEventCodeNormalClosure 133 return code == WebSocketChannel::CloseEventCodeNormalClosure
134 || (WebSocketChannel::CloseEventCodeMinimumUserDefined <= code 134 || (WebSocketChannel::CloseEventCodeMinimumUserDefined <= code
135 && code <= WebSocketChannel::CloseEventCodeMaximumUserDefined); 135 && code <= WebSocketChannel::CloseEventCodeMaximumUserDefined);
136 } 136 }
137 137
138 } // namespace 138 } // namespace
139 139
140 class NewWebSocketChannelImpl::BlobLoader : public FileReaderLoaderClient { 140 class NewWebSocketChannelImpl::BlobLoader : public FileReaderLoaderClient {
141 public: 141 public:
142 BlobLoader(const Blob&, NewWebSocketChannelImpl*); 142 BlobLoader(PassRefPtr<BlobDataHandle>, NewWebSocketChannelImpl*);
143 virtual ~BlobLoader() { } 143 virtual ~BlobLoader() { }
144 144
145 void cancel(); 145 void cancel();
146 146
147 // FileReaderLoaderClient functions. 147 // FileReaderLoaderClient functions.
148 virtual void didStartLoading() OVERRIDE { } 148 virtual void didStartLoading() OVERRIDE { }
149 virtual void didReceiveData() OVERRIDE { } 149 virtual void didReceiveData() OVERRIDE { }
150 virtual void didFinishLoading() OVERRIDE; 150 virtual void didFinishLoading() OVERRIDE;
151 virtual void didFail(FileError::ErrorCode) OVERRIDE; 151 virtual void didFail(FileError::ErrorCode) OVERRIDE;
152 152
153 private: 153 private:
154 NewWebSocketChannelImpl* m_channel; 154 NewWebSocketChannelImpl* m_channel;
155 FileReaderLoader m_loader; 155 FileReaderLoader m_loader;
156 }; 156 };
157 157
158 NewWebSocketChannelImpl::BlobLoader::BlobLoader(const Blob& blob, NewWebSocketCh annelImpl* channel) 158 NewWebSocketChannelImpl::BlobLoader::BlobLoader(PassRefPtr<BlobDataHandle> blobD ataHandle, NewWebSocketChannelImpl* channel)
159 : m_channel(channel) 159 : m_channel(channel)
160 , m_loader(FileReaderLoader::ReadAsArrayBuffer, this) 160 , m_loader(FileReaderLoader::ReadAsArrayBuffer, this)
161 { 161 {
162 m_loader.start(channel->executionContext(), blob); 162 m_loader.start(channel->executionContext(), blobDataHandle);
163 } 163 }
164 164
165 void NewWebSocketChannelImpl::BlobLoader::cancel() 165 void NewWebSocketChannelImpl::BlobLoader::cancel()
166 { 166 {
167 m_loader.cancel(); 167 m_loader.cancel();
168 // didFail will be called immediately. 168 // didFail will be called immediately.
169 // |this| is deleted here. 169 // |this| is deleted here.
170 } 170 }
171 171
172 void NewWebSocketChannelImpl::BlobLoader::didFinishLoading() 172 void NewWebSocketChannelImpl::BlobLoader::didFinishLoading()
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 } 304 }
305 305
306 WebSocketChannel::SendResult NewWebSocketChannelImpl::send(const String& message ) 306 WebSocketChannel::SendResult NewWebSocketChannelImpl::send(const String& message )
307 { 307 {
308 LOG(Network, "NewWebSocketChannelImpl %p sendText(%s)", this, message.utf8() .data()); 308 LOG(Network, "NewWebSocketChannelImpl %p sendText(%s)", this, message.utf8() .data());
309 m_messages.append(Message(message)); 309 m_messages.append(Message(message));
310 sendInternal(); 310 sendInternal();
311 return SendSuccess; 311 return SendSuccess;
312 } 312 }
313 313
314 WebSocketChannel::SendResult NewWebSocketChannelImpl::send(const Blob& blob) 314 WebSocketChannel::SendResult NewWebSocketChannelImpl::send(PassRefPtr<BlobDataHa ndle> blobDataHandle)
315 { 315 {
316 LOG(Network, "NewWebSocketChannelImpl %p sendBlob(%s, %s, %llu)", this, blob .url().string().utf8().data(), blob.type().utf8().data(), blob.size()); 316 LOG(Network, "NewWebSocketChannelImpl %p sendBlob(%s, %s, %llu)", this, blob DataHandle->uuid().utf8().data(), blobDataHandle->type().utf8().data(), blobData Handle->size());
317 m_messages.append(Message(blob)); 317 m_messages.append(Message(blobDataHandle));
318 sendInternal(); 318 sendInternal();
319 return SendSuccess; 319 return SendSuccess;
320 } 320 }
321 321
322 WebSocketChannel::SendResult NewWebSocketChannelImpl::send(const ArrayBuffer& bu ffer, unsigned byteOffset, unsigned byteLength) 322 WebSocketChannel::SendResult NewWebSocketChannelImpl::send(const ArrayBuffer& bu ffer, unsigned byteOffset, unsigned byteLength)
323 { 323 {
324 LOG(Network, "NewWebSocketChannelImpl %p sendArrayBuffer(%p, %u, %u)", this, buffer.data(), byteOffset, byteLength); 324 LOG(Network, "NewWebSocketChannelImpl %p sendArrayBuffer(%p, %u, %u)", this, buffer.data(), byteOffset, byteLength);
325 // buffer.slice copies its contents. 325 // buffer.slice copies its contents.
326 m_messages.append(buffer.slice(byteOffset, byteOffset + byteLength)); 326 m_messages.append(buffer.slice(byteOffset, byteOffset + byteLength));
327 sendInternal(); 327 sendInternal();
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
431 isClean(code) ? WebSocketChannelClient::ClosingHandshakeComplete : WebSo cketChannelClient::ClosingHandshakeIncomplete; 431 isClean(code) ? WebSocketChannelClient::ClosingHandshakeComplete : WebSo cketChannelClient::ClosingHandshakeIncomplete;
432 client->didClose(m_bufferedAmount, status, code, reason); 432 client->didClose(m_bufferedAmount, status, code, reason);
433 // client->didClose may delete this object. 433 // client->didClose may delete this object.
434 } 434 }
435 435
436 436
437 NewWebSocketChannelImpl::Message::Message(const String& text) 437 NewWebSocketChannelImpl::Message::Message(const String& text)
438 : type(MessageTypeText) 438 : type(MessageTypeText)
439 , text(text.utf8(String::StrictConversionReplacingUnpairedSurrogatesWithFFFD )) { } 439 , text(text.utf8(String::StrictConversionReplacingUnpairedSurrogatesWithFFFD )) { }
440 440
441 NewWebSocketChannelImpl::Message::Message(const Blob& blob) 441 NewWebSocketChannelImpl::Message::Message(PassRefPtr<BlobDataHandle> blobDataHan dle)
442 : type(MessageTypeBlob) 442 : type(MessageTypeBlob)
443 , blob(Blob::create(blob.url(), blob.type(), blob.size())) { } 443 , blobDataHandle(blobDataHandle) { }
444 444
445 NewWebSocketChannelImpl::Message::Message(PassRefPtr<ArrayBuffer> arrayBuffer) 445 NewWebSocketChannelImpl::Message::Message(PassRefPtr<ArrayBuffer> arrayBuffer)
446 : type(MessageTypeArrayBuffer) 446 : type(MessageTypeArrayBuffer)
447 , arrayBuffer(arrayBuffer) { } 447 , arrayBuffer(arrayBuffer) { }
448 448
449 void NewWebSocketChannelImpl::sendInternal() 449 void NewWebSocketChannelImpl::sendInternal()
450 { 450 {
451 ASSERT(m_handle); 451 ASSERT(m_handle);
452 unsigned long bufferedAmount = m_bufferedAmount; 452 unsigned long bufferedAmount = m_bufferedAmount;
453 while (!m_messages.isEmpty() && m_sendingQuota > 0 && !m_blobLoader) { 453 while (!m_messages.isEmpty() && m_sendingQuota > 0 && !m_blobLoader) {
454 bool final = false; 454 bool final = false;
455 const Message& message = m_messages.first(); 455 const Message& message = m_messages.first();
456 switch (message.type) { 456 switch (message.type) {
457 case MessageTypeText: { 457 case MessageTypeText: {
458 WebSocketHandle::MessageType type = 458 WebSocketHandle::MessageType type =
459 m_sentSizeOfTopMessage ? WebSocketHandle::MessageTypeContinuatio n : WebSocketHandle::MessageTypeText; 459 m_sentSizeOfTopMessage ? WebSocketHandle::MessageTypeContinuatio n : WebSocketHandle::MessageTypeText;
460 size_t size = std::min(static_cast<size_t>(m_sendingQuota), message. text.length() - m_sentSizeOfTopMessage); 460 size_t size = std::min(static_cast<size_t>(m_sendingQuota), message. text.length() - m_sentSizeOfTopMessage);
461 final = (m_sendingQuota == size); 461 final = (m_sendingQuota == size);
462 m_handle->send(final, type, message.text.data() + m_sentSizeOfTopMes sage, size); 462 m_handle->send(final, type, message.text.data() + m_sentSizeOfTopMes sage, size);
463 m_sentSizeOfTopMessage += size; 463 m_sentSizeOfTopMessage += size;
464 m_sendingQuota -= size; 464 m_sendingQuota -= size;
465 break; 465 break;
466 } 466 }
467 case MessageTypeBlob: 467 case MessageTypeBlob:
468 ASSERT(!m_blobLoader); 468 ASSERT(!m_blobLoader);
469 m_blobLoader = adoptPtr(new BlobLoader(*message.blob, this)); 469 m_blobLoader = adoptPtr(new BlobLoader(message.blobDataHandle, this) );
470 break; 470 break;
471 case MessageTypeArrayBuffer: { 471 case MessageTypeArrayBuffer: {
472 WebSocketHandle::MessageType type = 472 WebSocketHandle::MessageType type =
473 m_sentSizeOfTopMessage ? WebSocketHandle::MessageTypeContinuatio n : WebSocketHandle::MessageTypeBinary; 473 m_sentSizeOfTopMessage ? WebSocketHandle::MessageTypeContinuatio n : WebSocketHandle::MessageTypeBinary;
474 size_t size = std::min(static_cast<size_t>(m_sendingQuota), message. arrayBuffer->byteLength() - m_sentSizeOfTopMessage); 474 size_t size = std::min(static_cast<size_t>(m_sendingQuota), message. arrayBuffer->byteLength() - m_sentSizeOfTopMessage);
475 final = (m_sendingQuota == size); 475 final = (m_sendingQuota == size);
476 m_handle->send(final, type, static_cast<const char*>(message.arrayBu ffer->data()) + m_sentSizeOfTopMessage, size); 476 m_handle->send(final, type, static_cast<const char*>(message.arrayBu ffer->data()) + m_sentSizeOfTopMessage, size);
477 m_sentSizeOfTopMessage += size; 477 m_sentSizeOfTopMessage += size;
478 m_sendingQuota -= size; 478 m_sendingQuota -= size;
479 break; 479 break;
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
601 if (errorCode == FileError::ABORT_ERR) { 601 if (errorCode == FileError::ABORT_ERR) {
602 // The error is caused by cancel(). 602 // The error is caused by cancel().
603 return; 603 return;
604 } 604 }
605 // FIXME: Generate human-friendly reason message. 605 // FIXME: Generate human-friendly reason message.
606 failAsError("Failed to load Blob: error code = " + String::number(errorCode) ); 606 failAsError("Failed to load Blob: error code = " + String::number(errorCode) );
607 // |this| can be deleted here. 607 // |this| can be deleted here.
608 } 608 }
609 609
610 } // namespace WebCore 610 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/modules/websockets/NewWebSocketChannelImpl.h ('k') | Source/modules/websockets/WebSocket.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698