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

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 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
133 { 133 {
134 return code == WebSocketChannel::CloseEventCodeNormalClosure 134 return code == WebSocketChannel::CloseEventCodeNormalClosure
135 || (WebSocketChannel::CloseEventCodeMinimumUserDefined <= code 135 || (WebSocketChannel::CloseEventCodeMinimumUserDefined <= code
136 && code <= WebSocketChannel::CloseEventCodeMaximumUserDefined); 136 && code <= WebSocketChannel::CloseEventCodeMaximumUserDefined);
137 } 137 }
138 138
139 } // namespace 139 } // namespace
140 140
141 class NewWebSocketChannelImpl::BlobLoader : public FileReaderLoaderClient { 141 class NewWebSocketChannelImpl::BlobLoader : public FileReaderLoaderClient {
142 public: 142 public:
143 BlobLoader(const Blob&, NewWebSocketChannelImpl*); 143 BlobLoader(PassRefPtr<BlobDataHandle>, NewWebSocketChannelImpl*);
144 virtual ~BlobLoader() { } 144 virtual ~BlobLoader() { }
145 145
146 void cancel(); 146 void cancel();
147 147
148 // FileReaderLoaderClient functions. 148 // FileReaderLoaderClient functions.
149 virtual void didStartLoading() OVERRIDE { } 149 virtual void didStartLoading() OVERRIDE { }
150 virtual void didReceiveData() OVERRIDE { } 150 virtual void didReceiveData() OVERRIDE { }
151 virtual void didFinishLoading() OVERRIDE; 151 virtual void didFinishLoading() OVERRIDE;
152 virtual void didFail(FileError::ErrorCode) OVERRIDE; 152 virtual void didFail(FileError::ErrorCode) OVERRIDE;
153 153
154 private: 154 private:
155 NewWebSocketChannelImpl* m_channel; 155 NewWebSocketChannelImpl* m_channel;
156 FileReaderLoader m_loader; 156 FileReaderLoader m_loader;
157 }; 157 };
158 158
159 NewWebSocketChannelImpl::BlobLoader::BlobLoader(const Blob& blob, NewWebSocketCh annelImpl* channel) 159 NewWebSocketChannelImpl::BlobLoader::BlobLoader(PassRefPtr<BlobDataHandle> blobD ata, NewWebSocketChannelImpl* channel)
160 : m_channel(channel) 160 : m_channel(channel)
161 , m_loader(FileReaderLoader::ReadAsArrayBuffer, this) 161 , m_loader(FileReaderLoader::ReadAsArrayBuffer, this)
162 { 162 {
163 m_loader.start(channel->scriptExecutionContext(), blob); 163 m_loader.start(channel->scriptExecutionContext(), blobData);
164 } 164 }
165 165
166 void NewWebSocketChannelImpl::BlobLoader::cancel() 166 void NewWebSocketChannelImpl::BlobLoader::cancel()
167 { 167 {
168 m_loader.cancel(); 168 m_loader.cancel();
169 // didFail will be called immediately. 169 // didFail will be called immediately.
170 // |this| is deleted here. 170 // |this| is deleted here.
171 } 171 }
172 172
173 void NewWebSocketChannelImpl::BlobLoader::didFinishLoading() 173 void NewWebSocketChannelImpl::BlobLoader::didFinishLoading()
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
301 return m_extensions; 301 return m_extensions;
302 } 302 }
303 303
304 WebSocketChannel::SendResult NewWebSocketChannelImpl::send(const String& message ) 304 WebSocketChannel::SendResult NewWebSocketChannelImpl::send(const String& message )
305 { 305 {
306 m_messages.append(Message(message)); 306 m_messages.append(Message(message));
307 sendInternal(); 307 sendInternal();
308 return SendSuccess; 308 return SendSuccess;
309 } 309 }
310 310
311 WebSocketChannel::SendResult NewWebSocketChannelImpl::send(const Blob& blob) 311 WebSocketChannel::SendResult NewWebSocketChannelImpl::send(PassRefPtr<BlobDataHa ndle> blobData)
312 { 312 {
313 m_messages.append(Message(blob)); 313 m_messages.append(Message(blobData));
314 sendInternal(); 314 sendInternal();
315 return SendSuccess; 315 return SendSuccess;
316 } 316 }
317 317
318 WebSocketChannel::SendResult NewWebSocketChannelImpl::send(const ArrayBuffer& bu ffer, unsigned byteOffset, unsigned byteLength) 318 WebSocketChannel::SendResult NewWebSocketChannelImpl::send(const ArrayBuffer& bu ffer, unsigned byteOffset, unsigned byteLength)
319 { 319 {
320 // buffer.slice copies its contents. 320 // buffer.slice copies its contents.
321 m_messages.append(buffer.slice(byteOffset, byteOffset + byteLength)); 321 m_messages.append(buffer.slice(byteOffset, byteOffset + byteLength));
322 sendInternal(); 322 sendInternal();
323 return SendSuccess; 323 return SendSuccess;
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
420 isClean(code) ? WebSocketChannelClient::ClosingHandshakeComplete : WebSo cketChannelClient::ClosingHandshakeIncomplete; 420 isClean(code) ? WebSocketChannelClient::ClosingHandshakeComplete : WebSo cketChannelClient::ClosingHandshakeIncomplete;
421 client->didClose(m_bufferedAmount, status, code, reason); 421 client->didClose(m_bufferedAmount, status, code, reason);
422 // client->didClose may delete this object. 422 // client->didClose may delete this object.
423 } 423 }
424 424
425 425
426 NewWebSocketChannelImpl::Message::Message(const String& text) 426 NewWebSocketChannelImpl::Message::Message(const String& text)
427 : type(MessageTypeText) 427 : type(MessageTypeText)
428 , text(text.utf8(String::StrictConversionReplacingUnpairedSurrogatesWithFFFD )) { } 428 , text(text.utf8(String::StrictConversionReplacingUnpairedSurrogatesWithFFFD )) { }
429 429
430 NewWebSocketChannelImpl::Message::Message(const Blob& blob) 430 NewWebSocketChannelImpl::Message::Message(PassRefPtr<BlobDataHandle> blobData)
431 : type(MessageTypeBlob) 431 : type(MessageTypeBlob)
432 , blob(Blob::create(blob.url(), blob.type(), blob.size())) { } 432 , blobData(blobData) { }
433 433
434 NewWebSocketChannelImpl::Message::Message(PassRefPtr<ArrayBuffer> arrayBuffer) 434 NewWebSocketChannelImpl::Message::Message(PassRefPtr<ArrayBuffer> arrayBuffer)
435 : type(MessageTypeArrayBuffer) 435 : type(MessageTypeArrayBuffer)
436 , arrayBuffer(arrayBuffer) { } 436 , arrayBuffer(arrayBuffer) { }
437 437
438 void NewWebSocketChannelImpl::sendInternal() 438 void NewWebSocketChannelImpl::sendInternal()
439 { 439 {
440 ASSERT(m_handle); 440 ASSERT(m_handle);
441 unsigned long bufferedAmount = m_bufferedAmount; 441 unsigned long bufferedAmount = m_bufferedAmount;
442 while (!m_messages.isEmpty() && m_sendingQuota > 0 && !m_blobLoader) { 442 while (!m_messages.isEmpty() && m_sendingQuota > 0 && !m_blobLoader) {
443 bool final = false; 443 bool final = false;
444 const Message& message = m_messages.first(); 444 const Message& message = m_messages.first();
445 switch (message.type) { 445 switch (message.type) {
446 case MessageTypeText: { 446 case MessageTypeText: {
447 WebSocketHandle::MessageType type = 447 WebSocketHandle::MessageType type =
448 m_sentSizeOfTopMessage ? WebSocketHandle::MessageTypeContinuatio n : WebSocketHandle::MessageTypeText; 448 m_sentSizeOfTopMessage ? WebSocketHandle::MessageTypeContinuatio n : WebSocketHandle::MessageTypeText;
449 size_t size = std::min(static_cast<size_t>(m_sendingQuota), message. text.length() - m_sentSizeOfTopMessage); 449 size_t size = std::min(static_cast<size_t>(m_sendingQuota), message. text.length() - m_sentSizeOfTopMessage);
450 final = (m_sendingQuota == size); 450 final = (m_sendingQuota == size);
451 m_handle->send(final, type, message.text.data() + m_sentSizeOfTopMes sage, size); 451 m_handle->send(final, type, message.text.data() + m_sentSizeOfTopMes sage, size);
452 m_sentSizeOfTopMessage += size; 452 m_sentSizeOfTopMessage += size;
453 m_sendingQuota -= size; 453 m_sendingQuota -= size;
454 break; 454 break;
455 } 455 }
456 case MessageTypeBlob: 456 case MessageTypeBlob:
457 ASSERT(!m_blobLoader); 457 ASSERT(!m_blobLoader);
458 m_blobLoader = adoptPtr(new BlobLoader(*message.blob, this)); 458 m_blobLoader = adoptPtr(new BlobLoader(message.blobData, this));
459 break; 459 break;
460 case MessageTypeArrayBuffer: { 460 case MessageTypeArrayBuffer: {
461 WebSocketHandle::MessageType type = 461 WebSocketHandle::MessageType type =
462 m_sentSizeOfTopMessage ? WebSocketHandle::MessageTypeContinuatio n : WebSocketHandle::MessageTypeBinary; 462 m_sentSizeOfTopMessage ? WebSocketHandle::MessageTypeContinuatio n : WebSocketHandle::MessageTypeBinary;
463 size_t size = std::min(static_cast<size_t>(m_sendingQuota), message. arrayBuffer->byteLength() - m_sentSizeOfTopMessage); 463 size_t size = std::min(static_cast<size_t>(m_sendingQuota), message. arrayBuffer->byteLength() - m_sentSizeOfTopMessage);
464 final = (m_sendingQuota == size); 464 final = (m_sendingQuota == size);
465 m_handle->send(final, type, static_cast<const char*>(message.arrayBu ffer->data()) + m_sentSizeOfTopMessage, size); 465 m_handle->send(final, type, static_cast<const char*>(message.arrayBu ffer->data()) + m_sentSizeOfTopMessage, size);
466 m_sentSizeOfTopMessage += size; 466 m_sentSizeOfTopMessage += size;
467 m_sendingQuota -= size; 467 m_sendingQuota -= size;
468 break; 468 break;
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
587 if (errorCode == FileError::ABORT_ERR) { 587 if (errorCode == FileError::ABORT_ERR) {
588 // The error is caused by cancel(). 588 // The error is caused by cancel().
589 return; 589 return;
590 } 590 }
591 // FIXME: Generate human-friendly reason message. 591 // FIXME: Generate human-friendly reason message.
592 failAsError("Failed to load Blob: error code = " + String::number(errorCode) ); 592 failAsError("Failed to load Blob: error code = " + String::number(errorCode) );
593 // |this| can be deleted here. 593 // |this| can be deleted here.
594 } 594 }
595 595
596 } // namespace WebCore 596 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698