| Index: net/quic/chromium/quic_chromium_client_stream.cc
|
| diff --git a/net/quic/chromium/quic_chromium_client_stream.cc b/net/quic/chromium/quic_chromium_client_stream.cc
|
| index 08cd6d8eb5342ebc0532d4f1fb7745691be5da7e..8782b9a9c07bfab651af4b5b65d1ee13ffdfce03 100644
|
| --- a/net/quic/chromium/quic_chromium_client_stream.cc
|
| +++ b/net/quic/chromium/quic_chromium_client_stream.cc
|
| @@ -32,6 +32,7 @@ QuicChromiumClientStream::QuicChromiumClientStream(
|
| initial_headers_sent_(false),
|
| session_(session),
|
| can_migrate_(true),
|
| + initial_headers_frame_len_(0),
|
| weak_factory_(this) {}
|
|
|
| QuicChromiumClientStream::~QuicChromiumClientStream() {
|
| @@ -57,8 +58,15 @@ void QuicChromiumClientStream::OnInitialHeadersComplete(
|
| ConsumeHeaderList();
|
| session_->OnInitialHeadersComplete(id(), header_block);
|
|
|
| - // The delegate will read the headers via a posted task.
|
| - NotifyDelegateOfHeadersCompleteLater(std::move(header_block), frame_len);
|
| + if (delegate_) {
|
| + // The delegate will receive the headers via a posted task.
|
| + NotifyDelegateOfHeadersCompleteLater(std::move(header_block), frame_len);
|
| + return;
|
| + }
|
| +
|
| + // Buffer the headers and deliver them when the delegate arrives.
|
| + initial_headers_ = std::move(header_block);
|
| + initial_headers_frame_len_ = frame_len;
|
| }
|
|
|
| void QuicChromiumClientStream::OnTrailingHeadersComplete(
|
| @@ -101,14 +109,14 @@ void QuicChromiumClientStream::OnDataAvailable() {
|
|
|
| // The delegate will read the data via a posted task, and
|
| // will be able to, potentially, read all data which has queued up.
|
| - NotifyDelegateOfDataAvailableLater();
|
| + if (delegate_)
|
| + NotifyDelegateOfDataAvailableLater();
|
| }
|
|
|
| void QuicChromiumClientStream::OnClose() {
|
| if (delegate_) {
|
| delegate_->OnClose();
|
| delegate_ = nullptr;
|
| - delegate_tasks_.clear();
|
| }
|
| QuicStream::OnClose();
|
| }
|
| @@ -186,14 +194,13 @@ void QuicChromiumClientStream::SetDelegate(
|
| QuicChromiumClientStream::Delegate* delegate) {
|
| DCHECK(!(delegate_ && delegate));
|
| delegate_ = delegate;
|
| - if (delegate == nullptr) {
|
| - DCHECK(delegate_tasks_.empty());
|
| + if (delegate == nullptr)
|
| return;
|
| - }
|
| - while (!delegate_tasks_.empty()) {
|
| - base::Closure closure = delegate_tasks_.front();
|
| - delegate_tasks_.pop_front();
|
| - closure.Run();
|
| +
|
| + // Should this perhaps be via PostTask to make reasoning simpler?
|
| + if (!initial_headers_.empty()) {
|
| + delegate_->OnHeadersAvailable(std::move(initial_headers_),
|
| + initial_headers_frame_len_);
|
| }
|
| }
|
|
|
| @@ -201,7 +208,6 @@ void QuicChromiumClientStream::OnError(int error) {
|
| if (delegate_) {
|
| QuicChromiumClientStream::Delegate* delegate = delegate_;
|
| delegate_ = nullptr;
|
| - delegate_tasks_.clear();
|
| delegate->OnError(error);
|
| }
|
| }
|
| @@ -225,9 +231,12 @@ int QuicChromiumClientStream::Read(IOBuffer* buf, int buf_len) {
|
| void QuicChromiumClientStream::NotifyDelegateOfHeadersCompleteLater(
|
| SpdyHeaderBlock headers,
|
| size_t frame_len) {
|
| - RunOrBuffer(base::Bind(
|
| - &QuicChromiumClientStream::NotifyDelegateOfHeadersComplete,
|
| - weak_factory_.GetWeakPtr(), base::Passed(std::move(headers)), frame_len));
|
| + DCHECK(delegate_);
|
| + base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&QuicChromiumClientStream::NotifyDelegateOfHeadersComplete,
|
| + weak_factory_.GetWeakPtr(), base::Passed(std::move(headers)),
|
| + frame_len));
|
| }
|
|
|
| void QuicChromiumClientStream::NotifyDelegateOfHeadersComplete(
|
| @@ -254,7 +263,9 @@ void QuicChromiumClientStream::NotifyDelegateOfHeadersComplete(
|
| }
|
|
|
| void QuicChromiumClientStream::NotifyDelegateOfDataAvailableLater() {
|
| - RunOrBuffer(
|
| + DCHECK(delegate_);
|
| + base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| + FROM_HERE,
|
| base::Bind(&QuicChromiumClientStream::NotifyDelegateOfDataAvailable,
|
| weak_factory_.GetWeakPtr()));
|
| }
|
| @@ -264,14 +275,6 @@ void QuicChromiumClientStream::NotifyDelegateOfDataAvailable() {
|
| delegate_->OnDataAvailable();
|
| }
|
|
|
| -void QuicChromiumClientStream::RunOrBuffer(base::Closure closure) {
|
| - if (delegate_) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, closure);
|
| - } else {
|
| - delegate_tasks_.push_back(closure);
|
| - }
|
| -}
|
| -
|
| void QuicChromiumClientStream::DisableConnectionMigration() {
|
| can_migrate_ = false;
|
| }
|
|
|