Remove PRIORITY frame.

PRIORITY frame has been removed from the draft HTTP/3 spec at
https://github.com/quicwg/base-drafts/pull/2922.

Also remove protocol flag FLAGS_quic_allow_http3_priority.

gfe-relnote: n/a, change to QUIC v99-only code.  Protected by existing disabled gfe2_reloadable_flag_quic_enable_version_99.
PiperOrigin-RevId: 289115003
Change-Id: I52891171f4c2b11107f0afc2db6e069963b13d6e
diff --git a/quic/core/http/http_decoder.cc b/quic/core/http/http_decoder.cc
index 51c70e0..e3ca73e 100644
--- a/quic/core/http/http_decoder.cc
+++ b/quic/core/http/http_decoder.cc
@@ -146,9 +146,6 @@
     case static_cast<uint64_t>(HttpFrameType::HEADERS):
       continue_processing = visitor_->OnHeadersFrameStart(header_length);
       break;
-    case static_cast<uint64_t>(HttpFrameType::PRIORITY):
-      continue_processing = visitor_->OnPriorityFrameStart(header_length);
-      break;
     case static_cast<uint64_t>(HttpFrameType::CANCEL_PUSH):
       break;
     case static_cast<uint64_t>(HttpFrameType::SETTINGS):
@@ -210,12 +207,6 @@
       remaining_frame_length_ -= payload.length();
       break;
     }
-    case static_cast<uint64_t>(HttpFrameType::PRIORITY): {
-      // TODO(rch): avoid buffering if the entire frame is present, and
-      // instead parse directly out of |reader|.
-      BufferFramePayload(reader);
-      break;
-    }
     case static_cast<uint64_t>(HttpFrameType::CANCEL_PUSH): {
       BufferFramePayload(reader);
       break;
@@ -332,17 +323,6 @@
       continue_processing = visitor_->OnHeadersFrameEnd();
       break;
     }
-    case static_cast<uint64_t>(HttpFrameType::PRIORITY): {
-      // TODO(rch): avoid buffering if the entire frame is present, and
-      // instead parse directly out of |reader|.
-      PriorityFrame frame;
-      QuicDataReader reader(buffer_.data(), current_frame_length_);
-      if (!ParsePriorityFrame(&reader, &frame)) {
-        return false;
-      }
-      continue_processing = visitor_->OnPriorityFrame(frame);
-      break;
-    }
     case static_cast<uint64_t>(HttpFrameType::CANCEL_PUSH): {
       CancelPushFrame frame;
       QuicDataReader reader(buffer_.data(), current_frame_length_);
@@ -508,51 +488,6 @@
   visitor_->OnError(this);
 }
 
-bool HttpDecoder::ParsePriorityFrame(QuicDataReader* reader,
-                                     PriorityFrame* frame) {
-  uint8_t flags;
-  if (!reader->ReadUInt8(&flags)) {
-    // TODO(b/124216424): Use HTTP_MALFORMED_FRAME.
-    RaiseError(QUIC_INVALID_FRAME_DATA, "Unable to read PRIORITY frame flags.");
-    return false;
-  }
-
-  // Assign two most significant bits to prioritized_type.
-  frame->prioritized_type = static_cast<PriorityElementType>((flags >> 6) & 3);
-  // Assign the next two most significant bits to dependency type.
-  frame->dependency_type = static_cast<PriorityElementType>((flags >> 4) & 3);
-  frame->exclusive = flags & kPriorityExclusiveBit;
-  // TODO(bnc): Close connection with HTTP_MALFORMED_FRAME
-  // if lowest three bits are not all zero.
-
-  if (frame->prioritized_type != ROOT_OF_TREE &&
-      !reader->ReadVarInt62(&frame->prioritized_element_id)) {
-    // TODO(b/124216424): Use HTTP_MALFORMED_FRAME.
-    RaiseError(QUIC_INVALID_FRAME_DATA,
-               "Unable to read prioritized_element_id.");
-    return false;
-  }
-  if (frame->dependency_type != ROOT_OF_TREE &&
-      !reader->ReadVarInt62(&frame->element_dependency_id)) {
-    // TODO(b/124216424): Use HTTP_MALFORMED_FRAME.
-    RaiseError(QUIC_INVALID_FRAME_DATA,
-               "Unable to read element_dependency_id.");
-    return false;
-  }
-  if (!reader->ReadUInt8(&frame->weight)) {
-    // TODO(b/124216424): Use HTTP_MALFORMED_FRAME.
-    RaiseError(QUIC_INVALID_FRAME_DATA,
-               "Unable to read PRIORITY frame weight.");
-    return false;
-  }
-  if (!reader->IsDoneReading()) {
-    // TODO(b/124216424): Use HTTP_MALFORMED_FRAME.
-    RaiseError(QUIC_INVALID_FRAME_DATA, "Superfluous data in PRIORITY frame.");
-    return false;
-  }
-  return true;
-}
-
 bool HttpDecoder::ParseSettingsFrame(QuicDataReader* reader,
                                      SettingsFrame* frame) {
   while (!reader->IsDoneReading()) {
@@ -582,9 +517,6 @@
 
 QuicByteCount HttpDecoder::MaxFrameLength(uint64_t frame_type) {
   switch (frame_type) {
-    case static_cast<uint64_t>(HttpFrameType::PRIORITY):
-      return kPriorityFirstByteLength + VARIABLE_LENGTH_INTEGER_LENGTH_8 * 2 +
-             kPriorityWeightLength;
     case static_cast<uint64_t>(HttpFrameType::CANCEL_PUSH):
       return sizeof(PushId);
     case static_cast<uint64_t>(HttpFrameType::SETTINGS):
diff --git a/quic/core/http/http_decoder.h b/quic/core/http/http_decoder.h
index 1dc2225..a77ce6c 100644
--- a/quic/core/http/http_decoder.h
+++ b/quic/core/http/http_decoder.h
@@ -39,13 +39,6 @@
     // On*FrameStart() methods are called after the frame header is completely
     // processed.  At that point it is safe to consume |header_length| bytes.
 
-    // Called when a PRIORITY frame has been received.
-    // |header_length| contains PRIORITY frame length and payload length.
-    virtual bool OnPriorityFrameStart(QuicByteCount header_length) = 0;
-
-    // Called when a PRIORITY frame has been successfully parsed.
-    virtual bool OnPriorityFrame(const PriorityFrame& frame) = 0;
-
     // Called when a CANCEL_PUSH frame has been successfully parsed.
     virtual bool OnCancelPushFrame(const CancelPushFrame& frame) = 0;
 
@@ -181,9 +174,6 @@
   // Sets |error_| and |error_detail_| accordingly.
   void RaiseError(QuicErrorCode error, std::string error_detail);
 
-  // Parses the payload of a PRIORITY frame from |reader| into |frame|.
-  bool ParsePriorityFrame(QuicDataReader* reader, PriorityFrame* frame);
-
   // Parses the payload of a SETTINGS frame from |reader| into |frame|.
   bool ParseSettingsFrame(QuicDataReader* reader, SettingsFrame* frame);
 
diff --git a/quic/core/http/http_decoder_test.cc b/quic/core/http/http_decoder_test.cc
index bcdf6c1..942edfd 100644
--- a/quic/core/http/http_decoder_test.cc
+++ b/quic/core/http/http_decoder_test.cc
@@ -41,8 +41,6 @@
   // Called if an error is detected.
   MOCK_METHOD1(OnError, void(HttpDecoder* decoder));
 
-  MOCK_METHOD1(OnPriorityFrameStart, bool(QuicByteCount header_length));
-  MOCK_METHOD1(OnPriorityFrame, bool(const PriorityFrame& frame));
   MOCK_METHOD1(OnCancelPushFrame, bool(const CancelPushFrame& frame));
   MOCK_METHOD1(OnMaxPushIdFrame, bool(const MaxPushIdFrame& frame));
   MOCK_METHOD1(OnGoAwayFrame, bool(const GoAwayFrame& frame));
@@ -73,8 +71,6 @@
 class HttpDecoderTest : public QuicTest {
  public:
   HttpDecoderTest() : decoder_(&visitor_) {
-    ON_CALL(visitor_, OnPriorityFrameStart(_)).WillByDefault(Return(true));
-    ON_CALL(visitor_, OnPriorityFrame(_)).WillByDefault(Return(true));
     ON_CALL(visitor_, OnCancelPushFrame(_)).WillByDefault(Return(true));
     ON_CALL(visitor_, OnMaxPushIdFrame(_)).WillByDefault(Return(true));
     ON_CALL(visitor_, OnGoAwayFrame(_)).WillByDefault(Return(true));
@@ -372,116 +368,6 @@
   EXPECT_EQ("", decoder_.error_detail());
 }
 
-TEST_F(HttpDecoderTest, PriorityFrame) {
-  InSequence s;
-  std::string input = quiche::QuicheTextUtils::HexDecode(
-      "02"    // type (PRIORITY)
-      "04"    // length
-      "08"    // request stream, request stream, exclusive
-      "03"    // prioritized_element_id
-      "04"    // element_dependency_id
-      "FF");  // weight
-
-  PriorityFrame frame;
-  frame.prioritized_type = REQUEST_STREAM;
-  frame.dependency_type = REQUEST_STREAM;
-  frame.exclusive = true;
-  frame.prioritized_element_id = 0x03;
-  frame.element_dependency_id = 0x04;
-  frame.weight = 0xFF;
-
-  // Visitor pauses processing.
-  EXPECT_CALL(visitor_, OnPriorityFrameStart(2)).WillOnce(Return(false));
-  quiche::QuicheStringPiece remaining_input(input);
-  QuicByteCount processed_bytes =
-      ProcessInputWithGarbageAppended(remaining_input);
-  EXPECT_EQ(2u, processed_bytes);
-  remaining_input = remaining_input.substr(processed_bytes);
-
-  EXPECT_CALL(visitor_, OnPriorityFrame(frame)).WillOnce(Return(false));
-  processed_bytes = ProcessInputWithGarbageAppended(remaining_input);
-  EXPECT_EQ(remaining_input.size(), processed_bytes);
-  EXPECT_THAT(decoder_.error(), IsQuicNoError());
-  EXPECT_EQ("", decoder_.error_detail());
-
-  // Process the full frame.
-  EXPECT_CALL(visitor_, OnPriorityFrameStart(2));
-  EXPECT_CALL(visitor_, OnPriorityFrame(frame));
-  EXPECT_EQ(input.size(), ProcessInput(input));
-  EXPECT_THAT(decoder_.error(), IsQuicNoError());
-  EXPECT_EQ("", decoder_.error_detail());
-
-  // Process the frame incrementally.
-  EXPECT_CALL(visitor_, OnPriorityFrameStart(2));
-  EXPECT_CALL(visitor_, OnPriorityFrame(frame));
-  ProcessInputCharByChar(input);
-  EXPECT_THAT(decoder_.error(), IsQuicNoError());
-  EXPECT_EQ("", decoder_.error_detail());
-
-  std::string input2 = quiche::QuicheTextUtils::HexDecode(
-      "02"    // type (PRIORITY)
-      "02"    // length
-      "f8"    // root of tree, root of tree, exclusive
-      "FF");  // weight
-  PriorityFrame frame2;
-  frame2.prioritized_type = ROOT_OF_TREE;
-  frame2.dependency_type = ROOT_OF_TREE;
-  frame2.exclusive = true;
-  frame2.weight = 0xFF;
-
-  EXPECT_CALL(visitor_, OnPriorityFrameStart(2));
-  EXPECT_CALL(visitor_, OnPriorityFrame(frame2));
-  EXPECT_EQ(input2.size(), ProcessInput(input2));
-  EXPECT_THAT(decoder_.error(), IsQuicNoError());
-  EXPECT_EQ("", decoder_.error_detail());
-}
-
-// Regression test for https://crbug.com/981291 and https://crbug.com/981646.
-TEST_F(HttpDecoderTest, CorruptPriorityFrame) {
-  const char* const payload1 =
-      "\x01"   // request stream, request stream, exclusive
-      "\x03"   // prioritized_element_id
-      "\x04"   // element_dependency_id
-      "\xFF"   // weight
-      "\xFF";  // superfluous data
-  const char* const payload2 =
-      "\xf1"   // root of tree, root of tree, exclusive
-      "\xFF"   // weight
-      "\xFF";  // superfluous data
-  struct {
-    const char* const payload;
-    size_t payload_length;
-    const char* const error_message;
-  } kTestData[] = {
-      {payload1, 0, "Unable to read PRIORITY frame flags."},
-      {payload1, 1, "Unable to read prioritized_element_id."},
-      {payload1, 2, "Unable to read element_dependency_id."},
-      {payload1, 3, "Unable to read PRIORITY frame weight."},
-      {payload1, 5, "Superfluous data in PRIORITY frame."},
-      {payload2, 0, "Unable to read PRIORITY frame flags."},
-      {payload2, 1, "Unable to read PRIORITY frame weight."},
-      {payload2, 3, "Superfluous data in PRIORITY frame."},
-  };
-
-  for (const auto& test_data : kTestData) {
-    std::string input;
-    input.push_back(2u);  // type PRIORITY
-    input.push_back(test_data.payload_length);
-    size_t header_length = input.size();
-    input.append(test_data.payload, test_data.payload_length);
-
-    HttpDecoder decoder(&visitor_);
-    EXPECT_CALL(visitor_, OnPriorityFrameStart(header_length));
-    EXPECT_CALL(visitor_, OnError(&decoder));
-
-    QuicByteCount processed_bytes =
-        decoder.ProcessInput(input.data(), input.size());
-    EXPECT_EQ(input.size(), processed_bytes);
-    EXPECT_THAT(decoder.error(), IsError(QUIC_INVALID_FRAME_DATA));
-    EXPECT_EQ(test_data.error_message, decoder.error_detail());
-  }
-}
-
 TEST_F(HttpDecoderTest, SettingsFrame) {
   InSequence s;
   std::string input = quiche::QuicheTextUtils::HexDecode(
diff --git a/quic/core/http/http_encoder.cc b/quic/core/http/http_encoder.cc
index 481c469..2f35897 100644
--- a/quic/core/http/http_encoder.cc
+++ b/quic/core/http/http_encoder.cc
@@ -11,36 +11,6 @@
 
 namespace {
 
-// Set the first byte of a PRIORITY frame according to its fields.
-uint8_t SetPriorityFields(uint8_t num,
-                          PriorityElementType type,
-                          bool prioritized) {
-  switch (type) {
-    case REQUEST_STREAM:
-      return num;
-    case PUSH_STREAM:
-      if (prioritized) {
-        return num | (1 << 6);
-      }
-      return num | (1 << 4);
-    case PLACEHOLDER:
-      if (prioritized) {
-        return num | (1 << 7);
-      }
-      return num | (1 << 5);
-    case ROOT_OF_TREE:
-      if (prioritized) {
-        num = num | (1 << 6);
-        return num | (1 << 7);
-      }
-      num = num | (1 << 4);
-      return num | (1 << 5);
-    default:
-      QUIC_NOTREACHED();
-      return num;
-  }
-}
-
 bool WriteFrameHeader(QuicByteCount length,
                       HttpFrameType type,
                       QuicDataWriter* writer) {
@@ -54,29 +24,6 @@
          payload_length;
 }
 
-// Write prioritized element id and element dependency id if needed.
-bool MaybeWriteIds(const PriorityFrame& priority, QuicDataWriter* writer) {
-  if (priority.prioritized_type != ROOT_OF_TREE) {
-    if (!writer->WriteVarInt62(priority.prioritized_element_id)) {
-      return false;
-    }
-  } else {
-    DCHECK_EQ(0u, priority.prioritized_element_id)
-        << "Prioritized element id should be 0 when prioritized type is "
-           "ROOT_OF_TREE";
-  }
-  if (priority.dependency_type != ROOT_OF_TREE) {
-    if (!writer->WriteVarInt62(priority.element_dependency_id)) {
-      return false;
-    }
-  } else {
-    DCHECK_EQ(0u, priority.element_dependency_id)
-        << "Element dependency id should be 0 when dependency type is "
-           "ROOT_OF_TREE";
-  }
-  return true;
-}
-
 }  // namespace
 
 // static
@@ -122,48 +69,6 @@
 }
 
 // static
-QuicByteCount HttpEncoder::SerializePriorityFrame(
-    const PriorityFrame& priority,
-    std::unique_ptr<char[]>* output) {
-  QuicByteCount payload_length =
-      kPriorityFirstByteLength +
-      (priority.prioritized_type == ROOT_OF_TREE
-           ? 0
-           : QuicDataWriter::GetVarInt62Len(priority.prioritized_element_id)) +
-      (priority.dependency_type == ROOT_OF_TREE
-           ? 0
-           : QuicDataWriter::GetVarInt62Len(priority.element_dependency_id)) +
-      kPriorityWeightLength;
-  QuicByteCount total_length =
-      GetTotalLength(payload_length, HttpFrameType::PRIORITY);
-
-  output->reset(new char[total_length]);
-  QuicDataWriter writer(total_length, output->get());
-
-  if (!WriteFrameHeader(payload_length, HttpFrameType::PRIORITY, &writer)) {
-    QUIC_DLOG(ERROR) << "Http encoder failed when attempting to serialize "
-                        "priority frame header.";
-    return 0;
-  }
-
-  // Set the first byte of the payload.
-  uint8_t firstByte = 0;
-  firstByte = SetPriorityFields(firstByte, priority.prioritized_type, true);
-  firstByte = SetPriorityFields(firstByte, priority.dependency_type, false);
-  if (priority.exclusive) {
-    firstByte |= kPriorityExclusiveBit;
-  }
-
-  if (writer.WriteUInt8(firstByte) && MaybeWriteIds(priority, &writer) &&
-      writer.WriteUInt8(priority.weight)) {
-    return total_length;
-  }
-  QUIC_DLOG(ERROR) << "Http encoder failed when attempting to serialize "
-                      "priority frame payload.";
-  return 0;
-}
-
-// static
 QuicByteCount HttpEncoder::SerializeCancelPushFrame(
     const CancelPushFrame& cancel_push,
     std::unique_ptr<char[]>* output) {
diff --git a/quic/core/http/http_encoder.h b/quic/core/http/http_encoder.h
index 4420fc6..b856187 100644
--- a/quic/core/http/http_encoder.h
+++ b/quic/core/http/http_encoder.h
@@ -31,11 +31,6 @@
       QuicByteCount payload_length,
       std::unique_ptr<char[]>* output);
 
-  // Serializes a PRIORITY frame into a new buffer stored in |output|.
-  // Returns the length of the buffer on success, or 0 otherwise.
-  static QuicByteCount SerializePriorityFrame(const PriorityFrame& priority,
-                                              std::unique_ptr<char[]>* output);
-
   // Serializes a CANCEL_PUSH frame into a new buffer stored in |output|.
   // Returns the length of the buffer on success, or 0 otherwise.
   static QuicByteCount SerializeCancelPushFrame(
diff --git a/quic/core/http/http_encoder_test.cc b/quic/core/http/http_encoder_test.cc
index 5c99b7d..5ad79d8 100644
--- a/quic/core/http/http_encoder_test.cc
+++ b/quic/core/http/http_encoder_test.cc
@@ -38,73 +38,6 @@
                                               output, QUICHE_ARRAYSIZE(output));
 }
 
-TEST(HttpEncoderTest, SerializePriorityFrame) {
-  PriorityFrame priority;
-  priority.prioritized_type = REQUEST_STREAM;
-  priority.dependency_type = REQUEST_STREAM;
-  priority.exclusive = true;
-  priority.prioritized_element_id = 0x03;
-  priority.element_dependency_id = 0x04;
-  priority.weight = 0xFF;
-  char output[] = {// type (PRIORITY)
-                   0x2,
-                   // length
-                   0x4,
-                   // request stream, request stream, exclusive
-                   0x08,
-                   // prioritized_element_id
-                   0x03,
-                   // element_dependency_id
-                   0x04,
-                   // weight
-                   0xFF};
-
-  std::unique_ptr<char[]> buffer;
-  uint64_t length = HttpEncoder::SerializePriorityFrame(priority, &buffer);
-  EXPECT_EQ(QUICHE_ARRAYSIZE(output), length);
-  quiche::test::CompareCharArraysWithHexError("PRIORITY", buffer.get(), length,
-                                              output, QUICHE_ARRAYSIZE(output));
-
-  PriorityFrame priority2;
-  priority2.prioritized_type = ROOT_OF_TREE;
-  priority2.dependency_type = REQUEST_STREAM;
-  priority2.exclusive = true;
-  priority2.element_dependency_id = 0x04;
-  priority2.weight = 0xFF;
-  char output2[] = {// type (PRIORIRTY)
-                    0x2,
-                    // length
-                    0x3,
-                    // root of tree, request stream, exclusive
-                    0xc8,
-                    // element_dependency_id
-                    0x04,
-                    // weight
-                    0xff};
-  length = HttpEncoder::SerializePriorityFrame(priority2, &buffer);
-  EXPECT_EQ(QUICHE_ARRAYSIZE(output2), length);
-  quiche::test::CompareCharArraysWithHexError(
-      "PRIORITY", buffer.get(), length, output2, QUICHE_ARRAYSIZE(output2));
-
-  PriorityFrame priority3;
-  priority3.prioritized_type = ROOT_OF_TREE;
-  priority3.dependency_type = ROOT_OF_TREE;
-  priority3.exclusive = true;
-  priority3.weight = 0xFF;
-  char output3[] = {// type (PRIORITY)
-                    0x2,
-                    // length
-                    0x2,
-                    // root of tree, root of tree, exclusive
-                    0xf8,
-                    // weight
-                    0xff};
-  length = HttpEncoder::SerializePriorityFrame(priority3, &buffer);
-  EXPECT_EQ(QUICHE_ARRAYSIZE(output3), length);
-  quiche::test::CompareCharArraysWithHexError(
-      "PRIORITY", buffer.get(), length, output3, QUICHE_ARRAYSIZE(output3));
-}
-
 TEST(HttpEncoderTest, SerializeCancelPushFrame) {
   CancelPushFrame cancel_push;
   cancel_push.push_id = 0x01;
diff --git a/quic/core/http/http_frames.h b/quic/core/http/http_frames.h
index de0abc4..6ad6da7 100644
--- a/quic/core/http/http_frames.h
+++ b/quic/core/http/http_frames.h
@@ -21,7 +21,6 @@
 enum class HttpFrameType : uint8_t {
   DATA = 0x0,
   HEADERS = 0x1,
-  PRIORITY = 0X2,
   CANCEL_PUSH = 0X3,
   SETTINGS = 0x4,
   PUSH_PROMISE = 0x5,
@@ -30,7 +29,7 @@
   DUPLICATE_PUSH = 0xE
 };
 
-// 4.2.1.  DATA
+// 7.2.1.  DATA
 //
 //   DATA frames (type=0x0) convey arbitrary, variable-length sequences of
 //   octets associated with an HTTP request or response payload.
@@ -38,7 +37,7 @@
   quiche::QuicheStringPiece data;
 };
 
-// 4.2.2.  HEADERS
+// 7.2.2.  HEADERS
 //
 //   The HEADERS frame (type=0x1) is used to carry a header block,
 //   compressed using QPACK.
@@ -46,58 +45,7 @@
   quiche::QuicheStringPiece headers;
 };
 
-// 4.2.3.  PRIORITY
-//
-//   The PRIORITY (type=0x02) frame specifies the sender-advised priority
-//   of a stream
-
-// Length of the weight field of a priority frame.
-const QuicByteCount kPriorityWeightLength = 1;
-// Length of a priority frame's first byte.
-const QuicByteCount kPriorityFirstByteLength = 1;
-// The bit that indicates Priority frame is exclusive.
-const uint8_t kPriorityExclusiveBit = 8;
-
-enum PriorityElementType : uint8_t {
-  REQUEST_STREAM = 0,
-  PUSH_STREAM = 1,
-  PLACEHOLDER = 2,
-  ROOT_OF_TREE = 3
-};
-
-struct QUIC_EXPORT_PRIVATE PriorityFrame {
-  PriorityElementType prioritized_type = REQUEST_STREAM;
-  PriorityElementType dependency_type = REQUEST_STREAM;
-  bool exclusive = false;
-  uint64_t prioritized_element_id = 0;
-  uint64_t element_dependency_id = 0;
-  uint8_t weight = 0;
-
-  bool operator==(const PriorityFrame& rhs) const {
-    return prioritized_type == rhs.prioritized_type &&
-           dependency_type == rhs.dependency_type &&
-           exclusive == rhs.exclusive &&
-           prioritized_element_id == rhs.prioritized_element_id &&
-           element_dependency_id == rhs.element_dependency_id &&
-           weight == rhs.weight;
-  }
-  std::string ToString() const {
-    return quiche::QuicheStrCat(
-        "Priority Frame : {prioritized_type: ", prioritized_type,
-        ", dependency_type: ", dependency_type, ", exclusive: ", exclusive,
-        ", prioritized_element_id: ", prioritized_element_id,
-        ", element_dependency_id: ", element_dependency_id,
-        ", weight: ", weight, "}");
-  }
-
-  friend QUIC_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os,
-                                                      const PriorityFrame& s) {
-    os << s.ToString();
-    return os;
-  }
-};
-
-// 4.2.4.  CANCEL_PUSH
+// 7.2.3.  CANCEL_PUSH
 //
 //   The CANCEL_PUSH frame (type=0x3) is used to request cancellation of
 //   server push prior to the push stream being created.
@@ -111,7 +59,7 @@
   }
 };
 
-// 4.2.5.  SETTINGS
+// 7.2.4.  SETTINGS
 //
 //   The SETTINGS frame (type=0x4) conveys configuration parameters that
 //   affect how endpoints communicate, such as preferences and constraints
@@ -144,7 +92,7 @@
   }
 };
 
-// 4.2.6.  PUSH_PROMISE
+// 7.2.5.  PUSH_PROMISE
 //
 //   The PUSH_PROMISE frame (type=0x05) is used to carry a request header
 //   set from server to client, as in HTTP/2.
@@ -157,7 +105,7 @@
   }
 };
 
-// 4.2.7.  GOAWAY
+// 7.2.6.  GOAWAY
 //
 //   The GOAWAY frame (type=0x7) is used to initiate graceful shutdown of
 //   a connection by a server.
@@ -169,7 +117,7 @@
   }
 };
 
-// 4.2.8.  MAX_PUSH_ID
+// 7.2.7.  MAX_PUSH_ID
 //
 //   The MAX_PUSH_ID frame (type=0xD) is used by clients to control the
 //   number of server pushes that the server can initiate.
@@ -181,7 +129,7 @@
   }
 };
 
-// 4.2.9.  DUPLICATE_PUSH
+// 7.2.8.  DUPLICATE_PUSH
 //
 //  The DUPLICATE_PUSH frame (type=0xE) is used by servers to indicate
 //  that an existing pushed resource is related to multiple client
diff --git a/quic/core/http/quic_receive_control_stream.cc b/quic/core/http/quic_receive_control_stream.cc
index 26d2e82..2269faf 100644
--- a/quic/core/http/quic_receive_control_stream.cc
+++ b/quic/core/http/quic_receive_control_stream.cc
@@ -10,7 +10,6 @@
 #include "net/third_party/quiche/src/quic/core/http/http_decoder.h"
 #include "net/third_party/quiche/src/quic/core/http/quic_spdy_session.h"
 #include "net/third_party/quiche/src/quic/core/quic_types.h"
-#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
 #include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h"
 
 namespace quic {
@@ -31,26 +30,6 @@
         ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
   }
 
-  bool OnPriorityFrameStart(QuicByteCount header_length) override {
-    if (stream_->session()->perspective() == Perspective::IS_CLIENT) {
-      stream_->session()->connection()->CloseConnection(
-          QUIC_HTTP_DECODER_ERROR, "Server must not send Priority frames.",
-          ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
-      return false;
-    }
-    return stream_->OnPriorityFrameStart(header_length);
-  }
-
-  bool OnPriorityFrame(const PriorityFrame& frame) override {
-    if (stream_->session()->perspective() == Perspective::IS_CLIENT) {
-      stream_->session()->connection()->CloseConnection(
-          QUIC_HTTP_DECODER_ERROR, "Server must not send Priority frames.",
-          ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
-      return false;
-    }
-    return stream_->OnPriorityFrame(frame);
-  }
-
   bool OnCancelPushFrame(const CancelPushFrame& /*frame*/) override {
     CloseConnectionOnWrongFrame("Cancel Push");
     return false;
@@ -238,26 +217,4 @@
   return true;
 }
 
-bool QuicReceiveControlStream::OnPriorityFrameStart(
-    QuicByteCount /* header_length */) {
-  DCHECK_EQ(Perspective::IS_SERVER, session()->perspective());
-  return true;
-}
-
-bool QuicReceiveControlStream::OnPriorityFrame(const PriorityFrame& priority) {
-  DCHECK_EQ(Perspective::IS_SERVER, session()->perspective());
-  if (!GetQuicFlag(FLAGS_quic_allow_http3_priority)) {
-    return true;
-  }
-  QuicStream* stream =
-      session()->GetOrCreateStream(priority.prioritized_element_id);
-  // It's possible that the client sends a Priority frame for a request stream
-  // that the server is not permitted to open. In that case, simply drop the
-  // frame.
-  if (stream) {
-    stream->SetPriority(spdy::SpdyStreamPrecedence(priority.weight));
-  }
-  return true;
-}
-
 }  // namespace quic
diff --git a/quic/core/http/quic_receive_control_stream.h b/quic/core/http/quic_receive_control_stream.h
index 84217ce..58a0be7 100644
--- a/quic/core/http/quic_receive_control_stream.h
+++ b/quic/core/http/quic_receive_control_stream.h
@@ -38,9 +38,6 @@
   // Called from HttpDecoderVisitor.
   bool OnSettingsFrameStart(QuicByteCount header_length);
   bool OnSettingsFrame(const SettingsFrame& settings);
-  bool OnPriorityFrameStart(QuicByteCount header_length);
-  // TODO(renjietang): Decode Priority in HTTP/3 style.
-  bool OnPriorityFrame(const PriorityFrame& priority);
 
   // False until a SETTINGS frame is received.
   bool settings_frame_received_;
diff --git a/quic/core/http/quic_receive_control_stream_test.cc b/quic/core/http/quic_receive_control_stream_test.cc
index b9a2923..b603efc 100644
--- a/quic/core/http/quic_receive_control_stream_test.cc
+++ b/quic/core/http/quic_receive_control_stream_test.cc
@@ -110,13 +110,6 @@
     return std::string(buffer.get(), settings_frame_length);
   }
 
-  std::string PriorityFrame(const PriorityFrame& frame) {
-    std::unique_ptr<char[]> priority_buffer;
-    QuicByteCount priority_frame_length =
-        HttpEncoder::SerializePriorityFrame(frame, &priority_buffer);
-    return std::string(priority_buffer.get(), priority_frame_length);
-  }
-
   QuicStreamOffset NumBytesConsumed() {
     return QuicStreamPeer::sequencer(receive_control_stream_)
         ->NumBytesConsumed();
@@ -225,25 +218,6 @@
   receive_control_stream_->OnStreamFrame(frame);
 }
 
-TEST_P(QuicReceiveControlStreamTest, ReceivePriorityFrame) {
-  if (perspective() == Perspective::IS_CLIENT) {
-    return;
-  }
-  SetQuicFlag(FLAGS_quic_allow_http3_priority, true);
-  struct PriorityFrame frame;
-  frame.prioritized_type = REQUEST_STREAM;
-  frame.dependency_type = ROOT_OF_TREE;
-  frame.prioritized_element_id = stream_->id();
-  frame.weight = 1;
-  std::string serialized_frame = PriorityFrame(frame);
-  QuicStreamFrame data(receive_control_stream_->id(), false, 1,
-                       serialized_frame);
-
-  EXPECT_EQ(3u, stream_->precedence().spdy3_priority());
-  receive_control_stream_->OnStreamFrame(data);
-  EXPECT_EQ(1u, stream_->precedence().spdy3_priority());
-}
-
 TEST_P(QuicReceiveControlStreamTest, ReceiveGoAwayFrame) {
   GoAwayFrame goaway;
   goaway.stream_id = 0x00;
diff --git a/quic/core/http/quic_send_control_stream.cc b/quic/core/http/quic_send_control_stream.cc
index 7146361..2da2118 100644
--- a/quic/core/http/quic_send_control_stream.cc
+++ b/quic/core/http/quic_send_control_stream.cc
@@ -72,17 +72,6 @@
   settings_sent_ = true;
 }
 
-void QuicSendControlStream::WritePriority(const PriorityFrame& priority) {
-  QuicConnection::ScopedPacketFlusher flusher(session()->connection());
-  MaybeSendSettingsFrame();
-  std::unique_ptr<char[]> buffer;
-  QuicByteCount frame_length =
-      HttpEncoder::SerializePriorityFrame(priority, &buffer);
-  QUIC_DVLOG(1) << "Control Stream " << id() << " is writing " << priority;
-  WriteOrBufferData(quiche::QuicheStringPiece(buffer.get(), frame_length),
-                    false, nullptr);
-}
-
 void QuicSendControlStream::SendMaxPushIdFrame(PushId max_push_id) {
   QuicConnection::ScopedPacketFlusher flusher(session()->connection());
 
diff --git a/quic/core/http/quic_send_control_stream.h b/quic/core/http/quic_send_control_stream.h
index 30f50ab..f8c9515 100644
--- a/quic/core/http/quic_send_control_stream.h
+++ b/quic/core/http/quic_send_control_stream.h
@@ -41,9 +41,6 @@
   // Construct a MAX_PUSH_ID frame and send it on this stream.
   void SendMaxPushIdFrame(PushId max_push_id);
 
-  // Send |Priority| on this stream. It must be sent after settings.
-  void WritePriority(const PriorityFrame& priority);
-
   // Serialize a GOAWAY frame from |stream_id| and send it on this stream.
   void SendGoAway(QuicStreamId stream_id);
 
diff --git a/quic/core/http/quic_send_control_stream_test.cc b/quic/core/http/quic_send_control_stream_test.cc
index ab5b89a..5da6448 100644
--- a/quic/core/http/quic_send_control_stream_test.cc
+++ b/quic/core/http/quic_send_control_stream_test.cc
@@ -157,20 +157,6 @@
   send_control_stream_->MaybeSendSettingsFrame();
 }
 
-TEST_P(QuicSendControlStreamTest, WritePriorityBeforeSettings) {
-  Initialize();
-  testing::InSequence s;
-
-  // The first write will trigger the control stream to write stream type and a
-  // Settings frame before the Priority frame.
-  EXPECT_CALL(session_, WritevData(send_control_stream_, _, _, _, _)).Times(3);
-  PriorityFrame frame;
-  send_control_stream_->WritePriority(frame);
-
-  EXPECT_CALL(session_, WritevData(send_control_stream_, _, _, _, _));
-  send_control_stream_->WritePriority(frame);
-}
-
 TEST_P(QuicSendControlStreamTest, ResetControlStream) {
   Initialize();
   QuicRstStreamFrame rst_frame(kInvalidControlFrameId,
diff --git a/quic/core/http/quic_spdy_session.cc b/quic/core/http/quic_spdy_session.cc
index 1aef2e3..209e46f 100644
--- a/quic/core/http/quic_spdy_session.cc
+++ b/quic/core/http/quic_spdy_session.cc
@@ -531,16 +531,6 @@
   return frame.size();
 }
 
-void QuicSpdySession::WriteH3Priority(const PriorityFrame& priority) {
-  DCHECK(VersionUsesHttp3(transport_version()));
-  DCHECK(GetQuicFlag(FLAGS_quic_allow_http3_priority));
-  DCHECK(perspective() == Perspective::IS_CLIENT)
-      << "Server must not send priority";
-
-  QuicConnection::ScopedPacketFlusher flusher(connection());
-  send_control_stream_->WritePriority(priority);
-}
-
 void QuicSpdySession::OnHttp3GoAway(QuicStreamId stream_id) {
   DCHECK_EQ(perspective(), Perspective::IS_CLIENT);
   if (!QuicUtils::IsBidirectionalStreamId(stream_id) ||
diff --git a/quic/core/http/quic_spdy_session.h b/quic/core/http/quic_spdy_session.h
index 032ee12..b0a83e9 100644
--- a/quic/core/http/quic_spdy_session.h
+++ b/quic/core/http/quic_spdy_session.h
@@ -149,9 +149,6 @@
                        int weight,
                        bool exclusive);
 
-  // Writes a HTTP/3 PRIORITY frame to the peer.
-  void WriteH3Priority(const PriorityFrame& priority);
-
   // Process received HTTP/3 GOAWAY frame. This method should only be called on
   // the client side.
   virtual void OnHttp3GoAway(QuicStreamId stream_id);
diff --git a/quic/core/http/quic_spdy_stream.cc b/quic/core/http/quic_spdy_stream.cc
index ce3cb3e..4d36df0 100644
--- a/quic/core/http/quic_spdy_stream.cc
+++ b/quic/core/http/quic_spdy_stream.cc
@@ -46,16 +46,6 @@
         ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
   }
 
-  bool OnPriorityFrameStart(QuicByteCount /*header_length*/) override {
-    CloseConnectionOnWrongFrame("Priority");
-    return false;
-  }
-
-  bool OnPriorityFrame(const PriorityFrame& /*frame*/) override {
-    CloseConnectionOnWrongFrame("Priority");
-    return false;
-  }
-
   bool OnCancelPushFrame(const CancelPushFrame& /*frame*/) override {
     CloseConnectionOnWrongFrame("Cancel Push");
     return false;
@@ -1037,13 +1027,7 @@
         std::move(ack_listener));
   }
 
-  if (GetQuicFlag(FLAGS_quic_allow_http3_priority) &&
-      session()->perspective() == Perspective::IS_CLIENT && !priority_sent_) {
-    PriorityFrame frame;
-    PopulatePriorityFrame(&frame);
-    spdy_session_->WriteH3Priority(frame);
-    priority_sent_ = true;
-  }
+  // TODO(b/147306124): Send PRIORITY_UPDATE frame.
 
   // Encode header list.
   QuicByteCount encoder_stream_sent_byte_count;
@@ -1081,12 +1065,5 @@
   return encoded_headers.size() + encoder_stream_sent_byte_count;
 }
 
-void QuicSpdyStream::PopulatePriorityFrame(PriorityFrame* frame) {
-  frame->weight = precedence().spdy3_priority();
-  frame->dependency_type = ROOT_OF_TREE;
-  frame->prioritized_type = REQUEST_STREAM;
-  frame->prioritized_element_id = id();
-}
-
 #undef ENDPOINT  // undef for jumbo builds
 }  // namespace quic
diff --git a/quic/core/http/quic_spdy_stream.h b/quic/core/http/quic_spdy_stream.h
index 419b88f..49fe1dc 100644
--- a/quic/core/http/quic_spdy_stream.h
+++ b/quic/core/http/quic_spdy_stream.h
@@ -246,9 +246,6 @@
     ack_listener_ = std::move(ack_listener);
   }
 
-  // Fills in |frame| with appropriate fields.
-  virtual void PopulatePriorityFrame(PriorityFrame* frame);
-
  private:
   friend class test::QuicSpdyStreamPeer;
   friend class test::QuicStreamPeer;
diff --git a/quic/core/http/quic_spdy_stream_test.cc b/quic/core/http/quic_spdy_stream_test.cc
index 9b17b65..1a01015 100644
--- a/quic/core/http/quic_spdy_stream_test.cc
+++ b/quic/core/http/quic_spdy_stream_test.cc
@@ -1280,37 +1280,6 @@
   EXPECT_TRUE(stream_->fin_sent());
 }
 
-TEST_P(QuicSpdyStreamTest, ClientWritesPriority) {
-  SetQuicFlag(FLAGS_quic_allow_http3_priority, true);
-  InitializeWithPerspective(kShouldProcessData, Perspective::IS_CLIENT);
-
-  if (UsesHttp3()) {
-    // In this case, TestStream::WriteHeadersImpl() does not prevent writes.
-    // Six writes include priority for headers, headers frame header, headers
-    // frame, priority of trailers, trailing headers frame header, and trailers.
-    EXPECT_CALL(*session_, WritevData(stream_, stream_->id(), _, _, _))
-        .Times(4);
-    auto send_control_stream =
-        QuicSpdySessionPeer::GetSendControlStream(session_.get());
-    // The control stream will write priority for headers as well as
-    // the settings/max_push_id.
-    EXPECT_CALL(*session_, WritevData(send_control_stream,
-                                      send_control_stream->id(), _, _, _))
-        .Times(1);
-  }
-
-  // Write the initial headers, without a FIN.
-  EXPECT_CALL(*stream_, WriteHeadersMock(false));
-  stream_->WriteHeaders(SpdyHeaderBlock(), /*fin=*/false, nullptr);
-
-  // Writing trailers implicitly sends a FIN.
-  SpdyHeaderBlock trailers;
-  trailers["trailer key"] = "trailer value";
-  EXPECT_CALL(*stream_, WriteHeadersMock(true));
-  stream_->WriteTrailers(std::move(trailers), nullptr);
-  EXPECT_TRUE(stream_->fin_sent());
-}
-
 // Test that when writing trailers, the trailers that are actually sent to the
 // peer contain the final offset field indicating last byte of data.
 TEST_P(QuicSpdyStreamTest, WritingTrailersFinalOffset) {