Index: content/browser/websockets/websocket_impl.cc |
diff --git a/content/browser/websockets/websocket_impl.cc b/content/browser/websockets/websocket_impl.cc |
index 6e64a7ed1b7d034906c907c3bdd560b055bf8965..a32a74c9282f6235122d2e974bffe350598c442d 100644 |
--- a/content/browser/websockets/websocket_impl.cc |
+++ b/content/browser/websockets/websocket_impl.cc |
@@ -24,6 +24,7 @@ |
#include "content/browser/ssl/ssl_manager.h" |
#include "content/public/browser/storage_partition.h" |
#include "ipc/ipc_message.h" |
+#include "net/base/io_buffer.h" |
#include "net/base/net_errors.h" |
#include "net/http/http_request_headers.h" |
#include "net/http/http_response_headers.h" |
@@ -93,7 +94,8 @@ class WebSocketImpl::WebSocketEventHandler final |
const std::string& extensions) override; |
ChannelState OnDataFrame(bool fin, |
WebSocketMessageType type, |
- const std::vector<char>& data) override; |
+ scoped_refptr<net::IOBuffer> buffer, |
+ size_t buffer_size) override; |
ChannelState OnClosingHandshake() override; |
ChannelState OnFlowControl(int64_t quota) override; |
ChannelState OnDropChannel(bool was_clean, |
@@ -167,15 +169,19 @@ ChannelState WebSocketImpl::WebSocketEventHandler::OnAddChannelResponse( |
ChannelState WebSocketImpl::WebSocketEventHandler::OnDataFrame( |
bool fin, |
net::WebSocketFrameHeader::OpCode type, |
- const std::vector<char>& data) { |
+ scoped_refptr<net::IOBuffer> buffer, |
+ size_t buffer_size) { |
DVLOG(3) << "WebSocketEventHandler::OnDataFrame @" |
<< reinterpret_cast<void*>(this) |
<< " fin=" << fin |
- << " type=" << type << " data is " << data.size() << " bytes"; |
+ << " type=" << type << " data is " << buffer_size << " bytes"; |
// TODO(darin): Avoid this copy. |
- std::vector<uint8_t> data_to_pass(data.size()); |
- std::copy(data.begin(), data.end(), data_to_pass.begin()); |
+ std::vector<uint8_t> data_to_pass(buffer_size); |
+ if (buffer_size > 0) { |
+ std::copy(buffer->data(), buffer->data() + buffer_size, |
+ data_to_pass.begin()); |
+ } |
impl_->client_->OnDataFrame(fin, OpCodeToMessageType(type), data_to_pass); |
@@ -434,11 +440,11 @@ void WebSocketImpl::SendFrame(bool fin, |
return; |
} |
- // TODO(darin): Avoid this copy. |
- std::vector<char> data_to_pass(data.size()); |
- std::copy(data.begin(), data.end(), data_to_pass.begin()); |
+ scoped_refptr<net::IOBuffer> data_to_pass(new net::IOBuffer(data.size())); |
yhirano
2016/09/06 12:19:48
"Avoid this copy" missing?
|
+ std::copy(data.begin(), data.end(), data_to_pass->data()); |
- channel_->SendFrame(fin, MessageTypeToOpCode(type), data_to_pass); |
+ channel_->SendFrame(fin, MessageTypeToOpCode(type), std::move(data_to_pass), |
+ data.size()); |
} |
void WebSocketImpl::SendFlowControl(int64_t quota) { |