Remove Http2DecoderAdapter::Reset() and ResetInternal().

These methods were only called in tests and the Http2DecoderAdapter
constructor. This CL removes the test calls, instead replacing them with
std::unique_ptr re-creation where needed, and inlines the body of
ResetInternal() into the Http2DecoderAdapter constructor.
PiperOrigin-RevId: 434591645
diff --git a/spdy/core/http2_frame_decoder_adapter.cc b/spdy/core/http2_frame_decoder_adapter.cc
index 320befa..e79234f 100644
--- a/spdy/core/http2_frame_decoder_adapter.cc
+++ b/spdy/core/http2_frame_decoder_adapter.cc
@@ -244,7 +244,22 @@
 
 Http2DecoderAdapter::Http2DecoderAdapter() {
   QUICHE_DVLOG(1) << "Http2DecoderAdapter ctor";
-  ResetInternal();
+
+  set_spdy_state(SpdyState::SPDY_READY_FOR_FRAME);
+  spdy_framer_error_ = SpdyFramerError::SPDY_NO_ERROR;
+
+  decoded_frame_header_ = false;
+  has_frame_header_ = false;
+  on_headers_called_ = false;
+  on_hpack_fragment_called_ = false;
+  latched_probable_http_response_ = false;
+  has_expected_frame_type_ = false;
+
+  CorruptFrameHeader(&frame_header_);
+  CorruptFrameHeader(&hpack_first_frame_header_);
+
+  frame_decoder_ = std::make_unique<Http2FrameDecoder>(this);
+  hpack_decoder_ = nullptr;
 }
 
 Http2DecoderAdapter::~Http2DecoderAdapter() = default;
@@ -287,10 +302,6 @@
   return total_processed;
 }
 
-void Http2DecoderAdapter::Reset() {
-  ResetInternal();
-}
-
 Http2DecoderAdapter::SpdyState Http2DecoderAdapter::state() const {
   return spdy_state_;
 }
@@ -889,26 +900,6 @@
   set_spdy_state(SpdyState::SPDY_READY_FOR_FRAME);
 }
 
-// ResetInternal is called from the constructor, and during tests, but not
-// otherwise (i.e. not between every frame).
-void Http2DecoderAdapter::ResetInternal() {
-  set_spdy_state(SpdyState::SPDY_READY_FOR_FRAME);
-  spdy_framer_error_ = SpdyFramerError::SPDY_NO_ERROR;
-
-  decoded_frame_header_ = false;
-  has_frame_header_ = false;
-  on_headers_called_ = false;
-  on_hpack_fragment_called_ = false;
-  latched_probable_http_response_ = false;
-  has_expected_frame_type_ = false;
-
-  CorruptFrameHeader(&frame_header_);
-  CorruptFrameHeader(&hpack_first_frame_header_);
-
-  frame_decoder_ = std::make_unique<Http2FrameDecoder>(this);
-  hpack_decoder_ = nullptr;
-}
-
 void Http2DecoderAdapter::set_spdy_state(SpdyState v) {
   QUICHE_DVLOG(2) << "set_spdy_state(" << StateToString(v) << ")";
   spdy_state_ = v;
diff --git a/spdy/core/http2_frame_decoder_adapter.h b/spdy/core/http2_frame_decoder_adapter.h
index 259924c..3ed18f2 100644
--- a/spdy/core/http2_frame_decoder_adapter.h
+++ b/spdy/core/http2_frame_decoder_adapter.h
@@ -103,6 +103,9 @@
   Http2DecoderAdapter();
   ~Http2DecoderAdapter() override;
 
+  Http2DecoderAdapter(const Http2DecoderAdapter&) = delete;
+  Http2DecoderAdapter& operator=(const Http2DecoderAdapter&) = delete;
+
   // Set callbacks to be called from the framer.  A visitor must be set, or
   // else the framer will likely crash.  It is acceptable for the visitor
   // to do nothing.  If this is called multiple times, only the last visitor
@@ -137,9 +140,6 @@
   // is guaranteed to be called exactly once, with the entire payload or field.
   size_t ProcessInput(const char* data, size_t len);
 
-  // Reset the decoder (used just for tests at this time).
-  void Reset();
-
   // Current state of the decoder.
   SpdyState state() const;
 
@@ -224,10 +224,6 @@
   void DetermineSpdyState(DecodeStatus status);
   void ResetBetweenFrames();
 
-  // ResetInternal is called from the constructor, and during tests, but not
-  // otherwise (i.e. not between every frame).
-  void ResetInternal();
-
   void set_spdy_state(SpdyState v);
 
   void SetSpdyErrorAndNotify(SpdyFramerError error, std::string detailed_error);
@@ -296,8 +292,7 @@
   // clearing if the adapter is to be used for another connection.
   std::unique_ptr<spdy::HpackDecoderAdapter> hpack_decoder_ = nullptr;
 
-  // The HTTP/2 frame decoder. Accessed via a unique_ptr to allow replacement
-  // (e.g. in tests) when Reset() is called.
+  // The HTTP/2 frame decoder.
   std::unique_ptr<Http2FrameDecoder> frame_decoder_;
 
   // Next frame type expected. Currently only used for CONTINUATION frames,
diff --git a/spdy/core/spdy_framer_test.cc b/spdy/core/spdy_framer_test.cc
index 1b20d9b..80e6256 100644
--- a/spdy/core/spdy_framer_test.cc
+++ b/spdy/core/spdy_framer_test.cc
@@ -18,6 +18,7 @@
 #include "common/platform/api/quiche_test.h"
 #include "common/quiche_text_utils.h"
 #include "spdy/core/array_output_buffer.h"
+#include "spdy/core/http2_frame_decoder_adapter.h"
 #include "spdy/core/mock_spdy_framer_visitor.h"
 #include "spdy/core/recording_headers_handler.h"
 #include "spdy/core/spdy_bitmasks.h"
@@ -591,7 +592,8 @@
  public:
   SpdyFramerTest()
       : output_(output_buffer, kSize),
-        framer_(SpdyFramer::ENABLE_COMPRESSION) {}
+        framer_(SpdyFramer::ENABLE_COMPRESSION),
+        deframer_(absl::make_unique<Http2DecoderAdapter>()) {}
 
  protected:
   void SetUp() override {
@@ -620,7 +622,7 @@
   bool use_output_ = false;
   ArrayOutputBuffer output_;
   SpdyFramer framer_;
-  Http2DecoderAdapter deframer_;
+  std::unique_ptr<Http2DecoderAdapter> deframer_;
 };
 
 INSTANTIATE_TEST_SUITE_P(SpdyFramerTests,
@@ -697,7 +699,7 @@
 // max size, we do not set an error in ProcessInput.
 TEST_P(SpdyFramerTest, AcceptMaxFrameSizeSetting) {
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
 
   // DATA frame with maximum allowed payload length.
   unsigned char kH2FrameData[] = {
@@ -714,15 +716,15 @@
   EXPECT_CALL(visitor, OnCommonHeader(1, 16384, 0x0, 0x0));
   EXPECT_CALL(visitor, OnDataFrameHeader(1, 1 << 14, false));
   EXPECT_CALL(visitor, OnStreamFrameData(1, _, 4));
-  deframer_.ProcessInput(frame.data(), frame.size());
-  EXPECT_FALSE(deframer_.HasError());
+  deframer_->ProcessInput(frame.data(), frame.size());
+  EXPECT_FALSE(deframer_->HasError());
 }
 
 // Test that if we receive a frame with a payload length larger than the default
 // max size, we set an error of SPDY_INVALID_CONTROL_FRAME_SIZE.
 TEST_P(SpdyFramerTest, ExceedMaxFrameSizeSetting) {
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
 
   // DATA frame with too large payload length.
   unsigned char kH2FrameData[] = {
@@ -738,22 +740,22 @@
 
   EXPECT_CALL(visitor, OnCommonHeader(1, 16385, 0x0, 0x0));
   EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_OVERSIZED_PAYLOAD, _));
-  deframer_.ProcessInput(frame.data(), frame.size());
-  EXPECT_TRUE(deframer_.HasError());
+  deframer_->ProcessInput(frame.data(), frame.size());
+  EXPECT_TRUE(deframer_->HasError());
   EXPECT_EQ(Http2DecoderAdapter::SPDY_OVERSIZED_PAYLOAD,
-            deframer_.spdy_framer_error())
+            deframer_->spdy_framer_error())
       << Http2DecoderAdapter::SpdyFramerErrorToString(
-             deframer_.spdy_framer_error());
+             deframer_->spdy_framer_error());
 }
 
 // Test that if we set a larger max frame size and then receive a frame with a
 // payload length at that larger size, we do not set an error in ProcessInput.
 TEST_P(SpdyFramerTest, AcceptLargerMaxFrameSizeSetting) {
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
 
   const size_t big_frame_size = (1 << 14) + 1;
-  deframer_.SetMaxFrameSize(big_frame_size);
+  deframer_->SetMaxFrameSize(big_frame_size);
 
   // DATA frame with larger-than-default but acceptable payload length.
   unsigned char kH2FrameData[] = {
@@ -770,15 +772,15 @@
   EXPECT_CALL(visitor, OnCommonHeader(1, big_frame_size, 0x0, 0x0));
   EXPECT_CALL(visitor, OnDataFrameHeader(1, big_frame_size, false));
   EXPECT_CALL(visitor, OnStreamFrameData(1, _, 4));
-  deframer_.ProcessInput(frame.data(), frame.size());
-  EXPECT_FALSE(deframer_.HasError());
+  deframer_->ProcessInput(frame.data(), frame.size());
+  EXPECT_FALSE(deframer_->HasError());
 }
 
 // Test that if we receive a DATA frame with padding length larger than the
 // payload length, we set an error of SPDY_INVALID_PADDING
 TEST_P(SpdyFramerTest, OversizedDataPaddingError) {
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
 
   // DATA frame with invalid padding length.
   // |kH2FrameData| has to be |unsigned char|, because Chromium on Windows uses
@@ -803,12 +805,12 @@
     EXPECT_CALL(visitor, OnStreamPadding(1, 1));
     EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_INVALID_PADDING, _));
   }
-  EXPECT_GT(frame.size(), deframer_.ProcessInput(frame.data(), frame.size()));
-  EXPECT_TRUE(deframer_.HasError());
+  EXPECT_GT(frame.size(), deframer_->ProcessInput(frame.data(), frame.size()));
+  EXPECT_TRUE(deframer_->HasError());
   EXPECT_EQ(Http2DecoderAdapter::SPDY_INVALID_PADDING,
-            deframer_.spdy_framer_error())
+            deframer_->spdy_framer_error())
       << Http2DecoderAdapter::SpdyFramerErrorToString(
-             deframer_.spdy_framer_error());
+             deframer_->spdy_framer_error());
 }
 
 // Test that if we receive a DATA frame with padding length not larger than the
@@ -816,7 +818,7 @@
 TEST_P(SpdyFramerTest, CorrectlySizedDataPaddingNoError) {
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
 
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
 
   // DATA frame with valid Padding length
   char kH2FrameData[] = {
@@ -841,11 +843,11 @@
     EXPECT_CALL(visitor, OnStreamPadding(1, 4));
   }
 
-  EXPECT_EQ(frame.size(), deframer_.ProcessInput(frame.data(), frame.size()));
-  EXPECT_FALSE(deframer_.HasError());
-  EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_.spdy_framer_error())
+  EXPECT_EQ(frame.size(), deframer_->ProcessInput(frame.data(), frame.size()));
+  EXPECT_FALSE(deframer_->HasError());
+  EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_->spdy_framer_error())
       << Http2DecoderAdapter::SpdyFramerErrorToString(
-             deframer_.spdy_framer_error());
+             deframer_->spdy_framer_error());
 }
 
 // Test that if we receive a HEADERS frame with padding length larger than the
@@ -853,7 +855,7 @@
 TEST_P(SpdyFramerTest, OversizedHeadersPaddingError) {
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
 
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
 
   // HEADERS frame with invalid padding length.
   // |kH2FrameData| has to be |unsigned char|, because Chromium on Windows uses
@@ -875,12 +877,12 @@
   EXPECT_CALL(visitor, OnHeaders(1, false, 0, 0, false, false, false));
   EXPECT_CALL(visitor, OnHeaderFrameStart(1)).Times(1);
   EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_INVALID_PADDING, _));
-  EXPECT_EQ(frame.size(), deframer_.ProcessInput(frame.data(), frame.size()));
-  EXPECT_TRUE(deframer_.HasError());
+  EXPECT_EQ(frame.size(), deframer_->ProcessInput(frame.data(), frame.size()));
+  EXPECT_TRUE(deframer_->HasError());
   EXPECT_EQ(Http2DecoderAdapter::SPDY_INVALID_PADDING,
-            deframer_.spdy_framer_error())
+            deframer_->spdy_framer_error())
       << Http2DecoderAdapter::SpdyFramerErrorToString(
-             deframer_.spdy_framer_error());
+             deframer_->spdy_framer_error());
 }
 
 // Test that if we receive a HEADERS frame with padding length not larger
@@ -888,7 +890,7 @@
 TEST_P(SpdyFramerTest, CorrectlySizedHeadersPaddingNoError) {
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
 
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
 
   // HEADERS frame with invalid Padding length
   char kH2FrameData[] = {
@@ -906,11 +908,11 @@
   EXPECT_CALL(visitor, OnHeaders(1, false, 0, 0, false, false, false));
   EXPECT_CALL(visitor, OnHeaderFrameStart(1)).Times(1);
 
-  EXPECT_EQ(frame.size(), deframer_.ProcessInput(frame.data(), frame.size()));
-  EXPECT_FALSE(deframer_.HasError());
-  EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_.spdy_framer_error())
+  EXPECT_EQ(frame.size(), deframer_->ProcessInput(frame.data(), frame.size()));
+  EXPECT_FALSE(deframer_->HasError());
+  EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_->spdy_framer_error())
       << Http2DecoderAdapter::SpdyFramerErrorToString(
-             deframer_.spdy_framer_error());
+             deframer_->spdy_framer_error());
 }
 
 // Test that if we receive a DATA with stream ID zero, we signal an error
@@ -918,7 +920,7 @@
 TEST_P(SpdyFramerTest, DataWithStreamIdZero) {
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
 
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
 
   const char bytes[] = "hello";
   SpdyDataIR data_ir(/* stream_id = */ 0, bytes);
@@ -927,12 +929,12 @@
   // We shouldn't have to read the whole frame before we signal an error.
   EXPECT_CALL(visitor, OnCommonHeader(0, _, 0x0, _));
   EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID, _));
-  EXPECT_GT(frame.size(), deframer_.ProcessInput(frame.data(), frame.size()));
-  EXPECT_TRUE(deframer_.HasError());
+  EXPECT_GT(frame.size(), deframer_->ProcessInput(frame.data(), frame.size()));
+  EXPECT_TRUE(deframer_->HasError());
   EXPECT_EQ(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID,
-            deframer_.spdy_framer_error())
+            deframer_->spdy_framer_error())
       << Http2DecoderAdapter::SpdyFramerErrorToString(
-             deframer_.spdy_framer_error());
+             deframer_->spdy_framer_error());
 }
 
 // Test that if we receive a HEADERS with stream ID zero, we signal an error
@@ -940,7 +942,7 @@
 TEST_P(SpdyFramerTest, HeadersWithStreamIdZero) {
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
 
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
 
   SpdyHeadersIR headers(/* stream_id = */ 0);
   headers.SetHeader("alpha", "beta");
@@ -950,12 +952,12 @@
   // We shouldn't have to read the whole frame before we signal an error.
   EXPECT_CALL(visitor, OnCommonHeader(0, _, 0x1, _));
   EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID, _));
-  EXPECT_GT(frame.size(), deframer_.ProcessInput(frame.data(), frame.size()));
-  EXPECT_TRUE(deframer_.HasError());
+  EXPECT_GT(frame.size(), deframer_->ProcessInput(frame.data(), frame.size()));
+  EXPECT_TRUE(deframer_->HasError());
   EXPECT_EQ(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID,
-            deframer_.spdy_framer_error())
+            deframer_->spdy_framer_error())
       << Http2DecoderAdapter::SpdyFramerErrorToString(
-             deframer_.spdy_framer_error());
+             deframer_->spdy_framer_error());
 }
 
 // Test that if we receive a PRIORITY with stream ID zero, we signal an error
@@ -963,7 +965,7 @@
 TEST_P(SpdyFramerTest, PriorityWithStreamIdZero) {
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
 
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
 
   SpdyPriorityIR priority_ir(/* stream_id = */ 0,
                              /* parent_stream_id = */ 1,
@@ -978,12 +980,12 @@
   // We shouldn't have to read the whole frame before we signal an error.
   EXPECT_CALL(visitor, OnCommonHeader(0, _, 0x2, _));
   EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID, _));
-  EXPECT_GT(frame.size(), deframer_.ProcessInput(frame.data(), frame.size()));
-  EXPECT_TRUE(deframer_.HasError());
+  EXPECT_GT(frame.size(), deframer_->ProcessInput(frame.data(), frame.size()));
+  EXPECT_TRUE(deframer_->HasError());
   EXPECT_EQ(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID,
-            deframer_.spdy_framer_error())
+            deframer_->spdy_framer_error())
       << Http2DecoderAdapter::SpdyFramerErrorToString(
-             deframer_.spdy_framer_error());
+             deframer_->spdy_framer_error());
 }
 
 // Test that if we receive a RST_STREAM with stream ID zero, we signal an error
@@ -991,7 +993,7 @@
 TEST_P(SpdyFramerTest, RstStreamWithStreamIdZero) {
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
 
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
 
   SpdyRstStreamIR rst_stream_ir(/* stream_id = */ 0, ERROR_CODE_PROTOCOL_ERROR);
   SpdySerializedFrame frame(framer_.SerializeRstStream(rst_stream_ir));
@@ -1003,12 +1005,12 @@
   // We shouldn't have to read the whole frame before we signal an error.
   EXPECT_CALL(visitor, OnCommonHeader(0, _, 0x3, _));
   EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID, _));
-  EXPECT_GT(frame.size(), deframer_.ProcessInput(frame.data(), frame.size()));
-  EXPECT_TRUE(deframer_.HasError());
+  EXPECT_GT(frame.size(), deframer_->ProcessInput(frame.data(), frame.size()));
+  EXPECT_TRUE(deframer_->HasError());
   EXPECT_EQ(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID,
-            deframer_.spdy_framer_error())
+            deframer_->spdy_framer_error())
       << Http2DecoderAdapter::SpdyFramerErrorToString(
-             deframer_.spdy_framer_error());
+             deframer_->spdy_framer_error());
 }
 
 // Test that if we receive a SETTINGS with stream ID other than zero,
@@ -1016,7 +1018,7 @@
 TEST_P(SpdyFramerTest, SettingsWithStreamIdNotZero) {
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
 
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
 
   // Settings frame with invalid StreamID of 0x01
   char kH2FrameData[] = {
@@ -1033,12 +1035,12 @@
   // We shouldn't have to read the whole frame before we signal an error.
   EXPECT_CALL(visitor, OnCommonHeader(1, 6, 0x4, 0x0));
   EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID, _));
-  EXPECT_GT(frame.size(), deframer_.ProcessInput(frame.data(), frame.size()));
-  EXPECT_TRUE(deframer_.HasError());
+  EXPECT_GT(frame.size(), deframer_->ProcessInput(frame.data(), frame.size()));
+  EXPECT_TRUE(deframer_->HasError());
   EXPECT_EQ(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID,
-            deframer_.spdy_framer_error())
+            deframer_->spdy_framer_error())
       << Http2DecoderAdapter::SpdyFramerErrorToString(
-             deframer_.spdy_framer_error());
+             deframer_->spdy_framer_error());
 }
 
 // Test that if we receive a GOAWAY with stream ID other than zero,
@@ -1046,7 +1048,7 @@
 TEST_P(SpdyFramerTest, GoawayWithStreamIdNotZero) {
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
 
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
 
   // GOAWAY frame with invalid StreamID of 0x01
   char kH2FrameData[] = {
@@ -1064,12 +1066,12 @@
   // We shouldn't have to read the whole frame before we signal an error.
   EXPECT_CALL(visitor, OnCommonHeader(1, 10, 0x7, 0x0));
   EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID, _));
-  EXPECT_GT(frame.size(), deframer_.ProcessInput(frame.data(), frame.size()));
-  EXPECT_TRUE(deframer_.HasError());
+  EXPECT_GT(frame.size(), deframer_->ProcessInput(frame.data(), frame.size()));
+  EXPECT_TRUE(deframer_->HasError());
   EXPECT_EQ(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID,
-            deframer_.spdy_framer_error())
+            deframer_->spdy_framer_error())
       << Http2DecoderAdapter::SpdyFramerErrorToString(
-             deframer_.spdy_framer_error());
+             deframer_->spdy_framer_error());
 }
 
 // Test that if we receive a CONTINUATION with stream ID zero, we signal
@@ -1077,7 +1079,7 @@
 TEST_P(SpdyFramerTest, ContinuationWithStreamIdZero) {
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
 
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
 
   SpdyContinuationIR continuation(/* stream_id = */ 0);
   std::string some_nonsense_encoding = "some nonsense encoding";
@@ -1092,12 +1094,12 @@
   // We shouldn't have to read the whole frame before we signal an error.
   EXPECT_CALL(visitor, OnCommonHeader(0, _, 0x9, _));
   EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID, _));
-  EXPECT_GT(frame.size(), deframer_.ProcessInput(frame.data(), frame.size()));
-  EXPECT_TRUE(deframer_.HasError());
+  EXPECT_GT(frame.size(), deframer_->ProcessInput(frame.data(), frame.size()));
+  EXPECT_TRUE(deframer_->HasError());
   EXPECT_EQ(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID,
-            deframer_.spdy_framer_error())
+            deframer_->spdy_framer_error())
       << Http2DecoderAdapter::SpdyFramerErrorToString(
-             deframer_.spdy_framer_error());
+             deframer_->spdy_framer_error());
 }
 
 // Test that if we receive a PUSH_PROMISE with stream ID zero, we signal
@@ -1105,7 +1107,7 @@
 TEST_P(SpdyFramerTest, PushPromiseWithStreamIdZero) {
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
 
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
 
   SpdyPushPromiseIR push_promise(/* stream_id = */ 0,
                                  /* promised_stream_id = */ 4);
@@ -1116,12 +1118,12 @@
   // We shouldn't have to read the whole frame before we signal an error.
   EXPECT_CALL(visitor, OnCommonHeader(0, _, 0x5, _));
   EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID, _));
-  EXPECT_GT(frame.size(), deframer_.ProcessInput(frame.data(), frame.size()));
-  EXPECT_TRUE(deframer_.HasError());
+  EXPECT_GT(frame.size(), deframer_->ProcessInput(frame.data(), frame.size()));
+  EXPECT_TRUE(deframer_->HasError());
   EXPECT_EQ(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID,
-            deframer_.spdy_framer_error())
+            deframer_->spdy_framer_error())
       << Http2DecoderAdapter::SpdyFramerErrorToString(
-             deframer_.spdy_framer_error());
+             deframer_->spdy_framer_error());
 }
 
 // Test that if we receive a PUSH_PROMISE with promised stream ID zero, we
@@ -1129,7 +1131,7 @@
 TEST_P(SpdyFramerTest, PushPromiseWithPromisedStreamIdZero) {
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
 
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
 
   SpdyPushPromiseIR push_promise(/* stream_id = */ 3,
                                  /* promised_stream_id = */ 0);
@@ -1140,12 +1142,12 @@
   EXPECT_CALL(visitor, OnCommonHeader(3, _, 0x5, _));
   EXPECT_CALL(visitor,
               OnError(Http2DecoderAdapter::SPDY_INVALID_CONTROL_FRAME, _));
-  deframer_.ProcessInput(frame.data(), frame.size());
-  EXPECT_TRUE(deframer_.HasError());
+  deframer_->ProcessInput(frame.data(), frame.size());
+  EXPECT_TRUE(deframer_->HasError());
   EXPECT_EQ(Http2DecoderAdapter::SPDY_INVALID_CONTROL_FRAME,
-            deframer_.spdy_framer_error())
+            deframer_->spdy_framer_error())
       << Http2DecoderAdapter::SpdyFramerErrorToString(
-             deframer_.spdy_framer_error());
+             deframer_->spdy_framer_error());
 }
 
 TEST_P(SpdyFramerTest, MultiValueHeader) {
@@ -1332,7 +1334,7 @@
 
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
 
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
 
   testing::InSequence s;
   EXPECT_CALL(visitor, OnCommonHeader(1, 1, 0x1, 0x4));
@@ -1348,15 +1350,15 @@
   EXPECT_CALL(visitor, OnHeaderFrameEnd(3));
   EXPECT_CALL(visitor, OnCommonHeader(3, 8, 0x0, 0x0));
   EXPECT_CALL(visitor, OnDataFrameHeader(3, 8, false))
-      .WillOnce(
-          testing::InvokeWithoutArgs([this]() { deframer_.StopProcessing(); }));
+      .WillOnce(testing::InvokeWithoutArgs(
+          [this]() { deframer_->StopProcessing(); }));
   // Remaining frames are not processed due to the error.
   EXPECT_CALL(
       visitor,
       OnError(http2::Http2DecoderAdapter::SpdyFramerError::SPDY_STOP_PROCESSING,
               "Ignoring further events on this connection."));
 
-  size_t processed = deframer_.ProcessInput(
+  size_t processed = deframer_->ProcessInput(
       reinterpret_cast<const char*>(kH2Input), sizeof(kH2Input));
   EXPECT_LT(processed, sizeof(kH2Input));
 }
@@ -2467,7 +2469,7 @@
 TEST_P(SpdyFramerTest, SendUnexpectedContinuation) {
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
 
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
 
   // frame-format off
   char kH2FrameData[] = {
@@ -2495,12 +2497,12 @@
   // We shouldn't have to read the whole frame before we signal an error.
   EXPECT_CALL(visitor, OnCommonHeader(42, 18, 0x9, 0x4));
   EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_UNEXPECTED_FRAME, _));
-  EXPECT_GT(frame.size(), deframer_.ProcessInput(frame.data(), frame.size()));
-  EXPECT_TRUE(deframer_.HasError());
+  EXPECT_GT(frame.size(), deframer_->ProcessInput(frame.data(), frame.size()));
+  EXPECT_TRUE(deframer_->HasError());
   EXPECT_EQ(Http2DecoderAdapter::SPDY_UNEXPECTED_FRAME,
-            deframer_.spdy_framer_error())
+            deframer_->spdy_framer_error())
       << Http2DecoderAdapter::SpdyFramerErrorToString(
-             deframer_.spdy_framer_error());
+             deframer_->spdy_framer_error());
 }
 
 TEST_P(SpdyFramerTest, CreatePushPromiseThenContinuationUncompressed) {
@@ -3309,7 +3311,7 @@
   const char data_payload[] = "hello";
 
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
 
   SpdyDataIR data_ir(/* stream_id = */ 1, data_payload);
   data_ir.set_padding_len(kPaddingLen);
@@ -3323,54 +3325,60 @@
   EXPECT_CALL(visitor,
               OnDataFrameHeader(1, kPaddingLen + strlen(data_payload), false));
   QUICHE_CHECK_EQ(kDataFrameMinimumSize,
-                  deframer_.ProcessInput(frame.data(), kDataFrameMinimumSize));
-  QUICHE_CHECK_EQ(deframer_.state(),
+                  deframer_->ProcessInput(frame.data(), kDataFrameMinimumSize));
+  QUICHE_CHECK_EQ(deframer_->state(),
                   Http2DecoderAdapter::SPDY_READ_DATA_FRAME_PADDING_LENGTH);
-  QUICHE_CHECK_EQ(deframer_.spdy_framer_error(),
+  QUICHE_CHECK_EQ(deframer_->spdy_framer_error(),
                   Http2DecoderAdapter::SPDY_NO_ERROR);
   bytes_consumed += kDataFrameMinimumSize;
 
   // Send the padding length field.
   EXPECT_CALL(visitor, OnStreamPadLength(1, kPaddingLen - 1));
-  QUICHE_CHECK_EQ(1u, deframer_.ProcessInput(frame.data() + bytes_consumed, 1));
-  QUICHE_CHECK_EQ(deframer_.state(),
+  QUICHE_CHECK_EQ(1u,
+                  deframer_->ProcessInput(frame.data() + bytes_consumed, 1));
+  QUICHE_CHECK_EQ(deframer_->state(),
                   Http2DecoderAdapter::SPDY_FORWARD_STREAM_FRAME);
-  QUICHE_CHECK_EQ(deframer_.spdy_framer_error(),
+  QUICHE_CHECK_EQ(deframer_->spdy_framer_error(),
                   Http2DecoderAdapter::SPDY_NO_ERROR);
   bytes_consumed += 1;
 
   // Send the first two bytes of the data payload, i.e., "he".
   EXPECT_CALL(visitor, OnStreamFrameData(1, _, 2));
-  QUICHE_CHECK_EQ(2u, deframer_.ProcessInput(frame.data() + bytes_consumed, 2));
-  QUICHE_CHECK_EQ(deframer_.state(),
+  QUICHE_CHECK_EQ(2u,
+                  deframer_->ProcessInput(frame.data() + bytes_consumed, 2));
+  QUICHE_CHECK_EQ(deframer_->state(),
                   Http2DecoderAdapter::SPDY_FORWARD_STREAM_FRAME);
-  QUICHE_CHECK_EQ(deframer_.spdy_framer_error(),
+  QUICHE_CHECK_EQ(deframer_->spdy_framer_error(),
                   Http2DecoderAdapter::SPDY_NO_ERROR);
   bytes_consumed += 2;
 
   // Send the rest three bytes of the data payload, i.e., "llo".
   EXPECT_CALL(visitor, OnStreamFrameData(1, _, 3));
-  QUICHE_CHECK_EQ(3u, deframer_.ProcessInput(frame.data() + bytes_consumed, 3));
-  QUICHE_CHECK_EQ(deframer_.state(), Http2DecoderAdapter::SPDY_CONSUME_PADDING);
-  QUICHE_CHECK_EQ(deframer_.spdy_framer_error(),
+  QUICHE_CHECK_EQ(3u,
+                  deframer_->ProcessInput(frame.data() + bytes_consumed, 3));
+  QUICHE_CHECK_EQ(deframer_->state(),
+                  Http2DecoderAdapter::SPDY_CONSUME_PADDING);
+  QUICHE_CHECK_EQ(deframer_->spdy_framer_error(),
                   Http2DecoderAdapter::SPDY_NO_ERROR);
   bytes_consumed += 3;
 
   // Send the first 100 bytes of the padding payload.
   EXPECT_CALL(visitor, OnStreamPadding(1, 100));
   QUICHE_CHECK_EQ(100u,
-                  deframer_.ProcessInput(frame.data() + bytes_consumed, 100));
-  QUICHE_CHECK_EQ(deframer_.state(), Http2DecoderAdapter::SPDY_CONSUME_PADDING);
-  QUICHE_CHECK_EQ(deframer_.spdy_framer_error(),
+                  deframer_->ProcessInput(frame.data() + bytes_consumed, 100));
+  QUICHE_CHECK_EQ(deframer_->state(),
+                  Http2DecoderAdapter::SPDY_CONSUME_PADDING);
+  QUICHE_CHECK_EQ(deframer_->spdy_framer_error(),
                   Http2DecoderAdapter::SPDY_NO_ERROR);
   bytes_consumed += 100;
 
   // Send rest of the padding payload.
   EXPECT_CALL(visitor, OnStreamPadding(1, 18));
   QUICHE_CHECK_EQ(18u,
-                  deframer_.ProcessInput(frame.data() + bytes_consumed, 18));
-  QUICHE_CHECK_EQ(deframer_.state(), Http2DecoderAdapter::SPDY_READY_FOR_FRAME);
-  QUICHE_CHECK_EQ(deframer_.spdy_framer_error(),
+                  deframer_->ProcessInput(frame.data() + bytes_consumed, 18));
+  QUICHE_CHECK_EQ(deframer_->state(),
+                  Http2DecoderAdapter::SPDY_READY_FOR_FRAME);
+  QUICHE_CHECK_EQ(deframer_->spdy_framer_error(),
                   Http2DecoderAdapter::SPDY_NO_ERROR);
 }
 
@@ -3604,7 +3612,7 @@
   TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
   // Assume the unknown frame is allowed
   visitor.on_unknown_frame_result_ = true;
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
   visitor.SimulateInFramer(kInput, sizeof(kInput));
 
   EXPECT_EQ(1, visitor.error_count_);
@@ -3644,7 +3652,7 @@
   TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
   TestExtension extension;
   visitor.set_extension_visitor(&extension);
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
   visitor.SimulateInFramer(kInput, sizeof(kInput));
 
   EXPECT_EQ(1, visitor.error_count_);
@@ -3680,7 +3688,7 @@
   };
 
   TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
   visitor.SimulateInFramer(kInput, sizeof(kInput));
 
   EXPECT_EQ(1, visitor.error_count_);
@@ -3706,7 +3714,7 @@
   };
 
   TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
   visitor.SimulateInFramer(kInput, sizeof(kInput));
 
   EXPECT_EQ(1, visitor.error_count_);
@@ -3738,7 +3746,7 @@
   };
 
   TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
   visitor.SimulateInFramer(kInput, sizeof(kInput));
 
   EXPECT_EQ(1, visitor.error_count_);
@@ -3774,7 +3782,7 @@
   };
 
   TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
   visitor.SimulateInFramer(kInput, sizeof(kInput));
 
   EXPECT_EQ(1, visitor.error_count_);
@@ -4008,7 +4016,7 @@
 
     testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
 
-    deframer_.set_visitor(&visitor);
+    deframer_->set_visitor(&visitor);
 
     SpdyDataIR data_ir(/* stream_id = */ 1, "hello");
     SpdySerializedFrame frame(framer_.SerializeData(data_ir));
@@ -4033,27 +4041,27 @@
       }
     }
 
-    deframer_.ProcessInput(frame.data(), frame.size());
+    deframer_->ProcessInput(frame.data(), frame.size());
     if (flags & ~valid_data_flags) {
-      EXPECT_EQ(Http2DecoderAdapter::SPDY_ERROR, deframer_.state());
+      EXPECT_EQ(Http2DecoderAdapter::SPDY_ERROR, deframer_->state());
       EXPECT_EQ(Http2DecoderAdapter::SPDY_INVALID_DATA_FRAME_FLAGS,
-                deframer_.spdy_framer_error())
+                deframer_->spdy_framer_error())
           << Http2DecoderAdapter::SpdyFramerErrorToString(
-                 deframer_.spdy_framer_error());
+                 deframer_->spdy_framer_error());
     } else if (flags & DATA_FLAG_PADDED) {
-      EXPECT_EQ(Http2DecoderAdapter::SPDY_ERROR, deframer_.state());
+      EXPECT_EQ(Http2DecoderAdapter::SPDY_ERROR, deframer_->state());
       EXPECT_EQ(Http2DecoderAdapter::SPDY_INVALID_PADDING,
-                deframer_.spdy_framer_error())
+                deframer_->spdy_framer_error())
           << Http2DecoderAdapter::SpdyFramerErrorToString(
-                 deframer_.spdy_framer_error());
+                 deframer_->spdy_framer_error());
     } else {
-      EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state());
+      EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_->state());
       EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR,
-                deframer_.spdy_framer_error())
+                deframer_->spdy_framer_error())
           << Http2DecoderAdapter::SpdyFramerErrorToString(
-                 deframer_.spdy_framer_error());
+                 deframer_->spdy_framer_error());
     }
-    deframer_.Reset();
+    deframer_ = absl::make_unique<Http2DecoderAdapter>();
   } while (++flags != 0);
 }
 
@@ -4064,7 +4072,7 @@
                  << "Flags " << std::hex << static_cast<int>(flags));
 
     testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
-    deframer_.set_visitor(&visitor);
+    deframer_->set_visitor(&visitor);
 
     SpdyRstStreamIR rst_stream(/* stream_id = */ 13, ERROR_CODE_CANCEL);
     SpdySerializedFrame frame(framer_.SerializeRstStream(rst_stream));
@@ -4078,12 +4086,13 @@
     EXPECT_CALL(visitor, OnCommonHeader(13, 4, 0x3, flags));
     EXPECT_CALL(visitor, OnRstStream(13, ERROR_CODE_CANCEL));
 
-    deframer_.ProcessInput(frame.data(), frame.size());
-    EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state());
-    EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_.spdy_framer_error())
+    deframer_->ProcessInput(frame.data(), frame.size());
+    EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_->state());
+    EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR,
+              deframer_->spdy_framer_error())
         << Http2DecoderAdapter::SpdyFramerErrorToString(
-               deframer_.spdy_framer_error());
-    deframer_.Reset();
+               deframer_->spdy_framer_error());
+    deframer_ = absl::make_unique<Http2DecoderAdapter>();
   } while (++flags != 0);
 }
 
@@ -4094,7 +4103,7 @@
                  << "Flags " << std::hex << static_cast<int>(flags));
 
     testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
-    deframer_.set_visitor(&visitor);
+    deframer_->set_visitor(&visitor);
 
     SpdySettingsIR settings_ir;
     settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE, 16);
@@ -4115,22 +4124,22 @@
       EXPECT_CALL(visitor, OnSettingsEnd());
     }
 
-    deframer_.ProcessInput(frame.data(), frame.size());
+    deframer_->ProcessInput(frame.data(), frame.size());
     if (flags & SETTINGS_FLAG_ACK) {
       // The frame is invalid because ACK frames should have no payload.
-      EXPECT_EQ(Http2DecoderAdapter::SPDY_ERROR, deframer_.state());
+      EXPECT_EQ(Http2DecoderAdapter::SPDY_ERROR, deframer_->state());
       EXPECT_EQ(Http2DecoderAdapter::SPDY_INVALID_CONTROL_FRAME_SIZE,
-                deframer_.spdy_framer_error())
+                deframer_->spdy_framer_error())
           << Http2DecoderAdapter::SpdyFramerErrorToString(
-                 deframer_.spdy_framer_error());
+                 deframer_->spdy_framer_error());
     } else {
-      EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state());
+      EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_->state());
       EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR,
-                deframer_.spdy_framer_error())
+                deframer_->spdy_framer_error())
           << Http2DecoderAdapter::SpdyFramerErrorToString(
-                 deframer_.spdy_framer_error());
+                 deframer_->spdy_framer_error());
     }
-    deframer_.Reset();
+    deframer_ = absl::make_unique<Http2DecoderAdapter>();
   } while (++flags != 0);
 }
 
@@ -4142,7 +4151,7 @@
 
     testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
 
-    deframer_.set_visitor(&visitor);
+    deframer_->set_visitor(&visitor);
 
     SpdyGoAwayIR goaway_ir(/* last_good_stream_id = */ 97, ERROR_CODE_NO_ERROR,
                            "test");
@@ -4159,12 +4168,13 @@
     EXPECT_CALL(visitor, OnGoAwayFrameData)
         .WillRepeatedly(testing::Return(true));
 
-    deframer_.ProcessInput(frame.data(), frame.size());
-    EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state());
-    EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_.spdy_framer_error())
+    deframer_->ProcessInput(frame.data(), frame.size());
+    EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_->state());
+    EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR,
+              deframer_->spdy_framer_error())
         << Http2DecoderAdapter::SpdyFramerErrorToString(
-               deframer_.spdy_framer_error());
-    deframer_.Reset();
+               deframer_->spdy_framer_error());
+    deframer_ = absl::make_unique<Http2DecoderAdapter>();
   } while (++flags != 0);
 }
 
@@ -4225,7 +4235,6 @@
     EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer.spdy_framer_error())
         << Http2DecoderAdapter::SpdyFramerErrorToString(
                deframer.spdy_framer_error());
-    deframer.Reset();
   } while (++flags != 0);
 }
 
@@ -4236,7 +4245,7 @@
                  << "Flags " << std::hex << static_cast<int>(flags));
 
     testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
-    deframer_.set_visitor(&visitor);
+    deframer_->set_visitor(&visitor);
 
     SpdySerializedFrame frame(framer_.SerializePing(SpdyPingIR(42)));
     SetFrameFlags(&frame, flags);
@@ -4244,12 +4253,13 @@
     EXPECT_CALL(visitor, OnCommonHeader(0, 8, 0x6, flags));
     EXPECT_CALL(visitor, OnPing(42, flags & PING_FLAG_ACK));
 
-    deframer_.ProcessInput(frame.data(), frame.size());
-    EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state());
-    EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_.spdy_framer_error())
+    deframer_->ProcessInput(frame.data(), frame.size());
+    EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_->state());
+    EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR,
+              deframer_->spdy_framer_error())
         << Http2DecoderAdapter::SpdyFramerErrorToString(
-               deframer_.spdy_framer_error());
-    deframer_.Reset();
+               deframer_->spdy_framer_error());
+    deframer_ = absl::make_unique<Http2DecoderAdapter>();
   } while (++flags != 0);
 }
 
@@ -4261,7 +4271,7 @@
 
     testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
 
-    deframer_.set_visitor(&visitor);
+    deframer_->set_visitor(&visitor);
 
     SpdySerializedFrame frame(framer_.SerializeWindowUpdate(
         SpdyWindowUpdateIR(/* stream_id = */ 4, /* delta = */ 1024)));
@@ -4270,12 +4280,13 @@
     EXPECT_CALL(visitor, OnCommonHeader(4, 4, 0x8, flags));
     EXPECT_CALL(visitor, OnWindowUpdate(4, 1024));
 
-    deframer_.ProcessInput(frame.data(), frame.size());
-    EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state());
-    EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_.spdy_framer_error())
+    deframer_->ProcessInput(frame.data(), frame.size());
+    EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_->state());
+    EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR,
+              deframer_->spdy_framer_error())
         << Http2DecoderAdapter::SpdyFramerErrorToString(
-               deframer_.spdy_framer_error());
-    deframer_.Reset();
+               deframer_->spdy_framer_error());
+    deframer_ = absl::make_unique<Http2DecoderAdapter>();
   } while (++flags != 0);
 }
 
@@ -4412,27 +4423,28 @@
   };
 
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
 
   EXPECT_CALL(visitor, OnCommonHeader(1, 4, 0x3, 0x0));
   EXPECT_CALL(visitor, OnRstStream(1, ERROR_CODE_NO_ERROR));
-  deframer_.ProcessInput(reinterpret_cast<const char*>(kH2RstStreamInvalid),
-                         ABSL_ARRAYSIZE(kH2RstStreamInvalid));
-  EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state());
-  EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_.spdy_framer_error())
+  deframer_->ProcessInput(reinterpret_cast<const char*>(kH2RstStreamInvalid),
+                          ABSL_ARRAYSIZE(kH2RstStreamInvalid));
+  EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_->state());
+  EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_->spdy_framer_error())
       << Http2DecoderAdapter::SpdyFramerErrorToString(
-             deframer_.spdy_framer_error());
-  deframer_.Reset();
+             deframer_->spdy_framer_error());
+  deframer_ = absl::make_unique<Http2DecoderAdapter>();
+  deframer_->set_visitor(&visitor);
 
   EXPECT_CALL(visitor, OnCommonHeader(1, 4, 0x3, 0x0));
   EXPECT_CALL(visitor, OnRstStream(1, ERROR_CODE_INTERNAL_ERROR));
-  deframer_.ProcessInput(
+  deframer_->ProcessInput(
       reinterpret_cast<const char*>(kH2RstStreamNumStatusCodes),
       ABSL_ARRAYSIZE(kH2RstStreamNumStatusCodes));
-  EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state());
-  EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_.spdy_framer_error())
+  EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_->state());
+  EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_->spdy_framer_error())
       << Http2DecoderAdapter::SpdyFramerErrorToString(
-             deframer_.spdy_framer_error());
+             deframer_->spdy_framer_error());
 }
 
 // Test handling of GOAWAY frames with out-of-bounds status code.
@@ -4447,17 +4459,17 @@
       0x47, 0x41,              // Description
   };
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
 
   EXPECT_CALL(visitor, OnCommonHeader(0, 10, 0x7, 0x0));
   EXPECT_CALL(visitor, OnGoAway(1, ERROR_CODE_INTERNAL_ERROR));
   EXPECT_CALL(visitor, OnGoAwayFrameData).WillRepeatedly(testing::Return(true));
-  deframer_.ProcessInput(reinterpret_cast<const char*>(kH2FrameData),
-                         ABSL_ARRAYSIZE(kH2FrameData));
-  EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state());
-  EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_.spdy_framer_error())
+  deframer_->ProcessInput(reinterpret_cast<const char*>(kH2FrameData),
+                          ABSL_ARRAYSIZE(kH2FrameData));
+  EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_->state());
+  EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_->spdy_framer_error())
       << Http2DecoderAdapter::SpdyFramerErrorToString(
-             deframer_.spdy_framer_error());
+             deframer_->spdy_framer_error());
 }
 
 // Tests handling of a GOAWAY frame with out-of-bounds stream ID.
@@ -4473,17 +4485,17 @@
 
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
 
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
 
   EXPECT_CALL(visitor, OnCommonHeader(0, 8, 0x7, 0x0));
   EXPECT_CALL(visitor, OnGoAway(0x7fffffff, ERROR_CODE_NO_ERROR));
   EXPECT_CALL(visitor, OnGoAwayFrameData).WillRepeatedly(testing::Return(true));
-  deframer_.ProcessInput(reinterpret_cast<const char*>(kH2FrameData),
-                         ABSL_ARRAYSIZE(kH2FrameData));
-  EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state());
-  EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_.spdy_framer_error())
+  deframer_->ProcessInput(reinterpret_cast<const char*>(kH2FrameData),
+                          ABSL_ARRAYSIZE(kH2FrameData));
+  EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_->state());
+  EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_->spdy_framer_error())
       << Http2DecoderAdapter::SpdyFramerErrorToString(
-             deframer_.spdy_framer_error());
+             deframer_->spdy_framer_error());
 }
 
 TEST_P(SpdyFramerTest, OnAltSvcWithOrigin) {
@@ -4491,7 +4503,7 @@
 
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
 
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
 
   SpdyAltSvcWireFormat::AlternativeService altsvc1(
       "pid1", "host", 443, 5, SpdyAltSvcWireFormat::VersionVector());
@@ -4514,12 +4526,12 @@
     EXPECT_EQ(framer_.SerializeFrame(altsvc_ir, &output_), frame.size());
     frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false);
   }
-  deframer_.ProcessInput(frame.data(), frame.size());
+  deframer_->ProcessInput(frame.data(), frame.size());
 
-  EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state());
-  EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_.spdy_framer_error())
+  EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_->state());
+  EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_->spdy_framer_error())
       << Http2DecoderAdapter::SpdyFramerErrorToString(
-             deframer_.spdy_framer_error());
+             deframer_->spdy_framer_error());
 }
 
 TEST_P(SpdyFramerTest, OnAltSvcNoOrigin) {
@@ -4527,7 +4539,7 @@
 
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
 
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
 
   SpdyAltSvcWireFormat::AlternativeService altsvc1(
       "pid1", "host", 443, 5, SpdyAltSvcWireFormat::VersionVector());
@@ -4544,12 +4556,12 @@
   altsvc_ir.add_altsvc(altsvc1);
   altsvc_ir.add_altsvc(altsvc2);
   SpdySerializedFrame frame(framer_.SerializeFrame(altsvc_ir));
-  deframer_.ProcessInput(frame.data(), frame.size());
+  deframer_->ProcessInput(frame.data(), frame.size());
 
-  EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state());
-  EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_.spdy_framer_error())
+  EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_->state());
+  EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_->spdy_framer_error())
       << Http2DecoderAdapter::SpdyFramerErrorToString(
-             deframer_.spdy_framer_error());
+             deframer_->spdy_framer_error());
 }
 
 TEST_P(SpdyFramerTest, OnAltSvcEmptyProtocolId) {
@@ -4557,7 +4569,7 @@
 
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
 
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
 
   EXPECT_CALL(visitor, OnCommonHeader(kStreamId, _, 0x0A, 0x0));
   EXPECT_CALL(visitor,
@@ -4575,13 +4587,13 @@
     EXPECT_EQ(framer_.SerializeFrame(altsvc_ir, &output_), frame.size());
     frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false);
   }
-  deframer_.ProcessInput(frame.data(), frame.size());
+  deframer_->ProcessInput(frame.data(), frame.size());
 
-  EXPECT_EQ(Http2DecoderAdapter::SPDY_ERROR, deframer_.state());
+  EXPECT_EQ(Http2DecoderAdapter::SPDY_ERROR, deframer_->state());
   EXPECT_EQ(Http2DecoderAdapter::SPDY_INVALID_CONTROL_FRAME,
-            deframer_.spdy_framer_error())
+            deframer_->spdy_framer_error())
       << Http2DecoderAdapter::SpdyFramerErrorToString(
-             deframer_.spdy_framer_error());
+             deframer_->spdy_framer_error());
 }
 
 TEST_P(SpdyFramerTest, OnAltSvcBadLengths) {
@@ -4593,7 +4605,7 @@
 
   TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION);
 
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
   visitor.SimulateInFramer(kFrameDataOriginLenLargerThanFrame,
                            sizeof(kFrameDataOriginLenLargerThanFrame));
 
@@ -4655,15 +4667,16 @@
     SpdySerializedFrame frame(framer_.SerializeAltSvc(altsvc_ir));
 
     TestSpdyVisitor visitor(SpdyFramer::ENABLE_COMPRESSION);
-    deframer_.set_visitor(&visitor);
-    deframer_.ProcessInput(frame.data(), frame.size());
+    deframer_->set_visitor(&visitor);
+    deframer_->ProcessInput(frame.data(), frame.size());
 
     EXPECT_EQ(0, visitor.error_count_);
     EXPECT_EQ(1, visitor.altsvc_count_);
-    EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state());
-    EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_.spdy_framer_error())
+    EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_->state());
+    EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR,
+              deframer_->spdy_framer_error())
         << Http2DecoderAdapter::SpdyFramerErrorToString(
-               deframer_.spdy_framer_error());
+               deframer_->spdy_framer_error());
   }
 }
 
@@ -4683,16 +4696,16 @@
   };
 
   TestSpdyVisitor visitor(SpdyFramer::ENABLE_COMPRESSION);
-  deframer_.set_visitor(&visitor);
-  deframer_.ProcessInput(kFrameData, sizeof(kFrameData));
+  deframer_->set_visitor(&visitor);
+  deframer_->ProcessInput(kFrameData, sizeof(kFrameData));
 
   EXPECT_EQ(1, visitor.error_count_);
   EXPECT_EQ(0, visitor.altsvc_count_);
-  EXPECT_EQ(Http2DecoderAdapter::SPDY_ERROR, deframer_.state());
+  EXPECT_EQ(Http2DecoderAdapter::SPDY_ERROR, deframer_->state());
   EXPECT_EQ(Http2DecoderAdapter::SPDY_INVALID_CONTROL_FRAME,
-            deframer_.spdy_framer_error())
+            deframer_->spdy_framer_error())
       << Http2DecoderAdapter::SpdyFramerErrorToString(
-             deframer_.spdy_framer_error());
+             deframer_->spdy_framer_error());
 }
 
 TEST_P(SpdyFramerTest, ReadPriorityUpdateFrame) {
@@ -4706,12 +4719,12 @@
   };
 
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
 
   EXPECT_CALL(visitor, OnCommonHeader(0, 7, 0x10, 0x0));
   EXPECT_CALL(visitor, OnPriorityUpdate(3, "foo"));
-  deframer_.ProcessInput(kFrameData, sizeof(kFrameData));
-  EXPECT_FALSE(deframer_.HasError());
+  deframer_->ProcessInput(kFrameData, sizeof(kFrameData));
+  EXPECT_FALSE(deframer_->HasError());
 }
 
 TEST_P(SpdyFramerTest, ReadPriorityUpdateFrameWithEmptyPriorityFieldValue) {
@@ -4724,12 +4737,12 @@
   };
 
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
 
   EXPECT_CALL(visitor, OnCommonHeader(0, 4, 0x10, 0x0));
   EXPECT_CALL(visitor, OnPriorityUpdate(3, ""));
-  deframer_.ProcessInput(kFrameData, sizeof(kFrameData));
-  EXPECT_FALSE(deframer_.HasError());
+  deframer_->ProcessInput(kFrameData, sizeof(kFrameData));
+  EXPECT_FALSE(deframer_->HasError());
 }
 
 TEST_P(SpdyFramerTest, PriorityUpdateFrameWithEmptyPayload) {
@@ -4741,13 +4754,13 @@
   };
 
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
 
   EXPECT_CALL(visitor, OnCommonHeader(0, 0, 0x10, 0x0));
   EXPECT_CALL(visitor,
               OnError(Http2DecoderAdapter::SPDY_INVALID_CONTROL_FRAME_SIZE, _));
-  deframer_.ProcessInput(kFrameData, sizeof(kFrameData));
-  EXPECT_TRUE(deframer_.HasError());
+  deframer_->ProcessInput(kFrameData, sizeof(kFrameData));
+  EXPECT_TRUE(deframer_->HasError());
 }
 
 TEST_P(SpdyFramerTest, PriorityUpdateFrameWithShortPayload) {
@@ -4761,13 +4774,13 @@
   };
 
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
 
   EXPECT_CALL(visitor, OnCommonHeader(0, 2, 0x10, 0x0));
   EXPECT_CALL(visitor,
               OnError(Http2DecoderAdapter::SPDY_INVALID_CONTROL_FRAME_SIZE, _));
-  deframer_.ProcessInput(kFrameData, sizeof(kFrameData));
-  EXPECT_TRUE(deframer_.HasError());
+  deframer_->ProcessInput(kFrameData, sizeof(kFrameData));
+  EXPECT_TRUE(deframer_->HasError());
 }
 
 TEST_P(SpdyFramerTest, PriorityUpdateFrameOnIncorrectStream) {
@@ -4780,12 +4793,12 @@
   };
 
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
 
   EXPECT_CALL(visitor, OnCommonHeader(1, 4, 0x10, 0x0));
   EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID, _));
-  deframer_.ProcessInput(kFrameData, sizeof(kFrameData));
-  EXPECT_TRUE(deframer_.HasError());
+  deframer_->ProcessInput(kFrameData, sizeof(kFrameData));
+  EXPECT_TRUE(deframer_->HasError());
 }
 
 TEST_P(SpdyFramerTest, PriorityUpdateFramePrioritizingIncorrectStream) {
@@ -4798,12 +4811,12 @@
   };
 
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
 
   EXPECT_CALL(visitor, OnCommonHeader(0, 4, 0x10, 0x0));
   EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID, _));
-  deframer_.ProcessInput(kFrameData, sizeof(kFrameData));
-  EXPECT_TRUE(deframer_.HasError());
+  deframer_->ProcessInput(kFrameData, sizeof(kFrameData));
+  EXPECT_TRUE(deframer_->HasError());
 }
 
 // Tests handling of PRIORITY frames.
@@ -4819,15 +4832,15 @@
     frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false);
   }
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
-  deframer_.set_visitor(&visitor);
+  deframer_->set_visitor(&visitor);
   EXPECT_CALL(visitor, OnCommonHeader(3, 5, 0x2, 0x0));
   EXPECT_CALL(visitor, OnPriority(3, 1, 256, false));
-  deframer_.ProcessInput(frame.data(), frame.size());
+  deframer_->ProcessInput(frame.data(), frame.size());
 
-  EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state());
-  EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_.spdy_framer_error())
+  EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_->state());
+  EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_->spdy_framer_error())
       << Http2DecoderAdapter::SpdyFramerErrorToString(
-             deframer_.spdy_framer_error());
+             deframer_->spdy_framer_error());
 }
 
 // Tests handling of PRIORITY frame with incorrect size.
@@ -4940,7 +4953,7 @@
 TEST_P(SpdyFramerTest, ProcessAllInput) {
   auto visitor =
       std::make_unique<TestSpdyVisitor>(SpdyFramer::DISABLE_COMPRESSION);
-  deframer_.set_visitor(visitor.get());
+  deframer_->set_visitor(visitor.get());
 
   // Create two input frames.
   SpdyHeadersIR headers(/* stream_id = */ 1);
@@ -4974,9 +4987,9 @@
 
   QUICHE_VLOG(1) << "buf_size = " << buf_size;
 
-  size_t processed = deframer_.ProcessInput(buf, buf_size);
+  size_t processed = deframer_->ProcessInput(buf, buf_size);
   EXPECT_EQ(buf_size, processed);
-  EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state());
+  EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_->state());
   EXPECT_EQ(1, visitor->headers_frame_count_);
   EXPECT_EQ(1, visitor->data_frame_count_);
   EXPECT_EQ(strlen(four_score), static_cast<unsigned>(visitor->data_bytes_));