Remove FrameSequence and MetadataSerializer.

FrameSequence is an interface only implemented by MetadataFrameSequence (in
anonymous namespace).  Remove the interface and make MetadataFrameSequence
public.

MetadataSerializer is a trivial class with no members and only one factory
method that creates a MetadataFrameSequence on the heap.  Remove that class.

Also remove the factory method.  Change call sites to instantiate
MetadataFrameSequence on the stack instead of the heap.

PiperOrigin-RevId: 460745625
diff --git a/quiche/spdy/core/metadata_extension.cc b/quiche/spdy/core/metadata_extension.cc
index 0993b99..ec0b2c6 100644
--- a/quiche/spdy/core/metadata_extension.cc
+++ b/quiche/spdy/core/metadata_extension.cc
@@ -9,7 +9,6 @@
 #include "quiche/http2/hpack/decoder/hpack_decoder.h"
 #include "quiche/common/platform/api/quiche_bug_tracker.h"
 #include "quiche/common/platform/api/quiche_logging.h"
-#include "quiche/spdy/core/hpack/hpack_encoder.h"
 #include "quiche/spdy/core/http2_header_block_hpack_listener.h"
 
 namespace spdy {
@@ -23,33 +22,19 @@
 
 const size_t kMaxMetadataBlockSize = 1 << 20;  // 1 MB
 
-// This class uses an HpackEncoder to serialize a METADATA block as a series of
-// METADATA frames.
-class MetadataFrameSequence : public MetadataSerializer::FrameSequence {
- public:
-  MetadataFrameSequence(SpdyStreamId stream_id, spdy::SpdyHeaderBlock payload)
-      : stream_id_(stream_id), payload_(std::move(payload)) {
-    // Metadata should not use HPACK compression.
-    encoder_.DisableCompression();
-    HpackEncoder::Representations r;
-    for (const auto& kv_pair : payload_) {
-      r.push_back(kv_pair);
-    }
-    progressive_encoder_ = encoder_.EncodeRepresentations(r);
+}  // anonymous namespace
+
+MetadataFrameSequence::MetadataFrameSequence(SpdyStreamId stream_id,
+                                             spdy::Http2HeaderBlock payload)
+    : stream_id_(stream_id), payload_(std::move(payload)) {
+  // Metadata should not use HPACK compression.
+  encoder_.DisableCompression();
+  HpackEncoder::Representations r;
+  for (const auto& kv_pair : payload_) {
+    r.push_back(kv_pair);
   }
-
-  // Copies are not allowed.
-  MetadataFrameSequence(const MetadataFrameSequence& other) = delete;
-  MetadataFrameSequence& operator=(const MetadataFrameSequence& other) = delete;
-
-  std::unique_ptr<spdy::SpdyFrameIR> Next() override;
-
- private:
-  SpdyStreamId stream_id_;
-  SpdyHeaderBlock payload_;
-  HpackEncoder encoder_;
-  std::unique_ptr<HpackEncoder::ProgressiveEncoder> progressive_encoder_;
-};
+  progressive_encoder_ = encoder_.EncodeRepresentations(r);
+}
 
 std::unique_ptr<spdy::SpdyFrameIR> MetadataFrameSequence::Next() {
   if (!progressive_encoder_->HasNext()) {
@@ -65,8 +50,6 @@
       std::move(payload));
 }
 
-}  // anonymous namespace
-
 struct MetadataVisitor::MetadataPayloadState {
   MetadataPayloadState(size_t remaining, bool end)
       : bytes_remaining(remaining), end_metadata(end) {}
@@ -185,11 +168,4 @@
   }
 }
 
-std::unique_ptr<MetadataSerializer::FrameSequence>
-MetadataSerializer::FrameSequenceForPayload(SpdyStreamId stream_id,
-                                            MetadataPayload payload) {
-  return absl::make_unique<MetadataFrameSequence>(stream_id,
-                                                  std::move(payload));
-}
-
 }  // namespace spdy
diff --git a/quiche/spdy/core/metadata_extension.h b/quiche/spdy/core/metadata_extension.h
index 4eaf95c..12d817c 100644
--- a/quiche/spdy/core/metadata_extension.h
+++ b/quiche/spdy/core/metadata_extension.h
@@ -7,6 +7,7 @@
 
 #include "absl/container/flat_hash_map.h"
 #include "quiche/common/platform/api/quiche_export.h"
+#include "quiche/spdy/core/hpack/hpack_encoder.h"
 #include "quiche/spdy/core/http2_frame_decoder_adapter.h"
 #include "quiche/spdy/core/spdy_header_block.h"
 #include "quiche/spdy/core/spdy_protocol.h"
@@ -90,27 +91,23 @@
   MetadataSupportState peer_supports_metadata_;
 };
 
-// A class that serializes metadata blocks as sequences of frames.
-class QUICHE_EXPORT_PRIVATE MetadataSerializer {
+// This class uses an HpackEncoder to serialize a METADATA block as a series of
+// METADATA frames.
+class QUICHE_EXPORT_PRIVATE MetadataFrameSequence {
  public:
-  using MetadataPayload = spdy::SpdyHeaderBlock;
+  MetadataFrameSequence(SpdyStreamId stream_id, spdy::Http2HeaderBlock payload);
 
-  class QUICHE_EXPORT_PRIVATE FrameSequence {
-   public:
-    virtual ~FrameSequence() {}
+  // Copies are not allowed.
+  MetadataFrameSequence(const MetadataFrameSequence& other) = delete;
+  MetadataFrameSequence& operator=(const MetadataFrameSequence& other) = delete;
 
-    // Returns nullptr once the sequence has been exhausted.
-    virtual std::unique_ptr<spdy::SpdyFrameIR> Next() = 0;
-  };
+  std::unique_ptr<spdy::SpdyFrameIR> Next();
 
-  MetadataSerializer() {}
-
-  MetadataSerializer(const MetadataSerializer&) = delete;
-  MetadataSerializer& operator=(const MetadataSerializer&) = delete;
-
-  // Returns nullptr on failure.
-  std::unique_ptr<FrameSequence> FrameSequenceForPayload(
-      spdy::SpdyStreamId stream_id, MetadataPayload payload);
+ private:
+  SpdyStreamId stream_id_;
+  Http2HeaderBlock payload_;
+  HpackEncoder encoder_;
+  std::unique_ptr<HpackEncoder::ProgressiveEncoder> progressive_encoder_;
 };
 
 }  // namespace spdy
diff --git a/quiche/spdy/core/metadata_extension_test.cc b/quiche/spdy/core/metadata_extension_test.cc
index 26f98f4..8d9551d 100644
--- a/quiche/spdy/core/metadata_extension_test.cc
+++ b/quiche/spdy/core/metadata_extension_test.cc
@@ -17,9 +17,6 @@
 namespace {
 
 using ::absl::bind_front;
-using ::spdy::SpdyFramer;
-using ::spdy::SpdyHeaderBlock;
-using ::spdy::test::MockSpdyFramerVisitor;
 using ::testing::_;
 using ::testing::ElementsAre;
 using ::testing::IsEmpty;
@@ -48,8 +45,8 @@
     received_metadata_support_.push_back(peer_supports_metadata);
   }
 
-  MetadataSerializer::MetadataPayload PayloadForData(absl::string_view data) {
-    SpdyHeaderBlock block;
+  Http2HeaderBlock PayloadForData(absl::string_view data) {
+    Http2HeaderBlock block;
     block["example-payload"] = data;
     return block;
   }
@@ -90,9 +87,7 @@
   extension_->OnSetting(MetadataVisitor::kMetadataExtensionId, 1);
   ASSERT_TRUE(extension_->PeerSupportsMetadata());
 
-  MetadataSerializer serializer;
-  auto sequence = serializer.FrameSequenceForPayload(3, std::move(payload));
-  ASSERT_TRUE(sequence != nullptr);
+  MetadataFrameSequence sequence(3, std::move(payload));
 
   http2::Http2DecoderAdapter deframer;
   ::testing::StrictMock<MockSpdyFramerVisitor> visitor;
@@ -105,7 +100,7 @@
       .WillOnce(::testing::Return(true));
 
   SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
-  auto frame = sequence->Next();
+  auto frame = sequence.Next();
   ASSERT_TRUE(frame != nullptr);
   while (frame != nullptr) {
     const size_t frame_size = framer.SerializeFrame(*frame, &test_buffer_);
@@ -114,7 +109,7 @@
     ASSERT_EQ(frame_size, test_buffer_.Size());
     EXPECT_EQ(frame_size, deframer.ProcessInput(kBuffer, frame_size));
     test_buffer_.Reset();
-    frame = sequence->Next();
+    frame = sequence.Next();
   }
   EXPECT_FALSE(deframer.HasError());
   EXPECT_THAT(received_metadata_support_, ElementsAre(true));
@@ -140,17 +135,13 @@
     extension_->OnSetting(MetadataVisitor::kMetadataExtensionId, 1);
     ASSERT_TRUE(extension_->PeerSupportsMetadata());
 
-    MetadataSerializer serializer;
-    auto sequence =
-        serializer.FrameSequenceForPayload(3, payload_block.Clone());
-    ASSERT_TRUE(sequence != nullptr);
-
+    MetadataFrameSequence sequence(3, payload_block.Clone());
     http2::Http2DecoderAdapter deframer;
     ::spdy::SpdyNoOpVisitor visitor;
     deframer.set_visitor(&visitor);
     deframer.set_extension_visitor(extension_.get());
     SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
-    auto frame = sequence->Next();
+    auto frame = sequence.Next();
     ASSERT_TRUE(frame != nullptr);
     while (frame != nullptr) {
       const size_t frame_size = framer.SerializeFrame(*frame, &test_buffer_);
@@ -159,7 +150,7 @@
       ASSERT_EQ(frame_size, test_buffer_.Size());
       EXPECT_EQ(frame_size, deframer.ProcessInput(kBuffer, frame_size));
       test_buffer_.Reset();
-      frame = sequence->Next();
+      frame = sequence.Next();
     }
     EXPECT_EQ(1u, received_count_);
     auto it = received_payload_map_.find(3);
@@ -183,12 +174,8 @@
   extension_->OnSetting(MetadataVisitor::kMetadataExtensionId, 1);
   ASSERT_TRUE(extension_->PeerSupportsMetadata());
 
-  MetadataSerializer serializer;
-  auto sequence1 = serializer.FrameSequenceForPayload(3, payload1.Clone());
-  ASSERT_TRUE(sequence1 != nullptr);
-
-  auto sequence2 = serializer.FrameSequenceForPayload(5, payload2.Clone());
-  ASSERT_TRUE(sequence2 != nullptr);
+  MetadataFrameSequence sequence1(3, payload1.Clone());
+  MetadataFrameSequence sequence2(5, payload2.Clone());
 
   http2::Http2DecoderAdapter deframer;
   ::spdy::SpdyNoOpVisitor visitor;
@@ -196,9 +183,9 @@
   deframer.set_extension_visitor(extension_.get());
 
   SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
-  auto frame1 = sequence1->Next();
+  auto frame1 = sequence1.Next();
   ASSERT_TRUE(frame1 != nullptr);
-  auto frame2 = sequence2->Next();
+  auto frame2 = sequence2.Next();
   ASSERT_TRUE(frame2 != nullptr);
   while (frame1 != nullptr || frame2 != nullptr) {
     for (auto frame : {frame1.get(), frame2.get()}) {
@@ -211,8 +198,8 @@
         test_buffer_.Reset();
       }
     }
-    frame1 = sequence1->Next();
-    frame2 = sequence2->Next();
+    frame1 = sequence1.Next();
+    frame2 = sequence2.Next();
   }
   EXPECT_EQ(2u, received_count_);
   auto it = received_payload_map_.find(3);